第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