C语言第三章习题带答案
- 格式:doc
- 大小:47.50 KB
- 文档页数:4
c语⾔程序设计第五版谭浩强习题答案第三章课后答案第三章最简单的C程序设计 ----顺序程序设计1、假如我国国民⽣产总值的年增长率为7%,计算10年后我国国民⽣产总值与现在相⽐增长多少百分⽐。
计算公式为$p = (1+r)^n$ ,其中r为年增长率,n为年数,p为与现在相⽐的倍数。
题⽬解析:此题的关键主要是利⽤数学库math中pow函数进⾏计算,若不熟悉可以查阅帮助⽂档,查看pow函数的⽤法。
代码⽰例:#include<stdio.h>#include <math.h>int main(){Cfloat p, r, n;r = 0.07;n = 10;p = pow(1 + r, n);printf("p=%f\n", p);return 0;}运⾏结果:2、存款利息的计算。
有1000元,想存5年,可按以下5种办法存:(1)⼀次存5年期(2)先存2年期,到期后将本息再存3年期(3)先存3年期,到期后将本息再存2年期(4)存1年期,到期后将本息再存1年期,连续存5次(5)存活期存款,活期利息每⼀季度结算⼀次2017年银⾏存款利息如下:1年期定期存款利息为1.5%;2年期定期存款利息为2.1%;3年期定期存款利息为2.75%;5年期定期存款利息为3%;活期存款利息为0.35%(活期存款每⼀-季度结算⼀-次利息)如果r为年利率,n为存款年数,则计算本息的公式如下:1年期本息和: P= 1000* (1+r);n年期本息和: P= 1000* (1+n* r);存n次1年期的本息和: $P=1000* (1+r)^n$;活期存款本息和: P= 1000 *(1+$\frac{r}{4}$)$^{4n}$;说明: 1000*(1+$\frac{r}{4}$)是⼀个季度的本息和。
题⽬解析:理解题意很关键,其次就是利⽤数学库math中pow函数进⾏幂次⽅计算代码⽰例:#include<stdio.h>#include <math.h>int main(){float r5, r3, r2, r1, r0, p, p1, p2, p3, p4, p5;p = 1000;r5 = 0.0585;r3 = 0.054;r2 = 0.0468;r1 = 0.0414;r0 = 0.0072;p1 = p*((1 + r5) * 5); // ⼀次存5年期p2 = p*(1 + 2 * r2)*(1 + 3 * r3); // 先存2年期,到期后将本息再存3年期p3 = p*(1 + 3 * r3)*(1 + 2 * r2); // 先存3年期,到期后将本息再存2年期p4 = p*pow(1 + r1, 5); // 存1年期,到期后将本息存再存1年期,连续存5次p5 = p*pow(1 + r0 / 4, 4 * 5); // 存活期存款。
第三章习题解答1.分别写出对链栈的入栈和出栈操作的算法。
链栈的结点类型定义如下:Typedef struct stacknode {SElemtype data;struct stacknode *next;}stacknode, *linkstack;入栈操作:Status push( linkstack &S, SElemtype e){ p=(linkstack)malloc(sizeof(stacknode));If (!p) return ERROR;p->data=e;p->next=S;S=p;return OK;}出栈操作:Status pop(linkstack &S, SElemtype &e){ if (!S) return ERROR;p=s;s=p->next;free(p);return OK;}P24/3.15假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的两个端点。
试编写实现这个双向栈tws的三个操作:初始化inistack(tws),入栈push(tws,i,x)和出栈pop(tws,i)的算法,其中i为0或1,用以分别指示设在数组两端的两个栈,并讨论按过程(正/误状态变量可设为变参)或函数设计这些操作算法各有什么优缺点。
双栈的结构类型定义如下:typedef struct{Elemtype *base[2];Elemtype *top[2];}BDStacktype; //双向栈类型栈的初始化操作:status Init_Stack(BDStacktype &tws,int m)//初始化一个大小为m的双向栈tws{ tws.base[0]=(Elemtype*)malloc(m*sizeof(Elemtype));tws.base[1]=tws.base[0]+m-1;tws.top[0]=tws.base[0];tws.top[1]=tws.base[1];return OK;}入栈操作:Status push(BDStacktype &tws,int i,Elemtype x) // x入栈,i=0表示低端栈,i=1表示高端栈{ if (tws.top[0]>tws.top[1]) return OVERFLOW;//注意此时的栈满条件if (i==0) *tws.top[0]++=x;elseif (i==1) *tws.top[1]--=x;else return ERROR;return OK;}出栈操作:Status pop(BDStacktype &tws, int i, Elemtype &x) // x出栈,i=0表示低端栈,i=1表示高端栈{ if (i==0){ if (tws.top[0]==tws.base[0]) return OVERFLOW;x=*--tws.top[0];}else if (i==1){ if (tws.top[1]==tws.base[1]) return OVERFLOW;x=*++tws.top[1];}else return ERROR;return OK;}P24/3.18试写一个判别表达式中开、闭括号是否配对出现的算法。
C语言练习题-第三章参考答案(已勘误)C语言练习题---第三章1、有以下程序#include<stdio.h>main(){short c=124;c=c_______;printf(“%d\n”,C);}若要使程序的运行结果为248,应在下划线处填入的是A)>>2 B)|248 C)&0248 D)<<12、以下程序运行后的输出结果是2008。
#include<stdio.h>main(){int a=200,b=010;printf(”%d%d\n”,a,b);}3、有以下程序#include<stdio.h>main(){int x,y;Scanf(“%2d%ld”,&x,&y);printf(“%d\n”,x+y);}程序运行时输入:程序的运行结果是34579。
4、有以下程序#includeVoid main(){char a,b,c,d;scanf(”%c%c”,&a,&b);c=getchar(); d=getchar();printf(”%c%c%c%c\n”,a,b,c,d);}当执行程序时,按下列方式输入数据(从第一列开始,代表回车,注意:回车是一个字符)1234则输出结果是:()A、1234B、12C、12D、123 345、有以下程序,其中k的初值为八进制数#includemain(){int k=011;printf(”%d\n”,k++);}程序运行后的输出结果是D(A)12 (B)11 (C)10 (D)96、有以下程序(暂不做)#includevoid fun (char*c,int d){*c=*c+1;d=d+1;printf(”%c,%c,”,*c,d);}main(){char b=’a’,a=’A’;fun(&b,a); printf(”%c,%c\n”,b,a);}程序运行后的输出结果是AA)b,B,b,A B)b,B,B,A C)a,B,B,a D)a,B,a,B7、以下程序#include#define SUB(a) (a)-(a)main(){int a=2,b=3,c=5,d;d=SUB(a+b)*c;printf(”%d\n”,d);}程序运行后的结果是CA)0 B)-12 C)-20 D)108、有以下程序#includemain(){int a=2,b=2,c=2;printf(”%d\n”,a/b&c);}程序运行后的结果是CA)0 B)1 C)2 D)39、将值为三位正整数的变量x中的数值按照个位、十位、百位的顺序拆分并输出。
程序设计基础-C语言(科学出版社教材)第三章-程序结构教材习题答案1.0编写程序使整形变量:a=3,b=4,c=5,p=0xfffe,q=0xffff;浮点型变量:x=1.2,y=2.4,z=3.6;无符号型变量:u=5127486,n=128765,字符型变量:c1=’a’,c2=’b’;#include <stdio.h>void main(){int a,b,c,p,q;float x,y,z;unsigned int u,n;char c1,c2;a=3;b=4;c=5;p=0xfffe;q=0xffff;x=1.2;y=2.4;z=-3.6;u=5127486;n=128765;c1='a';c2='b';printf("a=%d b=%d c=%d\n",a,b,c);printf("p=%#x q=%#x\n",p,q);printf("x=%f,y=%f,z=%f\n",x,y,z);printf("x+y=%.2f y+z=%.2f x+z=%.2f\n",x+y,y+z,x+z);printf("u=%8u n=%8u\n",u,n);printf("c1='%c' or %d\n",c1,c1);printf("c2='%c' or %d\n",c2,c2);}2.0 读入三个双精度数,求出它们的平均值并保留此平均值小数点后二位,最后输出结果。
#include <stdio.h>void main(){double a,b,c,d;printf("请输入三个双精度数:");scanf("%lf,%lf,%lf",&a,&b,&c);d=(a+b+c)/3;printf("d=%.2lf",d );}3.0 编写一个程序,要求输入三个整数值a,b,c,把c中的值赋给b, 把b中的值赋给a, 把a中的值赋给c,最后输出a,b,c.#include <stdio.h>void main(){int a,b,c,t;printf("输入三个整数值:");scanf("%d,%d,%d",&a,&b,&c);t=a;a=b;b=c;c=t;printf("a=%d,b=%d,c=%d\n",a,b,c);}4.0 编写一个程序,要求输入一个华氏温度,输出对于的摄氏温度。
第三章数据类型和表达式3.1 把数学算式或不等式表示成C++表达式1.2x 2.3.4.5.6.7.0(x(20 8.ax-by≠c9.4x+7y-2=3ab 10.(5同时3x+2≠0 11.age(55或者pay(820 12.place="江苏"同时sex="女" 13.'a'(ch('z'或者'A'(ch('Z'14.s[2]='0'同时(s[1]='x' 或者 s[1]='X')参考解答:1.2*x*(1+x*x/3.0)2.(1+exp(x))/(1-exp(x))3.(-b+sqrt(b*b-4*a*c))/(2*a)4.1/(pow(3,x)*log(2*x+k))5.pow(sin(x+PI/4),3)/(3+pow(cos(x-PI/4),3)) //其中PI常量为3.14159 6.1/7.0*pow((1+exp(x+1)),n)7.x>=0 && x<=208.a*x-b*y!=c9.4*x+7*y-2==3*a*b10.fabs((2*x*x+1)/(3*x+2))<=5 && (3*x+2!=0)11.age>=55 || pay>=82012.place=="江苏" && sex=="女"13.(ch>='a' && ch<='z') || (ch>='A' && ch<='Z')14.s[2]=='0' && (s[1]=='x' || s[1]=='X')3.2 根据题目要求编写程序1.已知一个三角形中三条边的长度分别为a、b和c,试编写一个程序利用计算公式求出三角形的面积,其中s=(a+b+c)/2,假定a、b和c的值由键盘输入,并确保任何两边的长度大于等于第三条边。
第三章顺序结构一、选择题1、以下叙述中错误的是A)C语句必须以分号结束B)复合语句在语法上被看作一条语句C)空语句出现在任何位置都不会影响程序运行D)赋值表达式末尾加分号就构成赋值语句2、以下能正确定义且赋初值的语句是A)int n1=n2=10; B)double c=32;C)float f=f+1.1; D)double x=12.3E2.5;3、设变量x为float型且已赋值,则以下语句中能将x中的数值保留到小数点后两位,并将第三位四舍五入的是A)x=x*100+0.5/100.0; B)x=(x*100+0.5)/100.0;C)x=(int)(x*100+0.5)/100.0; D)x=(x/100+0.5)*100.0;4、以下非法的赋值语句是A)n=(i=2,++i); B)j++; C)++(i+1); D)x+=j;5、以下合法的赋值语句是A)x=y=100 B)d- -; C)x+y; D)c=int(a+b);6、有以下程序main(){ int m,n,p;scanf("m=%dn=%dp=%d",&m,&n,&p);printf("%d%d%d\n",m,n,p);}若想从键盘上输入数据,使变量m中的值为123,n中的值为456, p中的值为789,则正确的输入是A)m=123n=456p=789 B)123,456,789C)m=123,n=456,p=789 D)123 456 7897、有以下程序main(){ int m=0256,n=256;printf("%o %o\n",m,n);}程序运行后的输出结果是A)0256 0400 B)0256 256 C)256 400 D)400 4008、有以下程序{ int a=666,b=888;printf("%d\n",a,b);}程序运行后的输出结果是A)错误信息 B)666 C)888 D)666,8889、有以下程序main( ){int x=102,y=012;printf("%2d,%2d\n",x,y);}执行后输出结果是A)10,01 B)02,12 C)102,10 D)02,1010、有以下程序main(){ int a; char c=10;float f=100.0; double x;a=f/=c*=(x=6.5);printf("%d %d %3.1f %3.1f\n",a,c,f,x);}程序运行后的输出结果是A)1 65 1 6.5 B)1 65 1.5 6.5C)1 65 1.0 6.5 D)2 65 1.5 6.511、设有如下程序段:int x=2002,y=2003;printf("%d\n",(x,y));则以下叙述中正确的是A)输出语句中格式说明符的个数少于输出项的个数,不能正确输出B)运行时产生出错信息C)输出值为2002D)输出值为200312、若有以下程序段int m=0xabc,n=0xabc;m-=n;printf("%X\n",m);执行后输出结果是A)0X0 B)0x0 C)0 D)0XABC13、设有定义:long x=-123456L;则以下能够正确输出变量x值的语句是A)printf("x=%d\n",x); B)printf("x=%ld\n",x);C)printf("x=%8dL\n",x); D)printf("x=%LD\n",x);14、以下程序段的输出结果是int a=1234;printf("%2d\n",a);A)12 B)34 C)1234 D)提示出错、无结果15、若变量已正确说明为float类型,要通过语句scanf("%f %f %f ",&a,&b,&c);给a赋于10.0,b赋予22.0,c赋予33.0,不正确的输入形式是:A)10<回车> 22<回车> 33<回车> B)10.0,22.0,33.0<回车>C)10.0<回车> 22.0 33.0<回车> D)10 22<回车> 33<回车>16、有如下程序main0{ int y=3,x=3,z=1;printf("%d %d\n",(++x,y++),z+2);}运行该程序的输出结果是A)3 4 B)4 2 C)4 3 D)3 317、下列程序执行后的输出结果是(小数点后只写一位)main(){ double d; float f; long l; int i;i=f=1=d=20/3;printf("%d %ld %f %f\n", i,l,f,d);}A)6 6 6.0 6.0 B)6 6 6.7 6.7C)6 6 6.0 6.7 D)6 6 6.7 6.018、以下程序的输出结果是main( ){ int k=17;printf("%d,%o,%x \n",k,k,k);}A)17,021,0x11 B)17,17,17C)17,0x11,021 D)17,21,1119、若有以下定义和语句:int u=010,v=0x10,w=10;printf("%d,%d,%d\n",u,v,w);则输出结果是:A)8,16,10 B)10,10,10 C)8,8,10 D)8,10,1020、请读程序:#includemain(){ int a; float b, c;scanf("%2d%3f%4f",&a,&b,&c);printf("\na=%d, b=%f, c=%f\n", a, b,c);}若运行时从键盘上输入9876543210(表示回车),则上面程序的输出结果是A)a=98, b=765, c=4321B)a=10, b=432, c=8765C)a=98, b=765.000000, c=4321.000000D)a=98, b=765.0, c=4321.021、以下程序的输出结果是# includemain(){ int a=1,b=4,c=2;float x=10..5 , y=4.0 , z;z=(a+b)/c+sqrt((double)y)*1.2/c+x;A)14.000000 B)015.400000 C)13.700000 D)14.90000022、以下程序的输出结果是# includemain(){ int a=2,c=5;printf("a=%%d,b=%%d\n",a,c);}A)a=%2,b=%5 B)a=2,b=5 C)a=%%d,b=%%d D)a=%d,b=%d23、执行下面程序中的输出语句,a的值是main(){ int a;printf("%d\n",(a=3*5,a*4,a+5));}A)65 B)20 C)15 D)10二、填空题:1、以下程序运行后的输出结果是main() { int x=0210; printf("%x\n",x); }2、以下程序运行后的输出结果是main(){ char c; int n=100;float f=10; double x;x=f*=n/=(c=50);}3、以下程序运行时若从键盘输入:10 20 30<回车>。
c语言程序设计第三章答案第三章:运算符与表达式一、算术运算符在C语言中,算术运算符用于在表达式中执行各种数学运算。
常见的算术运算符有加法运算符(+)、减法运算符(-)、乘法运算符(*)和除法运算符(/)等。
1. 加法运算符(+)加法运算符用于将两个操作数相加,并返回它们的和。
例如,表达式a + b将返回a和b的和。
2. 减法运算符(-)减法运算符用于从第一个操作数中减去第二个操作数,并返回它们的差。
例如,表达式a - b将返回a和b的差。
3. 乘法运算符(*)乘法运算符用于将两个操作数相乘,并返回它们的积。
例如,表达式a * b将返回a和b的积。
4. 除法运算符(/)除法运算符用于将第一个操作数除以第二个操作数,并返回它们的商。
例如,表达式a / b将返回a除以b的商。
二、关系运算符关系运算符用于比较两个操作数并返回一个布尔值(真或假)。
常见的关系运算符有大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)和不等于(!=)等。
1. 大于运算符(>)大于运算符用于检查第一个操作数是否大于第二个操作数。
如果是,则返回真(1),否则返回假(0)。
例如,表达式a > b将返回真或假。
2. 小于运算符(<)小于运算符用于检查第一个操作数是否小于第二个操作数。
如果是,则返回真(1),否则返回假(0)。
例如,表达式a < b将返回真或假。
3. 大于等于运算符(>=)大于等于运算符用于检查第一个操作数是否大于或等于第二个操作数。
如果是,则返回真(1),否则返回假(0)。
例如,表达式a >= b 将返回真或假。
4. 小于等于运算符(<=)小于等于运算符用于检查第一个操作数是否小于或等于第二个操作数。
如果是,则返回真(1),否则返回假(0)。
例如,表达式a <= b 将返回真或假。
5. 等于运算符(==)等于运算符用于检查两个操作数是否相等。
练习3-1答案一、选择题1.在C语言库函数中,可以输出double型变量x值的函数是( D )。
A.getchar B.scanf C.putchar D.printf 2.执行语句:printf("The program\'s name is c:\\tools\book.txt");后输出是( D )。
A.The program's name is c:tools book.txtB.The program's name is c:\tools book.txtC.The program's name is c:\\tools book.txtD.The program's name is c:\toolook.txt3.以下程序的输出结果是( D )。
(注:□表示空格)main(){printf("\n*s1=%15s*", "chinabeijing");printf("\n*s2=%-5s*", "chi");}A.*s1=chinabeijing□□□* B.*s1=chinabeijing□□□*s2=**chi* *s2=chi□□*C.*s1=*□□chinabeijing* D.*s1=□□□chinabeijing* *s2=□□chi* *s2=chi□□*4.选择程序的运行结果,①是( B )、②是( B )、③是( D )、④是( C )。
#include<stdio.h>main(){int a=-10, b=-3;printf("%d\n", a%b); /*输出①*/printf("%d\n", a/b*b); /*输出②*/printf("%d\n", -a%b); /*输出③*/printf("%d\n", a-=b+++1); /*输出④*/}①A.-2 B.-1 C.0 D.1②A.-10 B.-9 C.-8 D.0③A.-2 B.-1 C.0 D.1④A.-10 B.-9 C.-8 D.-75.以下C程序正确的运行结果是( D )。
(注:□表示空格)main(){int y=2456;printf("y=%3o\n", y);printf("y=%8o\n", y);printf("y=%#8o\n", y);}A.y=□□□2456 B.y=□□□4630y=□□□□□□□□2456 y=□□□□□□□□4630y=#########2456 y=#########4630C.y=2456 D.y=4630y=□□□□2456 y=□□□□4630y=□□□02456 y=□□□04630二、填空题6.以下程序的输出结果为( i:dec=-4, otc=177774, hex=fffc, unsigned=65532 )。
main(){short i;i=-4;printf("\ni:dec=%d, otc=%o, hex=%x, unsigned=%u\n", i, i, i, i);}7.以下程序的输出结果为( c:dec=120, oct=170, hex=78, ASCII=x )。
main(){char c='x';printf("c:dec=%d, oct=%o, hex=%x, ASCII=%c\n", c, c, c, c);}8.已有定义int d=-2;,执行以下语句后的输出结果是:( *d(1)=-2*d(2)=□-2*d(3)=-2□**d(4)=177776*d(5)=□177776*d(6)=177776□**d(4)=fffe*d(5)=□□fffe*d(6)=ffffe□□* )。
(注:□表示空格)printf("*d(1)=%d*d(2)=%3d*d(3)=%-3d*\n", d, d, d, d);printf("*d(4)=%o*d(5)=%7o*d(6)=%-7o*\n", d, d, d, d);printf("*d(4)=%x*d(5)=%6x*d(6)=%-6x*\n", d, d, d, d);9.以下程序的输出结果是:( a=374 a=0374a=fc a=0xfc )。
#include<stdio.h>main(){int a=252;printf("a=%o a=%#o\n", a, a);printf("a=%x a=%#x\n", a, a);}练习3-2答案选择题1.已知:int x, y, z, w;,为使以下语句的输出为:1234+123+12+1,正确的输入形式应当为( C )。
scanf("%4d-%3d-%2d-%1d", &x, &y, &z, &w);printf("%4d+%3d+%2d+%1d\n", x, y, z, w);A.1234123121 B.1234 123 12 1 C.1234-123-12-1 D.1234+123+12+1 2.已知:int x; float y;,所用的scanf调用语句格式为:scanf("x=%d, y=%f", &x, &y);为了将数据10和66.6分别赋给x和y,正确的输入应当使( A )。
A.x=10, y=66.6<回车> B.10,66.6<回车>C.10<回车>66.6<回车> D.x=10<回车>y=66.6<回车>3.已知:int x, y; double z;,以下语句中错误的函数调用是( D )。
A.scanf("%d,%x,%1e", &x, &y, &z); B.scanf("%2d*%d%1f", &x, &y, &z);C.scanf("%x%*d%o", &x, &y); D.scanf("%x%o%6.2f", &x, &y, &z); 4.已有如下定义和输入语句,若要求a1、a2、c1、c2的值分别为10、20、A和B,当从第一列开始输入数据时,正确的数据输入方式是( AC )。
(注:□表示空格,<CR>表示回车)int a1, a2; char c1, c2;scanf("%d%c%d%c", &a1, &c1, &a2, &c2);A.10A□20B<CR> B.10□A□20B<CR>C.10A20B<CR> D.10A20□B<CR>5.已有定义int x; float y;,且执行scanf("%3d%f", &x, &y);语句时,输入数据12345□678<CR>,则x的值为( ①B ),y的值为( ②B )。
(注:□表示空格)①A.12345 B.123 C.45 D.345②A.无定义B.45.000000 C.678.000000 D.123.000000 6.阅读以下程序,当输入数据的形式为:25,13,10<CR>,正确的输出结果为( D )。
main(){int x, y, z;scanf("%d%d%d", &x, &y, &z);printf("x+y+z=%d\n", x+y+z);}A.x+y+z=48 B.x+y+z=35 C.x+z=35 D.不确定值7.根据题目中已经给出的数据的输入和输出形式,程序中输入输出语句的正确内容是( B )。
main(){int x;float y;printf("enter x, y: ");输入语句输出语句}输入形式:enter x, y: 2<CR>3.4输出形式:x+y=5.40A.scanf("%d,%f", &x, &y); B.scanf("%d%f", &x, &y);printf("\nx+y=%4.2f", x+y); printf("\nx+y=%4.2f", x+y); C.scanf("%d%f", &x, &y); D.scanf("%d%3.1f", &x, &y);printf("\nx+y=%6.1f", x+y); printf("\nx+y=%4.2f", x+y);。