c程序设计 谭浩强 第5章
C程序设计(第四版)_谭浩强_第五章_课后习题答案
循环结构程序设计P115 5.1 用while计算1至100的合.#include<stdio.h>int main(){int i=1,sum=0;while(i<=100) //对于需要运算的值,要么在运算前可以赋值,要么一开始要指定.{sum=sum+i;i++;}printf("The sum is %d .\n",sum);return 0;}#include<stdio.h>int main(){int i=1,sum=0;do// do-while可以做的事,用while都可以做到.{ //do-while先做一次执行,再判断条件,而while却是先做一个条件,再执行.sum=sum+i;i++;}while(i<=100);printf("The sum is %d .\n",sum);return 0;}P118 5.3 比较do-while与while的差别.#include<stdio.h>{int i,sum=0;printf("Please input a number :");scanf("%d",&i); //输入10以内,正常,11的话,则sum仍然是0.while(i<=10){sum=sum+i;i++;}printf("The sum of 1-10 is %d .\n",sum);return 0;}#include<stdio.h>int main(){int i,sum=0;printf("Please input a number :");scanf("%d",&i); //输入10以内,结果一样.输入11的话,先做操作,所以sum=11.do{sum=sum+i;i++;}while(i<=10); //此重点在于理解二者的差别.printf("The sum of 1-10 is %d .\n",sum);return 0;}#include<stdio.h>int main(){int i,b=0,a,c;for(i=0;i<=1000;i++){printf("Please input amount :"); //循环体内套有输出语句以及跳出语句.scanf("%d",&a);b=b+a;if(b>=100)break; //break是用于跳出循环,对if无效,对while for switch 这一类.}}c=b/i;printf("conut is %d , aver is %d ",i+1,c); //注意%号后的形式,否则可能输出错误.return 0;}P127 5.5 continue的例子.#include<stdio.h>int main(){int i;for(i=1;i<20;i++){if(i%3!=0){continue; //跳过本次I,执行下一个i.}printf("%d ",i);}printf("\n");return 0;}P128 5.6 形成一个4*5的矩阵.#include<stdio.h>int main(){int i,j,a=0; //没有给初值,会出现警告: 使用了未初始化的局部变量“a”.for(i=1;i<=4;i++){for(j=1;j<=5;j++,a++) // a用来控制换行.{if(a%5==0){printf("\n");}printf("%d\t",i*j);}}printf("\n");return 0;}P131 5.7 用一个交错的式子求哌的近似值.#include<stdio.h>#include<math.h>int main() //四分之哌等于(1)-(1/3)+(1/5)-(1/7)+(1/9)-(1/11).{float s=1,n=1,m,sum=0,t;for(m=1;;m=m+2) //不确定哪项才会小于等于十的负六次方,所以不指定,无限下去.{ //不指定第二项,执行语句中应该有控制跳出的句子,否则死循环.t=(s)*(n/m); //这是第一项,s是符号,if(fabs(t)<=1e-6) //应该写在这里,题目要求这一项不累加进去.{break;}sum=sum+t; //因为累加项在这里,所以,一旦跳出就不会累加进来了.s=s*(-1); //变号一次.}printf("四分之一哌的值是%f.\n",sum);printf("一个完整哌的值是%f.\n",sum*4);return 0;}//下面这段小代码用来验证关于数值型数据类型的关系.去掉注释,可运行.//如果出现类似值为全1或是全零的话,一般可以考虑数据类型赋值或是定义错了的问题.//#include <stdio.h> //这是关于int float double三者关复杂关系的,乱啊,如果看不懂,可以通过实验自己明白来.////int main() //在C语言中,1.0认为是实数,即是double型,所以,如果你把它用float输出的话,会有警告:警告 1 warning C4305: “=”: 从“double”到“float”截断.//{// float m,a,b,c; //一旦定义了是这种类型的话,输出或是赋值的时候只能扩展不能截断,意思就是能变成double型,不能变成int型啦.而且后面的赋值会跟着它变成相应的类型.比如下面的m=1,其实得到的是m=1.0.// int d,e,f;// m=1;// a=1.0/3;// b=1/3;// c=m/3;// d=1.0;// e=1/4;// f=1.0/4;// printf("%lf(float用double的%lf来输出是可以的.)\n%f\n%f\n%f\n",m,a,b,c); //不管上面定义什么,这边写的输出类型是什么,就按相应的类型输出,有可能会出错,所以建议按定义的类型来输出.当然扩展的是不会错的,截断的是会错的,比如float可以用%lf来输出,而不能用%d来输出.// printf("%d\n%d\n%d\n",d,e,f); //但是,不相应的int型不可以用%f来输出的.因为int float就不同种类,一个是整数,一个是小数,float double同样是有小数点的!!!!// return 0;//}P133 5.8 著名的Fibonacci(费波那契数列问题)#include<stdio.h>int main() //这个就是著名的Fibonacci(费波那契数列问题){int f1=1,f2=1,f3,i;printf("%12d\n%12d\n",f1,f2);for(i=1;i<=38;i++) //注意,这是个基础问题,(i=1;i<=5;i++)这里其实进行了次运算,因为有f1,f2,要求有个,所以要有个.要么写<=38,要么写<39,边界问题一定要注意,不可以太随意!!!!{f3=f1+f2;printf("%12d\n",f3); //这个问题同样适用于"一对兔子一个月生一对"的问题.,f1=f2; //f1=f1+f2;此时它们各是,所以,现在的f1是.f2=f3; //f2=f2+f1;此时的f1已经是最先二者之和了.可以不用到f3.}return 0;}#include<stdio.h>#include<math.h>int main(){double num;int i;printf("Please input a number :");scanf("%lf",&num); //因为sqrt要求是浮点型,那就给它浮点型,需要时再强制转换.for(i=2;i<=sqrt(num);i++) //这边是<=号没错.{if((int)num%i==0) //如果在这期间有任何一个可以为零的话,则不是素数.{break; //当然跳出.}} //执行到这里的时候,i=5,已经变成了!!if(i<=sqrt(num)){printf("Not %d",(int)num);}else//如上所述,i=5,超出了求根的值,所以是素数.{printf("Yes %d",(int)num);}return 0;}#include<stdio.h>//不解释,HOHO>>>>...#include<math.h>int main(){double j;int i,k=0;for(j=100;j<=200;j++){for(i=2;i<=sqrt(j);i++){if((int)j%i==0){break;}}k=k+1; //这里是布局的开头.学习一下,有助逻辑.if(i<=sqrt(j)){printf("Not %d ",(int)j);if(k%5==0) //5个换一次行.{printf("\n");}}else{printf("Yes %d ",(int)j);if(k%5==0){printf("\n");}}}return 0;}P139 5.11 密码转换.#include<stdio.h>int main(){char c;c=getchar();while(c!='\n') //这也可以用数组来实现.{if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){if((c>='w'&&c<='z')||(c>='W'&&c<='Z')){c=c-22;}else{c=c+4;}printf("%c",c);c=getchar(); //套在循环里,依次得到字母,而while中判断回车为结束.}}printf("\n"); //这是布局问题.return 0;}P140 0.3 最大公约数和最小公倍数.#include<stdio.h>//最大公约数用累除法,除到无余数时的被除数是最大公约数.main (){int m, n, c, d;int gcd(); //这是最大公约数的缩写,此处调用函数,可以不写里面的实参.int lcm(); //这是最小公倍数的缩写,此处调用函数,可以不写里面的实参.printf("Please input two number :\n");scanf("%d %d",&m,&n);c=gcd(m,n); //c获取最大公约数d=lcm(m,n); //d获取最小公倍数printf("The GCD of %d and %d is : %d !\n", m, n, c);printf("The LCM of %d and %d is : %d !\n", m, n, d);return 0;}int gcd(int x, int y) //最大公约数Greatest Common Divisor{int temp;while(x%y!=0){temp=y; //y在下一轮中作为除数,即是下一轮中的X,所以先闪一边去.y=x%y; //x,y的余数作为下一轮中的Y,由x%y来取得.x=temp; //刚才temp中存储了y的值,现在拿出来作为下一轮中的X使用.}return y; //这是每一轮中的被除数,按原理来,这就是最大公约数,即累除法的原理. }int lcm(int x, int y) //最小公倍数Lowest Common Multiple{int i, temp;if(x<y) //此段代码结果是保证二者大的数在X上,小的数在Y上.即小于号降序.{ //以下为经典三行码,实现两个数的互换.temp=x;x=y;y=temp;}for(i=1; i<=y; i++) //设定一个区间,从1至大的数之间的循环.{if(!((x*i)%y)) //此式子如有余数,加上"!"号,会是假,则不返回,进行下一轮.{ //如此往复,直到取模无余数,那么小的数X乘以区间当前的I值,就是最小公倍数.return x*i;}}}P140 0.4 判断一串输入的字符.#include<stdio.h>int main(){char ch;int a=0,b=0,c=0,d=0,e=0;printf("Please input the string\n");while((ch=getchar())!='\n') //直到回车.{if(ch<='z'&&ch>='a'){a++;}else if(ch==' '){c++;}else if(ch<58&&ch>47){d++;}else if(ch<='Z'&&ch>='A'){b++;}else{e++;}}printf("大写%d 小写%d 空格%d 数字%d 其它%d\n",a,b,c,d,e);}#include<stdio.h>//不理解时可以百度或是谷歌更多的信息.int main() //想办法既快速做完,又要消化理解!!!{int temp,i,a,n,sum=0; //主逻辑,友好性暂时放松.scanf("%d %d",&a,&n); //a是数字,n是要乘的个数.temp=a; //先把第一阶的值存起来.for(i=0;i<n;i++){sum=sum+a;printf("%d + ",a); //事关布局.a=a*10+temp; //重点是每次乘,然后加上上一个数.}printf("= %d .",sum);return 0;}P140 0.6 1!+2!+3!+4!.....的值. #include<stdio.h>int main() //1!+2!+3!+4!.....{int i,j,k,sum=0,m=1;scanf("%d",&k); //比如设定为,值为.for(i=1;i<=k;i++) //第一层循环,指定到.{for(j=1;j<=i;j++) //第二层循环,指定至当前数.{m=m*j;} //到此是阶乘的结构.sum=sum+m;m=1;}printf("%d",sum); //完全不理解时,搜索并参考.return 0; //尝试自己做,第一次做出来就是自己的东西了. }#include<stdio.h>int main(){int a,b;double c,asum=0,bsum=0,csum=0;for(a=1;a<=100;a++) //三个块分别注释验证结果.{asum=asum+a;}for(b=1;b<=50;b++) //在VS运行中,注意*.cpp为C++语言.{bsum=bsum+b*b; //为了避免语言差别,请注意文件名为*.c.}for(c=1;c<=10;c++) //c作浮点运算,所以定义在double类型中.{csum=csum+1/c;}printf("%lf",asum+bsum+csum);return 0;}PP#include<stdio.h>#include<math.h>int main(){int j,k,s[6],x=100,y,sum=0;for(j=153;j<=154;j++){for(k=2;k>=0;k--){s[k]=j%(int)pow(10,k+1)/(int)pow(10,k);y=pow(s[k],3);sum+=y;printf("%d-%d--%d\t",k,s[k],j);}printf("%d\n",sum);}return 0;}P140 0.8 水仙花数.//#include <stdio.h> //一步步的发现问题.////int main() //在%和/号之间,以前pow.以后再做.//{// int i,j,k,a,b,c,sum=0; //这里逻辑对,算出来却错了.// for(i=2;i<=4;i++) //计算机在想什么,看来它的大脑难以模拟.// {// for(j=pow(10,i);j<=pow(10,i+1)-1;j++) //我不完全明白它遵守的逻辑. // {// for(k=0;k<=i;k++)// {// sum+=pow((j%pow(10,i+1)/pow(10,i)),3);// }// if(sum==j)// {// printf("%d 是水仙花数!\n",j);// }// sum=0;// }// }// return 0;//} //为什么还是无法实现?!#include<stdio.h>#include<math.h>int main(){int a,b,c,i,sum=0; //这里只计算三位数的.for(i=100;i<1000;i++){a=i/100;b=i%100/10;c=i%10;sum+=a*a*a+b*b*b+c*c*c;if(sum==i){printf("%d 是水仙花数.\n",i);}sum=0;}return 0;}P141 0.9 完数.#include<stdio.h>int main(){int i,j,r;for(i=1;i<=1000;i++) //零是个临界值,不能包括它.{r=0; //每次清零重来.类似水仙中的sum.for(j=1;j<i;j++){if(i%j==0) //除得尽即是因子.{r=r+j; //然后累加进去.}}if(r==i) //若相等.{printf("%d 是完数.\n",i);}}return 0;}P141 0.10 2/1+3/2+5/3+8/5+13/8…#include<stdio.h>int main() //10.007051{double i,a=2,b=1,c,s=0; //a是分子,b是分母.for(i=0;i<6;i++) //二十可以用户指定.{s+=a/b; //中间储值变量.c=a+b;b=a;a=c;}printf("%lf\n",s);return 0;}#include<stdio.h>int main() //从一百开始,减一半再自加两次,下降一次,反弹一次.{double sum=100,high=100,up,donw,i;for(i=1;i<10;i++) //不管指定到哪个数,都不会超过三百.{up=high/2;donw=up;high=donw; //自咬尾巴问题.sum+=donw*2;}printf("%lf %lf\n",donw,sum);return 0;}P141 0.12 猴子吃桃子.#include<stdio.h>int main() //从一百开始,减一半再自加两次,下降一次,反弹一次.{int i,sum=1;for(i=1;i<=10;i++) //临界要清楚,结果要与手算的前几个实例相匹配.{printf("倒数第%d天还剩有%d个桃子.\n",i,sum);sum=(sum+1)*2;}//printf("%d\n",sum);return 0;}P141 0.16 输出星号棱形图案.#include<stdio.h>#include<conio.h>main() //只关注左半部分.右半部分无视空格.{int i,j,k,m=6; //m可指定,指定中心点位置.可任意奇偶.for(i=1;i<=m;i++) //上半部分.其实也是正三角.{for(j=1;j<=m-i;j++) //一到中心点前i个位置填充空格.printf(" ");for(k=1;k<2*i;k++) //空格后向前填充星号的个数.是奇数.一,三,五... printf("*");printf("\n");}for(i=m-1;i>0;i--) //下半部分.其实也是倒三角.{ //减一是因为行数问题.这是中心行以下的.for(j=m-1;j>=i;j--)printf(" ");for(k=1;k<2*i;k++)printf("*");printf("\n");}getch(); //用户反应后结束.但,没必要.}。
C程序设计 第五版 谭浩强 第五章
运行结果:
10 11 12 13 14 15 16 17 18 19
•
•
虽然在定义数组时未指定数组的大小,但由于在初始化时给 出了10个数据,因此数组的大小就被指定为10,并对全部数 组元素进行了初始化。相当于 : int student_age[10]={10,11,12,13,14,15,16,17,18,19};
… long sun_age=0; float average_age; for(i=0;i<=n;i++) sum_age+= student_age[i]; average_age=sum_age/n; …
• 而使用简单变量时,就要使用下面的程序结构: … long sun_age=0; float average_age; sum_age = student_age1 + student_age2 + student_age3 + …; average_age=sum_age/n; …
/* 定义数组 */ /* 输入数据 */
/* 正序输出 */
/* 反序输出 */
•
一次运行结果如下:
•
可以发现,上面的输出结果中,反序输出的数据中多了一个 “10”。检查程序,发现是使用了下标“Nelements”,而正 确的下标应当不超过Nelements-1。所以,只要把反序输出 的重复结构改为下面的形式就可以了。 /* 反序输出 */
/****** 文件名:ex050103.c ******/ /****** 用数组存储年龄 ******/ #include <stdio.h> #define Nelements 10 int main(void) { int i; int student_age[Nelements]={10,11,12,13,14,15,16,17,18,19}; /* 定义数组并部分初始化*/ for(i=0;i<Nelements;i++) /* 正序输出 */ printf("%6d", student_age[i]); printf("\n"); return 0; } 这里,数据数与数组大小一致。输出结果:
谭浩强版C++程序设计 第5章 数组
有一个3× 的矩阵 的矩阵, 例5.5 有一个 ×4的矩阵,要求编程序求出其中 值最大的那个元素的值, 值最大的那个元素的值,以及其所在的行号和列 号.
#include <iostream> using namespace std; int main( ) { int i,j,row=0,colum=0,max; int a[3][ ]={{5,12,23,56},{19,28,37,46},{-12,-34,6,8}}; ][4] [ ][ max=a[0][ ]; ][0] //使max开始时取 [0][ ]的值 开始时取a[ ][ ][0] [ ][ 使 开始时取 for (i=0;i<=2;i++) for (j=0;j<=3;j++) if (a[i][ ]>max) ][j] //如果某元素大于 如果某元素大于max [ ][ 如果某元素大于 { max=a[i][ ]; ][j] //max将取该元素的值 [ ][ 将取该元素的值 row=i; //记下该元素的行号 记下该元素的行号i 记下该元素的行号 colum=j; //记下该元素的列号 记下该元素的列号j 记下该元素的列号 } cout<<〃max=〃<<max<<〃,row=〃<<row<<〃,colum=〃<<colum<<endl; return 0; }
例5.3(续一) (续一)
#include <iostream.h> #include <iomanip.h> void main() {
int i,j,t,a[10]; cout << "请输入 个整数,用空格分隔:"; 请输入10个整数 请输入 个整数,用空格分隔: for(i=0; i<10; i++) cin >> a[i]; for(i=0; i<10-1; i++) { for(j=0; j < 10-1-i; j++) {
C程序设计(第四版)(谭浩强编)教程-第5章_循环结构程序设计
乐山师范学院数信学院
for语句的说明
三个表达式的说明 expr1:初始化
expr2:循环条件
expr3:一般是循环变量的改变
分隔表达式的分号不能省略 expr1省略,不进行初始化 expr2省略,认为循环条件永为“真” expr3省略,不在这里改变循环变量
三个表达式都可以省略
#include<stdio.h>
int main() {
int n;
for(n=100;n<=200;n++) { if(n%3==0) continue; //等价于if(n%3!=0) printf(“%4d”,n ); // printf(“%4d”,n ); } printf("\n");
结束本次循环
while(i<j){ ... if(i>100) break; ... }
while(i<j){
...
if(i>100)
continue; ... }
C程序设计
26
乐山师范学院数信学院
break和continue语句
C程序设计
27
乐山师范学院数信学院
continue语句举例
【例】
参见教材,for语句的说明
C程序设计 13 乐山师范学院数信学院
for语句使用举例
例如:
for(i=1,sum=0; i<=100; i++) sum=sum+i; 先给i赋初值1,判断i是否小于等于100, 若是则执 行语句,之后值增加1。再重新判断, 直到条件为假 ,即i>100时,结束循环。 相当于: i=1;sum=0; while(i<=100) { sum=sum+i;
c++程序设计谭浩强第5章2013修订
第五章数组5.1 数组的概念(P128)在解决实际问题时,往往会需要处理一批具有相同的数据类型并且关系密切的变量。
例如:对一个班的学生成绩进行处理,计算其个人平均成绩、学科平均成绩,个人名次排序等。
数组是具有一定顺序关系的若干变量的集合体,组成数组的变量成为该数组的元素变量,简称元素。
在C++中,数组的元素变量用数组名后面跟上带有方括号[ ]的下标表示。
如:a[10],data[20],s[30],b[5][6];其中带有一个方括号的称为一维数组,带有两个以上方括号的称为二维数组、三维数组等,统称为多维数组。
方括号中的下标用来表示元素在数组中的位臵。
数组在内存中连续分配一片存储单元见P128图5.1a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7]2000 2002 2004 2006 2008 2010 2012 20141345.2 一维数组的定义和引用一、一维数组的定义1.一维数组的定义格式:类型标识符数组名[ 常量表达式]例如:int data[20]表明定义了一个名字叫data,长度为20的整型一维数组,即该数组有20个整数类型的元素,可以用来存储20个整数类型的数据。
2.说明:①数组名的命名应符合标识符的命名规则;②数组名后面方括号内的数据是数组的长度,也即是数组元素的个数,它可以是常量,也可以是常量表达式,但必须是整型。
不能是变量或变量表达式(即不允许作动态定义)。
③C编译系统为数组分配连续的存储单元,数组元素的相对次序a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7]一般的,含有n个元素的数组,其下标范围实0 -(n-1)④相同类型的数组,可以放在一个说明行中,数组之间用逗号分隔。
二、一维数组的初始化例如:int s[5]={ 0,1,2,3,4 }说明:①将数组元素的初值放在一对花括号中,所赋初值的类型必须与定义数组的类型一致,各个初值之间用逗号分隔;系统将按初值的顺序,顺次给数组元素赋值;135②所赋初值的个数不能超过数组元素的个数(数组的长度),但可以少于数组元素的个数,此时相当于给数组的前一部分元素赋值,而后面的元素由系统自动地赋值为0;例如:int a[5]={1,2,3}相当于:a[0]=1,a[1]=2,a[2]=3,a[3]=0,a[4]=0,注:若需要将数组全部元素初始化为0值,可以用如下形式实现:int a[10]={0};问:int a[10]={1}; 其初始化值为?③若给数组的所有元素赋初值,可以省略数组的长度,例如:int ar[ ]={ 3,2,4,6,8}相当于:int ar[5]={3,2,4,6,8}④若在数组定义之后,再初始化数组,则不能成组赋值,只能一次给一个元素赋值。
C语言课件(谭浩强版)第5章选择结构程序设计
C语言程序设计
例
a=4;b=5; !a a&&b a||b !a||b 4&&0||2 5>3&&2||8<45>3&&2||8<4-!0 ‘c’&& d’ &&‘d c &&
值为0 值为1 值为1 值为1 值为1 //(5>3)&&2||(8<(4-(!0))) 值为1 值为1
C语言程序设计
短路特性:逻辑表达式求解时, 短路特性:逻辑表达式求解时,并非所有的逻辑 运算符都被执行, 运算符都被执行,只是在必须执行下一个逻辑运 算符才能求出表达式的解时, 算符才能求出表达式的解时,才执行该运算符
内嵌if
内嵌if
if (expr1) if (expr2) else else if(expr3) else
statement1 内嵌if statement2 statement3 内嵌if statement4
C语言程序设计
例 输入两数并判断其大小关系
#include <stdio.h> main() { int x,y; printf("Enter integer x,y:"); 运行:Enter integer x,y:12,23↵ X<Y scanf("%d,%d",&x,&y); Enter integer x,y:12,6↵ if(x!=y) X>Y if(x>y) printf("X>Y\n"); Enter integer x,y:12,12↵ else printf("X<Y\n"); X==Y else printf("X==Y\n"); }
《C面向对象程序设计答案解析》-第五章谭浩强-清华大学出版社
1:#include <iostream>using namespace std;class Student{public:void get_value(){cin>>num>>name>>sex;}void display( ){cout<<"num: "<<num<<endl;cout<<"name: "<<name<<endl;cout<<"sex: "<<sex<<endl;} private :int num;char name[10];char sex;};class Student1: public Student {public:void get_value_1(){get_value();cin>>age>>addr;}{ cout<<"age: "<<age<<endl; //引用派生类的私有成员,正确。
cout<<"address: "<<addr<<endl;} //引用派生类的私有成员,正确。
private:int age;char addr[30];};int main(){Student1 stud1;stud1.get_value_1();stud1.display();stud1.display_1();return 0;}2:#include <iostream>using namespace std;class Student{public:void get_value(){cin>>num>>name>>sex;}{cout<<"num: "<<num<<endl;cout<<"name: "<<name<<endl;cout<<"sex: "<<sex<<endl;}private :int num;char name[10];char sex;};class Student1: private Student{public:void get_value_1(){get_value();cin>>age>>addr;}void display_1(){display();cout<<"age: "<<age<<endl; //引用派生类的私有成员,正确。
C语言(谭浩强)第05章 选择结构程序设计
真
number>100
真
假
number>50
真
cost=0.15
cost=0.10
cost=0.075
cost=0.05
cost=0
说明: 说明: 1)if 语句中在if后面都有表达式,一般为逻辑表达式或 语句中在if后面都有表达式 一般为逻辑表达式 后面都有表达式, 逻辑表达式或 关系表达式,也可以为其它表达式 如果表示式的值为0, 其它表达式; 关系表达式,也可以为其它表达式;如果表示式的值为0, 则按“ 处理,如果为非0 则按“ 处理; 则按“假”处理,如果为非0,则按“真”处理; 例如: 直接执行打印“ 例如:if (3) printf(“O.K.”); 直接执行打印“O.K.” if (‘a’) printf(“%d”,’a’); 打印’a’的ASCII码97 打印’a’的ASCII码 2)注意在if 语句第二、三形式中每个语句后都有分号; 注意在if 语句第二、三形式中每个语句后都有分号; if (number>500) cost=0.15; cost=0.15; else if (number>300) cost=0.10; cost=0.10; else if (number>100) cost=0.075; cost=0.075; else if (number>50) cost=0.05; cost=0.05; else cost=0;
5.2逻辑运算符和逻辑表达式 5.2逻辑运算符和逻辑表达式
5.2.1逻辑运算符及其优先次序 5.2.1逻辑运算符及其优先次序 C语言提供三种逻辑运算符: 语言提供三种逻辑运算符: (1)&& ) (2) | | ) (3) ! ) 逻辑与(与运算符) 逻辑与(与运算符) 逻辑或(或运算符) 逻辑或(或运算符) 逻辑非(非运算符) 逻辑非(非运算符)
C语言程序设计(谭浩强)第四版_课后答案
第5章循环结构程序设计【第140页】5-2#include <stdio.h>#include <math.h> // 程序中用到数学函数fabs,应包含头文件math.n int main(){int sign=1,count=0; // sign用来表示数值的符号,count用来统计循环次数double pi=0.0,n=1.0,term=1.0; // pi开始代表多项式的值,最后代表π的值, n代表分母,term代表当前项的值while(fabs(term)>=1e-8) // 检查当前项term的绝对值是否大于或等于10的(-6)次方{pi=pi+term; // 把当前项term累加到pi中n=n+2; // n+2是下一项的分母sign=-sign; // sign代表符号,下一项的符号与上一项符号相反term=sign/n; // 求出下一项的值termcount++; // count累加1}pi=pi*4; // 多项式的和pi乘以4,才是π的近似值printf("pi=%10.8f\n",pi); // 输出π的近似值printf("count=%d\n",count); // 输出循环次数return 0;}5-3#include <stdio.h>int main(){int p,r,n,m,temp;printf("请输入两个正整数n,m:");scanf("%d,%d,",&n,&m);if (n<m){temp=n;n=m;m=temp;}p=n*m;while(m!=0){r=n%m;n=m;m=r;printf("它们的最大公约数为:%d\n",n);printf("它们的最小公约数为:%d\n",p/n);return 0;}5-4#include <stdio.h>int main(){char c;int letters=0,space=0,digit=0,other=0;printf("请输入一行字符:\n");while((c=getchar())!='\n'){if (c>='a' && c<='z' || c>='A' && c<='Z')letters++;else if (c==' ')space++;else if (c>='0' && c<='9')digit++;elseother++;}printf("字母数:%d\n空格数:%d\n数字数:%d\n其它字符数:%d\n",letters,space,digit,other);return 0;}5-5#include <stdio.h>int main(){int a,n,i=1,sn=0,tn=0;printf("a,n=:");scanf("%d,%d",&a,&n);while (i<=n){tn=tn+a; /*赋值后的tn为i个a组成数的值*/sn=sn+tn; /*赋值后的sn为多项式前i项之和*/a=a*10;++i;}printf("a+aa+aaa+...=%d\n",sn);return 0;5-6#include <stdio.h>int main(){double s=0,t=1;int n;for (n=1;n<=20;n++){t=t*n;s=s+t;}printf("1!+2!+...+20!=%22.15e\n",s);return 0;}5-7#include <stdio.h>int main(){int n1=100,n2=50,n3=10;double k,s1=0,s2=0,s3=0;for (k=1;k<=n1;k++) /*计算1到100的和*/{s1=s1+k;}for (k=1;k<=n2;k++) /*计算1到50各数的平方和*/ {s2=s2+k*k;}for (k=1;k<=n3;k++) /*计算1到10的各倒数和*/{s3=s3+1/k;}printf("sum=%15.6f\n",s1+s2+s3);return 0;}5-8#include <stdio.h>int main(){int i,j,k,n;printf("parcissus numbers are ");for (n=100;n<1000;n++){i=n/100;j=n/10-i*10;k=n%10;if (n==i*i*i + j*j*j + k*k*k)printf("%d ",n);}printf("\n");return 0;}5-9-1#define M 1000 /*定义寻找范围*/#include <stdio.h>int main(){int k1,k2,k3,k4,k5,k6,k7,k8,k9,k10;int i,a,n,s;for (a=2;a<=M;a++) /* a是2-1000之间的整数,检查它是否完数*/{n=0; /* n用来累计a的因子的个数*/s=a; /* s用来存放尚未求出的因子之和,开始时等于a */for (i=1;i<a;i++) /* 检查i是否a的因子*/if (a%i==0) /* 如果i是a的因子*/{n++; /* n加1,表示新找到一个因子*/s=s-i; /* s减去已找到的因子,s的新值是尚未求出的因子之和*/ switch(n) /* 将找到的因子赋给k1...k9,或k10 */{case 1:k1=i; break; /* 找出的笫1个因子赋给k1 */case 2:k2=i; break; /* 找出的笫2个因子赋给k2 */case 3:k3=i; break; /* 找出的笫3个因子赋给k3 */case 4:k4=i; break; /* 找出的笫4个因子赋给k4 */case 5:k5=i; break; /* 找出的笫5个因子赋给k5 */case 6:k6=i; break; /* 找出的笫6个因子赋给k6 */case 7:k7=i; break; /* 找出的笫7个因子赋给k7 */case 8:k8=i; break; /* 找出的笫8个因子赋给k8 */case 9:k9=i; break; /*找出的笫9个因子赋给k9 */case 10:k10=i; break; /* 找出的笫10个因子赋给k10 */}}if (s==0){printf("%d ,Its factors are ",a);if (n>1) printf("%d,%d",k1,k2); /* n>1表示a至少有2个因子*/if (n>2) printf(",%d",k3); /* n>2表示至少有3个因子,故应再输出一个因子*/if (n>3) printf(",%d",k4); /* n>3表示至少有4个因子,故应再输出一个因子*/if (n>4) printf(",%d",k5); /* 以下类似*/if (n>5) printf(",%d",k6);if (n>6) printf(",%d",k7);if (n>7) printf(",%d",k8);if (n>8) printf(",%d",k9);if (n>9) printf(",%d",k10);printf("\n");}}return 0;}5-9-2#include <stdio.h>int main(){int m,s,i;for (m=2;m<1000;m++){s=0;for (i=1;i<m;i++)if ((m%i)==0) s=s+i;if(s==m){printf("%d,its factors are ",m);for (i=1;i<m;i++)if (m%i==0) printf("%d ",i);printf("\n");}}return 0;}5-10#include <stdio.h>int main(){int i,n=20;double a=2,b=1,s=0,t;for (i=1;i<=n;i++){s=s+a/b;t=a,a=a+b,b=t;}printf("sum=%16.10f\n",s);return 0;}5-11#include <stdio.h>int main(){double sn=100,hn=sn/2;int n;for (n=2;n<=10;n++){sn=sn+2*hn; /*第n次落地时共经过的米数*/hn=hn/2; /*第n次反跳高度*/}printf("第10次落地时共经过%f米\n",sn);printf("第10次反弹%f米\n",hn);return 0;}5-12#include <stdio.h>int main(){int day,x1,x2;day=9;x2=1;while(day>0){x1=(x2+1)*2; /*第1天的桃子数是第2天桃子数加1后的2倍.*/ x2=x1;day--;}printf("total=%d\n",x1);return 0;}5-13#include <stdio.h>#include <math.h>int main(){float a,x0,x1;printf("enter a positive number:");scanf("%f",&a);x0=a/2;x1=(x0+a/x0)/2;do{x0=x1;x1=(x0+a/x0)/2;}while(fabs(x0-x1)>=1e-5);printf("The square root of %5.2f is %8.5f\n",a,x1); return 0;}5-14#include <stdio.h>#include <math.h>int main(){double x1,x0,f,f1;x1=1.5;do{x0=x1;f=((2*x0-4)*x0+3)*x0-6;f1=(6*x0-8)*x0+3;x1=x0-f/f1;}while(fabs(x1-x0)>=1e-5);printf("The root of equation is %5.2f\n",x1);return 0;}5-15#include <stdio.h>#include <math.h>int main(){float x0,x1,x2,fx0,fx1,fx2;do{printf("enter x1 & x2:");scanf("%f,%f",&x1,&x2);fx1=x1*((2*x1-4)*x1+3)-6;fx2=x2*((2*x2-4)*x2+3)-6;}while(fx1*fx2>0);do{x0=(x1+x2)/2;fx0=x0*((2*x0-4)*x0+3)-6;if ((fx0*fx1)<0){x2=x0;fx2=fx0;}else{x1=x0;fx1=fx0;}}while(fabs (fx0)>=1e-5); printf("x=%6.2f\n",x0); return 0;}5-16#include <stdio.h>int main(){int i,j,k;for (i=0;i<=3;i++){for (j=0;j<=2-i;j++)printf(" ");for (k=0;k<=2*i;k++)printf("*");printf("\n");}for (i=0;i<=2;i++){for (j=0;j<=i;j++)printf(" ");for (k=0;k<=4-2*i;k++)printf("*");printf("\n");}return 0;}5-17#include <stdio.h>int main(){char i,j,k; /*是a的对手;j是b的对手;k是c的对手*/ for (i='x';i<='z';i++)for (j='x';j<='z';j++)if (i!=j)for (k='x';k<='z';k++)if (i!=k && j!=k)if (i!='x' && k!='x' && k!='z')printf("A--%c\nB--%c\nC--%c\n",i,j,k);return 0;}第6章利用数组处理批量数据【第168页】6-1#include <stdio.h>#include <math.h>int main(){int i,j,n,a[101];for (i=1;i<=100;i++)a[i]=i;a[1]=0;for (i=2;i<sqrt(100);i++)for (j=i+1;j<=100;j++){if(a[i]!=0 && a[j]!=0)if (a[j]%a[i]==0)a[j]=0;}printf("\n");for (i=2,n=0;i<=100;i++){ if(a[i]!=0){printf("%5d",a[i]);n++;}if(n==10){printf("\n");n=0;}}printf("\n");return 0;}6-2#include <stdio.h>int main(){int i,j,min,temp,a[11];printf("enter data:\n");for (i=1;i<=10;i++){printf("a[%d]=",i);scanf("%d",&a[i]);}printf("\n");printf("The orginal numbers:\n"); for (i=1;i<=10;i++)printf("%5d",a[i]);printf("\n");for (i=1;i<=9;i++){min=i;for (j=i+1;j<=10;j++)if (a[min]>a[j]) min=j;temp=a[i];a[i]=a[min];a[min]=temp;}printf("\nThe sorted numbers:\n"); for (i=1;i<=10;i++)printf("%5d",a[i]);printf("\n");return 0;}6-3#include <stdio.h>int main(){int a[3][3],sum=0;int i,j;printf("enter data:\n");for (i=0;i<3;i++)for (j=0;j<3;j++)scanf("%3d",&a[i][j]);for (i=0;i<3;i++)sum=sum+a[i][i];printf("sum=%6d\n",sum);return 0;}6-4#include <stdio.h>int main(){ int a[11]={1,4,6,9,13,16,19,28,40,100}; int temp1,temp2,number,end,i,j;printf("array a:\n");for (i=0;i<10;i++)printf("%5d",a[i]);printf("\n");printf("insert data:");scanf("%d",&number);end=a[9];if (number>end)a[10]=number;else{for (i=0;i<10;i++){if (a[i]>number){temp1=a[i];a[i]=number;for (j=i+1;j<11;j++){temp2=a[j];a[j]=temp1;temp1=temp2;}break;}}}printf("Now array a:\n");for (i=0;i<11;i++)printf("%5d",a[i]);printf("\n");return 0;}6-5#include <stdio.h>#define N 5int main(){ int a[N],i,temp;printf("enter array a:\n");for (i=0;i<N;i++)scanf("%d",&a[i]);printf("array a:\n");for (i=0;i<N;i++)printf("%4d",a[i]);for (i=0;i<N/2;i++) //循环的作用是将对称的元素的值互换{ temp=a[i];a[i]=a[N-i-1];a[N-i-1]=temp;}printf("\nNow,array a:\n");for (i=0;i<N;i++)printf("%4d",a[i]);printf("\n");return 0;}6-6#include <stdio.h>#define N 10int main(){ int i,j,a[N][N];for (i=0;i<N;i++){a[i][i]=1;a[i][0]=1;}for (i=2;i<N;i++)for (j=1;j<=i-1;j++)a[i][j]=a[i-1][j-1]+a[i-1][j];for (i=0;i<N;i++){for (j=0;j<=i;j++)printf("%6d",a[i][j]);printf("\n");}printf("\n");return 0;}6-7#include <stdio.h>int main(){ int a[15][15],i,j,k,p,n;p=1;while(p==1){printf("enter n(n=1--15):");scanf("%d",&n);if ((n!=0) && (n<=15) && (n%2!=0))p=0;}for (i=1;i<=n;i++)for (j=1;j<=n;j++)a[i][j]=0;j=n/2+1;a[1][j]=1;for (k=2;k<=n*n;k++){i=i-1;j=j+1;if ((i<1) && (j>n)){i=i+2;j=j-1;}else{if (i<1) i=n;if (j>n) j=1;}if (a[i][j]==0)a[i][j]=k;else{i=i+2;j=j-1;a[i][j]=k;}}for (i=1;i<=n;i++){for (j=1;j<=n;j++)printf("%5d",a[i][j]);printf("\n");}return 0;}#include <stdio.h>#define N 4#define M 5 /* 数组为4行5列*/int main(){int i,j,k,a[N][M],max,maxj,flag;printf("please input matrix:\n");for (i=0;i<N;i++) /* 输入数组*/for (j=0;j<M;j++)scanf("%d",&a[i][j]);for (i=0;i<N;i++){max=a[i][0]; /* 开始时假设a[i][0]最大*/maxj=0; /* 将列号0赋给maxj保存*/for (j=0;j<M;j++) /* 找出第i行中的最大数*/if (a[i][j]>max){max=a[i][j]; /* 将本行的最大数存放在max中*/maxj=j; /* 将最大数所在的列号存放在maxj中*/}flag=1; /* 先假设是鞍点,以flag为1代表*/for (k=0;k<N;k++)if (max>a[k][maxj]) /* 将最大数和其同列元素相比*/{flag=0; /* 如果max不是同列最小,表示不是鞍点令flag1为0 */continue;}if(flag) /* 如果flag1为1表示是鞍点*/{printf("a[%d][%d]=%d\n",i,maxj,max); /* 输出鞍点的值和所在行列号*/break;}}if(!flag) /* 如果flag为0表示鞍点不存在*/printf("It is not exist!\n");return 0;}6-9#include <stdio.h>#define N 15int main(){ int i,number,top,bott,mid,loca,a[N],flag=1,sign;char c;printf("enter data:\n");scanf("%d",&a[0]);while(i<N){scanf("%d",&a[i]);if (a[i]>=a[i-1])i++;elseprintf("enter this data again:\n");}printf("\n");for (i=0;i<N;i++)printf("%5d",a[i]);printf("\n");while(flag){printf("input number to look for:");scanf("%d",&number);sign=0;top=0; //top是查找区间的起始位置bott=N-1; //bott是查找区间的最末位置if ((number<a[0])||(number>a[N-1])) //要查的数不在查找区间内loca=-1; // 表示找不到while ((!sign) && (top<=bott)){mid=(bott+top)/2;if (number==a[mid]){loca=mid;printf("Has found %d, its position is %d\n",number,loca+1);sign=1;}else if (number<a[mid])bott=mid-1;elsetop=mid+1;}if(!sign||loca==-1)printf("cannot find %d.\n",number);;printf("continu or not(Y/N)?");scanf(" %c",&c);if (c=='N'||c=='n')flag=0;}return 0;}6-10#include <stdio.h>int main(){int i,j,upp,low,dig,spa,oth;char text[3][80];upp=low=dig=spa=oth=0;for (i=0;i<3;i++){ printf("please input line %d:\n",i+1);gets(text[i]);for (j=0;j<80 && text[i][j]!='\0';j++){if (text[i][j]>='A'&& text[i][j]<='Z')upp++;else if (text[i][j]>='a' && text[i][j]<='z')low++;else if (text[i][j]>='0' && text[i][j]<='9')dig++;else if (text[i][j]==' ')spa++;elseoth++;}}printf("\nupper case: %d\n",upp);printf("lower case: %d\n",low);printf("digit : %d\n",dig);printf("space : %d\n",spa);printf("other : %d\n",oth);return 0;}6-11#include <stdio.h>int main(){ char a[5]={'*','*','*','*','*'};int i,j,k;char space=' ';for (i=0;i<5;i++){ printf("\n");printf(" ");for (j=1;j<=i;j++)printf("%c",space);for (k=0;k<5;k++)printf("%c",a[k]);}printf("\n");return 0;}6-12a-c#include <stdio.h>int main(){ int j,n;char ch[80],tran[80];printf("input cipher code:");gets(ch);printf("\ncipher code :%s",ch);j=0;while (ch[j]!='\0'){ if ((ch[j]>='A') && (ch[j]<='Z'))tran[j]=155-ch[j];else if ((ch[j]>='a') && (ch[j]<='z'))tran[j]=219-ch[j];elsetran[j]=ch[j];j++;}n=j;printf("\noriginal text:");for (j=0;j<n;j++)putchar(tran[j]);printf("\n");return 0;}6-12b#include <stdio.h>int main(){int j,n;char ch[80];printf("input cipher code:\n");gets(ch);printf("\ncipher code:%s\n",ch);j=0;while (ch[j]!='\0'){ if ((ch[j]>='A') && (ch[j]<='Z'))ch[j]=155-ch[j];else if ((ch[j]>='a') && (ch[j]<='z'))ch[j]=219-ch[j];elsech[j]=ch[j];j++;}n=j;printf("original text:");for (j=0;j<n;j++)putchar(ch[j]);printf("\n");return 0;}6-13#include <stdio.h>int main(){ char s1[80],s2[40];int i=0,j=0;printf("input string1:");scanf("%s",s1);printf("input string2:");scanf("%s",s2);while (s1[i]!='\0')i++;while(s2[j]!='\0')s1[i++]=s2[j++];s1[i]='\0';printf("\nThe new string is:%s\n",s1); return 0;}6-14#include <stdio.h>int main(){ int i,resu;char s1[100],s2[100];printf("input string1:");gets(s1);printf("\ninput string2:");gets(s2);i=0;while ((s1[i]==s2[i]) && (s1[i]!='\0'))i++;if (s1[i]=='\0' && s2[i]=='\0')resu=0;elseresu=s1[i]-s2[i];printf("\nresult:%d.\n",resu);return 0;}6-15#include <stdio.h>#include <string.h>int main(){ char s1[80],s2[80];int i;printf("input s2:");scanf("%s",s2);for (i=0;i<=strlen(s2);i++)s1[i]=s2[i];printf("s1:%s\n",s1);return 0;}第7章用函数实现模块化程序设计【第218页】7-1-1#include <stdio.h>int main(){int hcf(int,int);int lcd(int,int,int);int u,v,h,l;scanf("%d,%d",&u,&v);h=hcf(u,v);printf("H.C.F=%d\n",h);l=lcd(u,v,h);printf("L.C.D=%d\n",l);return 0;}int hcf(int u,int v){int t,r;if (v>u){t=u;u=v;v=t;}while ((r=u%v)!=0){u=v;v=r;}return(v);}int lcd(int u,int v,int h){return(u*v/h);}7-1-2#include <stdio.h>int Hcf,Lcd;int main(){void hcf(int,int);void lcd(int,int);int u,v;scanf("%d,%d",&u,&v); hcf(u,v);lcd(u,v);printf("H.C.F=%d\n",Hcf); printf("L.C.D=%d\n",Lcd); return 0;}void hcf(int u,int v){int t,r;if (v>u){t=u;u=v;v=t;}while ((r=u%v)!=0){u=v;v=r;}Hcf=v;}void lcd(int u,int v){Lcd=u*v/Hcf;}7-2#include <stdio.h>#include <math.h>float x1,x2,disc,p,q;int main(){void greater_than_zero(float,float);void equal_to_zero(float,float);void smaller_than_zero(float,float);float a,b,c;printf("input a,b,c:");scanf("%f,%f,%f",&a,&b,&c);printf("equation: %5.2f*x*x+%5.2f*x+%5.2f=0\n",a,b,c); disc=b*b-4*a*c;printf("root:\n");if (disc>0){greater_than_zero(a,b);printf("x1=%f\t\tx2=%f\n",x1,x2);}else if (disc==0){equal_to_zero(a,b);printf("x1=%f\t\tx2=%f\n",x1,x2);}else{smaller_than_zero(a,b);printf("x1=%f+%fi\tx2=%f-%fi\n",p,q,p,q);}return 0;}void greater_than_zero(float a,float b){x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);}void equal_to_zero(float a,float b){x1=x2=(-b)/(2*a);}void smaller_than_zero(float a,float b){p=-b/(2*a);q=sqrt(-disc)/(2*a);}7-3#include <stdio.h>int main(){int prime(int);int n;printf("input an integer:");scanf("%d",&n);if (prime(n))printf("%d is a prime.\n",n); elseprintf("%d is not a prime.\n",n); return 0;}int prime(int n){int flag=1,i;for (i=2;i<n/2 && flag==1;i++)if (n%i==0)flag=0;return(flag);}7-4#include <stdio.h>#define N 3int array[N][N];int main(){ void convert(int array[][3]);int i,j;printf("input array:\n");for (i=0;i<N;i++)for (j=0;j<N;j++)scanf("%d",&array[i][j]); printf("\noriginal array :\n");for (i=0;i<N;i++){for (j=0;j<N;j++)printf("%5d",array[i][j]);printf("\n");}convert(array);printf("convert array:\n");for (i=0;i<N;i++){for (j=0;j<N;j++)printf("%5d",array[i][j]);printf("\n");}return 0;}void convert(int array[][3]){int i,j,t;for (i=0;i<N;i++)for (j=i+1;j<N;j++){t=array[i][j];array[i][j]=array[j][i];array[j][i]=t;}}#include <stdio.h>#include <string.h>int main(){void inverse(char str[]);char str[100];printf("input string:");scanf("%s",str);inverse(str);printf("inverse string:%s\n",str);return 0;}void inverse(char str[]){char t;int i,j;for (i=0,j=strlen(str);i<(strlen(str)/2);i++,j--) {t=str[i];str[i]=str[j-1];str[j-1]=t;}}7-6#include <stdio.h>int main(){void concatenate(char string1[],char string2[],char string[]); char s1[100],s2[100],s[100];printf("input string1:");scanf("%s",s1);printf("input string2:");scanf("%s",s2);concatenate(s1,s2,s);printf("\nThe new string is %s\n",s);return 0;}void concatenate(char string1[],char string2[],char string[]) {int i,j;for (i=0;string1[i]!='\0';i++)string[i]=string1[i];for(j=0;string2[j]!='\0';j++)string[i+j]=string2[j];string[i+j]='\0';}7-7#include <stdio.h>int main(){void cpy(char [],char []);char str[80],c[80];printf("input string:");gets(str);cpy(str,c);printf("The vowel letters are:%s\n",c);return 0;}void cpy(char s[],char c[]){ int i,j;for (i=0,j=0;s[i]!='\0';i++)if (s[i]=='a'||s[i]=='A'||s[i]=='e'||s[i]=='E'||s[i]=='i'||s[i]=='I'||s[i]=='o'||s[i]=='O'||s[i]=='u'||s[i]=='U'){c[j]=s[i];j++;}c[j]='\0';}7-8#include <stdio.h>#include <string.h>int main(){char str[80];void insert(char []);printf("input four digits:");scanf("%s",str);insert(str);return 0;}void insert(char str[]){int i;for (i=strlen(str);i>0;i--){str[2*i]=str[i];str[2*i-1]=' ';}printf("output:\n%s\n",str);}7-9#include <stdio.h>int letter,digit,space,others;int main(){void count(char []);char text[80];printf("input string:\n");gets(text);printf("string:");puts(text);letter=0;digit=0;space=0;others=0;count(text);printf("\nletter:%d\ndigit:%d\nspace:%d\nothers:%d\n",letter,digit,space,others); return 0;}void count(char str[]){int i;for (i=0;str[i]!='\0';i++)if ((str[i]>='a'&& str[i]<='z')||(str[i]>='A' && str[i]<='Z'))letter++;else if (str[i]>='0' && str [i]<='9')digit++;else if (str[i]==32)space++;elseothers++;}7-10#include <stdio.h>#include <string.h>int main(){int alphabetic(char);int longest(char []);int i;char line[100];printf("input one line:\n");gets(line);printf("The longest word is :");for (i=longest(line);alphabetic(line[i]);i++)printf("%c",line[i]);printf("\n");return 0;}int alphabetic(char c){if ((c>='a' && c<='z')||(c>='A'&&c<='z'))return(1);elsereturn(0);}int longest(char string[]){int len=0,i,length=0,flag=1,place=0,point;for (i=0;i<=strlen(string);i++)if (alphabetic(string[i]))if (flag){point=i;flag=0;}elselen++;else{flag=1;if (len>=length){length=len;place=point;len=0;}}return(place);}7-11#include <stdio.h>#include <string.h>#define N 10char str[N];int main(){void sort(char []);int i,flag;for (flag=1;flag==1;){printf("input string:\n");scanf("%s",&str);if (strlen(str)>N)printf("string too long,input again!");elseflag=0;}sort(str);printf("string sorted:\n");for (i=0;i<N;i++)printf("%c",str[i]);printf("\n");return 0;}void sort(char str[]){int i,j;char t;for(j=1;j<N;j++)for (i=0;(i<N-j)&&(str[i]!='\0');i++)if(str[i]>str[i+1]){t=str[i];str[i]=str[i+1];str[i+1]=t;}}7-12#include <stdio.h>#include <math.h>int main(){float solut(float a,float b,float c,float d); float a,b,c,d;printf("input a,b,c,d:");scanf("%f,%f,%f,%f",&a,&b,&c,&d); printf("x=%10.7f\n",solut(a,b,c,d)); return 0;}float solut(float a,float b,float c,float d) {float x=1,x0,f,f1;do{x0=x;f=((a*x0+b)*x0+c)*x0+d;f1=(3*a*x0+2*b)*x0+c;x=x0-f/f1;}while(fabs(x-x0)>=1e-3);return(x);}7-13#include <stdio.h>#define N 10#define M 5float score[N][M];float a_stu[N],a_cour[M];int r,c;int main(){ int i,j;float h;float s_var(void);float highest();void input_stu(void);void aver_stu(void);void aver_cour(void);input_stu();aver_stu();aver_cour();printf("\n NO. cour1 cour2 cour3 cour4 cour5 aver\n"); for(i=0;i<N;i++){printf("\n NO %2d ",i+1);for(j=0;j<M;j++)printf("%8.2f",score[i][j]);printf("%8.2f\n",a_stu[i]);}printf("\naverage:");for (j=0;j<M;j++)printf("%8.2f",a_cour[j]);printf("\n");h=highest();printf("highest:%7.2f NO. %2d course %2d\n",h,r,c);printf("variance %8.2f\n",s_var());return 0;}void input_stu(void){int i,j;for (i=0;i<N;i++){printf("\ninput score of student%2d:\n",i+1);for (j=0;j<M;j++)scanf("%f",&score[i][j]);}}void aver_stu(void){int i,j;float s;for (i=0;i<N;i++){for (j=0,s=0;j<M;j++)s+=score[i][j];a_stu[i]=s/5.0;}}void aver_cour(void){int i,j;float s;for (j=0;j<M;j++){s=0;for (i=0;i<N;i++)s+=score[i][j];a_cour[j]=s/(float)N;}}float highest(){float high;int i,j;high=score[0][0];for (i=0;i<N;i++)for (j=0;j<M;j++)if (score[i][j]>high){high=score[i][j];r=i+1;c=j+1;}return(high);}float s_var(void){int i;float sumx,sumxn;sumx=0.0;sumxn=0.0;for (i=0;i<N;i++){sumx+=a_stu[i]*a_stu[i];sumxn+=a_stu[i];}return(sumx/N-(sumxn/N)*(sumxn/N)); }7-14#include <stdio.h>#define N 10#define M 5float score[N][M];float a_stu[N],a_cour[M];int r,c;int main(){ int i,j;float h;float s_var(void);float highest();void input_stu(void);void aver_stu(void);void aver_cour(void);input_stu();aver_stu();aver_cour();printf("\n NO. cour1 cour2 cour3 cour4 cour5 aver\n"); for(i=0;i<N;i++){printf("\n NO %2d ",i+1);for(j=0;j<M;j++)printf("%8.2f",score[i][j]);printf("%8.2f\n",a_stu[i]);}printf("\naverage:");for (j=0;j<M;j++)printf("%8.2f",a_cour[j]);printf("\n");h=highest();printf("highest:%7.2f NO. %2d course %2d\n",h,r,c);printf("variance %8.2f\n",s_var());return 0;}void input_stu(void){int i,j;for (i=0;i<N;i++){printf("\ninput score of student%2d:\n",i+1);for (j=0;j<M;j++)scanf("%f",&score[i][j]);}}void aver_stu(void){int i,j;float s;for (i=0;i<N;i++){for (j=0,s=0;j<M;j++)s+=score[i][j];a_stu[i]=s/5.0;}}void aver_cour(void){int i,j;float s;for (j=0;j<M;j++){s=0;for (i=0;i<N;i++)s+=score[i][j];a_cour[j]=s/(float)N;}}float highest(){float high;int i,j;high=score[0][0];for (i=0;i<N;i++)for (j=0;j<M;j++)if (score[i][j]>high){high=score[i][j];r=i+1;c=j+1;}return(high);}float s_var(void){int i;float sumx,sumxn;sumx=0.0;sumxn=0.0;for (i=0;i<N;i++){sumx+=a_stu[i]*a_stu[i];。
2022年C语言程序设计教程(第3版) 谭浩强 课件 最新 第5章
5.2阅读下面的程序,指出程序的输出结果。
(1)#include <stdio.h>void main(){int a[2]={0},i,j,k=2;for(i=0;i<k;i++)for(j=0;j<k;j++)a[j]=a[i]+1;printf("%d",a[k]);}(2)#include <stdio.h>void main(){int a[6],i;for(i=1;i<6;i++){a[i]=6*(i-1+4*(i/3))%5;printf("%2d",a[i]);}}(3)#include <stdio.h>void main(){int i=0,j=7,k, a[8]={6,2,11,4,5,9,7,8};while(i<j) {k=a[i];a[i]=a[j];a[j]=k;i++;j--;}for(i=0;i<8;i++) printf("%3d",a[i]);}(4)#include <stdio.h>void main(){int x=44,y=9,i, m,a[9]={0,6,12,18,42,44,52,67,94};i=y/2+1;m=y/2;while(m!=0){if(x<a[i]) {i=i-m/2-1;m=m/2;}else if(x>a[i]) {i=i+m/2+1;m=m/2;}else break;printf("%d %d",x,i);}(5)#include <stdio.h>void func(int a[]){int j;for(j=0;j<5;j++) a[j]=j;}void main(){static int b[]={5,6,7,8,9},i;func(b);for(i=0;i<5;i++) printf("%d",b[i]);}(6)#include <stdio.h>void main(){char c1[5]={′A′,′B′,′C′,′D′},c2[5];int i;for(i=0;i<4;i++) c2[i]=(c1[i]-′A′-3+26)%26+′A′;c2[4]=′\0′;puts(c2);}5.3Fibonacci 数列的前两个数为1,1,以后每一个数都是其前两个数之和。
c语言程序设计第五版课后答案谭浩强第五章课后答案
c语⾔程序设计第五版课后答案谭浩强第五章课后答案c语⾔程序设计第五版课后答案谭浩强1.请画出例5.6中给出的3个程序段的流程图流程图1:流程图2:流程图3:2.请补充例5. 7程序,分别统计当“fabs(t)>= le- 6”和“fabs(t)> = le- 8”时执⾏循环体的次数。
fabs(t)>= le- 6 ,⽰例代码# include <stdio.h># include <math.h>int main(){int sign = 1;double pi = 0.0, term = 1.0;int n = 0;while (fabs(term) >= 1e-6){n++;term = 1.0 / (2 * n - 1)*sign;pi += term;sign = -sign;}pi *= 4;printf("pi的近似值是%lf\n", pi);printf("循环体循环了%d次\n", n);return 0;}运⾏截图:fabs(t)> = le- 8,⽰例代码# include <stdio.h># include <math.h>int main(){int sign = 1;double pi = 0.0, term = 1.0;int n = 0;while (fabs(term) >= 1e-8){n++;term = 1.0 / (2 * n - 1)*sign;pi += term;sign = -sign;}pi *= 4;printf("pi的近似值是%lf\n", pi);printf("循环体循环了%d次\n", n);return 0;}运⾏截图:3.输⼈两个正整数m和n,求其最⼤公约数和最⼩公倍数答案解析:该题题⽬直接使⽤“辗转相除法”来求解最⼤公约数,以除数和余数反复做除法运算,当余数为 0 时,就取得当前算式除数为最⼤公约数。
课件谭浩强C程序设计第5章
然后进行第2趟比较,对余下的前面5个数按上法进 行比较,见图5.3。
图5.2
图5.3
可以推知,如果有n个数,则要进行n-1趟比较(和交 换)。在第1趟中要进行n-1次两两比较,在第j趟中要 进行n-j次两两比较。
根据以上思路写出程序,今设n=10,本例定义数组 长度为11,a[0]不用,只用a[1]~a[10],以符 合人们的习惯。从前面的叙述可知,应该进行9趟比 较和交换。
C++用方括号来表示下标,如用s[1],s[2],s[3] 分别代表s1,s2,s3。
5.2 一维数组的定义和引用
5.2.1 定义一维数组
定义一维数组的一般格式为 类型标识符 数组名[常量表达式]; 例如
int a[10];
它表示数组名为a,此数组为整型,有10个元素。 说明: (1) 数组名定名规则和变量名相同,遵循标识符定名 规则。
const int n=5;
5.2.2 引用一维数组的元素
数组必须先定义,然后使用。只能逐个引用数组元 素的值而不能一次引用整个数组中的全部元素的值。 数组元素的表示形式为 数组名[下标] 下标可以是整型常量或整型表达式。例如
a[0]= a[5]+ a[7]- a[2*3]
例5.1 数组元素的引用。
int f[20]={1,1}; for(i=2;i<20;i++)
//f[0]=1,f[1]=1
f[i]=f[i-2]+f[i-1]; //在i的值为2时,f[2]=f[0]+f[1], 依此类推
for(i=0;i<20;i++)
//此循环的作用是输出20个数
谭浩强C程序设计课件完整版第5章
5.3字符数组和字符 字符数组和字符 串
字符数组是用来存放字符型数据 的数组,字符数组中的每一个元素存 放一个字符,字符数组可以存放字 符串.
5.3.1字符数组的定义 字符数组的定义
字符数组的定义与普通数组类似,形式为: 类型说明符 数组名[常量表达式]; 其中,char是字符型数据类型说明符,常量表达 式表示数组的元素的个数,即数组的长度,字符 数组的每一个元素存放一个字符. 例如: char c[5]; 定义字符数组c包含5个元素即5个字符,或者存放 一个长度不大于5的字符串. 字符数组同样有二维和多维的,如: char c[3][4]; 定义了一个3行4列的字符数组.
从上例看出数组元素只能逐个赋初值,比较的时候也是逐 个进行比较,通过数组的下标来区分数组元素.
5.1.3一维数组的初始化 一维数组的初始化
数组元素的赋初值和普通变量一样,数组初始化的 一般形式如下: 数据类型 数组名[常量表达式]={初值表}; 对数组元素的赋初值有下面几种情况: 1.一维数组可以在定义时可以对全部数组元素进行初始化, 数据间用逗号隔开.例如: int a[6]={1,3,5,7,9,11}; 经过上述初始化后, a[0]=1,a[1]=3,a[2]=5,a[3]=7,a[4]=9,a[5]=11.在这种情况 下,数组长度可以省略,即int a[ ]={1,3,5,7,9,11};
图5.5
5.3.4字符串及其常用函数 字符串及其常用函数
字符串是用双括号括起来的字符序列.在C语言中, 没有专门的字符串变量,而在实际的编程工作中, 字符串的应用又非常广泛,如:人的姓名,身份 证号码,产品编号等,为了解决这个问题,我们 使用字符数组来存放和处理字符串. 1.字符串的表示方式
字符数组的长度和字符串的有效长度很多时候是不同的,而 人们往往关心的是字符串的有效长度,为此,C语言规定 以'\0'作为字符串的结束标志,当遇到'\0'时,表示字符串 结束. 系统对字符串常量也自动加一个'\0'作为结束标志.例如字符 串"student"有7个字符,在内存却要占用8个字节,因为最 后一个字节用来存放字符'\0'. 从ASCII码表中可以查到,'\0'的ASCII码为0,它不是一个可 以显示的字符,在字符串中仅作为字符串的结束标志.
c语言程序设计第四版第五章答案谭浩强
第五章循环控制5.3输入两个正整数m和n,求其最大公约数和最小公倍数。
main(){long m,n,i=1,j,s;scanf("%ld,%ld",&m,&n);for(;i<=m&&i<=n;i++){if(m%i==0&&n%i==0) s=i;}if(m>=n) j=m;else j=n;for(;!(j%m==0&&j%n==0);j++);printf("s=%ld,j=%ld\n",s,j);}5.4输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
#include"stdio.h"main(){char c;int i=0,j=0,k=0,l=0;while((c=getchar())!=’\n’){if(c>=65&&c<=90||c>=97&&c<=122) i++;else if(c>=48&&c<=57) j++;else if(c==32) k++;else l++;}printf("i=%d,j=%d,k=%d,l=%d\n",i,j,k,l);}5.5求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。
例如:2+22+222+2222+22222(n=5),n由键盘输入。
#include"math.h"main(){int n,sum=0,i=1,s=2;scanf("%d",&n);while(i<=n){sum=sum+s;s=s+2*pow(10,i);i++;}printf("sum=%d\n",sum);}5.6求,(即求1!+2!+3!+4!+5!+…+20!)main(){int n,i=1;long sum=0,s=1;scanf("%d",&n);while(i<=n) {s=s*i;sum=sum+s;i++;}printf("sum=%ld\n",sum);}5.7求main(){double i=1,j=1,k=1,s1=0,s2=0,s3=0,sum;for(;i<=100;i++) s1=s1+i;for(;j<=50;j++) s2=s2+j*j;for(;k<=10;k++) s3=s3+1/k;sum=s1+s2+s3;printf("sum=%f\n",sum);}5.8打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在使用if语句中还应注意以下问题 在使用 语句中还应注意以下问题: 语句中还应注意以下问题
第五章 5.1if语句 if语句 5.1.1if语句的三 if语句的三 种形式 5.12if语句的嵌 12if 语句的嵌 套 5.1.3 条 件 运 算 符和条件表达 式 5.2switch语句 switch语句 5.3程序举例 5.3程序举例 习题
1) 在三种形式的if语句中 语句中, 在三种形式的 语句中,在if关键字之后均为表 关键字之后均为表 达式。 该表达式通常是逻辑表达式或关系表达式, 达式。 该表达式通常是逻辑表达式或关系表达式, 但也可 以是其它表达式,如赋值表达式等, 以是其它表达式,如赋值表达式等,甚至也可以是一个变 例如: 语句; 量。例如: if(a=5) 语句; if(b) 语句; 语句; 都是允许的。只要表达式的值为非0,即为“ 都是允许的。只要表达式的值为非 ,即为“真”。 如在:if(a=5)…; 如在 ; 中表达式的值永远为非0, 中表达式的值永远为非 ,所以其后的语句总是要执行 当然这种情况在程序中不一定会出现, 的,当然这种情况在程序中不一定会出现,但在语法上是 合法的。又如,有程序段: 合法的。又如,有程序段: if(a=b) printf("%d",a); else printf("a=0"); 本语句的语义是, 值赋予a,如为非0则输出该值 则输出该值, 本语句的语义是,把b值赋予 ,如为非 则输出该值, 值赋予 否则输出“ 字符串。 否则输出“a=0”字符串。这种用法在程序中是经常出现的。 字符串 这种用法在程序中是经常出现的。
2
5.1 if语句 语句
第五章 5.1if语句 if语句 5.1.1if语句的三 if语句的三 种形式 5.12if语句的嵌 12if 语句的嵌 套 5.1.3 条 件 运 算 符和条件表达 式 5.2switch语句 switch语句 5.3程序举例 5.3程序举例 习题
语句可以构成分支结构。 用if语句可以构成分支结构。它根据给定的条 语句可以构成分支结构 件进行判断,以决定执行某个分支程序段。C 。C语 件进行判断,以决定执行某个分支程序段。C语 言的if语句有三种基本形式 语句有三种基本形式。 言的 语句有三种基本形式。
1
本章学习目标
第五章 5.1if语句 if语句 5.1.1if语句的三 if语句的三 种形式 5.12if语句的嵌 12if 语句的嵌 套 5.1.3 条 件 运 算 符和条件表达 式 5.2switch语句 switch语句 5.3程序举例 5.3程序举例 习题
C语言提供了可以进行逻辑判断的选择语句, 语言提供了可以进行逻辑判断的选择语句, 语言提供了可以进行逻辑判断的选择语句 由选择语句构成的选择结构将根据逻辑判断的结 果决定程序的不同流程。 果决定程序的不同流程。选择结构是结构化程序 设计的三种基本结构之一。 设计的三种基本结构之一。本章将详细介绍如何 程序中实现选择结构。 在C程序中实现选择结构。通过本章的学习,大家 程序中实现选择结构 通过本章的学习, 应该掌握以下内容: 应该掌握以下内容: • if语句和用 语句构成的选择结构 语句和用if语句构成的选择结构 语句和用 • switch语句以及用 语句以及用switch语句和 语句和break语句构 语句以及用 语句和 语句构 成的选择结构
if(表达式 表达式) 表达式 语句1; 语句 ; else 语句2; 语句 ; 其语义是: 其语义是:如果 表达式的值为真,则 表达式的值为真, 执行语句1, 执行语句 ,否则执行 语句2 语句 。 其执行过程可表示 为右图。 为右图。
6
【例5.2】 】
第五章 5.1if语句 if语句 5.1.1if语句的三 if语句的三 种形式 5.12if语句的嵌 12if 语句的嵌 套 5.1.3 条 件 运 算 符和条件表达 式 5.2switch语句 switch语句 5.3程序举例 5.3程序举例 习题
main(){ int a, b; printf("input two numbers: "); scanf("%d%d",&a,&b); if(a>b) printf("max=%d\n",a); else printf("max=%d\n",b); } 输入两个整数,输出其中的大数。 输入两个整数,输出其中的大数。 改用if-else语句判别 的大小,若a大,则输出 语句判别a,b的大小 改用 语句判别 的大小, 大 a,否则输出 。 ,否则输出b。
前二种形式的if语句一般都用于两个分支的情 前二种形式的 语句一般都用于两个分支的情 当有多个分支选择时,可采用if-else-if语句, 语句, 况。 当有多个分支选择时,可采用 语句 其一般形式为: 其一般形式为: if(表达式 表达式1) 表达式 语句1; 语句 ; else if(表达式 表达式2) 表达式 语句2; 语句 ; else if(表达式 表达式3) 表达式 语句3; 语句 ; … else if(表达式 表达式m) 表达式 语句m; 语句 ; else 语句n; 语句 ;
第五章 5.1if语句 if语句 5.1.1if语句的三 if语句的三 种形式 5.12if语句的嵌 12if 语句的嵌 套 5.1.3 条 件 运 算 符和条件表达 式 5.2switch语句 switch语句 5.3程序举例 5.3程序举例 习题
第五章 选择结构程序设计
2011年3月19日星期六 年 月 日星期六
9
【例5.3】 】
第五章 5.1if语句 if语句 5.1.1if语句的三 if语句的三 种形式 5.12if语句的嵌 12if 语句的嵌 套 5.1.3 条 件 运 算 符和条件表达 式 5.2switch语句 switch语句 5.3程序举例 5.3程序举例 习题
#include"stdio.h" 本例要求判别键盘 main(){ 输入字符的类别。 输入字符的类别。可以 char c; 根据输入字符的ASCII 根据输入字符的 码来判别类型。 码来判别类型。由 printf("input a character: "); ASCII码表可知 码表可知ASCII 码表可知 c=getchar(); 值小于32的为控制字符 的为控制字符。 值小于 的为控制字符。 if(c<32) 在“0”和“9”之间的为 和 之间的为 printf("This is a control character\n"); ,在“A”和“Z”之 数字, 数字 和 之 else if(c>='0'&&c<='9') 间为大写字母, 间为大写字母, 在“a” 之间为小写字母, 和“z”之间为小写字母, 之间为小写字母 printf("This is a digit\n"); 其余则为其它字符。 其余则为其它字符。 这 else if(c>='A'&&c<='Z') 是一个多分支选择的问 printf("This is a capital letter\n"); 题,用if-else-if语句编程, 语句编程, 语句编程 else if(c>='a'&&c<='z') 判断输入字符ASCII码 判断输入字符 码 printf("This is a small letter\n"); 所在的范围, 所在的范围,分别给出 不同的输出。 不同的输出。例如输入 else , printf("This is an other character\n");为“g”,输出显示它为 小写字符。 小写字符。 }
12
5.1.2 if语句的嵌套 语句的嵌套
第五章 5.1if语句 if语句 5.1.1if语句的三 if语句的三 种形式 5.12if语句的嵌 12if 语句的嵌 套 5.1.3 条 件 运 算 符和条件表达 式 5.2switch语句 switch语句 5.3程序举例 5.3程序举例 习题
11
在使用if语句中还应注意以下问题 在使用 语句中还应注意以下问题: 语句中还应注意以下问题
第五章 5.1if语句 if语句 5.1.1if语句的三 if语句的三 种形式 5.12if语句的嵌 12if 语句的嵌 套 5.1.3 条 件 运 算 符和条件表达 式 5.2switch语句 switch语句 5.3程序举例 5.3程序举例 习题
3
5.1.1 if语句的三种形式 语句的三种形式
第五章 5.1if语句 if语句 5.1.1if语句的三 if语句的三 种形式 5.12if语句的嵌 12if 语句的嵌 套 5.1.3 条 件 运 算 符和条件表达 式 5.2switch语句 switch语句 5.3程序举例 5.3程序举例 习题
第一种形式为基本形式: 第一种形式为基本形式:if if(表达式 语句 表达式) 表达式 其语义是:如果表达式的值为真, 其语义是:如果表达式的值为真,则执行其后 的语句, 否则不执行该语句。 的语句, 否则不执行该语句。其过程可表示为下 图。 1.
4
【例5.1】 】
第五章 5.1if语句 if语句 5.1.1if语句的三 if语句的三 种形式 5.12if语句的嵌 12if 语句的嵌 套 5.1.3 条 件 运 算 符和条件表达 式 5.2switch语句 switch语句 5.3程序举例 5.3程序举例 习题
8
第五章 5.1if语句 if语句源自5.1.1if语句的三 if语句的三 种形式 5.12if语句的嵌 12if 语句的嵌 套 5.1.3 条 件 运 算 符和条件表达 式 5.2switch语句 switch语句 5.3程序举例 5.3程序举例 习题