C语言程序设计 第六章
expr 2.1
#include<stdlib.h>
#include<stdio.h>
int main(){
int i,n;
scanf("%d",&n);
for(i = 2; i<=n;i++){
while(n!=0){
if(n%i==0){
printf("%d*",i);
n /= i;
}
else{
break;
}
}
}
putchar('\b');
return 0;
}
在这个代码之中,因为有for循环对于i变量进行着范围的约束,所以说只要是n!=0就可以了,可以不用考虑最后n=1,i一直累加进入死循环的情况。(可以与实验六之中的my_fun()函数进行比较)
因为在实验六之中,质因数的分解是在同一个while循环中完成的,所以说只用了一层的循环。而且并没有对i进行范围的限制,所以导致如果在“1”的情况之下不break会出现死循环。
void fun(int m){
int i = 2;
printf("%d = 1",m);
while(m>1){ //在这里对1进行约束,防止出现1一直除不尽,所以一直i++的情况。
if(m%i==0){
m/=i;
printf("*%d",i);
}
else i++;
}
}
expr 2.2
#include<stdio.h>
#include<stdlib.h>
int datoi(char str[]){
int value = 0, i = 0;
while(str[i]!='\0'){
value = value*10 + str[i] - '0';
i++;
}
return value;
}
int main(){
char *str = "9999";
printf("%d",datoi(str)*10+9);
return 0;
}
注意,在做这个实验的时候不可以
#include<stdlib.h>
因为atoi这个函数在stdlib.h这个库之中已经存在了,相当于是对于这个函数进行复写,所以会导致报错。
expr 2.3
#include<stdio.h>
void maxval(int (*num)[4]){
int i, j, max, row =0, col = 0;
max = num[0][0];
for(i=0; i<4; i++)
for(j=0; j<4;j++)
if(max<num[i][j]){
max = num[i][j];
row = i;
col = j;
}
printf("the maxium value lies in %d row, %d column, equals to %d",row, col, max);
}
int main(){
int num[4][4]= {1,2,3,4,4,3,2,1,9,8,7,6,6,7,8,9};
maxval(num);
return 0;
}
expr 2.9
注意插入排序!!
#include<stdio.h>
#include <stdlib.h>
void insert(float* num,float new){
int i = 11;
num[12] = new;
while( i>=0 && num[i]<num[i+1]){ //这个是针对题目之中所给的条件“递减数列”得来的。
new = num[i+1];
num[i+1] = num[i];
num[i] = new;
i--;
}
}
int main(){
float *num = (float*)malloc(sizeof(float)*13);
for(int i=0;i<12;i++) num[i] = -i*i;
float new;
scanf("%f",&new);
insert(num,new);
for(int i=0;i<13;i++)
printf("%f\t",num[i]);
return 0;
}
expr 2.10
#include<stdio.h>
#include <stdlib.h>
int mycmp(char *p1, char* p2){
while(*p1 && *p2 && *p1 == *p2){
p1++, p2++;
}
return *p1 - *p2;
}
int main(){
char *p1, *p2;
p1 = (char*)malloc(sizeof(char)*20);
p2 = (char*)malloc(sizeof(char)*20);
gets(p1);
gets(p2);
printf("%d",mycmp(p1,p2));
return 0;
}
Equivalent Solution:
int mycmp(char *p1, char* p2){
while(*p1 && *p2 && *p1++ == *p2++);
return *(--p1) - *(--p2);
}
expr 3.3
#include<stdio.h>
#include <stdlib.h>
void ss(char*s, char t){
while(*s){
if(*s==t)
*s = t -'a' +'A';
s++;
}
}
void main(void){
char str1[100] = "abcddfefdbd", c = 'd';
ss(str1,c);
puts(str1);
}
The code in Line 6 search for a particular character that is equal to the input char t, and return a Capitalized character in the string.
expr 3.6
#include<stdio.h>
#include <stdlib.h>
void sort(int a[], int n){
int i,j,t;
for(i = 0; i<n-1; i++)
for(j = i+1; j<n; j++)
if(a[i]<a[j]){
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
void main(void){
int aa[10] = {1,2,3,4,5,6,7,8,9,10},i;
sort(&aa[3],5);
for(i =0; i<10; i++){
printf("%d\t",aa[i]);
}
}
上述的代码的核心原理是,以输入的int型指针a为起点,以a+n-1指针为终点,进行降序的排序。
从a[3]开始,长度为5的子列进行一个降序的排序。
expr 3.7
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void sort(char **str, int n){
char * tmp;
int i, j;
for(i=0; i<n-1; i++)
for(j=0; j<n-i-1;j++)
if(strcmp(str[j],str[j+1])>0){
tmp = str[j], str[j] = str[j+1], str[j+1] = tmp;
}
}
int main(){
char **ps, *str[3] ={"BOOK", "COMPUTER", "CHINA"};
int i;
ps = str;
sort(str,3);
for(i=0;i<3;i++)
puts(str[i]);
return 0;
}
expr 5.2
#include<stdio.h>
#include<stdlib.h>
int prime(int x){
int flag = x;
for(int i = 2;i<x;i++)
if(x%i ==0){
flag = 0;
break;
}
return flag;
}
int main(){
int n,sum=0;
scanf("%d",&n);
for(int i=2; i<=n; i++)
sum+=prime(i);
printf("%d",sum);
return 0;
}
expr 5.10
#include<stdio.h>
#include<stdlib.h>
int sort(short *num, int n){
int p;
short temp;
for(int i=0;i<n-1;i++){
int p = i;
for(int j = i+1;j<n;j++)
if(num[p]<num[j])
p = j;
if(p!=i)
temp = num[p],num[p] = num[i], num[i] = temp;
}
return 0;
}
int main(){
short* num = (short*)malloc(sizeof(short)*30);
for(int i=0;i<20;i++)
num[i]= (rand()%1000)/7;
sort(num,20);
for(int i=0;i<20;i++)
printf("%d\t",num[i]);
return 0;
}