c程序设计第七章答案(武汉理工大学张晓勇版)

  • 格式:wps
  • 大小:123.50 KB
  • 文档页数:17

第七章数组例7.9 有三个字符串,要求其中最大者#include<stdio.h>#include<string.h>void main(){char string[20];char str[3][20];int i;for(i=0;i<3;i++)gets(str[i]);if(strcmp(str[0],str[1])>0)strcpy(string,str[0]);else strcpy(string,str[1]);if(strcmp(str[2],string)>0)strcpy(string,str[2]);printf("\nthe largest string is:\n");puts(string);}另一种方法:(用三个一维数组)#include<stdio.h>#include<string.h>void main(){char string[20];char str1[20],str2[20],str3[20];gets(str1);gets(str2);gets(str3);if(strcmp(str1,str2)>0)strcpy(string,str1);else strcpy(string,str2);if(strcmp(str3,string)>0)strcpy(string,str3);printf("\nthe largest string is:\n");puts(string);}习题7.1 用筛选法求100之内的素数。

方法一(这不是筛选法)#include<stdio.h>#include<math.h>void main(){int m,i,k;for(m=2;m<=100;m++){k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0) break;if(i>k) printf("%d ",m);}}方法二:(一维数组法)#include<stdio.h>#include<math.h>void main(){int i,k,j;int m[100];for(i=0;i<=99;i++)m[i]=i+1;for(i=1;i<=99;i++){k=sqrt(m[i]);for(j=2;j<=k;j++)if(m[i]%j==0) break;if(j>k) printf("%d ",m[i]);}}这样也可以:#include<stdio.h>#include<math.h>void main(){int i,k,j;int m[100];for(i=0;i<=99;i++)m[i]=i+1;for(i=1;i<=99;i++){k=sqrt(m[i]);for(j=2;j<=k;j++)if(m[i]%j==0) {m[i]=1;break;} if(j>k) printf("%d ",m[i]);}printf("\n");for(i=0;i<100;i++)if(m[i]!=1)printf("%d ",m[i]);}}筛选法(复杂的筛选):#include<stdio.h>#include<math.h>void main(){int i,k,j;int m[100];for(i=0;i<=99;i++)m[i]=i+1;for(i=1;i<=10;i++){for(j=i+1;j<=99;j++)if(m[j]%m[i]==0) {m[j]=100;}}for(i=0;i<100;i++){if(m[i]!=1&&m[i]!=100)printf("%d ",m[i]);}printf("\n");}筛选法:(注意其中的变化,因为这仅有的变化就把算法的复杂性减少很多)#include<stdio.h>#include<math.h>void main(){int i,k,j;int m[100];for(i=0;i<=99;i++)m[i]=i+1;for(i=1;i<=10;i++){for(j=i+1;j<=99;j++)if(m[i]!=1 && m[j]%m[i]==0) {m[j]=1;}}for(i=0;i<100;i++){if(m[i]!=1&&m[i]!=100)printf("%d ",m[i]);printf("\n");}还有一个:#include<stdio.h>#include<math.h>void main(){int i,k,j;int m[100];for(i=0;i<=99;i++)m[i]=i+1;for(i=1;i<=10;i++){for(j=i+1;j<=99;j++)if(m[i]!=100 && m[j]%m[i]==0) {m[j]=100;}}for(i=0;i<100;i++){if(m[i]!=1&&m[i]!=100)printf("%d ",m[i]);}printf("\n");}总之,要注意筛选法的精髓。

精髓在于屏蔽掉那些已经被筛掉的合数。

#include<stdio.h>#include<math.h>void main(){int i,k,j;int m[100];for(i=0;i<=99;i++)m[i]=i+1;for(i=1;i<=10;i++){for(j=i+1;j<=99;j++)if(m[i]!=100 && m[j]!=100 && m[j]%m[i]==0) {m[j]=100;} }for(i=0;i<100;i++){if(m[i]!=1&&m[i]!=100)printf("%d ",m[i]);}printf("\n");7.2 用选择法对10个整数排序。

#include<stdio.h>#include<math.h>void main(){int i,k,j;int m[10];for(i=0;i<=9;i++)scanf("%d",&m[i]);for(i=0;i<9;i++){for(j=i+1;j<=9;j++)if(m[i]>m[j]){k=m[j];m[j]=m[i];m[i]=k;}}for(i=0;i<10;i++){printf("%d ",m[i]);}printf("\n");}选择法排序是一种简单的容易实现的对数据排序的算法。

不论待排序是正序还是逆序,它们所经过的时间复杂度都是一样的,即经过n*(n-1)/2.因此选择法的时间复杂度为O (n^2).7.3 求一个3阶整形矩阵的对角线数之和。

#include<stdio.h>#include<string.h>void main(){int a[3][3]={1,2,3,4,5,6,7,8,9};int s=0,i;for(i=0;i<=2;i++)s=s+a[i][i];printf("\n%d\n",s);}注:这个程序没有通用性,必须得事先输入3阶矩阵才行。

7.4 已有一个排好序的数组,要求输入一个数后,按原来排序的规律将它插入到数组中。

#include<stdio.h>void main()int i,k,j,t;int m[11];for(i=0;i<=9;i++)scanf("%d",&m[i]);for(i=0;i<9;i++){for(j=i+1;j<=9;j++)if(m[i]>m[j]){k=m[j];m[j]=m[i];m[i]=k;}}for(i=0;i<=9;i++){printf("%d ",m[i]);}scanf("%d",&t);printf("%d",t);for(i=0;i<=9;i++){if(t<=m[i]){{k=m[i];m[i]=t;}for(j=10;j>i+1;j--){m[j]=m[j-1];}m[i+1]=k;break;}}if(t>m[9])m[10]=t;printf("\n");for(i=0;i<=10;i++)printf("%d ",m[i]);}注:由7.4这个例子再次说明有时候编程序只需灵光一闪。

7.5将一个数组中的值按逆序重新存放。

#include<stdio.h>void main(){int i,k,j,t;int m[11];for(i=0;i<=9;i++)scanf("%d",&m[i]);for(i=0;i<9;i++){for(j=i+1;j<=9;j++)if(m[i]>m[j]){k=m[j];m[j]=m[i];m[i]=k;}}for(i=0;i<=9;i++){printf("%d ",m[i]);}printf("\n");for(i=0;i<9;i++){for(j=i+1;j<=9;j++)if(m[i]<m[j]){k=m[j];m[j]=m[i];m[i]=k;}}for(i=0;i<=9;i++){printf("%d ",m[i]);}}7.6输出以下的杨辉三角形(要求输出十行)。

11 11 2 11 3 3 11 4 6 4 1..........................程序:#include<stdio.h>void main(){int i,j;int y[10][10];for(i=0;i<=9;i++){for(j=0;j<=i;j++){ if(j==0 || j==i)y[i][j]=1;else if(j>0 && j<i)y[i][j]=y[i-1][j-1]+y[i-1][j];else break;}}for(i=0;i<=9;i++){for(j=0;j<=i;j++)printf("%d ",y[i][j]);printf("\n");}}7.7 输出“魔方阵”。