470 likes | 569 Vues
第 5 章 顺序结构程序设计. 教学内容: 5.1 顺序结构程序 5.2 字符输入输出函数 5.3 格式输入输出函数 5.4 顺序结构程序设计应用实例 教学要求: 1. 掌握编写顺序结构程序的基本方法。 2. 掌握字符输入输出函数的使用。 3. 掌握 scanf 和 printf 函数的使用。. 在顺序结构程序中,各语句是按照位置的先后次序,顺序执行的,且每个语句都会被执行到。 一、简单顺序结构程序组成 1 .程序头部分 ( 1 )程序功能的注释。 ( 2 )编译预处理命令,一般包括文件包含编译预处理命令,以及宏定义命令。
E N D
第5章 顺序结构程序设计 教学内容: 5.1 顺序结构程序 5.2 字符输入输出函数 5.3 格式输入输出函数 5.4 顺序结构程序设计应用实例 教学要求: 1.掌握编写顺序结构程序的基本方法。 2.掌握字符输入输出函数的使用。 3.掌握scanf和printf函数的使用。
在顺序结构程序中,各语句是按照位置的先后次序,顺序执行的,且每个语句都会被执行到。在顺序结构程序中,各语句是按照位置的先后次序,顺序执行的,且每个语句都会被执行到。 一、简单顺序结构程序组成 1.程序头部分 (1)程序功能的注释。 (2)编译预处理命令,一般包括文件包含编译预处理命令,以及宏定义命令。 2.顺序结构程序函数主体 函数体内主要包括以下一些成分。 (1)变量的说明部分。 (2)数据输入部分。 (3)运算部分。 (4)运算结果输出部分。 5.1 顺 序 结 构 程 序
例5.1从键盘输入圆的半径,求圆的周长和面积。程序如下:例5.1从键盘输入圆的半径,求圆的周长和面积。程序如下: /*求圆的周长和面积*/ #include <stdio.h> # define PI 3.14159 main() { int r; /*算法步骤①*/ float s, area; /*算法步骤②*/ scanf("%d",&r); s=PI*2*r; /*算法步骤③*/ area = PI*r*r; printf(" s=%f",s); /*算法步骤④*/ printf("area =%f", area ); } 程序算法: ① 定义圆半径、圆周长、面积的变量; ② 从键盘输入圆半径数值; ③ 按照计算公式计算求出圆的周长和面积; ④ 输出圆的周长和面积的数值;
5.2 字 符 输 入 输 出 函 数 一、单个字符的输入函数 1.getchar()函数的格式:getchar(); 2.getchar()函数的作用: 从系统隐含的输入设备(如键盘)输入一个字符。 3.说明: (1)getchar()函数只能用于单个字符的输入,一次输入一个字符。 (2)程序中要使用getchar()函数,必须在程序(或文件)的开头加上编译预处理命令: # include "stdio.h"
例5.2 getchar()函数的使用。 #include "stdio.h" /*文件包含*/ main() { char ch; printf("Please input a character: "); ch=getchar(); /*输入1个字符并赋给ch */ printf("%c", ch ); /*输出一个字符*/ printf('\n'); } 程序运行情况如下: Please input a characters: b↙ b
二、单个字符的输出函数 1.putchar()函数的格式: putchar(ch); 其中ch可以是一个字符变量或常量,也可以是一个转义字符。 2.putchar()函数的作用:向终端输出一个字符。 3 .说明: (1)putchar()函数只能用于单个字符的输出,且一次只能输出一个字符。 (2)在程序中使用putchar()函数,务必牢记:在程序(或文件)的开头加上编译预处理命令(也称文件包含命令):#include "stdio.h" 表示要使用的函数,包含在标准输入输出(stdio .h )头文件中。
例5.3putchar()函数的格式和使用方法。 #include "stdio.h" /*文件包含命令*/ main() { char ch1='N', ch2='E', ch3='W'; putchar(ch1); putchar(ch2); putchar(ch3); putchar('\n'); putchar(ch1); putchar('\n'); putchar('E'); putchar('\n'); putchar(ch3); putchar('\n'); } 程序运行结果如下: NEW N E W
5.3 格 式 输 入 输 出 函 数 一、printf()函数 1.printf() 函数的一般格式 printf("格式字符串" [,输出项表]); 2.函数的作用:输出一个或多个任意类型的数据。 3.格式字符串 “格式字符串”也称“转换控制字符串”,可以包含三种字符:格式指示符、转义字符、普通字符 (1)格式指示符 一般形式如下: %[标志符][宽度][.小数宽度][类型修饰符]
(2)转义字符 printf()函数中的‘\n’就是转义字符,输出时产生一个“换行”操作。 还有:\t、 \r、 \b等。 (3)普通字符 除格式指示符和转义字符之外的其它字符。 普通字符原样输出。 4.输出项表 输出项表内容:常量,变量,表达式 。 输出项表是可选的。若输出的数据不止1个,相邻2个之间用逗号分开。
下面的printf()函数都是合法的: (1)printf("I am a student.\n"); 普通字符转义字符 (2)printf("%d",3+2); 格式指示符表达式 (3)printf("a=%f b=%5d\n", a, b+3); (4) printf(“%d,%c\n”, 56,56); 2个输出项之间用逗号分开 此处逗号也是普通字符
5.格式指示符 %d以十进制输出整数。 %md以十进制输出整数,数据最小宽度占m位。 若数值长度<m,则 靠右输出,左边补空格。 若数值长度>m,输出原整数。 % _ md以十进制输出整数,数据最小宽度占m位。 若数值长度<m,则 靠左输出,右边补空格。 若数值长度>m,输出原整数。 例如: printf(“%5d,%-5d\n”,456,567); 输出结果: □□456,567□□ %ld以十进制形式输出长整型数据。
%o以八进制无符号形式输出整数,不输出前导符0。%o以八进制无符号形式输出整数,不输出前导符0。 printf("%o \n",128); 输出结果:200 %lo以八进制无符号形式输出长整型数 不输出前导符0。 %x以十六进制无符号形式输出整数, 不输出前导符0x。 %lx以十六进制无符号形式输出长整型数, 不输出前导符 0x。 %u以无符号十进制形式输出整数。 printf(“%u\n”,-2); 输出结果:65534 %lu以无符号十进制形式输出长整型数。
%c 用来输出1个字符。 %s用来输出一个字符串。 %ms按m宽度输出字符串。 若串长 >m,则照字符串原样输出; 若串长<m,则左边补空格。 %- ms类似%ms, 若串长<m,则字符串向左靠,右边补空格。 %m.ns靠右输出字符串左边的n个字符,左补空格。 (n m) %-m.ns靠左输出字符串左边的n个字符,右补空格。 (n m)
%f以小数形式输出实数。 %m.nf输出宽度为m,其中小数为n位。 若数值长度<m,则 靠右输出,左边补空格。 %-m.nf同类似,“ - ”表示靠左输出,右边补空格。 %e以指数形式输出实数。 %m.ne此处m、n、 同f格式。 %-m.ne此处m、n、- 同f格式。 %g根据数值大小自动选择 f 格式或 e 格式中占用宽 度小的一种
6.使用说明 (1)格式控制中的格式说明符,必须按从左到右的顺序,与输出项表中的每个数据一一对应,否则出错。 例如:下面使用格式是错误的。 printf("str=%s, f=%d, i=%f\n", "Internet", 1.0 / 2.0, 3 + 5, "CHINA"); (2)格式字符x、e、g可以用小写字母,也可以用大写字母。使用大写字母时,输出数据中包含的字母也大写。 除了x、e、g格式字符外,其它格式字符必须用小写字母。 例如,%f不能写成%F。
(3)格式字符紧跟在“%”后面就作为格式字符,否则将作为普通字符使用(原样输出)。(3)格式字符紧跟在“%”后面就作为格式字符,否则将作为普通字符使用(原样输出)。 例如, printf(”c=%c, f=%f\n“, c, f); 中的第一个 c 和 f,都是普通字符 (4)所谓无符号形式是指,不论正数还是负数,系统一律当作无符号整数来输出。 unsigned int a=65535 printf(“a=%u\n”,a); 输出结果: 65535
7. 格式字符使用实例 (1)%d ─以带符号的十进制整数形式输出。 main() { int n1=123; long int n2=123456; printf("%d,%5d,%-5d,%2d\n",n1,n1,n1,n1); printf("%ld,%8ld,%5ld\n",n2,n2,n2); printf("n1=%ld\n",n1); } 程序运行结果:123,□□123,123□□,123 123456,□□123456,123456 n1=16908411
(2)%d %o %x %u 形式输出整数。 main( ) { unsigned int a=65535; int b=-2; printf(“a=%d,%o,%x,%u\n”,a,a,a,a); printf(“b=%d,%o,%x,%u\n”,b,b,b,b); }
(3)%f─以小数形式、按系统默认的宽度, 输出单精度和双精度实数。 main( ) { float f=123.456; double d1, d2; d1=1111111111111.111111111; d2=2222222222222.222222222; printf("%f,%12f,%12.2f\n",f,f,f); printf("%-12.2f,%.2f\n",f,f); printf("d1+d2=%f\n",d1+d2); }
程序运行结果如下: 123.456001,□□123.456001,□□□□□□123.46 123.46□□□□□□,123.46 d1+d2=3333333333333.333010 本程序的输出结果中,超出了有效数字的范围的数据是无意义。例如: 数据123.456001中的001是无意义的 数据3333333333333.333010中的010是无意义, 因为它们超出了有效数字的范围。
(4)%e --以标准指数形式输出实数 指数形式尾数中的整数部分大于等于1、小于10, 小数点占一位,尾数中的小数部分占6位; 指数部分占5位(如e-003),其中e占一位,指数符号占一位,指数占3位, 标准指数形式共计13位。 (5)%g --让系统根据数值的大小,自动选择%f或%e格式、且不输出无意义的零。 例如: float a=123.468; printf( “ %f,%e,%g\n”,a,a,a ); 输出结果: 123.468000,1.234680e+002,123.468
(6)%c─输出一个字符(只占一列宽度)。 main() { char c='A'; int i=65; printf("c=%c,%5c,%d\n",c,c,c); printf("i=%d,%c",i,i); } 程序运行结果如下: c=A,□□□□A,65 i=65,A C语言中,整数以字符形式输出时,系统首先求该数与256的余数,然后将余数作为ASCII码,转换成相应的字符输出。字符数据也可以整数形式输出。
(7)%s ─输出一个字符串。 main() { printf("%s,%5s","Internet","Internet"); printf("%-10s\n","Internet"); printf("%10.5s,”,"Internet"); printf("%%-10.5s,”,"Internet"); printf(“%4.5s\n","Internet"); } 程序运行结果如下: Internet,Internet,Internet□□, □□□□□Inter,Inter□□□□□,Inter 说明: 系统输出字符和字符串时,不输出单引号和双引号。
例5.4输出格式控制符的作用 #include <stdio.h> main() { int a =3102; long int b =74228; short int c =625; printf("a1=%d\n",a); printf("a2=%o\n",a); printf("a3=%x\n",a); printf("b=%ld\n",b); printf("c=%d\n",c); } 运行结果: a1=3102 a2=6036 a3=c1e b=74228 c=625
例5.5输出格式控制符的作用 #include <stdio.h> main() { unsigned int d =65433; float f =2.34679865858988; double g =2.34679865858988; printf("d=%u\n",d); printf(“f1=%e\n",f); printf("f2=%f\n",f); printf("g=%f\n",g); printf("\n"); getch(); } 运行结果:d=65433 f1=2.34680e+00 f2=2.346799 g=2.346799
二、格式化输入函数 例5.6已知圆柱体的底半径(radius) 1.5,高(high)2.0,求其体积。main() { float r=1.5, h=2.0, vol; vol= 3.14159 * r * r * h; /*求体积*/ printf(“vol=%7.2f\n”,vol); } 在程序中给计算机提供数据,可以用赋值语句,也可以用输入函数。在C语言中,可使用 scanf()函数,通过键盘输入,给计算机主机同时输入多个、任意的数据
1. scanf()函数的一般格式 scanf("格式字符串",输入项首地址表); (1)格式字符串 格式字符串可以包含3种类型的字符: 格式指示符、空白字符(空格、Tab键和回车键)和非空白字符(又称普通字符)。 格式指示符与 printf() 函数的相似, 空白字符作为相邻2个输入数据的缺省分隔符, 非空白字符(又称普通字符)在输入有效数据时,必须原样一起输入。
(2)输入项首地址表 输入项首地址表由若干个输入项首地址组成,相邻2个输入项首地址之间,用逗号分开。 变量首地址的表示方法: &变量名 其中“&”是地址运算符。 例如, “&r”是指变量r在内存中的首地址 输入项首地址表中的地址,可以是变量的首地址,也可以是字符数组名或指针变量。 int a1, a2; scanf("%d%d",&a1,&a2); 输入项首地址表
2. 格式指示符 (1)格式指示符的形式为: % [*] [宽度] [h|l]类型字符 类型字符有: d、 u、 o、 x、 c、 s、 f、 e、 g 以上类型字符代表的数据类型与printf()中的相同。 例如,格式字符串 “ %f %f ”。 (2)类型修饰符 类型修饰符:h、l 其含义与printf()中的一样, h 短整型 l 为长整型。
(3)宽度n 指定该项输入数据所占列数为 n,读取输入数据中相应的n位,但按需要的位数赋给相应的变量,多余部分被舍弃。 例如,scanf("%3c%3c",&ch1,&ch2); 设输入:“abcdefg”, 则系统将读取的“abc”中的“a”赋给变量ch1; 将读取的“def”中的“d”赋给变量ch2, 则: printf("ch1=%c,ch2=%c\n",ch1,ch2); 输出结果为:ch1=a,ch2=d。
(4)赋值抑制字符* 赋值抑制字符*,表示本输入项对应的数据读入后,不赋给相应的变量(该变量由下一个格式指示符输入)。 例如, scanf("%2d%*2d%3d",&n1,&n2); 设输入 123456789 则系统将读取“12”并赋值给n1; 读取“34”、但舍弃掉(“*”的作用); 读取“567”并赋值给n2。 则: printf("n1=%d,n2=%d\n",n1,n2); 输出结果为:n1=12,n2=567
3. 数据输入操作 (1)如果相邻2个格式指示符之间,不指定数据分隔符(如逗号、冒号等),则相应的2个输入数据之间,至少用一个空格分开,或者用Tab键分开,或者输入1个数据后,按回车,然后再输入下1个数据。 设给n1输入12,给n2输入36;则执行以下命令, scanf("%d%d",&n1,&n2);正确的输入操作为: ① 12□36↙ ② 12 Tab 36↙ ③ 12↙ 36↙ 注:使用“↙”符号表示按回车键操作,在输入数据操作中的作用是,通知系统输入操作结束。
(2)“格式字符串”中出现的普通字符(包括转义字符形式的字符),务必原样输入。(2)“格式字符串”中出现的普通字符(包括转义字符形式的字符),务必原样输入。 例如,scanf("%d,%d",&n1,&n2); 设给n1输入12,给n2输入36, 正确的输入操作为: 12,36↙ 另外,scanf()函数中、格式字符串内的转义字符(如\n),系统并不把它当转义字符来解释,从而产生一个控制操作,而是将其视为普通字符,所以也要原样输入。 例如:scanf("n1=%d,n2=%d\n",&n1,&n2); 正确的输入操作为: n1=12,n2=36\n↙ 一般不使用转义字符
在设计输入操作时,为了改善人机交互性,使得输入操作简单明了,可以在用scanf()函数进行数据输入时,一般先用printf()函数输出一个提示信息,再用scanf()函数进行数据输入。在设计输入操作时,为了改善人机交互性,使得输入操作简单明了,可以在用scanf()函数进行数据输入时,一般先用printf()函数输出一个提示信息,再用scanf()函数进行数据输入。 例如, scanf("n1=%d,n2=%d\n",&n1,&n2); 改为: printf("n1="); scanf("%d",&n1); printf("n2="); scanf("%d",&n2);
(3)用scanf()函数进行数据输入时,输入数据遇到以下情况,系统认为该数据结束:(3)用scanf()函数进行数据输入时,输入数据遇到以下情况,系统认为该数据结束: ①遇到空格,或者回车键,或者Tab键。 ② 遇到输入域宽度结束。 例如: scanf(“%3d %3d”,&a1,&a2); “%3d”,只取3列,第3列结束,第4列以后无效。 ③遇到非法输入。 例如,在输入数值数据时,遇到字母等非数值符号(数值符号仅由数字字符0-9、小数点和正负号构成)。 scanf(“%d”,&a); 输入数值: 234a12 ↙ 变量a的数值为 234
4.使用格式说明符“%c”输入单个字符时,空格和转义字符均作为有效字符被输入。 例如,scanf("%c%c%c",&ch1,&ch2,&ch3); 设输入:A□BC ↙,则系统将 字母'A'赋值给ch1 空格'□'赋值给ch2 字母'B'赋值给ch3 执行: printf("%c %c %c\n ",ch1 ,ch2 , ch3); 运行结果: A□B
表达式的应用 例5.7 从键盘输入两个整型数,输出其中的一个大数的程序也可以写成如下程序: int max(int x, int y) { return( x>y ? x : y ); } main( ) { int a, b c ; printf(“Input the first integer number: ”); scanf( “%d”, &a ); printf(“Input the second integer number: ”); scanf( “%d”, &b ); c= max( a, b ); printf(“max=%d\n”, c ); } 输出提示信息
第一次运行程序情况及结果 运行窗口及程序运行情况: 第二次运行程序,进入运行窗口,先显示第一个提示信息,光标停在提示信息后,等待用户从键盘输入一个整数,再显示第二个提示信息,输入一个整数,返回程序窗口。
运行上述程序,一次输入两个整型数,输出其中的一个大数;运行上述程序,一次输入两个整型数,输出其中的一个大数; 若要进行几组两个整型数的比较,并输出其中的一个大数,那么就要多次运行上述程序。 若要在一个程序中完成几组两个整型数的比较,并输出其中的一个大数,就要编写一个循环程序。
5.4 顺序结构程序设计应用实例 例5.8从键盘输入梯形的上下底和高的实数值,求梯形的面积。 算法: ① 定义存放梯形的上、下底和高,以及梯形的面积的变量; ② 从键盘输入梯形的上下底和高的实数值; ③ 按照计算公式 0.5 * (a+b) * h 求出梯形的面积; ④ 输出梯形的上、下底和高的实数值; ⑤ 输出梯形的面积。
程序如下: main() { float a,b,h,s; ① printf("please input a,b,h:\n"); scanf("%f%f%f",&a,&b,&h); s=0.5 * (a+b) * h; ③ printf("a=%5.2f b=%5.2f h=%5.2f",a,b,h); ④ printf("s=%7.4f",s); ⑤ } ②
例5.9 输入任意三个整数,求它们的和及平均值 main(){ int n1, n2, n3, sum; float aver; printf("Please input three nbers:"); scanf("%d,%d,%d",&n1,&n2,&n3); sum=n1+n2+n3; /*求累计和*/ aver=sum/3.0; /*求平均值*/ printf("%d, %d, %d\n",n1,n2,n3); printf("sum=%d,aver=%7.2f\n",sum,aver);}
例5.10 从键盘输入一个小写字母,要求用大小写字母形式输出该字母及对应的ASCII码值 #include "stdio.h" main() {char c1,c2; printf("Input a lowercase letter: "); c1=getchar(); putchar(c1); printf(",%d\n",c1); c2=c1-32; /*小写字母转换为大写字母*/ printf("%c,%d\n",c2, c2); } 程序运行情况如下: Input a lowercase letter: a↙ a,97 A,65
例5.11求方程ax2+bx+c=0的实数根。a,b,c由键盘输入,a≠0且b2-4ac>0。例5.11求方程ax2+bx+c=0的实数根。a,b,c由键盘输入,a≠0且b2-4ac>0。 #include “math.h”/*函数 sqrt()包含于math.h头文件 */ main() { float a, b, c, disc, x1, x2; printf("Input a, b, c: "); scanf("%f,%f,%f",&a,&b,&c); disc=b*b-4*a*c; /*求判别式的值赋给disc*/ x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a); printf("\nx1=%6.2f\nx2=%6.2f\n",x1,x2); }
例5.12 复数减法运算 #include <stdio.h> main() { float a1, b1, a2, b2; char ch; printf("please input the first complex:\n"); printf("realpart:"); scanf("%f",&a1); printf("virtualpart:"); scanf("%f",&b1); printf("first complex is:%5.2f +i %5.2f\n",a1,b1);
printf("\n please input the second complex:\n"); printf("realpart:"); scanf("%f",&a2); printf("virtualpart :"); scanf("%f",&b2); printf("second complex is:%5.2f +i %5.2f\n",a2,b2); printf("\n The result is :"); printf("%6.3f +i %6.3f\n",a1-a2,b1-b2); ch=getchar(); }