380 likes | 473 Views
第四章 最简单的 C 程序设计 —— 顺序程序设计 . 主要内容:. 4 .1 C 语句概述 4 .2 赋值语句 4 .3 数据输入输出的概念及在 C 语言中的实现 4 .4 字符数据的输入输出 4 .5 格式输入输出 4 .6 顺序结构程序设计举例. 4.1 C 语句概述. 与其它高级语言一样, C语言也是利用函数体中的可执行语句,向计算机系统发出操作命令 。按照语句功能或构成的不同,可将C语言的语句分为五类。 ( 1 )控制语句 控制语句完成一定的控制功能。C语言只有9条控制语句,又可细分为三种: 选择结构控制语句
E N D
第四章 最简单的C程序设计——顺序程序设计
主要内容: 4.1 C语句概述 4.2 赋值语句 4.3 数据输入输出的概念及在C语言中的实现 4.4 字符数据的输入输出 4.5 格式输入输出 4.6 顺序结构程序设计举例
4.1 C语句概述 与其它高级语言一样,C语言也是利用函数体中的可执行语句,向计算机系统发出操作命令。按照语句功能或构成的不同,可将C语言的语句分为五类。 (1)控制语句 控制语句完成一定的控制功能。C语言只有9条控制语句,又可细分为三种: 选择结构控制语句 if()~else~, switch()~ 循环结构控制语句 do~while(), for()~, while()~, break, continue 其它控制语句 goto, return
(2) 函数调用语句 函数调用语句由一次函数调用加一个分号(语句结束标志)构成。 例如:printf("This is a C Program."); (3) 表达式语句 表达式语句由表达式后加一个分号构成。最典型的表达式语句是,在赋值表达式后加一个分号构成的赋值语句。 例如:“num=5 ”是一个赋值表达式,而“num=5;”却是一个赋值语句。 (4) 空语句 空语句仅由一个分号构成。显然,空语句什么操作也不执行。 例如,下面就是一个空语句: ;
(5) 复合语句 复合语句是由大括号括起来的一组(也可以是1条)语句构成。例如: main() { …… {……} /*复合语句。注意:右括号后不需要分号。*/ …… } 复合语句的性质: (1)在语法上和单一语句相同,即单一语句可以出现的地方,也可以使用复合语句。 (2)复合语句可以嵌套,即复合语句中也可出现复合语句。 (3)复合语句中最后一个语句中最后的分号不能忽略不写,但是右括号后不需要分号。
4.2 赋值语句 赋值语句由赋值表达式加上一个分号构成。 赋值语句和赋值表达式是不同的概念。赋值表达式可以包括在其他表达式中。 例如:if ((a=b)>0) t=a ; 作用是:先将b的值赋给a,然后判断a是否大于0;若a大于0,则执行语句 “t=a ;”。 if 后的(a=b)不是赋值语句,而是赋值表达式。if 后不能是赋值语句,写成“if ((a=b;)>0) t=a ;”就错了。
4.3数据输入输出的概念及在C语言中的实现 1. 所谓的输入输出是以计算机主机为主体而言的。从计算机向外部输出设备(如显示器、打印机、磁盘等)输出数据称为“输出”,从输入设备(如键盘、磁盘、光盘、扫描仪等)向计算机输入数据称为“输入”。 2. C语言不提供输入输出语句,输入输出操作由函数来实现。C标准库函数中提供一些输入输出函数,例如:printf和scanf函数。不要误认为它们是c语言提供的“输入输出语句”。c提供的函数以库的形式存放在系统中,它们不是c语言文本中的组成部分。
3. 使用C库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件中。在调用标准输入输出库函数时,文件开头应有以下预编译命令: # include <stdio.h> 或 # include “stdio.h” 系统允许使用printf和scanf函数时,可不加# include命令。
4.4 字符数据的输入输出 4.4.1 putchar函数(字符输出函数) putchar函数的作用是向终端输出一个字符。 例putchar(c); 其中c可以是字符型变量或整型变量,也可以是一个字符型常量或 一个转义字符。 使用putchar函数,务必牢记:在程序(或文件)的开头加上编译预处理命令(也称包含命令),即: #include "stdio.h"表示要使用的函数,包含在标准输入输出(stdio)头文件(.h)中。
[例4.1] #include "stdio.h" /*编译预处理命令:文件包含*/ main() {char ch1='N', ch2='E', ch3='W'; int c1=65,c2,c3; c2=c1+1;c3=c2+1; putchar(ch1); putchar(ch2); putchar(ch3); putchar('\n'); /*输出:NEW,并换行*/ putchar(ch1); putchar('E'); putchar(ch3); putchar('\n'); /*输出:NEW,并换行*/ putchar (c1); putchar(c2); putchar(c3); putchar(‘!'); }
4.4.2 getchar函数(字符输入函数) getchar函数的作用是从终端输入一个字符。 getchar函数没有参数,其形式为:getchar() 程序中要使用getchar函数,必须在程序(或文件)的开头加上编译预处理命令: #include "stdio.h”。 注意:getchar()只能接收一个字符。 getchar函数得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,而作为表达式的一部分。
[例4.2] #include "stdio.h" /*文件包含*/ main() {char ch;int c; printf("Please input two character: "); ch=getchar(); /*输入1个字符并赋给ch */ putchar(c=getchar() ); /*输入1个字符并赋给c */ putchar('\t'); putchar(ch); putchar('\t'); putchar(c); putchar('\n'); } 程序运行情况如下: Please input two characters: ab↙ b a b
4.5 格式输入与输出 4.5.1 printf函数(格式输出函数) printf函数的作用:向计算机系统默认的输出设备输出若干个任意类型的数据。 一、printf函数的一般格式为: printf(格式控制 ,输出表列) 例如:printf( “i= %d,c=%c\n ”,i,c) 1.“格式控制”是由双引号括起来的字符串。它包含两种信息: (1)格式说明: 由%和格式字符组成,作用是将输出的数据转换为指定的格式输出。 (2)普通字符:即需要原样输出的字符 。
2.“输出表列”是需要输出的一些数据,可以是表达式,是可选的。2.“输出表列”是需要输出的一些数据,可以是表达式,是可选的。 如果要输出的数据不止1个,相邻2个之间用逗号分开。下面的printf()函数都是合法的: printf("I am a student.\n"); printf("%d",3+2); printf("a=%f b=%5d\n", a, a+3); 必须强调:“格式控制”中的格式指示符,必须与“输出表列”中输出项的数据类型一致,否则会引起输出错误。 printf函数的一般形式为: printf(参数1,参数2,参数3,……, 参数n) printf函数的功能是将参数2 ~ 参数n按参数1的格式输出。
二、格式字符 输出不同类型的数据,要使用不同的格式字符。常用的有以下几种: 1.d格式符:用来输出十进制整数。有以下几种用法: ①%d:按整型数据的实际长度输出。 ②%md:m为指定的输出宽度,如%4d,m=4 。如果数据的位数小于m,则左端补空格,否则按数据的实际位数输出。 ③%ld:输出长整型数据。对长整型数据也可以指定宽度。如: printf(“%8ld”,a);
[例4.3] 格式字符d的使用 main() {int n1=123; long n2=123456; printf("n1=%d,n1=%5d,n1=%-5d,n1=%2d\n", n1,n1,n1,n1); /*用不同格式,输出int型数据n1的值*/ printf("n2=%ld,n2=%8ld,n2=%5ld\n", n2,n2,n2); /*用不同格式,输出long型数据n2的值*/ printf("n1=%ld\n",n1); } 程序运行结果如下: n1=123,n1=□□123,n1=123□□,n1=123 n2=123456,n2=□□123456,n2=123456 n1=16908411 最后输出的num1=16908411是错误的,原因是格式不相符。
2.o格式符:以八进制形式输出整数。 对于整数,可用八进制(%o)输出。由于是将内存单元的各位的值(0或1)按八进制形式输出,因此输出的值不带符号,即将符号位也一起作为八进制数的一部分输出。可以指定宽度,如printf(“%8o”,a)。 对于长整数(long型)可以用%lo形式输出。 3.x格式符:以十六进制形式输出整数。 对于整数,可用十六进制(%x)输出。同样不会出现负的十六进制数。可以指定宽度,如printf(“%8x”,a)。 对于长整数(long型)可以用%lx形式输出。 4.u格式符:以十进制形式输出unsigned型整数。 一个有符号整数也可以用%u格式输出, unsigned型也可以用%d格式输出。按相互赋值的规则(3.9节)处理。 unsigned型也可以用%o或%x格式输出。
5.c格式符:输出一个字符。 0到255范围内的整数,可用字符形式输出,输出前系统按ASCII码表转换;反之,一个字符数据也可以用整数形式输出。 [例4.4] 字符的输出。 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
6.S格式符:输出一个字符串。用法有下面几种:6.S格式符:输出一个字符串。用法有下面几种: ①%s:如printf(“%s”, “ CHINA”); 输出:CHINA ②%ms:如%6s,输出的字符串占m列,若字符串本身长度大于m,则将字符串全部输出,若串长度小于m,则左补空格。 ③ %-ms:如%-6s,与②的区别是右补空格。 ④ %m.ns:如%6.4s,输出占m列,但只取字符串左端的n个字符输出。这n个字符位于m列的右侧,左补空格。 ⑤ %-m.ns:如%-6.4s,与④的区别是右补空格。 ④和⑤是用于从一个长字符串中取左端的若干个字符。若n>m,则m自动取n值,以保证n个字符正常输出。
[例4.5] 字符串的输出。 main() {printf("%s,%5s,%-10s,","internet","internet","internet"); printf("%10.5s,\n%-10.5s,%4.5s\n", "internet","internet","internet"); } 程序运行结果如下: internet,internet,internet□□,□□□□□inter, inter□□□□□,inter 注意:系统输出字符和字符串时,不输出单引号和双引号。
7.f格式符:以小数形式,输出单精度和双精度实数。7.f格式符:以小数形式,输出单精度和双精度实数。 有下面几种用法: ①%f :由系统自动指定输出宽度,整数部分全部如数输出,小数部分输出6位。并非全部数字都是有效数字,单精度实数的有效位数一般是7位。 [例4.6] 输出单精度实数的有效位数。 main( ) {float d1,d2; d1=111111.111; d2=222222.222; printf("%f\n", d1+d2); } 结果为:333333.328125
双精度实数也可以用%f格式输出,它的有效位数一般是16位,给出6位小数。双精度实数也可以用%f格式输出,它的有效位数一般是16位,给出6位小数。 [例4.7]输出双精度实数的有效位数。 main( ) {double d1,d2; d1=1111111111111.111111111; d2=2222222222222.222222222; printf("d1+d2=%f\n",d1+d2); } 程序运行结果如下: d1+d2=3333333333333.333010
② %m.nf : 输出的数据共占m列,其中n位小数。若数值长度小于m,则左补空格。 ③ %-m.nf : 与②的区别是输出的数值向左端靠,右端补空格。 [例3.8] 输出实数时指定小数位数。 main() {float f=123.456 ; printf(“%f--%10f --%10.2f --%.2f--%-10.2f\n”,f,f,f,f,f);} 结果如下:(用- 表示空格) 123.456001--123.456001------123.46--123.46--123.46----
8. e格式符, 以指数形式输出实数。 • 用法有下面几种: • (1) %e:不指定数据所占宽度和小数位数,由系统自动给出,小数部分给出6位,指数部分占5位。数值按规范化指数形式输出(即小数点前必须有而且只有1位非零数字)。 • 例如printf(“%e”,123.456)的输出是: 1.234560e+002 ,占13列。 • (2) %m.ne或%-m.ne :数据占宽度m列,小数占宽度n列, %-m.ne 与%m.ne的区别是数据向左端靠。 • float f =123.456 ; • printf(“%e--%10e--%10.2e--%.2e--%-10.2e”,f,f,f,f,f ); • 输出如下: • 1.234560e+002-- 1.234560e+002---1.23e+002 -- 1.23e+002 --1.23e+002 -
9. g格式符, 用来输出实数。 根据输出数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的零。 如:f=123.468; printf(“%f--%e--%g”,f,f,f); 输出为: 123.468000--1.234680e+002--123.468---
Printf函数的使用说明 ①格式字符x、e、g可以用小写字母,也可以用大写字母。除了x、e、g格式字符外,其它格式字符必须用小写字母。 ②可以在printf函数的“格式控制”字符串中包含“转义字符”。如“\n”、 “\t”、 “\377”、 “\b”、 “\x41”等。 printf可以输出常量、变量和表达式的值。但格式控制中的格式说明符,必须按从左到右的顺序,与输出项表中的每个数据一一对应,否则出错。 ③格式字符紧跟在“%”后面就作为格式字符,否则将作为普通字符使用(原样输出)。 例如:“printf (“c=%c,f=%f\n”, c, f);”中的第一个c和f,都是普通字符。 ④如果想输出“%”,则要在“格式控制”字符串中用两个连续的%表示,如:printf(“%f%%”,1.0/3);输出为: 0.333333%
例 若a1、a2、a3、a4均为char类型变量,则执行以下程序段后的输出结果为: a1=‘1’;a2=‘2’; a3=‘3’;a4=‘4’; printf(“%1c\n”,a1); printf(“%2c\n”,a2); printf(“%3c\n”,a3); printf(“%4c\n”,a4); (A)1 (B)1 (C)1 (D)输出格式的描述符不正确 2 2 02 3 3 003 4 4 0004
例 若x为int类型变量,则执行以下程序段后的输出结果为: x=0xDEF; printf(“%4d\n”,x); printf(“%40\n”,x); printf(“%4x\n”,x); (A)3567 (B)3567 (C)3567 (D)3567 6757 6757 06757 6757 def xdef 0xdef 0def
4.5.2 scanf函数(格式化输入) scanf函数是用来从输入设备向计算机主机输入数据的。 1.scanf函数的一般形式 scanf(格式控制,地址列表) 格式控制含义同printf函数相同,“地址列表”是由若干个地址组成的表列,可以是变量的地址或字符串的首地址。 [例4.9] main() {int a ,b,c ; scanf(“%d%d%d”, &a , &b , &c) ; printf(“%d , %d , %d \n”,a , b , c); } %d%d%d 表示按十进制整数形式输入数据,两个数据间有一个或多个空格间隔, 也可以用回车键或跳格键间隔。
2.格式说明 ①对unsigned形变量所需的数据,可以用%u、%d、%o、%x格式输入。 ②可以指定输入数据所占列数,系统自动按列数截取所需数据。如“scanf(“%3d%3d”,&a,&b);”,若输入123456,系统自动将123赋给a,456赋给b。 上面方法也适用于字符,如“scanf(“%3c”,&ch);”,若连续输入3个字符abc,则系统将第一个字符a赋给ch。 ③如果在%后有一个“*”附加说明符,表示跳过它指定的列数。如“scanf(“%2d-%*3d-%2d”,&a, &b);”,若输入12-345-67,则12赋给a,跳过345,67赋给b。(用-表示空格) ④输入数据时不能规定精度。例如“scanf(“%7.2f”,&a);”是错误的。
3.使用scanf函数时应注意问题 ①在scanf函数中,“格式控制”后面应当是变量地址,而不应是变量名。如果a和b是整型变量,那么scanf(“%d,%d”,a,b)是错的。 a和b前面必须加&。 ②如果在“格式控制”字符串中除格式说明外,还有其它字符,则输入数据时必须对应地输入这些字符。 如“scanf(“%d,%d”,&a,&b);”,应输入“3,4”。 如“scanf(“%d--%d”,&a,&b);”, 输入时应在3和4间有两个以上空格。 如“scanf(“a=%d,b=%d”,&a,&b);”,应输入“a=3,b=4”。 如“scanf(“%d:%d:%c”,&a,&b,&c);”,应输入“3:4:5”。
③在用%c格式输入字符时,空格字符和“转义字符”都作为有效字符输入。③在用%c格式输入字符时,空格字符和“转义字符”都作为有效字符输入。 如“scanf(“%c%c%c”,&c1,&c2,&c3);”, 若输入“a-b-c”, 字符a赋给c1, -赋给c2,字符b赋给c3。 ④输入数据时,遇到以下情况,系统认为该数据结束: a、遇到空格,或者回车键,或者Tab键。 b、按指定的宽度结束。例如“%3d”,只取3列。 c、遇到非法输入。例如,在输入数值数据时,遇到字母等非数值符号(数值符号仅由数字字符0-9、小数点和正负号构成)。
提高人机交互性建议:为改善人机交互性,同时简化输入操作,在设计输入操作时,一般先用printf函数输出一个提示信息,再用scanf函数进行数据输入。提高人机交互性建议:为改善人机交互性,同时简化输入操作,在设计输入操作时,一般先用printf函数输出一个提示信息,再用scanf函数进行数据输入。 例如:将 scanf("num1=%d,num2=%d\n",&num1,&num2); 改为: printf("num1="); scanf("%d",&num1); printf("num2="); scanf("%d",&num2);
例 设a、b、c、d均是int型的变量,为了使以下的程序段的输出为:1234+123+12+1,正确的输入形式应当是 scanf(“%4d+%3d+%2d+%1d”,&a,&b,&c,&d); printf(“%4d+%3d+%2d+%1d”,a,b,c,d); (A)1234123121 (B)1234123412341234 (C)1234+1234+1234+1234 (D)1234+123+12+1
4.6 顺序结构程序设计举例 在顺序结构程序中,各语句(或命令)是按照位置的先后次序,顺序执行的,且每个语句都会被执行到。[例4.10] 输入任意三个整数,求它们的和及平均值。main(){int num1, num2 , num3 , sum ; float aver; printf(“Please input three numbers:”); scanf(“%d,%d,%d”,&num1,&num2,&num3); /*输入三个整数*/ sum=num1+num2+num3; /*求累计和*/ aver=sum/3.0; /*求平均值*/ printf("num1=%d,num2=%d,num3=%d\n",num1,num2,num3); printf("sum=%d,aver=%7.2f\n",sum,aver);} 思考题:能否将“aver=sum/3.0;”中“3.0”改为“3”?
[例4.11] 求方程ax2+bx+c=0的实数根。a,b,c由键盘输入,a≠0且b2-4ac>0。 #include “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); }
[例4.12] 从键盘输入一个小写字母,要求用大小写字母形式输出该字母及对应的ASCII码值。 #include "stdio.h" main() {char c1,c2; printf("Input a lowercase letter: "); c1=getchar(); putchar(c1);printf(",%d\n",c1); c2=c1-32;/*将大写字母c1转换成对应的小写字母c2 */ printf("%c,%d\n",c2,c2); } 程序运行情况如下: Input a lowercase letter: a↙ a,97 A,65
在顺序结构程序中,一般包括以下几个部分: 1.程序开头的编译预处理命令。 在程序中要使用标准函数(又称库函数),除printf和scanf外,其它的都必须使用编译预处理命令,将相应的头文件包含进来。。 2.顺序结构程序的函数体中,是完成具体功能的各个语句和运算,主要包括: (1)变量类型的说明。 (2)提供数据语句。 (3)运算部分。 (4)输出部分。