第 4章 顺序结构程序设计
主要内容
C的语句
简单的输入输出
顺序结构程序设计
要求:熟练掌握用合适的格式输入 /输出不同类型的数据;会编写简单的程序。
4.1 C语句
了解 C的基本语句,
1,简单语句,又称表达式语句。
在一个表达式的后面加上分号即构成表达式语句,例如
x=0; k++; printf("\n welcome");
2,复合语句,用一对花括号 { }括起来的多个语句序列,
有时称为分程序。(见下页例 4.2)
注意:复合语句以,}”结束,后面不需再加分号。
3,流程控制语句,用来控制程序中语句的执行顺序。 C
语言中提供了 9中流程控制语句(下面的章节将要学习)
例 4,2重复( 10次):输入两个整数,输出两数之和。
main()
{ int a,b,c,n; /*定义变量语句 */
for(n=1; n<=10; n++) /*for语句控制重复 10次 */
{ printf("\n input 2 integers:"); /*提示用户输入 */
scanf("%d%d",&a,&b); /*输入两个整数分别赋给 a,
b*/
c=a+b; /*求和并赋给 c*/
printf("sum,%d\n",c); /*输出和 */
}
}
4.2 输入 /输出概述
输入输出,是相对于计算机的主机而言的。
输入 是指从计算机的外部设备将数据读入主机,输出 是指将数据从主机送到外设(显示器、打印机、磁盘等)。
C语言本身没有专门的输入输出语句,输入输出操作是通过函数调用来实现的。编程时必须先将输入输出函数所在的头文件,stdio.h 包含进本程序中。使用命令:
#include "stdio.h " 或 #include <stdio.h>
C语言中的标准输入输出设备约定为用户终端,即键盘和显示器。
特别说明,调用输入函数时应该明确:数据从哪儿输入
(省略为键盘)、以什么格式输入、输入的数据存放在哪里;调用输出函数时应该明确:要输出什么内容、按什么格式输出、输出到哪个设备(省略为显示器)。
4.3 字符输入 /输出函数:
getchar( ) 和 putchar( )
1,putchar()函数:
调用格式,putchar(c);
其中,c是要输出的字符,它可以是字符型或整型的常量和变量。当 c为整型时,其值应是要输出的字符的 ASCII码,范围是 0~255.
函数功能,输出一个字符到显示屏的当前光标处。
例 4.3 输出三个字符,A*B。
#include,stdio.h”
main()
{ char c1; int c2;
c1='A'; c2=66; /*给变量 c1,c2赋值 */
putchar( '\n' ); /*输出字符 '\n'*/
putchar(c1); /*输出变量 c1中的字符:
'A'*/
putchar( '*' ); /*输出字符 '*' */
putchar(c2); /*输出变量 c2中的字符,'B'*/
}
2,getchar()函数:
调用格式,getchar()
函数功能,从标准输入设备(一般指键盘)读取一个字符,返回该字符的 ASCII
码 。
例 4,4 输入两个字符,输出每个字符及其 ASCII码。
#include "stdio.h"
main()
{ char c,d;
printf("\n enter two characters:"); /*提示用户 */
c=getchar( );
d=getchar( );
printf("%c:%d\n",c,c); /*输出 c中的字符及 ASCII
码 */
printf("%c:%d",d,d);
}
运行结果,(在 TC中演示其执行过程)
enter two characters:AB ↙
A:65
B:66
特别提示,从键盘输入数据时,并不是键入一个字符后立即将其送入主机,而是等到按下回车键后,
才能把这一行字符送入计算机的数据缓冲区,然后输入函数从缓冲区的第一个字符开始逐个读取数据。
只有当缓冲区中无数据可读时,才等待用户输入。
思考:
(1) 若输入,a b↙,结果如何?(注,,a,b之间有一个空格,空格也是一个字符,与 '\n'一样是不可见字符)
4.4 格式输入 /输出函数
1,Printf()函数的一般调用格式:
printf(格式控制字符串,输出表列);
例如,printf("\n enter name:");
printf("\n a=%d,b=%f ",a,b);
/* 设 int a=3;float b=5;*/
printf("%f",a*b);
明确:格式控制符、普通字符的作用。
2,Scanf()的一般调用格式:
scanf(格式控制串,地址表列);
例如,scanf("%d%f ",&a,&b);
scanf("a=%d,b=%f ",&a,&b); /*不常用 */
1,格式输出函数 printf()
例 4.5:打印华氏温度到摄氏温度的对应表:
华氏温度 -摄氏温度
0 -17
20 -6
40 4
60 15
80 26
100 37
120 48
……
320 148
分析任务:从华氏温度 0到 320,每隔
20度转换一次,转换的公式为:
c = (5/9)(f-32)
其中,f为华氏温度,
c为摄氏温度
#include <stdio.h>
main()
{float celsius; int fahrenheit;
printf("\n F C ");
fahrenheit = 0;
while( fahrenheit <=300 )
{ celsius = 5*(fahrenheit – 32)/9;
printf("\n %d\t%f",fahrenheit,celsius);
fahrenheit +=20;
}
}
若要使输出更整齐些(比如 右对齐 ),可将语句
printf("\n %d\t%f",fahrenheit,celsius);
改为:
printf("\n %3d\t %6.2f ",fahrenheit,celsius);
其中,%3d的含义为:按整型格式输出,域宽为 3,
并且右对齐。
%6.2f的含义为:按实型格式输出,域宽为 6,且小数点后保留 2位小数,右对齐。
若将 %3d改为 %-3d则在域宽范围内实现左对齐。
具体的格式说明符参见表 4.1和表 4.2
例 4,7 输出字符和字符串。
main()
{ char ch='Y';
/*定义一个字符数组 s,
并保存字符串 "very good"*/
char s[ ]="very good";
printf("\nch,%c,s,%s",ch,s);
}
Result:
ch,Y,s,very good
程序中,输出项 ch,s与控制项 %c,%s一一对应,且类型匹配 。
2,格式输入函数 Scanf()
例 4,10 用 scanf输入整型数据,实型数据 。
#include <stdio.h>
main()
{ int a,b; float x,y;
scanf("%d%d",&a,&b);
scanf("%f,%f",&x,&y);
printf("\na=%d,b=%d,x=%f,y=%f",a,b,x,y);
}
运行结果,
12 24↙ ( 12与 24之间用空格分开)
15,30↙ (注意两数间的逗号 )
a=12,b=24,x=15.000000,y=30.000000
例 4.12:输入某商品的编号(整型)、类别( A~Z字符型)、价格(实型),并输出该信息。
#include <stdio.h>
main()
{ int num ; char class ; float price ;
printf("\n enter number(A~Z):");
scanf("%d",&num); getchar( );
printf("\n enter class,");
class = getchar( ); getchar( );
printf("\n enter price,");
scanf("%f",&price); getchar();
printf(" no=%d,class = %c,price=%6.2f",no,class,
price );
}
特点:混合输入,有两种处理方法:一是在一个
scanf()函数中实现所有数据的输入;二是将数值与字符分别输入,而不是用一个 scanf()函数。通常采用第二种方法,用第一种方法输入时容易出错。
本程序中分别用 scanf()和 getchar()输入编号、价格和类别。
并且每次输入后用 getchar() 读取多余的回车符,以免影响后面的正确输入。
4.5 顺序结构程序设计举例例 4,15 交换两个整型变量的值。
分析:首先定义程序中要用到的变量,设两个整型变量为 a,b。
然后设计算法:①输入两个整数 a,b ② 交换 a,b的值 ③输出交换后的 a,b的值。
其中,实现② 的方法有两种:
一是用第三个变量 c暂存其中一个数,如程序 1。
二是不使用第三个变量,利用其中一个变量保存两数之和,通过减法来实现,如程序 2。
程序 1:
main()
{ int a,b,c;
printf("\n enter 2 integers to a,b:");
scanf("%d%d",&a,&b);
c=a; a=b; b=c; /*交换 */
printf("\na=%d,b=%d",a,b);
}
运行结果,
enter 2 integers to a,b:4 6↙
a=6,b=4
思考,若将三个交换语句的顺序调整,结果如何?
程序 2:
main()
{ int a,b,c;
printf("\n enter 2 integers to a,b:");
scanf("%d%d",&a,&b);
a=a+b ; b= a - b ; a=a – b; /*交换 */
printf("\na=%d,b=%d",a,b);
}
运行结果同上。
例 4,17 输入一个数字符号,并转换成相应的整数输出。如读入字符 '8',转换成整数 8输出。
分析:首先定义程序中要使用的变量,设字符变量 ch 存放读入的字符,整型变量 d存放转换后的整数。
然后设计算法:
①输入一个字符给 ch
② 将字符 ch转换成对应的数值 d
③ 输出 d。
其中第二步如何转换呢?利用 ASCII码的编码规律:
'0','1','2'……'9' 的 ASCII码值是连续的,即 48、
49,50……57 。因此,只要将数字字符与字符 '0'
相减,结果就是该字符对应的数值。如 '8'- '0'值为 8。
程序:
#include <stdio.h>
main()
{ char ch; int d;
printf("\n enter a character(0~9):");
ch=getchar( ); /*读入一个字符并赋给 ch */
d=ch -'0';
printf("d=%d",d);
}
作业
1,上机练习 1~4
2,习题 1,3
主要内容
C的语句
简单的输入输出
顺序结构程序设计
要求:熟练掌握用合适的格式输入 /输出不同类型的数据;会编写简单的程序。
4.1 C语句
了解 C的基本语句,
1,简单语句,又称表达式语句。
在一个表达式的后面加上分号即构成表达式语句,例如
x=0; k++; printf("\n welcome");
2,复合语句,用一对花括号 { }括起来的多个语句序列,
有时称为分程序。(见下页例 4.2)
注意:复合语句以,}”结束,后面不需再加分号。
3,流程控制语句,用来控制程序中语句的执行顺序。 C
语言中提供了 9中流程控制语句(下面的章节将要学习)
例 4,2重复( 10次):输入两个整数,输出两数之和。
main()
{ int a,b,c,n; /*定义变量语句 */
for(n=1; n<=10; n++) /*for语句控制重复 10次 */
{ printf("\n input 2 integers:"); /*提示用户输入 */
scanf("%d%d",&a,&b); /*输入两个整数分别赋给 a,
b*/
c=a+b; /*求和并赋给 c*/
printf("sum,%d\n",c); /*输出和 */
}
}
4.2 输入 /输出概述
输入输出,是相对于计算机的主机而言的。
输入 是指从计算机的外部设备将数据读入主机,输出 是指将数据从主机送到外设(显示器、打印机、磁盘等)。
C语言本身没有专门的输入输出语句,输入输出操作是通过函数调用来实现的。编程时必须先将输入输出函数所在的头文件,stdio.h 包含进本程序中。使用命令:
#include "stdio.h " 或 #include <stdio.h>
C语言中的标准输入输出设备约定为用户终端,即键盘和显示器。
特别说明,调用输入函数时应该明确:数据从哪儿输入
(省略为键盘)、以什么格式输入、输入的数据存放在哪里;调用输出函数时应该明确:要输出什么内容、按什么格式输出、输出到哪个设备(省略为显示器)。
4.3 字符输入 /输出函数:
getchar( ) 和 putchar( )
1,putchar()函数:
调用格式,putchar(c);
其中,c是要输出的字符,它可以是字符型或整型的常量和变量。当 c为整型时,其值应是要输出的字符的 ASCII码,范围是 0~255.
函数功能,输出一个字符到显示屏的当前光标处。
例 4.3 输出三个字符,A*B。
#include,stdio.h”
main()
{ char c1; int c2;
c1='A'; c2=66; /*给变量 c1,c2赋值 */
putchar( '\n' ); /*输出字符 '\n'*/
putchar(c1); /*输出变量 c1中的字符:
'A'*/
putchar( '*' ); /*输出字符 '*' */
putchar(c2); /*输出变量 c2中的字符,'B'*/
}
2,getchar()函数:
调用格式,getchar()
函数功能,从标准输入设备(一般指键盘)读取一个字符,返回该字符的 ASCII
码 。
例 4,4 输入两个字符,输出每个字符及其 ASCII码。
#include "stdio.h"
main()
{ char c,d;
printf("\n enter two characters:"); /*提示用户 */
c=getchar( );
d=getchar( );
printf("%c:%d\n",c,c); /*输出 c中的字符及 ASCII
码 */
printf("%c:%d",d,d);
}
运行结果,(在 TC中演示其执行过程)
enter two characters:AB ↙
A:65
B:66
特别提示,从键盘输入数据时,并不是键入一个字符后立即将其送入主机,而是等到按下回车键后,
才能把这一行字符送入计算机的数据缓冲区,然后输入函数从缓冲区的第一个字符开始逐个读取数据。
只有当缓冲区中无数据可读时,才等待用户输入。
思考:
(1) 若输入,a b↙,结果如何?(注,,a,b之间有一个空格,空格也是一个字符,与 '\n'一样是不可见字符)
4.4 格式输入 /输出函数
1,Printf()函数的一般调用格式:
printf(格式控制字符串,输出表列);
例如,printf("\n enter name:");
printf("\n a=%d,b=%f ",a,b);
/* 设 int a=3;float b=5;*/
printf("%f",a*b);
明确:格式控制符、普通字符的作用。
2,Scanf()的一般调用格式:
scanf(格式控制串,地址表列);
例如,scanf("%d%f ",&a,&b);
scanf("a=%d,b=%f ",&a,&b); /*不常用 */
1,格式输出函数 printf()
例 4.5:打印华氏温度到摄氏温度的对应表:
华氏温度 -摄氏温度
0 -17
20 -6
40 4
60 15
80 26
100 37
120 48
……
320 148
分析任务:从华氏温度 0到 320,每隔
20度转换一次,转换的公式为:
c = (5/9)(f-32)
其中,f为华氏温度,
c为摄氏温度
#include <stdio.h>
main()
{float celsius; int fahrenheit;
printf("\n F C ");
fahrenheit = 0;
while( fahrenheit <=300 )
{ celsius = 5*(fahrenheit – 32)/9;
printf("\n %d\t%f",fahrenheit,celsius);
fahrenheit +=20;
}
}
若要使输出更整齐些(比如 右对齐 ),可将语句
printf("\n %d\t%f",fahrenheit,celsius);
改为:
printf("\n %3d\t %6.2f ",fahrenheit,celsius);
其中,%3d的含义为:按整型格式输出,域宽为 3,
并且右对齐。
%6.2f的含义为:按实型格式输出,域宽为 6,且小数点后保留 2位小数,右对齐。
若将 %3d改为 %-3d则在域宽范围内实现左对齐。
具体的格式说明符参见表 4.1和表 4.2
例 4,7 输出字符和字符串。
main()
{ char ch='Y';
/*定义一个字符数组 s,
并保存字符串 "very good"*/
char s[ ]="very good";
printf("\nch,%c,s,%s",ch,s);
}
Result:
ch,Y,s,very good
程序中,输出项 ch,s与控制项 %c,%s一一对应,且类型匹配 。
2,格式输入函数 Scanf()
例 4,10 用 scanf输入整型数据,实型数据 。
#include <stdio.h>
main()
{ int a,b; float x,y;
scanf("%d%d",&a,&b);
scanf("%f,%f",&x,&y);
printf("\na=%d,b=%d,x=%f,y=%f",a,b,x,y);
}
运行结果,
12 24↙ ( 12与 24之间用空格分开)
15,30↙ (注意两数间的逗号 )
a=12,b=24,x=15.000000,y=30.000000
例 4.12:输入某商品的编号(整型)、类别( A~Z字符型)、价格(实型),并输出该信息。
#include <stdio.h>
main()
{ int num ; char class ; float price ;
printf("\n enter number(A~Z):");
scanf("%d",&num); getchar( );
printf("\n enter class,");
class = getchar( ); getchar( );
printf("\n enter price,");
scanf("%f",&price); getchar();
printf(" no=%d,class = %c,price=%6.2f",no,class,
price );
}
特点:混合输入,有两种处理方法:一是在一个
scanf()函数中实现所有数据的输入;二是将数值与字符分别输入,而不是用一个 scanf()函数。通常采用第二种方法,用第一种方法输入时容易出错。
本程序中分别用 scanf()和 getchar()输入编号、价格和类别。
并且每次输入后用 getchar() 读取多余的回车符,以免影响后面的正确输入。
4.5 顺序结构程序设计举例例 4,15 交换两个整型变量的值。
分析:首先定义程序中要用到的变量,设两个整型变量为 a,b。
然后设计算法:①输入两个整数 a,b ② 交换 a,b的值 ③输出交换后的 a,b的值。
其中,实现② 的方法有两种:
一是用第三个变量 c暂存其中一个数,如程序 1。
二是不使用第三个变量,利用其中一个变量保存两数之和,通过减法来实现,如程序 2。
程序 1:
main()
{ int a,b,c;
printf("\n enter 2 integers to a,b:");
scanf("%d%d",&a,&b);
c=a; a=b; b=c; /*交换 */
printf("\na=%d,b=%d",a,b);
}
运行结果,
enter 2 integers to a,b:4 6↙
a=6,b=4
思考,若将三个交换语句的顺序调整,结果如何?
程序 2:
main()
{ int a,b,c;
printf("\n enter 2 integers to a,b:");
scanf("%d%d",&a,&b);
a=a+b ; b= a - b ; a=a – b; /*交换 */
printf("\na=%d,b=%d",a,b);
}
运行结果同上。
例 4,17 输入一个数字符号,并转换成相应的整数输出。如读入字符 '8',转换成整数 8输出。
分析:首先定义程序中要使用的变量,设字符变量 ch 存放读入的字符,整型变量 d存放转换后的整数。
然后设计算法:
①输入一个字符给 ch
② 将字符 ch转换成对应的数值 d
③ 输出 d。
其中第二步如何转换呢?利用 ASCII码的编码规律:
'0','1','2'……'9' 的 ASCII码值是连续的,即 48、
49,50……57 。因此,只要将数字字符与字符 '0'
相减,结果就是该字符对应的数值。如 '8'- '0'值为 8。
程序:
#include <stdio.h>
main()
{ char ch; int d;
printf("\n enter a character(0~9):");
ch=getchar( ); /*读入一个字符并赋给 ch */
d=ch -'0';
printf("d=%d",d);
}
作业
1,上机练习 1~4
2,习题 1,3