i=5表示输出列表可以是运算表达式,b=97表示输出的是字母a的ASCII编码(十进制)
i=1,j=2,k=3与a=4,b=5,c=6符合基本的数据类型控制
l=1.000000是由于输出格式为%f,m与n原因相同,最后的l没有输出是由于控制符中没有相应的控制方法。
(2)对比使用VC与TC编辑环境,观察下面的代码结果。请在报告中说明区别。
# include"stdio.h"
main()
{
int a=-1;
printf("%d,%u,%x,%o\n",a,a,a,a);
system("pause");
}
TC中的运算结果:
本次实验的内容有两个,第一项是观察分析代码运行情况,绝大多数同学能够认真检查对比。第二项是简单的顺序结构代码,可能是时间的原因,大部分同学没有进行相关的练习。下面是本次案例中代码阅读分析中典型的说明。程序设计的内容从第三次实验开始进行,各位同学一定提交认真准备。要学习如何进行调试。
1、观察与作业相关的练习代码运行情况。注意system("pause");的功能
(1)直接使用VC编辑环境观察下面的代码结果。
# include"stdio.h"
main()
{
int i,j,k;
int a,b,c;
float l,m,n;
i=1,j=2,k=3;
a=4,b=5,c=6;
l=1.0,m=2.0,n=3.0;
printf("i=%d,b=%d \n\n",2+3,'a');
printf("i=%d,j=%d,k=%d\n\n",i,j,k,i);
printf("a=%d,b=%d,c=%d\n\n",a,b,c,a);
printf("l=%f,m=%f,n=%f\n\n",l,m,n,l);
system("pause");
}
TC结构的原因(这也是标准的C语言结果,要特别注意):
在DOS环境中int数据类型占2个字节,
因此-1的二进制为1000 0000 0000 0001
按%d格式输出是有符号方式,结果为-1
按%u为无符号方式,系统进行相应的转换,使用补码方式,
-1补码为:1000 0000 0000 0001
-1反码为:1000 0000 0000 0000
-1原码为:1111 1111 1111 1111
-1原码为:1111 1111 1111 1111按四位组合为十六进制,三位组合为八进制
因此对应的十六进制为:1111 1111 1111 1111 对应的结果为:ffff
因此对应的十六进制为:001 111 111 111 111 111 对应的结果为:177777
VC中的运算结果(原因是在DOS与Windows中int数据类型的空间不同,对于负数要考虑的是补码运算)
结果分析方式与DOS相似,在windows中int类型是4个字节。
-1是输入的数据,输出的时候系统判断为负数,应当进行编码转换
补码:1000 0000 0000 0000 0000 0000 0000 0001
反码:1000 0000 0000 0000 0000 0000 0000 0000
原码:1111 1111 1111 1111 1111 1111 1111 1111(ffffffff)
八进制:011 111 111 111 111 111 111 111 111 111 111(37777777777)
(3)使用VC编辑下面的代码,考虑如何验证具体的输出效果。
# include"stdio.h"
main()
{
float x=111111.111,y=222222.222;
printf("%f,f,.2f,%-10.2f,%.2f\n",x+y,x,x,x,x);
system("pause");
}
通过本案例可以验证两个现象
【1】输出控制格式使用小数限制的情况下,输入指定倍数时可以准确输出
【2】通过数据指定小数位数后出现的不是四舍五入关系。
(4)使用VC编辑下面的代码,观察对于字符的控制效果。
# include"stdio.h"
main()
{
printf("%3s,%6.3s,%-6.3s,%.3s\n","hello",
"hello","hello","hello");
system("pause");
}
说明:输出字符串的时候控制格式%x.ys中x表示占据的宽度,y表示输出的宽度,正数为右对齐,负数为左对齐,如果没有y则输出指定的宽度的字符。
(6)观察下面的代码,当输入的数据类型与要求不一致会出现什么问题,考虑如何解决?
# include"stdio.h"
main()
{
int i,j,k;
int a,b,c;
float L,m,n;
scanf("-,M,m",&i,&j,&k,&a,&b,&c);
scanf("%4.2f,%6.2f,%8.3f",&l,&m,&n);
printf("i=%d,j=%d,k=%d,a=%d,b=%d,c=%d\n",i,j,k,a,b,c);
printf(“L=.4f,m=%-10.4f,n=10.6f\n",L,m,n);
}
说明:
【1】&l的格式不正确,程序中声明的是L,而输入地址为l,需要修改
【2】第一条输入语句有三个格式控制,有六个地址,当输入的数据与要求不符合时,会出现下面的现象。后续的数据直接替换了第二条输入的内容。
(7)观察下面的输入控制方式,针对不同进制的数据是如何输入的。
#include
void main()
{
int a,b,c,d;
scanf("%d,%u,%o,%x",&a,&b,&c,&d);
printf("a=%d,b=%u,c=%o,d=%x\n\n",a,b,c,d);
printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
}
在输入的数据中区别是无符号的输入方式,010表示是八进制数据,而0x10表示是十六进制数据,对应的输出结果为十进制方式,因此a,c,d的结果与定义相同。对于无符号的内容,当输入为正数时,结果没有问题,而当输入的是负数时,系统会按补码方式处理相关的结果。
b=-10,在Windows系统中整型(int类型)数据默认是4个字节。因此输入的数据在计算机内部表示为:
补码:1000 0000 0000 0000 0000 0000 0000 1010
反码:1000 0000 0000 0000 0000 0000 0000 1001
原码:1111 1111 1111 1111 1111 1111 1111 0110
此时按无符号输出,最高位表示有效数字,不再表示正负数的概念。
其它的内容均属于典型的基础概念,注意在scanf与printf中格式控制与列表的对应关系就可以。特别要注意的是宽度与精度的区别