C++程序设计习题答案第八章
c语言-C程序设计(第四版)谭浩强_课后习题答案第8章
C程序设计(第四版)谭浩强_课后习题答案第8章第8章善于利用指针2208.1指针是什么2208.2指针变量2228.2.1使用指针变量的例子2228.2.2怎样定义指针变量2238.2.3怎样引用指针变量2248.2.4指针变量作为函数参数2268.3通过指针引用数组2308.3.1数组元素的指针2308.3.2在引用数组元素时指针的运算2318.3.3通过指针引用数组元素2338.3.4用数组名作函数参数2378.3.5通过指针引用多维数组2458.4通过指针引用字符串2558.4.1字符串的引用方式2558.4.2字符指针作函数参数2598.4.3使用字符指针变量和字符数组的比较2638.5指向函数的指针2668.5.1什么是函数指针2668.5.2用函数指针变量调用函数2668.5.3怎样定义和使用指向函数的指针变量2688.5.4用指向函数的指针作函数参数2708.6返回指针值的函数2748.7指针数组和多重指针2778.7.1什么是指针数组2778.7.2指向指针数据的指针2808.7.3指针数组作main函数的形参2828.8动态内存分配与指向它的指针变量2858.8.1什么是内存的动态分配2858.8.2怎样建立内存的动态分配2858.8.3void指针类型2878.9有关指针的小结288习题2918-1#include <stdio.h>int main(){ void swap(int *p1,int *p2);int n1,n2,n3;int *p1,*p2,*p3;printf("input three integer n1,n2,n3:");scanf("%d,%d,%d",&n1,&n2,&n3);p1=&n1;p2=&n2;p3=&n3;if(n1>n2) swap(p1,p2);if(n1>n3) swap(p1,p3);if(n2>n3) swap(p2,p3);printf("Now,the order is:%d,%d,%d\n",n1,n2,n3); return 0;}void swap(int *p1,int *p2){int p;p=*p1; *p1=*p2; *p2=p;}#include <stdio.h>#include <string.h>int main(){void swap(char *,char *);char str1[20],str2[20],str3[20];printf("input three line:\n");gets(str1);gets(str2);gets(str3);if(strcmp(str1,str2)>0) swap(str1,str2);if(strcmp(str1,str3)>0) swap(str1,str3);if(strcmp(str2,str3)>0) swap(str2,str3);printf("Now,the order is:\n");printf("%s\n%s\n%s\n",str1,str2,str3);return 0;}void swap(char *p1,char *p2){char p[20];strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);}8-3#include <stdio.h>int main(){ void input(int *);void max_min_value(int *);void output(int *);int number[10];input(number);max_min_value(number);output(number);return 0;}void input(int *number){int i;printf("input 10 numbers:");for (i=0;i<10;i++)scanf("%d",&number[i]);}void max_min_value(int *number){ int *max,*min,*p,temp;max=min=number;for (p=number+1;p<number+10;p++)if (*p>*max) max=p;else if (*p<*min) min=p;temp=number[0];number[0]=*min;*min=temp;if(max==number) max=min;temp=number[9];number[9]=*max;*max=temp; }void output(int *number){int *p;printf("Now,they are: ");for (p=number;p<number+10;p++)printf("%d ",*p);printf("\n");}8-4#include <stdio.h>int main(){void move(int [20],int,int);int number[20],n,m,i;printf("how many numbers?");scanf("%d",&n);printf("input %d numbers:\n",n);for (i=0;i<n;i++)scanf("%d",&number[i]);printf("how many place you want move?"); scanf("%d",&m);move(number,n,m);printf("Now,they are:\n");for (i=0;i<n;i++)printf("%d ",number[i]);printf("\n");return 0;}void move(int array[20],int n,int m){int *p,array_end;array_end=*(array+n-1);for (p=array+n-1;p>array;p--)*p=*(p-1);*array=array_end;m--;if (m>0) move(array,n,m);}8-5#include <stdio.h>int main(){int i,k,m,n,num[50],*p;printf("\ninput number of person: n="); scanf("%d",&n);p=num;for (i=0;i<n;i++)*(p+i)=i+1;i=0;k=0;m=0;while (m<n-1){if (*(p+i)!=0) k++;if (k==3){*(p+i)=0;k=0;m++;}i++;if (i==n) i=0;}while(*p==0) p++;printf("The last one is NO.%d\n",*p); return 0;}8-6#include <stdio.h>int main(){int length(char *p);int len;char str[20];printf("input string: ");scanf("%s",str);len=length(str);printf("The length of string is %d.\n",len); return 0;}int length(char *p){int n;n=0;while (*p!='\0'){n++;p++;}return(n);}8-7#include <stdio.h>#include <string.h>int main(){void copystr(char *,char *,int);int m;char str1[20],str2[20];printf("input string:");gets(str1);printf("which character that begin to copy?"); scanf("%d",&m);if (strlen(str1)<m)printf("input error!");else{copystr(str1,str2,m);printf("result:%s\n",str2);}return 0;}void copystr(char *p1,char *p2,int m){int n;n=0;while (n<m-1){n++;p1++;}while (*p1!='\0'){*p2=*p1;p1++;p2++;}*p2='\0';}8-8#include <stdio.h>int main(){int upper=0,lower=0,digit=0,space=0,other=0,i=0; char *p,s[20];printf("input string: ");while ((s[i]=getchar())!='\n') i++;p=&s[0];while (*p!='\n'){if (('A'<=*p) && (*p<='Z'))++upper;else if (('a'<=*p) && (*p<='z'))++lower;else if (*p==' ')++space;else if ((*p<='9') && (*p>='0'))++digit;else++other;p++;}printf("upper case:%d lower case:%d",upper,lower);printf(" space:%d digit:%d other:%d\n",space,digit,other); return 0;}8-9#include <stdio.h>int main(){void move(int *pointer);int a[3][3],*p,i;printf("input matrix:\n");for (i=0;i<3;i++)scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]);p=&a[0][0];move(p);printf("Now,matrix:\n");for (i=0;i<3;i++)printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);return 0;}void move(int *pointer){int i,j,t;for (i=0;i<3;i++)for (j=i;j<3;j++){t=*(pointer+3*i+j);*(pointer+3*i+j)=*(pointer+3*j+i);*(pointer+3*j+i)=t;}}8-10-1#include <stdio.h>int main(){void change(int *p);int a[5][5],*p,i,j;printf("input matrix:\n");for (i=0;i<5;i++)for (j=0;j<5;j++)scanf("%d",&a[i][j]);p=&a[0][0];change(p);printf("Now,matrix:\n");for (i=0;i<5;i++){for (j=0;j<5;j++)printf("%d ",a[i][j]);printf("\n");}return 0;}void change(int *p){int i,j,temp;int *pmax,*pmin;pmax=p;pmin=p;for (i=0;i<5;i++)for (j=i;j<5;j++){if (*pmax<*(p+5*i+j)) pmax=p+5*i+j;if (*pmin>*(p+5*i+j)) pmin=p+5*i+j;}temp=*(p+12);*(p+12)=*pmax;*pmax=temp;temp=*p;*p=*pmin;*pmin=temp;pmin=p+1;for (i=0;i<5;i++)for (j=0;j<5;j++)if (((p+5*i+j)!=p) && (*pmin>*(p+5*i+j))) pmin=p+5*i+j;temp=*pmin;*pmin=*(p+4);*(p+4)=temp;pmin=p+1;for (i=0;i<5;i++)for (j=0;j<5;j++)if (((p+5*i+j)!=(p+4))&&((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j)))pmin=p+5*i+j;temp=*pmin;*pmin=*(p+20);*(p+20)=temp;pmin=p+1;for (i=0;i<5;i++)for (j=0;j<5;j++)if (((p+5*i+j)!=p) && ((p+5*i+j)!=(p+4)) && ((p+5*i+j)!=(p+20)) && (*pmin>*(p+5*i+j)))pmin=p+5*i+j;temp=*pmin;*pmin=*(p+24);*(p+24)=temp;}8-10-2#include <stdio.h>int main(){void change(int *p);int a[5][5],*p,i,j;printf("input matrix:\n");for (i=0;i<5;i++)for (j=0;j<5;j++)scanf("%d",&a[i][j]);p=&a[0][0];change(p);printf("Now,matrix:\n");for (i=0;i<5;i++){for (j=0;j<5;j++)printf("%d ",a[i][j]);printf("\n");}return 0;}void change(int *p) //交换函数{int i,j,temp;int *pmax,*pmin;pmax=p;pmin=p;for (i=0;i<5;i++) //找最大值和最小值的地址,并赋给pmax,pmin for (j=i;j<5;j++){if (*pmax<*(p+5*i+j)) pmax=p+5*i+j;if (*pmin>*(p+5*i+j)) pmin=p+5*i+j;}temp=*(p+12); //将最大值与中心元素互换*(p+12)=*pmax;*pmax=temp;temp=*p; //将最小值与左上角元素互换*p=*pmin;*pmin=temp;pmin=p+1;//将a[0][1]的地址赋给pmin,从该位置开始找最小的元素for (i=0;i<5;i++) //找第二最小值的地址赋给pminfor (j=0;j<5;j++){if(i==0 && j==0) continue;if (*pmin > *(p+5*i+j)) pmin=p+5*i+j;}temp=*pmin; //将第二最小值与右上角元素互换*pmin=*(p+4);*(p+4)=temp;pmin=p+1;for (i=0;i<5;i++) //找第三最小值的地址赋给pminfor (j=0;j<5;j++){if((i==0 && j==0) ||(i==0 && j==4)) continue;if(*pmin>*(p+5*i+j)) pmin=p+5*i+j;}temp=*pmin; // 将第三最小值与左下角元素互换*pmin=*(p+20);*(p+20)=temp;pmin=p+1;for (i=0;i<5;i++) // 找第四最小值的地址赋给pminfor (j=0;j<5;j++){if ((i==0 && j==0) ||(i==0 && j==4)||(i==4 && j==0)) continue;if (*pmin>*(p+5*i+j)) pmin=p+5*i+j;}temp=*pmin; //将第四最小值与右下角元素互换*pmin=*(p+24);*(p+24)=temp;}8-11-1#include <stdio.h>#include <string.h>int main(){void sort(char s[][6]);int i;char str[10][6];printf("input 10 strings:\n");for (i=0;i<10;i++)scanf("%s",str[i]);sort(str);printf("Now,the sequence is:\n"); for (i=0;i<10;i++)printf("%s\n",str[i]);return 0;}void sort(char s[10][6]){int i,j;char *p,temp[10];p=temp;for (i=0;i<9;i++)for (j=0;j<9-i;j++)if (strcmp(s[j],s[j+1])>0){strcpy(p,s[j]);strcpy(s[j],s[+j+1]);strcpy(s[j+1],p);}}8-11-2#include <stdio.h>#include <string.h>int main(){void sort(char (*p)[6]);int i;char str[10][6];char (*p)[6];printf("input 10 strings:\n");for (i=0;i<10;i++)scanf("%s",str[i]);p=str;sort(p);printf("Now,the sequence is:\n"); for (i=0;i<10;i++)printf("%s\n",str[i]);return 0;}void sort(char (*s)[6]){int i,j;char temp[6],*t=temp;for (i=0;i<9;i++)for (j=0;j<9-i;j++)if (strcmp(s[j],s[j+1])>0){strcpy(t,s[j]);strcpy(s[j],s[+j+1]);strcpy(s[j+1],t);}}8-12#include <stdio.h>#include <string.h>int main(){void sort(char *[]);int i;char *p[10],str[10][20];for (i=0;i<10;i++)p[i]=str[i];printf("input 10 strings:\n");for (i=0;i<10;i++)scanf("%s",p[i]);sort(p);printf("Now,the sequence is:\n"); for (i=0;i<10;i++)printf("%s\n",p[i]);return 0;}void sort(char *s[]){int i,j;char *temp;for (i=0;i<9;i++)for (j=0;j<9-i;j++)if (strcmp(*(s+j),*(s+j+1))>0){temp=*(s+j);*(s+j)=*(s+j+1);*(s+j+1)=temp;}}8-13#include<stdio.h>#include<math.h>int main(){float integral(float(*)(float),float,float,int);//对integarl函数的声明float fsin(float); //对fsin函数的声明float fcos(float); //对fcos函数的声明float fexp(float); //对fexp函数的声明float a1,b1,a2,b2,a3,b3,c,(*p)(float);int n=20;printf("input a1,b1:");scanf("%f,%f",&a1,&b1);printf("input a2,b2:");scanf("%f,%f",&a2,&b2);printf("input a3,b3:");scanf("%f,%f",&a3,&b3);p=fsin;c=integral(p,a1,b1,n);printf("The integral of sin(x) is:%f\n",c);p=fcos;c=integral(p,a2,b2,n);printf("The integral of cos(x) is:%f\n",c);p=fexp;c=integral(p,a3,b3,n);printf("The integral of exp(x) is:%f\n",c);return 0;}float integral(float(*p)(float),float a,float b,int n){int i;float x,h,s;h=(b-a)/n;x=a;s=0;for(i=1;i<=n;i++){x=x+h;s=s+(*p)(x)*h;}return(s);}float fsin(float x){return sin(x);}float fcos(float x){return cos(x);}float fexp(float x){return exp(x);}8-14#include <stdio.h>int main(){void sort (char *p,int m);int i,n;char *p,num[20];printf("input n:");scanf("%d",&n);printf("please input these numbers:\n");for (i=0;i<n;i++)scanf("%d",&num[i]);p=&num[0];sort(p,n);printf("Now,the sequence is:\n");for (i=0;i<n;i++)printf("%d ",num[i]);printf("\n");return 0;}void sort (char *p,int m) // 将n个数逆序排列函数{int i;char temp, *p1,*p2;for (i=0;i<m/2;i++){p1=p+i;p2=p+(m-1-i);temp=*p1;*p1=*p2;*p2=temp;}}8-15#include <stdio.h>int main(){void avsco(float *,float *);void avcour1(char (*)[10],float *);void fali2(char course[5][10],int num[],float *pscore,float aver[4]); void good(char course[5][10],int num[4],float *pscore,float aver[4]); int i,j,*pnum,num[4];float score[4][5],aver[4],*pscore,*paver;char course[5][10],(*pcourse)[10];printf("input course:\n");pcourse=course;for (i=0;i<5;i++)scanf("%s",course[i]);printf("input NO. and scores:\n");printf("NO.");for (i=0;i<5;i++)printf(",%s",course[i]);printf("\n");pscore=&score[0][0];pnum=&num[0];for (i=0;i<4;i++){scanf("%d",pnum+i);for (j=0;j<5;j++)scanf("%f",pscore+5*i+j);}paver=&aver[0];printf("\n\n");avsco(pscore,paver); // 求出每个学生的平均成绩avcour1(pcourse,pscore); // 求出第一门课的平均成绩printf("\n\n");fali2(pcourse,pnum,pscore,paver); // 找出2门课不及格的学生printf("\n\n");good(pcourse,pnum,pscore,paver); // 找出成绩好的学生return 0;}void avsco(float *pscore,float *paver) // 求每个学生的平均成绩的函数{int i,j;float sum,average;for (i=0;i<4;i++){sum=0.0;for (j=0;j<5;j++)sum=sum+(*(pscore+5*i+j)); //累计每个学生的各科成绩average=sum/5; //计算平均成绩*(paver+i)=average;}}void avcour1(char (*pcourse)[10],float *pscore) // 求第一课程的平均成绩的函数{int i;float sum,average1;sum=0.0;for (i=0;i<4;i++)sum=sum+(*(pscore+5*i)); //累计每个学生的得分average1=sum/4; //计算平均成绩printf("course 1:%s average score:%7.2f\n",*pcourse,average1);}void fali2(char course[5][10],int num[],float *pscore,float aver[4])// 找两门以上课程不及格的学生的函数{int i,j,k,labe1;printf(" ==========Student who is fail in two courses======= \n"); printf("NO. ");for (i=0;i<5;i++)printf("%11s",course[i]);printf(" average\n");for (i=0;i<4;i++){labe1=0;for (j=0;j<5;j++)if (*(pscore+5*i+j)<60.0) labe1++;if (labe1>=2){printf("%d",num[i]);for (k=0;k<5;k++)printf("%11.2f",*(pscore+5*i+k));printf("%11.2f\n",aver[i]);}}}void good(char course[5][10],int num[4],float *pscore,float aver[4]) // 找成绩优秀学生(各门85以上或平均90分以上)的函数{int i,j,k,n;printf(" ======Students whose score is good======\n");printf("NO. ");for (i=0;i<5;i++)printf("%11s",course[i]);printf(" average\n");for (i=0;i<4;i++){n=0;for (j=0;j<5;j++)if (*(pscore+5*i+j)>85.0) n++;if ((n==5)||(aver[i]>=90)){printf("%d",num[i]);for (k=0;k<5;k++)printf("%11.2f",*(pscore+5*i+k));printf("%11.2f\n",aver[i]);}}}8-16#include <stdio.h>int main(){char str[50],*pstr;int i,j,k,m,e10,digit,ndigit,a[10],*pa;printf("input a string:\n");gets(str);pstr=&str[0]; /*字符指针pstr置于数组str 首地址*/pa=&a[0]; /*指针pa置于a数组首地址*/ndigit=0; /*ndigit代表有多少个整数*/i=0; /*代表字符串中的第几个字符*/j=0;while(*(pstr+i)!='\0'){if((*(pstr+i)>='0') && (*(pstr+i)<='9'))j++;else{if (j>0){digit=*(pstr+i-1)-48; /*将个数位赋予digit*/k=1;while (k<j) /*将含有两位以上数的其它位的数值累计于digit*/{e10=1;for (m=1;m<=k;m++)e10=e10*10; /*e10代表该位数所应乘的因子*/digit=digit+(*(pstr+i-1-k)-48)*e10; /*将该位数的数值\累加于digit*/k++; /*位数K自增*/}*pa=digit; /*将数值赋予数组a*/ndigit++;pa++; /*指针pa指向a数组下一元素*/j=0;}}i++;}if (j>0) /*以数字结尾字符串的最后一个数据*/ {digit=*(pstr+i-1)-48; /*将个数位赋予digit*/k=1;while (k<j) /* 将含有两位以上数的其它位的数值累加于digit*/{e10=1;for (m=1;m<=k;m++)e10=e10*10; /*e10代表位数所应乘的因子*/digit=digit+(*(pstr+i-1-k)-48)*e10; /*将该位数的数值累加于digit*/k++; /*位数K自增*/}*pa=digit; /*将数值赋予数组a*/ndigit++;j=0;}printf("There are %d numbers in this line, they are:\n",ndigit);j=0;pa=&a[0];for (j=0;j<ndigit;j++) /*打印数据*/printf("%d ",*(pa+j));printf("\n");return 0;}8-17#include<stdio.h>int main(){int strcmp(char *p1,char *p2);int m;char str1[20],str2[20],*p1,*p2;printf("input two strings:\n");scanf("%s",str1);scanf("%s",str2);p1=&str1[0];p2=&str2[0];m=strcmp(p1,p2);printf("result:%d,\n",m);return 0;}int strcmp(char *p1,char *p2) //两个字符串比较函数{int i;i=0;while(*(p1+i)==*(p2+i))if (*(p1+i++)=='\0') return(0); //相等时返回结果0return(*(p1+i)-*(p2+i)); //不等时返回结果为第一个不等字符ASCII码的差值}8-18#include <stdio.h>int main(){char *month_name[13]={"illegal month","January","February","March","April", "May","June","july","August","September","October", "November","December"};int n;printf("input month:\n");scanf("%d",&n);if ((n<=12) && (n>=1))printf("It is %s.\n",*(month_name+n));elseprintf("It is wrong.\n");return 0;}8-19-1#include <stdio.h>#define NEWSIZE 1000 //指定开辟存区的最大容量char newbuf[NEWSIZE]; //定义字符数组newbufchar *newp=newbuf; //定义指针变量newp,指向可存区的始端char *new(int n) //定义开辟存区的函数new,开辟存储区后返回指针{if (newp+n<=newbuf+NEWSIZE) // 开辟区未超过newbuf数组的大小{newp+=n; // newp指向存储区的末尾return(newp-n); // 返回一个指针,它指向存区的开始位置}elsereturn(NULL); // 当存区不够分配时,返回一个空指针}8-19-2#include <stdio.h>#define NEWSIZE 1000char newbuf[NEWSIZE];char *newp=newbuf;void free(char *p) //释放存区函数{if (p>=newbuf && p< newbuf + NEWSIZE)newp=p;}8-20#define LINEMAX 20 /*定义字符串的最大长度*/int main(){int i;char **p,*pstr[5],str[5][LINEMAX];for (i=0;i<5;i++)pstr[i]=str[i]; /*将第i个字符串的首地址赋予指针数组pstr 的第i个元素*/ printf("input 5 strings:\n");for (i=0;i<5;i++)scanf("%s",pstr[i]);p=pstr;sort(p);printf("strings sorted:\n");for (i=0;i<5;i++)printf("%s\n",pstr[i]);}sort(char **p) /*冒泡法对5个字符串排序函数*/{int i,j;char *temp;for (i=0;i<5;i++){for (j=i+1;j<5;j++){if (strcmp(*(p+i),*(p+j))>0) /*比较后交换字符串地址*/{temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;}}}return 0;}8-21#include<stdio.h>int main(){void sort(int **p,int n);int i,n,data[20],**p,*pstr[20];printf("input n:\n");scanf("%d",&n);for (i=0;i<n;i++)pstr[i]=&data[i]; //将第i个整数的地址赋予指针数组pstr 的第i个元素printf("input %d integer numbers:",n);for (i=0;i<n;i++)scanf("%d",pstr[i]);p=pstr;sort(p,n);printf("Now,the sequence is:\n");for (i=0;i<n;i++)printf("%d ",*pstr[i]);printf("\n");return 0;}void sort(int **p,int n){int i,j,*temp;for (i=0;i<n-1;i++){for (j=i+1;j<n;j++){if (**(p+i)>**(p+j)) //比较后交换整数地址{temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;}}}}。
C程序设计8章答案
第八章2.判断正误:结构体类型的声明可以在函数外面进行,也可以在函数内部进行,但在使用结构体类型之前,必须先进行声明。
(√)4.下面的程序输出结果是:LiSi,19#include <stdio.h>struct stu{char name[10];long int tel;int age;};void fun(struct stu *p, int a){printf(“%s,%d\n”,p->name,a);}main(){struct stu student[4]={{“ZhangSan”,61111111,17},{“LiSi”,62222222,16},{“WangWu”,633333 33,19},{“ZhaoLiu”,63333333,18}};fun(student+1,student[2].age);}6.假设有如下结构体类型说明:struct aa{int a;int b;};根据下面的提示写出对应的代码。
(1)定义上述结构体类型变量x和整型变量y。
aa x;int y;(2)给变量x的两个成员a和b分别赋1和2。
x.a = 1;x.b = 2;(3)将变量x的两个成员之和赋给y。
y = x.a + x.y;(4)输出y的值。
printf(“%d\n”, y);8.编写程序,定义一个结构体类型,含学生的姓名、学号和数学成绩,给5名学生输入以上信息,并按数学成绩从高到低排序。
#include<stdio.h>struct Student{char cName[10];char cNumber[10];float fMathscore;};main(){/* Student s[5] = {{"Li Ming", "100001", 80.5},{"Liu Qiang", "100002", 55.5},{"Wang Hong", "100003", 100},{"Fang Li", "100004", 70},{"Gao Feng", "100005", 90.5} };*///排序int i, j;bool bChange;Student sTem;Student s[5];printf("依次输入5名学生的信息(姓名学号成绩):\n");for(i=0; i<5; i++)scanf("%s%s%f", &s[i].cName, &s[i].cNumber, &s[i].fMathscore);for(i=0; i<4; i++){bChange = false;for(j=1; j<5-i; j++){if(s[j-1].fMathscore < s[j].fMathscore){sTem = s[j];s[j] = s[j-1];s[j-1] = sTem;bChange = true;}}if(!bChange)break;}//输出结果for(i=0; i<5; i++)printf("%s %s %0.1f\n", s[i].cName, s[i].cNumber, s[i].fMathscore);}10.判断正误:在单向链表中可以由任意一个结点向表尾方向找到其后各结点,同样也可以由任意一个结点向表头方向找到其前各结点。
c程序设计第八章答案
第八章函数例子8.1函数调用的简单例子#include<stdio.h>void main(){void printstar();void print_message();printstar();print_message();printstar();}void printstar(){int i;for(i=0;i<=17;i++)printf("*");printf("\n");}void print_message(){printf(" How do you do!\n");}注:c程序的执行是从main函数开始的,如是在main函数中调用其他函数,在调用结束后流程返回到main函数,在main函数中结束整个程序的运行。
8.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。
两个整数由键盘输入。
注:在程序开发中,常将一些常用的功能模块编写成函数,放在公共函数库中供大家选用。
程序设计人员要善于利用函数,以减少重复编写程序段的工作量。
#include<stdio.h>void main(){int gy(int x,int y);int gb(int x,int y);int a,b,gys,gbs;scanf("%d %d",&a,&b);gys=gy(a,b);gbs=gb(a,b);printf("gys=%d,gbs=%d\n",gys,gbs);}int gy(int x,int y){int t,i,g1;if(x>y) t=y;else t=x;for(i=1;i<=t;i++){if(x%i==0 && y%i==0)g1=i;}return(g1);}int gb(int x,int y){int z,c;c=gy(x,y);z=(x*y)/c;return(z);}注:这是一个调用两个函数的源程序文件。
C语言程序设计 (何钦铭 颜晖 著) 高等教育出版社第八章 课后答案
}
习题8-7
/*输入5个字符串,按由小到大的顺序输出。*/
/*指针和数组及存储单元-选择排序算法*/
#include <stdio.h>
#include <string.h>
void main(void)
{
char s[5][80],t[80];
int i,j,index;
/*输入5个字符串到数组s*/
{
index=i;
for (j = i+1; j < n; j++ )
if (a[j] < a[index])index=j;/*比较大小,记录最小元的下标*/
swap(&a[i], &a[index]);/*交换最小元与a[i]的值*/
}
}
/*定义函数swap,实现两个数交换*/
void swap (int *px, int *py)
scanf("%d",&x);
/*调用find函数,在数组a中查找xห้องสมุดไป่ตู้在位置*/
result=find(a,10,x);
/*输出查找结果*/
if(result==-1)printf("Not found.\n");
else printf("The position is %d\n",result);
void mcopy(char *s,char *t,int m);
void main()
{
char s[80],t[80];
int m;
/*输入一个字符串*/
printf("Enter a string : ");
c 程序设计教程习题6_8章参考答案
int getage()
{
return age;
}
double getweight()
{
return weight;
}
char *getcolor()
{
return color;
}
};
void main()
{
Cat c1;
int a;
double w;
char c[10];
cin>>a>>w>>c;
print(h3);
}
第七章
一、选择题
1、D2、B3、B4、A5、B
6、A7、D8、B9、C10、B
二、程序填空
1、fname,“w”(ch=getchar())!=’#’count++
2、(c=fgetc(fp))length++length=0
3、”wb”&emp, sizeof(employer),1,fpfclose(fp)“rb”
newnode->expn=p1->expn;
p1=p1->next;
}
else if(p1->expn<p2->expn)
{
newnode->coef=p2->coef;
newnode->expn=p2->expn;
p2=p2->next;
}
else
{
newnode->coef=p2->coef+p1->coef;
else
{
if(p->coef!=0&&p->expn!=0)
C程序设计谭浩强(第三版) 函数参考答案
C语言程序设计(第三版)谭浩强第8章函数参考答案【知识要点】C语言的基本组成单位函数。
C是由一个且仅有一个主函数( main)和若干个子函数组成.子函数可有可无。
一个C语言源程序执行,从主函数开始,以主函数结束。
C语言称为函数式语言,即用户可根据解决问题的算法编成一个相对独立的函数模块,然后采用调用的方法来使用函数。
采用了函数模块式的结构的特点:程序的层次结构清晰,便于程序的编写、阅读和调试。
C语言提供了极为丰富的库函数,使用这些库函数时,在源程序的头部使用文件包含命令。
如:数学函数#include <math.h>字符函数#include <ctype.h>字符串函数#include <string.h>输入输出函数#include <stdio.h>动态存储分配函数#include <stdlib.h> #include <malloc.h>清屏函数#include <conio.h>日期和时间函数#include <time.h>函数可以嵌套调用,而不可嵌套定义。
函数的值:函数的值的数据类型由函数定义时所决定的。
调用函数时可有返回值和无返回值两种。
有返回值的函数在函数体内必有一条或多条return 语句,无返回值的函数定义为void类型,且在函数体无return 语句。
函数调用时参数的传递:主调函数和被调函数之间数据传递有两种,数值传递和地址传递。
【习题参考答案】8.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。
【解析】用碾转相除法求最大公约数。
最小公倍数=两个整数之积/最大公约数。
#include <stdio.h>int gcf(int x,int y) /*求两整数的最大公约数*/{int t,r;if (x<y){t=x;x=y;y=t;}while ((r=x%y)!=0){ x=y;y=r;}return y;}int lcm(int x,int y,int h) /*求两整数的最小公倍数*/{return(x*y/h);}void main ( ){ int a,b,df,sc; /* df:所求的最大公约数,sc:所求的最小公倍数*/printf("Input a,b\n");scanf(“%d%d”,&a,&b);df=gcf(a,b);printf(“G.C.F=%d\n”,df);sc=lcm(a,b,df);printf(“L.C.M=%d\n”,sc);}8.2 求方程ax2+bx+c=0的根,用3个函数分别求当b2-4ac大于0,等于0和小于0时的根,并输出结果。
C程序设计教程与实验第8章习题参考答案
第8章习题二、填空题1. 22. 6 7 200C3.p[5]4. 定义p1为指向整型数据的指针变量定义p2为指针数组,其数组元素均为指针定义p3为指向一维数组的指针,其数组元素均为整型数5. 5,36. 207. r+b[k] *x8. SecondLiFirstWang9. 2510. 12 12三程序分析题1.72. 1 5 33 9 73. 2 44. abcDDfefDbD5. 53四、编程题1.输入2个字符串,每个字符串的长度均不超过80字符,用自己实现的cmpstr()函数完成这两个字符串的大小比较,cmpstr()函数的功能和字符串比较函数strcmp()的功能相同#include <stdio.h>#include<string.h>int cmpstr(char *s1, char *s2){char *p, *q;p=s1;q=s2;while(*p!='\0' && *q!='\0'){if(*p==*q){p++;q++;}elsebreak;}return *p-*q;}void main(){char str1[81], str2[81];int c;printf("请输入第1个字符串:");gets(str1);printf("请输入第2个字符串:");gets(str2);c=cmpstr(str1,str2);if(c>0)printf("字符串%s 大于字符串%s\n",str1,str2);else if(c<0)printf("字符串%s 小于字符串%s\n",str1,str2);elseprintf("字符串%s 等于字符串%s\n", str1, str2);}2.定义一个函数float reverse(int p[], int n),该函数有两个参数,第一个参数p为形参数组名,第二个参数n为该数组中的元素个数,要求使用reverse()函数将该数组中的所有元素逆序排列,并返回该数组中所有元素的平均值。
《C语言程序设计》 课后习题答案 高等教育出版社
《C语言程序设计》课后习题答案高等教育出版社《C语言程序设计》课后习题答案高等教育出版社第一章:C语言概述1. C语言的特点C语言是一种以处理底层任务和系统编程为目标的高级编程语言。
其特点包括语法简洁、执行效率高、可移植性强等。
第二章:C语言基本数据类型1. C语言中的基本数据类型C语言中的基本数据类型包括整型、字符型、浮点型等。
整型可以进一步细分为有符号整型和无符号整型。
第三章:C语言运算符1. C语言中的运算符C语言中常见的运算符包括算术运算符、赋值运算符、关系运算符、逻辑运算符等。
这些运算符用于执行各种数学和逻辑操作。
第四章:C语言控制语句1. C语言中的条件语句C语言提供了if语句和switch语句来实现条件判断。
if语句用于执行基于布尔表达式的条件分支,而switch语句用于根据不同的值执行不同的代码块。
第五章:C语言函数1. C语言中的函数定义和调用函数是C语言中的基本模块,用于封装可重用的代码。
函数定义包括函数返回类型、函数名、参数列表和函数体等部分。
第六章:C语言数组1. C语言中的数组定义和使用数组是一组相同类型的数据元素的集合。
C语言中可以使用数组来存储和操作大量数据。
第七章:C语言指针1. C语言中的指针概念指针是一种变量,它存储了内存地址。
通过指针,可以直接访问和修改对应内存地址中的数据。
第八章:C语言字符串1. C语言中的字符串操作字符串是由一系列字符组成的数据类型。
C语言通过字符数组来表示和操作字符串。
第九章:C语言结构体1. C语言中的结构体定义和使用结构体是一种自定义的复合数据类型,它可以包含多个不同类型的成员变量。
第十章:C语言文件操作1. C语言中的文件读写操作文件操作是一种重要的数据输入和输出方式。
C语言提供了一系列函数来实现文件的读写操作。
总结:通过解答以上习题,我们可以更好地掌握C语言的各个方面,提升我们的编程能力和解决问题的能力。
希望本文对读者有所帮助。
C语言课后习题答案第八章
作业八:函数程序设计答案〔一〕选择题〔30分〕1.以下正确的函数定义形式是A__。
A)double fun(int x,int y)B)double fun(int x;int y)C)double fun(int x,int y);D)double fun(int x,y);2.以下正确的函数形式是D__。
A)double fun(int x,int y){ z=x+y; return z; }B)fun(int x,y){ int z; return z; }C)fun(x,y){ int x,y; double z; z=x+y; return z; }D)double fun(int x,int y){ double z; z=x+y; return z; }〔重要〕3.以下正确的说法是A__。
在C语言中A〕实参和及其对应的形参各占用独立的存储单元B〕实参和及其对应的形参共占用一个存储单元C〕只有当实参和及其对应的形参同名时才共占用存储单元D〕形参是虚拟的,不占用存储单元4.假设调用一个函数,且此函数中没有return语句,那么正确的说法是D__。
该函数A〕没有返回值B〕返回假设干个系统默认值C〕能返回一个用户所希望的函数值D〕返回一个不确定的值〔重要〕5.以下不正确的说法是B__。
C语言规定A〕实参可以是常量、变量或表达式B〕形参可以是常量、变量或表达式C〕实参可以为任意类型D〕形参应及其对应的实参类型一致6.C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是B__。
A)地址传递B)单向值传递C)由实参传给形参,再由形参传回给实参D)由用户指定传递方式7.以下程序有语法性错误,有关错误原因的正确说法是C__。
main()int G=5,k;void Prt_char();k=Prt_char(G);A)语句void prt_char();有错,它是函数调用语句,不能用void说明B)变量名不能使用大写字母C)函数说明和函数调用语句之间有矛盾D)函数名不能使用下划线8.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是B__。
2024年度谭浩强《C程序设计》第八章习题解析
选择排序的时间复杂度也为O(n^2)。
47
2024/2/3
插入第一个元素
将数组的第一个元素视为已排序序列,从第二个元素开始遍历数组。
插入当前元素
将当前元素插入到已排序序列中的正确位置,即找到已排序序列中第一个大于当前元素的元素,并将当前元素插入到该元素之前。
重复插入操作
重复上述插入操作,直到整个数组都插入到已排序序列中。
给定一个3x3的矩阵A和一个整数k,求矩阵A的k次幂。解析:可以使用递归或迭代的方式来实现矩阵的幂运算。递归方式较为简洁但效率较低,迭代方式需要手动实现矩阵乘法和结果矩阵的初始化等操作,但效率较高。在实现时需要注意矩阵乘法的规则和结果矩阵的大小。
给定一个n阶方阵A,求其转置矩阵B。解析:首先声明两个n阶方阵A和B,然后通过嵌套循环遍历A中的每个元素,并将元素值交换后赋值给B中对应位置的元素即可。在实现时需要注意方阵的阶数n需要通过参数传递或动态分配内存来确定。
22
2024/2/3
max = a[i];
23
2024/2/3
}
if (a[i] < min) {
24
2024/2/3
min = a[i];
25
2024/2/3
1
2
3
}
}
printf("数组中的最大值为:%dn", max);
26
2024/2/3
printf("数组中的最小值为:%d", min);
38
2024/2/3
分析
遍历字符串中的每个字符,根据字符类型进行计数。
分析
分别遍历两个字符串的首尾字符,比较是否相等,若全部相等则为逆序串。
c语言第八章课后题答案
for(j=0; j<ROW; j++)
{
printf("%6d",a[i][j]);
}
printf("\n");
}
}
int main()
{
int a[ROW][COL],b[COL][ROW],c[ROW][ROW],i,j;
printf("Input 2*3 matrix a:\n");
for(i=0; i<ROW; i++)
printf("%d",x);
return 0;
}
结果:
分析:调用函数时只发生值的传递,形参与实参之间再也没有关系,子函数一旦退出,内部变量就释放空间
(2)
#include <stdio.h>
void Func(int b[])
{
int j;
for(j=0; j<4; j++)
{
b[j]=j;
}
}
int main()
int i;
int m;
srand(time(NULL)); /*注意:只能将产生随机数种子写在循环外面*/
for(i=0; i<6000; i++)
{
m=rand()%6+1;
switch (m)
{
case 1:
a++;
break;
case 2:
b++;
break;
case 3:
c++;
break;
printf("Results:\n");
《C语言程序设计》教材习题答案第8章
一、选择题1.以下数组定义中,错误的是:C)int a[3]={1,2,3,4};2.以下数组定义中,正确的是:B) int a[][2]={1,2,3,4};3.设有定义“int a[8][10];”,在VC中一个整数占用4字节,设a的起始地址为1000,则a[1][1]的地址是:D)10444.已知有数组定义“int a[][3]={1,2,3,4,5,6,7,8,9};”,则a[1][2]的值是:C)65.在以下字符串定义、初始化和赋值运算中,错误的是:A) char str[10];str=”String”;6.设有以下字符串定义,char s1[]={‘S’,’t’,’r’,’i’,’n’,’g’};char s2[]=”String”;则s1和s2:C)长度不同,但内容相同。
7.设有定义“int a[10]={0};”,则说法正确的是:A)数组a有10个元素,各元素的值为0.8.设已定义“char str[6]={‘a’,’b’,’\0’,’c’,’d’,’\0’};”,执行语句“printf(“%s”,str)”后,输出结果为:B)ab9.引用数组元素时,数组元素下标不可以是:C)字符串10.已定义字符串S1和S2,以下错误的输入语句是:C)gets(s1,s2);11.下面程序段的运行结果是:A)123void main(){char a[]=”abcd”,b[]=”123”;strcpy(a,b);printf(“%s\n”,a);}12.下面程序段的运行结果是:A)123void main(){char a[]=”123”,b[]=”abcd”;if(a>b)printf(“%s\n”,a);else printf(“%s\n”,b);}二、编程题1.一维数字a的值已经,请把数组中的值按逆序存放,然后输出数组。
例如数组中原来的值为3,4,2,1,6,颠倒后变成6,1,2,4,3.#include<stdio.h>main(){int i,a[5]={2,3,45,12,5},t;printf("转换前:");for(i=0;i<5;i++)printf("%d\t",a[i]);for(i=0;i<5/2;i++){t=a[i];a[i]=a[5-i-1];a[5-i-1]=t;}printf("\n转换后:");for(i=0;i<5;i++)printf("%d\t",a[i]);}2.输入一个整数(位数不确定),从高位到低位依次输出各位数字,其间用逗号分隔。
《C语言程序设计》课后习题答案第八章
8.1 编写两个函数,分别求两个证书的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果,两个整数由键盘输入。
void main(){ int Mgy(int x,int y);int Mgb(int z);int a,b,mgy,mgb;printf("请输入两个数:\n");scanf("%d,%d",&a,&b);mgy=Mgy(a,b);mgb=Mgb(a,b,mgy);printf("两个数的最大公约数为%d,最小公倍数为%d\n",mgy,mgb);}int Mgy(int x,int y){ int r,temp;if(x<y){ temp=x;x=y;y=temp;}while(x%y!=0){ r=x%y;x=y;y=r;}return y;}int Mgb(int x,int y,int z){ return (x*y/z);}8.2 求方程ax²+bx+c=0的根,用三个函数分别求当b²-4ac大于零、等于零和小于零时的根,8.3编写一个判素数的函数,在主函数输入一个整数,输出是否是素数的信息。
#include<math.h>void main(){ int Isprime(int a);int m,temp=0;printf("请输入一个数:\n");scanf("%d",&m);temp=Isprime(m);if(temp==0) printf("%d不是素数。
\n",m);else printf("%d是素数。
\n",m);}int Isprime(int a){ int i,k,flag;if(a==0||a==1) flag=0;else{ k=sqrt(a);for(i=2;i<=k;i++)if(a%i==0) flag=0; }return flag; }8.8 写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字间空一格空8.9编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符8.10 写一个函数,输入一行字符,将此字符串中最长的单词输出。
c程序设计第四版(谭浩强)第八章答案
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>/*int main(){int *p1,*p2,*p3,*t,a,b,c;printf("enter three number:");scanf("%d%d%d",&a,&b,&c);p1=&a;p2=&b;p3=&c;if(a>b){t=p1;p1=p2;p2=t;}if(a>c){t=p1;p1=p3;p3=t;}if(b>c){t=p2;p2=p3;p3=t;}printf("sort number:%d %d %d\n",*p1,*p2,*p3); }*//*#define N20int main(){char *p1,*p2,*p3,*t,a[N],b[N],c[N];printf("enter three strings:");scanf("%s%s%s",a,b,c);p1=a;p2=b;p3=c;if(strcmp(a,b)>0){t=p1;p1=p2;p2=t;}if(strcmp(a,c)>0){t=p1;p1=p3;p3=t;}if(strcmp(b,c)>0){t=p2;p2=p3;p3=t;}printf("sort string:%s%s%s\n",p1,p2,p3);}*//*void input(int*p){int i;printf("enter10number:");for(i=0;i<10;i++)scanf("%d",p+i);void output(int*p){int i;printf("new10number:");for(i=0;i<10;i++)printf("%-2d",*(p+i));}void sort(int*p,int n){int i,t;for(i=0;i<n-1;i++){if(*(p+i)>*(p+i+1)){t=*(p+i);*(p+i)=*(p+i+1);*(p+i+1)=t;} }for(i=n-2;i>0;i--){if(*(p+i-1)>*(p+i)){t=*(p+i);*(p+i)=*(p+i-1);*(p+i-1)=t;} }}int main(){int a[10],*p=a;input(p);sort(p,10);output(p);putchar('\n');}*//*#define N10void houyi(int*p,int m){int i,b[N]={0};for(i=0;i<N-m;i++)b[i+m]=*(p+i);for(;i<N;i++)b[i-N+m]=*(p+i);for(i=0;i<N;i++)printf("%3d",b[i]);}int main()int a[N],i,m,*p=a;printf("enter number:");for(i=0;i<N;i++)scanf("%d",&a[i]);printf("enter m:");scanf("%d",&m);printf("new number:");houyi(p,m);putchar('\n');}*//*int main(){int count(int*p,int n);int n,*p,i;printf("enter number:");scanf("%d",&n);p=(int *)calloc(n,sizeof(int));for(i=0;i<n;i++)*(p+i)=0;printf("the last number is %d\n",count(p,n)+1);free(p);}int count(int*p,int n){int i,j=1,k=0;for(i=0;i<n;i++){if(*(p+i)!=3){*(p+i)=j;if(*(p+i)==3)j=1; //数到3 时将下一个重置为1elsej+=1;if(i==(n-1))i=-1; //轮到到最后一个人报数时,将i 重置为-1,执行完for 语句后自动加一变为0,从头开始k+=1; //报完一个数后加一}else{if(i==(n-1))i=-1; //检查到最后一个人是3时,将i 重置为-1,执行完for 语句后自动加一变为0,从头开始continue; //检查到这个人是3 时,跳过报数}if(k==3*(n-1)) //报数的总个数达到3*(n-1)时,就只剩一个人了break;elsecontinue;}for(i=0;i<n;i++)if(*(p+i)==3)continue;else return i;}*//*#define N20int length(char*p){int n=0;while(*p!=0){p++;n+=1;}return n;}int main(){char a[N],*p=a;printf("enter string:");gets(a);printf("字符串长度为:%d\n",length(p));}*//*#define N10int main(){void copyn(char*p,int m);char *p="abcdefghij";int m;printf("%s\nenter m:",p);scanf("%d",&m);copyn(p,m);}void copyn(char*p,int m){char b[N],i;for(i=m-1;*(p+i);i++)b[i-m+1]=*(p+i);b[i-m+1]='\0';printf("%s\n",b);}*//*#define N50void count(char*p){int d=0,x=0,k=0,s=0,o=0;while(*p) //不能写*(p++),否则计算出错,无法计算第一个字符{if(*p>='a'&&*p<='z')x+=1;else if(*p>='A'&&*p<='Z')d+=1;else if(*p>='0'&&*p<='9')s+=1;else if(*p==' ')k+=1;else o+=1;p++;}printf("大写字母:%d\n小写字母:%d\n空格:%d\n数字:%d\n 其他:%d\n",d,x,k,s,o);}int main(){char a[N],*p=a;printf("enter string:");gets(a);count(p);}*//*void zhuangzhi(int(*p)[3]){int i,j,t;for(i=0;i<3;i++)for(j=0;j<3;j++)if(i<j){t=*(*(p+i)+j); //*(*(p+i)+j)代表a[i][j]*(*(p+i)+j)=*(*(p+j)+i);*(*(p+j)+i)=t;}}int main(){int (*p)[3],a[3][3],i,j;p=a;printf("enter array:\n");for(i=0;i<3;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);zhuangzhi(p);printf("new array:\n");for(i=0;i<3;i++)for(j=0;j<3;j++){printf("%-2d",a[i][j]);if(j==2)putchar('\n');}}*//*void central(int (*p)[5]){int i,j,l=0,r=0,t;//r 代表行,l 代表列for(i=0;i<5;i++)for(j=0;j<5;j++)if(*(*(p+i)+j)>*(*(p+r)+l)){r=i;l=j;}t=*(*(p+2)+2);*(*(p+2)+2)=*(*(p+r)+l);*(*(p+r)+l)=t; //最大元素放在中心l=0;r=0;for(i=0;i<5;i++)//四个角放最小元素,每次从第二个元素开始对比for(j=1;j<5;j++)if(*(*(p+i)+j)<*(*(p+r)+l)){r=i;l=j;//找出最小元素}t=*(*p);*(*p)=*(*(p+r)+l);*(*(p+r)+l)=t; //将最小元素与左上角元素交换,下同l=4;r=0;//换完重置r 和l,下同for(i=0;i<5;i++)for(j=1;j<5;j++)if(*(*(p+r)+l)>*(*(p+i)+j)){r=i;l=j;}t=*(*p+4);*(*p+4)=*(*(p+r)+l);*(*(p+r)+l)=t;r=4;l=0;for(i=0;i<5;i++)for(j=1;j<5;j++)if(i==0&&j==4) //遇到右上角,跳过对比continue;else if(*(*(p+r)+l)>*(*(p+i)+j)){r=i;l=j;}t=*(*(p+4));*(*(p+4))=*(*(p+r)+l);*(*(p+r)+l)=t;r=4;l=4;for(i=0;i<5;i++)for(j=1;j<5;j++)if(i==0&&j==4||i==4&&j==0) //遇到右上角和左下角,跳过对比continue;else if(*(*(p+r)+l)>*(*(p+i)+j)){r=i;l=j;}t=*(*(p+4)+4);*(*(p+4)+4)=*(*(p+r)+l);*(*(p+r)+l)=t;}int main(){int a[5][5],(*p)[5]=a,i,j;printf("enter array:\n");for(i=0;i<5;i++)for(j=0;j<5;j++)scanf("%d",*(p+i)+j);central(p);printf("new array:\n");for(i=0;i<5;i++){for(j=0;j<5;j++)printf("%-3d",*(*(p+i)+j));putchar('\n');}}*//*void sort(char*p[],int n) //指针数组处理{int i,j;char *k;for(i=1;i<n;i++)for(j=i;j<n;j++)if(strcmp(p[i-1],p[j])>0){k=p[i-1];p[i-1]=p[j];p[j]=k;}}int main(){char*p[10]={"gutsy","glory","gonad","girth","gaudy","gypsy","gusto","guppy","group","grope"}; //测试数据gutsy glory gonad girth gaudy gypsy gusto guppy group gropeint i;printf("enter strings:");for(i=0;i<10;i++)printf("%s ",p[i]);sort(p,10);printf("\nnew strings:");for(i=0;i<10;i++)printf("%s ",p[i]);putchar('\n');}*//*#define N20void sort(char*p,int n) //指针处理{int i,j;char k[N];for(i=1;i<n;i++)for(j=i;j<n;j++)if(strcmp(p+20*(i-1),p+20*j)>0) //不能写为p+i-1,否则出错{strcpy(k,p+20*(i-1));strcpy(p+20*(i-1),p+20*j);strcpy(p+20*j,k);}}int main(){char a[10][N];char *p=a[0]; //不能写为*p=a,这等价于是把行向量赋值给列向量int i;printf("enter strings:\n");for(i=0;i<10;i++)scanf("%s",&a[i]); //可写为gets(a[i]),这样写的话,每次输入字符串后按enter,或写为scanf("%s",&a[i]),每输一个字符后按空格即可;sort(p,10);printf("new strings:\n");for(i=0;i<10;i++)printf("%s ",a[i]);putchar('\n');}*//*#define n 1000 //矩形法求定积分,n 为区间分割数目double ding(double a,double b,double(*fun)(double)){double s=0;int i;for(i=1;i<n;i++)s+=(*fun)(i*(b-a)/n);return s*=(b-a)/n;}int main(){double a,b,s1,s2,s3;//定义积分下限,上限,用double 精度较高printf("输入积分下限,上限,分割区间数目:");scanf("%lf%lf",&a,&b);s1=ding(a,b,sin);s2=ding(a,b,cos);s3=ding(a,b,exp);printf("sin(x)从%f 到%f 的积分为%f\n",a,b,s1);printf("cos(x)从%f 到%f 的积分为%f\n",a,b,s2);printf("exp(x)从%f 到%f 的积分为%f\n",a,b,s3);}*//*#define N10void nixu(int*p){int i,m=N/2,t;for(i=0;i<m;i++){t=*(p+i);*(p+i)=*(p+N-1-i);*(p+N-1-i)=t;}}int main(){int a[N],*p=a,i;printf("enter %d numbers:\n",N);for(i=0;i<N;i++)scanf("%d",&a[i]);nixu(p);printf("new numbers:\n");for(i=0;i<N;i++)printf("%d ",a[i]);putchar('\n');}*//*void average1(float(*p)[6],int n){int i;float ave=0;for(i=0;i<n;i++)ave+=*(*(p+i)+1)/4;printf("第一门课程的平均分为:%4.2f\n",ave);}float average(float(*p)[6]){int i;float ave=0;for(i=1;i<6;i++)ave+=*(*p+i)/5;return ave;}void out(float(*p)[6],int n){int i,j,k,l,s=0;printf("两门课以上不及格的学生:\n");for(i=0;i<n;i++){k=0;for(j=1;j<6;j++){if(*(*(p+i)+j)<60)k+=1;else continue;}if(k>=2){s=1;printf("%4.0f",*(*(p+i)));for(l=1;l<6;l++)printf("%4.0f",*(*(p+i)+l));printf(" 平均分为:%4.2f\n",average(p+i));}}if(s==0) //没有符合条件的学生时输出“无”printf("无!\n");}void in(float(*p)[6],int n){int i,j,l;for(i=0;i<n;i++){for(j=0;j<6;j++){if(average(p+i)>=90){printf("平均分在90 分以上的学生:%4.0f",*(*(p+i)));for(l=1;l<6;l++)printf("%4.0f",*(*(p+i)+l));putchar('\n');break;}if(*(*(p+i)+j)>=85)continue;elsebreak;}if(j==6){printf("全部课程成绩在85 分以上的学生:%4.0f",*(*(p+i)));for(l=1;l<6;l++)printf("%4.0f",*(*(p+i)+l));putchar('\n');}}}int main(){int i,j;floata[4][6]={{1001,65,67,55,60,45},{1002,80,87,90,81,85},{1003,90,99,100,98,95},{1004,86,89,90,91, 85}};float (*p)[6]=a;for(i=0;i<4;i++){for(j=0;j<6;j++)printf("%4.0f ",a[i][j]);putchar('\n');}average1(p,4);out(p,4);in(p,4);}*//*#define N10 //方法一int num1(char*p) //将数字字符串转为整形数字的函数{int n=strlen(p),i,a=0;for(i=0;i<n;i++)a+=(int)((*(p+i)-48)*pow(10,n-1-i));return a;}void number(char*p){int i,num=0,j=1,k=-1,n=strlen(p); //j 用于计算数字长度,k 用于计算数字个数int a[N];//最多容纳N 个整数for(i=0;i<=n;i++){if(*p<'0'||*p>'9'){if(num==1){*p='\0';a[k]=num1(p-j);}num=0;}else if(num==0){num=1;j=1; //找到新数字时重置jk+=1;}elsej+=1;p++;}for(i=0;i<k+1;i++)printf("%d ",a[i]);putchar('\n');}*//*#define N10void number(char*p) //方法二{int i,num=0,j=1,k=-1,n=strlen(p); //j 用于计算数字长度,k 用于计算数字个数char a[N][10];//最多容纳N 个整数,每个整数最多十位数for(i=0;i<=n;i++){if(*p<'0'||*p>'9'){if(num==1){*p='\0';strcpy(a[k],p-j);}num=0;}else if(num==0){num=1;j=1; //找到新数字时重置jk+=1;}elsej+=1;p++;}for(i=0;i<k+1;i++)printf("%s ",a[i]);putchar('\n');}int main(){char a[100],*p=a; //最多可输入100个字符printf("enter strings:\n");gets(p);number(p);}*//*//字符串比较函数#define N20int str_cmp(char*p1,char*p2){int i,n=strlen(p1);for(i=0;i<=n;i++)if(*(p1+i)==*(p2+i))continue;else if(*(p1+i)>*(p2+i)){return*(p1+i)-*(p2+i);break;}else{return*(p1+i)-*(p2+i);break;}if(i==n+1)return0;}int main(){char a[N],b[N],*p1=a,*p2=b;printf("enter string1:");gets(p1);printf("enter string2:");gets(p2);printf("%d\n",str_cmp(p1,p2));}*//*void month(int*p){char*a[12]={"January","February","March","April","May","June","July","August","September","Octob er","Novenber","December"};int i;for(i=0;i<12;i++)if(*p==i+1)printf("英文:%s\n",a[i]);else continue;}int main(){int a,*p=&a;printf("enter month:");scanf("%d",p);month(p);}*//*#define SIZE1000char newbuf[SIZE]; //定义字符数组newbufchar *newp=newbuf;//定义指针变量newp,指向可存区的始端char *mynew(int n) //定义开辟存区的函数new,开辟存储区后返回指针{if(newp+n<=newbuf+SIZE) // 开辟区未超过newbuf数组的大小{newp+=n; // newp 指向存储区的末尾return(newp-n);} // 返回一个指针,它指向存区的开始位置elsereturn(NULL); // 当存区不够分配时,返回一个空指针}void free(char*p){if(p>=newbuf&&p<newbuf+SIZE)newp=p; // newp 指向存储区的开始位置}int main(){char *p=mynew(6);strcpy(p,"hello");printf("%s\n",p);free(p);}*//*#define N10 //定义每个字符串的最大字符数void sort(char*a[],int n){char **p=a;int i,j;char *k;for(i=1;i<n;i++)for(j=i;j<n;j++)if(strcmp(*(p+i-1),*(p+j))>0){k=*(p+i-1);*(p+i-1)=*(p+j);*(p+j)=k;}}int main(){char a[5][N];char *aa[5];int i;printf("enter strings:\n",);for(i=0;i<5;i++){scanf("%s",&a[i]);aa[i]=*(a+i);}sort(aa,5);printf("new strings:\n");for(i=0;i<5;i++)printf("%s ",aa[i]); //因为sort 函数改变的是aa[5]的排序,a[5][10]顺序并未改变,故输出的是aa[i],若写为a[i],输出顺序不变putchar('\n');}*/#define N5 //定义排序整数的个数void sort(int*a[],int n){int **p=a;int i,j,k;for(i=1;i<n;i++)for(j=i;j<n;j++)if(**(p+i-1)>**(p+j)){k=**(p+i-1);**(p+i-1)=**(p+j);**(p+j)=k;}}int main(){int a[N];int *aa[N];int i;printf("enter numbers:\n");for(i=0;i<N;i++){scanf("%d",&a[i]);aa[i]=a+i;}sort(aa,N);printf("new number:\n");for(i=0;i<N;i++)printf("%d ",a[i]); //因为sort 函数改变的是aa[N]的排序,也是a[N]的排序, 故输出的是a[i],也可写为*aa[i]putchar('\n');}。
c语言程序设计第五版课后答案谭浩强第八章课后答案
c语⾔程序设计第五版课后答案谭浩强第⼋章课后答案c语⾔程序设计第五版课后答案谭浩强习题答案第⼋章善于利⽤指针本章习题均要求使⽤指针⽅法处理。
1. 输⼊3个整数,要求按由⼩到⼤的顺序输出。
解题思路:先获取到三个变量的地址,然后获取三个数据,通过指针进⾏⽐较转换即可答案:#include <stdio.h>void swap(int *p_a, int *p_b){int temp = *p_a;*p_a = *p_b;*p_b = temp;}int main(){int a, b, c, *p_a = &a, *p_b = &b, *p_c = &c; // 获取每个变量空间的地址printf("Please enter three numbers:");scanf_s("%d%d%d", p_a, p_b, p_c);if (*p_a > *p_b) {swap(p_a, p_b);//通过指针进⾏指向空间内的数据交换}if (*p_a > *p_c) {swap(p_a, p_c);}if (*p_b > *p_c) {swap(p_b, p_c);}printf("%d %d %d\n", *p_a, *p_b, *p_c);system("pause");return 0;}2. 输⼊3个字符串,要求按由⼩到⼤的顺序输出。
解题思路:字符串的⽐较可以使⽤strcmp函数,返回值>0表⽰⼤于,返回值⼩于0表⽰⼩于,返回追等于0表⽰相同。
其他的⽐较排序思路与数字的排序交换没有区别,逐个进⾏⽐较先找出最⼤的,然后找出第⼆⼤的。
答案:#include <stdio.h>int main(){char str[3][32];char *p[3];printf("Please enter three strings:");for (int i = 0; i < 3; i++) {p[i] = str[i];scanf_s("%s", p[i], 32);//后边的数字限制缓冲区边界,防⽌缓冲区溢出访问越界}//让p[0]和p[1]/p[2]分别进⾏⽐较,找出最⼤的字符串,i+1之后,则让p[1]和p[2]进⾏⽐较,找出第⼆⼤//i循环总个数-1次,最后⼀个是不需要⽐较的for (int i = 0; i < 2; i++) {for (int j = i + 1; j < 3; j++) {if (strcmp(p[i], p[j]) > 0) {char *tmp = p[i]; p[i] = p[j]; p[j] = tmp;}}}printf("%s %s %s\n", p[0], p[1], p[2]);system("pause");return 0;}3. 输⼊10个整数,将其中最⼩的数与第⼀个数对换, 把最⼤的数与最后⼀个数对换。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第八章继承与多态习题一.基本概念与基础知识自测题8.1填空题8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。
(3)类的对象可作为(4)类的对象处理,反过来不行,因为(5)。
如果强制转换则要注意(6)。
答案:(1)基类(2)派生类(3)派生类(4)基类(5)派生类有一些新成员(6)只能派生类强制转换为基类8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员,protected成员成为派生类的(2)成员,对private成员是(3)。
公有派生可以使其类的(4),所以公有派生是主流。
答案:(1)public成员(2)protected成员(3)不可访问(4)接口不变8.1.3 利用继承能够实现(1)。
这种实现缩短了程序开发的时间,VC++中的(2)很好地体现了这一点。
答案:(1)代码的复用(2)MFC编程8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为(2)。
继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。
答案:(1)单继承(2)多重继承(3)层次(4)单继承8.1.5 C++中多态性包括两种多态性:(1)和(2)。
前者是通过(3)实现的,而后者是通过(4)和(5)来实现的。
答案:(1)编译时的(2)运行时的(3)函数和运算符的重载(4)类继承关系(5)虚函数8.1.6 在基类中将一个成员函数说明成虚函数后,在其派生类中只要(1)、(2)和(3)完全一样就认为是虚函数,而不必再加关键字(4)。
如有任何不同,则认为是(5)而不是虚函数。
除了非成员函数不能作为虚函数外,(6)、(7)和(8)也不能作为虚函数。
答案:(1)同虚函数名(2)同参数表(3)同返回类型。
如基类中返回基类指针,而派生类中返回派生类指针是允许的(4)virtual(5)重载(6)静态成员函数(7)内联函数(8)构造函数8.1.7 纯虚函数定义时在函数参数表后加(1),它表明程序员对函数(2),其本质是将指向函数体的指针定为(3)。
答案:(1)=0(2)不定义(3)NULL8.2简答题8.2.1构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。
派生类构造函数各部分的执行次序是:1.调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。
2.调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。
3.派生类的构造函数体中的操作。
8.2.2什么叫派生类的同名覆盖(override)?答:如果派生类声明了一个和某个基类成员同名的新成员(当然如是成员函数,参数表也必须一样,否则是重载),派生类中的新成员就屏蔽了基类同名成员,类似函数中的局部变量屏蔽全局变量。
称为同名覆盖(override)。
8.2.3派生类的析构函数中需完成什么任务?是否要编写对基数和成员对象的析构函数的调用?为什么?答:析构函数的功能是作善后工作,析构函数无返回类型也没有参数,情况比较简单。
派生类析构函数定义格式与非派生类无任何差异,不要编写对基数和成员对象的析构函数的调用,只要在函数体内把派生类新增一般成员处理好就可以了,因为对新增的成员对象和基类的善后工作,系统会自己调用成员对象和基类的析构函数来完成。
8.2.4为什么要使用虚基类?怎样定义虚基类?用一个实例来解释虚基类在其派生类中的存储方式。
答:在多重继承是有可能出现同一基类的两个拷贝,为避免这种情况,可使用虚基类。
虚基类(virtual base class)定义方式如下:class派生类名:virtual 访问限定符基类类名{...};class派生类名:访问限定符virtual基类类名{...};virtual 关键字只对紧随其后的基类名起作用。
如下派生: class Personint No身份证号……class Studentint No学生号……class GStudentint No研究生号……class Person int No 身份证号……class Employee int No 工作证号……class EGStudentint No在职学号……(a )派生关系Person 成员Student 新成员GStudent 新成员Person 成员Employee 新成员EGStudent 新成员Person Student Person Employee GStudent EGStudent (b )存储图存储关系如(b),在职研究生类有两个Person 拷贝。
采用虚基类后存储关系如下:在职研究生类只有一个Person 拷贝。
8.2.5 简单叙述派生类与基类的赋值兼容规则。
答:凡是基类所能解决的问题,公有派生类都可以解决。
在任何需要基类对象的地方都可以采用虚基类后在职研究生类储存图Student GStudentEGStudent PersonStudent 新成员 GStudent 新成员Person Employee 新成员Person 成员 EGStudent 新成员Person Person Employe用公有派生类的对象来代替,这条规则称赋值兼容规则。
它包括以下情况:1.派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的成员赋值给基类对象。
反过来不行,因为派生类的新成员无值可赋。
2.可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的成员,不能访问派生类中的新成员。
同样也不能反过来做。
3.派生类对象可以初始化基类的引用。
引用是别名,但这个别名只能包含派生类对象中的由基类继承来的成员。
8.2.6在类中定义对象成员称为复合或嵌套,请对比复合与继承的异同之处。
答:成员对象是嵌套的概念,使用成员对象中的成员,只能直接访问(对象名加点号加成员名)公有成员。
在类的成员函数中不能直接访问和处理成员对象的私有和保护成员,而要通过成员对象的接口去间接访问和处理。
某些应用中,对象成员可以代替继承中的基类。
基类在派生类中只能继承一个(间接基类不在讨论之中)不能同时安排两个,否则成员名即使使用域分辨符也会发生冲突,但如果一定要用两个,只能采用成员对象。
所以采用成员对象更加灵活。
两者不是对立的,而是互为补充的。
8.2.7比较派生与模板各自的优点。
答:模板追求的是运行效率,而派生追求的是编程的效率。
通用性是模板库的设计出发点之一,这是由泛型算法和函数对象等手段达到的。
为了运行的效率,类模板是相互独立的,即独立设计,没有使用继承的思想。
对类模板的扩展是采用适配子(adapter)来完成的。
应该说派生类的目标之一也是代码的复用和程序的通用性,最典型的就是MFC,派生类的优点是可以由简到繁,逐步深入,程序编制过程中可以充分利用前面的工作,一步步完成一个复杂的任务。
8.2.8是否使用了虚函数就能实现运行时的多态性?怎样才能实现运行时的多态性?答:不是。
实现动态多态性时,必须使用基类类型的指针变量或引用,使该指针指向该基类的不同派生类的对象,并通过该指针指向虚函数,才能实现动态的多态性。
8.2.9为什么析构函数总是要求说明为虚函数?答:在基类中及其派生类中都动态分配内存空间时,必须把析构函数定义为虚函数,实现撤消对象时的多态性。
根据赋值兼容规则可以用基类的指针指向派生类对象,如果由该指针撤销派生类对象,则必须将析构函数说明为虚函数,实现多态性,自动调用派生类析构函数。
我们总是要求将类设计成通用的,无论其他程序员怎样调用都必须保证不出错,所以必须把析构函数定义为虚函数。
8.2.10什么是抽象类?含有纯虚函数的类是抽象类吗?答:若定义一个类,它只能用作基类来派生出新的类,而不能用来定义对象,则称为抽象类。
含有纯虚函数的类是抽象类。
8.2.11能否不提供源代码,做到用户自行把通用的软件转化为专用软件?怎样实现?答:能不提供源代码,做到用户自行把通用的软件转化为专用软件。
动态联编不一定要源代码,可以只有头文件和对象文件的.obj文件。
软件开发商可在不透露其秘密的情况下发行.obj 形式的软件,然后由程序员利用继承机制,从所购得的类中派生出新类。
能与软件开发商提供的类一起运行的软件也能与派生类一起运行,并能通过动态联编使用这些派生类中重定义的虚函数。
比如通用的财务软件可以转化为某公司的专用软件。
二.编程与综合练习题8.3请用类的派生方式来组织下列动物实体与概念:动物,脊椎动物亚门,节肢动物门,鱼纲,鸟纲,爬行纲,哺乳纲,昆虫纲,鲨鱼,青鱼,海马,鹦鹉,海鸥,喜鹊,蝙蝠,翼龙,蜻蜓,金龟,扬子鳄,袋鼠,金丝猴,虎,蜈蚣,蜘蛛,蝗虫,知了,螃蟹,虾。
解:动物派生出:脊椎动物亚门和节肢动物门。
脊椎动物亚门派生出:鱼纲,鸟纲,爬行纲,哺乳纲。
鱼纲派生出:鲨鱼,青鱼,海马。
鸟纲派生出:鹦鹉,海鸥,喜鹊。
爬行纲派生出:翼龙,金龟,扬子鳄。
哺乳纲派生出:蝙蝠,袋鼠,金丝猴,虎。
节肢动物门派生出:昆虫纲,蜈蚣(多足纲),蜘蛛(蜘形纲),螃蟹,虾(甲壳纲)。
昆虫纲派生出:蜻蜓,蝗虫,知了。
8.4定义商品类及其多层的派生类。
以商品类为基类。
第一层派生出服装类、家电类、车辆类。
第二层派生出衬衣类、外衣类、帽子类、鞋子类;空调类、电视类、音响类;自行车类、轿车类、摩托车类。
要求给出基本属性和派生过程中增加的属性。
解:按题意没有操作,所以只列出数据成员,也不再检验#include <iostream>using namespace std;class Commodity{double price; //价格char name[20];//商品名char manufacturer[20];//生产厂家int items;//数量};class Clothing:public Commodity{//服装类char texture[20];//材料质地};class Electric_Appliance:public Commodity{//家电类enum {Black,White}type;//黑白家电};class Vehicle:public Commodity{//车辆类int wheel_num;//车轮数量};class Shirt:public Clothing{//衬衣类enum {Formal,Casual}Style;//式样:正式、休闲};class Garment:public Clothing{//外衣类enum {Jacket,Coat}Style;//式样:夹克、外套};class Hat:public Clothing{//帽子类;enum {Winter,Summer,Spring_Autumn}Style;//季节风格};class Shoes:public Clothing{//鞋子类enum {Winter,Summer,Spring_Autumn}Style;//季节风格};class Air_Cindition:public Electric_Appliance{//空调bool warm_cool; //是否冷暖float power;//功率};class Television:public Electric_Appliance{//电视类int Size; //尺寸bool isColor;//是否彩色};class Acoustics:public Electric_Appliance{//音响类int speaker_num; //喇叭数目float power; //功率};class Bicycle:public Vehicle{//自行车类int speed_grades; //调速级数int wheel_size; //轮子大小};class Car:public Vehicle{//轿车类float volume; //排气量bool isSkylight; //是否有天窗int box_num; //厢数};class Motorcycle:public Vehicle{//摩托车类float volume; //排气量};int main(){return 0;}8.5以点(point)类为基类,重新定义矩形类和圆类。