860 likes | 1.01k Views
C 程 序 设 计. 江南大学控制科学与工程研究中心 张正道 (wxzzd@hotmail.com). 第 4 章 最简单的 C 程序设计 -- 顺序程序结构设计. 4.0 程序的三种基本结构 4.1 C 语句概述 4.2 赋值语句 4.3 数据输入输出的概念及其语言实现 4.4 字符的输入和输出 4.5 格式输入 与输出 4.6 程序举例. § 4.0 程序的三种基本结构. 近年来广泛采用 结构化程序设计 方法,使程序结构清晰、易读性强。 强调今后在学习中要采用此方法。 有三种基本结构:. 顺序结构.
E N D
C 程 序 设 计 江南大学控制科学与工程研究中心 张正道(wxzzd@hotmail.com)
第4章 最简单的C 程序设计--顺序程序结构设计 4.0 程序的三种基本结构 4.1 C 语句概述 4.2 赋值语句 4.3 数据输入输出的概念及其语言实现 4.4 字符的输入和输出 4.5 格式输入 与输出 4.6 程序举例
§4.0 程序的三种基本结构 近年来广泛采用结构化程序设计方法,使程序结构清晰、易读性强。强调今后在学习中要采用此方法。 • 有三种基本结构: 顺序结构 一种按书写顺序执行的结构。 根据运行时的情况自动选择要执行的语句。 选择结构 循环结构 根据情况自动重复执行有关语句。 已经证明,由以上基本结构组成的程序能处理任何复杂的问题。
C程序 源程序文件1 源程序文件2 源程序文件n 预编译命令 函数1 函数n 说明部分 执行部分(语句) 4.1 C 语句概述 一个语句经编译后产生若干条机器指令。C语句用来完成一定操作。声明部分不称为语句,如:int a; C程序的执行部分是由语句组成的。 程序的功能也是由执行语句实现的。
C程序对数据的处理是通过“语句”的执行来实现的。C程序对数据的处理是通过“语句”的执行来实现的。 一条语句完成一项操作(或功能)。 一个为实现特定目的的程序应包含若干条语句。
C 程序语句分五类 • 表达式语句 表达式语句由表达式加上分号“;”组成。 其一般形式为: 表达式; 执行表达式语句就是计算表达式的值。 例如: x=y+z; 赋值语句。 y+z; 加法运算语句,但计算结果不能保留,无实际意义。 i++; 自增1语句,i值增1。
函数调用语句 由函数名、实际参数加上分号“;”组成。其一般形式为: 函数名(实际参数表); 执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值(在第五章函数中再详细介绍)。 例如:printf("C Program"); 其功能是:调用库函数,输出字符串。
标准函数调用的目的 在表达式中调用函数,实际上是转去执 行一段预先设计好的程序,求出结果后 返回调用点。 所以函数的值又叫函数的 返回值。 (1)如数学函数,为了得到函数的返回值。 这类函数的调用一般出现在表达式中,作为表达式语句的一部分。 一般不作为函数调用语句。 (2)为了完成某项任务,而不是为了得到返回值。 调用这类函数时,就直接用函数调用语句。 例: scanf("%f",&x); printf("%f",x);
控制语句 控制语句用于控制程序的流程,以实现程序的各种结构方式。它们由特定的语句定义符组成。C语言有九种控制语句。 可分成以下三类: (1) 条件判断语句 if语句,switch语句 (2) 循环执行语句 do while语句,while语句,for语句 (3) 转向语句 break语句,goto语句,continue语句,return语句
复合语句 把多个语句用括号{}括起来组成的一个语句称复合语句。 在程序中应把复合语句看成是单条语句,而不是多条语句,例如 : { x=y+z; a=b+c; printf(“%d%d”,x,a); } 是一条复合语句。复合语句内的各条语句都必须以分号“;”结尾,在括号“}”外不必再加分号。
注意: (1) 在复合语句中的“内部数据描述语句”中定义的变量,是局部变量, 仅在复合语句中有效。 (2) 复合语句结束的“ } ”之后,不需要分号。 (3) 复合语句可以出现在任何数据操作语句可以出现的地方。
空语句 只有分号“;”组成的语句称为空语句。 空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。 例如: while(getchar()!='\n'); 其功能是:只要从键盘输入的字符不是回车则重新输入。这里的循环体为空语句。
例3-1: 程序运行结果 a=11 b=21 c=31 a=11 b=22 c=3.300000 a=22 b=21 c=31 • #include "stdio.h" • void main() • {int a=11,b=21,c=31; • printf("a=%d\tb=%d\tc=%d\n",a,b,c); • {int b=22; • float c=3.3; • printf("a=%d\tb=%d\tc=%f\n",a,b,c); • a=b; • } • printf("a=%d\tb=%d\tc=%d\n",a,b,c); • }
§4.2 赋值语句 赋值语句是由赋值表达式加上一个分号构成的。其功能和特点都与赋值表达式相同。 但要注意: ①由于在赋值符“=”右边的表达式也可以又是一个赋值表达式,因此,下述形式 变量=(变量=表达式); 是成立的,从而形成嵌套的情形。其展开之后的一般形式为:变量=变量=…=表达式; 例如:a=b=c=5;按照赋值运算符的右接合性,因此实际上等效于:c=5; b=c; a=b;
②注意在变量说明中给变量赋初值和赋值语句的区别。给变量赋初值是变量说明的一部分,赋初值后的变量与其后的其它同类变量之间仍必须用逗号间隔,而赋值语句则必须用分号结尾。 如:变量赋初值:int a=5,b; 赋值语句: a=5;
③在变量说明中,不允许连续给多个变量赋初值。如下述说明是错误的:int a=b=c=5 必须写为 int a=5,b=5,c=5;而赋值语句允许连续赋值,如a=b=c=5; ④注意赋值表达式和赋值语句的区别。赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。 下述语句是合法的:if((x=y+5)>0) z=x;语句的功能是,若表达式x=y+5大于0则z=x。 下述语句是非法的:if((x=y+5;)>0) z=x; 因为x=y+5;是语句,不能出现在表达式中。
⑤“=”是赋值运算符,不是“等号”。如: x=x+1 a = 1 与 a = = 1 要注意和等号的区别!
§ 4.3 数据输入输出的概念及在C语言中的实现 • 输入和输出是以计算机主机为主体而言。 输出指外部设备:显示屏,打印机,磁盘,输入设备: 键盘,磁盘,光盘,扫描仪等。 默认输入设备是键盘,输出设备是显示器 • C 语言不提供输入输出语句,而是由函数来完成。这样可以简化编译系统,提高可移植性。 • 在使用C语言的输入输出函数(包括其它库函数)时,必须通过预编译命令“#include”将有关的函数说明文件(*.h 头文件)包含到用户的源程序中。C语言中所以的输入输出函数包含在文件stdio.h中,使用命令为:#include <stdio.h>。 只有printf和scanf例外。
4.4字符数据的输入和输出 1.putchar函数(字符输出函数) 其作用是向默认终端(一般为显示器)输出单个字符。其一般形式为: putchar(字符变量C); 输出变量c的值,C可以是字符型或整型变量 例如:putchar('A'); 输出大写字母A putchar(x); 输出字符变量x的值 putchar('\n'); 换行 对控制字符则执行控制功能,不在屏幕上显示。 使用本函数前必须要用文件包含命令: #include<stdio.h>
〔例〕: #include “stdio.h” main ( ) { char a ,b ,c ; a =‘B’ ; b =‘O’ ; c =‘Y’ ; putchar(a) ; putchar(b) ; putchar( c); } 运行结果:BOY 若改为: putchar(a) ; putchar(‘\n’) ; putchar(b); putchar(‘\n’) ; putchar(c) ; putchar (‘\n’); 运行结果为?
例 #include <stdio.h> 包含函数putchar的头文件 main( ) { int a=65; char b='B'; putchar(a); putchar(65+1); putchar(b); putchar('B'+1); } 程序运行结果为: ABBC
2. getchar()函数(字符输入函数) getchar函数的功能是从默认终端或系统指定的输入设备(一般为键盘)输入一个字符。 其一般形式为: getchar(); 通常把输入的字符赋予一个字符变量,构成赋值语句,如: char c; c=getchar();
使用getchar函数还应注意几个问题: 1.getchar函数只能接受单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符。 2.使用本函数前必须包含文件“stdio.h”。 3.在TC屏幕下运行含本函数程序时,将退出TC 屏幕进入用户屏幕等待用户输入。输入完毕再返回TC屏幕。利用这个特性,可以人为的让程序在指定位置停顿,直待用户按键确认后才能够继续运行。
4.函数getchar将回车键作为一个字符读入。如果程序中有两个以上函数getchar时,应该一次性输入所需字符,最后再按回车键,如上例所示。4.函数getchar将回车键作为一个字符读入。如果程序中有两个以上函数getchar时,应该一次性输入所需字符,最后再按回车键,如上例所示。 5.无论输入的是英文字母或标点符号还是数字,都是作为字符输入 。
【例】 #include<stdio.h> void main() { char c; printf("input a character\n"); c=getchar(); putchar(c); } Putchar(getchar());
例: #include <stdio.h> /*说明函数getchar的原型包含在哪个文件中*/ 从键盘输入字符, 该字符的ASCII编码值赋给a • void main() • {int a; • char b; • a=getchar(); • b=getchar(); • printf("a=%c\ta=%d\tb=%c\tb=%d\n",a,a,b,b); • }
程序运行情况如下: 13↙ a=1 a=49 b=3 b=51
§4.5 格式输入与输出 1. printf 函数(格式输出函数format) printf的作用是向终端(或系统隐含指定的输出设备)输出若干个任意类型的数据。 一般格式:printf(格式控制,输出列表) 例如: printf(“%d%d”,a,b); 格式控制输出列表 printf(“a=%d b=%d”,a,b) 格式说明 普通字符输出列表 结果 a=3 b=4
函数调用的一般形式: printf("格式控制字符串",输出项列表); ◆必须用英文的双引号括起来。 ◆要输出的表达式。 ◆常量、变量、运算 符表达式、函数返回值等,每个输出项之间用逗号(,)分隔。 ◆作用是控制输出项的格式和输出一些提示信息。
格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如“%d”表示按十进制整型输出,“%ld”表示按十进制长整型输出,“%c”表示按字符型输出等。后面将专门给予讨论。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如“%d”表示按十进制整型输出,“%ld”表示按十进制长整型输出,“%c”表示按字符型输出等。后面将专门给予讨论。 • 非格式字符串在输出时原样照印,在显示中起提示作用。 • 输出表列中给出了各个输出项, 要求格式字符串和各输出项在数量和类型上应该一一对应。
普通字符、转义字符、格式说明。 普通字符: 按原样输出,主要用于输出提示信息。 转义字符: 指明特定的操作。 格式说明: 由" % "和"格式字符串"组成:%格式字符串。 它表示按规定的格式输出数据。
【例】void main() { int a=88,b=89; printf("%d %d\n",a,b); printf("%d,%d\n",a,b); printf("%c,%c\n",a,b); printf("a=%d,b=%d",a,b); } 本例中四次输出了a,b的值。第四行的输出语句格式控制串中,两格式串%d 之间加了一个空格(非格式字符),所以输出的a,b值之间有一个空格。第五行的printf语句格式控制串中加入的是非格式字符逗号, 因此输出的a,b值之间加了一个逗号。第六行的格式串要求按字符型输出 a,b值。第七行中为了提示输出结果又增加了非格式字符串。
2. 格式字符 在Turbo C中格式字符串的一般形式为: [标志][输出最小宽度][.精度][长度]类型 其中方括号[]中的项为可选项。各项的意义介绍如下:
(2)格式说明的形式: %[flags][width][.prec][F|N|h|L][type] 格式字符,用来进行格式转换。 (重点掌握) 输出长度修饰符: F:输出远指针存放的地址。 N:输出近指针存放的地址。 H或h:输出短整型数据的值。 L或l:输出长整型或双精度值。 输出精度指示符。 ◆对整数,表示至少要输出的数字个数,不足补数字0,多出则原样输出。 ◆对实数,表示小数点后至多输出的数字个数,不足补数字0,多出则舍入处理。 ◆对字符串,表示最多输出的字符个数,不足补空格,多出则丢弃。 方括号表示该项可有可无 可选的标志字符 ◆-:左对齐输出,缺省为右对齐输出 ◆+:正数输出加号(+),负数输出减号(-) ◆空格:正数输出空格代替加号(+),负数输 出减号(-) 如:%+d,%-d,% d。 十进制整数,指定输出宽度。 ▼指定宽度>实际宽度,补空格。 ▼指定宽度≤实际宽度,按实际输出。 ▼不指定宽度,按实际输出。 如:%+10d
1.类型 类型字符用以表示输出数据的类型,其格式符和意义下表所示: 格式字符 意 义 d 以十进制形式输出带符号整数(正数不输出符号) o 以八进制形式输出无符号整数(不输出前缀O) x 以十六进制形式输出无符号整数(不输出前缀OX) u 以十进制形式输出无符号整数 f 以小数形式输出单、双精度实数 e 以指数形式输出单、双精度实数 g 以%f%e中较短的输出宽度输出单、双精度实数 c 输出单个字符 s 输出字符串
2.标志 标志字符为-、+、#、空格四种,其意义下表所示: 标 志 意 义 l 长整型,可由于o,x,d之前 - 结果左对齐,右边填空格 + 输出符号(正号或负号)空格输出值为正时冠 以空格,为负时冠以负号 # 对c,s,d,u类无影响;对o类, 在输出时 加前缀o;对x类,在输出时加前缀0x;对 e,g,f 类当结果有小数时才给出小数点
3.输出最小宽度 用十进制整数来表示输出的最少位数。 若实际位数多于定义的宽度,则按实际位数输出, 若实际位数少于定义的宽度则补以空格或0。 4.精度 精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符, 则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。 5.长度 长度格式符为h,l两种,h表示按短整型量输出,l表示按长整型量输出。
d格式符。用来输出十进制整数。 • %d printf(“%d,%d”,a,b); • %md printf(“%4d,%4d”,a,b); a=123; b=12345; printf(%4d,%4d”,a,b); 123,12345 • %ld 输出长整型 printf(“%ld,%ld”,a,b); 如:a=1234; printf (“%10ld”,a) ; 则: 1234 • o格式符。用来输出8进制整数。 • %o %mo • %lo int a = -1; printf(“%d,%o”,a,a); 结果:- 1 ,177777
x格式符。用来输出16进制整数。 • %x %mx %lx printf(“%d,%o,%x”,a,a,a); 结果:- 1 ,177777,ffff 注意在八进制和十六进制中并不能,打印出0或0x的先导符 printf(“%d,0%o,0x%x”,a,a,a); 结果:- 1 ,0177777,0xffff
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);} 运行结果为:a= -1,177777,ffff,65535 b= -2,177776,fffe,65534 以上四种格式可以互换,但是后三种无负数形式; 第一种格式应用较多,但是要注意数据的表示范围与输出格式的对应。 int -32768~+32767 unsigned 0~65535 int、short 占2B内存,long 占4B内存
c格式符。用来输出一个字符。 例:main ( ) {char a =‘a’;int b = 97; print(“%c,%d\n”,a,a); print(“%c,%d”,b,b);} 结果:a,97 a,97 整数的范围在0~255之间,可以用字符形式输出; 一个字符数据可以用整数形式输出。 也可指定字符宽度,如: printf(“%3d”,c)
s格式符。用来输出一个字符串。 • % s 原长输出 • % ms 字符串占m列,小于m左补空格 • % -ms 大于m原样输出,小于m右补空格 • % m.ns 输出占m列,只取字符串左端n个字符 • % -m.ns n个字符输出在m列的左侧,右补空格 例:main ( ) {printf(“%3S,%7.2s,% .4s,% -5.3\n”,“CHINA”,“CHINA”,“CHINA”,“CHINA”);} 结果:CHINA,CH,CHIN,CHI
f格式符。用来输出实数,以小数形式输出。 %f,不指定字段宽度,由系统自动指定。整数部分如数输出,并输出6位小数。单精度实数有效位数为7位;双精度实数有效位数为16位,小数6位。 如:main ( ){float x,y;x=111111.111;y=222222.222;printf(“%f”,x+y);} 结果:333333.326125 又如:main ( ){double x,y;x=1111111111111.111111111;y=2222222222222.222222222;printf(“%f”,x+y);} 结果:3333333333333.333010
%m.nf 指定输出的数据占m列,其中n位小数;右对齐。 % -m.nf 同上,左对齐。 例:main ( ){ float f=123.456;printf(“%f %12f %12.2f % -12.2f %.2f \n”,f,f,f,f);} 结果:123.455994123.455994123.46123.46123.46
e格式符。以指数形式输出实数。 % e 整数一位,小数6位,指数5位包括e和符号位. 例: printf(“%e,%e”,123.456,0.006543); 输出:1.234560e+002,6.543000e-003 % m.ne和% -m.ne 其中m为输出宽度,- 为左齐, n为尾数的小数位数. 例: 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
g格式符。用来输出实数,自动选用%f或%e格式中格式较短的一种格式,不输出无意义的零。g格式符。用来输出实数,自动选用%f或%e格式中格式较短的一种格式,不输出无意义的零。 如:float f = 123.456; printf(“%f,%e,%g”,f,f,f); 输:123.456000,1.234560e+002,123.456
例如: printf ("%d\n",100); printf("%5d\n",100); printf("%8d\n%8d″,100,100*100);
例如: printf ("%o\n",-1); printf ("%x,%X\n",-1); printf ("%u,%d",-1);
例如: printf ("%4c,%c\n",'A', 'A'); printf ("%-8s,%8.2s", " Name ", " Name ");
例如: printf ("%f\n%10.3f\n",100.7654321, 100.7654321); printf ("%e\n%10.9e", 100.7654321,100.7654321);