C语言第3章_简单程序09.ppt_第1页
C语言第3章_简单程序09.ppt_第2页
C语言第3章_简单程序09.ppt_第3页
C语言第3章_简单程序09.ppt_第4页
C语言第3章_简单程序09.ppt_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

第三章,最简单的c程序设计,顺序程序设计,本章要点,算法的概念及表示方法结构化程序设计方法C语句顺序结构的程序设计语句及方法,主要内容,3.1算法概述3.2程序的三种基本结构3.3C语句综述3.4赋值表达式和赋值语句3.5数据输入输出的概念3.6字符数据的输入输出3.7简单的格式输入与输出3.8顺序结构程序设计举例,一个程序应包括两个方面的内容:,对数据的描述:数据结构(datastructure)对操作的描述:算法(algorithm),著名计算机科学家沃思提出一个公式:数据结构+算法=程序,数据结构算法程序设计方法语言工具,完整的程序设计应该是:,3.1算法概述,广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”。,方法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.1.2怎样表示算法,算法的四种表示方法:,用自然语言表示算法用流程图表示算法用N-S流程图表示算法用伪代码表示算法,只有把算法描述出来,技术人员之间以及和专家、用户之间才能讨论和交流,才能论证算法的正确性、安全性、有效性类似于建筑图纸,(1)用自然语言表示算法,自然语言就是人们日常使用的语言,可以是汉语或英语或其它语言。用自然语言表示通俗易懂,但文字冗长,容易出现“歧义性”。自然语言表示的含义往往不严格,要根据上下文才能判断其正确含义,描述包含分支和循环的算法时也不很方便。因此,除了那些很简单的问题外,一般不用自然语言描述算法。,(2)用流程图表示算法,美国国家标准化协会ANSI(AmericanNationalStandardInstitute)规定了一些常用的流程图符号:,连接点:用于将各个子图连在一起,构成整体(用于分页显示等),例将求5!的算法用流程图表示,如果需要将最后结果打印出来,可在菱形框的下面加一个输出框。,用自然语言如何表示5!呢?,100!呢?,例:判断一个数是否偶数,其算法用流程图表示:,例:输出1到10的算法,用流程图表示,说明:,流程图是表示算法的较好的工具。一个流程图包括以下几部分:(1)表示相应操作的框;(2)带箭头的流程线;(3)框内外必要的文字说明。,(3)用N-S流程图表示算法,1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包含其它的从属于它的框,或者说,由一些基本的框组成一个大的框。这种流程图又称N-S结构化流程图。,N-S流程图用以下的流程图符号:,(1)顺序结构,(2)选择结构,(3)循环结构,例:判断一个数是否偶数,其算法改用N-S流程图表示:,例:输出1到10的算法,改用N-S流程图表示:,N-S图表示算法的优点,比文字描述直观、形象、易于理解;比传统流程图紧凑易画。它废除了流程线,整个算法结构是由各个基本结构按顺序组成的,N-S流程图中的上下顺序就是执行时的顺序。用N-S图表示的算法都是结构化的算法,因为它不可能出现流程无规律的跳转,而只能自上而下地顺序执行。,例:输出1到10的算法,改用N-S流程图表示:,(4)用伪代码表示算法,概念:伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。特点:它如同一篇文章一样,自上而下地写下来。它不用图形符号,因此书写方便、格式紧凑,也比较好懂,也便于向计算机程序过渡。用处:适用于设计过程中需要反复修改的流程描述。,ifxispositivethenprintxelseprint-x也可以用汉字伪代码表示:若x为正打印x否则打印-x也可以中英文混用,如:ifx为正printxelseprint-x,例:“打印x的绝对值”的算法可以用伪代码表示为:,3.2程序的三种基本结构,传统流程图的弊端传统流程图用流程线指出各框的执行顺序,对流程线的使用没有严格限制。因此,使用者可以毫不受限制地使流程随意地转向,使流程图变得毫无规律,阅读者要花很大精力去追踪流程,使人难以理解算法的逻辑。如图:,传统流程图的流程可以是:,这种如同乱麻一样的算法称为BS型算法,意为一碗面条(ABowlofSpaghetti),乱无头绪。,缺点:难以阅读、修改,使算法的可靠性和可维护性难以保证。解决办法:必须限制箭头的滥用,即不允许无规律地使流程随意转向,只能顺序地进行下去。(goto语句就是这样),三种基本结构Bohra和Jacopini提出了以下三种基本结构:顺序结构、选择结构、循环结构用这三种基本结构作为表示一个良好算法的基本单元。由三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。,C语言就是按照这三种基本结构来设计的(除了goto),三种基本结构的图示:,顺序结构,选择结构,循环结构的图示:,当型(While型)循环结构,直到型(Until型)循环,这三种结构都有一个特点,就是必须从a点入、b点出,不允许从d点直接跳到c点。,d,c,这就乱了,非结构化了,这样才可以,选择结构,ifelse,if,例如:取得a与b之间的大者。,#includevoidmain()inta,b,c;scanf(%d%d,#includevoidmain()inta,b;scanf(%d%d,三种基本结构的共同特点:(1)只有一个入口;(2)只有一个出口;(注意:一个菱形判断框有两个出口,而一个选择结构只有一个出口。不要将二者相混淆。)(3)结构内的每一部分都有机会被执行到;(4)结构内不存在“死循环”(无终止的循环)。,c,不论A或B,都一样,出去都到c处了,图中没有一条从入口到出口的路径通过A框。,不正确的流程表示:,流程内的死循环,小结:,由三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。由基本结构所构成的算法属于“结构化”的算法,它不存在无规律的转向,只在本基本结构内才允许存在分支和向前或向后的跳转。,结构化程序设计方法,结构化程序,就是用高级语言实现结构化算法。用三种基本结构组成的程序必然是结构化的程序,这种程序便于编写、便于阅读、便于修改和维护。结构化程序设计强调程序设计风格和程序结构的规范化,提倡清晰的结构。结构化程序设计方法的基本思路是:把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。,所以,我们要学习顺序、选择和循环!因为结构化算法就依靠这些来解决问题,3.3C语句综述,C程序的结构:,一个c程序可以有若干个源程序文件组成一个源文件可以有若干个函数和预处理命令以及全局变量声明部分组成一个函数有函数首部和函数体组成函数体由数据声明和执行语句组成执行语句分为,(1)控制语句(种)。完成一定的控制功能。if()else(条件语句,用来实现选择结构)switch(多分支选择语句)for()(循环语句,用来实现循环结构)while()(循环语句,用来实现循环结构)dowhile()(循环语句,用来实现循环结构)continue(结束本次循环语句)break(中止执行switch或循环语句)return(从函数返回语句)goto(转向语句,对结构化可能有危害,基本不用),(4)空语句只有一个分号的语句(什么也不做)可能用来作为循环语句中的循环体,;,在使用if()else的时候,希望在其中包含多条语句,则需要使用复合语句的概念。例如:如果ab,就让c等于a的平方根,并输出c;否则,就让d等于a和b的平均值,并输出d。,3.4赋值表达式和赋值语句,3.4.1赋值表达式,(2)、复合的赋值运算符,x=x+nx+=n,赋值运算符两侧出现相同的变量,赋值符号“”就是赋值运算符,它的作用是将一个数据赋给一个变量。例如:a=100表示将100赋给变量a,(1)赋值运算符,x=x+nx=x-nx=x*nx=x/nx=x%n,x+=nx-=nx*=nx/=nx%=n,算术运算与赋值运算相结合,X与n均为整数,例:,(3)赋值表达式,由赋值运算符将一个变量和一个子表达式连接起来的式子称为“赋值表达式”,子表达式的值就是“赋值表达式”的值,变量赋值运算符表达式,例如:a=5b=(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型数据赋给float变量时,截取其前面7位有效数字存放到float变量中。注意数值范围不能溢出。例如:doubled=123.456789e200;d=d*d;printf(%e,d);d无法容纳如此大的数,出现溢出,可能导致数据错误!溢出有很多种(数组越界等)。C语言对错误检查比较宽泛,对此类问题大都不做直接限制。运行时会出现问题:有的溢出立刻出错,有的则可能暂时看不到错误,但有潜在问题,不同编译器也可能有差别。溢出本身就是错的,程序员一定要主动避免各类溢出,即使看不到错误。“大数问题”也是经典问题之一。,精度可以近似,大小就没办法了,赋值和其他的算术运算不一样:算术运算时,例如a+b,如果两操作数类型不统一,则按照低就高的原则来转化赋值时,例如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内存中存储形式,01100001,例:ASCII码字符a、A、1存储为:97、65、49,00000000,01100001,在ASCII范围以内,整型数据与字符型数据可以通用,a的ASCII值为97内存中存储形式,01100001,例:ASCII码字符a、A、1存储为:97、65、49,00100100,01100001,在ASCII范围以外,整型数据与字符型数据不可以通用,#includevoidmain()inta;charc;c=5;a=c;printf(%dn,a);,#includevoidmain()inta;charc;a=53;c=a;printf(%cn,c);,#includevoidmain()inta;charc;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变量赋初值,inta=3;*指定为整型变量,初值为*doublef=3.56;*指定为双精度型变量,初值为.56*charc=a;*指定为字符变量,初值为a*inta,b,c=5;*对一部分变量赋初值。*,对几个变量赋予同一个初值,应写成:inta=3,b=3,c=3;以下写法错误:inta=b=c=3;,变量声明时赋初值,不同于普通赋值,必须符合变量声明的要求,即“逗号”,3.5数据输入输出的概念,输入输出是以计算机主机为主体而言的输出:从计算机向外部输出设备输出数据输入:从输入设备向计算机输入数据,C语言本身不提供输入输出语句,输入和输出操作是由C函数库中的函数来实现的。例如:字符输入函数:getchar字符输出函数:putchar格式输入函数:scanf格式输出函数:printf字符串输入函数:gets字数串输出函数:puts,在使用系统库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件中.例如:在调用标准输入输出库函数时,文件开头应该有:#include“stdio.h”或:#include,头文件,3.6字符数据的输入输出,3.6.1字符输出函数一般形式:putchar(c)函数作用:向终端输出一个字符,字符型变量整型变量,例3.1:输出单个字符。,运行结果:BOY,运行结果:BOY,#includevoidmain()chara,b,c;a=B;b=O;c=Y;putchar(a);putchar(b);putchar(c);putchar(n);,putchar(a);putchar(n);putchar(b);putchar(n);putchar(c);putchar(n);,3.6.2字符输入函数一般形式:getchar()函数作用:从终端输入设备输入一个字符函数值:从输入设备得到的字符。,例3.2输入多个字符。,运行结果:BOY(连续输入BOY并且确认之后,字符才送到内存)BOY(输出变量a,b,的值),#includevoidmain()chara,b,c;/*定义字符变量a,b,c*/a=getchar();/*从键盘输入一个字符,送给字符变量a*/b=getchar();/*从键盘输入一个字符,送给字符变量b*/c=getchar();/*从键盘输入一个字符,送给字符变量c*/putchar(a);/*将变量a的值输出*/putchar(b);/*将变量a的值输出*/putchar(c);/*将变量a的值输出*/putchar(n);/*换行*/,输入时:BOY会如何?,回车键也是字符,也读进去了,#includevoidmain()chara,b,c;/*定义字符变量a,b,c*/a=getchar();/*从键盘输入一个字符,送给字符变量a*/putchar(a);/*将变量a的值输出*/b=getchar();/*从键盘输入一个字符,送给字符变量b*/putchar(b);/*将变量a的值输出*/c=getchar();/*从键盘输入一个字符,送给字符变量c*/putchar(c);/*将变量a的值输出*/putchar(n);/*换行*/,结果和前一例子有何区别?,3.7简单的格式输入与输出,3.7.1格式输出函数printf函数作用:向终端(或系统指定的输出设备)输出若干个任意类型的数据。一般格式:printf(格式控制,输出表列),%d:以带符号的十进制形式输出整数%o:以八进制无符号形式输出整数%x:以十六进制无符号形式输出整数Tobecontinued,#includevoidmain()doublea,b;a=3.3;b=4.4;printf(%f+%gin,a,b);,#includevoidmain()inta=18;printf(%dn%on%xn,a,a,a);,3.7.1格式输出函数printf,%u:以无符号十进制形式输出整数%c:以字符形式输出,只输出一个字符%s:输出字符串%f:以小数形式输出单、双精度数,隐含输出六位小数%e:以指数形式输出实数%g:也用来输出单、双精度数,但是不输出无意义的0,#includevoidmain()inta=18;intb=-18;printf(%un,a);printf(%un,b);,#includevoidmain()doublea=18;printf(%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”,#includevoidmain()doublea=12.345;printf(%9.1fAAAn%-9.1fAAAn%3.5fAAAn,a,a,a);,具体讲解,格式符。用来输出十进制整数。几种用法:%d:按十进制整型数据的实际长度输出。%md:为指定的输出字段的宽度。如果数据的位数小于,则左端补以空格,若大于,则按实际位数输出。例:%ld:输出长整型数据。例:longa=135790;/*定义a为长整型变量*/printf(%ld,a);,(2)i格式符教材上的i格式符与格式符用法相同,inta=123;intb=12345;printf(%4d,%4d,a,b);,(3)格式符,用来输出一个字符。如:chard=a;printf(%c,d);输出字符a一个整数,只要它的值在0255范围内,可以用“”使之按字符形式输出,在输出前,系统会将该整数作为ASCII码转换成相应的字符;一个字符数据也可以用整数形式输出。另外,允许使用c和-c的形式。,例3.3用printf函数输出字符数据。#includevoidmain()charc=a;inti=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,字符串向左靠,右补空格。%m.ns,输出占m列,只取字符串中左端n个字符,左补空格。若nm,m自动取n值。%-m.ns,右补空格。,m、n、-的用法与浮点型类似只是n代表了截取字符的个数,#includevoidmain()printf(%-4.3s,%4.5s.,abcdefgh,abcdefgh);,(5)格式符。用来以小数形式输出实数(包括单双精度)有以下几种用法:。不指定字段宽度,由系统自动指定字段宽度,使整数部分全部输出,并输出位小数。.。指定输出的数据共占列,其中有位小数。如果数值长度小于,则左端补空格;大于m则按实际长度。.与.基本相同,只是使输出的数值向左端靠,右端补空格。,例3.4输出实数时的有效位数。运行结果为:.,例3.5输出双精度数时的有效位数。输出结果:33333333.333333,#includevoidmain()floata,b;a=111111.111;b=222222.222;printf(%fn,a+b);,#includevoidmain()doublea,b;a=11111111.11111111;b=22222222.22222222;printf(%fn,a+b);,浮点型变量的运算和赋值过程中,只要超出精度,则超出部分随机产生;只要溢出,则数据将产生错误。,例:输出实数时指定小数位数。,#includevoidmain()floatf=123.456;printf(%f%10f%10.2f%.2f%-10.2fn,f,f,f,f,f);,(8)格式符,以指数形式输出实数。可用以下形式:%e。不指定输出数据所占的宽度和数字部分的小数位数.例:printf(”%e”,123.456);输出:1.234560+0028列5列所输出的实数共占13列宽度。(注:不同系统的规定略有不同),m.ne和-m.ne。、和“”字符的含义与前相同。此处指拟输出的数据的小数部分(又称尾数的小数)位数。输出如下:1.234560e+0021.234560e+0021.23e+0021.23e+00213列13列10列9列1.23e+002+10列,未指定,自动使.超过给定的10列,按实际长度输出。第3个数据共占10列,小数部分占列。只指定,未指定,自动使等于数据应占的长度。第5个数据应占10列,数值只有列,由于是“10.2”,数值向左靠,右补一个空格。(注:有的C系统的输出格式与此略有不同),floatf=123.456;printf(%e%10e%10.2e%.2e%-10.2en,f,f,f,f,f);,关于字符串的输出举例:,#includevoidmain()printf(%3s,%7.2s,%.4s,%-5.3sn,CHINA,CHINA,CHINA,CHINA);,说明:除了X,E,G外,其他各式字符必须用小写。可以在printf函数中的“格式控制”字符串中包含转义字符。一个格式说明必须以“%”开头,以9个格式字符之一为结束,中间可以插入附加格式字符。想输出%,则应该在格式控制字符串中用连续两个%表示,#includevoidmain()floatf=33.33;printf(%g%n,f);,3.7.2格式输入函数scanf,函数作用:按照变量所在内存的地址将变量值存进去。一般格式:scanf(格式控制,地址表列),同printf函数,由若干个地址组成的表列,是变量的地址,如scanf(“%d%d%d”,运行情况:345(输入a,b,c的值)3,4,5(输出a,b,c的值),a在内存中的地址scanf(%3d%2d,#includevoidmain()floata,b;scanf(%3.2f%2f,/错误!,说明:如果在%后有一个“*”附加说明符,表示跳过它指定的列数。#includevoidmain()inta,b;scanf(%3d%*2d%2d,/有时需要使用现成的数据,则可能其中有些部分不需要,则跳过,使用scanf函数时应注意的问题:(1)scan

温馨提示

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

评论

0/150

提交评论