c语言实验9答案,C语言第二次实验参考答案

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中格式控制与列表的对应关系就可以。特别要注意的是宽度与精度的区别

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值