一、第八章习题8(p222-p228),8.1-8.3全做,8.4-8.12中选做四道,8.13-8.19中选做三道,要求给出所选择题目的程序及执行结果。 8-1(1)、 #include <stdio.h> void Func(int x) { x=20; } int main() { int x=10; Func(x); 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() { static int a[] = {5,6,7,8},i; Func(a); for(i=0; i<4; i++) { printf("%d",a[i]); } return 0; } 结果: 分析:数组传递时向函数传递的是数组的地址值,实参与形参共享空间,在被调函数中对数组进行修改就会造成主函数中的数组也被修改。 8.2(1) int PositiveNum(int a[],int n) { int i,count=0; for(i=0; i<n; i++) { if(a[i]>0) count++; } return count; } (2) void Fib(long f[],int n) { int i; f[0]=0; f[1]=1; for(i=2; i<n; i++) { f[i]=f[i-1]+f[i-2]; } } (3) #include <stdio.h> int main() { int a[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; } else if(a[n]<min) { min=a[n]; minPos=n; } } printf("max=%d,pos=%d\n",max,maxPos); printf("min=%d,pos=%d\n",min,minPos); return 0; } 结果: (4) #include <stdio.h> #define ROW 2 #define COL 3 MultiplyMatrix(int a[ROW][COL],int b[COL][ROW],int c[ROW][ROW]) { int i,j,k; for(i=0; i<ROW; i++) { for(j=0; j<ROW; j++) { c[i][j]=0; for(k=0; k<COL; k++) { c[i][j]=c[i][j]+a[i][k]*b[k][j]; } } } } void PrintMatrix(int a[ROW][ROW]) { int i,j; for(i=0; i<ROW; i++) { 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++) { for(j=0; j<COL; j++) { scanf("%d",&a[i][j]); } } printf("Input 3*2 matrix b:\n"); for(i=0; i<COL; i++) { for(j=0; j<ROW; j++) { scanf("%d",&b[i][j]); } } MultiplyMatrix(a,b,c); printf("Results:\n"); PrintMatrix(c); return 0; } 结果: 8-3、 viod DivArray(int pArray[],int n) { int i; for (i=0; i<n; i++) { pArray[i]/=pArray[0]; } } 错误分析:原代码中定义了一个未初始化的指针,而不是数组,有可能会使指针访问到不该访问的内存空间,造成危险,应该定义数组,对数组中的数进行修改操作。 8-6、 #include <stdio.h> #define N 40 int Readscore(int score[], long num[]); int FindMax(int score[],long num[],int n); void main() { int score[N]; long num[N]; int n; int m; n=Readscore(score,num); /*接收人数*/ m=FindMax(score,num,n); printf("最高的成绩:%d\n学号为:%ld\n",score[m],num[m]); } int Readscore(int score[], long num[]) { int i=-1; do{ i++; printf("请输入学号:"); scanf("%ld",&num[i]); printf("请输入成绩:"); scanf("%d",&score[i]); }while(score[i]>=0 && num[i]>=0); return i; } int FindMax(int score[],long num[],int n) { int i; int k; int max=score[0]; for(i=0; i<n; i++) { if(score[i]>max) { max=score[i]; k=i; } } return k; } 结果: 8-7 #include <stdio.h> void Sort(int score[]); void Readscore(int score[]); void main() { int score[10]; Readscore(score); Sort(score); } void Readscore(int score[]) { int i; for(i=0; i<10; i++) { printf("input score: "); scanf("%d",&score[i]); } } void Sort(int score[]) { int i; int k,p; int temp; int max=score[0]; int min=score[0]; for(i=0; i<10; i++) { if(score[i]>max) { max=score[i]; k=i; } else if(score[i]<min) { 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 <stdio.h> void main() { int i; int n; int j; int a[10][10]; int sum1=0; int sum2=0; printf("请输入维数n (n<=10): "); scanf("%d",&n); for(i=0; i<n; i++) { for(j=0; j<n; j++) { printf("请输入元素a[%d][%d]:",i,j); scanf("%d",&a[i][j]); } printf("\n"); } for(i=0; i<n; i++) { sum1+=a[i][i]; sum2+=a[i][n-1-i]; } printf("主对角线之和:%d\n副对角线之和:%d\n",sum1,sum2); } 结果: 8-12 #include <stdio.h> void main() { int a[7][7]; int i; int j; 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<i; 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 <stdio.h> void main() { int a[7][7]; int i; int j; for(i=0; i<7; i++)printf函数括号内参数的构成解说 { a[i][i]=1; a[i][0]=1; } for(i=2; i<7; i++) { for(j=1; j<i; 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 <stdio.h> long Fibonacci(int n); void main() { long m; m=Fibonacci(12); printf("%ld\n",m); } long Fibonacci(int n) { if(n==0) return 0; else if(n==1) return 1; else return Fibonacci(n-1)+Fibonacci(n-2); } 结果 8-14 #include <stdio.h> #include <stdlib.h> #include <time.h> void main() { float a=0,b=0,c=0,d=0,e=0,f=0; 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; case 4: d++; break; case 5: e++; break; case 6: 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 <stdio.h> #include <stdlib.h> #include <time.h> void ProduceNum(int num[]); void GuessNum(int guess[]); void PanZhengWu(int num[], int guess[], int result[]); void main() { int num[4]; int guess[4]; int result[2]; int i; int n; int flag=0; ProduceNum(num); printf("请输入您想猜的次数: "); scanf("%d",&n); for(i=0; i<n; i++) { GuessNum(guess); PanZhengWu(num, guess, result); if(result[0]==4) { printf("Congradulations!\n"); flag=1; break; } } if(flag==0) { printf("Sorry! You haven't guess the right number!\n"); } } /*功能:产生4位相异的数字放入num【4】中 入口参数:无 返回值:无 */ void ProduceNum(int num[]) { int flag=0; int i,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】中 入口参数:无 返回值:无 */ void GuessNum(int guess[]) { int i; printf("\n"); printf("请输入4位您猜的数:\n"); for(i=0; i<4; i++) { printf("输入第 %d 个数: ",i+1); scanf("%d",&guess[i]); } } /*功能:判断猜数正误 入口参数:计算机产生的数、用户猜的数 返回值:无 */ void PanZhengWu(int num[], int guess[], int result[]) { int i; int x=0; int y=0; int j; 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、数组作函数形参时,数组的长度可不出现在数组名的方括号内,通常用另一个整型实参来制定数组的长度 | |||||
成绩 | 批阅教师 | 批阅日期 | |||
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论