本文共 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/