谭浩强C语言第六章课后习题
1、用筛选法求100以内素数
1 #include<stdio.h> 2 #include<math.h> 3 int main() 4 { 5 int i,j,n,a[101]; 6 for(i=1;i<=100;i++) 7 a[i]=i; 8 a[1]=0; 9 for(i=2;i<sqrt(100);i++) 10 for(j=i+1;j<=100;j++) 11 { 12 if(a[i]!=0&&a[j]!=0) 13 if(a[j]%a[i]==0) 14 a[j]=0; 15 } 16 printf("\n"); 17 for(i=2,n=0;i<=100;i++) 18 {if(a[i]!=0) 19 {printf("%5d",a[i]); 20 n++; 21 } 22 if(n==10) 23 {printf("\n"); 24 n=0; 25 } 26 } 27 printf("\n"); 28 return 0; 29 }
2、用选择法对十个整数排序
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,min,temp,a[11]; 5 printf("enter data:\n"); 6 for(i=1;i<=10;i++) 7 { 8 printf("a[%d]=",i); 9 scanf("%d",&a[i]); 10 } 11 printf("\n"); 12 printf("the number is"); 13 for(i=1;i<=10;i++) 14 printf("%5d",a[i]); 15 printf("\n"); 16 for(i=1;i<=9;i++) 17 {min=i; 18 for(j=i+1;j<=10;j++) 19 if(a[min]>a[j]) 20 21 /* min=j;//法1 22 temp=a[i]; 23 a[i]=a[min]; 24 a[min]=temp;*/ 25 {temp=a[i]; //法2 26 a[i]=a[j]; 27 a[j]=temp;} 28 } 29 printf("number is:\n"); 30 for(i=1;i<=10;i++) 31 printf("%5d",a[i]); 32 printf("\n"); 33 return 0; 34 }
3、求一个3*3矩阵对角元素之和1
1 #include<stdio.h> 2 int main() 3 { 4 int a[3][3],sum=0; 5 int i,j; 6 printf("enter data:"); 7 for(i=0;i<3;i++) 8 for(j=0;j<3;j++) 9 scanf("%d",&a[i][j]); 10 for(i=0;i<3;i++) 11 sum=sum+a[i][i]; 12 printf("sum=%6d\n",sum); 13 return 0; 14 }
4、将一个数插入到已经排好的数组中
1 //假设为升序排序 2 #include<stdio.h> 3 int main() 4 { 5 int a[11]={1,4,6,9,13,16,19,28,40,100}; 6 int temp1,temp2,number,end,i,j; 7 printf("array a:\n"); 8 for(i=0;i<10;i++) 9 printf("%5d",a[i]); 10 printf("\n"); 11 printf("inset data:"); 12 scanf("%d",&number); 13 end=a[9]; 14 if(number>a[9]) 15 a[10]=number; 16 else 17 { 18 for(i=0;i<10;i++) 19 {if(a[i]>number) 20 {temp1=a[i]; 21 a[i]=number; 22 for(j=i+1;j<11;j++) 23 {temp2=a[j]; 24 a[j]=temp1; 25 temp1=temp2; 26 } 27 break; 28 } 29 } 30 } 31 printf("now array a:\n"); 32 for(i=0;i<11;i++) 33 printf("%5d",a[i]); 34 printf("\n"); 35 return 0; 36 }
5、将数组中的值逆序排放
1 #include<stdio.h> 2 #define N 6 3 int main() 4 { 5 int a[N],i,temp; 6 printf("enter array :\n"); 7 for(i=0;i<N;i++) 8 scanf("%d",&a[i]); 9 printf("array a:\n"); 10 for(i=0;i<N;i++) 11 printf("%4d",a[i]); 12 for(i=0;i<N/2;i++) 13 {temp=a[i]; 14 a[i]=a[N-i-1]; 15 a[N-i-1]=temp; 16 } 17 printf("\n now array is:\n"); 18 for(i=0;i<N;i++) 19 printf("%4d",a[i]); 20 printf("\n"); 21 return 0; 22 }
6、杨辉三角形
1 #include<stdio.h> 2 #define N 10 3 int main() 4 { 5 int i,j,a[N][N]; 6 for(i=0;i<N;i++)//先让对角线和第一列等于1 7 {a[i][i]=1; 8 a[i][0]=1; 9 } 10 for(i=2;i<N;i++)//从第三行开始 11 for(j=1;j<=i-1;j++)//从第二列开始 12 a[i][j]=a[i-1][j-1]+a[i-1][j];//等于上一列元素加上上一列元素的前一个元素 13 for(i=0;i<N;i++) 14 { 15 for(j=0;j<=i;j++) 16 printf("%6d",a[i][j]); 17 printf("\n");//每一行结束换行 18 } 19 printf("\n"); 20 return 0; 21 }
7、输出魔方阵
1 #include<stdio.h> 2 int main() 3 { 4 int a[15][15],i,j,k,p,n; 5 p=1; 6 while(p==1) 7 { 8 printf("enter n(n=1--15):"); 9 scanf("%d",&n); 10 if((n!=0)&&(n<=15)&&(n%2!=0)) 11 p=0; 12 } 13 //初始化 14 for(i=1;i<n;i++) 15 for(j=1;j<=n;j++) 16 a[i][j]=0; 17 //建立魔方阵 18 j=n/2+1; 19 a[1][j]=1; 20 for(k=2;k<=n*n;k++) 21 { 22 i=i-1; 23 j=j+1; 24 if((i<1)&&(j>n)) 25 { i=i+2; 26 j=j-1;} 27 else 28 {if(i<1) i=n; 29 if(j>n) j=1;} 30 31 if(a[i][j]==0) 32 a[i][j]=k; 33 else 34 {i=i+2; 35 j=j-1; 36 a[i][j]=k; 37 } 38 } 39 //输出 40 for(i=1;i<=n;i++) 41 {for(j=1;j<=n;j++) 42 printf("%5d",a[i][j]); 43 printf("\n"); 44 } 45 return 0; 46 }
8、找出二维数组中的鞍点,即在该行最大,该列最小
1 #include<stdio.h> 2 #define N 4 3 #define M 5 4 int main() 5 { 6 int i,j,k,a[N][M],max,maxj,flag; 7 printf("please input matrix:\n"); 8 for(i=0;i<N;i++) 9 for(j=0;j<M;j++) 10 scanf("%d",&a[i][j]); 11 for(i=0;i<N;i++)//循环N行 12 { 13 max=a[i][0]; 14 maxj=0; 15 for(j=0;j<M;j++) 16 if(a[i][j]>max)//找到行最大 17 {max=a[i][j]; 18 maxj=j; 19 } 20 flag=1; 21 for(k=0;k<N;k++)//判断是不是列最小 22 if(max>a[k][maxj]) 23 {flag=0; 24 continue;} 25 if(flag) 26 {printf("a[%d][%d]=%d\n",i,maxj,max); 27 break;} 28 } 29 if(!flag) 30 printf("not exit! \n"); 31 return 0; 32 }
9、折半法查找元素
1 #include<stdio.h> 2 #define N 15 3 int main() 4 { 5 int i,number,top,bott,mid,loca,a[N],flag=1,sign; 6 char c; 7 printf("enter data:\n"); 8 scanf("%d",&a[0]); 9 i=1; 10 while(i<N) 11 { 12 scanf("%d",&a[i]); 13 if(a[i]>a[i-1]) 14 i++; 15 else 16 printf("enter again:\n"); 17 } 18 printf("\n"); 19 for(i=0;i<N;i++) 20 printf("%5d",a[i]); 21 printf("\n"); 22 while(flag) 23 { 24 printf("enput number:"); 25 scanf("%d",&number); 26 sign=0; 27 top=0; 28 bott=N-1; 29 if((number<a[0])&&(top>a[N-1])) 30 loca=-1; 31 while((!sign)&&(top<=bott)) 32 { 33 mid=(bott+top)/2; 34 if(number==a[mid]) 35 {loca=mid; 36 printf("%d,is %d ge\n",number,loca+1); 37 sign=1; 38 } 39 else if(number<a[mid]) 40 bott=mid-1; 41 else 42 top=mid+1; 43 } 44 if(!sign||loca==-1) 45 printf("not\n"); 46 printf("y/n"); 47 scanf("%C",c); 48 if(c=='N'||c=='n') 49 flag=0; 50 } 51 return 0; 52 }
10、统计三行文字大写字母、小写字母、数字、空格、以及其他字符的个数。
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,upp,low,dig,spa,oth; 5 char text[3][80]; 6 upp=low=dig=spa=oth=0; 7 for(i=0;i<3;i++) 8 {printf("please enter line%d:\n",i+1); 9 gets(text[i]); 10 for(j=0;j<80&&text[i][j]!='\0';j++) 11 {if(text[i][j]>='A'&&text[i][j]<='Z') 12 upp++; 13 else if(text[i][j]>='a'&&text[i][j]<='z') 14 low++; 15 else if(text[i][j]>='0'&&text[i][j]<='9') 16 dig++; 17 else if(text[i][j]==' ') 18 spa++; 19 else 20 oth++; 21 } 22 } 23 printf("\nnupper case:%d\n",upp); 24 printf("lower case :%d\n",low); 25 printf("digit :%d\n",dig); 26 printf("space :%d\n",spa); 27 printf("other :%d\n",oth); 28 29 return 0; 30 }
11、输出一个平行四边形图案
1 #include<stdio.h> 2 int main() 3 { 4 char a[5]={'*','*','*','*','*'}; 5 int i,j,k; 6 char space=' '; 7 for(i=0;i<5;i++) 8 { 9 printf("\n"); 10 printf(" "); 11 for(j=1;j<=i;j++) 12 printf("%c",space); 13 for(k=0;k<5;k++) 14 printf("%c",a[k]); 15 } 16 printf("\n"); 17 return 0; 18 }
12、翻译密码A---Z;a------z
1 #include<stdio.h> 2 int main() 3 { 4 char a[5]={'*','*','*','*','*'}; 5 int i,j,k; 6 char space=' '; 7 for(i=0;i<5;i++) 8 { 9 printf("\n"); 10 printf(" "); 11 for(j=1;j<=i;j++) 12 printf("%c",space); 13 for(k=0;k<5;k++) 14 printf("%c",a[k]); 15 } 16 printf("\n"); 17 return 0; 18 }
13、连接两个字符串
1 #include<stdio.h> 2 int main() 3 { 4 char s1[100],s2[50]; 5 int i=0,j=0; 6 printf("input string1:"); 7 scanf("%s",s1); 8 printf("input string2:"); 9 scanf("%s",s2); 10 while(s1[i]!='\0') 11 i++; 12 while(s2[j]!='\0') 13 s1[i++]=s2[j++]; 14 s1[i]='\0'; 15 printf("new is:%s\n:",s1); 16 return 0; 17 }
16、比较两个字符串是s1 s2
1 #include<stdio.h> 2 int main() 3 { 4 int i,resu; 5 char s1[100],s2[100]; 6 printf("input string 1;"); 7 gets(s1); 8 printf("\n input string2:"); 9 gets(s2); 10 i=0; 11 while((s1[i]==s2[i])&&(s1[i]!='0')) i++; 12 if(s1[i]=='\0'&&s2[i]=='\0') 13 resu=0; 14 else 15 resu=s1[i]-s2[i]; 16 printf("\n result:%d.\n",resu); 17 return 0; 18 }
16、复制字符串
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char s1[80],s2[80]; 6 int i; 7 printf("input s2:"); 8 scanf("%s",s2); 9 for(i=0;i<=strlen(s2);i++) 10 s1[i]=s2[i]; 11 printf("s1 %s\n",s1); 12 return 0; 13 }