实验二C语言程序设计基础 2-1编程(文件名为S2-1C)。定义3个int变量xyz和一个实型变量av 计算并输出3个整数的平均值 average,即 average=(x+y+z)3,其中xyz 的值可以通过变量的初始化赋值ⅹ=1,y=1,z=0,也可以通过赋值语句赋值 观察运行结果。将ⅹyz和 average改为实型变量,再观察运行结果。理解 整除和不同类型数据进行混合运算的转化规律,对结果进行合理的解释 〖指导〗 (1)当把x,y,z定义为整型变量时,所做运算(x+ytz)/3是整除运算,根据 C语言的语法规定:整除结果是舍去小数部分,保留整数部分,而不做四舍五入 因此, average=(x+y+z)/3是将取整的结果赋给 average (2)当定义xy,z为整型,x=1y=1,z=0时, average的值就为0。要想使 average 的值为非0,除非将x+y+z的值或3转换为实型。可用如下方法之一进行转换 O average=(x+y+z)3.0 (把3改为30) ② average=(foat)x+y+z)/3;(把x+y+z的结果强制转换为实型) (3)如果把x,y,z和 average都定义为foat型,结果就不再为0,而是等于 0.67。 通过该程序的编写,目的是进一步认识数据的类型,以及不同类型数据的混 合运算。 2-2改写程序S2-1.C(文件名为S2-2C),通过键盘用san)函数输入xy,z的 值。要求输出结果的形式为 average=.。 〖指导〗 在S2-1C中,变量ⅹy,z的值是通过变量的初始化或赋值语句赋的值。用这 种方法编的程序不灵活,如果要改变ⅹyz的值,就要修改程序。如果用 scanf() 函数输入xyz的值,就不需要对程序做任何修改,只需在运行程序的过程中, 给ⅹy,z输入所需的值 比较下面三个程序,模仿比较好的一种方法编写S2-2C 源程序S221C #include
1 实验二 C 语言程序设计基础 2-1 编程(文件名为 S2-1.C)。定义 3 个 int 变量 x,y,z 和一个实型变量 average, 计算并输出 3 个整数的平均值 average,即 average=(x+y+z)/3,其中 x,y,z 的值可以通过变量的初始化赋值 x=1,y=1,z=0,也可以通过赋值语句赋值。 观察运行结果。将 x,y,z 和 average 改为实型变量,再观察运行结果。理解 整除和不同类型数据进行混合运算的转化规律,对结果进行合理的解释。 〖指导〗 (1) 当把 x,y,z 定义为整型变量时,所做运算(x+y+z)/3 是整除运算,根据 C 语言的语法规定:整除结果是舍去小数部分,保留整数部分,而不做四舍五入。 因此,average=(x+y+z)/3 是将取整的结果赋给 average。 (2) 当定义 x,y,z 为整型,x=1,y=1,z=0 时,average 的值就为 0。要想使 average 的值为非 0,除非将 x+y+z 的值或 3 转换为实型。可用如下方法之一进行转换: ① average=(x+y+z)/3.0; (把 3 改为 3.0) ② average=(float)(x+y+z)/3; (把 x+y+z 的结果强制转换为实型) (3) 如果把 x,y,z 和 average 都定义为 float 型,结果就不再为 0,而是等于 0.67。 通过该程序的编写,目的是进一步认识数据的类型,以及不同类型数据的混 合运算。 2-2 改写程序 S2-1.C(文件名为 S2-2.C),通过键盘用 scanf()函数输入 x,y,z 的 值。要求输出结果的形式为 average=…。 〖指导〗 在 S2-1.C 中,变量 x,y,z 的值是通过变量的初始化或赋值语句赋的值。用这 种方法编的程序不灵活,如果要改变 x,y,z 的值,就要修改程序。如果用 scanf() 函数输入 x,y,z 的值,就不需要对程序做任何修改,只需在运行程序的过程中, 给 x,y,z 输入所需的值。 比较下面三个程序,模仿比较好的一种方法编写 S2-2.C。 源程序 S2-2-1.C #include
maino f int x=,y=l,sum /*定义变量* sum=+y /*求和* printf(("sum=%dn",sum);/*输出*/ 该程序只能求x=1与y=1的和,如果要求其他数据的和,必须修改程序中的 初始化,然后重新编译、连接并运行 源程序S2-2-2C #include maino i int x, y,sum /*定义变量* anf("%d%d", &x, &y) /*输入* sumex+ /*求和* printf("sum=%dn",sum;/*输出*/ 该程序可以求任意两个数的和,而不需要修改程序。当程序运行时,输入要 求和的数,程序就可输出结果。 源程序S2-2-3C #include <stdio h maino i int x, y, sum /*定义变量* printf(" eNter x y:"),/*提示输入*/ scanf("%d%d", &x, &y); /*输入* sum=x+y /*求和* printf(("sum=%dn",sum);/*输出*/ 该程序与S2-2-2C的区别是:在输入之前增加了屏幕提示,在运行程序时, 可按屏幕提示进行数据的输入。 运行上面每一个程序,真实感受一下它们的不同
2 main() { int x=1,y=1,sum; /* 定义变量 */ sum=x+y; /* 求和 */ printf ("sum=%d\n",sum); /* 输出 */ } 该程序只能求 x=1 与 y=1 的和,如果要求其他数据的和,必须修改程序中的 初始化,然后重新编译、连接并运行。 源程序 S2-2-2.C #include main() { int x,y,sum; /* 定义变量 */ scanf("%d%d",&x,&y); /* 输入 */ sum=x+y; /* 求和 */ printf ("sum=%d\n",sum); /* 输出 */ } 该程序可以求任意两个数的和,而不需要修改程序。当程序运行时,输入要 求和的数,程序就可输出结果。 源程序 S2-2-3.C #include main() { int x,y,sum; /* 定义变量 */ printf("\nEnter x y: "); /* 提示输入 */ scanf("%d%d",&x,&y); /* 输入 */ sum=x+y; /* 求和 */ printf ("sum=%d\n",sum); /* 输出 */ } 该程序与 S2-2-2.C 的区别是:在输入之前增加了屏幕提示,在运行程序时, 可按屏幕提示进行数据的输入。 运行上面每一个程序,真实感受一下它们的不同
通过该程序的编写,目的是从一开始就采用较好的编程风格。 鱼提示: 通过S2-2-1C、S2-2-2C、S2-2-3C程序的编写,应该学会用良好的编程风 格编写程序。 (1)编写程序时要考虑程序的通用性,需要变化的量尽量不要通过赋值的方 式给定(例如,S2-2-1C中的x和y),而是通过输入的方式使变量得到当前所 需的值(例如,S2-2-2C中对x和y的输入)。 (2)从键盘输入数据时,最好先给出提示信息,提示要输入的数据(例如, S2-2-3C中在输入x和y前用 print0函数输出的屏幕提示信息) 2-3运行程序S2-3C,观察输出的结果,并对输出结果作出合理的解释。 源程序S2-3C nano float al a2 double bl b2 al=314159;a2=0.000001; bl=3141.59;b2=0000001; printf("%f, %lfn",al+a2, b1+b2) 〖指导〗 程序中的a1和bl、a2和b2的值分别相同,但程序中al+a2和bl+b2的输 出结果却不会相同。这是因为 float型数据和 double型数据的精度不同,实型数 在计算机中是非精确表示的,用foat型变量作两个位数很大的数的加法运算或 除法运算时,将得不到预期的结果,而用 double型变量进行运算则可以得到较 准确的结果 该程序的目的是进一步认识不同类型的数据,其精度是不相同的,编程时应 该根据要求定义变量的类型
3 通过该程序的编写,目的是从一开始就采用较好的编程风格。 提示: 通过 S2-2-1.C、S2-2-2.C、S2-2-3.C 程序的编写,应该学会用良好的编程风 格编写程序。 (1) 编写程序时要考虑程序的通用性,需要变化的量尽量不要通过赋值的方 式给定(例如,S2-2-1.C 中的 x 和 y),而是通过输入的方式使变量得到当前所 需的值(例如,S2-2-2.C 中对 x 和 y 的输入)。 (2) 从键盘输入数据时,最好先给出提示信息,提示要输入的数据(例如, S2-2-3.C 中在输入 x 和 y 前用 printf()函数输出的屏幕提示信息)。 2-3 运行程序 S2-3.C,观察输出的结果,并对输出结果作出合理的解释。 源程序 S2-3.C main() { float a1,a2; double b1,b2; a1=3141.59; a2=0.000001; b1=3141.59; b2=0.000001; printf("%f, %lf\n", a1+a2, b1+b2); } 〖指导〗 程序中的 a1 和 b1、a2 和 b2 的值分别相同,但程序中 a1+a2 和 b1+b2 的输 出结果却不会相同。这是因为 float 型数据和 double 型数据的精度不同,实型数 在计算机中是非精确表示的,用 float 型变量作两个位数很大的数的加法运算或 除法运算时,将得不到预期的结果,而用 double 型变量进行运算则可以得到较 准确的结果。 该程序的目的是进一步认识不同类型的数据,其精度是不相同的,编程时应 该根据要求定义变量的类型
2-4下面程序(S2-4C)的输出结果是什么?对输出结果给予合理的解释。 源程序S2-4C maino (char ch ch=a';k=10, printf("%d,%x, %0,%c",ch, ch, ch, ch, k) printf("k=%%d\n", k) 〖指导〗 在C语言中,字符数据既可以用字符形式输出,也可以用整数形式输出 字符a的ASCⅡ十进制代码为97,按十六进制形式输出为61,按八进制形式输 出则为141。本题中第一个pinf函数调用中输出项k为多余的,因此不予输出 第二个 printf函数调用语句中的格式说明中包含了两个连续的%字符,根据C语 言的规定,%%不再作为格式描述字符使用,而是处理成字符“%的原样输出 因此该句中的输出项k任然没有对应的格式描述符,也将不予输出。 该程序的目的是为了掌握变量按不同格式的输出,进一步认识格式描述符, printf函数中参数的正确使用。 2-5写出程序(S2-5C)的运行结果,并对输出结果给予合理的解释。 源程序S2-5C #include maino Sfloat x double y x=21382631; y=213.82631; printf("%-4.2f,%-62en",xy) 〖指导〗
4 2-4 下面程序(S2-4.C)的输出结果是什么?对输出结果给予合理的解释。 源程序 S2-4.C main() {char ch; int k; ch='a'; k=10; printf("%d, %x, %o, %c", ch, ch, ch, ch, k); printf ("k=%%d\n",k); } 〖指导〗 在 C 语言中,字符数据既可以用字符形式输出,也可以用整数形式输出。 字符 a 的 ASCⅡ十进制代码为 97,按十六进制形式输出为 61,按八进制形式输 出则为 141。本题中第一个 printf 函数调用中输出项 k 为多余的,因此不予输出; 第二个 printf 函数调用语句中的格式说明中包含了两个连续的%字符,根据 C 语 言的规定,%%不再作为格式描述字符使用,而是处理成字符“%”的原样输出, 因此该句中的输出项 k 任然没有对应的格式描述符,也将不予输出。 该程序的目的是为了掌握变量按不同格式的输出,进一步认识格式描述符, printf 函数中参数的正确使用。 2-5 写出程序(S2-5.C)的运行结果,并对输出结果给予合理的解释。 源程序 S2-5.C #include main() {float x; double y; x=213.82631; y=213.82631; printf ("%-4.2f, %-6.2e\n", x,y); } 〖指导〗
使用f格式描述符输出浮点数时的一般形式是%mnf或%mntf,其中m指定 输出数据所占的总列数;n指定小数点后的位数,“是使输出数据左对齐,当输 出数据宽度大于m时,数据的整数部分将按照实际位数输出,在本例中由于输 出数据宽度大于m,因此%后面的“对输出格式无影响。使用ε格式描述符输出 浮点数时的一般形式是%mne或%-mne,其中m、n、“的含义与f格式相同。 在不同的计算机中,对指数部分应占的宽度规定不同,而数值部分均按标准化指 数形式输出(即小数点前必须有而且仅有一位非零数字)。该题中y的实际宽度 为9,而格式说明中所给定的域宽为6,所以只能按标准化指数形式输出y的整 数部分,截去小数部分并四舍五入。 该程序的目的是为了进一步认识格式描述符 2-6下面程序(S2-6C)的功能是从键盘上输入ⅹ=25,y=36.7,c=C,然后将输 入的内容输出到屏幕上。调试程序S2-6C,修改有错误的语句行,并输出正 确的结果。 源程序S2-6C #include ain( char canf("x=%d, y=%d, c=%c" x,y, c) printf("nx=%d, y=%d, c=%c"x,y, c) getcho 〖指导〗 调试程序S2-6C时要注意的问题有 (1)函数scan0的输入表列要求是变量地址的表列,否则在编译时会给出警 告错误 Possible use of xxx before definition (2)函数scan)的格式描述符要与输入表列中变量的类型一致。如果类型不
5 使用 f 格式描述符输出浮点数时的一般形式是%m.nf 或%-m.nf,其中 m 指定 输出数据所占的总列数;n 指定小数点后的位数,“-”是使输出数据左对齐,当输 出数据宽度大于 m 时,数据的整数部分将按照实际位数输出,在本例中由于输 出数据宽度大于 m,因此%后面的“-”对输出格式无影响。使用 e 格式描述符输出 浮点数时的一般形式是%m.ne 或%-m.ne,其中 m、n、“-”的含义与 f 格式相同。 在不同的计算机中,对指数部分应占的宽度规定不同,而数值部分均按标准化指 数形式输出(即小数点前必须有而且仅有一位非零数字)。该题中 y 的实际宽度 为 9,而格式说明中所给定的域宽为 6,所以只能按标准化指数形式输出 y 的整 数部分,截去小数部分并四舍五入。 该程序的目的是为了进一步认识格式描述符。 2-6 下面程序(S2-6.C)的功能是从键盘上输入 x=25,y=36.7,c=C,然后将输 入的内容输出到屏幕上。调试程序 S2-6.C,修改有错误的语句行,并输出正 确的结果。 源程序 S2-6.C #include main() { int x; float y; char c; scanf("x=%d,y=%d,c=%c",x,y,c); printf("\nx=%d,y=%d,c=%c",x,y,c); getch(); } 〖指导〗 调试程序 S2-6.C 时要注意的问题有: (1) 函数 scanf()的输入表列要求是变量地址的表列,否则在编译时会给出警 告错误: Possible use of xxx before definition (2) 函数 scanf()的格式描述符要与输入表列中变量的类型一致。如果类型不
致,将得不到正确的输入值。如果foat型变量用%d格式输入,得到的是0 int型变量用%f格式输入,运行时会给出错误信息: canf: floating point formats not linked ogram termination (3)如果函数 scanf()的格式描述符中有按原样输入的字符,输入数据时一定 要按格式输入这些字符。 (4)函数 printi的格式描述符要与输出表列中变量的类型一致。否则得不到 正确的输入结果。如果foat型变量用%格式输出,得到的是0;int型变量用 f格式输出,运行时会给出错误信息 printf: floating point formats not linked Abnormal program termination 2-7编程(S2-7C)。执行下列语句后,a,b,c,de的值分别等于多少?为什么? inta,b,c,w=1x=2,y=3,z=4,d=5,e=6 +al++b&&++c; (d=wx)&&(e=y>z); 〖指导〗 在逻辑表达式的计算中要注意: (1)对于+l|++b&&+c运算,若++a为真,后面的运算就不再进行。 (2)对于艹a&&艹b+tc运算,若+ta为真,继续计算++b,若++b为真,就 不再计算++c;若+b为假,则继续计算++c。 (3)逻辑运算或关系运算的结果是一个逻辑值,即0或l。 28假设有 unsigned int a=3.b=10 char c=9. d=020 计算a1和~c&d1,移位运算优先于按位或运算 (3)对于~c&d<<1,左移运算优先于按位与运算,求反运算符优先级最高
6 一致,将得不到正确的输入值。如果 float 型变量用%d 格式输入,得到的是 0; int 型变量用%f 格式输入,运行时会给出错误信息: scanf: floating point formats not linked Abnormal program termination (3) 如果函数 scanf()的格式描述符中有按原样输入的字符,输入数据时一定 要按格式输入这些字符。 (4) 函数 printf()的格式描述符要与输出表列中变量的类型一致。否则得不到 正确的输入结果。如果 float 型变量用%d 格式输出,得到的是 0;int 型变量用 %f 格式输出,运行时会给出错误信息: printf: floating point formats not linked Abnormal program termination 2-7 编程(S2-7.C)。执行下列语句后,a,b,c,d,e 的值分别等于多少?为什么? int a,b,c,w=1,x=2,y=3,z=4,d=5,e=6; a=b=c=1; ++a||++b&&++c; (d=w>x)&&(e=y>z); 〖指导〗 在逻辑表达式的计算中要注意: (1) 对于++a||++b&&++c 运算,若++a 为真,后面的运算就不再进行。 (2) 对于++a&&++b||++c 运算,若++a 为真,继续计算++b,若++b 为真,就 不再计算++c;若++b 为假,则继续计算++c。 (3) 逻辑运算或关系运算的结果是一个逻辑值,即 0 或 1。 2-8 假设有 unsigned int a=3,b=10; char c=9, d=020; 计算 a>1 和~c&d>1,移位运算优先于按位或运算。 (3) 对于~c&d<<1,左移运算优先于按位与运算,求反运算符优先级最高