实验3 顺序结构程序设计Word下载.docx
《实验3 顺序结构程序设计Word下载.docx》由会员分享,可在线阅读,更多相关《实验3 顺序结构程序设计Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
d=f;
e=g;
p=a=m=50000;
q=b=n=-60000;
运行程序,分析结果。
【分析】修改后程序运行结果为:
程序中出现c1==,c2=>
的原因是程序中语句c1=a;
的功能是将变量a和变量b的值分别赋值给c1和c2,即执行后c1=61,c2=62,而ASCII码值为61所对应的字符是=,ASCII码值为62所对应的字符是>
。
程序中出现q=4294907296的原因是由于程序中指定q的输出格式是%u,即按无符号整数(unsigned)的格式输出,而无符号整数的范围是:
0~65535,-60000超出了它的范围。
在VC++中,由于整数占四个字节,所以:
-60000的机器原码:
10000000000000001110101001100000
反码:
11111111111111110001010110011111
补码:
11111111111111110001010110100000
二进制11111111111111110001010110100000转换成十进制数的值就是:
4294907296
(2)在
(1)的基础上将printf语句改为:
printf("
a=%d,b=%d,c1=%c,c2=%c,d=%15.6f,e=%15.12f\n"
a,b,c1,c2,d,e);
f=%f,g=%f,m=%d\n"
f,g,m);
printf("
n=%d\n”,n);
printf(“p=%d,q=%d\n"
p,q);
运行程序。
【分析】调试程序时会出现如下的警告错误信息提示:
该错误信息的中文意思是:
从双精度(double)转换为单精度(float),可能会丢失数据
因为程序中定义d和e的数据类型为float,而f和g的数据类型为double,执行d=f;
语句时,赋值号两边的数据类型不一致,根据数据类型转换规则:
将赋值号右边的数据类型转换成赋值号左边的数据类型,即将double转换成float型,由于double占8个字节,float占4个字节,因此会有数据丢失的可能。
对于这两个警告错误信息提示,我们可以不予理睬。
修改后程序的运行结果为:
程序中出现e=0.123456791043,并不是我们想象中的e=0.123456789000,原因是程序中定义e为float型,而float类型数据其有效位数为6-7位,从第8位开始就会出现一些意想不到的结果。
(3)将p,q改用%o格式符输出。
注意是字母o而不是数字0。
【分析】修改后程序的运行结果为:
注意:
%o是按八进制格式输出整数。
程序中出现p=141520,q=37777612640的结果,原因是:
十进制数50000对应的八进制数是141520,
根据前面分析过程可知,十进制整数-60000在计算机内存中所对应的二进制机器补码值为:
根据三位二进制合并为一位八进制的转换规则,可知该数转换成八进制数的值是:
377777612640
(4)改用scanf函数输入数据而不用赋值语句,scanf函数如下:
scanf("
%d,%d,%c,%c,%f,%f,%lf,%lf,%ld,%ld,%u,%u"
&
a,&
b,&
c1,&
c2,&
d,&
e,&
f,&
g,&
m,&
n,&
p,&
q);
输入的数据入下:
61,62,a,b,3.56,-6.87,3,157.890121,0.123456789,50000,-60000,40000
(说明:
lf,ld格式符分别用于输入double型和long型数据)分析运行结果。
(5)将scanf函数中的%lf和%ld改写为%f和%d,运行程序并观察分析结果。
程序分析实例3-2:
分析每个输出语句的输出结果,输入以下程序验证分析结果。
总结复合赋值运算的运
算规则及其应用。
(无需存盘)
【复合赋值运算的几点说明】
1)当表达式为简单表达式(如单一变量)时,表达式外的一对圆括号才可缺省,否则可能出错。
2)运算时要把整个表达式当作一个整体。
3)表达式的形式:
可以是常量、简单变量、函数调用、运算表达式。
例如:
x+=3
/*等价于x=x+3
*/
y*=x+6
/*等价于y=y*(x+6),而不是y=y*x+6,要把x+6当做一个整体*/
程序分析实例3-3:
分析以下程序的运行结果,通过该实例加深对运算符号/与%的理解。
[实验任务二]:
通过调试运行程序,掌握scanf()和printf()函数的使用方法。
问题1要使下面程序的输出语句在屏幕上显示1,2,34,则从键盘输入的数据格式应为以下备选答案中的。
将以下程序以文件名scan0.c最终保存在实验3文件夹里。
#include<
stdio.h>
voidmain()
{
chara,b;
intc;
scanf("
%c%c%d"
c);
%c,%c,%d\n"
a,b,c);
}
A)1234B)1,2,34
C)’1’,’2’,34D)1234
问题2在与上面程序的键盘输入相同的情况下,要使上面程序的输出语句在屏幕上显示1234,则应修改程序中的哪条语句?
怎样修改?
将修改好的正确程序以文件名scan1.c最终保存在实验3文件夹里。
问题3要使上面程序的键盘输入数据格式为1,2,34,输出语句在屏幕上显示的结果也为1,2,34,则应修改程序中的哪条语句?
将修改好的正确程序以文件名scan2.c最终保存在实验3文件夹里。
问题4要使上面程序的键盘输入数据格式为1,2,34,而输出语句在屏幕上显示的结果为'
1'
'
2'
34,则应修改程序中的哪条语句?
将修改好的正确程序以文件名scan3.c最终保存在实验3文件夹里。
[提示:
利用转义字符输出字符单引号字符。
]
问题5要使上面程序的键盘输入无论用下面哪种格式输入数据,程序在屏幕上的输出结果都为'
34,则程序应修改程序中的哪条语句?
将修改好的正确程序以文件名scan4.c最终保存在实验3文件夹里。
第1种输入方式:
1,2,34↙(以逗号作为分隔符)
第2种输入方式:
1234↙(以空格作为分隔符)
第3种输入方式:
1234↙(以Tab键作为分隔符)
第4种输入方式:
1↙
2↙
34↙(以回车符作为分隔符)
【相关说明:
】本题主要是考查学生对常用标准输入输出函数使用方法的熟练使用程度。
函数getchar()和putchar()用于字符输入输出操作,而函数scanf()和函数printf()则用于格式输入输出操作,即在程序设计者的控制下,以各种格式进行任意类型数据的读写操作,其中,函数printf()是向屏幕写数据,函数scanf()是从键盘读数据。
函数printf()和scanf()对输入输出数据的格式控制问题(尤其是scanf()函数)较难掌握,需要读者在使用过程中去慢慢体会,初学者常常在使用scanf()函数时出错,要熟练%d、%f、%c、%s这四种格式符以及忽略输入修饰符*和宽度等附加格式说明符。
其中问题4可利用转义字符输出字符单引号字符。
问题5可利用忽略输入修饰符*或者1s%解决。
[实验任务三]:
进一步熟悉C程序的集成开发环境VC++,掌握简单C程序的查错方法。
程序改错实例3-1:
改错题。
下列程序多处有错,请通过上机改正。
使之符合下面的要求。
并将修改好的正确程序以文件名correct1.c最终保存在实验3文件夹里。
当本程序运行时,要求按如下方式显示和输入:
Inputa,b,c:
2.02.03.0(此处的2.02.03.0为用户输入的)
a=2.000000b=2.000000c=3.000000
s=4.000000v=12.000000
【分析:
】
①第5行printf函数应加双引号;
②将第6行scanf函数中的%d改为%lf(注意%和f之间是小写字母l,而不是数字1);
③scanf函数中变量a,b,c前应为“&
”符号;
④将最后2行printf函数中所有%开头的格式规定符一律改为%lf。
⑤将最后一行printf函数改为正确的格式。
程序改错实例3-2:
程序改错题。
认真阅读以下程序,找出程序中的错误并且要求修改错误。
写出该程序的主要功能和程序的输出结果。
将程序输入计算机中调试通过。
要求记录下调试中的错误信息,解决方法和程序的输出结果。
对比自己写出的程序输出结果和实际执行的程序结果有什么不同并分析原因。
并将修改好的正确程序以文件名
correct2.c最终保存在实验3文件夹里。
】①第1行主函数main的m为小写;
②主函数的函数体应加花括号;
③scanf函数中变量y前应为“&
④后面3行结尾少了语句结束标记“;
”号;
⑤应是先计算后输出,即最后两行交换。
程序改错实例3-3:
改正以下程序的错误,同时将修改正确的程序进行存盘。
将修改好的程序以文件名sin.c最终保存在实验3文件夹中。
提示:
在调试该程序时会碰到以下错误信息提示,现解释如下:
①
中文含义依次描述如下:
sin.c第5行:
警告错误:
Scanf没有定义;
假定外部返回整型;
sin.c第6行:
SIN没有定义;
严重错误:
没有声明’pi’标识符;
sin.c第7行:
Printf没有定义;
修改方法:
(1)依次将没有定义的符号修改为scanf、sin和printf。
(2)因为pi是一个符号常量,应该在主函数前面进行宏定义,即#definepi3.14
②通过以上两步修改,编译连接均成功,点击运行按钮,通过键盘键入数字90,此时会出现如下所示的提示框:
原因分析:
出现这种错误提示框的原因是scanf()函数中的地址参量表前面没有加上地址符号&
将scanf()中的地址参量表d改成&
d
③修改完毕,运行时你会发现不管你输入什么整数值,其结果都是0.000000,显然这一结果是错误的,为什么呢?
原因就是1/2的值等于0,所以为了保证输出正确的结果,应该将其修改为1.0/2或1/2.0。
将修改好的程序以文件名Macro.c最终保存在实验3文件夹里。
macro.c(6):
errorC2106:
'
='
:
leftoperandmustbel-value赋值号左边的操作数必须是左值。
由于宏定义#definePRICE30的功能是将PRICE定义为一个符号常量,这也就是说本程序第6行赋值语句PRICE=PRICE*x;
中赋值号左边是一个常量,不符合赋值语句要求赋值号左边必须是一个变量的要求,所以会产生以上错误信息提示。
有多种,比方说你可以将PRICE=PRICE*x;
语句修改为x=PRICE*x;
[实验任务四]:
通过完善或编写简单的C语言程序,进一步熟悉C语言的语法结构。
编程练习3-1:
用宏定义编程求解圆的周长和面积、球的体积和表面积、圆锥的体积、圆柱的体积。
可参照理论教材P40例3.1的代码进行编程。
要求:
①半径和高的值均从键盘上任意输入(用scanf()函数实现);
②用printf()函数将计算结果输出,且输出时要有相关的英文文字说明,如“圆的周长”
对应的英文文字说明是:
“theperimeterofthecircle”,且小数点后保留两位有效数字。
③将编写好的程序以文件名area.c最终保存在实验3文件夹里。
①所谓宏定义就是#definePI3.14
②因为PI为3.14是小数,所以定义半径、高、圆的周长、圆的面积等变量时应将它们定义为float类型;
③相应的中英文对应单词如下所示:
半径:
radius高:
height圆:
circle周长:
perimeter面积:
area球:
ball
圆锥:
cone体积:
volume圆柱:
column表面积:
superficialarea
④本题中涉及到的公式列举如下:
圆的周长=2*PI*r圆的面积=PI*r*r球的体积=4.0/3*PI*r*r*r
球的表面积=4*PI*r*r圆锥的体积=1.0/3*PI*r*r*h圆柱的体积=PI*r*r*h
编程练习3-2:
编程实现:
将小写字母的输入转换成大写字母的输出。
(例如,从键盘上输入的字母为a,
则输出的字母为A)。
将编写好的程序以文件名change.c最终保存在实验3文件夹里。
①因为输入的小写字母是任意的,所以应该用scanf()函数,假设我们将输入的字符存放在字符变量ch中,则scanf()的具体语句格式为:
scanf(“%c”,&
ch);
②由于大写字母(如‘A’)比相应的小写字母(‘a’)的ASCII码值少32,因此要将小写字母转换成相应的大写字母,只需将该字母的ASCII码值减掉32即可,用以下语句可实现这一要求:
ch=ch-32;
③为了验证结果是否正确,可用printf()函数将结果输出。
具体语句为:
printf(“%c\n”,ch);
编程练习3-3:
以下程序不用第3个变量,实现将两个数进行对调的操作,请选择填空。
(1)A、a+bB、a-bC、a*bD、a/b
(2)A、a+bB、a-bC、b-aD、a*b
(3)A、a+bB、a-bC、b*aD、a/b
将完整的程序以文件名swap.c最终保存在实验3文件夹里。
编程练习3-4:
以下程序输入3个整数值给a、b、c,程序把b中的值给a,把c中的值给b,把a中的值
给c,交换后输出a、b、c的值。
读入后,a=10,b=20,c=30;
交换后,a=20,b=30,c=10。
请填空,
并将完整的程序以文件名interchange.c最终保存在实验3文件夹里。
/*提示:
使用一个中间变量*/
编程练习3-5:
输入任意一个3位数,将其各位数字反序输出(例如输入123,输出321)。
程序以print.c文件名最终保存在实验3文件夹里。
此类题目应将3位数的个、十、百位分离出来,即定义x、a1、a2、a3,
x——从键盘输入的数
a1——x的个位a1=x%10
a2——x的十位a2=x%100/10
a3——x的百位a3=x/100
反序输出:
printf(“%d%d%d\n”,a1,a2,a3);
★作业上交(千万不要忘记):
C程序编译、连接、运行成功后,请务必将源程序(扩展名为.C、存于E:
盘以本人姓名为名称的文件夹下,如E:
\匡珍春\c01.c)复制到K:
盘对应的文件夹中,如K(01):
\工业109105匡珍春\实验3,才算上交作业。
注:
为了方便自己使用,不妨将源程序备份到可移动存储器上(如U盘、手机卡等)
★强烈建议:
先理解消化例题及习题(书上提供了答案),然后再做编程题。
因为这样效果会好些。