C语言第六章课后答案
- 格式:doc
- 大小:59.50 KB
- 文档页数:12
6.1用筛选法求100以内的素数。
参考答案如下:# include “math.h”main(){ int i,j,a[101];for(i=1;i<=100;i++) a[i]=i; /*初始化数组*/a[1]=0; //1不是素数,所有将a[1]赋值为0for(i=2;i<=sqrt(100);i++) //循环2,3,4-----10if(a[i]!=0) //只要a[i]不是0,那么i就是素数,再把100以内该素数的倍数赋值为0 for(j=i+1;j<=100;j++) //因为给素数的倍数肯定不是素数if (a[j]!=0&&a[j]%i==0) a[j]=0;for(i=1;i<=100;i++) //输出所有素数,只要不是素数的值通过上面for语句赋值为0了if (a[i]!=0) printf(“%d ”,a[i]);//即只要a[i]不是0,那么i就是素数}算法思想:首先,将1,2,3---100存在数组a的a[1],a[2],a[3]----a[100]中,即计算时数组元素下标就表示对应的自然数。
然后从2,3到10中的素数,逐一将10以内的素数的倍数的元素置为0(对应的自然数就是合数)。
最后,将所有素数输出(对应的元素值不为0就是素数)。
6.2用选择法对10个数进行排序(从大到小)。
参考答案如下(降序排列):用逐个比较的方法进行。
*/#include <stdio.h>main(){ int a[10],i,j,k,x;printf("Input 10 numbers:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");for(i=0;i<9;i++) //10个数要排9趟,每趟确定a[i],即从a[i]到a[n-1]找到最大的数// 用k记录其下标,然后a[k]和a[i]交换{ k=i; //假设当前无序序列第一个数为最大数for(j=i+1;j<10;j++) //从下一个数开始到最后去找//是否有更大的数if(a[j]<a[k]) k=j; //若有,则把下标记录在k变量中if(i!=k) //将找到的最大数k下标元素和当前的第一个元素i下标元素交换{ t=a[i]; a[i]=a[k]; a[k]=t; }}printf("The sorted numbers:\n");for(i=0;i<10;i++)printf("%d ",a[i]);}6.3 求一个3*3的整型矩阵对角线元素之和参考答案如下:(思考如果求N*N的整型矩阵对角线元素之和怎么修改程序)main(){ int a[3][3],i,j,sum;for(i=0;i<3;i++) //输入3行3列的矩阵{printf("\nInput three integar for %d line",i+1);for(j=0;j<3;j++)scanf("%d",&a[i][j]);}printf("\nThe array is:\n");for(i=0;i<3;i++) //输出3行3列的矩阵{ for(j=0;j<3;j++)printf("%5d",a[i][j]);printf("\n");}sum=0; //sum累加器,初值为0for(i=0;i<3;i++) //将对角线的元素值累加到sum中sum=sum+a[i][i];for(i=2;i>=0;i--) //将反对角线的元素值累加到sum中sum=sum+a[i][2-i];sum=sum-a[1][1]; //a[1][1]加了2次,所以减去一次printf("sum=%d",sum);}思考如果求N*N的整型矩阵对角线元素之和怎么修改程序?参考答案如下:#define N 5main(){ int a[N][N],i,j,sum;for(i=0;i<N;i++){printf("\nInput %d integar for %d line",N,i+1);for(j=0;j<N;j++)scanf("%d",&a[i][j]);}printf("\nThe array is:\n");for(i=0;i<N;i++){ for(j=0;j<N;j++)printf("%5d",a[i][j]);printf("\n");}sum=0;for(i=0;i<N;i++)sum=sum+a[i][i];for(i=N-1;i>=0;i--)sum=sum+a[i][N-1-i];if((N-1)%2==0) sum=sum-a[(N-1)/2][(N-1)/2]; //当N为偶数时,//没有叠加两次的中间对角线元素printf("sum=%d",sum);}6.4已有一个排好序的数组,要求输入一个数后,按原来的排序规律将它插入数组中。
第6章函数和模块设计【习题6-1】更正下面函数中的错误。
(1)返回求x和y平方和的函数。
(2)返回求x和y为直角边的斜边的函数。
sum_of_sq(x,y) hypot(double x,double y){ {double x,y; h=sqrt(x*x+y*y);return(x*x+y*y); return(h);} }程序如下:/*c6_1(1).c*/ /*c6_1(2).c*/(1) (2)double sum_of_sq(double x,double y) double hypot(double x,double y) { {return(x*x+y*y); double h;} h=sqrt(x*x+y*y);return(h);}【习题6-2】说明下面函数的功能。
(1)itoa(int n,char s[ ])(2)int htod(char hex [ ]){ { int i,dec=0;static int i=0,j=0; for(i=0;hex[i]!='\0';i++)int c; { if(hex[i]>='0'&&hex[i]<='9') if(n!=0) dec=dec*16+hex[i]-'0';{ if(hex[i]>='A'&&hex[i]<='F') j++; dec=dec*16+hex[i]-'A'+10;c=n%10+'0'; if(hex[i]>='a'&&hex[i]<='f') itoa(n/10,s); dec=dec*16+hex[i]-'a'+10;s[i++]=c; }} return(dec);else }{ (3)void stod(int n)if(j==0) s[j++]='0'; { int i;s[j]='\0'; if(n<0){ putchar('-');n=-n;} i=j=0; if((i=n/10)!=0) stod(i);} putchar(n%10+'0');} }功能:(1)(略)(2)(略)【习题6-3】编写已知三角形三边求面积的函数,对于给定的3个量(正值),按两边之和大于第三边的规定,判别其能否构成三角形,若能构成三角形,输出对应的三角形面积。
6.4 课后习题6.4.1 项目练习一.练习目的1.进一步巩固一维数组的定义与数组元素的引用方法2.进一步巩固二维数组的定义与数组元素的引用方法3.进一步巩固字符数组的定义与引用方法二.练习内容1.用起泡法对10个数由大到小进行排序。
分析:起泡法的算法思想是,n个数排序,将相邻两个数依次进行比较,将大数调在前头,逐次比较,直至将最小的数移至最后,然后再将n-1个数继续比较,重复上面操作,直至比较完毕。
可采用双重循环实现起泡法排序,外循环控制进行比较的次数,内循环实现找出最小的数,并放在最后位置上(即沉底)。
#include "stdio.h"main(){int a[10];int i,j,t;printf("请输入10个整数:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<9;i++)for(j=0;j<9-i;j++)if(a[j]<a[j+1]){ t=a[j];a[j]=a[j+1];a[j+1]=t;}printf("排序后的数为::\n");for(i=0;i<10;i++)printf("%d ",a[i]);printf("\n");getch();}2.从键盘输入10个整数,检查整数3是否包含在这些数据中,若是的话,它是第几个被输入的。
#include "stdio.h"main(){int i,a[10];printf("请输入这10个整数:");for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<10;i++){if(a[i]==3) printf("3包含于数列中,输入顺序号是:%d",i+1);elseprintf("3不包含于此数列中");}getch();}3.编程:一个3*5的数组,要求每行都进行降序排列,并求出每行的平均值。
C语言程序设计第四版第六章答案_谭浩强1、用筛选法求100之内的素数。
解:#include#includeint main(){int i,j,n,a[101];for (i=1;i<=100;i++)a[i]=i;a[1]=0;for (i=2;i<sqrt(100);i++)< bdsfid="73" p=""></sqrt(100);i++)<>for (j=i+1;j<=100;j++){if(a[i]!=0 && a[j]!=0)if (a[j]%a[i]==0)a[j]=0;}printf("\");for (i=2,n=0;i<=100;i++){ if(a[i]!=0){printf("%5d",a[i]);n++;}if(n==10){printf("\");n=0;}}printf("\");return 0;}2、用选择法对10整数排序。
解:#includeint main(){int i,j,min,temp,a[11];printf("enter data:\");for (i=1;i<=10;i++){printf("a[%d]=",i);scanf("%d",&a[i]);}printf("\");printf("The orginal numbers:\");for (i=1;i<=10;i++)printf("%5d",a[i]);printf("\");for (i=1;i<=9;i++){min=i;for (j=i+1;j<=10;j++)if (a[min]>a[j]) min=j;temp=a[i];a[i]=a[min];a[min]=temp;}printf("\The sorted numbers:\");for (i=1;i<=10;i++)printf("%5d",a[i]);printf("\");return 0;}3、求一个3×3的整型矩阵对角线元素之和。
C语⾔程序设计教程第六章课后习题参考答案P158 1求三个实数最⼤值#includefloat max(float,float,float);int main(){float a,b,c,m;printf("请输⼊三个实数:");scanf("%f %f %f",&a,&b,&c);printf("最⼤数为%f\n",max(a,b,c));return 0;}float max(float a,float b,float c){float t;if(a>b&&a>c)t=a;else if(b>a&&b>c)t=b;elset=c;return t;}P158 2求最⼤公约数最⼩公倍数#includeint fun1(int a,int b);int fun2(int a,int b);int main(){int a,b;printf("请输⼊两个整数:");scanf("%d %d",&a,&b);printf("最⼤公约数为:%d\n",fun1(a,b));int t,r;if(a{t=a;a=b;b=t;}while((r=(a%b))!=0) {a=b;b=r;}return b;}int fun2(int a,int b) {int n;n=(a*b)/fun1(a,b); return n;}P158 3求完全数#includevoid wan(int n); void main(){int n;for(n=1;n<1000;n++) wan(n);printf("\n");}void wan(int n){if(n%i==0)s=s+i;}if(n==s)printf("%d\t",n); }P158 4⽆暇素数#include#includeint nixvshu(int n);int isPrime(int n);int main(){int n,t;printf("⽆暇素数:\n");for(n=100;n<=999;n++) {t=nixvshu(n);if(isPrime(n)&&isPrime(t)) printf("%d\t",n);}printf("\n");return 0;}int nixvshu(int n){int x=0;while(n){x=x*10+n%10;n=n/10;}return x;int i;for(i=2;i<=sqrt(n);i++)if(n%i==0) return 0;return n;}P158 7递归函数#includeint Y(int n){if(n==0)return 0;if(n==1)return 1;if(n==2)return 2;elsereturn (Y(n-1)+Y(n-2)+Y(n-3)); } int main(){int n,k=0;for(n=0;n<=19;n++){printf("%d\t",Y(n));k++;if(k%5==0)printf("\n");}return 0;}P124 6分解质因数#include#includevoid fenjie(int );int main(){int n;printf("请输⼊⼀个正整数:"); scanf("%d",&n);if(isPrime(n)){printf("%d=1*%d\n",n,n);}else{fenjie(n);printf("\n");}return 0;}int isPrime(int n){int i;for(i=2;i<=sqrt(n);i++){if(n%i==0) return 0;}return 1;}int zhi(int n){int m;for(m=2;m<=n;m++){if(isPrime(m)&&(n%m==0)) break;void fenjie(int n){int m;printf("%d=%d",n,zhi(n));while(n>zhi(n)){m=zhi(n);n=n/m;printf("*%d",zhi(n));}}P47 1输出闰年#includeint f(int year);int main(){int year,k=0;for(year=1900;year<=2000;year++){if(f(year)){printf("%d\t",year);k++;if(k%5==0)printf("\n");}}return 0;}int f(int year){if((year%4==0&&year%100!=0)||(year%400==0)) return year;P47 2输出回⽂数#includeint fun(int n);int main(){int n,k=0;for(n=10;n<=2000;n++) {if(n == fun(n)){printf("%d\t",n);k++;if(k%5==0)printf("\n");}}return 0;}int fun(int n){int i=0;while(n>0){i=i*10+n%10;n=n/10;}return i;}P47 3进制转换#includevoid trans(int n,int base); int main()printf("请输⼊要转换的⼗进制数:"); scanf("%d",&n);printf("请输⼊转换的进制:"); scanf("%d",&base);trans(n,base);printf("\n");return 0;}(⽅法⼀)void trans(int n,int base){if(n){trans(n/base,base);if(n%base>=10)switch(n%base){case 10:printf("A");break;case 11:printf("B");break;case 12:printf("C");break;case 13:printf("D");break;case 14:printf("E");break;case 15:printf("F");break;}elseprintf("%d",n%base);}}(⽅法⼆)void trans(int n,int base){int r;char c;trans(n/base,base); r=n%base;if(r>=10)c='A'+r-10;elsec='0'+r;printf("%c",c);}}。
第6章练习与思考1.指针变量有哪几种运算类型?除了一般变量能做的它都能做以外,还有取地址和取内容运算。
2.有一个4x4的矩阵,试用指针变量按照4行4列格式,输岀矩阵中各元素的值。
#include "stdio.h"void main(){int 询4][4]={{1,1丄1},{1丄1,1},{1丄1,1},{1,1,1,1}};int *p=a;for(i=0;i<4*4;i++){ printf(n%3d",*(p+i));if((i+l)%4=0)printf(H\n H);}}3•输出一个字符串,将这个字符串屮大写字母改为小写字母,第一个字母变大写。
#include "stdio.h"void main(){char a[100],*p 二NULL;int i;printf(n Please input a string:\n H);gets(a);P=a;if(*p>=,a,&&*p<=,z,)*p=*p・32;for(i=l;a[i]!='\O f;i++){if(*(p+i)>='A '&&*(p+i)v=Z) *(p+i)=*(p+i)+32;}puts(a);}4.指向函数的指针有哪些特点?(1)可以通过调用指向函数的指针来调用函数。
(2)对于已定义的函数指针可以指向返回值类型相同的不同函数。
(3)函数指针可做函数的参数。
5.编写程序,在己知字符串str中截取一子串。
要求该子串是从血的第m个字符开始, 由n个字符组成。
#include "stdio.h"void main()char str[100],s[100];char *pl=str,*p2=s;int i,m,n;printf(n please input string:\n");scanf(n%s n,str);printf(”please input m,n:\n n);scanf("%d,%d",&m,&n);for(i=0;i<n;i++)*(p2+i)=*(pl+m+i);for(i=0;*(p2+i)U\0:i++) prin(f(”%c”,*(p2+i));}6.编写程序,利用指针将二维数组屮各元素输出。