最新C++程序设计基础课后答案 第八章
c语言-C程序设计(第四版)谭浩强_课后习题答案第8章
![c语言-C程序设计(第四版)谭浩强_课后习题答案第8章](https://img.taocdn.com/s3/m/82699b260066f5335a8121bf.png)
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章答案
![C程序设计8章答案](https://img.taocdn.com/s3/m/49bce02fbcd126fff7050b45.png)
第八章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语言程序设计(谭浩强)第八章详细课后答案
![C语言程序设计(谭浩强)第八章详细课后答案](https://img.taocdn.com/s3/m/d87a1b513c1ec5da50e27072.png)
#if 0 //8.1#include<stdio.h>#include<math.h>void main(){int Common_divisor(int a,int b);int Common_mutiple(int m,int n);int result_1,result_2;int number_1,number_2;printf("Enter number_1 and number_2 value:");scanf("%d,%d",&number_1,&number_2);result_1 = Common_divisor(number_1,number_2);result_2 = Common_mutiple(number_1,number_2);printf("最大公约数:%d\n最小公倍数:%d\n",result_1,result_2); }int Common_divisor(int a,int b){int r = 1;while(r != 0){if(a>b){r = a%b;a = b;b = r;if(r == 0){return a;break;}}else{r = b%a;b = a;if(r == 0){return b;break;}a = r;}}}int Common_mutiple(int m,int n){int Common_divisor(int a,int b);int temp = 0,result = 0;temp = Common_divisor(m,n);result = (m*n)/temp;return result;}#endif#if 0 //8.2#include<stdio.h>#include<math.h>float result_1 =0.0,result_2 = 0.0;void main(){void Funvtion_1(float a,float b,float temp);void Function_2(float a,float b);float a,b,c;float temp;printf("Enter a,b,c value:");scanf("%f,%f,%f",&a,&b,&c);temp = b*b-4*a*c;if(temp > 0){Funvtion_1(a,b,temp);printf("x1 = %.3f,x2 = %.3f\n",result_1,result_2);}else if(temp < 0){printf("此函数没有根!\n");}else{Function_2(a,b);printf("x1 = x2 = %.3f\n",result_1);}}void Funvtion_1(float a,float b,float temp){result_1 = (-b+temp)/(2*a);result_2 = (-b-temp)/(2*a); }void Function_2(float a,float b) {result_1 = (-b)/(2*a);}#endif#if 0 //8.3#include<stdio.h>#include<math.h>void main(){void Prime(int n);int m;printf("Enter m value:");scanf("%d",&m);Prime(m);}void Prime(int n){int i = 0 ,k;k = (int)sqrt(n);for(i = 2; i <= k;i++){if(n%i == 0){break;}}if(i > k){printf("The number %d is a prime!\n",n);}else{printf("The number %d isn't a prime!\n",n);}}#endif#if 0#include<stdio.h>#include<math.h>int c[3][3];void main(){void Function(int b[3][3]);int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};int i,j;// int d[3][3];int k = sizeof(a[2])/sizeof(int); //列数int n = sizeof(a)/sizeof(int);for(i = 0; i < n/k;i++){for(j = 0;j < k;j++){printf("%d ",a[i][j]);}printf("\n");}Function(a);for(i = 0; i < k;i++){for(j = 0;j < n/k;j++){printf("%d ",c[i][j]);}printf("\n");}}void Function(int b[3][3]){int i = 0,j = 0;int k = sizeof(b[3])/sizeof(int);int n = sizeof(b)/sizeof(int);for(i = 0;i < k ;++i){for(j = 0;j < k; ++j){c[j][i] = b[i][j];}}}#endif#if 0#include<stdio.h>#include<math.h>#include<string.h>void main(){void Function(char a[100],char b[100]);char a[100];extern int b[100];int n = sizeof(a);printf("Enter a Array:");gets(a);Function(a,b);}void Function(char a[],char b[]){int i = 0;int n = sizeof(a)/sizeof(char);int m = strlen(a);for(i = 0; i < m;i++){b[i] = a[m-1-i];}//printf("put b Array:");//puts(b);for(i = 0;i < m;i++){putchar(b[i]);}}#endif#if 0 //8.6#include<stdio.h>#include<math.h>void main(){char a[20];char b[10];printf("Enter string a value:");gets(a);printf("Enter string b value:");gets(b);strcat(a,b);puts(a);}#endif#if 0 //8.6#include<stdio.h>#include<math.h>#include<string.h>int a[20];void main(){void Connect(char a[],char b[]);char b[10];printf("Enter string a value:");gets(a);printf("Enter string b value:");gets(b);Connect(a,b);// puts(a);printf("%s",a);}void Connect(char a[],char b[]) {int i = 0;int j = 0;while(a[i] != '\0'){i++;}while(b[j] != '\0'){a[i++] = b[j++];}// a[i] = '\0';}#endif#if 0//8.7#include<stdio.h>#include<math.h>#include<string.h>char b[100];void main(){void Research_vowel(char a[]);char a[50];printf("Enter string a value:");gets(a);Research_vowel(a);puts(b);}void Research_vowel(char a[]){int i = 0,j = 0;for(; i < strlen(a);i++){if(a[i] == 'a'|| a[i] == 'e' || a[i] == 'i' || a[i] == 'o' || a[i] == 'u'){b[j] = a[i];j++;}}#endif#if 0//8.8#include<stdio.h>#include<math.h>char a[4];void main(){void Divide(int n);int n = 0,i = 0;printf("Enter n value(<10000):");scanf("%d",&n);Divide(n);for(;i<4;i++){printf("%d ",a[i]);}printf("\n");}void Divide(int n)int i = 0,c = 0,b = 0,m = 1000;while(m >= 1){c = n/m;b = n%m;m = m/10;a[i] = c;n = b;i++;}}#endif#if 0//8.9#include<stdio.h>#include<math.h>#include<string.h>int m = 0,n = 0,r = 0,l = 0;void main(){void Research_number(char a[]);char a[50];int i = 0;printf("enter string value:");gets(a);/*for(;i<strlen(a);i++){printf("%c",a[i]);}*/puts(a);puts("");Research_number(a);printf("字母个数是:%d,数字个数是:%d,空格个数是:%d,其它:%d\n",m,n,r,l);}void Research_number(char a[]){int i = 0;for(i = 0;i<strlen(a);i++){if((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z')){m++;}else if(a[i] > 47 && a[i] < 58){n++;}else if(a[i] == 32){r++;}else{l++;}}}#endif#if 0 //8.10#include<stdio.h>#include<math.h>#include<string.h>void main(){void Array(char a[]);char b[20];printf("Enter b string(<20):");gets(b);printf("Longest word is : ");Array(b);}void Array(char a[]){int i = 0,place = 0,point = 0,length = 1; //point表示最长单词的开始位置place表示最长单词最后的一个位置int max = 0,j = 0;int flag = 0; //为0 时是空格为1时是单词max = length;for(i = 0;i<=strlen(a);i++){if(a[i] != ' ' && a[i] != '\0'){if(0 == flag){j = i;flag = 1;}elselength++; //这个题让我做的非常的难过以后要好好的复习}else{flag = 0;if(max < length){max = length;point = j;place = i;}length = 1;}}for(i = point;i <= place;i++){printf("%c",a[i]);}printf("\n");}/*int judge_words(char b[20]){int i = 0,flag = 1;for(i = 0;i < strlen(b); i++){if((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z')){flag = 1;}else{flag = 0;}}}*/#if 0 //8.11#include<stdio.h>#include<math.h>void main(){void bubbling(char a[]);char a[10];printf("enter string a value:");gets(a);bubbling(a);puts(a);}void bubbling(char a[]){int i = 0,j = 0;char temp;for(i = 0;i<strlen(a) - 1;i++){for( j = 0;j<strlen(a)-1-i;j++)if(a[j] > a[j+1]){temp = a[j];a[j] = a[j+1];a[j+1] = temp;}}}}#endif#if 0 //8.12#include<stdio.h>#include<math.h>void main(){float Function(float x);float x = 1.5,x1 = 0.0;x1 = Function(x);printf("%.3f\n",x1);}float Function(float x){float x1;float y,y1;while(fabs(y1)>=1e-6){x = x1;y1 = x*x*x+2*x*x+3*x+4;y = 3*x*x+4*x+3;x1 = x - (y1/y);}return x1;}#endif#if 0//8.13#include<stdio.h>#include<math.h>void main(){float p(float x,int n);float x = 0.0,result = 0.0;int n = 0;printf("Enter x and n value:");scanf("%f,%d",&x,&n);result = p(x,n);printf("p(x) value :%.3f\n",result);}float p(float x,int n){float y = 0.0;if(n == 0){y = 0;}else if(n == 1){y = x;}else{y = ((2*n-1)*x-p(x,n-1)-(n-1)*p(x,n-2))/n;}return y;}#endif#if 0//8.14#include<stdio.h>#include<math.h>int r = 0,l = 0;void main(){float* EStudent_aver(float scores[10][5]);float* EClass_aver(float scores[10][5]);float Maxscore(float scores[10][5]);float variance(float scores[10][5]);float scores[10][5] = {{76,43,46,73,46},{34,67,89,32,47},{31,68,73,16,87},{31,67,31,37,63},{16 ,37,61,67,86},{31,34,60,49,29},{89,89,87,87,98},{97,34,89,42,89},{45,67,34,18,64},{ 32,16,87,42,15}};float *Student_aver,*Class_aver,Student_max = 0.0,aver_variance = 0.0;int i = 0,j = 0,k = 0;/* char Student_name[] = {"Zhanghua Xiaoming Ligang Xiaotao Zhangsan Xiaoqiang CBC Baixu Gongcheng BOBO "};char score_name[] = {"Chinese Math English Chemitry WuLi"};printf("\t");for(i = 0;i < strlen(score_name);i++){printf("%c",score_name[i]);}puts("");for(i = 0;i < strlen(Student_name);i++){printf("%c",Student_name[i]);if(Student_name[i] == 32){for(j = 0;j < 5;j++){printf(" %.0f\t",scores[k][j]);}k++;puts("");}}*//* printf("\n");for(i = 0; i < 10;i++){for(j = 0;j < 5;j++){printf(" %.0f\t",scores[i][j]);}puts("");}*/// float scores[10][5];printf("NO. course1 course2 course3 course4 course5\n");for(i = 0;i < 10;i++){printf("No.%2d\t",i+1);for(j = 0;j < 5;j++){printf("%.2f\t ",scores[i][j]);}puts("");}Student_aver = EStudent_aver(scores);Class_aver = EClass_aver(scores);Student_max = Maxscore(scores);aver_variance = variance(scores);printf("Student_aver:\n");for(i = 0;i < 10;i++){printf("%.2f ",Student_aver[i]);}printf("\nClass_aver:\n");for(i = 0 ;i < 5;i++){printf("%.2f ",Class_aver[i]);}printf("\n");printf("The Max Score:\n %.2f Name: No.%d , Course: course%d\n",Student_max,r,l);printf("Student average Variance: \n %.2f\n",aver_variance);}float * EStudent_aver(float scores[10][5]){static float aver[10],sum = 0.0;int i = 0,j = 0;for(i = 0;i < 10;i++){for(j = 0; j < 5; j++){sum += scores[i][j];}aver[i] = sum/5;sum = 0;}return aver;}float* EClass_aver(float scores[10][5]) {static float aver_1[5],sum = 0.0;int i = 0,j = 0;for(j = 0;j<5;j++){for(i = 0;i<10;i++){sum +=scores[i][j];}aver_1[j] = sum/10;sum = 0;}return aver_1;}float Maxscore(float scores[10][5]) {int i = 0,j = 0;float max = scores[0][0];for(i = 0;i < 10;i++){for(j = 0;j < 5;j++){if(max < scores[i][j]){max = scores[i][j];r = i + 1;l = j + 1;}}}return max;}float variance(float scores[10][5]){float* EStudent_aver(float scores[10][5]);float s = 0.0;float sum_1 = 0.0,sum_2 = 0.0;float number_1 = 0.0,number_2 = 0.0;float* student_aver;int i = 0,j = 0;student_aver = EStudent_aver(scores);for(i = 0;i<10;i++){sum_1 += student_aver[i]*student_aver[i];sum_2 += student_aver[i];}number_1 = sum_1/10;number_2 = (sum_2/10)*(sum_2/10);s = number_1 - number_2;return s;}#endif#if 0 //测试static#include<stdio.h>#include<math.h>static j;void f1(){static i = 0;i++;}void f2(){j = 0;j++;}void main(){int k = 0;for(k = 0;k < 10;k++){f1();f2();}}#endif#if 0//8.16#include<stdio.h>#include<math.h>void main(){void Change(int n);int m = 0;printf("Enter ox number:");scanf("%x",&m);// printf("%d\n",m);Change(m);}void Change(int n){//int m;printf("十进制是: %d\n",n); }#endif#if 0//8.17#include<stdio.h>#include<math.h>void main(){void Function(int n);int m;printf("Input a integer:");scanf("%d",&m);Function(m);}void Function(int n){int i;/* if(n!=0){ch[i] = n%10;temp = n/10;i++;Function(temp);}else{ch[i] = 0;}return ch;*/i = n/10;if(i != 0){Function(i);}putchar(n%10+'0');putchar(32);}#endif#if 0 //今天是今年的多少天#include<stdio.h>#include<math.h>void main(){int i = 1,d = 0,sum = 0;int year,month,day;printf("Enter year and month and day(2012/08/19):");scanf("%d/%d/%d",&year,&month,&day);sum = day;for(;i<month;i++){switch(i){case 1:case 3:case 5:case 7:case 8:case 10:case 12: d = 31; break;case 2:if(year%400 == 0 || year%4 == 0 && year%100!=0){d = 29;}else{d = 28;}break;case 4:case 6:case 9:case 11: d = 30;break;}sum += d;}printf("The %d of The year dates!\n",sum); }#endif#if 0 //8.15#include<stdio.h>#define N 10void main(){void Enter_massage(char staff_name[N][10],int staff_number[N]);void Sort(char staff_name[N][10],int staff_number[N]);int middle_search(int staff_number[N],int number);int number,temp = 0;char staff_name[N][10];int staff_number[N];Enter_massage(staff_name,staff_number);//输入信息Sort(staff_name,staff_number);printf("Enter search staff_number:");scanf("%d",&number);temp = middle_search(staff_number,number);printf("The staff number is : %d\n",staff_number[temp]);printf("The staff name is : %s\n",staff_name[temp]);}void Enter_massage(char staff_name[N][10],int staff_number[N]) {int i;for(i = 0;i < N;i++){printf("Enter Staff number No.:");scanf("%d",&staff_number[i]);fflush(stdin);printf("Input staff name:");gets(staff_name[i]);}}void Sort(char staff_name[N][10],int staff_number[N]) {int i,j;int temp1;char temp[N][10];for(i = 0;i < N - 1; i++){for(j = 0;j < N - 1 - i; j++){if(staff_number[j]>staff_number[j+1]){temp1 = staff_number[j];strcpy(temp[j],staff_name[j]);staff_number[j] = staff_number[j+1];strcpy(staff_name[j],staff_name[j+1]);staff_number[j+1] = temp1;strcpy(staff_name[j+1],temp[j]);}}/*if(staff_number[i]<staff_number[i+1]){temp1 = staff_number[i];staff_number[i] = staff_number[i+1];staff_number[i+1] = temp1;}*/}for(i = 0;i < N;i++){printf("staff number is : %d\n",staff_number[i]);printf("staff name is %s\n",staff_name[i]);}}int middle_search(int staff_number[N],int number) //折半查找法!{int min = 0,high = 0,mid = 0;int i = 0;min = 0;high = N - 1;while(min <= high){mid = (min+high)/2;if(staff_number[mid] > number){high = mid - 1;}else if(staff_number[mid] < number){min = mid + 1;}else{return mid;}}}#endif/*fasdfa the world helloint flag=0;flag=1;//letterflag=0;//space*/#if 0 //有问题输出的是不对的!为什么指针值temp+1的值不是指向的name[1]这一行的首地址而是++后指向的是name[0]下一列的地址呢?#include<stdio.h>void main(){char name[5][10];char temp[5][10];int i = 0;// temp = &name[0];for(i = 0;i < 5;i++){gets(name[i]);strcpy(temp[i],name[i]);}for(i = 0;i < 5;i++){//puts(name[i]);puts(temp[i]);}}#endif#if 0 //看不懂的程序8.15 #define N 10find(a,b)int a[],b[];{int i,j,s,t,c[N][2];for(i=0;i<N;i++){c[i][1]=a[i];c[i][1]=i;} for(i=0;i<N;i++)for(j=0;j<N-i-1;j++)if(c[i][0]>c[i+1][0]){t=c[i][0];c[i][0]=c[i+1][0];c[i+1][0]=t;s=c[i][1];c[i][1]=c[i+1][1];c[i+1][1]=s;}for(i=0;i<N;i++)b[i]=c[i][1];return;}lookfor(h,k)int h[],k;{int i,j;for(i=0;i<N;i++)if(h[i]-k==0) j=i;return j;}main(){int number[N],x[N],i,j,u,p;char name[N][20];for(i=0;i<N;i++){gets(name[i]);scanf("%d",&number[i]);} scanf("%d",&p);find(number,x);u=lookfor(number,p);for(i=0;i<N;i++){printf("%d",number[i]);puts(name[x[i]]);}puts(name[x[u]]);}#endif#if 1 //16进制转换成10进制#include<stdio.h>#include<math.h>#define N 10int flag = 1;void main(){extern int sum;int convert(char str[],int n);char str[N];int s = 0,n = 0;puts("Enter 16 OX number:");gets(str);n = strlen(str);s = convert(str,n);if(1 == flag){printf("10 d number is : %d\n",s);}else{printf("The number isn't OX \n");}}int convert(char str[],int n){int i,j = 0;int sum = 0;for(i = n - 1;i > -1;i--,j++){if(str[i] > 47 && str[i] < 58){sum = sum + (str[i] - 48) * (int)pow(16,j);}else if(str[i] > 64 && str[i] < 71){sum = sum + (str[i] - 55)* (int)pow(16,j);}else if(str[i] > 96 && str[i] < 103){sum = sum + (str[i] - 87) * (int)pow(16,j);}else{flag = 0;}}return sum;}#endif#if 0#include<stdio.h>#include<math.h>void main(){printf("%d\n",(int)pow(2,0)); }#endif。
C++程序设计基础课后答案 第八章
![C++程序设计基础课后答案 第八章](https://img.taocdn.com/s3/m/11c9ea1fe53a580217fcfe76.png)
8.1 阅读下列程序,写出执行结果1.#include <iostream.h>class Bclass{ public:Bclass( int i, int j ) { x = i; y = j; }virtual int fun() { return 0 ; }protected:int x, y ;};class Iclass:public Bclass{ public :Iclass(int i, int j, int k):Bclass(i, j) { z = k; }int fun() { return ( x + y + z ) / 3; } private :int z ;};void main(){ Iclass obj( 2, 4, 10 );Bclass p1 = obj;cout << p1.fun() << endl;Bclass & p2 = obj ;cout << p2.fun() << endl;cout << p2.Bclass :: fun() << endl;Bclass *p3 = &obj;cout << p3 -> fun() << endl;}2.#include <iostream.h>class Base{ public:virtual void getxy( int i,int j = 0 ) { x = i; y = j; }virtual void fun() = 0 ;protected:int x , y;};class A: public Base{ public:void fun(){ cout<<"x = "<<x<<'\t'<<"y = x * x = "<<x*x<<endl; } };class B:public Base{ public:void fun(){ cout << "x = " << x << '\t' << "y = " << y << endl;cout << "y = x / y = " << x / y << endl;}};void main(){ Base * pb;A obj1;B obj2;pb = &obj1;pb -> getxy( 10 );pb -> fun();pb = &obj2;pb -> getxy( 100, 20 );pb -> fun();}8.2 思考题1.在C++中,使用类体系依靠什么机制实现程序运行时的多态?2.如果一个基类的虚函数被声明为私有成员函数,会有语法错误吗?可以在应用类体系时实现动态联编吗?请你验证一下。
c语言《程序设计基础》课后习题参考答案与解析
![c语言《程序设计基础》课后习题参考答案与解析](https://img.taocdn.com/s3/m/abfc4e8e453610661fd9f47a.png)
c语言《程序设计基础》课后习题参考答案与解析《程序设计基础》习题参考答案与部分解析第1章 C 语言概述一、填空a) C源程序的基本单位是函数。
b) 一个C程序中至少应包括一个 main函数。
c) 在C语言中,输出操作是有库函数 printf( )函数完成。
二、单选题1、A2、C3、B解析:第1题答案:A 。
因为一个C程序总是从main函数开始执行的,而不论main函数在程序中的位置。
且到main函数结束。
第2题答案:C 。
因为 main函数没有限制必须位于程序的最前面。
C程序书写自由,一行内可写几个语句。
在对一个C 程序进行编译的过程中,无法检查注释当中的拼写错误。
不过C语言本身并没有输入输出语句,输入输出是由函数完成的。
第3题答案:B。
因为一个C语言程序是由若干个函数组成的。
但至少包含一个main 函数,且main函数的位置不限。
三、编程题1、编写一个输出“Welcome to C!”信息的小程序。
解:程序如下#include “stdio.h”main( ){1printf(“Welcome to C!”) ;}2、已知三角形的三边长分别为3,4,5,试用海轮公式编程求其面积。
海伦公式为:S?= ,其中s= (a+b+s)/2 ;解:程序如下#include “math.h”#include “stdio.h”main( ){int a , b , c ; /* a ,b,c 3个整型变量表示三角形的3条边。
*/float s ,s1 ; /* s1作为面积变量,s 作为中间变量是都应该是实形*/a=3 ; b= 4; c=5 ;s= (a+b+c)/2.0 ;s1= sqrt(s*(s-a)*(s-b)*(s-c)); /* sqrt函数完成开平方根功能。
*/printf(“area=%f\n”,s1);}2第2章程序设计基础知识一、单选题1、C2、A3、C4、A5、C6、C7、D8、C9、D 10、A 11、D 12、A 13、C 14、C 15、B A 16、B 17 D解析:1. 答案:C。
c程序设计第八章答案
![c程序设计第八章答案](https://img.taocdn.com/s3/m/bedf206d48d7c1c708a145c2.png)
第八章函数例子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语言程序设计基础教程课后答案
![c语言程序设计基础教程课后答案](https://img.taocdn.com/s3/m/06ce2140a200a6c30c22590102020740bf1ecd53.png)
c语言程序设计基础教程课后答案C语言程序设计基础教程课后答案第一章:C语言概述1. 简述C语言的特点。
- C语言是一种结构化编程语言,具有高效、灵活、功能强大等特点。
- 它支持多种编程范式,如过程式编程、结构化编程、面向对象编程等。
- C语言具有较低的抽象级别,接近硬件,因此执行效率较高。
2. C语言的发展历史。
- C语言在1972年由丹尼斯·里奇(Dennis Ritchie)在贝尔实验室开发。
- 它最初是作为UNIX操作系统的系统编程语言而设计的。
第二章:C语言环境和基本语法1. 如何设置C语言的开发环境?- 选择一个C语言编译器,如GCC、MSVC等。
- 安装编译器并配置环境变量,以便在命令行中直接调用编译器。
2. C语言的基本语法结构是什么?- C语言的基本结构包括预处理指令、函数定义、变量声明和语句。
第三章:数据类型、运算符和表达式1. C语言中的基本数据类型有哪些?- 整型(int)、字符型(char)、浮点型(float和double)等。
2. 运算符的分类及其用法。
- 算术运算符:+、-、*、/、%等。
- 赋值运算符:=、+=、-=等。
- 比较运算符:==、!=、>、<等。
- 逻辑运算符:&&、||、!等。
第四章:控制语句1. 条件语句的用法。
- if语句用于基于条件执行代码块。
- switch语句用于多条件选择。
2. 循环语句的用法。
- while循环用于在满足条件时重复执行代码块。
- for循环用于已知迭代次数的循环。
- do-while循环先执行代码块再判断条件。
第五章:数组和字符串1. 数组的基本概念和使用。
- 数组是相同数据类型的元素集合,存储在连续的内存位置。
- 声明数组:int arr[10]; 表示一个包含10个整数的数组。
2. 字符串的表示和操作。
- 在C语言中,字符串是以空字符('\0')结尾的字符数组。
- 使用标准库函数如strcpy、strlen等操作字符串。
C程序设计教程与实验第8章习题参考答案
![C程序设计教程与实验第8章习题参考答案](https://img.taocdn.com/s3/m/6fb3a9d7aa00b52acfc7ca89.png)
第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()函数将该数组中的所有元素逆序排列,并返回该数组中所有元素的平均值。
(word完整版)C语言程序设计课后习题1-8参考答案
![(word完整版)C语言程序设计课后习题1-8参考答案](https://img.taocdn.com/s3/m/2d5c3d71e3bd960590c69ec3d5bbfd0a7856d55d.png)
C语言程序设计课后习题1—8参考答案习题1参考答案一、简答题1、冯诺依曼计算机模型有哪几个基本组成部分?各部分的主要功能是什么?答:冯诺依曼计算机模型是由运算器、控制器、存储器、输入设备、输出设备五大功能部件组成的。
运算器又称算术逻辑部件,简称ALU,是计算机用来进行数据运算的部件。
数据运算包括算术运算和逻辑运算。
控制器是计算机的指挥系统,计算机就是在控制器的控制下有条不紊地协调工作的.存储器是计算机中具有记忆能力的部件,用来存放程序和数据.输入设备是用来输入程序和数据的部件。
输出设备正好与输入设备相反,是用来输出结果的部件。
2、简述计算机的工作原理。
答:计算机的工作原理可简单地概括为:各种各样的信息,通过输入设备,进入计算机的存储器,然后送到运算器,运算完毕把结果送到存储器存储,最后通过输出设备显示出来。
整个过程由控制器进行控制。
3、计算机软件系统分为哪几类?答:软件内容丰富,种类繁多,通常根据软件用途将其分为两大类:系统软件和应用软件。
系统软件是指管理、监控、维护计算机正常工作和供用户操作使用计算机的软件。
这类软件一般与具体应用无关,是在系统一级上提供的服务。
系统软件主要包括以下两类:一类是面向计算机本身的软件,如操作系统、诊断程序等。
另一类是面向用户的软件,如各种语言处理程序(像BC、VC等)、实用程序、字处理程序等。
在操作系统的基础上运行。
4、什么叫软件?说明软件与硬件之间的相互关系。
答:软件是指计算机程序及有关程序的技术文档资料。
两者中更为重要的是程序,它是计算机进行数据处理的指令集,也是计算机正常工作最重要的因素。
在不太严格的情况下,认为程序就是软件。
硬件与软件是相互依存的,软件依赖于硬件的物质条件,而硬件则需在软件支配下才能有效地工作.在现代,软件技术变得越来越重要,有了软件,用户面对的将不再是物理计算机,而是一台抽象的逻辑计算机,人们可以不必了解计算机本身,可以采用更加方便、更加有效地手段使用计算机。
C语言程序设计-第三版-谭浩强主编第6—8章课后习题答案
![C语言程序设计-第三版-谭浩强主编第6—8章课后习题答案](https://img.taocdn.com/s3/m/d3cd2398dc88d0d233d4b14e852458fb770b3863.png)
C语言程序设计-第三版-谭浩强主编第6—8章课后习题答案第六章循环语句6.1输入两个正数,求最大公约数和最小公倍数.#includevoidmain(){inta,b,num1,num2,temp;printf(\请输入两个正整数:\\n\canf(\if(num1temp=num1;num1=num2;num2=temp;}a=num1,b=num2;while(b!=0){temp=a%b;a=b;b=temp;}printf(\它们的最大公约数为:%d\\n\printf(\它们的最小公倍数为:%d\\n\}编译已通过6.2输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数.解:#includevoidmain(){charc;intletter=0,pace=0,degit=0,other=0;printf(\请输入一行字符:\\n\while((c=getchar())!='\\n'){if(c>='a'&&c<='z'||c>'A'&&c<='Z')letter++;eleif(c=='')pace++;eleif(c>='0'&&c<='9')digit++;eleother++;}printf(\其中:字母数=%d空格数=%d数字数=%d其它字符数=%d\\n\digit,other);}6.3求(n)=a+aa+aaa++aaa之值,其中a是一个数字,n表示a的位数。
解:voidmain(){inta,n,count=1,n=0,tn=0;printf(\请输入a和n的值:\\n\canf(\printf(\while(count<=n){tn=tn+a;n=n+tn;a=a某10;++count;}printf(\\\n\}6.4求(即1+2!+3!+4!++20!)voidmain(){floatn,=0,t=1;for(n=1;n<=20;n++){t=t某n;=+t;}printf(\\\n\}阶乘利用递归,再求和:#includeuingnamepacetd;longFunc(intn){ if(1==n)returnn;if(n>1)returnn某Func(n-1);}main(){long=0;inti=1;while(i<=6){=+Func(i);i++;}cout<6.5求voidmain(){intk,N1=100,N2=50,N3=10;float1=0.0,2=0.0,3=0.0;for(k=1;k<=N1;k++)/某计算1到100的和某/{1=1+k;}for(k=1;k<=N2;k++)/某计算1到50各数平方和某/{2=2+k某k;}for(k=1;k<=N3;k++)/某计算1到10各数倒数之和某/{3=3+1.0/k;}printf(\总和=%8.2f\\n\}已通过intmain(){intk=1,i=11,j=51;float=0.0;while(k<=10){=+k+k某k+1.0/k;while(k==10&&i<=50){=+i+i某i;while(i=50&&j<=100){ =+j;j++;}i++;}k++;}}6.6所谓“水仙开数”是指一个3位数,其个位数字立方和等于该数本身。
2024年度谭浩强《C程序设计》第八章习题解析
![2024年度谭浩强《C程序设计》第八章习题解析](https://img.taocdn.com/s3/m/fcad9445bb1aa8114431b90d6c85ec3a87c28b93.png)
选择排序的时间复杂度也为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语言程序设计》课后习题答案第八章
![《C语言程序设计》课后习题答案第八章](https://img.taocdn.com/s3/m/48932970561252d380eb6e90.png)
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程序设计第四版(谭浩强)第八章答案
![c程序设计第四版(谭浩强)第八章答案](https://img.taocdn.com/s3/m/97159d25195f312b3169a5f8.png)
#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语言程序设计第五版课后答案谭浩强第八章课后答案](https://img.taocdn.com/s3/m/5a8f1029366baf1ffc4ffe4733687e21af45ff04.png)
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个整数,将其中最⼩的数与第⼀个数对换, 把最⼤的数与最后⼀个数对换。
C课后习题答案第八章
![C课后习题答案第八章](https://img.taocdn.com/s3/m/e93b8eb265ce050876321342.png)
}
virtualintwages()
{ intw=geth();
return(3000+40*w);
}
};
classlecturer:publicteacher
p3.out();
cout<<"连接以后的长度为"<<p3.len()<<endl;
}
3、#include"iostream.h"
classPoint
{
privateo:ublex,y;
public:
Point(doublea,doubleb)
intgeth()
{returnhour;}
voidprint()
{ cout<<"课时数是:"<<hour<<"小时"<<endl; }
virtualintwages()
{
return(0);
doublegetweight()
{ returnweight;}
chargetcolor()
{ returncolor; }
voidprint()
{ cout<<"age="<<age<<",weight="<<weight<<",color="<<color<<endl; } m};
p=&c;
p->print();
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8.1 阅读下列程序,写出执行结果1. #include <iostream.h>class Bclass{ public:Bclass( int i, int j ) { x = i; y = j; }virtual int fun() { return 0 ; }protected:int x, y ;};class Iclass:public Bclass{ public :Iclass(int i, int j, int k):Bclass(i, j) { z = k; }int fun() { return ( x + y + z ) / 3; }private :int z ;};void main(){ Iclass obj( 2, 4, 10 );Bclass p1 = obj;cout << p1.fun() << endl;Bclass & p2 = obj ;cout << p2.fun() << endl;cout << p2.Bclass :: fun() << endl;Bclass *p3 = &obj;cout << p3 -> fun() << endl;}2. #include <iostream.h>class Base{ public:virtual void getxy( int i,int j = 0 ) { x = i; y = j; }virtual void fun() = 0 ;protected:int x , y;};class A: public Base{ public:void fun(){ cout<<"x = "<<x<<'\t'<<"y = x * x = "<<x*x<<endl; } };class B:public Base{ public:void fun(){ cout << "x = " << x << '\t' << "y = " << y << endl;cout << "y = x / y = " << x / y << endl;}};void main(){ Base * pb;A obj1;B obj2;pb = &obj1;pb -> getxy( 10 );pb -> fun();pb = &obj2;pb -> getxy( 100, 20 );pb -> fun();}8.2 思考题1.在C++中,使用类体系依靠什么机制实现程序运行时的多态?2.如果一个基类的虚函数被声明为私有成员函数,会有语法错误吗?可以在应用类体系时实现动态联编吗?请你验证一下。
3.虚函数和纯虚函数的区别是什么?4.一个非抽象类的派生类是否可以为抽象类?利用例8-11进行验证,从Hex_type类派生一个Hex_format 类,其中包含一个纯虚函数Show_format(),然后定义Hex_format的派生类实现Show_format()。
1.在C++中,使用类体系依靠什么机制实现程序运行时的多态?【答案】在C++中,基类指针可以指向派生类对象,以及基类中拥有虚函数,是支持多态性的前提。
程序通过用同一个基类指针访问不同派生类的虚函数重载版本实现程序运行时的多态。
C++的虚特性负责自动地在程序运行时把基类指针的关联类型转换成当前指向对象的派生类类型。
另外,抽象类机制提供了软件抽象和可扩展性的手段,实现运行时的多态性。
2.如果一个类的虚函数被声明为私有成员函数,会有语法错误吗?当它作为基类时,可以在应用类体系时实现动态联编吗?请你验证一下。
【答案】没有语法错误。
但在应用类体系时无法实现动态编联和多态。
因为私有成员函数只在类内可见,在类外无法调用,无法在类外通过基类指针实现多态。
程序略。
3.虚函数和纯虚函数的区别是什么?【答案】虚函数定义时冠以关键字virtual,本身有实现代码,作用是引导基类指针根据指向对象调用类体系中不同重载版本函数。
纯虚函数是指在说明时代码“为0”的虚函数,即纯虚函数本身并没有实现代码,必须通过它的派生类定义实现版本。
4.一个非抽象类的派生类是否可以为抽象类?利用例9-11进行验证,从Hex_type类派生一个Hex_format 类,其中包含一个纯虚函数Show_format,然后定义Hex_format的派生类定义实现Show_format。
【答案】一个非抽象类的派生类可以为抽象类,即在派生类中定义了纯虚函数。
程序略。
8.3 编程题1.使用虚函数编写程序求球体和圆柱体的体积及表面积。
由于球体和圆柱体都可以看作由圆继承而来,所以可以定义圆类Circle作为基类。
在Circle类中定义一个数据成员radius和两个虚函数area()和volume()。
由Circle类派生Sphere类和Column类。
在派生类中对虚函数area()和volume()重新定义,分别求球体和圆柱体的体积及表面积。
答案 8.3-1#include <iostream.h>const double PI=3.14159265;class circle{ public:circle(double r) { radius = r; }virtual double area() { return 0.0; }virtual double volume() { return 0.0; }protected:double radius;class sphere:public circle{ public:sphere( double r ):circle( r ){ }double area() { return 4.0 * PI * radius * radius; }double volume(){ return 4.0 * PI * radius * radius * radius / 3.0; } };class column:public circle{ public:column( double r,double h ):circle( r ) { height = h; }double area(){ return 2.0 * PI * radius * ( height + radius ); } double volume(){ return PI * radius * radius * height; }private:double height;void main(){ circle *p;sphere sobj(2);p = &sobj;cout << "球体:" << endl;cout << "体积 = " << p->volume() << endl;cout << "表面积 = " << p->area() << endl;column cobj( 3,5 );p = &cobj;cout << "圆柱体:" << endl;cout << "体积 = " << p->volume() << endl;cout << "表面积 = " << p->area() << endl; }2.某学校对教师每月工资的计算规定如下:固定工资+课时补贴。
教授的固定工资为5000元,每个课时补贴50元。
副教授的固定工资为3000元,每个课时补贴30元。
讲师的固定工资为2000元,每个课时补贴20元。
定义教师抽象类,派生不同职称的教师类,编写程序求若干个教师的月工资。
答案 8.3-2#include <iostream.h>#include <string.h>class teacher{ public:teacher( char tname[],int time ){ strcpy( name,tname );coursetime = time;}virtual int pay() = 0;virtual void print() = 0;char *getname(){ return name; }int getcoursetime(){ return coursetime; }protected:char name[30];int coursetime;};class professor:public teacher{ public:professor( char pname[],int time ):teacher( pname,time ){ }int pay(){ return 5000+coursetime*50; }void print(){ cout<<"教授:"<<getname(); }};class associateprofessor:public teacher{ public:associateprofessor( char pname[],int time ):teacher( pname,time ){ }int pay(){ return 3000 + coursetime * 30; }void print(){ cout << "副教授:" << getname(); }};class lecturer:public teacher{ public:lecturer( char pname[],int time ):teacher( pname,time ){ }int pay(){ return 2000 + coursetime * 20;}void print(){ cout << "讲师:" << getname();}};void main(){ professor pobj( "李小平",32 );pobj.print();cout << '\t' << "工资:" << pobj.pay() << endl;associateprofessor apobj( "王芳芳",56 );apobj.print();cout << '\t' << "工资:" << apobj.pay() << endl;lecturer lobj( "何大建",72 );lobj.print();cout << '\t' << "工资:" << lobj.pay() << endl;}3.改写第7章习题7.4第3题,把Shape类定义为抽象类,提供共同操作界面的纯虚函数。