chap3分支结构
- 格式:docx
- 大小:39.73 KB
- 文档页数:6
计算机程序设计基础(C语言)北京石油化工学院信息技术教学与实验中心2008年8月20日C语言程序设计⏹教学要求☐掌握程序设计语言的基本知识☐常用算法☐初步的程序设计能力⏹学习方法☐自主学习☐重视上机实践如何尽快学会用C语言进行程序设计⏹了解程序设计语言(C语言)⏹模仿、改写、编写⏹通过不断的编程实践,逐步领会和掌握程序设计的基本思想和方法。
教材和参考书⏹C语言程序设计,何钦铭、颜晖主编,高等教育出版社,2008⏹C语言编程(第3版),[美]Stephen, G.Kochan,张小潘译,电子工业出版社,2006⏹C语言教程(第4版),[美]Al Kelley, Ira Pohl,徐波译,机械工业出版社,2007⏹标准C语言基础教程(第4版),[美]Gary J.Bronson,单先余等译,电子工业出版社,2006 ⏹C程序设计语言,[美]Brian W. Kernighan,Dennis M. Ritchie,徐宝文等译,机械工业出版社,2006目录⏹Chap 1 引言⏹Chap 2 用C语言编写程序⏹Chap 3 分支结构⏹Chap4 循环结构⏹Chap 5 函数⏹Chap 6 数据类型和表达式目录⏹Chap 7 数组⏹Chap 8 指针⏹Chap 9 结构⏹Chap 10 函数与程序结构⏹Chap 11 指针进阶⏹Chap 12 文件Chap 1 引言⏹一个C语言程序⏹程序与程序设计语言⏹C语言的发展历史与特点⏹实现问题求解的过程本章要点⏹什么是程序?程序设计语言包含哪些功能?⏹程序设计语言在语法上包含哪些内容?⏹结构化程序设计有哪些基本的控制结构?⏹C语言有哪些特点?⏹C语言程序的基本框架如何?⏹形成一个可运行的C语言程序需要经过哪些步骤?⏹如何用流程图描述简单的算法?1.1 一个C 语言程序例1-1求阶乘问题。
输入一个正整数n ,输出n!。
#include <stdio.h> /* 编译预处理命令 */ int main (void) /* 主函数 */ {int n; /*变量定义 */ int factorial (int n); /* 函数声明 */ scanf ("%d", &n); /* 输入一个整数 */ printf (“%d \n”, factorial(n)); /* 调用函数计算阶乘 */ return 0;}int factorial (int n) /* 定义计算 n! 的函数 */ {int i, fact = 1;for(i = 1; i <= n; i++) /* 循环 */ fact = fact * i;return fact;} 输入 4 输出 24 C 程序由函数组成 有且只有一个主函数main1.2 程序与程序设计语言⏹程序☐人们为解决某种问题用计算机可以识别的代码编排的一系列加工步骤。
§3分支结构一、引入:1、输入两个时间,每个时间分别输入小时和分钟的值,然后输出两个时间之间的差,也用几小时几分表示。
(提示:转化为分钟,做整数除法和取余运算)int hour1,minute1;int hour2,minute2;scanf(“%d%d”,&hour1,&minute1);scanf(“%d%d”,&hour2,&minute2);int t1=hour1*60+minute1;int t2=hour2*60+minute1;int t=t2-t1;printf(“时间差是%d小时%d分钟”,t/60,t%60);如果不转化为分钟,而用直接减的算法,出现借位怎么办?——条件判断int hour1,minute1;int hour2,minute2;scanf(“%d%d”,&hour1,&minute1);scanf(“%d%d”,&hour2,&minute2);int ih=hour2-hour1;int im=minute2-minute1;if(im<0)//出现了借位的情况{im=60+im;ih--;}printf(“时间差是%d小时%d分钟\n”,ih,im);(dev c++调试,if(im<0)设断点查看运行机制)2、输入两个实数,按由小到大的顺序输出这两个数。
#include <stdio.h>int main(){float a,b,t;scanf("%f,%f",&a,&b);if(a>b){ //将a和b的值互换t=a;a=b;b=t;}printf("%5.2f,%5.2f\n",a,b);return 0;}二、判断的条件——关系运算,计算两个值之间的关系•用关系运算符将两个数值或数值表达式连接起来的式子,称为关系表达式。
•关系表达式的值是一个逻辑值,即“真”或“假”。
•在C的逻辑运算中,以“1”代表“真”,以“0”代表“假”。
六种关系运算符:<(小于)<= (小于等于)> (大于)>= (大于等于)== (等于)!= (不等于)•前4种关系运算符的优先级别相同,判断是否相等的==和!=比其他的低!•关系运算符的优先级低于算术运算符。
•关系运算符的优先级高于赋值运算符。
•连续的关系运算是从左到右进行的!例:printf(“%d\n”,5==3);printf(“%d\n”,5>3);printf(“%d\n”,5<=3);printf(“%d\n”,7>=3+4);int r=a>0;三、if语句的一般形式if (表达式) 语句1[ else 语句2 ]说明:“表达式”可以是关系表达式、逻辑表达式,甚至是数值表达式;方括号内的部分(即else子句)为可选的,既可以有,也可以没有语句1和语句2可以是一个简单的语句,也可以是一个复合语句,还可以是另一个if语句1、形式1 没有else子句部分if(表达式) 语句1;例:完善第一章中的找零计算器,票面不够怎么办?自行画出流程图。
int amout;int price=0,change;printf(“请输入商品金额(元):”);//输入提示scanf(“%d“,&price);printf(“请输入收款票面(元):”);//输入提示scanf(“%d“,&amount);if (amount >=price){change=amount-price;1printf(“找您%d元\n”,change);}2、形式2 有else子句部分if (表达式)语句1 ;else语句2;a、上例中,票面不够怎么办?if (amount >=price){change=amount-price;printf(“找您%d元\n”,change);}else{printf(“你的钱不够!!!”);}b、改正程序:比较两个数的大小printf(“请输入两个整数”);scanf(“%d%d”,&a,&b );int max=0;if (a>b){max=a;}printf(“大的那个是%d\n”,max);c、对比程序,哪个逻辑性更强?max =b; int max=0;if(a>b) if (a>b){max=a; {max=a;} }else{max=b;}d、思考:若if()语句后不加{},其后有多句语句,在执行的时候,执行哪一句?e、思考:若写成if(条件);{语句;},则在条件为真时花括号内的语句还能执行吗?f、补全程序:每周工作标准时间为40小时,每小时工资为22.50元,超过40小时之外的时间按1.5倍工资支付。
现在通过键盘输入工作时间,程序计算应支付的周薪水。
#include <stdio.h>int main(){double rate=22.5;//小时工资常量int standard=40;//定义周标准时间 pay=0;//声明周薪水变量int hours;print(“请输入你的周工作时间”);scanf(“%”,&hours);if (hours>standard){pay= ;}elsepay=hours*rate;printf(“应支付的周工资为%f\n”,pay);return 0;}g、输出三个整数中的最大者,分析if else的配对关系。
int a,b,c;scanf(“%d %d %d”,&a,&b,&c);int max=0;if (a>b){if (a>c){max=a;}else{max=c;}}else{if (b>c){max=b;}else{max=c;}}printf(“The max is %d\n”,max);●一般情况下,else总是和最近的那个if匹配,但是有时候会受{}的影响,结论有不同。
●缩进格式不能暗示else的匹配。
h、如果a的值是7,b的值是6,则程序的输出是?int a=7,b=6;if ( a == 6 )if ( b == 7 )printf("A");elseprintf("B");答案:若程序修改为:2int a=7,b=6;if ( a == 6 ){if ( b == 7 )printf("A");}elseprintf("B");答案:3、形式3else部分又嵌套了多层的if语句(级联)if(表达式1) 语句1;else if(表达式2) 语句2;else if(表达式3) 语句3;else if(表达式m) 语句m;else 语句m+1;例1、分段函数f(x)=-1;(x<0)0;(x=0)2x;(x>0)if (x<0){f=-1;}else if(x==0){f=0;}else{f=2*x;}例2、利用级联if-else自行书写闰年判断的程序int year;int leap=0;//是否为闰年的逻辑变量指示scanf(“%d”,&year);例3、依据考试成绩划分等级,输入一个成绩,若大于90分,输出优秀;大于80分,输出良好;大于70分,输出中等;大于60分,输出及格;小于60分,输出不及格。
int score;scanf(“%d”,&score);if (score <60) if (score>=90) printf(“不及格!”);printf(“优秀”);else if ( ) else if ( )例4、分段函数#include <stdio.h>#include <math.h>int main(){float x,y;scanf(“%f”,&x);if (x>4.6)y=1;else if (fabs(x-4.6)<1e-6)y=0;elsey=-1;printf(“x=%f,y=%f”,x,y);return 0;}注意:1)判断两个实数是否相等的条件是|a-b|<10-62)fabs为求实数的绝对值函数,abs为求整数的绝对值函数,记得加上math.h的头文件。
4、if-else的常见错误:●没有{}●if()后面多了;●==错用为=;例、对于下面的代码:int a=5,b=6;3if ( a=b );printf("%d\n", a);运行的输出是:提示:if只要求()里面表达式的值是零或非零!四、逻辑表达式1、用逻辑运算符将关系表达式或其他逻辑量连接起来的式子就是逻辑表达式。
•“&&”和“‖”是双目运算符,要求有两个运算对象(操作数);“!”是单目运算符,只要有一个运算对象•优先次序:!(非)→&&(与)→‖(或),即“!”为三者中最高的;逻辑运算符中的“&&”和“‖”低于关系运算符,“!”高于算术运算符逻辑运算结果不是0就是1,不可能是其他数值。
而在逻辑表达式中作为参加逻辑运算的运算对象可以是0(“假”)或任何非0的数值(按“真”对待)2、a && b && c,只有a为真(非0)时,才需要判别b的值。
只有当a和b都为真时才需要判别c的值。
3、a ‖ b ‖ c。
只要a为真(非0),就不必判断b和c。
只有a为假,才判别b。
a和b都为假才判别c。
例1、判别用year表示的某一年是否闰年,可以用一个逻辑表达式来表示。
闰年的条件是符合下面二者之一: ①能被4整除,但不能被100整除,如2008。
②能被400整除,如2000。
故判断闰年的条件可以用如下一句语句:if((year % 4 == 0 && year % 100 != 0) ‖ year % 400 ==0)例2、写出输出结果:#include <stdio.h>int main(){int i=1,j=2,k=3;if(i++==1&&(++j==3||k++==3))printf("i=%d,j=%d,k=%d\n",i,j,k);return 0;}若条件改为,if(i++==2&&(++j==3||k++==3)),情况怎样?继续改为if(i++==1&&(++j==2||k++==3))呢?说明:1)a && b && c。