c语言第八章课后题答案剖析.docx
- 文档编号:27119156
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:20
- 大小:54.90KB
c语言第八章课后题答案剖析.docx
《c语言第八章课后题答案剖析.docx》由会员分享,可在线阅读,更多相关《c语言第八章课后题答案剖析.docx(20页珍藏版)》请在冰豆网上搜索。
c语言第八章课后题答案剖析
一、第八章习题8(p222-p228),8.1-8.3全做,8.4-8.12中选做四道,8.13-8.19中选做三道,要求给出所选择题目的程序及执行结果。
8-1
(1)、
#include
voidFunc(intx)
{
x=20;
}
intmain()
{
intx=10;
Func(x);
printf("%d",x);
return0;
}
结果:
分析:
调用函数时只发生值的传递,形参与实参之间再也没有关系,子函数一旦退出,内部变量就释放空间
(2)
#include
voidFunc(intb[])
{
intj;
for(j=0;j<4;j++)
{
b[j]=j;
}
}
intmain()
{
staticinta[]={5,6,7,8},i;
Func(a);
for(i=0;i<4;i++)
{
printf("%d",a[i]);
}
return0;
}
结果:
分析:
数组传递时向函数传递的是数组的地址值,实参与形参共享空间,在被调函数中对数组进行修改就会造成主函数中的数组也被修改。
8.2
(1)
intPositiveNum(inta[],intn)
{
inti,count=0;
for(i=0;i { if(a[i]>0)count++; } returncount; } (2) voidFib(longf[],intn) { inti; f[0]=0; f[1]=1; for(i=2;i { f[i]=f[i-1]+f[i-2]; } } (3) #include intmain() { inta[10],n,max,min,maxPos,minPos; for(n=0;n<10;n++) { scanf("%d",&a[n]); } max=min=a[0]; maxPos=minPos=0; for(n=0;n<10;n++) { if(a[n]>max) { max=a[n]; maxPos=n; } elseif(a[n] { min=a[n]; minPos=n; } } printf("max=%d,pos=%d\n",max,maxPos); printf("min=%d,pos=%d\n",min,minPos); return0; } 结果: (4) #include #defineROW2 #defineCOL3 MultiplyMatrix(inta[ROW][COL],intb[COL][ROW],intc[ROW][ROW]) { inti,j,k; for(i=0;i { for(j=0;j { c[i][j]=0; for(k=0;k { c[i][j]=c[i][j]+a[i][k]*b[k][j]; } } } } voidPrintMatrix(inta[ROW][ROW]) { inti,j; for(i=0;i { for(j=0;j { printf("%6d",a[i][j]); } printf("\n"); } } intmain() { inta[ROW][COL],b[COL][ROW],c[ROW][ROW],i,j; printf("Input2*3matrixa: \n"); for(i=0;i { for(j=0;j { scanf("%d",&a[i][j]); } } printf("Input3*2matrixb: \n"); for(i=0;i { for(j=0;j { scanf("%d",&b[i][j]); } } MultiplyMatrix(a,b,c); printf("Results: \n"); PrintMatrix(c); return0; } 结果: 8-3、 viodDivArray(intpArray[],intn) { inti; for(i=0;i { pArray[i]/=pArray[0]; } } 错误分析: 原代码中定义了一个未初始化的指针,而不是数组,有可能会使指针访问到不该访问的内存空间,造成危险,应该定义数组,对数组中的数进行修改操作。 8-6、 #include #defineN40 intReadscore(intscore[],longnum[]); intFindMax(intscore[],longnum[],intn); voidmain() { intscore[N]; longnum[N]; intn; intm; n=Readscore(score,num);/*接收人数*/ m=FindMax(score,num,n); printf("最高的成绩: %d\n学号为: %ld\n",score[m],num[m]); } intReadscore(intscore[],longnum[]) { inti=-1; do{ i++; printf("请输入学号: "); scanf("%ld",&num[i]); printf("请输入成绩: "); scanf("%d",&score[i]); }while(score[i]>=0&&num[i]>=0); returni; } intFindMax(intscore[],longnum[],intn) { inti; intk; intmax=score[0]; for(i=0;i { if(score[i]>max) { max=score[i]; k=i; } } returnk; } 结果: 8-7 #include voidSort(intscore[]); voidReadscore(intscore[]); voidmain() { intscore[10]; Readscore(score); Sort(score); } voidReadscore(intscore[]) { inti; for(i=0;i<10;i++) { printf("inputscore: "); scanf("%d",&score[i]); } } voidSort(intscore[]) { inti; intk,p; inttemp; intmax=score[0]; intmin=score[0]; for(i=0;i<10;i++) { if(score[i]>max) { max=score[i]; k=i; } elseif(score[i] { min=score[i]; p=i; } } temp=score[k]; score[k]=score[p]; score[p]=temp; for(i=0;i<10;i++) { printf("%d",score[i]); } printf("\n"); } 结果: 8-10 #include voidmain() { inti; intn; intj; inta[10][10]; intsum1=0; intsum2=0; printf("请输入维数n(n<=10): "); scanf("%d",&n); for(i=0;i { for(j=0;j { printf("请输入元素a[%d][%d]: ",i,j); scanf("%d",&a[i][j]); } printf("\n"); } for(i=0;i { sum1+=a[i][i]; sum2+=a[i][n-1-i]; } printf("主对角线之和: %d\n副对角线之和: %d\n",sum1,sum2); } 结果: 8-12 #include voidmain() { inta[7][7]; inti; intj; for(i=0;i<7;i++)/*使对角线上、第一列的数均为1*/ { a[i][i]=1; a[i][0]=1; } for(i=2;i<7;i++)/*计算中间的数*/ { for(j=1;j { a[i][j]=a[i-1][j-1]+a[i-1][j]; } } for(i=0;i<7;i++)/*打印杨辉三角形*/ { for(j=0;j<=i;j++) { printf("%d",a[i][j]); } printf("\n"); } }#include voidmain() { inta[7][7]; inti; intj; for(i=0;i<7;i++) { a[i][i]=1; a[i][0]=1; } for(i=2;i<7;i++) { for(j=1;j { a[i][j]=a[i-1][j-1]+a[i-1][j]; } } for(i=0;i<7;i++) { for(j=0;j<=i;j++) { printf("%d",a[i][j]); } printf("\n"); } } 结果: 8-13 #include longFibonacci(intn); voidmain() { longm; m=Fibonacci(12); printf("%ld\n",m); } longFibonacci(intn) { if(n==0) return0; elseif(n==1) return1; else returnFibonacci(n-1)+Fibonacci(n-2); } 结果 8-14 #include #include #include voidmain() { floata=0,b=0,c=0,d=0,e=0,f=0; inti; intm; srand(time(NULL));/*注意: 只能将产生随机数种子写在循环外面*/ for(i=0;i<6000;i++) { m=rand()%6+1; switch(m) { case1: a++; break; case2: b++; break; case3: c++; break; case4: d++; break; case5: e++; break; case6: f++; break; } } printf("面数: --1------2------3------4------5------6--\n"); printf("概率: %.2f%%%.2f%%%.2f%%%.2f%%%.2f%%%.2f%%",a/6000,b/6000,c/6000,d/6000,e/6000,f/6000); } 结果: 8-15 #include #include #include voidProduceNum(intnum[]); voidGuessNum(intguess[]); voidPanZhengWu(intnum[],intguess[],intresult[]); voidmain() { intnum[4]; intguess[4]; intresult[2]; inti; intn; intflag=0; ProduceNum(num); printf("请输入您想猜的次数: "); scanf("%d",&n); for(i=0;i { GuessNum(guess); PanZhengWu(num,guess,result); if(result[0]==4) { printf("Congradulations! \n"); flag=1; break; } } if(flag==0) { printf("Sorry! Youhaven'tguesstherightnumber! \n"); } } /*功能: 产生4位相异的数字放入num【4】中 入口参数: 无 返回值: 无 */ voidProduceNum(intnum[]) { intflag=0; inti,j; srand(time(NULL)); do{ num[0]=rand()%10; num[1]=rand()%10; num[2]=rand()%10; num[3]=rand()%10; for(i=0;i<4;i++) { for(j=i+1;j<4;j++) { if(num[i]==num[j])/*判断是否产生4个完全相异的数字*/ flag=1; } } //if(flag==0) //printf("%d%d%d%d\n",num[0],num[1],num[2],num[3]); }while(flag); } /*功能: 用户输入所猜的数并存入guess【4】中 入口参数: 无 返回值: 无 */ voidGuessNum(intguess[]) { inti; printf("\n"); printf("请输入4位您猜的数: \n"); for(i=0;i<4;i++) { printf("输入第%d个数: ",i+1); scanf("%d",&guess[i]); } } /*功能: 判断猜数正误 入口参数: 计算机产生的数、用户猜的数 返回值: 无 */ voidPanZhengWu(intnum[],intguess[],intresult[]) { inti; intx=0; inty=0; intj; for(i=0;i<4;i++) { if(num[i]==guess[i])/*数字对且位置对*/ x++; for(j=0;j<4;j++) { if(num[i]==guess[j])/*数字对(含有位置对和位置不对的两种情况)*/ y++; } } y=y-x; result[0]=x; result[1]=y; printf("猜测结果: %dA%dB\n",result[0],result[1]); } 结果: 二、收集资料,总结数组(包括一维数组和二维数组)作为函数参数时应注意的问题,以及参数传递的特点。 向函数传递数组时,只需使用不带方括号的的数组名作为函数实参调用即可(即: 仅仅用一个数组名,不带方括号和下标) 注意: 1、由于数组名代表数组第一个元素的地址,因此用数组名作为函数实参实际上是将数组的首地址传给被调函数 2、将数组的首地址传给被调函数后,形参与实参数组具有相同的首地址,实际上占用相同的存储空间 3、在被调函数中修改形参数组元素时,实际上相当于修改是参数组中的元素 4、数组作函数形参时,数组的长度可不出现在数组名的方括号内,通常用另一个整型实参来制定数组的长度 成绩 批阅教师 批阅日期
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 第八 课后 答案 剖析