




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机程序设计基础第零章C语言概述提纲0.1C语言简介0.2程序设计的基本概念0.3简单C程序介绍0.4程序设计的基本流程本章小结0.1C语言简介C语言简史Ritchie&Kernighan(BellLabs.)从B语言脱胎而来为开发UNIX而设计
C语言的标准化ANSIC标准化委员会:1983ANSIC:C89ISO/IEC9899:1990:C90C99C语言特点中级语言:介于高级语言与低级语言之间高级语言的结构化与模块化低级语言的控制性与灵活性结构化顺序结构、分支结构、循环结构模块化函数、函数库可移植性0.2程序设计的基本概念程序一系列遵循一定规则并能正确完成特定功能的代码或指令序列通常包括数据结构与算法两部分程序设计与程序设计语言程序设计:按照任务需要,设计数据结构与算法,编写代码并测试其正确性,得到正确运行结果的过程程序设计方法学:程序设计应遵循一定的方法与原则,养成良好的编程风格程序设计语言:编写程序代码的规范,具有特定的语法规则、意义与使用环境0.2程序设计的基本概念算法问题的求解方法与步骤不允许存在二义性算法设计过程是逐步求精的常使用流程图描述算法数据与数据结构数据:程序操作的对象数据结构:数据对象之间的相互关系及构造方法与算法关系密切,良好的数据结构可使算法更简单,恰当的算法可使数据结构更易理解0.3简单C程序介绍编写程序,显示字符串"HelloWorld!"#include<stdio.h>intmain(){printf("HelloWorld!\n");return0;}主函数的函数头,全局惟一预编译指令,包含标准头文件函数体,花括号内为语句序列标准库函数,在输出设备(一般为屏幕)上输出一行文本函数调用,需要了解该函数原型,即函数如何使用的细节信息;printf函数原型位于"stdio.h"中,故需包含该头文件双引号内为字符串内容;‘\n’为转义字符,表示换行分号表示语句结束函数结束执行,程序退出0.3简单C程序介绍编写程序,计算用户输入的两个整数之和#include<stdio.h>intmain(){inta,b,sum;printf("Theprogramaddstwointegers.\n");printf("Thefirstnumber:");scanf("%d",&a);printf("Thesecondnumber:");scanf("%d",&b);sum=a+b;printf("%d+%d=%d\n",a,b,sum);return0;}数据的输入与存储absum数据的输入与存储1absum数据的输入与存储12absum数据的输入与存储123absum程序设计思维战略与战术先关注战略层面问题(程序逻辑)再关注战术层面问题(程序细节)细微之处邪魔藏也!程序流程框架程序代码的三分天下:输入、计算、输出C程序结构特点由一个或多个函数组成具有惟一一个主函数main程序执行由主函数开始,其他函数由主函数调用或间接调用程序执行流程与函数定义顺序无关每个函数包含函数头与函数体两部分C标准库包含大量库函数,程序员可直接使用库函数原型位于相应头文件中,使用函数前必须包含该头文件0.4程序设计的基本流程本章小结C语言的发展历史与基本特点程序设计的基本概念程序、程序设计与程序设计语言、算法、数据与数据结构C程序的基本结构与特点程序设计的基本流程编辑、编译、链接、测试(调试与执行)作业第13页:习题二第2、3小题计算机程序设计基础第一章C语言基本语法元素提纲1.1数据类型1.2量与表达式1.3语句1.4基本输入输出函数1.5程序设计风格本章小结1.1数据类型整数类型使用int定义整数类型的数据对象整数类型具有取值范围,仅能表示特定区间内整数值浮点数类型使用double或float表示小数同样具有取值范围首选double字符串类型字符序列以整体的形式作为数据对象使用本书配套zylib库中的STRING类型表示字符串,易于使用整数类型整数类型定义a为整数:inta;整数的符号:确定是否表示负数signed、unsigned定义b为无符号整数:unsignedintb;整数的长短:确定整数取值范围的大小long、short定义c为短整数:shortintc;浮点数类型:double编写程序,计算用户输入的两个浮点数之和#include<stdio.h>intmain(){doublea,b,sum;printf("Theprogramaddstworealnumbers.\n");printf("Thefirstrealnumber:");scanf("%lf",&a);
//"lf"表示处理double类型的浮点数printf("Thesecondrealnumber:");scanf("%lf",&b);sum=a+b;printf("%lf+%lf=%lf\n",a,b,sum);return0;}浮点数类型:float编写程序,计算用户输入的两个浮点数之和#include<stdio.h>intmain(){floata,b,sum;printf("Theprogramaddstworealnumbers.\n");printf("Thefirstrealnumber:");scanf("%f",&a);
//"f"表示处理float类型的浮点数printf("Thesecondrealnumber:");scanf("%f",&b);sum=a+b;printf("%f+%f=%f\n",a,b,sum);return0;}字符串类型:STRING接受用户输入的用户名,向用户问好#include<stdio.h>#include"zylib.h"//
使用双引号而不是尖括号包含配套库intmain(){STRINGname;printf("Theprogramreadsuser'sname,andprintsagreeting.\n");printf("Yourname:");name=GetStringFromKeyboard();/*配套库已实现的函数,获取用户输入的字符串,以用户输入的文本行为单位*/printf("Hello,%s.\n",name);//
使用"s"输出字符串return0;}工程项目的设置基本步骤创建新工程,设置好工程项目中文件的目录,程序代码可能位于工程项目目录下的子目录中将文件“zylib.h”与“zylib.c”拷贝到程序目录下在工程项目中添加上述文件在程序代码中使用双引号包含头文件“zylib.c”特别说明工程项目的意义:将程序组织成一个项目整体进行开发和管理,一般需要创建单独的工程才能开发程序不同编译器的工程项目设置并不相同1.2量与表达式表达式变量文字与常量赋值与初始化操作符与操作数混合运算与类型转换表达式表达式的定义操作数与操作符序列,表达运算过程操作数:文字、量、函数调用、括号操作符:运算逻辑表达式值:运算结果表达式求值:计算表达式值的过程类比:按普通四则运算理解表达式求值过程,逐一计算表达式中所有操作符,直至完成变量先定义再使用定义格式:变量类型变量名称[,变量名称];单独定义例:inta;同时定义例:doubleb,c;变量名称应既有惟一性:不允许重名变量的四大基本特征(VANT)变量总是具有值(value)变量总是与内存中的地址(address)相对应变量总是具有名称(name)变量总是具有确定的类型(type)文字定义:程序中单独出现的值例:3.14、100
等整数类型文字十进制、十六进制、八进制浮点类型文字字符串类型文字整数类型文字十进制表示:普通整数表示十六进制表示:逢十六进一,无正负号以“0x”或“0X”开头的0~9、A/a~F/f序列例:0x55、0X1F、0x2a0x5516=8510八进制表示:逢八进一,无正负号以“0”开头的0~7序列例:0550558=4510注意不要与十进制混淆!浮点数类型文字一般形式:小数表示法由整数部分、小数点与小数部分组成例:3.1416、–2.718281828指数形式:科学计数法由尾数部分、字符‘E’/‘e’与指数部分组成例:3.14e3=3.14103、–2.7E–2=–2.710–2字符串类型文字双引号引起来的字符序列例:"ProgramminginC"、"HelloWorld!\n"双引号是字符串文字的界定符,不是字符串的内容!转义序列字符串不仅可以包含可打印字符,也可以包含表示特殊活动的特殊字符格式:使用反斜杠开始转义序列,后跟一个或多个字符转义序列整体作为单个字符进行处理,样式固定例:"\n"、"\\"
C语言预定义的转义序列转义序列功能与意义\a响铃\b退格\f换页\n换行\r返回到当前行首\t水平制表键\v垂直制表键\0ASCII码0\\反斜杠字符自身\’单引号字符(仅在字符常数中需要使用此方式)\"双引号字符(仅在字符串常数中需要使用此方式)\ddd“ddd”表示八进制的该字符ASCII码值\xhh“hh”表示十六进制的字符ASCII码值,x为十六进制标志常量常量的定义:程序执行期间其值不可改变的量格式:const数据类型常量名称=初始值;例:constintzero=0;常量的意义解决直接出现的文字无法解释其意义的问题文字?魔数也!常量与变量常量不可改变值,其他与变量同定义常量时必须进行初始化!常量初始值必须能够在编译期间计算出来赋值与初始化赋值表达式格式:变量名称=表达式例:a=0赋值语句:赋值表达式加分号格式:变量名称=表达式;例:a=b+c;变量的初始化在定义变量时直接设定初始值例:inta=0;赋值流程absummain赋值流程1absummaina=1;赋值流程12absummaina=1;b=2;赋值流程123absummaina=1;b=2;sum=a+b;操作符与操作数操作符分类一元操作符:只有单个操作数,例如负号二元操作数:带有两个操作数,例如加减乘除等三元操作数:带有三个操作数,例如条件表达式(仅在C语言中存在惟一一种)操作符的优先级与结合性优先级确定计算顺序,结合性确定计算方向操作符的优先级仅具有参考价值,C语言对于特殊表达式的计算有特别规定,并不完全遵照该规则!如果拿不准,使劲加括号混合运算与类型转换编写程序,询问用户姓名,向用户问好,然后请求用户输入一整数和一实数,输出加法运算结果#include<stdio.h>#include"zylib.h"//使用双引号而不是尖括号包含配套库intmain(){STRINGname;intn;doubled,sum;printf("Theprogramreadsuser'sname,andprintsagreeting,\n");printf("andaddsanintegerandarealnumber.\n");printf("Yourname:");name=GetStringFromKeyboard();/*获取输入字符串,以用户输入的文本行为单位*/printf("Hello,%s.\n",name);//输出字符串printf("Pleaseinputaninteger:");n=GetIntegerFromKeyboard();/*获取输入整数,以回车确认输入*/printf("Pleaseinputarealnumber:");d=GetRealFromKeyboard();/*获取输入浮点数,以回车确认输入*/sum=n+d;printf("%d+%lf=%lf\n",n,d,sum);return0;}隐式类型转换与显式类型转换隐式类型转换程序自动进行,程序员不需要干预转换原则:一般以不损失精度为前提赋值时右边表达式值先转换为变量类型后再进行显式类型转换程序员手工进行的类型转换格式:(转换后的数据类型)原表达式例:设inta;doubleg=9.80665;a=g;
//
进行隐式类型转换,小数部分舍弃,a值为9a=(int)g*4;//
进行显式类型转换,a值为4*9=36a=(int)(g*4);
//
进行显式类型转换,a值为391.3语句简单语句格式:表达式后跟分号例一:sum=n+d;例二:n=GetIntegerFromKeyboard();例三:printf("%d+%lf=%lf\n",n,d,sum);复合语句格式:花括号对括起来的语句序列例:{a=1;b=a+1;}空语句格式:单独出现的分号目的:满足程序特定语法规则的要求;作为未来添加程序代码的占位标记1.4基本输入输出函数基本事实输入输出是语言与算法必须具备的功能C语言本身没有输入输出语句或命令,输入输出需使用标准库函数输入输出函数原型位于头文件“stdio.h”中典型输入输出函数格式化输出函数printf格式化输入函数scanf格式化输出函数printf格式化输出函数printf
调用格式格式:printf("输出格式规约字符串",输出项列表);例一:printf("Theprogramprintsagreeting.\n");例二:printf("Hello,%s.\n",name);例三:printf("%f+%f=%f\n",a,b,sum);例四:printf("%d+%lf=%lf\n",n,d,sum);%y:格式描述符%d:十进制整数%f:float类型浮点数;%lf:double类型浮点数%c:单个字符%s:字符串%u:无符号整数printf函数示例编写程序,按照下列格式输出截止2005年底的部分省市统计数据。所有数据均来自各地政府官方网站,面积仅包括陆域(单位:平方公里),人口仅包括户籍人口(单位:万人),其中部分数据为约数。场宽精度左右对齐场宽、精度与对齐输出格式%[对齐标志][场宽][.精度]格式描述符对齐标志:确定每列左侧还是右侧对齐缺省右对齐,左对齐使用减号例:%-d
表示按照左对齐格式输出整数场宽:确定每列占用多少字符宽度,数据输出一般不会截断确定输出最小宽度,超出部分照常输出例:%3d表示按照右对齐、占三位格式输出整数,若整数长度超出三位,则照常输出数据场宽、精度与对齐精度:确定输出多少位数据以保证其精度精度数字前有小数点标志,在场宽中占用一位!例:%-5.2f表示按照左对齐、整体占五位且小数点后两位格式输出浮点数数据的截断例一:按%-5.2f格式输出12.3456,结果为12.35,注意四舍五入例二:按%-5.2f格式输出123.456,结果为123.46,注意截断后的数据仍然超出了场宽,照常输出字符串截断输出特例:%13.13s表示按照整体占13位且多余部分截断的方式输出字符串程序代码#include<stdio.h>#include"zylib.h"intmain(){STRINGprovince1,province2,province3,province4,province5;doublearea1,area2,area3,area4,area5;doublepop1,pop2,pop3,pop4,pop5;province1="Anhui";area1=139600;pop1=6461;province2="Beijing";area2=16410.54;pop2=1180.70;province3="Chongqing";area3=82400;pop3=3144.23;province4="Shanghai";area4=6340.50;pop4=1360.26;province5="Zhejiang";area5=101800;pop5=4894;printf("-------------------------------------------\n");printf("ProvinceArea(km2)Population(10K)\n");printf("-------------------------------------------\n");printf("%-13.13s%9.2lf%-.2lf\n",province1,area1,pop1);printf("%-13.13s%9.2lf%-.2lf\n",province2,area2,pop2);printf("%-13.13s%9.2lf%-.2lf\n",province3,area3,pop3);printf("%-13.13s%9.2lf%-.2lf\n",province4,area4,pop4);printf("%-13.13s%9.2lf%-.2lf\n",province5,area5,pop5);printf("-------------------------------------------\n");return0;}格式化输入函数scanf格式化输入函数scanf调用格式格式:scanf("输入格式规约字符串",输入项列表);例:scanf("%d,%d",&a,&b);特别说明输入格式码与输出格式码基本相同用户在终端输入的数据逐一存放到输入项列表中变量所在的地址空间;对于普通变量,变量名前需添加取址操作符“&”多个输入项的分隔:格式描述串中其他字符需在输入数据时一并输入;无分隔字符的相连项在输入时使用空格、Tab或回车键分隔不要使用scanf,使用zylib库中的三个函数代替!整数输入:GetIntegerFromKeyboard浮点数输入:GetRealFromKeyboard字符串输入:GetStringFromKeyboard1.5程序设计风格注释命名规范宏与常量赋值语句的简写形式源代码的排版注释注释的目的:增强程序的可读性、可维护性注释的格式格式一:“/*”与“*/”对,注释其中的部分,可出现在程序代码的任意地方例一:
int/*此处内容为注释*/a;格式二:“//”,注释从此字符序列开始直至本文本行结束例二:
inta;//
此处内容为注释特别说明同一种注释标记不可以嵌套“//”不跨行,“/*”与“*/”对可跨行命名规范字符集:ASCII字符集大小写英文字母、数字、部分特殊符号标识符以下划线或字母开头,由下划线、字母、数字组成,表示常量、变量、函数、类型等名称,区分大小写!关键字:系统专用的具有特定意义的标识符预定义标识符:编译命令与库函数名,具有特定意义,一般不能重新定义用户定义标识符:用户根据需要定义,主要是为了使程序容易阅读、理解与维护宏与常量宏定义#define指令:预处理命令例:#definePI3.14一旦定义,可以代替常量使用宏定义不是常量!程序中应优先使用常量而不是宏目的与意义增强程序可读性使用有意义的名字命名增强程序的可维护性将值定义为符号常量,则程序中仅需要修改一次#include<stdio.h>#definePI3.14intmain(){doubler,area;r=3.0;area=PI*r*r;printf("%f",area);return0;}赋值语句的简写形式加赋:x+=a等价于x=x+a减赋:x-=a等价于x=x-a乘赋:x*=a等价于x=x*a除赋:
x/=a等价于x=x/a除法作用于整数上时,结果也为整数余赋:
x%=a等价于x=x%a%:两个整数进行整数除法,结果为余数特别说明x*=a+b等价于x=x*(a+b)源代码排版递进层次应使用左缩进格式每行代码不能过长,不超过80个字符函数代码不超过60行使用空行区分不同功能代码复合语句书写格式要统一除非特别必要,否则不要在一行上书写多条语句命名规范要一致无论采用什么标准,都一定要一直按照该标准执行!本章小结数据类型确定数据对象的存储格式、取值范围、可实施的操作集量与表达式操作符、操作数、表达式、赋值与初始化语句简单语句、复合语句与空语句基本输入输出函数printf与scanf不建议使用scanf,使用zylib库中的替代函数程序设计风格作业第50页:习题二第5、7小题计算机程序设计基础第二章程序流程控制提纲2.1结构化程序设计基础2.2布尔数据2.3if分支结构2.4switch分支结构2.5while循环结构2.6for循环结构2.7问题求解与结构化程序设计本章小结2.1结构化程序设计基础程序的控制结构(黑箱)单入口单出口的控制结构易于理解三种基本控制结构顺序结构分支结构循环结构复杂控制结构控制结构可以嵌套,以构成更复杂的控制结构顺序结构顺序结构由一组顺序执行的处理块组成,每个处理块可能包含一条或一组语句,完成一项任务顺序结构是最基本的算法结构顺序结构示例编写程序,接受用户输入的两个整数,输出其中较大者#include<stdio.h>#include"zylib.h"intmain(){inta,b,max;/*输入部分*/printf("Theprogramgetstwonumbersandprintsthegreaterone.\n");printf("Thefirstnumber:");a=GetIntegerFromKeyboard();printf("Thesecondnumber:");b=GetIntegerFromKeyboard();/*计算部分*/
max=a>b?a:b;
/*三元表达式*//*输出部分*/printf("Thegreateroneis%d.\n",max);return0;}三元表达式格式表达式1?表达式2:表达式3计算过程先计算表达式1的值,若为真,则结果为表达式2的值,否则为表达式3的值示例x=(a>b)?a:b;等价于:if(a>b)x=a;elsex=b;分支结构分支结构(选择结构)的含义根据某一条件的判断结果,确定程序的流程,即选择哪一个程序分支中的处理块去执行最基本的分支结构是二路分支结构以条件判断为起点,如果判断结果为真,则执行A处理块的操作,否则执行B处理块的操作循环结构循环结构的含义根据某一条件的判断结果,反复执行某一处理块的过程最基本的循环结构是当循环进入循环结构,判断循环条件,如果循环条件的结果为真,则执行A处理块的操作,即循环一次,然后再次判断循环条件,当循环条件为假时,循环结束2.2布尔数据枚举类型用户自定义数据类型关系表达式逻辑表达式逻辑表达式的求值枚举类型枚举类型的声明格式:enum枚举名{元素名1,元素名2,…,元素名n};例:enumMONTH{JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC};枚举类型声明中的元素为枚举文字,不是变量枚举类型变量的定义例:enumMONTHmonth;枚举类型的意义将多个文字组织在一起,表达从属于特定类型的性质取代魔数,使源代码更易理解用户自定义类型自定义类型的格式格式:typedef原类型标识新类型名;例一:typedefintDWORD;例二:enumBOOL_TAG{FALSE,TRUE};typedefenumBOOL_TAGBOOL;自定义类型的性质新类型与原类型相同,并未产生新类型,重新命名的自定义类型使程序更易理解若整数可以用于表示两类不同数据对象,使用自定义类型可以区分它们自定义类型不是简单的类型替换,虽然它们确实等同布尔类型的定义enum__BOOL{FALSE,TRUE};布尔类型实现布尔类型:第一版定义类型:enumBOOL{FALSE,TRUE};使用布尔类型定义变量:enumBOOLbool;每次定义,都需要书写enum,很不方便实现布尔类型:第二版定义枚举类型:enum__BOOL{FALSE,TRUE};自定义布尔类型:typedefenum__BOOLBOOL;定义变量:
BOOLbool;实现布尔类型:第三版定义类型:typedefenum__BOOL{FALSE,TRUE}BOOL;关系表达式关系操作符大于(>)、等于(==)、小于(<)、不大于(<=)、不小于(>=)、不等于(!=)关系表达式关系操作符与两个操作数构成的表达式多个关系表达式可连接起来构成复杂关系表达式运算结果为逻辑值:真或假逻辑值(布尔值)C语言以0表示假,以非0表示真(经常以1表示)尽量使用BOOL类型表示逻辑值!示例例:x==y,a<b逻辑表达式逻辑操作符:逻辑与(&&)、逻辑或(||)、逻辑非(!)逻辑表达式逻辑操作符与一个或两个操作数构成的表达式,结果仍为真或假x&&y:若x、y均为真,则结果为真,否则为假x||y:若x、y均为假,则结果为假,否则为真!x:若x为真,则结果为假,否则为真复杂逻辑表达式例:x>y||a!=b&&3<=2关系操作符与逻辑操作符的优先级从高到低顺序:逻辑非“!”;小于“<”、不小于“>=”、大于“>”、不大于“<=”(同级);等于“==”、不等于“!=”(同级);逻辑与“&&”;逻辑或“||”逻辑表达式的求值给定年份year,判断是否为闰年,闰年规定为:能够被400整除的年份一定是闰年其他能够被100整数的年份一定不是闰年其他能够被4整除的年份一定是闰年year%4==0&&year%100!=0||year%400==02.3if分支结构If分支结构的三种格式格式一:if(条件表达式){语句序列}格式二:if(条件表达式){语句序列1
}else{语句序列2
}格式三:if(条件表达式1){语句序列1
}elseif(条件表达式2){语句序列2
}…else{语句序列n
}特别说明条件表达式必须位于括号内,一般为关系或逻辑表达式先计算条件表达式值,若为真则执行语句序列1,否则执行语句序列2语句序列1与语句序列2可以为复合语句、单语句或空语句语句序列1与语句序列2只能有一个被执行若仅用于确定某条语句是否执行,else分支可以省略简单if语句编写程序,接受用户输入的整数,如果该整数为奇数则将其乘3加1后输出,偶数直接输出#include<stdio.h>#include"zylib.h"intmain(){inta,result;
/*输入部分*/printf("Theprogramgetsanumber.\nIfitisaneven,outputitdirectly,\n");printf("otherwisemultiplyitby3thenplus1.\n");printf("Thenumber:");a=GetIntegerFromKeyboard();
/*计算部分*/result=a;if(a%2==1)result=a*3+1;
/*输出部分*/printf("Theresultis%d.\n",result);return0;}if-else语句编写程序,接受用户输入的整数,如果该整数为奇数则将其乘3加1后输出,偶数除以2后输出#include<stdio.h>#include"zylib.h"intmain(){inta,result;
/*输入部分*/printf("Theprogramgetsanumber.\nIfitisaneven,divideitby2,\n");printf("otherwisemultiplyitby3thenplus1.\n");printf("Thenumber:");a=GetIntegerFromKeyboard();
/*计算部分*/result=a;if(a%2==1)result=a*3+1;elseresult=a/2;
/*输出部分*/printf("Theresultis%d.\n",result);return0;}if-elseif-else语句已知2006年12月1日为星期五。编制程序,接受用户输入的1~31之间的整数,按照下述格式将该日星期几信息打印在对应栏下。例如,2006年12月1日打印在星期五“Fr”下面:程序代码#include<stdio.h>#include"zylib.h"typedefenum{SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY}WEEKDAY;intmain(){intdate;constWEEKDAYdate_1=FRIDAY;WEEKDAYweekday;/*输入部分*/printf("Theprogramgetsadate(1~31),\n");printf("andprintsacalendarof2006-12(justthedate).\n");printf("Thedate:");date=GetIntegerFromKeyboard();if(date<1||date>31){/*日期输入错误,给出错误信息,退出执行*/printf("Dateerror!\n");return1;}程序代码/*计算部分,得到该日的星期几信息*/weekday=(WEEKDAY)((date+(int)date_1-1)%7);/*输出部分*/printf("Calendar2006-12\n");printf("\n");printf("SuMoTuWeThFrSa\n");printf("\n");
/*在指定位置输出该日的星期几信息*/
if(weekday==SUNDAY) printf("%2d\n",date);
elseif(weekday==MONDAY) printf("%6d\n",date);
elseif(weekday==TUESDAY) printf("%10d\n",date);
elseif(weekday==WEDNESDAY) printf("%14d\n",date);
elseif(weekday==THURSDAY) printf("%18d\n",date);
elseif(weekday==FRIDAY) printf("%22d\n",date);
else printf("%26d\n",date);printf("\n");return0;}2.4switch分支结构计算过程先计算表达式的值依次与常数表达式比较若相同则执行该分支(子句)否则转向default分支最后退出switch语句特别说明switch后面的表达式必须为整型、字符型或枚举型case后面必须为常量表达式,且各个case值必须不同若无default分支,且无case分支匹配,则不执行case分支中的语句可以有多条,不需要花括号switch(表达式){case常数表达式1:语句序列1case常数表达式2:语句序列2┇case常数表达式n:语句序列ndefault:默认语句序列}switch语句的执行流程switch示例/*输出部分*/printf("Calendar2006-12\n");printf("\n");printf("SuMoTuWeThFrSa\n");printf("\n");
/*在指定位置输出该日的星期几信息*/
switch(weekday){
caseSUNDAY: printf("%2d\n",date); break;
caseMONDAY: printf("%6d\n",date); break;
caseTUESDAY: printf("%10d\n",date); break;
caseWEDNESDAY: printf("%14d\n",date); break;
caseTHURSDAY: printf("%18d\n",date); break;
caseFRIDAY: printf("%22d\n",date); break;
caseSATURDAY: printf("%26d\n",date); break;
default: ;/*没有缺省情况需要处理*/
}printf("\n");return0;}break语句break语句的目的终止switch语句的执行如果没有break语句,则程序会从指定的case分支开始,并在该分支结束后继续执行下去除非switch语句结束,后面的其他case分支或default分支中的语句都会得到执行原因:case子句中的常数表达式仅起到语句标号的作用,不是分支之间的分隔标记省略break语句的场合允许多个分支执行同样的代码break示例编写程序,接受用户输入的年份和月份,输出该月天数#include<stdio.h>#include"zylib.h"intmain(){intyear,month,days_of_month; BOOLleapyear=FALSE;
/*输入部分*/printf("Theprogramgetsayearandamonth,andprintsdaysofthemonth.\n");printf("Theyear:"); year=GetIntegerFromKeyboard();printf("Themonth:"); month=GetIntegerFromKeyboard();if(month<1||month>12){ printf("Montherror!\n"); return1; }
/*计算部分*/leapyear=year%4==0&&year%100!=0||year%400==0;
switch(month){case1:case3:case5:case7:case8:case10:case12:days_of_month=31;break;case4:case6:case9:case11:days_of_month=30;break;case2:days_of_month=28+(int)leapyear;break;}
/*输出部分*/printf("Daysin%4d-%2.2dis%d.\n",year,month,days_of_month);return0;}分支结构的嵌套考虑表达某企业的工资晋级计划。该计划向在公司长期服务的老员工和虽然服务年限较短但年龄偏大的员工倾斜。计划规定,若员工服务年限未达5年,则若年龄不小于28岁长一级工资;若服务年限已达5年,长两级工资。那些服务年限短的小字辈不再此次调整工资之列。设age表示员工年龄,service_years表示服务年限,salary_level表示工资级别。分支结构的嵌套else与哪个if配对?if(service_years<5)if(age>=28)salary_level+=1;elsesalary_level+=2;else与if配对规则离它最近:距离最短同层次:排除底层嵌套if(service_years<5){if(age>=28)salary_level+=1;}elsesalary_level+=2;降低第二个if的层次,使else与第一个if配对2.5while循环结构while循环格式:while(表达式)循环体while循环执行流程先判断后执行:表达式为真时,执行一遍循环体(一次迭代),返回重新计算表达式的值以确定是否重复执行循环体;若表达式为假,则终止循环为保证循环终止,循环体内应有能改变表达式值的语句while循环示例编写程序,接受用户输入的多个整数求和,用户输入0时程序结束#include<stdio.h>
#include"zylib.h"intmain()
{
intn,sum=0;/*输入与计算部分*/
printf("Theprogramgetssomeintegers,andoutputtheirsum.\n");
printf("Tostop,pleaseinput0.\n");
printf("Pleaseinputaninteger:"); n=GetIntegerFromKeyboard();
while(n){
sum+=n;
printf("Thenextinteger:");
n=GetIntegerFromKeyboard();
}/*输出部分*/
printf("Thesumis%d.\n",sum);
return0;
}常见的程序结构无限循环发生无限循环的场合循环体内没有改变循环变量值的语句即使改变循环变量值,也不能否定循环条件循环体内没有能够强制终止循环执行的语句或命令无限循环的后果程序永远不会结束,大多数时有害,编程时一般应避免例外情况:循环体内有专门控制循环终止的语句或命令命令格式:满足某种条件下使用break语句,终止循环执行哨兵:使循环满足终止条件的循环变量值使用break语句终止循环/*输入与计算部分*/
printf("Theprogramgetssomeintegers,andoutputtheirsum.\n");
printf("Tostop,pleaseinput0.\n");
while(TRUE){
printf("Pleaseinputaninteger:");n=GetIntegerFromKeyboard();if(n==0)break;
sum+=n;
}使用无限循环和哨兵的优势不再需要将首个数据处理过程提到循环体前单独处理continue语句编写程序,接受用户输入的多个整数求和。注意,仅累加正整数,跳过所有负数,用户输入0时程序结束#include<stdio.h>
#include"zylib.h"intmain()
{
intn,sum=0,count=0;/*count为输入整数的个数*//*输入与计算部分*/
printf("Theprogramgetssomeintegers,andoutputthesumofallpositivenumbers.\n");
printf("Tostop,pleaseinput0.\n");
while(TRUE){count+=1;printf("Number%d:",count);n=GetIntegerFromKeyboard();if(n==0)break;/*终止循环*/if(n<0)continue;/*仅终止循环的当前迭代,不累加负数值*/
sum+=n;
}/*输出部分*/
printf("Thesumis%d.\n",sum);
return0;
}2.6for循环结构递增递减表达式for语句for与while的比较循环嵌套递增递减表达式递增递减表达式的优先级非常高前缀递增递减格式:++变量名称;--变量名称;例一:设a为1,++a
等价于a=a+1,a结果为2例二:设a为1,--a
等价于a=a-1,a结果为0计算要诀:先递增递减,再参与运算例三:设a为1,b=++a*3
等价于a=a+1;b=a*3,a结果为2,b结果为
6例四:设a为1,b=--a*3
等价于a=a-1;b=a*3,a结果为0,b结果为
0递增递减表达式后缀递增递减格式:变量名称++;变量名称--;例一:设a为1,a++
等价于a=a+1,a结果为2例二:设a为1,a--
等价于a=a-1,a结果为0计算要诀:先参与运算,再递增递减例三:设a为1,b=a++*3
等价于b=a*3;a=a+1,a结果为2,b结果为
3例四:设a为1,b=a--*3
等价于b=a*3;a=a-1,a结果为0,b结果为
3注意事项操作数必须为变量,而不能为其他表达式不要在复杂表达式中使用递增递减操作符!for语句for循环格式for(初始化表达式;条件表达式;步进表达式)循环体for循环执行流程先判断后执行:先执行初始化表达式,再计算条件表达式,并根据其结果决定是否执行一遍循环体(为真时执行),计算步进表达式的值(循环再次“初始化”),返回重新计算条件表达式的值以确定循环是否终止for循环示例编写程序,接受用户输入的整数n,求1~n的平方和#include<stdio.h>
#include"zylib.h"intmain()
{
intn,i,sum=0;printf("Theprogramgetsapositiveinteger,\n");printf("andprintsthesquaredsumfrom1tothenumber.\n");printf("Thenumber:");n=GetIntegerFromKeyboard();sum=0;for(i=0;i<=n;++i)sum+=i*i;printf("Thesumis%d.\n",sum);return0;}for与while的比较两种循环结构可以互换使用while循环常用于不需要或很少需要初始化的场合for循环常用于需要简单初始化和通过递增递减运算控制循环体执行的场合for循环将所有循环控制因素都放在循环头部,循环结构最清晰通过省略循环头部的一个或多个表达式,for循环也可能非常复杂循环嵌套编写程序,按下述格式打印九九乘法表程序代码#include<stdio.h>
#include"zylib.h"intmain()
{
inti,j;
/*打印表头*/printf("Nine-by-nineMultiplicationTable\n");printf("---------------------------------------\n");printf("");/*两个空格,跳过最左列的竖排标志*/for(i=1;i<=9;++i)printf("%4d",i);/*横排1~9
标志*/printf("\n");printf("---------------------------------------\n");
/*逐行打印*/
for(i=1;i<=9;++i){/*共打印9行,i为行号*/printf("%2d",i);/*最左列的竖排标志*//*共打印9列,j为列号,只打印上三角,下三角使用空格填充*/
for(j=1;j<=9;++j){if(j<i)printf("");elseprintf("%4d",i*j);
}printf("\n");/*结束一行打印,换行*/
}printf("---------------------------------------\n");return0;}2.7问题求解与结构化编程问题规模与程序结构化单入口单出口的程序容易理解满足单入口单出口条件的语句称为结构化语句问题规模增大时,合理控制程序结构非常重要程序框架结构:输入、计算、输出程序范型:程序中的通用计算模式自顶向下逐步求精先整体后局部首先从整体考虑问题,将其分割成多个逻辑上相互独立的部分,分别一一实现,最后再按照某种方法组装起来功能分解并不总能一步到位,采用逐步求精方法,首先获得一些相互独立的部分,然后进行进一步的功能分解本章小结结构化的意义使程序结构更清晰,提高了程序的可靠性、可读性与可维护性三种控制结构:顺序结构、分支结构与循环结构顺序结构:由一组顺序执行的语句序列构成分支结构:if语句与switch语句,break语句循环结构:while循环与for循环,break语句与continue语句零碎知识点枚举类型、用户自定义类型、条件表达式、关系表达式、逻辑表达式和递增递减表达式结构化程序设计方法自顶向下逐步求精先整体后局部更易于把握事物的本质作业第84页:习题二第2、3小题第85页:习题二第9小题计算机程序设计基础第三章函数提纲3.1函数声明与调用3.2函数定义3.3函数调用规范3.4程序的结构化与模块化3.5程序测试与代码优化本章小结3.1函数声明与调用函数调用主调(客户)函数与被调(服务器)函数函数调用时的参数与返回值例一:printf("%2d",i);例二:n=GetIntegerFromKeyboard();函数原型函数的实现与调用格式说明:作为函数接口一般出现在头文件中格式:函数返回值类型函数名称(形式参数列表);例一:intAdd(intx,inty);例二:voidSwap(intx,inty);例三:voidCompute();3.2函数定义函数实现函数定义,使用编程语言给出函数的执行步骤函数返回值函数完成后带回来的结果主调函数可以使用谓词函数返回BOOL类型值的函数表达某项任务是否完成或某个条件是否满足Add函数编写函数Add,求两个整数之和intAdd(intx,inty){intt;t=x+y;returnt;}Compare函数编写函数Compare,比较两个整型数据x、y的大小。若x等于y返回0,若x大于y返回1,若x小于y返回-1intCompare(intx,inty){intt;if(x==y)t=0;elseif(x>y)t=1;elset=-1;returnt;}Swap函数编写函数Swap,互换两个整型数据x、y的值void
Swap(intx,inty){intt;t=x;x=y;y=t;return;//
因函数没有返回值,只需直接列写return语句}多条return语句编写函数Compare,比较两个整型数据x、y的大小。若x等于y返回0,若x大于y返回1,若x小于y返回-1//
允许函数中包含多条return语句//函数在执行到第一条return语句后终止intCompare(intx,inty){if(x==y)return0;elseif(x>y)
return1;elsereturn-1;}谓词函数编写函数IsLeapYear,判断某个给定年份是否为闰年BOOLIsLeapYear(intyear){returnyear%4==0&&year%100!=0||year%400==0;}3.3函数调用规范函数调用示例参数传递机制函数调用栈框架函数的嵌套调用函数调用示例编写程序将用户输入的两个整数相加,要求尽可能使用函数将程序中的操作独立出来#include<stdio.h>#include"zylib.h"voidPrintWelcomeInfo();intGetInteger(STRINGprompt);intAdd(intx,inty);intmain(){inta,b,sum;PrintWelcomeInfo();
a=GetInteger("Thefirstnumber:");b=GetInteger("Thesecondnumber:");sum=Add(a,b);printf("Thesumis%d.\n",sum);return0;}函数调用示例voidPrintWelcomeInfo(){printf("Theprogramgetstwointegers,andprintstheirsum.\n");}intGetInteger(STRINGprompt){intt;printf("%s",prompt);t=GetIntegerFromKeyboard();returnt;}intAdd(intx,inty){intt;t=x+y;returnt;}参数传递机制形式参数在函数调用时才分配存储空间,并接受实际参数的值实际参数可以为复杂的表达式,在函数调用前获得计算形式参数与实际参数可同名,也可不同名参数较多时,实际参数值逐一赋值,它们必须保持数目、类型、顺序的一致值的复制过程是单向不可逆的,函数内部对形式参数值的修改不会反映到实际参数中去函数参数一般为函数输入集的一部分,函数输出集一般使用返回值表示,只有使用特殊的手段才可以将函数参数作为函数输出集的一部分函数调用栈框架absummain首次调用GetInteger函数前函数调用栈框架"Thefirstnumber:"prompttGetInteger首次调用GetInteger函数,数据输入前函数调用栈框架"Thefirstnumber:"10prompttGetInteger首次调用GetInteger函数,数据输入后函数调用栈框架main"Thefirstnumber:"10prompttGetInteger首次调用GetInteger函数,数据输入后函数调用栈框架10absummain首次调用GetInteger函数结束函数调用栈框架main"Thesecondnumber:"20prompttGetInteger再次调用GetInteger函数,数据输入后函数调用栈框架1020absummain再次调用GetInteger函数结束函数调用栈框架调用Add函数main1030xtAdd20y函数调用栈框架102030absummain调用Add函数结束,结果为30整数互换示例第一版编写程序将用户输入的两个整数互换#include<stdio.h>#include"zylib.h"voidPrintWelcomeInfo();intGetInteger(STRINGprompt);voidSwap(intx,inty);intmain(){inta,b;
/*输入部分*/PrintWelcomeInfo();a=GetInteger("Thefirstnumber:");b=GetInteger("Thesecondnumber:");
/*数据处理与输出部分*/printf("Inmain():a:%d;b:%d\n",a,b);Swap(a,b);printf("Inmain():a:%d;b:%d\n",a,b);return0;}整数互换示例第一版voidPrintWelcomeInfo(){printf("Theprogramgetstwointegers,andtriestoswapthem.\n");}intGetInteger(STRINGprompt){intt;printf("%s",prompt);t=GetIntegerFromKeyboard();returnt;}voidSwap(intx,inty){intt;printf("InSwap():x:%d;y:%d\n",x,y);t=x;x=y;y=t;printf("InSwap():x:%d;y:%d\n",x,y);return;}整数互换程序栈框架1020abmain调用Swap函数前整数互换程序栈框架调用Swap函数,数据互换前main10xtSwap20y整数互换程序栈框架调用Swap函数,数据互换后main2010xtSwap10y整数互换程序栈框架1020abmain调用Swap函数后整数互换示例第二版编写程序将用户输入的两个整数互换#include<stdio.h>#include"zylib.h"inta,b;
/*全局数据对象声明,以保证所有函数都可以访问这两个数据对象*/voidPrintWelcomeInfo();intGetInteger(STRINGprompt);voidSwap();
/*不再需要函数参数*/intmain(){/*输入部分*/PrintWelcomeInfo();a=GetInteger("Thefirstnumber:");b=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人力资源管理顾问合同范本
- 度宣传册设计与加工合同
- 共有产权住房合同
- 房屋买卖合同范本:个人住宅版
- 农村近郊租赁合同模板大全
- 10清新空气是个宝 是什么污染了空气(教学设计)-2023-2024学年道德与法治二年级下册统编版
- 采购供应链管理合同
- 设备租赁合同示范合同范文
- Module 4 Unit 10 Wind (教学设计)-2024-2025学年沪教牛津版(深圳用) 英语五年级上册
- 软件开发合作合同(二)
- 《学习地图》课件
- 《地区智能电网调度技术支持系统应用功能规范》
- 框架借款协议书(2篇)
- 物业防恐防暴演练课件
- DB12-T 3034-2023 建筑消防设施检测服务规范
- 销售人员岗位职责培训
- 2024-2025学年九年级化学人教版上册检测试卷(1-4单元)
- 2024年辽宁省鞍山岫岩满族自治县事业单位招聘(150人)历年高频难、易错点500题模拟试题附带答案详解
- 护理质控护士竞聘
- 《井中分布式光纤声波传感数据采集规程》标准报批稿
- 人音版 音乐 八年级下册 第一单元 我和你教案
评论
0/150
提交评论