第三章作业程序控制结构Word格式.docx
《第三章作业程序控制结构Word格式.docx》由会员分享,可在线阅读,更多相关《第三章作业程序控制结构Word格式.docx(23页珍藏版)》请在冰豆网上搜索。
实验二字符数据输入/输出
学习字符数据的输入与输出,学习getchar()/putchar()函数使用。
用getchar()函数输入两个字符给c1、c2,然后分别用putchar()分别输出这两个字符,再输出它们的ASCII。
程序以3_2.c命名。
【思考】
能否将输入的两个字符转换大小写后再一次输出?
即输入是大写字符则输出对应小写字符,输出小写字符则输出对应的大写字符。
实验三复数乘法
学习格式化输入/输出操作。
编写程序读入两个复数并输出这两个复数的乘积。
输入输出如下图。
程序以3_3.c命名并上交。
程序运行时用户只须输入两个复数的实部与虚部。
两个复数的乘积仍然是一个复数,复数的乘法按照以下法则进行:
设z1=a+bi,z2=c+di(a、b、c、d∈R)是两个任意复数,则它们的积为:
(a+bi)(c+di)=(ac-bd)+(ad+bc)i。
【提示】
程序运行时屏幕首先显示:
输入5,回车后屏幕再次给出输入提示virtualpart:
输入3,回车后屏幕显示该复数,并给出输入第二个复数的提示。
输入第二个复数的实部与虚部,最后输出这两个复数相乘得到的第三个复数。
注意,数学概念中的复数a+bi是一个非实型数据,在C语言中是没有复数类型的,因此没有办法定义一个变量来保存一个数学概念中的复数。
为描述并记录复数,我们在此用两个float类型的变量分别记录一个复数的实部与虚部,用这两个变量描述一个数学概念中的复数。
显示时以×
×
+×
i的方式展示数据。
具体说,计算机内是没有复数类型的,程序中用两个实型数据描述一个复数。
复数的计算实质是对实部与虚部的计算,结果放在相应表示复数实部与虚部的变量里。
第二部分分支结构程序设计
实验一大小写转换
熟悉关系与逻辑运算,了解if-else的顺序与嵌套层次关系。
下面程序希望完成大小写字母转换功能。
若输入一个大写字母,则转化为小写输出;
若输入小写字母则转化为大写输出;
对其他字母则原样不变输出。
程序以3_4.c命名,运行程序,分别输入一次大写、一次小写字母、一次‘#’进行验证。
如果程序有错,请改正。
{charch;
ch=getchar();
if('
a'
<
=ch<
='
z'
)ch-=32;
A'
Z'
)ch+=32;
putchar(ch);
putchar('
\n'
实验二算术运算
学习if~else、switch语句的使用。
键盘输入一个算术的运算式子,输出运算结果。
这里我们规定可以接收五个算术运算的符号:
+、-、*、/、^(乘方)。
程序以3_5.c命名并上交。
下图是输入输出的示意图:
输入一个加法的算术式:
输入一个除法的算术式:
输入一个乘方的算术式:
求3的平方根:
【实验提示】
本程序需要从键盘接收一个表达式,根据表达式中的运算符号实现相应的运算并将结果保存下来并输出。
C语言本身是没有乘方运算符的,可以调用数学函数pow(x,y)求x的y次方。
注意一定要包含<
math.h>
。
输入的表达式实质是按多个不同类型的数据来获取数据的。
程序中需要定义多个变量来接收表达式中包含的数据与运算符,并设计相应的输入/输出函数实现。
实验三金额计算
学习分析与解决实际问题的能力,综合嵌套使用if~else或switch语句。
某服装店经营套服。
以50套为限,若购买数量不少于50套,每套80元;
不足50套时每套90元;
单买上衣每件60元,单买裤子每条45元。
若购买金额大于10000元,则超过10000元部分可以打九折。
编写金额计算程序,实现:
键盘读入所买上衣c和裤子t的数量,计算应付款总额。
程序以3_6.c命名并上交。
实验四利息计算
综合使用选择结构语句,解决实际问题。
RMB现期银行整存整取利率如下表:
时间
年利率(%)
活期
0.72
半年
2.43
一年
3.15
二年
3.5
三年
4.70
五年
5.70
编写程序,要求输入存款总额(以元为单位)与存款期限(以月为单位),计算并输出到期时的利息总额、利息税(20%)与实得利息。
两档期限之间以活期计算,如存款期限为50个月,则36个月按3.96%计算利息,14个月按0.72%计算利息。
程序以3_7.c命名。
实验五判断天数
熟练使用switch语句,并设计精巧程序。
按yyyy-mm-dd格式输入一个日期,如2004-10-31,判断这是这一年的第几天。
程序以3_8.c命名并上交。
以2004-10-31为例,先把前九个月的天数加起来,然后再加上31天。
需要考虑的是,当年是闰年,2月为29天,否则2月为28天。
也可以2月固定按28天计算,当年是闰年且月份大于2时,多加一天。
第三部分循环程序设计
1.循环设计
循环是在循环条件为真时重复执行一组循环体语句的控制结构,是计算机解题的一个基本结构。
循环控制有两种基本方法:
计数法和标志法。
(1)计数器控制的循环
事先准确地知道循环次数,因此设计一个循环控制变量,由变量值来控制循环次数。
每循环一次,循环变量的值会递增(增值通常为1或-1),当其值达到终值时结束循环。
(2)标志控制的循环
事先不知道准确的循环次数,由某一目标值标记循环的结束。
如,例3-23中以变量sum的值达到标记值1000作为循环的结束,例3-24中就是以键盘输入一个负数为标记结束循环。
2.基本算法
程序设计的首要工作是算法设计,离开了算法也就没有了程序。
算法,是指完成某一项工作而采取的方法和步骤,具体到程序设计,是对解题过程的准确而完整的描述,并用一种程序设计语言的来实现。
循环主要用来解决程序设计中两类基本的算法:
穷举和迭代。
1.穷举算法
穷举的基本思想是对问题的所有可能状态一一测试,直到找到解或将全部可能状态都测试过为止。
穷举是一种重复型算法,其核心是设计循环,在循环体中依次测试。
例3-26输入两个正整数x和y,求其最大公约数。
{
intx,y,i,flag;
flag=1;
/*flag是标志变量,当其值为0时表示已找到公约数*/
Pleaseinputtwonumbers:
%d%d"
x,&
y);
for(i=x<
y?
x:
y;
flag==1;
)
if(x%i==0&
&
y%i==0)flag=0;
/*条件满足,就改变标志变量的值*/
elsei--;
printf("
greatestcommondivisor=%d\n"
i);
两个数中的小者到1之间任何一个数都有可能是公约数,因此用变量i从大到小一一穷举,直到找到为止。
若两数互质,当i==1时也能使条件满足。
2.迭代算法
按照特定规律和方法,重复地由旧值递推出新值,并由新值代替旧值,直至问题解决为止,这种解决问题的方法为迭代。
迭代的关键因素是:
迭代初值、迭代公式和迭代次数(精度要求)。
例3-27使用辗转相除法求两数的最大公约数。
辗转相除法:
如果x除以y的余数为0,则除数y就是最大公约数,或余数不为0,则被除数x被除数y取代,除数y被余数取代,再用新的x除以新的y,判断余数是否为0,如果不为0,则重复此迭代过程,直至余数为0,此时的除数y即为最大公约数。
intx,y,temp;
temp=x%y;
while(temp!
=0)
x=y;
/*迭代*/
y=temp;
/*迭代*/
运行时输入:
66121
输出:
greatestcommondivisor=11各值的变化如下:
xytemp=x%y
6612166
1216611
66110
实验一简单的循环设计
学习设计一个循环,能进行循环变量的初始化,循环条件的设计与循环变量值的修正。
编写程序,输入一个整数x,按下式输出对应的y值。
程序以3_9.c命名并上交。
【指导】
简单循环结构,通常方法是设计一个循环变量i,让其在初值与终值之间变化控制控制循环实现,循环条件通常是:
i≤终值。
如:
for(i=初值;
i≤终值;
i=i+步长)
循环体语句;
实验二整数按位折分求和
学习设计与控制循环,并熟练%(求余)运算。
输入一个不大于2×
109(用long型数据)的正整数x,求这个数每位数字之和。
例如,若输入33456781,输出37。
程序以3_10.c命名。
设计循环,每次求出x的个位数(使用求余运算)并累加到和值变量中,再迭代操作,改变x的值,使原来的十位变个位。
【讨论与思考】
long型数据的最大值是2147483647,受变量类型限制,本程序只能接收不大于2×
109的正整数。
如果进行扩充,要求能接收并计算一个30位整数的各位之和,那么数据类型应如何设置,程序应该如何编写?
实验三最值求解
学习在多个数据中求取最大最小值,并设计用控制的循环。
键盘输入一组学生成绩,输入以-1作为输入的结束。
统计这批数据的最大值,最小值,平均值。
程序以3_11.c命名并上交。
这里的循环并不由循环变量的值来进行控制了,需要根据输入的数据来控制循环,并需要设计变量来统计循环执行的次数。
实验四打印数字塔图形
学习使用循环语句构成的多重循环嵌套。
编写程序,使用循环输出如下图所示的数字塔图形。
程序以3_12.c命名。
此图形上下对称,可将程序分为上下两部分实现。
上半部输出9行,下半部输出8行。
每一行包含三部分内容:
开始的空格、中间的数字及最后的换行符。
需要考虑的是字符个数与行号的关系。
下面程序用于输出如下*字符塔,供本题参考。
{inti,j;
clrscr();
/*清屏*/
for(i=1;
i<
=9;
i++)/*行循环*/
{for(j=1;
j<
=9-i;
j++)/*输出行左空格*/
printf("
"
for(j=1;
=2*i-1;
j++)/*输出若干*字符*/
%c"
'
*'
\n"
/*换行*/
实验五寻找素数
领会并牢固掌握素数算法,深入循环结构设计。
从键盘输入一个大于3的正整数,输出距离该数最近的素数。
根据输入的数不同,此问题可能有一个答案(或者比输入的数大或者比输入的数小),也可能需要输出两个值(一个比输入的数大,一个比输入的数小,两个距离输入的数一样近)。
程序以3_13.c命名并上交。
实验六不等式求解
学习在循环中使用break控制语句。
键盘输入一个数给m,计算并返回满足表达式:
1+(1+2)+(1+2+3)+(1+2+3+4)+……+(1+2+3+……+n)<
=m最大的n。
例如,当m=10000时,程序输出:
n=38。
程序以3_14.c命名并上交。
参考解法:
for(i=1;
1;
i++)/*循环条件为恒真*/
{计算(1+2+3+……+i)→s;
将计算结果s累加到变量sum中;
判断sum的值是否大于m
是,则终止循环
否,则继续进入下一次循环
}
输出与对应结果,其值会与i相关。
实验七最佳方案寻找
穷举算法与最佳方案算法设计与训练。
一根长度为235m的材料,需要截成长度为19m和23m的短料,编程设计最佳截取方案,即求两种短料各截成多少根时,剩余的材料最少?
程序以3_15.c命名并上交。
实验八礼炮响声统计
学习循环中条件的设计与数据统计。
活动中有三门礼炮,各装有十枚炮弹。
第一门礼炮每隔3秒发一枚炮弹,第二门每隔5秒、第三门每隔7秒发一枚炮。
问观礼群众一共听到几声炮响。
三门炮的第一发炮弹是同时发出的,同一时间发出炮声算一响。
程序以3_16.c命名并上交。
程序中可分别设置计时器变量与计数器变量。
计时器以秒为单位递增,测试此时有无炮发出。
只要有一枚炮发出,则计数器增1。
注意不要重复统计。
实验九验证哥德巴赫猜想
综合运用多重循环结构、标志法、穷举法解决问题。
【问题描述】
1742年6月,德国数学家哥德巴赫在给大数学家欧拉的信中提出一个问题:
任何大于4的偶数均可以表示为两个素数之和吗?
欧拉复信道:
任何大于4的偶数均可以表示为两个素数之和,这一猜想我还不能证明,但我确信无疑地认为这是完全正确的定理。
哥德巴赫猜想是世界著名的数学难题,至今未能在理论上得到证明,自从计算机出现后,人们就开始用计算机去尝试解各种各样的数学难题,包括费马大定理、四色问题、哥德巴赫猜想等,虽然计算机无法从理论上严密地证明它们,只能在有限的范围内对其进行检验,但也不失其意义。
程序要求:
输入一个int型数据范围内的偶数x(x>
4),找到两个素数a、b,满足x=a+b。
最后输出此等式。
如输入98,输出98=19+79。
程序以3_17.c命名。
读入偶数x,找出一对数a、b满足x=a+b,测试a、b是否都为素数,若不满足,则找下一对a、b继续测试,直到a、b均为素数为止。
算法描述如下:
读入x;
a=3;
while(a<
x/2)
{b=x-a;
测素数循环,测试a是否为素数;
测素数循环,测试b是否为素数;
if(a、b同为素数)
退出while循环;
a+=2;
/*a在奇数上穷举*/
if(a<
验证成功,输出x=a+b;
else验证失败,输出失败信息;
为了判断a、b是否是素数,可以设置两个二元标志变量flag_a和flag_b,其值为1时表示对应变量是素数,其值为0时表示变量是非素数。
令flag_a和flag_b的初始值为0,代表开始时假设a、b都不是素数,然后进入测试循环。
若测素数循环检测a是素数,则改变flag_a=1;
若b是素数,则令flag_b=1。
则if(a、b同为素数)可以表示为if(flag_a*flag_b!
=0)。
实验十计算立方根
练习迭代算法,学习几种解一元高次方程的方法。
键盘输入一个实数a,输出它的立方根。
请自行设计算法编写程序,不允许调用pow函数。
程序用3_18.c命名。
假设a的立方根为x,则
,问题转化为求一元高次方程
的解。
应用教材介绍的牛顿迭代法解一元高次方程可以比较快捷的得到近似解。
实验十一斐波那契(Fibonacci)数列
练习迭代算法,了解斐波那契(Fibonacci)数列。
输出[m,n]范围内的所有斐波那契(Fibonacci)数,m,n这两个数由键盘输入。
程序用3_19.c命名并上交。
1,1,2,3,5,8,13,21,34,……这是斐波那契(Fibonacci)数列的前几项。
斐波那契数列的特点:
前两项均为1,后面任意一项都是其前面两项之和。
本实验虽然只要求输出在[m,n]范围内的斐波那契数,但是依然需要从第1个Fibonacci数开始依次得到下一个,并判断是否是需要输出的那个。
习题三
第一部分:
输入与输出
1.已有如下定义和输入语句,若要求a,b,c1,c2的值分别为5、6、A和B,当从第一列开始输入数据时,正确的数据输入方式是______(<
CR>
表示回车)。
inta,b;
charc1,c2;
%d%c%d%c"
a,&
c1,&
b,&
c2);
A)5A6B<
B)5A6B<
C)5A6B<
D)5A6B<
2.以下说法正确的是_______。
A)输入项可以为一个实型常量,如scanf(“%f”,3.5);
B)只有格式控制,没有输入项,也能正确输入,如scanf(“a=%d,b=%d”);
C)当输入实型数据时,格式控制部分应规定小数点后的位数,如scanf(“%4.2f”,&
f);
D)当输入数据时,必须指明地址,如scanf(“%f”,&
E)可以采用不同的格式符,实现对一个实型数据以八进制或十六进制形式输入/输出。
F)整型数据不能使用%f或%lf格式符。
3.若a是int型变量,则表达式(a=5*6,a*3),a+8的值是_________。
4.若有定义:
intb=7;
floata=2.5,c=4.7;
则表达式a+(int)(b/3*(int)(a+c)/2)%4的值为_____。
5.输出长整型数据使用格式符_______,输出无符号的整数用格式符_____,以指数形式输出单精实数用格式符______。
6.下面程序运行时输入:
1011<
回车>
,输出__________。
{inta,b;
%o%x"
b);
a=%d,b=%d\n"
a,b);
7.下面程序段执行时,怎样输入才能让a=10,b=20?
__________________
inta,b;
scanf("
a=%d,b=%d"
8.若a和b均为int变量,以下语句的功能是_____________。
a+=b;
b=a-b;
a-=b;
9.在scanf函数调用中,可以在格式字符和%之间加一星号*,它的作用是________。
10.a++、++a、a=a+1都能实现使变量a的值增1,与之等效的表达式还有__________
第二部分:
分支结构
1.若执行下面的程序时从键盘上输入5,则输出结果是______
main()
{intx;
,&
if(x++>
5)printf("
%d\n"
,x);
elseprintf("
,x--);
A)7B)6C)5D)4
2.已知a,b,m,n,c,d变量的定义如下,则执行完下列表达式后m,n的值为______
inta=3,b=4,m=0,n=0,c=3,d=4;
(m=a<
b)||(n=c<
d);
A)m=1n=1B)m=1n=0C)m=0n=0D)m=0n=1
3.表达式(!
7<
5+1>
0+4<
5)的值是______
A)3B)2C)1D)0
4.假设在程序中,x,y,z均被定义成整型,且已赋大于1的值,则下列能正确表示1/(xyz)的表达式是______
A)1/x*y*zB)1/(x*y*z)C)1/x/y/(float)zD)1.0/x/y/z
5.已知字母a的ASCII十进制代码为97,则执行以下语句后的输出为______
chara='
;
a--;
%d,%c\n"
a+'
2'
-'
0'
3'
A)b,cB)a--运算不合法,故有语法错C)98,c
D)格式描述和输出项不匹配,输出无定值
6.为了避免嵌套的条件语句if-else的二义性,C语言规定:
else与_____配对。
A)缩排位置相同的ifB)其之前最近的if
C)其之后最近的ifD)同一行上的if
7.若给定条件表达式(M)?
(a++):
(a--),则其中表达式M______
A)和(M==0)等价B)和(M==1)等价
C)和(M!
=0)等价D)和(M!
=1)等价
8.若有说明语句chars='
\092'
则该语句______
A)使s的值包含1个字符B)说明不合法,s的值不确定
C)使s的值包含4个字符D)使s的值包含3个字符
9.设a=1,b=2,c=3,d=4,则表达式:
a<
b?
a:
c<
d?
d的结果为______
A)4B)3C)2D)1
10.有如下的变量定义:
inti=8,k,a,b;
unsignedlongw=5;
doublex=1.42,y=5.2;
则以下符合C语言语法的表达式是______
A)a+=a-=(b=4)*(a=3)B)x%(-3)C)a=a*3=2D)y=fl