博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实验2-1 多种进制形式的整型数据的输入输出
阅读量:4146 次
发布时间:2019-05-25

本文共 3089 字,大约阅读时间需要 10 分钟。

 

特别声明:

从本章开始,需要实验者根据实验目的及相关知识自己总结出每次实验的重难点。如果对知识点比较熟悉,则可在实验之前总结出实验的重难点。也可在做完实验之后总结出本次实验的重难点。实验的重难点可作为“实验结果及分析”的内容之一。

实验目的:

1.熟悉多种进制形式的整型数据的输入输出

2.分析输入输出函数处理数据的原则

3.通过“数据矛盾”时输入输出函数的处理方法,加深对输入输出函数的理解。

实验步骤:

1.       分析下面程序的输出

#include <stdio.h>

void main()

{

       short i, j, k;

       i = 23;

       j = 23;

       k = 23;

       printf("%hd,%ho,%hx\n", i, j, k);

}

 

i

j

k

存储状态

 

 

 

你预期的输出

 

 

 

程序实际的输出

 

 

 

思考:

变量i、j和k为何有那样的实际输出?

2.       分析下面程序的输出

#include <stdio.h>

void main()

{

       short i, j, k;

       i = 23;

       j = 023;

       k = 0x23;

       printf("%hd,%ho,%hx\n", i, j, k);

}

 

i

j

k

存储状态

 

 

 

你预期的输出

 

 

 

程序实际的输出

 

 

 

思考:

1)用printf函数以八进制形式输出整型变量时输出的数据中有表示前缀的0吗?

2)内存中的数据有八进制和十六进制的形式吗?

3)变量i、j和k为何有那样的实际输出?

3.       分析下面程序的输出

3.1

#include <stdio.h>

void main()

{

       short i, j, k;

       i = -23;

       j = -23;

       k = -23;

       printf("%hd,%hu,%hu\n", i, j, k);

}

 

i

j

k

存储状态

 

 

 

你预期的输出

 

 

 

程序实际的输出

 

 

 

思考:

1)变量i、j和k为何有那样的实际输出?

2)通过printf函数的输出能判定一个整型变量的正负吗?什么情况下printf函数可以正确输出一个整型变量的值?

3)printf函数是如何输出数据的?

3.2

#include <stdio.h>

void main()

{

       short i, j, k;

       i = -23;

       j = -23;

       k = -23;

       printf("%hd,%ho,%hx\n", i, j, k);

}

 

i

j

k

存储状态

 

 

 

你预期的输出

 

 

 

程序实际的输出

 

 

 

思考:

1)变量i、j和k为何有那样的实际输出?格式字符o、x与格式字符u有何区别和联系?

4.       分析下面程序的输出

#include <stdio.h>

void main()

{

       short i, j, k;

       scanf("%hd%hd%hd", &i, &j, &k);

       printf("%hd,%hd,%hd\n", i, j, k);

}

 

第一次

第二次

输入

23 23 23

23

023

0x23

存储状态

i

 

 

j

 

 

k

 

 

你预期的输出

 

 

实际的输出

 

 

思考:

1)通过实验可知scanf函数默认区分多个输入数据的字符有          

2)如果scanf函数能够识别用户输入数据中整型字面量的前缀,则第二次测试程序时变量j的输出应为    。变量j的实际输出为    ,可见          

3)第二次测试程序时变量k的实际输出为    ,可见          

4)scanf函数能否识别整型数据的前缀?

5.       分析下面程序的输出

#include <stdio.h>

void main()

{

       short i, j, k;

       scanf("%hd%ho%hx", &i, &j, &k);

       printf("%hd,%hd,%hd\n", i, j, k);

}

 

第一次

第二次

输入

23 23 23

23

023

0x23

存储状态

i

 

 

j

 

 

k

 

 

你预期的输出

 

 

实际的输出

 

 

思考:

1)在第一次测试程序时,对应于变量j的输入数据23应该理解为     ,变量j的输出结果应为     ,其实际输出为      ,可见           

2)在第二次测试程序时,对应于变量k的输入数据0x23应该理解为     ,变量k的输出结果应为     ,其实际输出为      ,可见           

3)scanf函数能否识别整型数据的前缀?

6.       编程:设下面的题中,数据取值范围为0至65535,要求用短整型变量保存用户的输入。

6.1用户输入一个十进制整数,输出它的十六进制形式。

测试

第一次

第二次

第三次

用户输入

171

13

65535

程序输出

ab

d

ffff

6.2用户输入一个十六进制整数,输出它的十进制形式。

测试

第一次

第二次

第三次

用户输入

ab

d

ffff

程序输出

171

13

65535

可能出现的问题:当用户输入ffff时,程序的输出为-1而非65535。

分析:

此时保存用户输入的变量的存储状态为16个1,根据printf函数输出数据的特点,如果用”%hd”解码数据,其值为-1;如果使其输出为65535,则必须用”%hu”解码。

注意:

问题限定了数据的取值范围为0至65535,短整型变量,显然相关变量应该定义为unsigned short型,如果定义为short型,则大于32767的整数以”%hd”解码数据时均会出错。

7.       //存储单元的状态为16个1,这个存储单元的值是多少?

填表并编程验证。

变量

short i=-1

unsigned short ui=65535

存储状态

 

 

printf函数以%hd输出时你觉得输出是

 

 

printf函数以%hu输出时你觉得输出是

 

 

程序实际的输出

 

 

再次分析printf函数输出数据的规律。

8.       填表并编程验证。

8.1有short i; scanf(“%hd”, &i);

 

用户输入-1时

用户输入65535时

变量i的存储状态

 

 

你觉得变量i的值应为

 

 

printf(“%hd”, i)的输出为

 

 

注意:

用户输入65535是有问题的,超出了变量i的取值范围(-32768~32767),遇到这种情况,scanf函数是如何处理的?

 

8.2有unsigned short ui; scanf(“%hu”, &ui);

 

用户输入-1时

用户输入65535时

变量ui的存储状态

 

 

你觉得变量ui的值应为

 

 

printf(“%hu”, ui)的输出为

 

 

注意:

用户输入-1是有问题的,超出了变量ui的取值范围(0~65535),遇到这种情况,scanf函数是如何处理的?

 

总结scanf函数和printf函数的特点。

特别提示:

第4步中第二次测试程序时为什么变量k的值是0?

因为scanf函数会按格式字符解码数据,当格式字符串为%d时,输入数据会被认为是十进制整数,正确的输入数据应为由0~9十个数字组成且以由+、-(正负号)开头的数字串,且默认以空格、回车或 Tab键作为一个输入数据(与一个%d相对应)的结束。如果输入数据中含有其它字符,则认为输入出错。由输入023而变量j的值为23可知,在输入时不能通过前缀来决定整数的进制,0作为整数的开头时对输入“不产生影响”。当处理0x23时遇到了非法的字符x,只处理了最前面的字符0,所以变量k的值为0。当格式字符串为%d,输入为x、2.3和5y时,scanf函数又如何处理呢?

补充:scanf函数遇到错误时,后面数据的输入就会受到影响。在实验1-3的第7步中出现过此类情况。

转载地址:http://ibdti.baihongyu.com/

你可能感兴趣的文章
面试题:强制类型转换
查看>>
Decorator模式
查看>>
Template模式
查看>>
Observer模式
查看>>
高性能服务器设计
查看>>
性能扩展问题要趁早
查看>>
MySQL-数据库、数据表结构操作(SQL)
查看>>
OpenLDAP for Windows 安装手册(2.4.26版)
查看>>
图文介绍openLDAP在windows上的安装配置
查看>>
Pentaho BI开源报表系统
查看>>
Pentaho 开发: 在eclipse中构建Pentaho BI Server工程
查看>>
JSP的内置对象及方法
查看>>
android中SharedPreferences的简单例子
查看>>
android中使用TextView来显示某个网址的内容,使用<ScrollView>来生成下拉列表框
查看>>
andorid里关于wifi的分析
查看>>
Spring MVC和Struts2的比较
查看>>
Hibernate和IBatis对比
查看>>
Spring MVC 教程,快速入门,深入分析
查看>>
Android 的source (需安装 git repo)
查看>>
Commit our mod to our own repo server
查看>>