实验2 数据类型、运算符和表达式
实验目的:
1.掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法;
2.掌握不同类型数据之间赋值的规律;
3.学会使用C语言的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(--)运算符的使用;
4.进一步熟悉C程序的编辑、编译、连接和运行的过程。
实验内容:
1.输入下面的程序:
#include
void main( )
{
char c1, c2;
c1 = 'a';
c2 = …b?;
printf (“%c %c\n”, c1, c2);
}
(1)运行此程序;
运行的结果如下
(2)在程序的最后增加语句“printf(“%d%d\n”,c1,c2);”再运行,并分析结果;
加printf(“%d%d\n”,c1,c2);后
分析结果:加printf(“%d%d\n”,c1,c2);后对应的小写字母的ASCII代码,放在对应的字符变量中
(3)将程序的第4行“char c1, c2;”改为“int c1, c2;”后再运行,并分析结果;
将第4行“char c1,c2,”改为”intc1,c2;”后运行的结果
分析结果定义为整型后结果运行不变
c1 = a; /* 不用单撇号*/
c2 = b;
再运行,并分析结果;
运行的结果的结果如下
分析结果:因为a,b,是字符,定义要加单撇号才会执行。
(5)再将程序的第5、6行改为:
c1 =” a”; /*用双撇号*/
c2 =” b”;
再运行,并分析结果;
c1 =300; /*用大于255的整数*/
c2 =400;
再运行,并分析结果。
2.输入以下程序:
#include
void main( )
{
char c1 = …a?, c2 = …b?, c3 = …c?, c4 = …\101?, c5 = …\116?;
printf (“a%c b%c\tc%c\tabc\n”,c1, c2, c3);
printf(“\t\b%c%c”, c4, c5);
}
分析结果:因为c是单一字符,所以输出的是%c 是占位符,输出的时候三个%c 分别会填入后面列出的变量c1,c2,c3代表的值。即 a,b,c
\t 是制表符。它的作用是将光标移到最接近8的倍数的位置,使得后面的输入从此开始。
因为前面 a%c b%c 会输出aa bb占了5个字符(注意aa和bb之间有个空格)
所以遇到/t的时候会跳到第8个字符处(即多出3个空格)开始输出cc
然后又是\t,于是再跳到第2*8=16个字符处(多出6个空格)再输出后面的abc, 结果是 aa bb cc abc
先用人工分析程序,写出应得结果,再与运行结果比较。3.输入并运行下面的程序
#include
void main()
{
int a,b;
unsigned c,d;
long e,f;
a = 100;
b = -100;
e = 50000;
f = 32767;
c = a;
d = b;
printf(“%d,%d\n”, a, b);
printf(“%u,%u\n”, a, b);
printf(“%u,%u\n”, c, b);
c = a = e;
d = b = f;
printf(“%d,%d\n”, a, b);
printf(“%u,%u\n”, c, d);
}
请对照程序和运行结果分析:
(1)将一个负整数赋给一个无符号的变量,会得到什么结果;
答:会将这个负整数对应的补码的这二进制形式存入这个无符号的变量中,因为在数据存储时,只要不溢出就都是以二进制形式储存,只有当使用的指令区分无符号数才还是带符号数时,才会对就不同的含义。
(2)将一个大于32767的长整数赋给整型变量,会得到什么结果;
答:大将一个大于32767的长整数赋给整型变量就会发生溢出现象,因为int的范围是-327678-32767 如果输入的数据大于32767,那么输出的结果就为-32768+(i-32767)
(3)将一个长整型数赋给无符号变量,会
得到什么结果(分别考虑该长整数的值大于
或等于65535 以及小于65535 的情况)。
答:一般情况,如果超出存储范围,就会溢出,结果得到的是溢出的那一部分。
同学们可以改变程序中各变量的值,以便比较。
例如: a = 65580, b = -40000, e = 65535, f = 65580。
更改值后的结果
4.输入以下程序:
#include
void main()
{
int i,j,m,n;
i = 8;
j = 10;
m = ++i;
n = j++;
printf(“%d,%d,%d,%d\n”, i, j, m, n);
}
(1)运行程序,分析变量:i、j、m、n 的
值;
分析结果如下:对于m=++i,先执行i+1=9,再执行i的值所以m=9,对于n=j++,先把j的值赋给n,再执行j+1,所以n=10,j=11.i=9
(2)将第7、8行改为:
m = i++;
n = ++j;
再运行并分析结果;
把第7、8行改为m=i++;n=++j后运行
的结果如下
分析结果:对于m=i++,先把i赋值给m,所以m=8,再执行i+1,所以i=9,对于n=++j,先执行j+1,再把值赋给n.所以j=11,n=11.
(3)将程序改为:
#include
void main()
{
int i,j;
i = 8;
j = 10;
printf(“%d,%d\n”, i++, j++);
}
运行并分析结果;
分析结果:对于i++与j++,先执行i与j,再执行i+1与j+1,所以i与j输出的值不变。
(4)在(3)的基础上,将printf 语句改为:
printf(“%d,%d”, ++i, ++j);
运行并分析结果;
分析结果:对于++i与++j,先执行i+1与j+1,再执行i与j的值,所以i=9,j=10.
(5)再将printf 语句改为:
printf(“%d,%d,%d,%d”, i, j, i++, j++);
运行并分析结果;
分析结果:对于i++与j++,先执行i与j,再执行i+1与j+1,所以i与j输出的值不变。
(6)将程序改为:
#include
void main()
{
int i, j, m=0, n=0;
i = 8;
j = 10;
m+= i++; n-= --j;
printf(“i=%d,j=%d,m=%d,n=%d\n”, i, j, m, n);
}
分析结果:对于运算符优先++,--,大于赋值运算符+=,-=,对于m+=i++,先执行i++,所以i先把值赋给m,再执行i+1,就是自加,最后执行
“+=”,所以m=8,i=9;同理n-=--j,先执行j-1,在执行j的值,把值赋给n,最后执行“-=”,赋给n,所以j=9,n=-9。
5.按要求编写程序并上机运行
(1)要将”China”译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母。例如,字母”A”后面第4个字母是”E”,用”E”代替”A”。因此,”China”应译为”Glmre”。请编一程序,用赋初值的方法使c1、c2、c3、c4、c5 五个变量的值分别为?C?、?h?、?i?、?n?、?a?,经过运算,使c1、c2、c3、c4、c5分别变为?G?、?l?、?m?、?r?、?e?并输出。
①输入事先已编好的程序,并运行该程序。分析是否符合要求。
编写程序如下:字符与ASCII代码对照
C=67,G=71,h=104,l=108,i=105,m=109,n=110,r=114,a=97,e=10 1。
#include
int main( )
{
Char c1,c2,c3,c4,C,h,I,n,a;
c 1=?C?;
c2=?h?;
c3=?i?;
c4=?n?;
c5=?a?;
c1=c1+4;
c2=c2+4;
c3=c3+4;
c4=c4+4;
c5=c5+4;
printf(“%c %c %c %c %c\n”,c1,c2,c3,c4,c5);
}
②改变c1、c2、c3、c4、c5的初值为:?T?、?o?、?d?、?a?、?y?,对译码规律作如下补充:?W?用?A? 代替,?X?用?B?代替,?Y?用?C?代替,?Z?用?D?代替。修改程序并运行。
改变c1、c2、c3、c4、c5的初值为:?T?、?o?、?d?、?a?、?y?,结果运行如下
③将译码规律修改为:将字母用它前面的第4个字母代替,例如:?E?用?A? 代替,?Z?用?U?代替,?D?用?Z?代替,?C?用?Y?代替,?B?用?X?代替,?A?用?V?代替。修改程序并运行。
(2)已知两个电阻分别为10欧姆和20欧姆,求并联后电阻的值。
提示:1/R=1/R1+1/R2
最后,对这次实验作一个简要的总结。