程序设计基础教程(c语言版)课后答案

更新时间:2023-03-16 19:30:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

z

习 题 解 答

目 录

1.2 习题解答............................................................................................................3 1.2.1 选择题....................................................................................................3 1.2.2 填空题....................................................................................................3 1.2.3 编程题....................................................................................................4

2.2 习题解答............................................................................................................5 2.2.1 选择题....................................................................................................5 2.2.2 填空题....................................................................................................7 2.2.3 编程题....................................................................................................8

3.2 习题解答...........................................................................................................11 3.2.1 选择题...................................................................................................11 3.2.2 填空题..................................................................................................12 3.2.3 编程题..................................................................................................12

4.2 习题解答..........................................................................................................15 4.2.1 选择题..................................................................................................15 4.2.2 填空题..................................................................................................17 4.2.3 编程题..................................................................................................18

5.2 习题解答..........................................................................................................29 5.2.1 选择题..................................................................................................29 5.2.2 填空题..................................................................................................31 5.2.3 编程题..................................................................................................33

6.2 习题解答..........................................................................................................37 6.2.1 选择题..................................................................................................37 6.2.2 填空题..................................................................................................41 6.2.3 编程题..................................................................................................43

7.2 习题解答..........................................................................................................67 7.2.1 选择题..................................................................................................67 7.2.2 填空题..................................................................................................68 7.2.3 编程题..................................................................................................68

2

1.2 习题解答 1.2.1 选择题

1、B

【分析】在一个C程序中必须有且只能有一个main函数,而且main函数可以在任何地方出现.

2、C

【分析】C 语言中合法以的标识符组成为:字母,数字,下划线,且数字不能打头,亦不能为关键字。A中,-sub 不合法。B 中4d不合法。D 中void 为关键字。

3、 【分析】 4、C

【分析】转义字符中,第一个\\”输出“,第二\\\\输出\\,第三个\\b退格,把前一个\\去掉了,第四个\\?输出?,第五个\\t跳格,第六个\\”输出”,第七个\\n输出换行。

5、C

【分析】本题将10进制17,分别按8、16进制输出。8的进制21=2*8+1*1=17(10, 16制11=1*16+1*1=17(10)

1.2.2 填空题

1、主

【分析】一个C源程序中至少包括一个主函数,其他函数没有限制。 2、双引号。

【分析】两种写法都是允许的,使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找.使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。用户编程时可根据自己文件所在的目录来选择某一种命令形式。

3、261,b1

【分析】将10进制的177,按8进制和16进制两种形式输出。 4、a=3 b=7 x=8.5 y=71.82 c1=A c2=a

【分析】scanf函数中,格式说明符以外的原样输入。

5、printf函数中,格式说明符以外的原样输出。%m.nf控制输出结果中共m位,小数

3

占n位。 【分析】

1.2.3 编程题

1. #include \void main()

{ float qianmi,yingli; //定义变量 scanf(\输入数据

printf(\计算并输出数据 }

2. #include \void main() { char x;

printf(\请输出一个小写小母\\n\scanf(\

printf(\输出字母的大写型式为:%c\}

3、#include void main() {

float c,f;

printf(\请输入一个摄氏温度:\scanf(\f=32*c+9.0/5*c;

4

printf(\华氏温度为:%5.2f\\n\} 4.

#include void main() {

int a =3,b=4,c=5; float x=1.2,y=2.4,z=-3.6; double u=51274,n=128765;

printf(\printf(\

printf(\printf(\printf(\}

2.2 习题解答 2.2.1 选择题

1、C.

【分析】C语言的运算符按运算对象的个数可以分为单目、双目和三目运算符和多目运算符。

2、C.

【分析】 %运算符要求参加运算的数必须是整数

3、A . 【分析】 B.赋值运算的作用是用将常量赋给变量,而不能给表达形式 所以a*3=2 不对。 C. %运算符要求参加运算的数必须是整数,而x是float 类型所以x%(-3) 不对 。 D. y=float(i),由于i是 int 类型,向 float类型转换是自由转的,不需要强制转。

4、A .

【分析】 因为 k=7,x=12; x%=k,则x=12%7,此时x=5,而k%=5,即k=7%5此时K=2,所以(x%=k)-(k%=5)就等价于5-2=3。同理,x%=(k%=5)的值为0;x%=(k-k%5)的值为2;x%=k-k%5的值也为2

5、A.

5

【分析】首先通过n*100+0.5将原数扩大100,并通过+0.5判断是否进位。之后/100进行舍去小数点后第三位的运算。

6、B.

【分析】分析 根据优先级别,先计算小括号里,y 与3相等成立所以表达式的值为1,再将1赋给x,而x的值就是表达式的值为1.

7、A. 【分析】略 8、D.

【分析】“a大于等于10”、“ a小于等于0”两者分别为关系运算,一个“或”字又表明为逻辑或运算,所以D对。

9、B.

【分析】在逻辑表达式求解中,并不是所有的逻辑运算符都被执行,对&&运算符来说,只有前一个表达式不等于0时,才继续进行右边的运算。由于a>b为0,所以左边的表达式为0,所以右边的++n将不被计算,所以n的值不变仍为2。

10、B

【分析】241的二进制形式为11110001,15的二进制形式为00011111,进行按位&运算后为00010001;a的二进制形式为01100001,z的二进制形式为01111010,进行按位|运算后为011111011。00010001与011111011都为非0元素,所以再进行&&时结果一定为1。

11、A

【分析】b>>2表示向右移动两位,相当于除以两个2结果为8/2=4;同理,b>>1相当于除一个2,结果为6,4/6为0。

12、B

【分析】3的二进制数为00000011。10的二进制为00001010,a<<2的结果为00001100,b==1的值为0,所以00001100与0按位或之后结果为00001100。即10进进制的12。

13、D.

【分析】就运算符的优先级别而言,单目>双目,算术运算>关系运算>逻辑运算。 14、B

【分析】19的二制数为00010011,23的二进制数为00010100,两者进行按位与后结果为00010000十进制16,即为16进制的13。

15、C

【分析】0x39的二进制形式为00111001,0xf的二进制形式为00001111,两者进行异或运算,异或结算的规则,参加运算的两个二进制位同号,则结果为假,异号则为真。结果为:00110110即为16进制的36。

16、A

6

【分析】进行按位或运算,要a的低8位为1,则要求b的低8位全为1,高8位要求不变,则要求高8位全为0,即b应该为:0000000011111111,即为8进制的0377。

17、A

【分析】由题得1>2不成立,所以x>y?++x:++y表达式的值为++y,则此时Y的值为3,而++x没有被执行,所以x的仍值为1,而Z的值与表达式的值相同所以选A。

18、C

【分析】赋值运算符的作和是将一个表达式或一个变量,常量赋给另一个变量,赋值号的左边只能是变量,不能是常量,所以A、B、D不对。

19、B

【分析】逗号运算符是级别最纸的运算符,逗号表达式也是值是所有表达式中最右边的值。即a+b的值,由题从左向右算起,b++后b为6,则a+b为8.

20、D

【分析】在不同种数据类型进行计算时的转换规则是:数据类型低的全部转换成运算过程中级别最高的。在int、long、unsigned和char四个类型中,long的类型级别最高,所以结果的类型为long.

2.2.2 填空题

1. -17.5

【分析】“/”要求两操作数如果一个为实数结果都为实数,如果都为整数结果也为整数,所以a/4.0=2.5,a/4=2.所以原式=2.5-2*10=-17.5。

2. 5,32

【分析】x++表示将x的值拿来用,然后再++;而y*=x++等价于y=y*x,即y=8*4=32,此计算结束之后x 的值才增加1,变为5。

3. -40

【分析】赋值运算符的结合方向是从右向左的,所以先计算a*a=25,所以a+=a-=a*a等价于a+=(a-=25),而此时a仍为5.接下来计算a-=25得a=2-25=-20;则a+=(a-=25)等价于a+=-20,所以a=a-20=-20-20=-40。

4. 16

【分析】x+=--x%--y等价于x+=(--x)%(--y),--放在变量的前面时,要先对变量进行变化,然后再用,所以原式即为x+=14%3,而14%3=2,即x+=2,而此时x=14,所以x=x+2=16。

5. x>1&&x<10 ||x<0&&x!=-1 【分析】略 6. 0

7

【分析】根据运算符的优先级别,算术运算>关系运算>逻辑运算可知,要先算a+b=7,接下来计算7>c即7>5成立为1,然后计算b==c,而4==5不成立,所以值为0,即最终表达式等价于1&&0,所以结果为0.

7. 0

【分析】略,同第6题。 8. -17

【分析】条件运算符优先级别高于赋值运算符,所以先算(a

9. 18, 3,3

【分析】对逗号表达式的值,即为从左向右最后一个表达式的值 ,本题中表达式的值即为6*a的值即18。

10. 3.5 【分析】算术运算符中同一级别的运算符按从左向右的顺序进行,所以先算aC=8,再计算8*(int)(x+y)=8*9=72,再计算72%3=0,再计算0/5=0.最后计算与X相加,所以最终结果为3.5。

2.2.3 编程题

1. 编写一个程序,要求输入圆的半径r,计算并输出该圆的周长和面积。

#define PI 3.14 #include \void main() {

float r, S=0, L=0; printf(\scanf(\

S= PI *r*r; //计算圆面积 L=2* PI *r; //计算圆周长 printf(\}

2. 假设美元与人民币的汇率是1美元兑换6.4742元人民币,欧元与人民币的汇率是1欧元兑换9.2338元人民币,编程实现输入人民币的钱数,输出能兑换的美元及欧元金额。

# include \void main() {

float renminbi,meiyuan,ouyuan;

8

printf(\scanf(\

meiyuan = renminbi *6.4742; //计算美元金额 ouyuan = renminbi *9.2338; //计算欧元金额

printf(\}

3. 编写一个程序,从键盘上输入3个字符后,按各字符的ASCII码从小到大顺序输出这些字符。

//这道题关键是把输入3个字符后的回车过滤掉,不然回车就会成为下一组的第一个字符。有两种方法:

//第一种:

#include int main() {

char a,b,c,tmp;

while((a=getchar())!=EOF) {

b=getchar(); c=getchar();

getchar(); //在录入c后用getchar()滤掉回车 if(a>b) { tmp=a; a=b; b=tmp; } if(a>c) { tmp=a; a=c; c=tmp; } if(b>c) { tmp=b; b=c; c=tmp; }

printf(\}

return 0; }

//第二种:

#include int main()

{ char a,b,c,tmp;

9

while(scanf(\用\空字符,不存储字符的字符)滤掉回车

{ if(a>b) tmp=a,a=b,b=tmp; //逗号表达式,简洁 if(a>c) tmp=a,a=c,c=tmp; if(b>c) tmp=b,b=c,c=tmp; printf(\

}

return 0;

}

输入数据有多组,每组占一行,有三个字符组成,之间无空格。 例如输入 qwe asd zxc

输出 e q w a d s

c x z

4. 编程实现输入一个无符号整数(unsigned类型),分别输出它的低四位和高四位。

#include (待查) main() {

unsigned u=0xffff;//举例 unsigned char l,h; //scanf(\

l=u&0xff; //得到低8位. h=u>>8; //得到高8位

printf(\getchar(); }

5. 根据当前银行的利率表,编程实现从键盘输入存款金额money,存期year和年利率rate,计算银行存款的本息sum(保留1位小数)。

#include int main() {

int year;

float money,rate,sum;

printf(\请输出金额,利率,存款时间\\n\scanf(\sum=money*year*rate;

printf(\存款的本息sum=%.1f \\n\

10

}

3.2 习题解答 3.2.1 选择题

1.D

【分析】在此要注意,else总是于之前面最近的且没有用过的if进行配对,所以在本题中,else与第二个if 配对,且整体做为第一个if语句的语句体。又因,10>20不成立,所以第一个if 根本不被执行,所以m的值没有任何变化。

2. A

【分析】else总是于之前面最近的且没有用过的if进行配对,所以在本题中,

if (a>b) t=s+t; else if (a==b) t=5; else t=2*s;

相当于t=s+t;(a>b) t=5 (a=b); t=2*s(a

【分析】while(E)的含义是当E为真。为真即为不等于0,而A、B、D 都是表示非零。 4. D

【分析】i=0,++i 后,i 为1,i%2=1,所以执行j+=i;即j=1,i=1小于5所以还执行++i,此时 i为2,则i%2等于0,跳出本次判断。同理当i 等于4 ,6时同样跳出判断,而当i为3,5时,都要执行j+=i。

5. A

【分析】while (1)进行判断时,条件永远成立,所以执行循环体。输出一个“*”后,i++,i变为1,又1<3成立,所以结束循环。

6. D

【分析】当i=1时,执行s+=i 后s=1;执行循环体中i++后,i为2,而后还要执行一次for结构中的i++,则i为3.3小于6成立,则再执行s+=i; i++;则s为4, i为4, 而后还要执行一次for结构中的i++,则i为5,同样5小于6成立,则再执行s+=i; i++;则s为9, i为6, 而后还要执行一次for结构中的i++,则i为7,且7小于6已不再成立。所以最后输出9 7

7. B

【分析】在for(语句1;语句2;语句3)结构中,语句1为初值,语句2为循环体执行的条件,语句3为变量自增语句。本题中i为2,i==0不成立,所以循环体不被执行。

8. D

11

【分析】a=1,a<8成立 ,所以执行循环体b+=a;a+=2;后,a=3, b=3,再执行 for结构中的a++, 则a=4,b=3.以后同理。

9. B

【分析】当a=1时b=1,执行循环体,b>=20不成立, b%3==1成立,则执行b+=3;continue;则b=4,然后跳出本次行循环,则此时a=2,b=4.以后同理进行判断。

10. A

【分析】对于双重循环,外层循环变化一次,内层变化一个循环。本题。当i=1时,j可以为3、2、1,同理当当i=2时,j可以为3、2、1;当i=3时,j可以为3、2、1;而语句if (i*j>3) break; 则表时,如果i*j>3时结束整个for循环。条件不成立时再执行m*=i*j;

3.2.2 填空题

1. hn*2

【分析】sn为第n次落地时共经过的米数,hn为第n次反弹的高度n>=2 ,hn*2才为第n次经过的距离。

2. n!=0 j++

【分析】由输出语句可知,定义的变量i,j 分别用于存放正数和负数的个数。 所以只要输入的数不是0,则进行判断。

3. 0 k/10 count++

【分析】count 作为累计的和所以初值一定为0;而while循环的作用是将指定的数k的各各位上的字数字取出来。k负责实现取出K的个位。则前两位则需通过k/10来实现。if (t==10)成立即是需要的数字,则总数需要自增。所以count++.

4. 50 (i*1.0)

【分析】本题的累加问题中,累加50次,即i<=50,两个相除时如果都为整数则结果一定为整数,为此,需要将分母转化成FLOAT 类型。所以填(i*1.0)。

5. 2*i-1 printf(\【分析】略

3.2.3 编程题

1. 编写一个程序,计算并输出下列分段函数值:

222

26,356010,2,3153,2,3,10xxxxyxxxxxxxxxxx?+?<=≠?=?+≤<≠≠????=?==≥?

12

其中,x从键盘输入。 #include\int main() {

float x,y;

printf(\输入X\scanf(\printf(\if (x<0 &&x!=-3) {

y=x*x+2*x-6; }

else if (0<=x&&x<10&&x!=2&&x!=3) {

y=x*x-5*x+6; } else

y=x*x-x-15;

printf(\}

2. 编写一个程序,从键盘输入年和月,计算并输出该年的该月份共有多少天。 算法分析:要考虑大月有31天,小月有30天,闰年的二月有29天以及非闰年的二月有28天这几种情况。

源程序:#include int main() {

int year,month,days;

printf(\scanf(\switch (month) {

case 1: case 3: case 5: case 7:

case 8: case 10: case 12: /*处理\大\月*/ days=31;break;

case 4: case 6: case 9: case 11: /*处理\小\月*/ days=30;break;

case 2: /*处理\平\月*/

if (year%4==0&&year0!=0||year@0==0) days=29; /*如果是闰年*/

13

else days=28; /*不是闰年*/ break;

default: printf(\月份输入错误*/ days=0; }

if (days!=0) printf(\

return 0; }

3. 编写一个程序,计算并输出下列级数之和:

23

1...2!3!!nxxxxexn=+++++

其中n与x从键盘输入。 #include\#include \main() { int i,n;

double s=1.0,s1=1.0,x; scanf(\for(i=1;i<=n;i++)

{s1=s1*i; /*各项中的阶乘*/

s=s+pow(x,i)/s1; /*按公式求出*/ }

printf(\}

4. 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

#include\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++; //i为字符数 else if(c>=48&&c<=57) j++; //j为数字数 else if(c==32) k++; //k为空格数 else l++;} //l为其他字符

printf(\}

5. 编写一个程序,解决猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个;以后每天早上都吃了前一天剩下的一半零一个;到第10天早上想再吃时,只剩一个桃子了。问猴子第一天共摘了多少桃子?

14

#include\main()

{int i=1,sum=0; for(;i<=10;i++) sum=2*sum+1;

printf(\}

4.2 习题解答 4.2.1 选择题

1. D

【分析】 定义一维数组的语法格式为“类型标识符 数组名[整型常量表达式] ;”,其中“整型常量表达式”是用来说明数组元素的个数,可以是整型常量、整型常量表达式或符号常量,但不能包含变量。选项A用圆括号定义数组a,是错误的;而选项B和C中,用变量n来说明数组a长度,是错误的。

2. C

【分析】 一维数组的初始化的语法格式为“类型标识符 数组名[整型常量表达式]={常量1,常量2,...常量n} ;”,所赋初值放在赋值号后的一对花括号中。选项A把初值放在一对圆括号内,是错误的;选项B花括号中没有初值,而且语句没有“;”,是错误的;选项D中初值没有用花括号括起来,是错误的。

3. B 【分析】 选项A定义数组art有5个元素,而花括号中只提供2个初值,分别赋值给art[0]和art[1],其余元素自动赋值为0;选项B通过花括号的初值确定数组art有2个元素;选项C和D定义的数组art是等价的,表示含有5个元素,其值分别为“89、-23、0、0、0”。

4. A

【分析】 C语言中,二维数组排列的顺序是“按行存放”的,即先存放第0行的元素,再存放第1行的元素,以此类推。

5. B

【分析】 C语言中,二维数组是“按行存放”的,元素a[i][j]前面存放了i行,共i*m个元素,在第i行的第j列前面有j个元素,因此元素a[i][j]前的元素个数为i*m+j。

6. D

【分析】 选项A定义了a是一个1行4列的二维数组,但初值{1,2,3,4,5}却是1行5列,是错误的;选项B在初始化语句中省略了第二维的长度,是错误的;选项C定义了b是一个2行3列的二维数组,但初值{{1},{1,2},{1,2,3}}却是3行,是错误的;选项D省略了第一维的长度,第二维长度为3,因此选项D等价于“double y[1][3]={0};”。

7. D

【分析】 字符串\占9个字节,其中字符串结束标志'\\0'多占用了1个字节。选项A、B和C都只定义了8个元素的字符数组,是错误的。

15

8. D

【分析】 语句“char a[]=\”定义了一个字符数组,并字符个数确定数组的长度,而\使以字符'\\0'为结束标志的一个字符序列,共7个字符,因此数组a长度为7;而语句“char b[]={'A','B','C','D','E','F'};”则定义了长度为6的字符数组,因此a数组比b数组长度长。

9. B

【分析】 格式说明符“%.4s”可以用来输出字符串中前4个字符,因此选项B正确。

10. B

【分析】 字符串输入函数gets(),其语法格式为“gets(字符数组名)”,选项A包含2个字符数组名,是错误的;选项D中gets函数的参数是字符串,也是不正确的; scanf函数使用%s格式说明符进行字符串输入,其输入项为数组名,选项C在数组名a和b前加“&”符号,是错误的。

11. D

【分析】 strcmp(s1,s2)将字符串s1和s2自左向右按字符的ASCII码值逐对进行比较,直到出现不同的字符或遇到'\\0'为止,如果s1等于s2,则strcmp(s1,s2)等于0;如果s1大于s2,则strcmp(s1,s2)大于0;如果s1小于s2,则strcmp(s1,s2)小于0。

12. C 【分析】 字符串复制函数strcpy(str1,str2)将字符串str2同串结束标志'\\0'复制到字符串str1中,函数返回str1的指针。字符串连接函数strcat(str1,str3) 将字符串str3连接到字符串str1之后。因此本题答案为选项C。

13. A

【分析】 结构体变量占内存的大小是该结构体各成员所需内存量的总和。

14. D

【分析】 程序中定义了一个结构体数组cnum[2],包含2个元素,并将初值{1,3,2,7}依次赋值给cnum[0].x、cnum[0].y、cnum[1].x和cnum[1].y。因此,表达式“cnum[0].y/cnum[0].x*cnum[1].x”的值为6。

15. C

【分析】 将初值{\}分别赋值给c[0].name、c[0].age、c[1].name、c[1].age、c[2].name、c[2].age、c[3].name、c[3].age,因此选项C能够打印出Mary。

16. C

【分析】程序中定义了一个共用体类型的变量u1,共用体各成员共同使用4字节内存空间,初值u1.c=?A?,所以u1.n=65,输出是以%c格式符输出的,因此本题答案为选项C。

17. D

【分析】变量a是一个结构体类型,所占内存的大小是该结构体各成员所需内存量的总和。整型变量c占4字节内存,共用体类型变量k占内存的大小是该共用体中最大的一个成员j所占用的内存量,为4字节,因此本题答案为选项D。

18. A 【分析】变量u是一个共用体类型变量,共用体类型变量u占内存的大小是该共用体中最大的一个成员c所占用的内存量共4个字节,共用体的所有成员公用一个存储空间,同一时间只能存储一个成员,并且所引用的是最后一次存入成员的值。因此本题答案为4,34,12。

16

19. B

【分析】选项A定义枚举类型不能使用“=”,是错误的;选项C定义枚举类型时,花括号中的一些名字是程序设计者自己指定的,命名规则与标识符相同。无固定含义,只是一个符号。选项C中以数字作为标识符是错误的,选项D有双引号是错误的,因此本题答案为选项B。 20. B

【分析】选项A的正确定义语句为typedef char *STRING[255]; 选项C的正确定义语句为typedef char STRING; 选项D的正确定义语句为typedef char *STRING; 因此本题答案为选项B。

4.2.2 填空题

1. 0 4

【分析】二维数组x[3][5]由3行5列组成,行列下标都从0开始,即元素从x[0][0]开始到x[2][4],因此最小行下标为0,最大列下标为4。

2. a[k]!=y

【分析】while循环用于访问a数组中的每个元素,从最后一个元素到第一个,直到一个等于y的元素被找到为止,如果查找成功,输出下标值k,否则继续查找,直到数组元素全部查找一遍。因此while循环的条件为a[k]!=y。

3. &a[i] i%4==0 printf(\

【分析】scanf语句要求给数组a中的每个元素赋初值,因此为&a[i];程序要求以每行4个数据的形式输出a数组,在for循环语句中加入条件判断语句,如果一行输出4个元素(i%4==0)则打印输出一个回车换行符printf(\。

4. j=2 j>=0

【分析】前一个嵌套的for循环输出数组a主对角线上的元素之和。后一个嵌套的for循环输出数组a次对角线上的元素之和。次对角线上的元素满足的特点是行下标和列下标的和为2,内层for循环第三条语句为j--,所以j的初值为2,条件为j>=0。

5. s[len]!= '\\0'

【分析】本程序是输出字符数组s中存放的字符串的长度,从s[0]开始,向后搜索,每搜索一个元素,len增1,直到遇到字符串结束标志?\\0?为止。重复过程结束。这时,len中所保存的就是s中有效字符的个数。

6. str[0] s 【分析】strcpy(s, str[0])函数是将字符串str[0]复制到字符数组s中,先假设字符串str[0]中存放的是三个字符串中最小的,strcmp()函数是将两个字符串比较,总把最小的字符串放到s中。最后输出s。

17

7. 12

【分析】结构体变量占内存的大小是该结构体各成员所需内存量的总和。结构体类型struct date中共定义三个成员都为int类型,共占12个字节。

8. person1.birthday.year=1982

【分析】嵌套结构体类型定义变量,采用逐级访问的方式对变量赋值。式中的圆点“.”称为成员运算符。

9. 4 8

【分析】共用体类型的所有成员公用一个存储空间,同一时间只能存储一个成员,并且所引用的是最后一次存入成员的值。则e.in.x=2*2=4; e.in.y=4+4=8;

10. 1 6

【分析】枚举类型变量的值是一些整数,从花括号的第一个名字开始,系统自动赋予从0开始的值。Red=0,yellow=1;若在定义类型时对枚举常量进行了初始化,则按照初始化的值计算,blue=4,green=5,white=6。

4.2.3 编程题

1. 编写一个程序,计算Fibonacci数列的前15个数,并将其存储到一维数组fib中,然后输出结果。Fibonacci数列的定义为:

1101121>==?????+=??nnnFFFnnn

【问题分析】 【程序代码】 #include int main() {

int fib[15]={1,1}; int i;

for (i=2;i<15;i++)

fib[i]=fib[i-1]+fib[i-2]; for (i=0;i<15;i++) printf(\printf(\return 0; }

2. 有一个已经排好序的数组,编写一个程序,实现输入一个数,并按原来排序次序将该数插入到数组中。

【程序代码】

18

22

for (j=0;j<5;j++)

if ((i==0)||(i==4)||(j==0)||(j==4)) sum=sum+a[i][j];

printf(\矩阵最外圈元素的合计值为%d\return 0; }

8. 输入一个字符串,编写一个程序,统计其中有多少个单词,单词之间用空格分隔。

【程序代码】 #include int main() {

char str[100];

int i,num=0,word=0; char c;

gets(str); //输入一个字符串给字符数组str

for (i=0;(c=str[i])!='\\0';i++)//只要字符不是'\\0'就继续执行循环

if (c==' ') word=0;//如果是空格字符,使word置0

else if (word==0){ //如果不是空格字符且word原值为0 word=1; //使word置1

num++; //num累加1,表示增加一个单词 }

printf(\字符串中单词数为:%d\输出单词数 return 0; }

9. 输入一个字符串,编写一个程序,将该字符串中的所有大写字母转换成相应的小写字母,所有小写字母转换成相应的大写字母。

【程序代码】 #include int main() {

char str[100]; int i=0;

printf(\gets(str);

while (str[i]!='\\0'){

if ((str[i]>='A')&&(str[i]<='Z')){ str[i]=str[i]+32; i++; }

else if ((str[i]>='a')&&(str[i]<='z')){ str[i]=str[i]-32; i++; }

23

else i++; }

printf(\puts(str); return 0; }

10. 输入两个字符串str与substr,编写一个程序,删除主字符串str中的所有子字符串substr。

【程序代码】 #include #include int main() {

char str[100],substr[100];

char t[100]={'\\0'},s[100]={'\\0'}; int i=0,j,k=0,len;

printf(\请输入主字符串:\\n\gets(str);

printf(\请输入子字符串:\\n\gets(substr);

len=strlen(substr);// while (str[i]!='\\0'){ for (j=0;j

if (strcmp(t,substr)==0){ i=i+len; continue; }

s[k]=str[i]; k++; i++; }

s[k]='\\0'; strcpy(str,s); puts(str); return 0; }

11. 编写一个程序,输入N个学生的学号、姓名和成绩,每个学生有三门课程的考试成绩,查询总分高于240和任意一科不及格的学生,并输出查询结果。

【程序代码】 #include const int N=3;

struct student // 声明一个结构体类型struct student {

24

int num;

char name[10];

int score[3]; //3门课程成绩 };

int main() {

struct student stu[N];//定义含N个元素结构体数组 int i,j,sum,flag;

printf(\请输入学生的学号、姓名和成绩:\\n\//以下输入N个学生的学号及他们的3门课程的成绩 for (j=0;j

scanf(\for (i=0;i<3;i++)

scanf(\}

//查询总分高于240和任意一科不及格的学生 printf(\满足条件的学生的学号和姓名:\\n\for (j=0;j

for (i=0;i<3;i++){ sum+=stu[j].score[i];

if (stu[j].score[i]<60) flag=1; }

if ((sum>=240)||(flag==1))

printf(\}

return 0; }

12. 采用结构体类型编写一个程序,实现输入三个学生的学号以及数学、语文、英语成绩,然后计算每位学生的总成绩以及平均成绩并按总分由大到小输出成绩表。

【程序代码】 #include

struct student // 声明一个结构体类型struct student {

int num;

int score[3]; //3门课程成绩 int total; float avg; };

int main() {

struct student stu[3],temp;//定义含3个元素结构体数组 int i,j,k;

本文来源:https://www.bwwdw.com/article/qxuv.html

Top