版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章
程序设计基础主要内容计算机程序的基本结构程序设计的基本元素程序设计基本方法与技术程序设计的原则与风格2.1计算机程序的基本结构程序结构文件结构函数结构1.程序结构源程序文件一般包括:程序说明部分编译预处理命令外部变量定义、声明等函数定义2.文件结构
程序说明部分在程序的开头部分放置一些说明信息,这些信息可以包括开发环境、程序的开发者、开发时间、许可信息、更新历史,程序的简要功能逻辑结构,所调用的函数库的名称和版本,变量的命名方式等等
编译预处理以#开头的命令,C编译系统对程序进行正常的编译之前,先对这些特殊的命令进行预处理,然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码C提供的预处理功能:宏、文件包含、条件编译编译预处理命令一般位于程序的开头,每行只能写一条预处理命令宏定义不带参数的宏定义:#define宏名宏体#definePI3.1416带参数的宏定义:#define宏名(参数表)宏体#defineMAX(x,y)x>y?x:y终止宏定义的作用域:#undef(宏名)#undef(PI)文件包含是指一个源文件可以将另一个源文件的全部内容包含进来两种文件包含形式:#include<文件名>#include“文件名”把指定的文件内容嵌入到另一个文件中通常把一些常数和宏定义编写成.h文件,并用#include命令放置到任何需要的源文件中条件编译对源程序中某一部分内容只在满足一定条件时才进行编译#if常量表达式
程序段1[#else
程序段2]#endif#if常量表达式1
程序段1#elif常量表达式2
程序段2#else
程序段3#endif#ifdef标识符
程序段1[#else
程序段2]#endif#ifndef标识符
程序段1
[#else
程序段2]#endif#include<stdio.h>#defineFLAG1intmain(){intn;#ifFLAGn=1;printf("FLAGhasbeendefined,thevalueofnis%d.\n",n);#elsen=0;printf("FLAGhasnotbeendefined,thevalueofnis%d.\n",n);#endifreturn0;}
外部变量定义、声明在文件中、所有函数之外,进行全局变量的定义或声明。如果是在程序开头、函数之前进行定义或声明,则该变量在定义或声明点之后到整个源程序文件的结束处均有效,否则从定义或声明点到本文件结束有效定义指的是从无到有确立该变量且按该变量的类型分配相应大小的存储空间,而声明则用于提供类型信息,是指该变量已在别处定义过,如果希望在本文件中利用该变量无需专门定义,只要在程序中进行“说明”以通知编译系统
函数定义即确立函数的功能函数定义主要说明函数的名字、信息的传递方式,在函数中用到的局部变量,以及通过顺序、选择和循环等控制结构实现的不同操作等3.函数结构函数首部{
定义及声明部分
执行部分//由基本语句或控制语句组成}执行部分:三种基本结构(1)只有一入口、一个出口(2)结构内的每一部分都有机会被执行到(3)结构内不存在”死循环”(无终止的循环)
顺序结构顺序结构:由语句序列组成,程序执行时,按照从上而下顺序,一条一条地顺序执行流程图N-S图选择结构:根据一定的条件决定执行哪一部分的语句序列N-S图流程图循环结构:使同一个语句组根据一定的条件执行若干次直到型(until型)循环当型(while型)循环流程图N-S图小结:由三种基本结构组成的程序结构,可以解决任何复杂的问题由基本结构所构成的程序属于“结构化”程序,它不存在无规律的转向,只在本结构内才允许存在分支和向前或向后的跳转例:中国古代数学“鸡兔同笼”问题“今有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几何”1.分析问题
分析问题需要明确输入,也就是要处理的数据;明确输出,也就是结果;解决方案的任何附加要求或约束条件
问题输入:总头数a,总脚数b问题输出:鸡数x和兔数y关系公式:x+y=a 2×x+4×y=b
推导公式:
y=(b-2×a)
2
x=a-y2.设计算法鸡兔同笼问题假设:a代表总头数,b代表总脚数,x鸡数,y兔数/*文件名:鸡兔.c主要功能:计算鸡兔数
*/
#include<stdio.h>//包含头文件inta,b,x,y;
//定义4个外部变量voidmain(){//主函数
Input_jitu();
y=(b-2*a)/2;//计算兔子数
x=a-y;//计算鸡数
Output_jitu();
//输出结果}3.编写程序#include<stdio.h>//鸡兔input.cexterninta,b;voidInput_jitu(){printf("Head(a)andfootnumbers(b):");scanf("%d%d",&a,&b);//输入数据}#include<stdio.h>
//鸡兔Output.cexternintx,y;voidOutput_jitu(){printf("鸡:%3d兔:%3d\n",x,y);//输出结果}4.调试运行2.2程序设计的基本元素(1)标识符(2)常量、变量(3)运算符(4)表达式(5)语句(6)注释(1)标识符命名规则字母(a~z、A~Z)、数字(0~9)、下划线(_)组成,且必须由字母或下划线开头不能把C语言的关键字(如if、for、while)作为标识符对大小写敏感应“见名知意”(2)常量、变量常量在程序运行过程中值不能被改变的量。例如:整型常量:如12345,023,0x12,-345,3L实型常量十进制小数形式:如0.34,-56.79,0.0,3.1415f指数形式:如12.34e3(代表12.34
103)字符常量:如‘?’转义字符:如‘\n’,‘\r’’,‘\a’字符串常量:如
“Shanghai”符号常量:#definePI3.14159265变量
用以存储数据,且在程序运行期间值可以改变的量
例如:floatf=123.45;变量的属性名称数据类型存储位置值作用域生存期ffloat123.450x0013ff7c变量的定义
变量必须先定义,后使用;定义变量时指定该变量的名字(符合标识符的命名规则)和类型数据类型变量表floatf;//以华氏度表示的温度
floatc;//以摄氏度表示的温度定义通常放在函数起始处,在任何可执行语句之前变量的初值—随机值变量的初始化floatf=32;floatf,c;//VC++6.0#include<stdio.h>intmain(){intx;floaty;charz;printf("x=%d,y=%f,z=%c\n",x,y,z);return0;}变量的操作将数据存入变量:f=32;取得变量中保存的值:c=5.0/9*(f-32);求变量的地址(指针):&f变量名实际上是以一个名字代表的一个存储地址从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据
32.0f&f
0x0013ff7c(3)运算符C运算符(34个)1)算术运算符
(+-*/%++
--)2)赋值运算符
(=及其扩展赋值运算符)3)强制类型转换运算符
(
(类型))4)关系运算符
(>
<
==
>=
<=
!=)5)逻辑运算符
(!&&
||)6)位运算符
(<<>>~|∧
&)7)条件运算符
(
?:
)如:a=3<5?3:58)逗号运算符
(,)9)指针运算符
(*和&)10)求字节数运算符
(sizeof)11)成员运算符
(.
->)12)下标运算符
([])13)其他
(如函数调用运算符())
说明:对于“/”运算符,如果两个操作数都为整数,执行整数的除法。而只要除数和被除数中有浮点数,执行的就是浮点数的除法运算符“%”的两个操作数必须为整数,结果为整除之后的余数。不允许出现浮点型,余数正负取决于被除数正负位运算的操作数必须是整数逻辑运算具有截断特性:“&&”左边为假时,右边不再向后计算;“||”左边为真时,右边不再向后计算
运算符的优先级和结合性混合运算中谁先谁后由优先级确定同等优先级下,从左向右计算还是从右向左计算由结合性确定不同类型数据间的混合运算:1)+、-、*、/运算的两个数中有一个数为float或double型,结果是double型。系统将float型数据都先转换为double型,然后进行运算2)如果int型与float或double型数据进行运算,先把int型和float型数据转换为double型,然后进行运算,结果是double型3)字符型数据与整型数据进行运算,就是把字符的ASCII代码与整型数据进行运算(4)表达式
用运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为C的表达式1)算术表达式2)赋值表达式3)关系表达式4)逻辑表达式5)位运算表达式6)逗号表达式7)条件表达式(5)语句程序的主体部分是由语句组成的,程序的功能也是由执行语句实现的;语句也是函数的组成单位。语句的标志是分号1)控制语句:if、switch、for、while、do…while、continue、break、return、goto等2)函数调用语句3)表达式语句4)复合语句5)空语句(6)注释注释是程序设计中一项非常重要的内容。程序中常用的注释内容1)程序的名称2)程序的功能3)程序的设计思路与特点4)编程人及其合作者5)程序的编写时间、版本6)其他需要说明的信息C语言中注释的方法:(1)块注释/*注释内容,可以跨行书写*/(2)行注释//注释内容,不能跨行书写注:块注释不能嵌套,但块注释中可以嵌套行注释
例如,/*
//此处嵌入了行注释
*/2.3计算机程序设计基本方法与技术1.计算机程序设计方法结构化程序设计方法面向对象程序设计方法结构化程序设计方法面向过程的程序设计是一种以过程为中心的程序设计思想,它将解题的过程视为数据被加工处理的过程。程序易读、易懂、易于调试和维护、正确性能得到保证。但程序的可修改性和移植性差的缺点,如果解题过程发生变化,则一连串的步骤都得改动,工作量较大结构化程序设计是指程序的设计、编写及测试等都采用规定的组织形式进行,是一种以模块功能和过程设计为主的用于详细设计的基本原则面向对象程序设计方法将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的可复用性、灵活性和扩展性OOP方法建立在“对象”概念基础上、以对象为中心,以类和继承为构造机制,类通过一个简单的接口与外界发生关系,对象之间通过发送消息进行通信当采用面向过程方法时,若解题过程发生变化,则一连串的步骤都得改动,工作量较大。如果采用面向对象的方法,只要改动对象即可名称设计机理穷举技术划定范围、逐个验证嵌套技术内外有别、逐层推进缩减技术结构递归、规模递减二分技术有分有合、规模减半递归技术以退为进、以简御繁2.程序设计基本技术穷举技术EnumerationTechnique,也称枚举技术、暴力技术基本思想:
选定范围、逐个验证选定范围明确问题的解的范围,将所有可能解全部列举出来逐个验证根据约束条件逐个筛选满足条件的解模式:区间枚举、递增枚举适用于循环+判断结构
例:取一个值各位上的数字、求素数、因式分解…使用条件能够预先确定解的范围,并能以合适的方法列举能够对问题的约束条件进行精确描述性能特点比较直观,易于理解,正确性容易证明需要一一列举各种可能性,效率较低例:中国古代数学“鸡兔同笼”问题“今有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几何”(
《孙子算经》)#include<stdio.h>voidmain(){inti,j;for(i=0;i<=35;i++)for(j=0;j<=35;j++)if(i+j==35&&4*i+2*j==94)printf("\nRabbit=%dchichken=%d\n\n",i,j);}思考:百钱买百鸡“公鸡每只5元,母鸡每只3元,三只小鸡1元,用100元买100只鸡,问公鸡、母鸡、小鸡各多少?
)嵌套技术NestedTechnique基本思想:内外有别、逐层推进内外有别外层结构包含了对内层的调用或完整的内层结构,不会出现结构之间相互包含的情形逐层推进由外向内、先内后外性能特点自顶向下、逐步细化策略的实际应用应用于函数嵌套调用结构体类型的嵌套定义三种基本结构之间的相互嵌套…函数的嵌套调用C语言的函数定义是互相平行、独立的,即即函数不能嵌套定义,但可嵌套调用函数,即调用一个函数的过程中,又可调用另一个函数main函数①调用a函数⑨结束a函数③调用b函数⑦②⑧b函数⑤④⑥结构体类型的嵌套定义C语言中当定义结构体类型时,其中的成员又是一个结构体类型,或成员指向该种类型的指针structDate
{intmonth;
intday;intyear;
};structStu{intnum;charname[20];charsex;intage;
structDatebirthday;
charaddr[30];
};structstudent{intnum;intscore;structstudent*next;
//下一结点的地址};基本结构之间的相互嵌套是指结构化程序设计的三种基本结构中包含另外一个完整的结构,形成多层的结构缩减技术ReductionTechnique基本思想:结构递归、规模递减结构递归将问题加工成规模压缩了的同类问题,具有清晰的迭代递推结构规模递减每一步加工后的问题规模相比之前小1适用于递推、迭代等过程顺推
累加、累乘、多项式求值(秦九韶算法)、数列求和(斐波那契数列)…
逆推猴子吃桃、上台阶问题
迭代方程求根…for(i=1,sum=0;i<=100;i++)sum=sum+i;……for(i=1,prod=1;i<=10;i++)prod=prod*i;…#include<stdio.h>#include<math.h>voidmain(){intsign=1;doublepi=0,n=1,term=1;while(fabs(term)>=1e-6){pi=pi+term;n=n+2;sign=-sign;term=sign/n;}printf("pi=%10.8f\n",pi*4);}…floatf=0;for(i=0;i<=n;i++)f=f*x+a[i];…秦九韶算法#include<stdio.h>intmain(){inti,n=1;for(i=9;i>=1;i--)n=(n+1)*2;printf("Peach=%d\n",n);return0;}例:猴子吃桃问题“一只猴子摘了若干桃子,每天吃现有桃子的一半多一个,到第10天只有一个桃子,问桃子有多少个?二分技术BisectionTechnique基本思想:有分有合、规模减半分指一分为二,将问题规模压缩到原来的一半合是指将两部分的解合二为一,形成问题的整体解例:编程求解xn(n为正整数)如果n是偶数,则有xn=(xn/2)2;如果n是奇数,则有xn=x*xn-1#include<stdio.h>voidmain(){intn,nn;floatx,y,z;printf("Inputx,n:");scanf("%f%d",&x,&n);y=1;z=x;while(n>0)if(n%2==0){z=z*z;n=n/2;}else{y=y*z;n=n-1;}printf("%g^%d=%g\n",x,nn,y);}递归技术函数的递归调用:Recursion,在调用函数的过程中又出现直接或间接地调用该函数本身intfun(intx){inty,z;z=fun(y);return(2*z);}
fun函数调用fun函数直接调用本函数67fac(5)=5*fac(4)fac(4)=4*fac(3)fac(3)=3*fac(2)fac(2)=2*fac(1)fac(1)=1fac(2)=2fac(3)=6fac(4)=24fac(5)=120“递”阶段“归”阶段例基本思想:以退为进、以简驭繁以退为进向下传递:直接求解有困难,故先逐次向下传递,一直传递到“最简单”的操作(能方便完成的操作)向上回归:利用已知条件逐个返回替代未知一递一归,有去有回,正反融合,你中有我、我中有你以简驭繁以简单的递归公式替代原先复杂而抽象的计算把问题转换为规模缩小了的同类问题的子问题性能特点递归技术是分治策略的最好应用,以有限定义无限是一种比迭代循环更简单、更好用的结构,但时间复杂性和空间复杂性比循环结构高“递”环节需保护现场,开辟运行资源“归”环节需要回收资源占用大量的时间和空间,递归的深度受到限制必须有明确的递归结束条件适用于当问题需要“后进先出”的操作树的遍历、图的深度优先搜索、汉诺塔、八皇后…intfac(intn){intf;if(n<0)printf("n<0,error!");elseif(n==0||n==1)f=1;elsef=n*fac(n-1);return(f);}#include<stdio.h>intmain(){intfac(intn);inty,n=5;y=fac(n);printf("%d!=%d\n",n,y);return0;}#include<stdio.h>intmain(){intfac(intn);inty,n=100;y=fac(n);printf("1+2+…+%d!=%d\n",n,y);return0;}intfac(intn){intf;if(n<=0)printf("n<0,error!");elseif(n==1)f=1;elsef=n+fac(n-1);return(f);}2.4程序设计的原则与风格
</Test>。。。可读可维护安全可移植可测试
其它优秀的代码</>
新写代码缺陷修补特性扩展新人学习代码80%的时间被阅读命名规范注释规范头文件函数规范宏定义变量规范编程实践编程规范程序文档化原则
软件=程序+数据+文档标识符做到见名知义程序应适当加以注释视觉形式上简洁清晰程序构造原则提倡采用IPO结构进行程序的构造IPO结构是结构化程序设计中最基本、也是最重要的结构,最早由美国IBM公司提出,倡导每个程序都有一个统一的构架模式,即由数据的输入(Input)、处理(Processing)和输出(Output)三部分组成在一个程序中,I、P和O不是必须同时存在,但输出(O)则是程序的必备成分语句构造原则语句构造应该尽可能简单直观,不要一味为追求效率而使代码复杂化提高模块及语句的内聚性,减小语句的规模为了便于阅读和理解,尽量每行放置一个语句避免使用多分支语句、复杂的判定条件以及多重循环的嵌套数据说明原则数据说明顺序应规范,应易于理解便于查阅尽量不使用或少使用全局数据信息(变量),如果必须使用全局变量,应将其限定在尽可能小的作用域范围内,适当加注关键字static,禁止跨
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 常见病症推拿
- 2026年水路交通运输技能考试-甲板工考试历年参考题库含答案解析
- 2026年机械制造行业技能考试-采掘电钳工历年参考题库含答案解析
- 2026年服务行业技能考试-职业店长考试历年参考题库含答案解析
- 2026年执业医师考试-中医执业医师第一阶段历年参考题库含答案解析
- 2026年山西住院医师-山西住院医师耳鼻咽喉科历年参考题库含答案解析
- 2026年招投标监管岗位业务考试真题及答案
- 骨科康复类课件
- 数据分析劳务合同范本
- 滑坡监测岗位安全操作规程
- 恒康养老护理员培训课件:特殊需求老人照护策略
- 汽修厂环保试题及答案
- 2025年《医疗机构环境表面清洁与消毒管理规范》试题(附答案)
- 老年牙病防治课件
- 病虫害自动识别与预警-洞察阐释
- 2024年江苏省普通高中学业水平合格性语文试卷(1月份)
- 《学生常见病多病共防技术指南》详细解读
- 智慧农业的智能农机与装备
- 互联网+护理服务介绍课件
- GB/T 10858-2023铝及铝合金焊丝
- 宝马工程师及系列软件一些地址
评论
0/150
提交评论