第3章 顺序结构程序设计 第一单元 基础知识 一、知识点梳理 内 容 描 述 备 注 顺序结构程序设计的IPO三部曲 顺序结构程序设计往往包含三部分: 输入数据或给变量赋值,I(input) 处理数据或进行计算,P(processing) 输出结果,O(output) 程序开始必须首先声明变量 main()函数 一个C程序总是从main()函数开始执行的 二、基础题 1.一个C语言的执行是从 。 A)本程序的主函数开始,到本程序的主函数结束 B)本程序的第一个函数开始,到本程序的最后一个函数结束 C)本程序的主函数开始,到本程序的最后一个函数结束 D)本程序的第一个函数开始,到本程序的主函数结束 2.下列选项中,叙述正确的是 。 A)在C程序中,主函数必须位于程序的最前面 B)在C程序中,一行只能写一条语句 C)C程序的基本结构是程序行 D)C语句是完成某种程序功能的最小单位 3.C语言程序的基本单位是 。 A)程序行 B)语句 C)函数 D)字符 4.在下列选项中,不正确的赋值语句是____。 A)++t; B)n1=(n2=(n3=0)); C)k=i=j; D)a=b+c=1; 5.若已定义int a=5,则表达式a=10,a+10,a++的值是 。 A)5 B)10 C)11 D)6 6.若已定义int a=5,则表达式a=(10,a+10,a++)的值是 。 A)5 B)10 C)11 D)6 7.以下程序的输出结果是 。 #include<stdio.h> int main() { int a=12, b=12; printf("%d,%d\n",--a,++b); return 0; } A)10,10 B)12,12 C)11,10 D)11,13 8.已知字母A的ASCII码为十进制的65,下面程序的输出结果是 。 #include<stdio.h> int main() { char ch1,ch2; ch1='A'+'5'-'3'; ch2='A'+'6'-'3'; printf("%d,%c\n",ch1,ch2); return 0; } A)67,D B)B,C C)C,D D)不确定的值 9.执行以下程序,输出结果是_____。 #include<stdio.h> void main() { int a=65; char b; b='a'; printf("%c\n",b); } A)b B)a C)65 D)A 10.执行以下程序,输出结果是_____。 #include<stdio.h> int main() { char ch; int k; ch='a'; k=65; printf("%d,%c,%d,%c",ch,ch,k,k); return 0; } A)a,a,65,65 B)97,a,65,A C)97,a,65,65 D)a,a,65,65 第二单元 实验 一、常见错误小结 常见错误实例 错 误 描 述 错 误 类 型 int main() { a=10; ... } 变量a未定义就使用 编译错误 int newValue; newvalue=0; 忽视了变量区分大小写,使得定义的变量和使用的变量不同名 编译错误 printf("input n:"); int n; 在可执行语句之后定义变量 编译错误 int m=n=0; 在定义变量时,对多个变量进行连续赋初值 正确写法:int m=0,n=0; 编译错误 #define PI=3.14159; 将宏定义当作C语句来使用,在行末加上了分号,或者在宏名后加上了“=” 正确写法:#define PI 3.14159 编译错误 int a; a=5 语句结尾漏写分号 正确写法:a=5; 编译错误 int main() { ... 程序最后漏写花括号} 编译错误 int mian() { ... } 将main()误写成mian(),C语言编译系统会误以为mian()是用户自定义的一个外部函数 连接错误 二、编程技能——以正确的格式输入数据 【例3-1】 对输入非法数据的检查与处理。 #include<stdio.h> int main() { int a,b; scanf("%d,%d",&a,&b); printf("a=%d, b=%d\n",a,b); return 0; } (1)输入正确的数据,其运行结果如下。 (2)输入不正确的数据:scanf语句只读入了2.3的整数部分2,赋值给变量a,后面的小数点被视为非法字符而导致输入结束,因此变量b中的值为随机值。运行结果如下。 (3)输入不正确的数据:scanf语句没有读到合法的数据,因此变量a和b的值都是随机值。运行结果如下。 【例3-2】 字符数据的正确输入。 在输入字符时,字符之间不能像输入数值一样用空格键或回车键分隔字符,因为空格键或回车键都是合法的字符。 #include<stdio.h> int main() { char a,b; printf("please input a and b:\n"); a=getchar(); b=getchar(); printf("a='%c', b='%c'\n",a,b); return 0; } (1)输入正确的字符,其运行结果如下。 (2)输入的两个字符之间加入了回车键,变量a读入字符x,变量b读入回车符,运行结果如下。 用scanf语句和%c格式符输入字符,也会产生同样的问题。 三、实验指导 实验3 顺序结构程序设计 1.实验目的 (1)掌握C语言中使用最多的一种语句——赋值语句的使用方法。 (2)掌握C语言的各种数据类型:整型、实型、字符型变量的定义。 (3)掌握C语言中算术运算符及表达式的使用。 (4)掌握C语言的顺序结构程序设计方法。 2. 实验内容和步骤 【基础部分】理解顺序结构程序的执行过程,理解各种数据类型及它们的运算 (1)给定程序c3-1-1.c的功能为根据键盘输入圆的半径,计算圆的面积。 ① 编辑并运行该程序,观察运行结果。 /* c3-1-1.c */ #include <stdio.h> int main() { float r; double area; printf("请输入圆的半径:"); scanf("%f",&r); area=3.14159*r*r; printf("计算结果如下:\n"); printf("r=%5.2f, area=%lf\n",r,area); return 0; } 运行程序,从键盘输入4.5,程序的运行结果如图3-1所示。 图3-1 程序c3-1-1.c的运行结果 ② 将程序c3-1-1.c中的语句调换位置,并另存为c3-1-2.c。 /* c3-1-2.c */ #include <stdio.h> int main() { float r; double area; area=3.14159*r*r; //将计算面积的语句提前到输入数据之前 printf("请输入圆的半径:"); scanf("%f",&r); printf("计算结果如下:\n"); printf("r=%5.2f, area=%lf\n",r,area); return 0; } 当在某台计算机上编译时,程序出现如图?3-2?所示的警告信息,程序的运行结果如 图?3-3所示。分析并回答出现这样结果的原因。 图3-2 程序c3-1-2.c的警告信息 图3-3 程序c3-1-2.c的运行结果 (2)下列程序是浮点类型数据的使用,观察程序的运行结果,分析并回答问题。 /* c3-1-3.c */ #include <stdio.h> int main() { float fa,fb,fc,fsum; double d; fa=3141.592678; fb=6.026e-27; fsum=fa+fb ; d=31415926.78; printf("float类型数据的打印结果:\n"); printf("fa=%f\t fb=%f\t fsum=%7.2f\n",fa,fb,fsum); //用格式符%f输出 //float类型变量 printf("fa=%e\t fb=%e\t fsum=%e\n",fa,fb,fsum); //用格式符%e输出 //float类型变量 printf("double类型数据的打印结果:\n "); printf("d=%lf, d=%e\n",d,d); return 0; } ① 当在某台计算机上编译此程序时,程序出现如图3-4所示的警告信息,为什么? 图3-4 程序c3-2-1.c的警告信息 ② 观察并分析程序中第2条和第3条输出语句的结果。 (3)下列程序涉及字符类型和整型类型的互通性,观察程序的运行结果,分析并回答问题。 /* c3-1-4.c */ #include <stdio.h> intmain() { char c1='a',c2='b',c3='c'; c1=c1+2; c2=c2+8; c3=c3-32; printf("char类型数据的打印结果:\n "); printf("c1=%c\t c2=%c\t c3=%c\n",c1,c2,c3); printf("char类型数据和int类型的关系:\n"); printf("c1=%d\t c2=%d\t c3=%d",c1,c2,c3); return 0; } ① 变量c1、c2、c3用格式符%c和%d输出时的结果为何不同? ② 变量c1、c2、c3用格式符%c输出时,为什么输出结果不再是'a'、' b'、'c',而是变成了'c'、'j'、'C'? (4)下列程序可以测试整型数据类型变量的取值范围,观察程序的运行结果,分析并回答问题。 /* c3-1-5.c */ #include <stdio.h> int main() { Inta,b,c,d ; a = 2147483647; /* 为整型变量a赋值最大的正整数 */ b = a+1; c = -2147483648; /* 为整型变量c设定最小的负整数 */ d = c-1; printf("正数范围a=%d, b=%d\n", a, b); printf("负数范围c=%d, d=%d\n", c, d); return 0; } ① 已知在内存中,整型数据占4字节空间,最大值为2147483647,程序中变量b的值为什么不是2147483648?将一个大于2147483647的整数赋给一个整型变量,会得到什么结果? ② 占内存4字节的整数的最小值为什么是?2147483648而不是?2147483647?程序中变量d的值为什么不是?2147483649? (5)下列程序为多种数据类型应用,观察程序的运行结果,分析并回答问题。 /* c3-1-6.c */ #include <stdio.h> int main() { inta,b; unsigned c ,d; a = 100; b = -100; c = a; d = b; //将一个负整数赋给一个无符号的变量 printf("a=%d, b=%d\n", a, b); printf("a=%u, b=%u\n", a, b); //按无符号格式输出a,b printf("c=%u, d=%u\n", c, d); return 0; } ① 观察变量d的值,分析将一个负整数赋给一个无符号的变量,会得到什么结果? ② 观察变量c的值,分析将一个整数赋给无符号变量,会得到什么结果? ③ 无符号整数的最大值为4294967295。改变程序中各变量的值,例如,a = 4294967295,b = ?4294967295。重新分析上述问题①和②。 (6)下列程序为算术运算符“/”“%”和强制类型转换运算符的使用,观察程序的运行结果,分析并回答问题。 /*c3-1-7.c */ #include "stdio.h" int main( ) { inta,b; a=2; b=1%a; printf("%d\n",1/a); printf("b=%d\n",b); printf("%f %f\n",(float)(1/a), (float)1/a); return 0; } ① 第一个printf 语句的输出结果为什么是0? ② 第三个printf 语句中2个输出项的输出结果为什么不同? (7)下列程序为不同类型数据的混合运用,观察程序的运行结果,分析并回答问题。 /* c3-1-8.c */ #include <stdio.h> int main() { int a ; float d ; char c1 ; double f ; long m ; unsigned p ; a = 61; c1 = 'a'; d = 3.56; f = 3157.890121; m = -2147483647; p =-2147483647; printf(" a=%d \n c1=%c \n d=%6.2f \n", a, c1, d); printf(" f=%15.12f \n m=%ld \n p=%u \n", f, m, p); return 0; } ① 运行程序并分析运行结果(特别注意变量p输出的值)。 ② 不用赋值语句,改用scanf()函数输入数据,scanf()函数如下: scanf("%d,%c,%f,%lf,%ld,%u",&a,&c1,&d,&f,&m,&p); 输入的数据如下:61,a,3.563157,0.123456789,-2147483648,-2147483647↙ 分析运行结果(说明:lf和ld格式符分别用于输入double型和long型数据)。 注意:程序运行时,scanf()输入各类不同数据时采用的分隔符的情况。 ③ 将printf语句改为: printf("a=%d\nc1=%c\nd=%15.6f\n",a,c1,d); printf("f=%f\nm=%d\np=%d\n", f, m, p); 分析运行结果。 ④ 将变量p改用%o格式符输出。 ⑤ 将scanf()函数中的%lf和%ld改为%f和%d,运行程序并分析运行结果。 (8)下列程序为不同数据类型的混合运算,观察程序的运行结果,分析并回答问题。 /* c3-1-9.c */ #include <stdio.h> int main( ) { int n=100; float f; double d; f=n+2.5; printf("f=%f\n",f); n=f/2; printf("n=%d\n",n); n=(1/2)*f; printf("n=%d\n",n); d=f*2; printf("d=%lf\n",d); return 0; } ① 在某台计算机上编译此程序时,程序出现如图3-5所示的警告信息,为什么? 图3-5 程序c3-1-9.c的警告信息 ② 观察并分析程序运行结果。 【提高部分】掌握顺序结构程序设计 1)程序填空 说明:程序中有多个空,(1)、(2)等需要补充完整。将程序中的 (1) 、 (2) 等删除后,在相应的位置填入正确答案并调试,直到得到正确结果为止。 注意:不要随意改动程序,不得增行或删行,也不得更改程序的结构! (1)给定程序c3-2-1.c的功能是将a、b两个变量的值交换并输出。通过赋值语句给变量a和b赋值,完善程序,使程序的运行结果如图3-6所示。 图3-6 程序c3-2-1.c的运行结果 /* c3-2-1.c */ #include <stdio.h> int main( ) { inta,b,t; /**************found************/ ___(1)____; //此处填写通过赋值语句给变量a赋值的语句 /**************found************/ ___(2)____; //此处填写通过赋值语句给变量b赋值的语句 t=a; a=b; b=t; /* 以上三条赋值语句实现a,b变量值的交换 */ /**************found************/ ____(3)____; //此处填写输出变量a、b的值的语句 return 0; } (2)给定程序c3-2-2.c的功能是将a、b两个变量的值交换并输出。通过scanf()函数从键盘输入变量a和b的值,完善程序,使程序的运行结果如图3-7所示。 图3-7 程序c3-2-2.c的运行结果 /* c3-2-2.c */ #include <stdio.h> int main( ) { inta,b,t; printf(“请输入变量a、b的值:”); /**************found************/ ___(1)____; //此处填写通过scanf()从键盘输入数据给变量a、b的语句 /**************found************/ ____(2)____ //此处填写输出交换前变量a、b的值的语句 t=a; a=b; b=t; /**************found************/ ____(3)____ //此处填写输出交换后变量a、b的值的语句 return 0; } (3)程序c3-2-3.c的功能是,当x=2.5, a=7, y=4.7时,计算并输出表达式x + a % 3 * (int) (x + y) % 2 / 4的运算结果。完善程序,使程序的运行结果如图3-8所示,并分析得到运行结果的原因。 图3-8 程序c3-2-3.c的运行结果 /* c3-2-3.c */ #include <stdio.h> int main( ) { /**************found************/ ___(1)____; //此处填写对变量a的定义和赋值语句 /**************found************/ ___(2)____; //此处填写对变量x,y,z的定义和赋值语句 z= x + a % 3 * (int) (x + y) % 2 / 4; printf("z=%f\n",z); return 0; } 2)程序设计 (1)编写程序?c3-2-4.c,程序的功能是从键盘上输入一个华氏度,能够输出相应的摄氏度,输出结果保留2位小数。华氏度F与摄氏度C的转换关系为: 提示:程序框架如下。 /*c3-2-4.c*/ #include <stdio.h> int main( ) { (1) //定义需要的变量类型 (2) //键盘输入已知华氏度F (3) //由赋值语句实现转换为摄氏度C (4) //输出语句 } (2)编写程序?c3-2-5.c,程序所实现的功能是,两次调用getchar()函数读入两个字符,分别赋给c1和c2,再分别用putchar( )函数和printf( )函数输出这两个字符。 提示:程序框架如下,注意输入两个字符时必须是连续的,中间不能有空格。 /* c3-2-5.c */ #include <stdio.h> int main( ) { (1) //定义需要的变量(注意类型) (2) //用getchar函数从键盘读入c1 (3) //用getchar函数从键盘读入c2 (4) //用putchar函数输出变量c1,c2 (5) //用printf函数输出变量c1,c2 //return 0; } (3)编写程序c3-2-6.c,程序所实现的功能是,设圆的半径r=1.5,圆柱体的高h=3,求对应的圆的周长、圆的面积、圆柱的体积。要求使用scanf函数输入圆的半径和圆柱体的高,输出计算结果。输出时要有文字说明,输出结果保留2位小数。 【拓展部分】文本文件的使用 (1)编写程序c3-3-1.c,程序实现的功能是,从键盘输入一位同学的学号及其高数、英语、C语言3门课的成绩,计算平均分,并写入文件score_avg.txt中。 例如,从键盘输入数据:1001 90 80 70,文件score_avg.txt中的记录应如下: 学号 高数 英语 C语言 平均分 1001 90 80 70 80.00 (2)改写程序c3-3-1.c,程序另存为c3-3-2.c,学号及3门课的成绩从文件score.txt中读入(而不是从键盘读入),写入文件score_avg.txt中。score.txt文件格式如图3-6所示。 图3-6 程序运行后文本文件score.txt的内容 C语言程序设计典型习题与实验(第2版) 顺序结构程序设计 26 27