




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
测绘C语言程序设计
太原理工大学
矿业工程学院
测绘科学与技术系
测绘C语言程序设计
第一章3第一章C语言概述一、程序设计语言的发展二、C语言特点三、简单的C语言程序介绍四、运行C程序的步骤和方法4一、程序设计语言的发展计算机程序:一组计算机能识别和执行的指令只要让计算机执行这个程序,计算机就会自动地、有条不紊地进行工作计算机的一切操作都是由程序控制的,离开程序,计算机将一事无成计算机语言:人和计算机交流信息的、计算机和人都能识别的语言第一章C语言概述5一、程序设计语言的发展1、机器语言:由0和1组成的指令2、汇编语言:直接面向处理器的程序设计语言3、高级语言通用语言:
Fortran、Basic、C、VB、C++(VC++)数据库语言:Foxbase、FoxPro、SQL、Delphi、PowerBuild网页制作工具:
HTML、Java第一章C语言概述6一、程序设计语言的发展4、C语言历史C语言是由著名的计算机科学家DennisRitchie创造的,其历史可以追溯到ALGOL60。ALGOL60,也称为A语言,是纯粹的面向描述计算过程的语言。C语言的直接前身B语言就是从BCPL发展而来的。在1972~1973年间,DenisRitchie改进了B语言,为其添加了数据类型的概念,并将原来的解释程序改写为可以在直接生成机器代码的编译程序,并将其命名为C。现在,C语言已成为用途最为广泛的计算机高级语言,不仅可以用于编写系统软件,还可以用于构建各个领域的应用软件。第一章C语言概述7一、程序设计语言的发展5、C语言标准K&RC(Kernighan&Ritchie)C89或ANSIC(AmericanNationalStandardsInstitute)C99或ISO(InternationalOrganizationforStandardization)注意:不同版本的C编译系统所实现的语言功能和语法规则略有差别,因此读者应了解所用的C语言编译系统的特点(可以参阅相关手册),本课程基于ANSIC。第一章C语言概述8二、C语言特点1、语言简洁、紧凑,使用方便、灵活:32个关键词、9种控制语句2、运算符丰富:34种运算符3、数据结构丰富:4、C语言是完成模块化和结构化:5、语法限制不太严格,程序设计自由度大,但同时不易查找错误:6、C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作:有人把C称为“高级语言中的低级语言”或“中级语言”,意为兼有高级和低级语言的特点。7、生成目标代码质量高,程序执行效率高:8、用C语言编写的程序可移植性好(与汇编语言相比)第一章C语言概述9三、简单的C语言程序介绍例1在屏幕上显示:Programmingisfun!第一章C语言概述10三、简单的C语言程序介绍例1在屏幕上显示:
Programmingisfun!#include<stdio.h>编译预处理命令voidmain()主函数{printf("Programmingisfun!\n");语句结束}输出函数3.语句由;结束换行符第一章C语言概述11三、简单的C语言程序介绍例2.1:计算并显示2个数的和#include<stdio.h>voidmain(){ intvalue1,value2,sum; 变量定义
value1=5; value2=2; 变量使用
sum=value1+value2; printf("Thesumis%d\n",sum);
输出结果}第一章C语言概述12三、简单的C语言程序介绍例2.2:计算2个数的和,以算式的形式显示#include<stdio.h>voidmain(){ intvalue1,value2,sum; value1=5; value2=2; sum=value1+value2; printf("%d+%d=%d\n",value1,value2,sum);}第一章C语言概述13三、简单的C语言程序介绍例3:输入2个数,并求两数之和#include<stdio.h>voidmain(){intvalue1,value2,sum;printf("Input2numbers:\n");输入提示
scanf("%d%d",&value1,&value2);读入2个数
sum=value1+value2;printf("%d+%d=%d\n",value1,value2,sum);}第一章C语言概述14三、简单的C语言程序介绍例4:输入m,n计算m!和n!#include<stdio.h>voidmain(){intm,n,resm,resn;scanf("%d%d",&m,&n);resm=fact(m);/*调用函数fact计算m!*/resn=fact(n);
/*调用函数fact计算n!*/printf("%d,%d\n",resm,resn);}求阶乘函数intfact(intk)/*函数定义*/{inti,y=1;for(i=2;i<=k;i++)y=y*i;/*计算k!*/returny;/*结果返回*/}第一章C语言概述15三、简单的C语言程序介绍1、C程序由函数构成:程序容易实现模块化。2、一个函数由两部分组成:函数的首部,即函数的第一行。包括函数名、函数类型、函数参数(形参)名、参数类型。函数体,即函数首部下面的大括弧{……}内的部分。如果一个函数内有多个大括弧,则最外层的一对{}为函数体的范围。声明部分:在这部分中定义所用到的变量,在声明部分中要对所调用的函数进行声明。执行部分:由若干个语句组成。intmax(intx,
inty)↓↓↓↓↓↓函数类型函数名函数参数类型函数参数名函数参数类型函数参数名一个函数名后面必须跟一对圆括弧,函数参数可以没有,如main()第一章C语言概述某些情况可既无声明也无执行,即空函数,什么也不执行,但合法。16三、简单的C语言程序介绍3、一个C程序总是从main函数开始执行的,而不论main函数在整个程序中的位置如何(main函数可以放在程序最前头,也可以放在程序最后,或在一些函数之前,在另一些函数之后)。4、C程序书写格式自由,一行内可以写几个语句,一个语句可以分写在多行上。C程序没有行号,也不像Fortran那样严格规定书写格式(语句必须从某一列开始书写)。5、每个语句和数据定义的最后必须有一个分号。分号是C语句的必要组成部分。6、C语言本身没有输入输出语句。输入和输出的操作是由库函数scanf和printf等函数来完成的。7、可以用/*……*/对C程序中的任何部分作注释。第一章C语言概述在C99标准中,提供另外一种注释符号//……注意://……用于单行注释;/*……*/用于单行或多行注释17四、运行C程序的步骤和方法1、运行C程序的步骤输入与编辑源程序对源程序进行编译与库函数连接运行目标程序第一章C语言概述18四、运行C程序的步骤和方法1、可执行代码源程序
编译连接运行
第一章C语言概述19四、运行C程序的步骤和方法2、C程序运行方法目前使用的大多数C编译系统都是集成环境(IDE),把编辑、编译、连接和运行等操作全部集中在一个界面上进行。可以用不同的编译系统对C程序进行操作。常用的有、TurboC3.0++、VisualC++等第一章C语言概述20四、运行C程序的步骤和方法3、环境下运行C程序安装第一章C语言概述21四、运行C程序的步骤和方法3、环境下运行C程序运行新建源程序:C++SourceFile、路径(默认创建一个同名的项目和工作区。当第一次执行时还会自动创建一个Debug文件夹,存放调试文件,最后产生的可执行程序也存放在这里。)保存源程序:保存为.c文件第一章C语言概述22四、运行C程序的步骤和方法3、环境下运行C程序运行测绘C语言程序设计
第二章24第二章程序的灵魂一、算法的概念二、简单算法举例三、算法的特性四、怎样表示一个算法五、结构化程序设计方法25一、算法的概念
一个程序应包括以下两方面内容:数据结构(datastructure):对数据的描述,在程序中要指定数据的类型和数据的组织形式。算法(algorithm)
:对操作的描述,即操作步骤。数据结构+算法=程序(沃思(NikiklausWirth))完整的程序设计:程序=算法+数据结构+程序设计方法+语言工具和环境↓↓↓↓
灵魂加工对象合适的方法工具第二章程序的灵魂26一、算法的概念1、算法的概念广义:为解决一个问题而采取的方法和步骤,就称为“算法”。例:1+2,+3,…,+100 加99次100+(1+99)+(2+98)+…+(49+51)+50=100+49×100+50=5050 加51次第二章程序的灵魂27一、算法的概念1、算法的概念计算机能执行的算法数值算法:求数值解。例如,求方程根等。非数值算法:包括的面十分广泛,最常见的是用于事务管理领域。例如,排序算法、图书检索等。
第二章程序的灵魂28二、简单算法举例例:求1×2×3×4×5步骤1:先求1×2,得到结果2。步骤2:将步骤1得到的乘积2再乘以3,得到结果6。步骤3:将6再乘以4,得24。步骤4:将24再乘以5,得120。这就是最后的结果。第二章程序的灵魂这样的算法虽然是正确的,但太繁琐。如果要求1×2×…×1000,则要写999个步骤,显然是不可取的。而且每次都直接使用上一步骤的数值结果(如2,6,24等),也不方便。应当找到一种通用的表示方法。29二、简单算法举例可以设两个变量,一个变量代表被乘数,一个变量代表乘数。不另设变量存放乘积结果,而直接将每一步骤的乘积放在被乘数变量中。设p为被乘数,i为乘数。用循环算法来求结果。可以将算法改写为:S1:使p=1S2:使i=2S3:使p×i,乘积仍放在变量p中,可表示为p×i=>pS4:使i的值加1,即i+1=>iS5:如果i不大于5,返回重新执行步骤S3以及其后的步骤S4和S5;否则,算法结束。最后得到p的值就是5!的值。第二章程序的灵魂上面的S1,S2…代表步骤1,步骤2……S是step(步)的缩写。这是写算法的习惯用法。30二、简单算法举例如果题目改为求1×3×5×7×9×11S1:1=>pS2:3=>iS3:p×i=>pS4:i+2=>iS5:若i≤11,返回S3;否则,结束。第二章程序的灵魂可以看出,用这种方法表示的算法具有通用性、灵活性。S3到S5组成一个循环,在实现算法时,要反复多次执行S3、S4、S5等步骤,直到某一时刻,执行S5步骤时经过判断,乘数i已超过规定的数值而不返回S3步骤为止,此时算法结束,变量p的值就是所求结果。31二、简单算法举例例:有50个学生,要求将他们之中成绩在80分以上者打印出来。用n表示学生学号,n1代表第一个学生学号,ni代表第i个学生学号。用g代表学生成绩,gi代表第i个学生成绩,算法可表示如下。S1:1=>iS2:如果gi≥80,则打印ni和gi,否则不打印S3:i+1=>iS4:如果i≤50,返回S2,继续执行;否则,算法结束。第二章程序的灵魂变量i作为下标,用它来控制序号(第几个学生,第几个成绩)。当i超过50时,表示已对50个学生的成绩处理完毕,算法结束。32二、简单算法举例例:判定2000—2500年中的每一年是否闰年,将结果输出。何为闰年?能被4整除,但不能被100整除的年份都是闰年,如1996年,2004年是闰年;能被100整除,又能被400整除的年份是闰年。如1600年、2000年是闰年。第二章程序的灵魂33二、简单算法举例算法:设y为被检测的年份。可采取以下步骤:S1:2000=>yS2:y不能被4整除,则输出y“不是闰年”。然后转到S6S3:若y能被4整除,不能被100整除,则输出y“是闰年”。然后转到S6S4:若y能被100整除,又能被400整除,输出y“是闰年”;否则输出“不是闰年”。然后转到S6S5:输出y“不是闰年”S6:y+1=>yS7:当y≤2500时,转S2继续执行,如y>2500,算法停止。第二章程序的灵魂34二、简单算法举例算法:第二章程序的灵魂在这个算法中,每做一步,都分别分离出一些范围(已能判定为闰年或非闰年),逐步缩小范围,使被判断的范围愈来愈小,直至执行S5时,只可能是非闰年。“其他”包括能被4整除,又能被100整除,而不能被400整除的那些年份(如1900年),是非闰年。year不能被4整除非闰年year被4整除,但不能被100整除闰年year被100整除,又能被400整除闰年其他非闰年35二、简单算法举例例算法:S1:1=>signS2:1=>sumS3:2=>denoS4:(-1)×sign=>signS5:sign×(1/deno)=>termS6:sum+term=>sumS7:deno+1=>denoS8:若deno≤100返回S4;否则算法结束。第二章程序的灵魂单词作变量名,算法易于理解sign:数值符号;sum:累加和;deno:分母;term:某一项反复执行S4到S8,直到分母大于100为止。一共执行99次循环,向sum累加了99个分数。-1-1/21-1/2=>sum(1/2)3满足,返回S436二、简单算法举例例算法:S1:1=>signS2:1=>sumS3:2=>denoS4:(-1)×sign=>signS5:sign×(1/deno)=>termS6:sum+term=>sumS7:deno+1=>denoS8:若deno≤100返回S4;否则算法结束。第二章程序的灵魂11/31/2+1/3=>sum(5/6)4满足,返回S437二、简单算法举例例:对一个大于或等于3的正整数,判断它是不是一个素数概念:指除了1和该数本身之外,不能被其他任何整数整除的数。例如,13是素数,因为它不能被2,3,4,…,12整除。算法:判断一个数n(n≥3)是否素数的方法是:将n作为被除数,将2到(n-1)各个整数轮流作为除数,如果都不能被整除,则n为素数。S1:输入n的值S2:2=>i(i作为除数)S3:n被i除,得余数rS4:如果r=0,表示n能被i整除,则打印n“不是素数”,算法结束;否则执行S5S5:i+1=>iS6:如果i≤n-1,返回S3;否则打印n“是素数”,然后结束。第二章程序的灵魂38三、算法的特性1、有穷性:一个算法应包含有限的操作步骤,而不能是无限的。2、确定性:算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。3、有零个或多个输入:所谓输入是指在执行算法时需要从外界取得必要的信息。4、有一个或多个输出:算法的目的是为了求解,“解”就是输出。没有输出的算法是没有意义的。
5、有效性:算法中的每一个步骤都应当能有效地执行,并得到确定的结果。第二章程序的灵魂deno>0n被i除,得余数r(√)n被一个整数除,得余数r(×)除数不能为039四、怎样表示一个算法自然语言传统流程图结构化流程图伪代码PAD图(ProblemAnalysisDiagram)第二章程序的灵魂40四、怎样表示一个算法1、用自然语言表示算法2、用流程图表示算法3、三种基本结构和改进的流程图4、用N-S流程图表示算法5、用伪代码表示算法6、用计算机语言表示算法第二章程序的灵魂41四、怎样表示一个算法1、用自然语言表示算法自然语言就是人们日常使用的语言。用自然语言表示通俗易懂,但文字冗长,容易出现“歧义性”。自然语言表示的含义往往不太严格,要根据上下文才能判断其正确含义。此外,用自然语言描述包含分支和循环的算法,不很方便。因此,除了很简单的问题以外,一般不用自然语言描述算法。第二章程序的灵魂42四、怎样表示一个算法2、用流程图表示算法(传统流程图)美国国家标准化协会ANSI(AmericanNationalStandardInstitute)规定了一些常用的流程图符号。第二章程序的灵魂43四、怎样表示一个算法2、用流程图表示算法(传统流程图)例:求1×2×3×4×5第二章程序的灵魂1ti>5开始2it*iti+1i结束NY44四、怎样表示一个算法2、用流程图表示算法(传统流程图)例:有50个学生,要求将成绩在80分以上的学生的学号和成绩输出。第二章程序的灵魂1ii>50开始i+1i结束NY输入ni、gi1i开始gi≧80输出ni、gii+1ii>50NYYN①如果包括输入数据部分1ii>50开始i+1i结束NY输入ni、gi1igi≧80输出ni、gii+1ii>50NYYN如果包括输入数据部分①①47四、怎样表示一个算法2、用流程图表示算法(传统流程图)例:判定2000—2500年中的每一年是否闰年,将结果输出。第二章程序的灵魂NYNYYNYN49四、怎样表示一个算法2、用流程图表示算法(传统流程图)流程图是表示算法的较好的工具一个流程图包括以下几部分:表示相应操作的框带箭头的流程线(流程线不要忘记画箭头,否则难以判定各框的执行次序)框内外必要的文字说明第二章程序的灵魂50四、怎样表示一个算法2、用流程图表示算法(传统流程图)传统的流程图用流程线指出各框的执行顺序,对流程线的使用没有严格限制。因此,使用者可以不受限制地使流程随意地转来转去,使流程图变得毫无规律。第二章程序的灵魂BS型算法Abowlofspaghetti缺点:难以阅读,也难以修改,从而使算法的可靠性和可维护性难以保证。解决办法:限制流程的无规律任意转向。51四、怎样表示一个算法3、三种基本结构和改进的流程图三种基本结构顺序结构选择结构,或称选取结构,或称分支结构循环结构,它又称重复结构。有两类循环结构:当型(While型)循环结构直到型(Until型)循环结构三种基本结构,作为表示一个良好算法的基本单元。第二章程序的灵魂52四、怎样表示一个算法3、三种基本结构和改进的流程图三种基本结构-顺序结构、选择结构第二章程序的灵魂顺序结构选择结构53四、怎样表示一个算法3、三种基本结构和改进的流程图三种基本结构-循环结构第二章程序的灵魂While型循环结构Until型循环结构54四、怎样表示一个算法3、三种基本结构和改进的流程图三种基本结构的共同特点只有一个入口。只有一个出口。结构内的每一部分都有机会被执行到。对每一个框来说,都应有一条从入口到出口的路径通过它。结构内不存在“死循环”(无终止的循环)。第二章程序的灵魂请注意,一个菱形判断框有两个出口,而一个选择结构只有一个出口。不要将菱形框的出口和选择结构的出口混淆。区别于空循环55四、怎样表示一个算法3、三种基本结构和改进的流程图不正确的流程图第二章程序的灵魂没有一条从入口到出口的路径通过A框死循环56四、怎样表示一个算法3、三种基本结构和改进的流程图总结:由以上三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。由基本结构所构成的算法属于“结构化”的算法,它不存在无规律的转向,只在本基本结构内才允许存在分支和向前或向后的跳转。扩展:基本结构不一定只限于上面三种,只要具有上述4个特点的都可以作为基本结构。人们可以自己定义基本结构,并由这些基本结构组成结构化程序。第二章程序的灵魂57四、怎样表示一个算法3、三种基本结构和改进的流程图扩展:如图所示的是一个多分支选择结构,根据给定的表达式的值决定执行哪一个框。结构也是一个入口和一个出口,并且有上述全部的4个特点。由它们构成的算法结构也是结构化的算法。但是,可以认为此结构是由三种基本结构派生出来的。第二章程序的灵魂多分支选择结构58四、怎样表示一个算法3、三种基本结构和改进的流程图用N-S流程图表示:1973年美国学者和提出了一种新的流程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包含其他的从属于它的框,或者说,由一些基本的框组成一个大的框。这种流程图又称N-S结构化流程图。
第二章程序的灵魂59四、怎样表示一个算法3、三种基本结构和改进的流程图N-S流程图表示顺序结构、选择结构
第二章程序的灵魂顺序结构选择结构60四、怎样表示一个算法3、三种基本结构和改进的流程图N-S流程图表示循环结构
第二章程序的灵魂While型循环结构Until型循环结构61四、怎样表示一个算法3、三种基本结构和改进的流程图用以上3种N-S流程图中的基本框,可以组成复杂的N-S流程图,以表示算法。
第二章程序的灵魂图中的A框或B框,可以是一个简单的操作,也可以是3个基本结构之一。A框是一个选择结构B框是一个循环结构62四、怎样表示一个算法3、三种基本结构和改进的流程图例:求5!算法用N-S图表示。
第二章程序的灵魂直到i>51t输出t2it*iti+1i63四、怎样表示一个算法3、三种基本结构和改进的流程图例:将50名学生中成绩高于80分的学号和成绩打印出来。
第二章程序的灵魂有输入数据
无输入数据64四、怎样表示一个算法3、三种基本结构和改进的流程图例:判定闰年的算法用N-S图表示
第二章程序的灵魂直到year>25002000yearyear+1year否是year%4为0否是输出year非闰年year%100不为0year%400为0是否输出year非闰年输出year闰年输出year闰年65四、怎样表示一个算法3、三种基本结构和改进的流程图例:
第二章程序的灵魂直到deno>100deno+1deno输出sum1sum1sign2deno(-1)*signsignsign*(1/deno)termsum+termsum66四、怎样表示一个算法3、三种基本结构和改进的流程图例:判别素数的算法用N-S流程图表示。
第二章程序的灵魂出口1出口2循环有两个出口,不符合基本结构的特点,无法直接用N-S流程图的三种基本结构的符号来表示,必须先作必要的变换输入nr=0是否0w2in%ir1wi+1i直到i>或w≠0w=0是否输出n是素数输出n不是素数69四、怎样表示一个算法3、三种基本结构和改进的流程图N-S图表示算法的优点:比文字描述直观、形象、易于理解;它比传统流程图紧凑易画,尤其是它废除了流程线,整个算法结构是由各个基本结构按顺序组成的。N-S流程图中的上下顺序就是执行时的顺序,即图中位置在上面的先执行,位置在下面的后执行。写算法和看算法只需从上到下进行就可以了,十分方便。用N-S图表示的算法都是结构化的算法(它不可能出现流程无规律的跳转,而只能自上而下地顺序执行)。
第二章程序的灵魂70四、怎样表示一个算法3、三种基本结构和改进的流程图总结结构化的算法是由一些基本结构顺序组成的;每个基本结构又可以包含其他的基本结构;在基本结构之间不存在向前或向后的跳转,流程的转移只存在于一个基本结构范围之内(如循环中流程的跳转);一个非结构化的算法可以用一个等价的结构化算法代替,其功能不变。如果一个算法不能分解为若干个基本结构,则它必然不是一个结构化的算法。
第二章程序的灵魂71四、怎样表示一个算法4、伪代码表示算法概念:伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。特点:它如同一篇文章,自上而下地写下来。每一行(或几行)表示一个基本操作。它不用图形符号,因此书写方便、格式紧凑,也比较好懂,便于向计算机语言算法(即程序)过渡。
第二章程序的灵魂72四、怎样表示一个算法4、伪代码表示算法例“打印x的绝对值”的算法可以用伪代码表示
第二章程序的灵魂英文IFxispositiveTHEN printxELSEprint–x中文若x为正
打印x否则打印–x中英文混用IFx为正 printxELSEprint–x73四、怎样表示一个算法4、伪代码表示算法例求5!。用伪代码表示的算法
第二章程序的灵魂开始
置t的初值为1
置i的初值为2
当i<=5,执行下面操作: 使t=t×i
使i=i+1 (循环体到此结束) 打印t的值结束也可以写成以下形式:BEGIN(算法开始) 1=>t 2=>i whilei<=5 {t×i=>t i+1=>i} printtEND(算法结束)74四、怎样表示一个算法4、伪代码表示算法例:打印出50个学生中成绩高于80分者的学号和成绩。用伪代码表示的算法
第二章程序的灵魂BEGIN(算法开始) 1=>i whilei<=50 {inputniandgi i+1=>i} 1=>i whilei<=50 {ifgi≥80printniandgi i+1=>i}END(算法结束)75四、怎样表示一个算法4、伪代码表示算法伪代码书写格式比较自由,容易表达出设计者的思想。用伪代码写的算法很容易修改。用伪代码很容易写出结构化的算法。但是用伪代码写算法不如流程图直观,可能会出现逻辑上的错误(例如循环或选择结构的范围搞错等)。
第二章程序的灵魂76四、怎样表示一个算法5、用计算机语言表示算法概念:计算机是无法识别流程图和伪代码。只有用计算机语言编写的程序才能被计算机执行(当然还要经过编译成目标程序才能被计算机识别和执行)。因此,在用流程图或伪代码描述出一个算法后,还要将它转换成计算机语言程序。特点:用计算机语言表示算法必须严格遵循所用语言的语法规则,这是和伪代码不同的。作用:要完成一件工作,包括设计算法和实现算法两个部分。设计算法的目的是为了实现算法。应当强调说明的是,写出了C程序,仍然只是描述了算法,并未实现算法,只有运行程序才是实现算法。应该说,用计算机语言表示的算法是计算机能够执行的算法。
第二章程序的灵魂77四、怎样表示一个算法6、结构化程序设计方法一个结构化程序就是用高级语言表示的结构化算法。用三种基本结构组成的程序必然是结构化的程序,这种程序便于编写、阅读、修改和维护。这就减少了程序出错的机会,提高了程序的可靠性。结构化程序设计强调程序设计风格和程序结构的规范化,提倡清晰的结构。结构化程序设计方法的基本思路是,把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。
第二章程序的灵魂78四、怎样表示一个算法6、结构化程序设计方法采取以下方法保证得到结构化的程序自顶向下逐步细化模块化设计结构化编码两种不同的方法自顶向下,逐步细化自下而上,逐步积累
第二章程序的灵魂79四、怎样表示一个算法6、结构化程序设计方法模块化程序设计方法模块化设计的思想实际上是一种“分而治之”的思想,把一个大任务分为若干个子任务,每一个子任务就相对简单了。在拿到一个程序模块(实际上是程序模块的任务书)以后,根据程序模块的功能将它划分为若干个子模块,如果嫌这些子模块的规模大,还可以划分为更小的模块。这个过程采用自顶向下的方法来实现。程序中的子模块一般不超过50行划分子模块时应注意模块的独立性,即使一个模块完成一项功能,耦合性愈少愈好。
第二章程序的灵魂测绘C语言程序设计
第三章81第三章数据类型、运算符与表达式82第三章数据类型、运算符与表达式一、C语言的数据类型数据类型构造类型指针类型(*)空类型(无值类型)
void枚举类型enum数组类型结构类型struct联合类型union基本类型整型int字符型char实型(浮点型)单精度实型float双精度实型double长双精度实型
longdouble短整型shortint基本整型int长整型longint双长整型longlongint(C99)枚举类型enum83第三章数据类型、运算符与表达式一、C语言的数据类型类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式不同的类型分配不同的长度和存储形式不同类型数据可进行的操作也不同84第三章数据类型、运算符与表达式二、常量和变量1、常量和符号常量常量:在程序运行过程中,其值不能被改变的量。符号常量:用一个标识符来代表一个常量。
整型常量:如1000,12345,0,-345
实型常量:十进制小数形式:如指数形式:如12.34e3(代表12.34×103)
字符常量:如'?'转义字符:如'\n'
字符串常量:如"TYUT"
符号常量:字面常量(直接常量)
习惯符号常量名用大写
含义清楚
在需要改变一个常量时能做到“一改全改”85第三章数据类型、运算符与表达式二、常量和变量1、常量和符号常量例3.1符号常量的使用
#definePRICE30
#include<stdio.h>
voidmain()
{
intnum,total;
num=10;
total=num*PRICE;
printf(″total=%d\n″,total);
}运行结果:total=300程序中用#define命令行定义PRICE代表常量30,此后凡在本文件中出现的PRICE都代表30,可以和常量一样进行运算注意:如再用赋值语句给PRICE赋值是错的PRICE=40;//错误,不能给符号常量赋值86第三章数据类型、运算符与表达式二、常量和变量2、变量变量在程序运行期间,变量的值是可以改变的变量必须先定义,后使用定义变量时指定该变量的名字和类型
变量名和变量值是两个不同的概念变量名实际上是以一个名字代表的一个存储地址从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据确保变量名正确使用编译时为其分配相应存储单元
编译时检查该变量运算是否合法87第三章数据类型、运算符与表达式二、常量和变量2、变量标识符:C语言中,对变量、符号常量、函数、数组、类型等数据对象命名的有效字符序列统称为标识符(identifier)。标识符命名原则只能由字母、数字和下划线3种字符组成第一个字符必须为字母或下划线大小写字母是不同的字符sum,_total,month,Student_name,lotus_1_2_3,BASIC,li_ling
M.D.John,¥123,#33,3D64,a>b
88第三章数据类型、运算符与表达式三、整型数据1、整型常量的表示方法整型常量即整常数。在C语言中,整常数三种表示形式十进制整数
如:123,-456,4八进制整数。以0开头的数是八进制数。
如:0123表示八进制数123,等于十进制数83,-011表示八进制数-11,即十进制数-9。十六进制整数。以0x开头的数是16进制数。如:0x123代表16进制数123,等于十进制数291。-0x12等于十进制数-10。89第三章数据类型、运算符与表达式三、整型数据2、整型变量整型数据在内存中的存放形式:数值是以补码(complement)表示整型变量的分类共六种有符号基本整型无符号基本整型有符号短整型无符号短整型有符号长整型无符号长整型[signed]intunsignedint[signed]short[int]unsignedshort[int][signed]long[int]unsignedlong[int]short,long,signed,unsigned为修饰符(modifer)[]中内容为可选short和long可以提供不同的数据长度以满足实际使用的需要90第三章数据类型、运算符与表达式三、整型数据2、整型变量整型变量的定义:C规定在程序中所有用到的变量都必须在程序中定义,即“强制类型定义”。变量定义一是定义变量的数据类型,二是定义变量的名称,三是说明变量的存储类型,其一般格式为:
[存储类型]数据类型变量清单;91第三章数据类型、运算符与表达式三、整型数据2、整型变量整型变量的定义例3.2整型变量的定义与使用
#include<>
voidmain()
{inta,b,c,d;/*指定a、b、c、d为整型变量*/
unsignedu;/*指定u为无符号整型变量*/
a=12;b=-24;u=10;
c=a+u;d=b+u;
printf(″a+u=%d,b+u=%d\n″,c,d);
}运行结果:a+u=22,b+u=-14说明:可以看到不同种类的整型数据可以进行算术运算92第三章数据类型、运算符与表达式三、整型数据2、整型变量整型数据的溢出例3.3整型数据的溢出
#include<stdio.h>
voidmain()
{inta,b;
a=32767;
b=a+1;
printf(“%d,%d\n”,a,b);
}运行结果:32767,-32768说明:数值是以补码表示的。一个整型变量只能容纳-32768~32767范围内的数,无法表示大于32767或小于-32768的数。遇此情况就发生“溢出”。93第三章数据类型、运算符与表达式三、整型数据整型常量的类型一个整常量后面加一个字母u或U,认为是unsignedint型,
如12345u,在内存中按unsignedint规定的方式存放(存储单元中最高位不作为符号位,而用来存储数据)。如果写成-12345u,则先将-12345转换成其补码53191,然后按无符号数存储。在一个整常量后面加一个字母l或L,则认为是longint型常量。
94第三章数据类型、运算符与表达式四、浮点型数据1、浮点型常量的表示方法十进制小数形式指数形式:3e-3字母e(或E)之前必须有数字。e后面的指数必须为整数。
1e3、、-123e-6、e3、、.e3、e
95第三章数据类型、运算符与表达式四、浮点型数据1、浮点型常量的表示方法规范化的指数形式在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字例如可以表示为:
123.456e0,12.3456e1,一个浮点数用指数形式输出时。是按规范化的指数形式输出的。规范化的指数形式96第三章数据类型、运算符与表达式四、浮点型数据2、浮点型变量浮点型数据在内存中的存放形式一个浮点型数据一般在内存中占4个字节(32位)。与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。系统把一个浮点型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指数形式(二进制数指数形式存放)。97第三章数据类型、运算符与表达式四、浮点型数据2、浮点型变量浮点型变量的分类float型(单精度浮点型):4字节、6位有效数字double型(双精度浮点型):8字节、15位有效数字longdouble(长双精度)型:VC++6.0分配8个字节98第三章数据类型、运算符与表达式四、浮点型数据2、浮点型变量浮点型数据的舍入误差例3.4浮点型数据的舍入误差
#include<>
voidmain()
{
floata,b;
a=123456.789e5;
b=a+20;
printf(“%f\n”,b);
}
运行结果:12345678说明:一个浮点型变量只能保证的有效数字是7位有效数字,后面的数字是无意义的,并不准确地表示该数。应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数。例99第三章数据类型、运算符与表达式四、浮点型数据3、浮点型常量的类型C编译系统将浮点型常量作为双精度来处理例如:系统先把和作为双精度数,然后进行相乘的运算,得到的乘也是一个双精度数。最后取其前7位赋给浮点型变量f。如是在数的后面加字母f或F(如1.65f,654.87F),这样编译系统就会把它们按单精度(32位)处理。100第三章数据类型、运算符与表达式五、字符型数据1、字符常量用单引号包含的一个字符是字符型常量只能包含一个字符‘a’,’A’,‘1’‘abc’、"a"
101第三章数据类型、运算符与表达式五、字符型数据1、字符常量以“\”开头的特殊字符称为转义字符:“\”后面的字符转换成另外的意思。
102第三章数据类型、运算符与表达式五、字符型数据1、字符常量例转义字符的使用
#include<stdio.h>voidmain(){printf("abc\tde\rf\tg\n");printf("h\ti\b\bjk\n");}
打印机上的显示结果:
例103第三章数据类型、运算符与表达式五、字符型数据2、字符变量字符型变量用来存放字符常量,只能放一个字符。字符变量的定义:charc1,c2;一个字符变量在内存中占一个字节104第三章数据类型、运算符与表达式五、字符型数据3、字符数据在内存中的存储形式及其使用方法一个字符常量存放到一个字符变量中,内存中,以ASCII代码存储该字符。使字符型数据和整型数据之间可以通用。一个字符数据既可以以字符形式输出,也可以以整数形式输出。以字符型输出:将存储单元中的ASCII码转换为相应字符。以整数型输出:直接将ASCII码作为整数输出。可对字符型数据进行算术运算。105第三章数据类型、运算符与表达式五、字符型数据3、字符数据在内存中的存储形式及其使用方法例3.6向字符变量赋以整数。
#include<stdio.h>
voidmain()
{charc1,c2;
c1=97;
c2=98;
printf(“%c%c\n”,c1,c2);
printf(“%d%d\n”,c1,c2);
}
运行结果:ab
9798例106第三章数据类型、运算符与表达式五、字符型数据3、字符数据在内存中的存储形式及其使用方法例3.7大小写字母的转换
#include<stdio.h>
voidmain()
{charc1,c2;
c1=’a’;
c2=’b’;
c1=c1-32;
c2=c2-32;
printf(“%c%c″,c1,c2);
}
说明:(1)程序的作用是将两个小写字母a和b转换成大写字母A和B。(2)ASCII代码表中:每一个小写字母比它相应的大写字母的ASCII码大32。(3)C语言允许字符数据与整数直接进行算术运算。‘a’(97)-32=65(‘A’)‘b’(98)-32=66(‘B’)运行结果:AB
例107第三章数据类型、运算符与表达式五、字符型数据3、字符数据在内存中的存储形式及其使用方法VC++6.0将字符变量定义为signedchar型。其存储单元中的最高位作为符号位,它的取值范围是-128~127。如果在字符变量中存放一个ASCII码为0~127间的字符,由于字节中最高位为0,因此用%d输出字符变量时,输出的是一个正整数。如果在字符变量中存放一个ASCII码为128~255间的字符,由于在字节中最高位为1,用%d格式符输出时,就会得到一个负整数。108第三章数据类型、运算符与表达式五、字符型数据4、字符串常量字符串常量是一对双撇号括起来的字符序列。合法的字符串常量:“Howdoyoudo.”,“CHINA”,“a”,“$123.45”可以输出一个字符串。printf(“Howdoyoudo.”);109第三章数据类型、运算符与表达式五、字符型数据4、字符串常量区分字符常量和字符串常量
字符常量:‘a’,’A’,‘1’
字符串常量:"abc","a"说明:每一个字符串常量的结尾加一个“字符串结束标志”(\0),以便系统据此判断字符串是否结束。说明:占内存单元不是5个字符,而是6个字符,最后一个字符为’\0’。但在输出时不输出’\0’。110第三章数据类型、运算符与表达式五、字符型数据4、字符串常量区分数值型字符和数值
数值型字符:‘1’(ASCII49)说明:字符’1’只是代表一个形状为’1’的符号,在需要时按原样输出,在内存中以ASCII码形式存储,占1个字节说明:整数1是以整数存储方式(二进制补码方式)存储的,占2个或4个字节数值:1111第三章数据类型、运算符与表达式六、变量赋初值1、字符串常量C语言允许在定义变量的同时使变量初始化可以使被定义的变量的一部分赋初值inta=3;//指定a为整型变量,初值为3floatf=3.56;//指定f为浮点型变量,初值为charc=‘a’;//指定c为字符变量,初值为‘a’inta,b,c=5;//指定a,b,c为整型变量,但只对c初始化,c的初值为5,a,b的值不确定112第三章数据类型、运算符与表达式六、变量赋初值1、字符串常量同时对几个变量赋以同一个初值初始化不是在编译阶段完成的,而是在程序运行时执行本函数时赋初值的,相当于有一个赋值语句。初始化和赋初值不同初始化发生在变量创建的同时;赋初值在变量创建后进行。初始化是编译器的责任;赋初值是程序员的责任。inta=3,b=3,c=3;//表示a,b,c的初值都是3。inta=b=c=3;//errorC2065:'b''c':undeclaredidentifier
113第三章数据类型、运算符与表达式七、各类数值型数据间的混合运算混合运算:整型(int,short,long)、浮点型(float,double)可以混合运算。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。说明:绝对转换:+,-,*,/运算中float必先转为double;short和char必先转为int,然后进行运算;视情况转换:如果运算的两个数等级不同,先将低级别转为高等级(另一个运算数),再运算,结果为高等级;
这种类型转换是由系统自动进行的。114第三章数据类型、运算符与表达式八、算术运算符和算术表达式1、C运算符简介C的运算符算术运算符:+,-,*,/,%关系运算符:>,<,==,>=,<=,!=逻辑运算符:!,&&,||位运算符:<<,>>,~,|,^,&赋值运算符:=及扩展赋值运算符条件运算符:?,:
逗号运算符:,指针运算符:*,&求字节数运算符:sizeof
强制类型转换运算符:(类型)分量运算符:.->下标运算符:[]
其他:如函数调用运算符()115第三章数据类型、运算符与表达式八、算术运算符和算术表达式2、算术运算符和算术表达式基本的算术运算符+、-、*、/%(模运算符,或称求余运算符,%两侧均应为整型数据,如:7%4的值为3)。负数%运算:如果第一个操作数为负数,结果为负数如果第一个操作数为正数,结果为正数与第二个操作数无关116第三章数据类型、运算符与表达式八、算术运算符和算术表达式2、算术运算符和算术表达式基本的算术运算符/:两个整数相除的结果为整数如5/3的结果值为1,舍去小数部分如果除数或被除数中有一个为负值,舍入方向不固定。例如,-5/3,有的系统中得到的结果为-1,在有的系统中则得到结果为-2VC++采取“向零取整”的方法,如5/3=1,-5/3=-1,取整后向零靠拢117第三章数据类型、运算符与表达式八、算术运算符和算术表达式2、算术运算符和算术表达式算术运算符和算术表达式的优先级和结合性C算术表达式:用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子运算对象包括常量、变量、函数等a*b/c-1.5+′a′//是一个合法的表达式说明:优先级:先高后低,同级看结合方向结合性:算数运算符的结合方向为左结合性118第三章数据类型、运算符与表达式八、算术运算符和算术表达式2、算术运算符和算术表达式强制类型转换运算符可以将一个表达式转换成所需类型一般形式:(类型名)(表达式)
(double)a
//将a转换成double类型(int)(x+y) //将x+y的值转换成整型(float)(5%3)
//将5%3的值转换成float型强制类型转换时,得到一个所需类型的中间数据,原变量类型不变119第三章数据类型、运算符与表达式八、算术运算符和算术表达式2、算术运算符和算术表达式例3.8强制类型转换。
#include<stdio.h>
voidmain()
{floatx;
inti;x=3.6;i=(int)x;
printf("x=%f,i=%d\n",x,i);
}
说明:(1)系统自动进行的类型转换:例如3.5+5(2)强制类型转换运行结果:x=3.600000,
i=3
120第三章数据类型、运算符与表达式八、算术运算符和算术表达式2、算术运算符和算术表达式自增、自减运算符:作用是使变量的值增1或减1++i,--i:在使用i之前,先使i的值加/减1i++,i--:在使用i之后,使i的值加/减1j=++i;
//如果i值为3,那么执行语句时,i的值先变成4,再赋给j,j的值为4,执行后j=4,i=4变量的值VS表达式的值(设i原值为3)++i:变量i的值为4,表达式++i的值也为4i++:变量i的值为4,表达式i++的值也为3j=i++;
//如果i值为3,那么执行语句时,先将i的值3赋给j,j的值为3,但i已变为4,执行后j=3,i=4i=i+1j=i
j=i
i=i+1121第三章数据类型、运算符与表达式八、算术运算符和算术表达式2、算术运算符和算术表达式自增、自减运算符自增运算符(++),自减运算符(--),只能用于变量,不能用于常量或表达式++和--的结合方向是“自右至左”5++,(i+y)++
printf(“%d”,-i++)//-和++同级,且都为右结合,因此先i++,再取负122第三章数据类型、运算符与表达式八、算术运算符和算术表达式2、算术运算符和算术表达式有关表达式使用中的问题说明ANSIC并没有具体规定表达式中的子表达式的求值顺序,允许各编译系统自己安排C语言中有的运算符为一个字符,有的运算符由两个字符组成,为避免误解,最好采取大家都能理解的写法在调用函数时,实参数的求值顺序,C标准并无统一规定。(i++)+(i++)+(i++)//系统不同,结果不同不要写成i+++j的形式,而应写成(i++)+j的形式不要写出别人看不懂的也不知道系统会怎样执行程序123第三章数据类型、运算符与表达式九、赋值运算符和赋值表达式1、赋值运算符赋值运算符:=作用:将一个数据赋给一个变量2、类型转换如果赋值运算符两侧的类型不一致,但都是数值型或字符型,在赋值时进行类型转换将浮点型数据(单、双精度)赋给整型变量时,舍弃浮点数的小数部分。将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中将23赋给float变量f,则f为将23赋给double型变量d,则d为124第三章数据类型、运算符与表达式九、赋值运算符和赋值表达式2、类型转换将一个double型数据赋给float变量时,截取其前面7位有效数字,存放到float变量的存储单元(4个字节)中。但应注意数值范围不能溢出。如果将一个float型数据赋给double变量时,数值不变,有效位数扩展到16位,在内存中以8个字节存储
floatf;doubled=123.123456789;f=d;//执行后,f为
floatf;doubled=123.456789e100;f=d;//溢出错误125第三章数据类型、运算符与表达式九、赋值运算符和赋值表达式2、类型转换字符型数据赋给整型变量时,将字符数据(8个二进位)放到整型变量存储单元的低8位中。第一种情况:低位对应、高位补零
若所用系统将字符处理为无符号字符类型,或程序已将字符变量定义为unsignedchar型,则将字符的8位放到整型变量低8位,高8位补零。例如:将字符’\376’赋给int型变量i,i的值为254第二种情况:符号扩展若所用系统(VC++6.0)将字符处理为带符号(signedchar)时,若字符最高位为0,则整型变量高8位补0;若字符最高位为1,则高8位全补1。这称为“符号扩展”,如变量c(字符’\376’)以整数形式输出为-2,i的值也是-2。126第三章数据类型、运算符与表达式九、赋值运算符和赋值表达式2、类型转换将一个int、short、long型数据赋给一个char型变量时,只将其低8位原封不动地送到char型变量(即截断)c的值为33,如果用“%c"输出c,将得到字符!(的ASCII码为33)
127第三章数据类型、运算符与表达式九、赋值运算符和赋值表达式2、类型转换将带符号的int型赋给long型变量时,要进行符号扩展,将整型数的16位送到long型低16位中如果int型数据为正值(符号位为0),则long型变量的高16位补0;如果int型变量为负值(符号位为1),则long型变量的高16位补1。128第三章数据类型、运算符与表达式九、赋值运算符和赋值表达式2、类型转换若将一个long型数据赋给一个int型变量,只将long型数据中低16位原封不动地送到整型变量(即截断)。如:inta;longb=8;a=b;//a为8如:inta;longb=65536;a=b;//a为0129第三章数据类型、运算符与表达式九、赋值运算符和赋值表达式2、类型转换将unsignedint型数据赋给longint型变量时,不存在符号扩展问题,只需将高位补0即可。将一个unsigned类型数据赋给一个占字节数相同的非unsigned型整型变量,将unsigned型变量的内容原样送到非unsigned型变量中,但如果数据范围超过相应整型的范围,则会出现数据错误。以两字节为例:unsignedinta=65535;intb;b=a; //b为-1130第三章数据类型、运算符与表达式九、赋值运算符和赋值表达式2、类型转换将非unsigned型数据赋给长度相同的unsigned型变量,也是原样照赋(符号位也作为数值一起传送)。例3.9有符号数据传送给无符号变量。
#include<stdio.h>
voidmain()
{unsigneda;
intb=-1;
a=b;
printf(″%u\n″,a);}
说明:″%u″是输出无符号数时所用的格式符。运行结果:65535131第三章数据类型、运算符与表达式九、赋值运算符和赋值表达式3、复合的赋值运算符在赋值符“=”之前加上其他运算符,可以构成复合的运算符a+=3 //等价于a=a+3
x*=y+8 //等价于x=x*(y+8)x%=3 //等价于x=x%3a*=b如果b是包含若干项的表达式,则相当于它有括号。132第三章数据类型、运算符与表达式九、赋值运算符和赋值表达式3、复合的赋值运算符凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。
+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=简化程序,使程序精炼,提高编译效率133第三章数据类型、运算符与表达式九、赋值运算符和赋值表达式4、赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。
赋值表达式求解过程求赋值运算符右侧的“表达式”的值;赋给赋值运算符左侧的变量。<变量><赋值运算符><表达式>a=3*5//计算3*5得15赋给a一个表达式应该有一个值134第三章数据类型、运算符与表达式九、赋值运算符和赋值表达式
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 住宅售房合同范本
- pvc板材合同范例
- 2025-2030年中国血液循环机专用电机数据监测研究报告
- 2025-2030年中国高效低噪音多翼离心通风机数据监测研究报告
- 公司运输承包经营合同范例
- 供货分批送达合同范例
- 修脚房投资合同范例
- 个人转让闲置车辆合同范例
- 代为跑腿劳务合同范例
- 亚马逊工厂采购合同范例
- 2025年湖南理工职业技术学院单招职业技能测试题库必考题
- 第十八届“地球小博士”全国地理知识科普竞赛题库(附答案)
- 2024年10月高等教育自学考试07454传感器技术应用试题及答案
- 普通高中地理课程标准(2023年版)
- 2023版北京协和医院重症医学科诊疗常规
- 监理大纲(范本)
- 受拉钢筋抗震锚固长度Lae
- 2018年湖北省襄阳市中考物理试卷
- 《沉淀滴定法》PPT课件.ppt
- 波程差与光程差
- 常用测井曲线符号及单位(最规范版)
评论
0/150
提交评论