第4章c语言谭浩强版顶级讲义PPT学习课件.ppt_第1页
第4章c语言谭浩强版顶级讲义PPT学习课件.ppt_第2页
第4章c语言谭浩强版顶级讲义PPT学习课件.ppt_第3页
第4章c语言谭浩强版顶级讲义PPT学习课件.ppt_第4页
第4章c语言谭浩强版顶级讲义PPT学习课件.ppt_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、4.1 C语句概述 4.2 程序的三种基本结构 4.3 赋值语句 4.4 数据输入输出的概念及在语言中的实现 4.5 字符数据的输入输出 4.6 格式输入与输出 4.7 顺序结构程序设计举例 习题,第4章 最简单的c程序设计顺序程序设计,在上一章介绍了程序中用到的一些基本要素(常量、变量、运算符、表达式等),它们是构成程序的基本成分。在第1章中已经介绍了几个简单的c程序。本章将介绍为编写简单的程序所必需的一些内容。,4.1 C语句概述,和其他高级语言一样,c语言的语句用来向计算机系统发出操作指令。一个语句经编译后产生若干条机器指令。一个实际的程序应当包含若干语句。应当指出,c语句都是用来完成一

2、定操作任务的。声明部分的内容不应称为语句。如:int a;不是一个c语句,它不产生机器操作,而只是对变量的定义。从第1章已知,一个函数包含声明部分和执行部分,执行部分即由语句组成。c程序结构可以用图4.1表示。即一个c程序可以由若干个源程序文件(分别进行编译的文件模块)组成,一个源文件可以由若干个函数和预处理命令以及全局变量声明部分组成(关于“全局变量”见第7章,“预编译命令”见第8章),一个函数由数据定义部分和执行语句组成。,图4.1,在第2章中已经说明,程序应该包括数据描述(由声明部分来实现)和数据操作(由语句来实现)。数据描述主要定义数据结构(用数据类型表示)和数据初值。数据操作的任务是

3、对已提供的数据进行加工。 C语句可以分为以下5类: (1) 控制语句,完成一定的控制功能。c只有9种控制语句,它们是: if()else(条件语句) for() (循环语句) hile() (循环语句) dohile() (循环语句) continue (结束本次循环语句), break (中止执行switch或循环语句) sitch (多分支选择语句) goto (转向语句) return (从函数返回语句) 上面9种语句中的括号()表示其中是一个条件,表示内嵌的语句。例如:“if()else”的具体语句可以写成: if(xy) z=x;else z=y; (2) 函数调用语句。由一次函数调

4、用加一个分号构成一个语句,例如:printf(this is a c stateent);,(3) 表达式语句。由一个表达式构成一个语句,最典型的是,由赋值表达式构成一个赋值语句。 a=3 是一个赋值表达式,而 a=3; 是一个赋值语句。可以看到一个表达式的最后加一个分号就成了一个语句。一个语句必须在最后出现分号,分号是语句中不可缺少的一部分(而不像pascal语言那样,分号只是语句间的分隔符号)。例如: i=i+1(是表达式,不是语句) i=i+1;(是语句),任何表达式都可以加上分号而成为语句,例如i+;是一语句,作用是使i值加1。又如x+y;也是一个语句,作用是完成x+y的操作,它是合法

5、的,但是并不把x+y的和赋给另一变量,所以它并无实际意义。 表达式能构成语句是c语言的一个重要特色。其实“函数调用语句”也是属于表达式语句,因为函数调用(如sin(x)也属于表达式的一种。只是为了便于理解和使用,我们把“函数调用语句”和“表达式语句”分开来说明。由于c程序中大多数语句是表达式语句(包括函数调用语句),所以有人把c语言称作“表达式语言”。,(4) 空语句。下面是一个空语句: ; 即只有一个分号的语句,它什么也不做。有时用来做被转向点,或循环语句中的循环体(循环体是空语句,表示循环体什么也不做)。 (5) 可以用 把一些语句括起来成为复合语句,又称分程序。如下面是一个复合语句。 z

6、=x+y; t=z/100; printf(%f,t); ,注意:复合语句中最后一个语句中最后的分号不能忽略不写(这是和pascal不同的)。 C语言允许一行写几个语句,也允许一个语句拆开写在几行上,书写格式无固定要求(fortran、cobol有严格要求)。 4.2 程序的三种基本结构 为了提高程序设计的质量和效率,现在普遍采用结构化程序设计方法。结构化程序由若干个基本结构组成。每一个基本结构可以包含 一个或若干个语句。有三种基本结构: (1) 顺序结构,见图4.2。先执行a操作,再执行b操作,两者是顺序执行的关系。图中(b)是ns结构化流程图(下同)。,图4.2,图4.3,(2) 选择结构

7、,见图4.3。p代表一个条件,当p条件成立(或称为“真”)时执行a,否则执行b。注意,只能执行a或b之一。两条路径汇合在一起然后出口。 (3) 循环结构,有两种循环结构: 当型循环结构,见图4.4。当p条件成立(“真”)时,反复执行a操作。直到p为“假”时才停止循环。 直到型循环结构,见图4.5。先执行a操作,再判断p是否为“假”,若p为“假”,再执行a,如此反复,直到p为“真”为止。,图4.4,图4.5,由选择结构可以派生出另一种基本结构: 多分支选择结构,见图4.6。 根据k的值(k1,k2,kn)不同而决定执行a1,a2,an之一。 已经证明,由以上基本结构组成的程序能处理任何复杂的问题

8、。上面图4.2图4.7中方框中的a,b,a1,an等可以是一个简单的语句,也可以又是一个基本结构。例如,图4.7是一个顺序结构,它由两个操作顺序组成。虚线框内是一个当型循环结构,可以用“b”表示,因此图4.7就可以理解为图4.2(a)所示的顺序结构。,图4.6,图4.7,关于三种基本结构的特征以及结构化程序设计方法,读者可能已在学习其他高级语言程序设计时学习过,在此不再重复。只是应当强调说明,在今后的程序设计中应当采用结构化程序设计方法。在本章中,我们将介绍几种最基本的语句,以及用它们构成顺序结构的程序。在第4、第5章介绍选择结构和循环结构的程序设计。,4.3 赋值语句 前已介绍,赋值语句是由

9、赋值表达式加上一个分号构成。由于赋值语句应用十分普遍,所以专门再讨论一下。 C语言的赋值语句具有其他高级语言的赋值语句的一切特点和功能。但也应当注意到它们的不同: (1) C语言中的赋值号“=”是一个运算符,在其他大多数语言中赋值号不是运算符。 (2) 关于赋值表达式与赋值语句的概念,其他多数高级语言没有“赋值表达式”一概念。作为赋值表达式可以包括在其他表达式之中,例如: if(a=b)0)t=a;,按语法规定if后面的()内是一个条件,例如可以是:“if(x0)”。现在在x的位置上换上一个赋值表达式“a=b”,其作用是:先进行赋值运算(将b的值赋给a),然后判断a是否大于0,如大于0,执行t

10、=a。在if语句中的“a=b”不是赋值语句而是赋值表达式,这样写是合法的。如果写成if(a=b;)0)t=a;就错了。在if的条件中不能包含赋值语句。由此可以看到,c把赋值语句和赋值表达式区别开来,增加了表达式的种类,使表达式的应用几乎“无孔不入”,能实现其他语言中难以实现的功能.,4.4 数据输入输出的概念及在C语言中的实现 (1) 所谓输入输出是以计算机主机为主体而言的。从计算机向外部输出设备(如显示屏、打印机、磁盘等)输出数据称为“输出” ,从外部向输入设备(如键盘、磁盘、光盘、扫描仪等)输入数据称为“输入”。 (2) C语言本身不提供输入输出语句,输入和输出操作是由函数来实现的。在c标

11、准函数库中提供了一些输入输出函数,例如,printf函数和scanf函数。读者在使用它们时,千万不要误认为它们是C语言提供的“输入输出语句”。printf和scanf不是C语言的关键字,而只是函数的名字。实际上完全可以不用printf和scanf这两个名字,而另外编两个,输入输出函数, 用其他的函数名。C提供的函数以库的形式存放在系统中,它们不是c语言文本中的组成部分。 在第1章中曾介绍,不把输入输出作为C语言提供的语句的目的是使C语言编译系统简单,因为将语句翻译成二进制的指令是在编译阶段完成的,没有输入输出语句就可以避免在编译阶段处理与硬件有关的问题,可以使编译系统简化,而且通用性强,可移植

12、性好,对各种型号的计算机都适用,便于在各种计算机上实现。各种版本的C语言函数库是各计算机厂商(或软件开发公司)针对某一类型计算机的情况编写的,并且已编译成目标文件(.obj文件)。它们在连接阶段与由源程序经编译而得到的目标文件相连接,生成一个可执行的目标程序。如果在源程序中有printf函,数,在编译时并不把它翻译成目标指令,而是在执行阶段中调用已被连接的函数库中的printf函数。由于c编译系统与c函数库是分别进行设计的,因此不同的计算机系统所提供函数的数量、名字和功能是不完全相同的。不过,有些通用的函数(如printf和scanf等),各种计算机系统都提供,成为各种计算机系统的标准函数。c

13、语言函数库中有一批“标准输入输出函数” ,它是以标准的输入输出设备(一般为终端设备)为输入输出对象的。其中有:putchar(输出字符),getchar(输入字符),printf(格式输出),scanf(格式输入), puts(输出字符串),gets(输入字符串)。在本章中介绍前面4个最基本的输入输出函数。,(3) 在使用c语言库函数时,要用预编译命令“include”将有关的“头文件” 包括到用户源文件中。在头文件中包含了与用到的函数有关的信息。例如使用标准输入输出库函数时,要用到“stdio.h”文件。文件后缀“h” 是head的缩写,#include命令都是放在程序的开头,因此这类文件被

14、称为“头文件” 。在调用标准输入输出库函数时,文件开头应有以下预编译命令: #include 或 #include studio.h studioh是standard input putchar(n);putchar(b);putchar(n);putchar(c); putchar(n); 则输出结果为: b o y 也可以输出其他转义字符,如: putchar(101)(输出字符a) putchar() (输出单引号字符) putchar(015) (输出回车,不换行,使输出的当前位置移到本行开头),4.5.2 getchar函数(字符输入函数) 此函数的作用是从终端(或系统隐含指定的输入

15、设备)输入一个字符。getchar函数没有参数,其一般形式为getchar() 函数的值就是从输入设备得到的字符。例如: 例4.2输入单个字符 #include main() charc; c=getchar(); putchar(c); ,在运行时,如果从键盘输入字符a并按回车键,就会在屏幕上看到输出的字符a。a(输入a后,按“回车”键,字符才送到内存) a (输出变量c的值a) 请注意,getchar()只能接收一个字符。getchar函数得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,作为表达式的一部分。例如,例4.2第4、5行可以用下面一行代替: putchar(get

16、char(); 因为getchar()的值为a,因此putchar函数输出a。也可以用printf函数输出: printf(”%c,getchar();请不要忘记,如果在一个函数中(今为main函数)要调用getchar函数,应该在该函数的前面(或本文件开头)加上“包含命令” #include,4.6.1 printf函数(格式输出函数) 在前面各章节中已用到printf函数,它的作用是向终端(或系统隐含指定的输出设备)输出若干个任意类型的数据(putchar只能输出字符,而且只能是一个字符,而printf可以输出多个数据,且为任意类型)。 1. printf函数的一般格式为printf(格式

17、控制,输出表列) 如:printf(%d, %cn,i,c) 括弧内包括两部分:,4.6 格式输入与输出,(1) “格式控制”是用双引号括起来的字符串,也称“转换控制字符串”,它包括两种信息: 格式说明,由“%”和格式字符组成,如%d,%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。 普通字符,即需要原样输出的字符。例如上面printf函数中双引号内的逗号、空格和换行符。 (2) “输出表列”是需要输出的一些数据,可以是表达式。 2. 格式字符 对不同类型的数据用不同的格式字符。常用的有以下几种格式字符:,(1) d格式符。用来输出十进制整数。有以下几种用法

18、: %d,按整型数据的实际长度输出。 %md, m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于,则按实际位数输出。如 printf(%4d,%4d,a,b); 若a=123,b=12345,则输出结果为 123,12345 %ld,输出长整型数据。如 longa=135790; printf(%ld,a);,如果用%d输出,就会发生错误,因为整型数据的范围为-3276832767。对long型数据应当用%ld格式输出。对长整型数据也可以指定字段宽度,如将上面printf函数中的“%ld”改为“%8ld”,则输出为: 135790 8列 一个int型数据可以用%d或%ld

19、格式输出。 (2) o格式符,以八进制数形式输出整数。由于是将内存单元中的各位的值(0或1)按八进制形式输出,因此输出的数值不带符号,即将符号位也一起作为八进制数的一部分输出。例如: int a=-1; printf(%d,%o,a,a); -1在内存单元中的存放形式(以补码形式存放)如下:,1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 输出为 -1,177777 不会输出带负号的八进制整数。对长整数(long型)可以用“%lo”格式输出。同样可以指定字段宽度,如printf(“%8o”,a)输出为177777。 (3) x格式符,以十六进制数形式输出整数。同样不会出现负的十

20、六进制数。例如: int a=-1; printf(%x,%o,%d,a,a,a);,输出结果为 ffff,177777,-1 同样可以用“%lx”输出长整型数,也可以指定输出字段的宽度,如“%12x”。 (4) u格式符,用来输出unsigned型数据,即无符号数,以十进制形式输出。 一个有符号整数(int型)也可以用%u格式输出;反之,一个unsigned型数据也可以用%d格式输出。按相互赋值的规则处理(见第2章2.9节)。unsigned型数据也可用%o或%x格式输出。 例4.3无符号数据的输出。,main() unsigned int a=65535; int b=-2; printf

21、(a=%d,%o,%x,%un,a,a,a,a); printf(b=%d,%o,%x,%un,b,b,b,b); 运行结果为: a=-1,177777,ffff,65535 b=-2,177776,fffe,65534 请读者自己分析。,(5) c格式符,用来输出一个字符。如: charc=a; printf(%c,c); 输出字符a,请注意:“%c”中的c是格式符,逗号右边的c是变量名,不要搞混。 一个整数,只要它的值在0255范围内,也可以用字符形式输出,在输出前,系统会将该整数作为ascii码转换成相应的字符;反之,一个字符数据也可以用整数形式输出。例4.4字符数据的输出。 main(

22、) char c=a; int i=97;,printf(%c,%dn,c,c); printf(%c,%dn,i,i); 运行结果为: a,97 a,97 也可以指定输出字数宽度,如果有 printf(%3c,c) 则输出:“ a”,即c变量输出占3列,前2列补空格。 (6) s格式符,用来输出一个字符串。有几种用法:,%s,例如:printf(%s,china) 输出“china”字符串(不包括双引号)。 %ms,输出的字符串占列,如字符串本身长度大于m,则突破的限制,将字符串全部输出。若串长小于m,则左补空格。 %-ms,如果串长小于,则在列范围内,字符串向左靠,右补空格。 %mns,输

23、出占列,但只取字符串中左端n个字符。这n个字符输出在列的右侧,左补空格。 %-mns,其中、n含义同上,n个字符输出在列范围的左侧,右补空格。如果n,则自动取n值,即保证n个字符正常输出。,例4.5字符串的输出。 main() printf(%3s,%7.2s,%.4s,%-5.3sn,china,china, china, china) 输出如下: china, ch,chin,chi 其中第3个输出项,格式说明为“%.4s”,即只指定了n,没指定,自动使=n=4,故占4列。,(7) f格式符,用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法: %f,不指定字段宽度,由系统自动

24、指定,使整数部分全部如数输出,并输出6位小数。应当注意,并非全部数字都是有效数字。单精度实数的有效位数一般为7位。 例4.6输出实数时的有效位数。 main() float x,y; x=111111111;y=222222222; printf(%f,x+y); ,运行结果为 333333328125 显然,只有前7位数字是有效数字。千万不要以为凡是打印出来的数字都是准确的。 双精度数也可用%f格式输出,它的有效位数一般为16位,给出小数6位。 例4.7输出双精度数时的有效位数。 main() double x,y; x=1111111111111.111111111; y=22222222

25、22222.222222222; printf(%f,x+y); ,输出结果为 3333333333333.333010 可以看到最后3位小数(超过16位)是无意义的。 %nf指定输出的数据共占列,其中有n位小数。如果数值长度小于,则左端补空格。 %-nf与%nf基本相同,只是使输出的数值向左端靠,右端补空格。 例4.8输出实数时指定小数位数。 main() float f=123.456;,printf(%f %10f %10.2f %.2f %-10.2fn,f,f,f,f,f); 输出结果如下: 123.456001 123.456001 123.46 123.46 123.46 f的值

26、应为123.456,但输出为123.455994, 这是由于实数在内存中的存储误差引起的。 (8) e格式符,以指数形式输出实数。可用以下形式: %e不指定输出数据所占的宽度和数字部分的小数位数,有的c编译系统自动指定给出6位小数,指数部分占5位(如e+002),其中“e”占1位,指数符号,占1位,指数占3位。数值按规范化指数形式输出(即小数点前必须有而且只有1位非零数字)。例如 printf(%e,123456); 输出:1234560e+002。 6列 5列 输出的实数共占13列宽度。(注: 不同系统的规定略有不同) %m.ne和%-m.ne。、n和“-”字符含义与前相同。此处n指拟输出的

27、数据的小数部分(又称尾数)的小数位数。若f=123456,则: 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 13列 13列 10列 9列 10列 第2个输出项按%10e输出,即只指定了=10,未指定n,凡未指定n,自动使n=6,整个数据长13列,超过给定的10列,乃突破10列的限制,按实际长度输出。第3个数据共占10列,小数部分占2列。第4个数据按“%2e”格式输出,只指定n=2,未指定,自动使等于数据应占的长度,今为

28、9列。第5个数据应占10列,数值只有9列,由于是“%-102e”,数值向左靠,右补一个空格。(注: 有的c系统的输出格式与此略有不同),(9) g格式符,用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的零。例如,若f=123468,则printf(“%f %e %g”,f,f,f); 输出如下: 123.468000 1.234680e+002 123.468 10列 13列 10列 用%f格式输出占10列,用%e格式输出占13列,用%g格式时,自动从上面两种格式中选择短者(今以%f格式为短),故占10列,且按%f格式用小数形式输出,最后3个

29、小数位“0”为无意义的0,不输出,因此输出123.468,然后右补3个空格。%g格式用得较少。,在使用printf函数时,还有几点要说明: (1) 除了x,e,g外,其他格式字符必须用小写字母,如%d不能写成%d。 (2) 可以在printf函数中的“格式控制”字符串内包含第2章2.5节2.5.1段中的“转义字符”,如“n”、“t”、“b”、“r”、“f”、“377”等。 (3) 上面介绍的d、o、x、u、c、s、f、e、g等字符,如用在“%”后面就作为格式符号。一个格式说明以“%”开头,以上述9个格式字符之一为结束,中间可以插入附加格式字符(也称修饰符)。例如:,第一个格式说明为“%c”而不

30、包括其后的f,第二个格式说明为“%f”,不包括其后的s,第三个格式说明为%s。其他的字符为原样输出的普通字符。 (4) 如果想输出字符“%”,则应该在“格式控制”字符串中用连续两个%表示,如:,printf(%f%,10/3); 输出: 0333333% 4.6.2 scanf函数(格式输入函数) 在第1章中已初步接触到了scanf函数,在本节中再作详细介绍。 1. 一般形式 scanf(格式控制,地址表列) “格式控制”的含义同printf函数;“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。,例4.9用scanf函数输入数据。 ain() int a,b,c; scanf(“%d%d%d”, 运行情况如下: a=1,b=3,c=2 x1=-100 x2=-200 注意程序中用了预处理命令include 。,4.8习题 4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论