c语言第七章课后题
- 格式:doc
- 大小:1.17 MB
- 文档页数:22
选择题1.已知:int *p, a;,则语句“p=&a;”中的运算符“&”的含义是( D )。
A.位与运算B.逻辑与运算C.取指针内容D.取变量地址2.已知:int a, x;,则正确的赋值语句是( C )。
A.a=(a[1]+a[2])/2; B.a*=*a+1; C.a=(x=1, x++, x+2); D.a="good"; 3.已知:int a, *p=&a;,则下列函数调用中错误的是( D )。
A.scanf("%d", &a); B.scanf("%d", p); C.printf("%d", a); D.scanf("%d", *p); 4.已知:char *p, *q;,选择正确的语句( C )。
A.p*=3; B.p/=q; C.p+=3; D.p+=q;5.已知:int x;,则下面的说明指针变量pb的语句( C )是正确的。
A.int pb=&x; B.int *pb=x; C.int *pb=&x; D.*pb=*x;一、选择题1.设有说明int (*ptr)[M];,其中的标识符ptr是( C )。
A.M个指向整型变量的指针B.指向M个整型变量的函数指针C.一个指向具有M列的二维数组的一行的指针D.具有M个指针元素的一维数组的指针2.已知:double *p[6];,它的含义是( C )。
A.p是指向double型变量的指针B.p是double型数组C.p是指针数组D.p是数组指针3.已知:char s[10], *p=s,则在下列语句中,错误的语句是( B )。
A.p=s+5; B.s=p+s; C.s[2]=p[4]; D.*p=s[0];4.已知:char s[100]; int i;,则在下列引用数组元素的语句中,错误的表示形式是( D )。
C语言程序设计教程第七章课后习题参考答案P198 3 求主、副对角线元素之和#include#define M 4#define N 4int main(){int a[M][N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; int i,j,m=0,n=0;for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{printf("%4d",a[i][j]);}printf("\n");}for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{if(i==j)m+=a[i][j];}}printf("主对角线元素之和为:%d\n",m);for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{if(i+j==3)n+=a[i][j];}}printf("副对角线元素之和为:%d\n",n); return 0;}P198 4数组逆序存放#includevoid input(int a[],int n);void reverse(int a[],int n);int main(){int a[5];int size=sizeof(a)/sizeof(int);input(a,size);reverse(a,size);printf("\n");return 0;}void input(int a[],int n){int i;printf("请输入%d个整数:\n",n);for(i=0;i<n;i++)< p="">{scanf("%d",&a[i]);}}void reverse(int a[],int n) {int i,t;for(i=0;i<="" p="">{t=a[i];a[i]=a[5-i-1];a[5-i-1]=t;}for(i=0;i<n;i++)< p=""> {printf("%-3d",a[i]);}}198 4数组逆序存放(2)#includevoid reverse(int a[],int n); void print(int a[],int n);int main(){int a[]={1,2,3,4,5,11,16,13}; int size=sizeof(a)/sizeof(int); print(a,size);reverse(a,size);printf("\n");return 0;}void print(int a[],int n){int i;printf("原:\n");for(i=0;i<n;i++)< p="">{printf("%-4d",a[i]);}printf("\n");}void reverse(int a[],int n){int t,i;printf("逆序:\n");for(i=0;i<="" p="">{t=a[i];a[i]=a[n-1-i];a[n-1-i]=t;}for(i=0;i<n;i++)< p="">{printf("%-4d",a[i]);}}P198 5对称矩阵#includevoid print(int a[][3],int rows,int cols); int fun(int a[][3],int rows,int clos); void main(){int a[3][3],i,j;printf("input:\n");for(i=0;i<3;i++){for(j=0;j<3;j++)scanf("%d",&a[i][j]);}print(a,3,3);if(fun(a,3,3)==0)printf("此矩阵是对称矩阵\n");elseprintf("此矩阵不是对称矩阵\n"); } void print(int a[][3],int rows,int cols) {int i,j;for(i=0;i<rows;i++)< p="">{for(j=0;j<cols;j++)< p="">printf("%-4d",a[i][j]);printf("\n");}}int fun(int a[][3],int rows,int clos) {int i,j,x=0;for(i=0;i<rows;i++)< p="">{for(j=0;j<clos;j++)< p="">{if(a[i][j]!=a[j][i]) x++;}}if(x>0) return 1;else return 0;}P198 5对称矩阵(2)#include#define M 3#define N 3void print(int a[][N],int m,int n); int yan(int a[][N],int m,int n); int main(){int a[][N]={1,2,3,4,5,6,7,8,9}; print(a,M,N);if(yan(a,M,N))printf("YES\n");elseprintf("NO\n");return 0;}void print(int a[][N],int m,int n) {int i,j;for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{printf("%-4d",a[i][j]);}printf("\n");}}int yan(int a[][N],int m,int n){int i,j,x=0;for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{if(a[i][j]!=a[j][i]) x++;}}if(x>0) //不是对称矩阵return 0;return 1;}P198 6矩阵求和#include#define M 3#define N 3void input(int a[][N],int m,int n);void sum(int a[][N],int b[][N],int m, int n); void print(int a[][N],int m,int n);int main(){int a[M][N];int b[M][N];printf("请输入%d*%d阶矩阵A:\n",M,N);input(a,M,N);print(a,M,N);printf("请输入%d*%d阶矩阵B:\n",M,N);input(b,M,N);print(b,M,N);printf("A+B=\n");sum(a,b,M,N);return 0;}void input(int a[][N],int m,int n){int i,j;for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{scanf("%d",&a[i][j]);}}}void print(int a[][N],int m,int n){int i,j;for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{printf("%4d",a[i][j]);}printf("\n");}}void sum(int a[][N],int b[][N],int m,int n) {int i,j;int c[M][N];for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{c[i][j]=a[i][j]+b[i][j];}}print(c,M,N);}P198 7模拟骰子投掷#include#include#define N 10000int main(){int a[N],i;double x=0,y=0,z=0,l=0,m=0,n=0; for(i=0;i<n;i++)< p="">{a[i]=rand()%6+1;if(a[i]==1)x++;if(a[i]==2)y++;if(a[i]==3)z++;if(a[i]==4)l++;if(a[i]==5)m++;if(a[i]==6)n++;}printf("出现1的概率为:%lf\n",x/N); printf("出现2的概率为:%lf\n",y/N); printf("出现3的概率为:%lf\n",z/N); printf("出现4的概率为:%lf\n",l/N); printf("出现5的概率为:%lf\n",m/N); printf("出现6的概率为:%lf\n",n/N); return 0;}P67 1最大奇、偶数#include#define M 10int main(){int i,a[M];int max1=-1,max2=-1;for(i=0;i<m;i++)< p="">{printf("请输入第%d个正整数:",i+1); scanf("%d",&a[i]);}for(i=0;i<m;i++)< p="">{if(a[i]%2!=0){if(a[i]>max1)max1=a[i];}else{if(a[i]>max2)max2=a[i];}}if(max1==-1)printf("没有奇数\n");elseprintf("最大奇数是%d\n",max1); if(max2==-1)printf("没有偶数\n");elseprintf("最大偶数是%d\n",max2); return 0;}P69 3#includeint main(){int a[20];int p=0,n=0,i,j=0;double avg,sum=0;printf("请输入非0整数:"); while(1){scanf("%d",&a[j]);if(a[j]==0)break;j++;}for(i=0;i<j;i++)< p="">{sum=sum+a[i];}avg=sum/j;printf("平均数:%lf",avg);for(i=0;i<j;i++)< p="">{if(a[i]>0)p++;if(a[i]<0)n++;}printf("正数个数:%d 负数个数:%d\n",p,n); return 0;}P75 2冒泡排序#include#define N 10void bubble_sort(int a[],int n);void main(){int i, a[N]={1,3,6,8,9,2,11,12,14,7}; printf("原数组为:\n");for(i=0;i<n;i++)< p="">{printf("%4d",a[i]);}bubble_sort(a,N);printf("\n");}void bubble_sort(int a[],int n) {int i,j,tmp;for(i=0;i<n-1;i++)< p=""> {for(j=0;j<n-i-1;j++)< p=""> {if(a[j]>a[j+1]){tmp=a[j];a[j]=a[j+1];a[j+1]=tmp;}}}printf("\n");printf("排序后的数组为:\n"); for(i=0;i<n;i++)< p=""> {printf("%4d",a[i]);}}P76 3 成绩#includevoid input(int cla[50][3],int n); void print(int cla[50][3],int n);void sort(int cla[50][3],int n);void main(){int cla[50][3];int n;printf("请输入学生人数(小于50):\n"); scanf("%d",&n);if(n<=0 || n>=50)printf("error,请输入正确的人数。
一、第七章习题7(p184-p187),7.1-7.7全做,7.8-7.12中选做两道,要求给出程序执行结果。
7-1、#include <stdio.h>int Square(int i){return i*i;}int main(){int i=0;i=Square(i);for(; i<3;i++){static int i=1;i+=Square(i);printf("%d,",i);}printf("%d\n",i);return 0;}结果:结果分析:开头定义square()函数功能:计算一个数的平方入口参数:整数x返回值:i*i主函数:i=0;进入循环:静态变量i=1;i=i+square(1)=2;输出2;循环变量i=0+1=1;}int main(){int i;second=0;for(i=0;i<1000000;i++){update(); /*利用循环控制时钟运行时间*/display(); /*显示时,分,秒*/delay(); /*模一尺时间为1秒*/ }return 0;}结果:自动跳出时间7-3、#include <stdio.h>/*max()函数功能:找两个数的最大值入口参数:两个整数a,b返回值:两数的最大值*/int max(int a, int b){int max=0;max = (a>b)?a:b;return max;}void main(){int x=0; /*输入的两个数x,y*/int y=0;int m=0; /*m用于接收max()函数的返回值*/printf("input two integer numbers:");scanf("%d,%d",&x,&y);m=max(x,y);printf("the max number is %d\n",m);}结果:7-4#include <stdio.h>/*LCM()函数功能:计算两个整数的最小公倍数入口参数:两整数a,b返回值:最小公倍数*/int LCM(int a,int b){int i=0; /*循环变量*/int min=0; /*循环寻找范围的最小值*/int max=0; /*循环寻找范围的最大值*/min = (a>b)?a:b; /*最小值为a,b中的最大值*/ max = a*b; /*最大值为a*b*/for (i=min; i<=max; i++){if(i%a==0 && i%b==0)return i;}}void main(){int x; /*键盘输入两整数x,y*/int y;int m; /*m用于接收LCM()函数的返回值*/do{ /*输入整数的合法数据*/ printf("输入两个正整数:");scanf("%d,%d",&x,&y);}while(x<0 || y<0);m = LCM(x,y);printf("最小公倍数为:%d\n",m);}结果:7-5、#include <stdio.h>long fact(int n);void main(){int i=0; /*循环变量*/int n=0; /*输入的值*/int m=0; /*接收fact()函数的返回值*/do{printf("input n:");scanf("%d",&n);}while(n<0);for(i=1; i<=n; i++){m=fact(i);printf("%d!=%ld\n",i,m);}}/*fact函数功能:计算n!入口参数:n返回值:n!*/long fact(int n){static long p=1;p=p*n;return p;}结果:7-6、#include <stdio.h>}结果:7-7、(1)穷举法:#include <stdio.h>int Gcd(int a,int b);void main(){int x=0; /*键盘键入两个数*/int y=0;int m=0; /*接收Gcd的返回值*/do{printf("输入两个正数:");scanf("%d,%d",&x,&y);}while(x<0 || y<0);m = Gcd(x,y);printf("最大公约数:%d\n",m); }/*Gcd()函数功能:计算两数的最大公约数入口参数:两个正数a,b返回值:最大公约数*/int Gcd(int a,int b){int i=0;int t=0;t=(a<b)?a:b; /*t为a,b中的较小者*/ for(i=t; i>=1; i--){if(a%i==0 && b%i==0)return i;}}结果:(2)欧几里得算法#include <stdio.h>int Gcd(int a,int b);void main(){int x=0; /*键盘键入两个数*/int y=0;int m=0; /*接收Gcd的返回值*/do{printf("输入两个正数:");scanf("%d,%d",&x,&y);}while(x<0 || y<0);m = Gcd(x,y);printf("最大公约数:%d\n",m); }/*Gcd()函数功能:计算两数的最大公约数入口参数:两个正数a,b返回值:最大公约数*/int Gcd(int a,int b){int r=0;r=a%b;if(r!=0){do{a=b;b=r;r=a%b;}while(r!=0);}return b;}结果:(3)递归方法:7-9、#include <stdio.h>/*old()函数功能:计算第i个人的年龄入口参数:人数i返回值:年龄*/int old(int i){if(i==1)return 10;elsereturn old(i-1)+2;}void main(){int x=5; /*人数为5*/int y=0; /*接收old()函数的返回值*/y=old(x);printf("第五个人的年龄为:%d\n",y);}结果:7-10、#include <stdio.h>void main(){int flag=0; /*设置标志变量*/if ((m+n+p+q+r)==sum){flag=1; /*一旦找到就退出循环*/break;}}if(flag==0) /*未找到说明计算错误*/{printf("你算错了!");}else{printf("你想的数是%d %d %d \n",a,b,c);}}结果:二、收集资料并整理,叙述结构化程序设计的基本思想;根据自己的编程,说说你对结构化程序设计的理解。
#include<stdio.h>main(){int a[10],n,sum=0,i;float ave;printf("enter n:\n");scanf("%d",&n);printf("enter %d ge zheng shu:\n",n);for(i=0;i<n;i++){scanf("%d",&a[i]);sum=sum+a[i];}ave=1.0*sum/n;printf("ave=%.2f\n",ave);}/*练习7-2*/#include<stdio.h>main(){int a[10],n,i;printf("enter n:\n");scanf("%d",&n);printf("enter %d ge zheng shu:\n",n);for(i=0;i<n;i++){printf("第%d个:\n",i+1);scanf("%d",&a[i]);printf("倒序:\n");while(a[i]!=0){printf("%d",a[i]%10);a[i]=a[i]/10;}printf("\n");}}#include<stdio.h>main(){int a[5],x,i,k=0;printf("enter 5 ge zheng shu:\n");for(i=0;i<5;i++)scanf("%d",&a[i]);printf("enter x:\n");scanf("%d",&x);for(i=0;i<5;i++)if(a[i]==x){printf("xia biao wei : %d\n",i);k=1;}if(k==0)printf("Not Found\n");}/*练习7-4*/#include<stdio.h>main(){int a[10],n,i,k=0,x,max;printf("enter n:\n");scanf("%d",&n);printf("enter %d ge zheng shu:\n",n);for(i=0;i<n;i++)scanf("%d",&a[i]);max=a[0];for(i=1;i<=n-1;i++)if(max<a[i]){max=a[i];k=i;}printf("max=%d xia biao=%d",max,k);x=a[n-1];a[n-1]=a[k];a[k]=x;printf("\n");for(i=0;i<n;i++)printf(" %d ",a[i]);printf("\n");}/*练习7-11*/#include<stdio.h>main(){char str[80];int i,j,count=0;printf("输入一个以回车符结束的字符串:\n");i=0;while((str[i]=getchar())!='\n')i++;str[i]='\0';printf("再输入一个字符:\n");str[80]=getchar();for(j=0;j<=i-1;j++)if(str[80]==str[j])count++;printf("%c字符在字符串中出现的次数为:%d\n",str[80],count);for(j=0;j<=i-1;j++)putchar(str[j]);printf("\n");}/*习题七1*/#include<stdio.h>main(){int x,y,n,a[10],i,min,max;printf("输入n:\n");scanf("%d",&n);printf("输入%d个整数:\n",n);for(i=0;i<n;i++)scanf("%d",&a[i]);min=0;for(i=1;i<n;i++)if(a[min]>a[i])min=i;max=0;for(i=1;i<n;i++)if(a[max]<a[i])max=i;x=a[min];a[min]=a[0];a[0]=x;y=a[max];a[max]=a[n-1];a[n-1]=y;for(i=0;i<n;i++)printf("%4d",a[i]);printf("\n");}/*习题七2*/#include<stdio.h>main(){int x,n,a[10],i,j,max;printf("输入n:\n");scanf("%d",&n);printf("输入%d个整数:\n",n);for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=1;i<n;i++){ max=i-1;for(j=i;j<n;j++)if(a[max]<a[j])max=j;x=a[max];a[max]=a[i-1];a[i-1]=x;}for(i=0;i<n;i++)printf("%4d",a[i]);printf("\n");}/*习题七4*/#include<stdio.h>main(){int m,n,a[6][6],i,j,b[6]={0};printf("输入m:\n");scanf("%d",&m);printf("输入n:\n");scanf("%d",&n);printf("输入%d和%d的矩阵:\n",m,n);for(i=0;i<m;i++){for(j=0;j<n;j++){scanf("%d",&a[i][j]);b[i]=b[i]+a[i][j];}}printf("shu chu:\n");for(i=0;i<m;i++){for(j=0;j<n;j++)printf(" %d",a[i][j]);printf("\n");}printf("shu chu hang he :\n");for(i=0;i<m;i++)printf("%4d",b[i]);printf("\n");}/*习题7.6*/#include<stdio.h>main(){char str[80];int i,j;printf("输入一个以回车符结束的字符串:\n");i=0;while((str[i]=getchar())!='\n')i++;printf("倒序输出:\n");for(j=i-1;j>=0;j--)putchar(str[j]);printf("\n");}/*新7.6*/#include<stdio.h>main(){int a[10],i,n;printf("输入整数n:\n");scanf("%d",&n);printf("输入%d个整数:\n",n);for(i=0;i<n;i++){scanf("%d",&a[i]);}printf("倒序输出:\n");for(i=0;i<n;i++){printf("%5d",a[n-1-i]);}printf("\n");}/*习题7.7*/#include<stdio.h>main(){char str[80];int i,j,count=0;printf("输入一个以回车符结束的字符串:\n");i=0;while((str[i]=getchar())!='\n')i++;printf("输出其中的大写辅音字母:\n");for(j=0;j<=i-1;j++)if(str[j]>='B'&&str[j]<='Z'&&str[j]!='E'&&str[j]!='I'&&str[j]!='O'&&str[j]!='U'){putchar(str[j]);count++;}printf("\n");printf("大写辅音字母数量为:%d\n",count);}/*习题7.8*/#include<stdio.h>main(){char str[80];int i,j,count=0;printf("输入一个以回车符结束的字符串:\n");i=0;while((str[i]=getchar())!='\n')i++;printf("输出相应交换后的字符串:\n");for(j=0;j<=i-1;j++)if(str[j]>='A'&&str[j]<='Z')str[j]=155-str[j];for(j=0;j<=i-1;j++)putchar(str[j]);printf("\n");}上文已完。
7-4 仔细阅读下例程序,给出程序的运行结果。
(1) main(){void fun1(),fun2() ; /*应该增加的函数声明语句*/fun1() ;printf("") ;fun2()}void fun1(){printf("COMPAQ") ;}void fun2(){printf("COMPUTER") ;}(2) main(){void fun() ;/*应该增加的函数声明语句*/int i ;for(i=1;i<=10;i++)fun();}void fun(){static int a=100;int b=1 ;++b ;printf("%d+%d=%d\n",a,b,a+b);a+=1 ;}(3)static int a=10;main(){int a=100;void fun1() ,fun() ;/*应该增加的函数声明语句*/fun1();fun2();printf("a=%d\n",a);}void fun1(){a-=a/2;printf("a=%d\n",a);}void fun2(){int a=100;a*=a;printf("a=%d\n",a);}(4)main(){int add(int,int); /*应该增加的函数声明语句*/extern int x,y ;printf("%d",add(x,y));}int x=20,y=5;add(a,b)int a,b;{int s ;s=a+b;return(s) ;}(5)void f(n)int n ;{int x=5;static int y=10;if(n>0){++x ;++y;printf("x=%d,y=%d",x,y) ;}}main(){int m=1;f(m) ;}答:(1)由于fun1()函数定义在main()函数的调用后面,故在main()中应该增加函数声明函数的语句“void fun1(),fun2();”。
C语言课后练习题答案第七章作业六:循环结构程序设计(一)(一)选择题(50分)1.设有程序段int k=10;while(k=0)k=k-1;这下面描述中正确的是_c_。
a)while循环执行10次 b)循环是无限循环c)循环体语句一次也不执行 d)循环体语句执行一次(重要) 2.语句while(!E);中的表达式!E等价于_a_。
a)E==0 b)E!=1 c)E!=0 d)E==1while(!e)表明!e==true,因此e==false,也就是e==03.下面程序段的运行结果是_c_。
int n=0;while(n++<=2);printf("%d",n);a)2 b)3 c)4 d)有语法错n=0,n++是先用0去和2比,然后再加1,n变成1。
n=1,n++<=2,1<=2成立,n+1变成2n=2,n++<=2,2<=2成立,n+1变成3n=3,n++<=2,3<=2不成立,n+1变成4,循环结束4.下面程序的运行结果是_c_。
#includemain(){int num=0;while(num<=2){num++;printf("%d\n",num);}}a)1 b)1 c)1 d)12 2 23 345.以下程序段_c_。
x=-1;do{x=x*x;}while(!x);a)是死循环 b)循环执行二次c)循环执行一次 d)有语法错误(二)填空题(30分)1.下面程序段是从键盘输入的字符中统计数字字符的个数,用换行符结束循环。
请填空。
main(){int n=0,c;c=getchar();while(c!=’\n’){if(c>=’0’&&c<=’9’) n++;c=getchar();}printf(“%d\n”,n);}2.下面程序的功能是用"辗转相除法"求两个正整数的最大公约数。
C语言程序设计第四版第七章答案-谭浩强第七章函数7.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。
maxyueshu(m,n)int m,n;{ int i=1,t;for(;i<=m&&i<=n;i++){if(m%i==0&&n%i==0)t=i;}return(t);}minbeishu(m,n)int m,n;{int j;if(m>=n) j=m;else j=n;for(;!(j%m==0&&j%n==0);j++);return j;}main()整数,输出是否是素数的消息。
psushu(m)int m;{int i=2,t;for(;i<=m;i++)if(m%i==0&&i<m) break;if(m-i==0) t=1;else t=0;return m;}main(){int a,s;printf("enter sushu is \n");scanf("%d",&a);s=psushu(a);if(s==1) printf("a is sushu\n");else printf("s is not sushu\n");}7.4写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。
int zhuangzhi(b)int b[3][3];{int i,j,t;for(i=0;i<3;i++)for(j=0;j>=i&&j<3-i;j++){t=b[i][j];b[i][j]=b[j][i];b[j][i]=t;}}main(){int a[3][3];int i,j;for(i=0;i<3;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);for(i=0;i<3;i++){for(j=0;j<3;j++)printf(" %d",a[i][j]);printf("\n");}zhuangzhi(a);for(i=0;i<3;i++){for(j=0;j<3;j++)printf(" %d",a[i][j]);printf("\n");}}7.5写一函数,使输入的一个字符串按反序存放,在主函数中输入输出字符串。
一、第七章习题7(p184-p187),7.1-7.7全做,7.8-7.12中选做两道,要求给出程序执行结果。
7-1 、#include <stdio.h>int Square(int i){return i*i;}int main(){int i=0;i=Square(i);for(; i<3;i++){static int i=1;i+=Square(i);printf("%d,",i);}printf("%d\n",i);return 0;}结果:结果分析:开头定义square()函数功能:计算一个数的平方入口参数:整数x返回值: i*i主函数: i=0; 进入循环:静态变量i=1 ;i=i+square ( 1) =2;输出2;循环变量i=0+1=1;i=1<3成立静态变量i=i+square (2) =2+4=6 ;输出6;循环变量i=i+1=2;I=2<3 成立静态变量( i 保持原值) i=6 ;i=i+square ( 6) =6+36=42 ;输出 42;循环变量i=i+1=3 ;I=3<3 不成立退出循环输出循环变量i=37-2 、#include <stdio.h>int hour,minute,second; /* 定义全局变量 */ voidupdate(){second ++;if(second == 60){second=0;minute++;}if(minute==60){minute=0 ;hour++;}if(hour==24)hour=0;}void display(){printf(" %d : %d : %d\n ",hour,minute,second);}void delay(){int t;for (t=0;t<100000000;t++); /*用循环体为空语句的循环实现延时*/}int main(){int i;second=0;for(i=0;i<1000000;i++){update(); /*利用循环控制时钟运行时间*/display(); /*显示时,分,秒*/delay(); /*模一尺时间为1秒*/ }return 0;}结果:自动跳出时间7-3 、#include <stdio.h>/*max() 函数功能:找两个数的最大值入口参数:两个整数a,b返回值:两数的最大值*/int max(int a, int b){int max=0;max = (a>b)?a:b;return max;}void main(){int x=0; /*输入的两个数x,y*/int y=0;int m=0; /*m用于接收max()函数的返回值*/printf("input two integer numbers:");scanf("%d,%d",&x,&y);m=max(x,y);printf("the max number is %d\n",m);}结果:7-4#include <stdio.h>/*LCM() 函数功能:计算两个整数的最小公倍数入口参数:两整数a, b返回值:最小公倍数*/int LCM(int a,int b){int i=0; /*循环变量*/int min=0; /*循环寻找范围的最小值*/int max=0; /*循环寻找范围的最大值*/min = (a>b)?a:b; /*最小值为a,b中的最大值*/ max = a*b;/*最大值为a*b*/for (i=min; i<=max; i++){if(i%a==0 && i%b==0)return i;}}void main(){int x; /*键盘输入两整数x,y*/int y;int m; /*m用于接收LCM()函数的返回值*/do{/*输入整数的合法数据*/ printf(" 输入两个正整数: ");scanf("%d,%d",&x,&y);}while(x<0 || y<0);m = LCM(x,y);printf(" 最小公倍数为: %d\n",m);}结果:7-5、#include <stdio.h>long fact(int n);void main(){int i=0; /* 循环变量*/int n=0; /* 输入的值*/int m=0; /* 接收 fact()函数的返回值*/do{printf("input n:");scanf("%d",&n);}while(n<0);for(i=1; i<=n; i++){m=fact(i);printf("%d!=%ld\n",i,m);}}/*fact 函数功能:计算 n!入口参数:n返回值:n!*/long fact(int n){static long p=1;p=p*n;return p;}结果:7-6、#include <stdio.h>long fact(int n);void main(){int i=0; /* 循环变量*/int n=0; /* 输入的值*/int m=0; /* 接收 fact()函数的返回值*/long s=0; /*所求最终结果*/do{printf("input n:");scanf("%d",&n);}while(n<0);for(i=1; i<=n; i++){m=fact(i);s=s+m;}printf("1!+2!+...+n! = %ld\n",s);}/*fact 函数功能:计算 n!入口参数:n返回值:n!*/long fact(int n){static long p=1;p=p*n;return p;}结果:7-7、(1)穷举法:#include <stdio.h>int Gcd(int a,int b);void main(){int x=0; /* 键盘键入两个数 */int y=0;int m=0; /* 接收 Gcd 的返回值*/do{printf(" 输入两个正数 :");scanf("%d,%d",&x,&y);}while(x<0 || y<0);m = Gcd(x,y);printf(" 最大公约数:%d\n",m); }/*Gcd() 函数功能:计算两数的最大公约数入口参数:两个正数 a, b返回值:最大公约数*/int Gcd(int a,int b){int i=0;int t=0;t=(a<b)?a:b; /*t 为 a,b 中的较小者 */ for(i=t; i>=1; i--){if(a%i==0 && b%i==0)return i;}}结果:( 2)欧几里得算法#include <stdio.h>int Gcd(int a,int b);void main(){int x=0; /* 键盘键入两个数 */int y=0;int m=0; /* 接收 Gcd 的返回值*/do{printf(" 输入两个正数 :");scanf("%d,%d",&x,&y);}while(x<0 || y<0);m = Gcd(x,y);printf(" 最大公约数:%d\n",m); }/*Gcd() 函数功能:计算两数的最大公约数入口参数:两个正数 a, b返回值:最大公约数*/int Gcd(int a,int b){int r=0;r=a%b;if(r!=0){do{a=b;b=r;r=a%b;}while(r!=0);}return b;}结果:(3)递归方法:#include <stdio.h>int Gcd(int a,int b);void main(){int x=0; /*键盘键入两个数*/int y=0;int m=0; /* 接收 Gcd 的返回值 */do{printf(" 输入两个正数:");scanf("%d,%d",&x,&y);}while(x<0 || y<0);m = Gcd(x,y);printf(" 最大公约数: %d\n",m); }/*Gcd() 函数功能:计算两数的最大公约数入口参数:两个正数a, b返回值:最大公约数*/int Gcd(int a,int b){if (a==b)/* 递归出口 */return a;else{if(a>b)return Gcd(a-b,b);elsereturn Gcd(b,b-a);}}结果:7-9、#include <stdio.h>/*old() 函数功能:计算第i 个人的年龄入口参数:人数i返回值:年龄*/int old(int i){if(i==1)return 10;elsereturn old(i-1)+2;}void main(){int x=5;/* 人数为 5*/int y=0; /* 接收 old()函数的返回值*/y=old(x);printf(" 第五个人的年龄为:%d\n",y);}结果:7-10、#include <stdio.h>void main(){int flag=0; /* 设置标志变量*/int a=0;/* 百位 */int b=0;/* 十位 */int c=0;/* 个位*/int m=0;/* 代表 acb*/int n=0;/* 代表 bac*/int p=0;/* 代表 bca*/int q=0;/* 代表 cab*/int r=0;/* 代表 cba*/int i=0;/* 从 100~999 中找 abc*/ int sum=0; /* 观众计算得结果*/printf(" 说出你的计算结果: "); scanf("%d",&sum);for(i=100;i<=999;i++){a=i/100;b=i/10%10;c=i%10;m=a*100+c*10+b;n=b*100+a*10+c;p=b*100+c*10+a;q=c*100+a*10+b;r=c*100+b*10+a;if ((m+n+p+q+r)==sum){flag=1;/* 一旦找到就退出循环*/break;}}if(flag==0)/* 未找到说明计算错误 */{printf(" 你算错了!");}else{printf(" 你想的数是 %d %d %d \n",a,b,c);}}结果:二、收集资料并整理,叙述结构化程序设计的基本思想;根据自己的编程,说说你对结构化程序设计的理解。
一、第七章习题7(p184-p187),全做,中选做两道,要求给出程序执行结果。
7-1、
#include <>
int Square(int i)
{
return i*i;
}
int main()
{
int i=0;
i=Square(i);
for(; i<3;i++)
{
static int i=1;
i+=Square(i);
printf("%d,",i);
}
printf("%d\n",i);
return 0;
}
结果:
int t;
for (t=0;t<0;t++); /*用循环体为空语句的循环实现延时*/ }
int main()
{
int i;
second=0;
for(i=0;i<1000000;i++)
{
update(); /*利用循环控制时钟运行时间*/
display(); /*显示时,分,秒*/
delay(); /*模一尺时间为1秒*/
}
return 0;
}
结果:
自动跳出时间
7-3、
#include <>
/*max()函数
功能:找两个数的最大值
入口参数:两个整数a,b
返回值:两数的最大值
*/
int max(int a, int b)
{
int max=0;
max = (a>b)a:b;
return max;
}
void main()
{
int x=0; /*输入的两个数x,y*/
int y=0;
int m=0; /*m用于接收max()函数的返回值*/
printf("input two integer numbers:");
scanf("%d,%d",&x,&y);
m=max(x,y);
printf("the max number is %d\n",m);
}
结果:
7-4
#include <>
/*LCM()函数
功能:计算两个整数的最小公倍数
入口参数:两整数a,b
返回值:最小公倍数
*/
int LCM(int a,int b)
{
int i=0; /*循环变量*/
int min=0; /*循环寻找范围的最小值*/
int max=0; /*循环寻找范围的最大值*/
min = (a>b)a:b; /*最小值为a,b中的最大值*/
7-5、
#include <>
long fact(int n);
void main()
{
int i=0; /*循环变量*/
int n=0; /*输入的值*/
int m=0; /*接收fact()函数的返回值*/
do{
printf("input n:");
scanf("%d",&n);
}while(n<0);
for(i=1; i<=n; i++)
{
m=fact(i);
printf("%d!=%ld\n",i,m);
}
}
/*fact函数
功能:计算n!
入口参数:n
返回值:n!
*/
long fact(int n)
{
static long p=1;
p=p*n;
return p;
}
结果:
7-6、
#include <>
long fact(int n);
void main()
{
int i=0; /*循环变量*/
int n=0; /*输入的值*/
int m=0; /*接收fact()函数的返回值*/ long s=0; /*所求最终结果*/
7-7、
(1)穷举法:
#include <>
int Gcd(int a,int b);
void main()
{
int x=0; /*键盘键入两个数*/
int y=0;
int m=0; /*接收Gcd的返回值*/
do{
printf("输入两个正数:");
scanf("%d,%d",&x,&y);
}while(x<0 || y<0);
m = Gcd(x,y);
printf("最大公约数:%d\n",m); }
/*Gcd()函数
功能:计算两数的最大公约数
入口参数:两个正数a,b
返回值:最大公约数
*/
int Gcd(int a,int b)
{
int i=0;
int t=0;
t=(a<b)a:b; /*t为a,b中的较小者*/
for(i=t; i>=1; i--)
{
if(a%i==0 && b%i==0)
return i;
}
}
结果:
(2)欧几里得算法
#include <>
int Gcd(int a,int b);
void main()
{
do{
a=b;
b=r;
r=a%b;
}while(r!=0);
}
return b;
}
结果:
(3)递归方法:
#include <>
int Gcd(int a,int b);
void main()
{
int x=0; /*键盘键入两个数*/
int y=0;
int m=0; /*接收Gcd的返回值*/
do{
printf("输入两个正数:");
7-9、
#include <>
/*old()函数
功能:计算第i个人的年龄
入口参数:人数i
返回值:年龄
*/
int old(int i)
{
if(i==1)
return 10;
else
return old(i-1)+2;
}
void main()
{
int x=5; /*人数为5*/
int y=0; /*接收old()函数的返回值*/
y=old(x);
printf("第五个人的年龄为:%d\n",y);
}
结果:
7-10、
#include <>
void main()
{
int flag=0; /*设置标志变量*/
int a=0; /*百位*/
int b=0; /*十位*/
int c=0; /*个位*/
int m=0; /*代表acb*/
int n=0; /*代表bac*/
int p=0; /*代表bca*/
int q=0; /*代表cab*/
int r=0; /*代表cba*/
int i=0; /*从100~999中找abc*/
int sum=0; /*观众计算得结果*/
printf("说出你的计算结果:");
scanf("%d",&sum);
二、收集资料并整理,叙述结构化程序设计的基本思想;根据自己的编程,说说你对结构化程序设计的理解。
模块化程序设计:
1、定义:将系统划分为若干个子系统,任务划分为若干个子任务,本质思想就是实现不同
层次的数据或过程的抽象过程。
2、模块分解的基本原则
(1)、保证模块的相对独立性——高聚合、低耦合。
高聚合:模块内部的联系越紧密越好,就是使模块的功能要相对独立和单一。
低耦合:模块之间的联系越松越好,就是使模块之间的接口越简单越好。
(2)、模块的实现细节对外不可见——信息隐藏。
外部:关心做什么;内部:关心怎么做。
实质:把不需要调用者知道的信息都封装在模块内部,是模块的实现细节对
外不可见。
3、设计好模块接口
(1)、接口指罗列出一个模块的所有的与外部打交道的变量等
(2)、定义好后不要轻易改动。
(3)、在模块开头(文件的开头)进行函数声明。
4、结构化程序设计思想:
(1)、逐步求精:将一个完整的、较复杂的问题分解成若干个相对独立的、较为简单的子问题,若这些子问题还较为复杂可再分解它们,直到能够容易的用某种高级语言表达
为止。