C语言第3章简单程序.ppt

上传人:牧羊曲112 文档编号:6504245 上传时间:2023-11-07 格式:PPT 页数:86 大小:905KB
返回 下载 相关 举报
C语言第3章简单程序.ppt_第1页
第1页 / 共86页
C语言第3章简单程序.ppt_第2页
第2页 / 共86页
C语言第3章简单程序.ppt_第3页
第3页 / 共86页
C语言第3章简单程序.ppt_第4页
第4页 / 共86页
C语言第3章简单程序.ppt_第5页
第5页 / 共86页
点击查看更多>>
资源描述

《C语言第3章简单程序.ppt》由会员分享,可在线阅读,更多相关《C语言第3章简单程序.ppt(86页珍藏版)》请在三一办公上搜索。

1、第三章,最简单的c程序设计,顺序程序设计,本章要点,算法的概念及表示方法 结构化程序设计方法 C语句 顺序结构的程序设计语句及方法,主要内容,3.1 算法概述3.2 程序的三种基本结构3.3 C语句综述3.4 赋值表达式和赋值语句3.5 数据输入输出的概念3.6 字符数据的输入输出3.7 简单的格式输入与输出3.8 顺序结构程序设计举例,一个程序应包括两个方面的内容:,对数据的描述:数据结构(data structure)对操作的描述:算法(algorithm),著名计算机科学家沃思提出一个公式:数据结构+算法=程序,数据结构算法程序设计方法语言工具,完整的程序设计应该是:,3.1 算法概述,

2、广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”。,方法1:1+2,+3,+4,一直加到100 加99次方法2:100+(1+99)+(2+98)+(49+51)+50=100+49100+50 加51次,对同一个问题,可有不同的解题方法和步骤,例:求,3.1.1 算法的概念,3.1.1 算法的概念,为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择合适的算法。希望方法简单,运算步骤少。,计算机算法可分为两大类别:数值运算算法:求数值解,例如求方程的根、求函数的定积分等。非数值运算:包括的面十分广泛,最常见的是用于事务管理领域,例如图书检索、人事管理、行车调度管理等。

3、,电梯调度,铁路调度,3.1.2 怎样表示算法,算法的四种表示方法:,用自然语言表示算法用流程图表示算法 用N-S流程图表示算法 用伪代码表示算法,只有把算法描述出来,技术人员之间以及和专家、用户之间才能讨论和交流,才能论证算法的正确性、安全性、有效性类似于建筑图纸,(1)用自然语言表示算法,自然语言就是人们日常使用的语言,可以是汉语或英语或其它语言。用自然语言表示通俗易懂,但文字冗长,容易出现“歧义性”。自然语言表示的含义往往不严格,要根据上下文才能判断其正确含义,描述包含分支和循环的算法时也不很方便。因此,除了那些很简单的问题外,一般不用自然语言描述算法。,(2)用流程图表示算法,美国国家

4、标准化协会ANSI(American National Standard Institute)规定了一些常用的流程图符号:,连接点:用于将各个子图连在一起,构成整体(用于分页显示等),例 将求5!的算法用流程图表示,如果需要将最后结果打印出来,可在菱形框的下面加一个输出框。,用自然语言如何表示5!呢?,100!呢?,例:判断一个数是否偶数,其算法用流程图表示:,例:输出1到10的算法,用流程图表示,说明:,流程图是表示算法的较好的工具。一个流程图包括以下几部分:(1)表示相应操作的框;(2)带箭头的流程线;(3)框内外必要的文字说明。,(3)用N-S流程图表示算法,1973年美国学者I.Nas

5、si和B.Shneiderman提出了一种新的流程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包含其它的从属于它的框,或者说,由一些基本的框组成一个大的框。这种流程图又称N-S结构化流程图。,N-S流程图用以下的流程图符号:,(1)顺序结构,(2)选择结构,(3)循环结构,例:判断一个数是否偶数,其算法改用N-S流程图表示:,例:输出1到10的算法,改用N-S流程图表示:,N-S图表示算法的优点,比文字描述直观、形象、易于理解;比传统流程图紧凑易画。它废除了流程线,整个算法结构是由各个基本结构按顺序组成的,N-S流程图中的上下顺序就是执行时的顺序。

6、用N-S图表示的算法都是结构化的算法,因为它不可能出现流程无规律的跳转,而只能自上而下地顺序执行。,例:输出1到10的算法,改用N-S流程图表示:,(4)用伪代码表示算法,概念:伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。特点:它如同一篇文章一样,自上而下地写下来。它不用图形符号,因此书写方便、格式紧凑,也比较好懂,也便于向计算机程序过渡。用处:适用于设计过程中需要反复修改的流程描述。,if x is positive then print x else print-x也可以用汉字伪代码表示:若 x为正 打印 x 否则 打印-x也可以中英文混用,如:if x 为正 print

7、 x else print-x,例:“打印x的绝对值”的算法可以用伪代码表示为:,3.2 程序的三种基本结构,传统流程图的弊端 传统流程图用流程线指出各框的执行顺序,对流程线的使用没有严格限制。因此,使用者可以毫不受限制地使流程随意地转向,使流程图变得毫无规律,阅读者要花很大精力去追踪流程,使人难以理解算法的逻辑。如图:,传统流程图的流程可以是:,这种如同乱麻一样的算法称为BS型算法,意为一碗面条(A Bowl of Spaghetti),乱无头绪。,缺点:难以阅读、修改,使算法的可靠性和可维护性难以保证。解决办法:必须限制箭头的滥用,即不允许无规律地使流程随意转向,只能顺序地进行下去。(go

8、to语句就是这样),三种基本结构 Bohra和Jacopini提出了以下三种基本结构:顺序结构、选择结构、循环结构 用这三种基本结构作为表示一个良好算法的基本单元。由三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。,C语言就是按照这三种基本结构来设计的(除了goto),三种基本结构的图示:,顺序结构,选择结构,循环结构的图示:,当型(While型)循环结构,直到型(Until型)循环,这三种结构都有一个特点,就是必须从a点入、b点出,不允许从d点直接跳到c点。,d,c,这就乱了,非结构化了,这样才可以,选择结构,if else,if,例如:取得a与b之间的大者。,#include vo

9、id main()int a,b,c;scanf(%d%d,#include void main()int a,b;scanf(%d%d,三种基本结构的共同特点:(1)只有一个入口;(2)只有一个出口;(注意:一个菱形判断框有两个 出口,而一个选择结构只有一 个出口。不要将二者相混淆。)(3)结构内的每一部分都有机会被执行到;(4)结构内不存在“死循环”(无终止的循环)。,c,不论A或B,都一样,出去都到c处了,图中没有一条从入口到出口的路径通过A框。,不正确的流程表示:,流程内的死循环,小结:,由三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。由基本结构所构成的算法属于“结构化”的算

10、法,它不存在无规律的转向,只在本基本结构内才允许存在分支和向前或向后的跳转。,结构化程序设计方法,结构化程序,就是用高级语言实现结构化算法。用三种基本结构组成的程序必然是结构化的程序,这种程序便于编写、便于阅读、便于修改和维护。结构化程序设计强调程序设计风格和程序结构的规范化,提倡清晰的结构。结构化程序设计方法的基本思路是:把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。,所以,我们要学习顺序、选择和循环!因为结构化算法就依靠这些来解决问题,3.3 C语句综述,C程序的结构:,一个c程序可以有若干个源程序文件组成一个源文件可以有若干个函数和预处理命令以

11、及全局变量声明部分组成一个函数有函数首部和函数体组成函数体由数据声明和执行语句组成执行语句分为,(1)控制语句(种)。完成一定的控制功能。if()else(条件语句,用来实现选择结构)switch(多分支选择语句)for()(循环语句,用来实现循环结构)while()(循环语句,用来实现循环结构)do while()(循环语句,用来实现循环结构)continue(结束本次循环语句)break(中止执行switch或循环语句)return(从函数返回语句)goto(转向语句,对结构化可能有危害,基本不用),(4)空语句 只有一个分号的语句(什么也不做)可能用来作为循环语句中的循环体,;,在使用

12、if()else 的时候,希望在其中包含多条语句,则需要使用复合语句的概念。例如:如果ab,则交换a和b,否则什么也不做。,#include void main()int a,b,c;scanf(%d%d,如果没有 会有什么问题?,课堂练习:要求用户输入a和b的值;如果ab,就让c等于a的平方根,并输出c;否则,就让d等于a和b的平均值,并输出d。,3.4 赋值表达式和赋值语句,3.4.1 赋值表达式,(2)、复合的赋值运算符,x=x+n x+=n,赋值运算符两侧出现相同的变量,赋值符号“”就是赋值运算符,它的作用是将一个数据赋给一个变量。例如:a=100 表示将100赋给变量a,(1)赋值运

13、算符,x=x+nx=x-nx=x*nx=x/nx=x%n,x+=nx-=nx*=nx/=nx%=n,算术运算与赋值运算相结合,X与n均为整数,例:,(3)赋值表达式,由赋值运算符将一个变量和一个子表达式连接起来的式子称为“赋值表达式”,子表达式的值就是“赋值表达式”的值,变量 赋值运算符 表达式,例如:a=5 b=(a=5)c=10+(d=8)a=(b=10)/(c=2)(b等于10,c等于2,a等于5,表达式值为5),3.4.2 赋值过程中的类型转换,(1)实型数据赋给整型变量,先对实数取整后再赋予整型变量.例如:为整型变量,执行“i=3.86”后的值为(2)将一个double型数据赋给fl

14、oat变量时,截取其前面7位有效数字存放到float变量中。注意数值范围不能溢出。例如:double d=123.456789e200;d=d*d;printf(%e,d);d无法容纳如此大的数,出现溢出,可能导致数据错误!溢出有很多种(数组越界等)。C语言对错误检查比较宽泛,对此类问题大都不做直接限制。运行时会出现问题:有的溢出立刻出错,有的则可能暂时看不到错误,但有潜在问题,不同编译器也可能有差别。溢出本身就是错的,程序员一定要主动避免各类溢出,即使看不到错误。“大数问题”也是经典问题之一。,精度可以近似,大小就没办法了,赋值和其他的算术运算不一样:算术运算时,例如 a+b,如果两操作数类

15、型不统一,则按照低就高的原则来转化 赋值时,例如 a=b,如果二者类型不统一,则只能按照 a的类型来转化,因为最终是要把数据放到a中的,只有 类型和a相同才能够放进去,(3)将一个占字节多的整型数据赋给一个占字节少的整型变量或字符变量,只将其低字节原封不动地送到该变量,即截断.例如:把一个4字节的long型数据赋给一个2字节的short型变量,或将一个2字节的int型数据赋给1字节的char型变量:i=289;/*已定义i为整型变量*/c=a;/*已定义c为字符变量*/c=i;/*将占2字节的int型数据赋给char型变量*/,要避免进行这种发生失真的赋值!,a的ASCII值为97 内存中存储

16、形式,0 1 1 0 0 0 0 1,例:ASCII码字符a、A、1 存储为:97、65、49,0 0 0 0 0 0 0 0,0 1 1 0 0 0 0 1,在ASCII范围以内,整型数据与字符型数据可以通用,a的ASCII值为97 内存中存储形式,0 1 1 0 0 0 0 1,例:ASCII码字符a、A、1 存储为:97、65、49,0 0 1 0 0 1 0 0,0 1 1 0 0 0 0 1,在ASCII范围以外,整型数据与字符型数据不可以通用,#include void main()int a;char c;c=5;a=c;printf(%dn,a);,#include void

17、main()int a;char c;a=53;c=a;printf(%cn,c);,#include void main()int a;char c;a=289;c=a;printf(%dn,c);,虽然可以输出但是已经发生了截断数据已经不真实了,3.4.3 赋值语句,若a的值等于100,则成绩为优秀,if(a=100)赋值运算,if(a=100)关系运算,条件中的赋值符号要适当使用!,赋值语句由赋值表达式加分号组成:a=b 赋值表达式a=b;赋值语句,例,3.4.4 变量赋初值,int a=3;*指定为整型变量,初值为*double f=3.56;*指定为双精度型变量,初值为.56*cha

18、r c=a;*指定为字符变量,初值为a*int a,b,c=5;*对一部分变量赋初值。*,对几个变量赋予同一个初值,应写成:int a=3,b=3,c=3;以下写法错误:int a=b=c=3;,变量声明时赋初值,不同于普通赋值,必须符合变量声明的要求,即“逗号”,3.5 数据输入输出的概念,输入输出是以计算机主机为主体而言的输出:从计算机向外部输出设备输出数据输入:从输入设备向计算机输入数据,C语言本身不提供输入输出语句,输入和输出操作是由C函数库中的函数来实现的。例如:字符输入函数:getchar 字符输出函数:putchar格式输入函数:scanf 格式输出函数:printf字符串输入函

19、数:gets 字数串输出函数:puts,在使用系统库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件中.例如:在调用标准输入输出库函数时,文件开头应该有:#include“stdio.h”或:#include,头文件,3.6 字符数据的输入输出,3.6.1 字符输出函数一般形式:putchar(c)函数作用:向终端输出一个字符,字符型变量整型变量,例3.1:输出单个字符。,运行结果:BOY,运行结果:B O Y,#includevoid main()char a,b,c;a=B;b=O;c=Y;putchar(a);putchar(b);putchar(c);put

20、char(n);,putchar(a);putchar(n);putchar(b);putchar(n);putchar(c);putchar(n);,3.6.2 字符输入函数一般形式:getchar()函数作用:从终端输入设备输入一个字符函数值:从输入设备得到的字符。,例3.2 输入多个字符。,运行结果:BOY(连续输入BOY并且确认之后,字符才送到内存)BOY(输出变量a,b,的值),#include void main()char a,b,c;/*定义字符变量a,b,c*/a=getchar();/*从键盘输入一个字符,送给字符变量a*/b=getchar();/*从键盘输入一个字符,送

21、给字符变量b*/c=getchar();/*从键盘输入一个字符,送给字符变量c*/putchar(a);/*将变量a的值输出*/putchar(b);/*将变量a的值输出*/putchar(c);/*将变量a的值输出*/putchar(n);/*换行*/,输入时:BOY会如何?,回车键也是字符,也读进去了,#include void main()char a,b,c;/*定义字符变量a,b,c*/a=getchar();/*从键盘输入一个字符,送给字符变量a*/putchar(a);/*将变量a的值输出*/b=getchar();/*从键盘输入一个字符,送给字符变量b*/putchar(b);

22、/*将变量a的值输出*/c=getchar();/*从键盘输入一个字符,送给字符变量c*/putchar(c);/*将变量a的值输出*/putchar(n);/*换行*/,结果和前一例子有何区别?,3.7 简单的格式输入与输出,3.7.1 格式输出函数 printf函数作用:向终端(或系统指定的输出设备)输出若干个任意类型的数据。一般格式:printf(格式控制,输出表列),%d:以带符号的十进制形式输出整数%o:以八进制无符号形式输出整数%x:以十六进制无符号形式输出整数To be continued,#include void main()double a,b;a=3.3;b=4.4;pr

23、intf(%f+%gin,a,b);,#include void main()int a=18;printf(%dn%on%xn,a,a,a);,3.7.1 格式输出函数 printf,%u:以无符号十进制形式输出整数%c:以字符形式输出,只输出一个字符%s:输出字符串%f:以小数形式输出单、双精度数,隐含输出六位小数%e:以指数形式输出实数%g:也用来输出单、双精度数,但是不输出无意义的0,#include void main()int a=18;int b=-18;printf(%un,a);printf(%un,b);,#include void main()double a=18;pr

24、intf(%fn%en%gn,a,a,a);,格式符的附加修饰符:,L:TC中用于长整型数,加在格式符d,o,x,u前面使用,VC中由于int和long完全一样了,所以对于long型数据也直接使用%d即可,不用l了M(正整数):数据最小宽度,实际长度小于m则m,实际长度大于m则按照实际长度N(正整数):对实数,表示输出n位小数(四舍五入);对字符串,表示截取的字符个数-(负号):输出的内容左对齐一般用法为:%-M.Nf 等等,例如”%-8.2f”,#include void main()double a=12.345;printf(%9.1fAAAn%-9.1fAAAn%3.5fAAAn,a,

25、a,a);,具体讲解,格式符。用来输出十进制整数。几种用法:%d:按十进制整型数据的实际长度输出。%md:为指定的输出字段的宽度。如果数据的位数小于,则左端补以空格,若大于,则按实际位数输出。例:%ld:输出长整型数据。例:long a=135790;/*定义a为长整型变量*/printf(%ld,a);,(2)i格式符 教材上的i格式符与格式符用法相同,int a=123;int b=12345;printf(%4d,%4d,a,b);,(3)格式符,用来输出一个字符。如:chard=a;printf(%c,d);输出字符 a一个整数,只要它的值在0255范围内,可以用“”使之按字符形式输出

26、,在输出前,系统会将该整数作为ASCII码转换成相应的字符;一个字符数据也可以用整数形式输出。另外,允许使用c和-c的形式。,例3.3 用printf函数输出字符数据。#include void main()char c=a;int i=97;printf(c=%c,c=%dn,c,c);printf(i=%c,i=%dn,i,i);,运行结果:c=a,c=97i=a,i=97,(4)s格式符,输出字符串.%s。例如:printf(”%s”,”CHINA”)输出字符串 CHINA%ms,输出的字符串占m列,若串长大于m,则全部输出,若串长小于m,则左补空格。%-ms,若串长小于m,字符串向左靠

27、,右补空格。%m.ns,输出占m列,只取字符串中左端n个字符,左补空格。若nm,m自动取n值。%-m.ns,右补空格。,m、n、-的用法与浮点型类似只是n代表了截取字符的个数,#include void main()printf(%-4.3s,%4.5s.,abcdefgh,abcdefgh);,(5)格式符。用来以小数形式输出实数(包括单双精度)有以下几种用法:。不指定字段宽度,由系统自动指定字段宽度,使整数部分全部输出,并输出位小数。.。指定输出的数据共占列,其中有位小数。如果数值长度小于,则左端补空格;大于m则按实际长度。.与.基本相同,只是使输出的数值向左端靠,右端补空格。,例3.4

28、输出实数时的有效位数。运行结果为:.,例3.5 输出双精度数时的有效位数。输出结果:33333333.333333,#include void main()float a,b;a=111111.111;b=222222.222;printf(%fn,a+b);,#include void main()double a,b;a=11111111.11111111;b=22222222.22222222;printf(%fn,a+b);,浮点型变量的运算和赋值过程中,只要超出精度,则超出部分随机产生;只要溢出,则数据将产生错误。,例:输出实数时指定小数位数。,#include void main(

29、)float f=123.456;printf(%f%10f%10.2f%.2f%-10.2fn,f,f,f,f,f);,(8)格式符,以指数形式输出实数。可用以下形式:%e。不指定输出数据所占的宽度和数字部分的小数位数.例:printf(”%e”,123.456);输出:1.234560+002 8列 5列所输出的实数共占13列宽度。(注:不同系统的规定略有不同),m.ne和-m.ne。、和“”字符的含义与前相同。此处指拟输出的数据的小数部分(又称尾数的小数)位数。输出如下:1.234560e+002 1.234560e+002 1.23e+002 1.23e+002 13列 13列 10列

30、 9列 1.23e+002+10列,未指定,自动使.超过给定的10 列,按实际长度输出。第3个数据共占10列,小数部分占列。只指定,未指定,自动使等于数据应占的长度。第5个数据应占10列,数值只有列,由于是“10.2”,数值向左靠,右补一个空格。(注:有的C系统的输出格式与此略有不同),float f=123.456;printf(%e%10e%10.2e%.2e%-10.2en,f,f,f,f,f);,关于字符串的输出举例:,#includevoid main()printf(%3s,%7.2s,%.4s,%-5.3sn,CHINA,CHINA,CHINA,CHINA);,说明:除了X,E,

31、G外,其他各式字符必须用小写。可以在printf函数中的“格式控制”字符串中包含转义字符。一个格式说明必须以“%”开头,以9个格式字符之一为结束,中间可以插入附加格式字符。想输出%,则应该在格式控制字符串中用连续两个%表示,#includevoid main()float f=33.33;printf(%g%n,f);,3.7.2 格式输入函数 scanf,函数作用:按照变量所在内存的地址将变量值存进去。一般格式:scanf(格式控制,地址表列),同printf函数,由若干个地址组成的表列,是变量的地址,如&a,printf中的格式控制符是通用的,但是附加修饰符却不一定通用。例如:m,n,-中

32、m可用;l 在scanf接收double型时是一定要用的,而在printf时不需要。,YES,YES,NO,NO,float类型只能使用%f不可使用%lf,例:用scanf函数输入数据。#includevoid main()int a,b,c;scanf(“%d%d%d”,运行情况:3 4 5(输入a,b,c的值)3,4,5(输出a,b,c的值),a在内存中的地址&是地址运算符,如果scanf的格式控制中是三个连续的%d,则输入时三个数字需要以空格或回车隔开,如果scanf的格式控制中的三个%d之外还有其他内容,则输入时三个数字的相应位置需要加上这些内容,在scanf中一般不使用n,n适用于p

33、rintf中实现输出换行的效果,输入是接收键盘输入内容,自动同步显示而已,不能在scanf中控制显示效果,说明:可以指定输入数据所占的列数为m,系统自动按它截取所需长度的数据;但是不能规定精度n。#include void main()int a,b;scanf(%3d%2d,#include void main()float a,b;scanf(%3.2f%2f,/错误!,说明:如果在%后有一个“*”附加说明符,表示跳过它指定的列数。#include void main()int a,b;scanf(%3d%*2d%2d,/有时需要使用现成的数据,则可能其中有些部分不需要,则跳过,使用sca

34、nf函数时应注意的问题:(1)scanf函数中的“格式控制”后面应当是变量地址,而不应 是变量名。(2)如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符。(3)在用“%c”格式输入字符时,空格字符和“其他控制字符”都作为有效字符输入。(4)在输入数据时,遇以下情况时认为该数据结束。遇空格,或按“回车”或“跳格”(Tab)键;按指定的宽度结束,如”%3d”,只取列;遇非法输入。,#include void main()int a;scanf(%d,/输入33w44,3.8 顺序结构程序设计举例,例3.7 输入三角形的三边长,求三角形面积。

35、假设:三个边长a,b,c能构成三角形。已知面积公式:area=s=(a+b+c)*0.5,数学函数库因为要用到其中的sqrt函数,#include#includevoid main()float a,b,c,s,area;scanf(%f,%f,%f,例3.8 从键盘输入一个大写字母,要求改成小写后输出。假设输入的确实是大写字母。,讨论:输入3个大写字母,输出相应的3个小写字母,请思考:用sacnf作输入函数、用putchar函数输出,程序如何改写?,#include void main()char c1,c2;c1=getchar();/*从键盘输入一个大写字母*/printf(%c,%dn

36、,c1,c1);/*分别用字符和整数输出*/c2=c1+32;/*把大写字母变为小写字母*/printf(%c,%dn,c2,c2);/*分别用字符和整数输出*/,#include void main()printf(%c,getchar()+32);printf(%c,getchar()+32);printf(%cn,getchar()+32);,例3.9 求x2方程的根。a,b,c由键盘输入,设。众所周知,一元二次方程式的根为x1=x2=可以将上面的分式分为两项:p=,q=x1=p+q,x2=p-q,#include#include void main()float a,b,c,disc,x1,x2,p,q;scanf(a=%f,b=%f,c=%f,#includevoid main()char c;c=getchar();if(c=A,请编写程序实现两个数的加法运算,按照如下格式:比如:输入3+5=,输出为 8,从键盘输入年份,判断该年是否是闰年,如果是闰年,在屏幕上打印“YES”,否则打印“NO”,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号