




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C程序设计计算机根底教研室4/30/202314第四章选择结构程序设计
4/30/202324.1关系运算符、逻辑运算符、条件运算符本章将着重讨论利用选择控制实现选择结构程序设计。选择控制是指根据指定的条件是否满足,选择下一步要执行的语句。满足为真,不满足为假。对于条件的描述,最为常见的就是关系表达式。其一般形式:
4.2.1关系运算符和关系表达式操作数关系运算符 操作数每个操作数可以是变量、常量或者是任意有效的C语言表达式。4/30/20233大于 a>b大于等于 a>=b小于a<b小于等于 a<=b等于 a==b不等于 a!=b6种关系运算符:
关系表达式只能产生两个数值之一:0或1。一个判定为真的关系表达式的值为1;一个判定为假的关系表达式的值为0。
C语言中,逻辑值真为1;逻辑值假为0。
4/30/20234字符数据同样可以用关系运算符比较,比较的依据是其所用代码的数值。例如比较ASCII码的字符: 表达式‘a’==‘A’的值为0 表达式‘A’>‘C’的值为0 表达式‘C’<‘a’的值为14/30/20235逻辑运算符将其操作数视为逻辑值,即“真〞或“假〞。而C语言对于操作数真假的判定采取了如下原那么:
4.2.2逻辑运算符和逻辑表达式三种逻辑运算符:逻辑非 !a逻辑与 a&&b逻辑或 a||b高低C语言中,任意非零值为逻辑值真;零为逻辑值假。
4/30/20236条件运算符〔?〕是C语言中惟一的一个三目运算符,其表达式的一般形式:
4.2.2条件运算符和条件表达式操作数1?操作数2
:操作数3y=x>=60?‘P’:‘F’4/30/20237C语言提供两种选择控制语句:if语句switch语句。
4.3选择结构的程序设计所有程序的正常执行次序通常都是顺序的。然而,在许多问题的解决方案中,常会根据情况的不同,采取不同的处理方式。4/30/20238if〔表达式〕 语句Aelse 语句B
4.3.1if语句if语句的一般形式:
表达式?语句A语句B真(非0)假(0)表达式?表达式A:表达式B4/30/20239else子句,是可选的。当无else子句时的if语句形式为:
if〔表达式〕 语句表达式?语句真(非0)假(0)4/30/202310例4.1从键盘读入两个整数,然后显示这两个数的商。P81#include<stdio.h>voidmain(){ inta,b; printf("Entertwonumbers(separateby,):"); scanf("%d,%d",&a,&b);
if
(b)
printf("a/b=%d\n",a/b);
else printf("Cannotdividebyzero.\n");}4/30/202311多分支问题:写一个程序完成以下功能:1)输入一个分数score2)score<60输出E3)60<=score<70输出D4)75<=score<80输出C5)80<=score<90输出B6)90<=score输出A4/30/202312一个常用的嵌套if语言构成多分支选择结构,也称为if-else-if阶梯,其一般形式如下:if〔表达式1〕 语句1elseif〔表达式2〕 语句2elseif〔表达式3〕 语句3......else语句n4/30/202313#include<stdio.h>voidmain(){intscore;scanf(“%d〞,&score);if(score<0||score>100)printf(“Error!〞);elseif(0<=score<60) printf(“E\n〞);elseif(60<=score<70) printf(“D\n〞);elseif(70<=score<80)printf(“C\n〞);elseif(80<=score<90) printf(“B\n〞);else printf(“A\n〞);}程序是否正确?4/30/202314if语句中的表达式:关系表达式逻辑表达式任意数值类型的表达式。执行语句:一条简单语句空语句复合语句嵌套其它流程控制语句。4/30/202315
4.3.1switch语句switch〔表达式〕{case常量1:语句序列1 break;case常量2:语句序列2 break;case常量3:语句序列3 break;......default:语句序列n}可选
可选
4/30/202316switch〔i〕
{case1:printf〔″A\n″〕;case2:printf〔″B\n″〕;case3:printf〔″C\n″〕;default:printf〔″E\n″〕;case4:printf〔″D\n″〕;
}看下面的例子:假设i=3时,那么会从i=3时做起的语句。运行结果为:
C
D
E如果给每条语句加上break;break;break;break;break;这样就只执行一条语句i=3时,运行结果为:Cbreak:跳出switch语句。语句后加或不加“break;〞可以使多分支变得非常灵活。4/30/202317注意:P80表达式:通常是数字型或字符型,表达式的值,称为开关值。各个case后常量表达式的值必须互不相同;default语句可以在switch语句中的任意位置,不影响执行结果。case后面的语句可以是多条语句,也可以是复合语句,还可以是空语句。4/30/202318编程:根据输入的学生的成绩判断等级。当成绩score≥90时为A等;成绩80≤score<90为B等;成绩60≤score<70为D等;成绩score<60为E等(score为整数)。分析:score为整型数(如不是可强制转换),在score≥90的范围内,score可能取100,99,.....,90,利用两个整数相除,结果自动取整的特性,score和score/10有如下对应关系:
scorescore/10
≥9010,980~89870~79760~69660以下default因此,可以用score/10的值来确定分支。使用if语句4/30/202319#include<stdio.h>voidmain()/*用switch语句评级*/{intscore;scanf(“%d",&score);if(score<0||score>100)printf(“Error!〞);switch(score/10) {case10: case9:printf(“%f:A\n〞,score);break; case8:printf(“%f:B\n〞,score);break; case7:printf(“%f:C\n〞,score);break; case6:printf(“%f:D\n〞,score);break; default:printf("%f:E\n",score);}}4/30/202320switch语句可以作为另一个switch语句中语句序列的一部份,形成嵌套switch语句。这时,即使内外层的常量相同,也不会引起冲突。例如:switch(x){case1:printf(“process(x,y)\n〞); switch(y){ case0:printf(“Dividedby0error!\n〞); break; case1: process(x,y); } break;case2: ……}4/30/202321例4.2从键盘读入年份,然后判断该年是否为闰年。符合以下条件之一的年份都是闰年:能被400整除的年份;不能被100整除,但可以被4整除的年份。4.3选择结构程序设计举例4/30/202322#include<stdio.h>voidmain(){ intyear,leap; printf("Enteryear:"); scanf("%d",&year); if(year%400==0||(year%4==0&&year%100!=0)) leap=1; /*是闰年*/ else leap=0; if(leap) printf("%disaleapyear.\n",year); else printf("%disnotaleapyear.\n",year);}4/30/202323例4.3企业发放的奖金根据利润提成。利润(I)不超过10万元时,奖金可提10%;利润不超过20万元时,其中的10万元按10%提成,高于10万元的局部提成7.5%;20万到40万元,其中的20万元按前述b方法提成,高于20万元的局部提成5%;40万到60万元,其中的40万元按前述c方法提成,高于40万元的局部提成3%;60万到100万元,其中的60万元按前述d方法提成,高于60万元的局部提成1.5%;高于100万元时,其中的100万元按前述e方法提成,超过100万元的局部提成1%。从键盘输入当月利润I,求应发放奖金总数?4/30/202324#include<stdio.h>voidmain(){ longinti; intbonus1,bonus2,bonus4,bonus6,bonus10,bonus; printf("Enterprofitearned:"); scanf("%ld",&i);
bonus1=100000*0.1; bonus2=bonus1+100000*0.075;
bonus4=bonus2+200000*0.05; bonus6=bonus4+200000*0.03; bonus10=bonus6+400000*0.015;4/30/202325if(i<=100000) bonus=i*0.1; elseif(i<=200000) bonus=bonus1+(i-100000)*0.075; elseif(i<=400000) bonus=bonus2+(i-200000)*0.05; elseif(i<=600000) bonus=bonus4+(i-400000)*0.03; elseif(i<=1000000) bonus=bonus6+(i-600000)*0.015;
else bonus=bonus10+(i-1000000)*0.01;
printf("bonus=%d\n",bonus);}4/30/202326例4.4输入某年某月某日,判断这一天是这一年的第几天?解析:以2000年4月8日为例,应该先把前三个月的天数加起来,然后再加上8天即本年的第几天。遇闰年情况,且输入月份大于3时需要多加一天。4/30/202327#include<stdio.h>voidmain(){ intday,month,year,sum,leap; printf("\npleaseinputyear,month,day\n"); scanf("%d,%d,%d",&year,&month,&day); switch(month)/*先计算某月以前月份的总天数*/ { case1:sum=0;break; case2:sum=31;break; case3:sum=59;break; /*二月按28天计*/ case4:sum=90;break; case5:sum=120;break; case6:sum=151;break; case7:sum=181;break; case8:sum=212;break; case9:sum=243;break; case10:sum=273;break; case11:sum=304;break; case12:sum=334;break; default:printf("monthdataerror"); }4/30/202328sum=sum+day; /*再加上某天的天数*/
if(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/ leap=1; else leap=0; if(leap==1&&month>2)/*如果是闰年且月份大于2,总天数应该再加一天*/ sum++; printf("Itisthe%dthdayoftheyear.\n",sum);}4/30/202329第四章小结C语句可分为控制语句、表达式语句及复合语句。C语言中,逻辑真值为1;逻辑假值为0。C语言中,将非零值判定为逻辑真;将零值判断为逻辑假。关系、逻辑、条件运算符的优先级及结合性,其表达式的意义及应用。if语句用于实现单路、两路和多路分支。switch也是多项选择一的分支语句,它是if语句的一个补充〔elseif结构〕,当用它编制程序时会增加可读性。使用if语句及switch语句进行选择结构程序设计。4/30/202330作业1、教材P85:1~4(做在书上)2、教材P86:5,6,7,9(做在作业本上)3、教材P86:8,10(选做)4、预习实验指导书P35:实验4,55、预习教材P88~P974/30/2023311.阅读以下程序,结果是#include<stdio.h>voidmain(){inta=5,b=0,c=0;if(a=b+c)printf("***\n");elseprintf("###\n");}A:语法有错误,不能编译B:输出***C:通过编译,但不能连接D:输出###答案:D本章练习4/30/2023321.在if(条件)语句执行时,当条件为时C语言认为是“真〞;A:TRUE;B:.T.C:0D:非零值2.设inta,b,c;且a=10;b=4;a/=b;那么表达式〔a/b?b+a:b-a〕之值是;A:1.5B:6;C:2;D:-23.设intx,a,b,c;计算表达式x=(a=4,b=16,c=32)后,x的值是;A:4B:16C:32D:52DCC本章练习4/30/2023334.intn=97;switch(n/10-4){case2:n=n+1;case3:n=n*2;case5:n=n-2;case7:n=n+3;break;default:n=n/2;}n的正确结果值是________A:95B:96C:97D:98答案:D本章练习4/30/2023345.阅读以下程序,结果是#include<stdio.h>voidmain(){inta=5,b=0,c=0;if(a=b+c)printf("***\n");elseprintf("###\n");}A:语法有错误,不能编译B:输出***C:通过编译,但不能连接D:输出###6.对于表达式53/2&&!0和!(15>3||5<6-8)的逻辑值,分别是;A:0,1B:1,0C:0,0;D:1,1DB本章练习4/30/2023357.#include“stdio.h〞voidmain(){charch;scanf("%c",&ch);if(ch>=’B’&&ch<’M’)putchar(ch+32);elseputchar(ch);}输入h,运行结果为:______输入M,运行结果为:______输入T,运行结果为:______hMT本章练习4/30/2023368.表达式18/4*sqrt(4.0)/8值的数据类型是;A:intB:不确定C:floatD:double9.假设有以下说明语句,chars=‘\092’;那么该S的值是_________A:包含1个字符;B:说明不合法,s值不确定;C:包含4个字符;D:包含3个字符;CB本章练习4/30/20233710执行以下程序段后,变量i的正确结果是______inti=10;switch(i){case9:i+=1;case10:i+=1;case11:i+=1;case12:i+=1;}A、10B、11C、12D、13D4/30/202338补充:现要根据学生的成绩,将学生划分为A、B、C、D、E五个等级,其对应的关系已用if语句写出如下〔其中整型变量result存放学生成绩,字符型变量grade存放学生等级〕:if(result<60)grade=‘E’;elseif(result<70)grade=‘D’;elseif(result<80)grade=‘C’;elseif(result<90)grade=‘B’;elseif(result<100)grade=‘A’;现要将上述关系写成switch语句如下,请在下划线处填入正确内容:switch(______________){case6:grade=‘D’;break;case7:grade=‘C’;break;case8:grade=‘B’;break;case9:case10:grade=‘A’;break;____________:grade=‘E’;}result/10default4/30/202339以下程序的功能是:判断从键盘输入的年份是否是闰年。判断闰年的方法是:能被4整除但不能被100整除,或能被400整除,请填空完成该程序。#include<stdio.h>voidmain(){intx,i;scanf(%d〞,&x);if(x%400==0)i=1;elseif(_______________________)i=1;else______________;if(i==1)printf(“Thisyearisaleapyear〞);if(i==0)printf(“Thisyearisnotaleapyear〞);}x%4==0&&x%100!=0i=0End4/30/2023405第五章循环程序设计
4/30/202341
在C语言中可用以下语句构成循环:
if…gotowhiledo…whilefor其中if…goto是通过编程技巧(if语句和goto语句组合)构成循环功能。而且goto语句将影响程序流程的模块化,使程序可读性变差,所以结构化程序设计主张限制goto语句的使用。其他三种语句是C语言提供的循环结构专用语句。4/30/202342循环结构两大要素:循环条件p结束循环的条件表达式循环体
A
循环执行的语句或语句组设置循环条件要特别注意确定:循环变量的初值循环变量的终值循环变量的变化规律名词解释无限循环死循环名词解释空循环4/30/202343【例二】main(){intn=0,sum=0;loop:if(sum>=10000)gotoend;sum+=n;++n;gotoloop;end:printf(“n=%d\n〞,n);}直到型当型1、if…goto语句循环结构【例一】main(){intn=0,sum=0;loop:sum+=n;++n;if(sum<=10000)gotoloop;printf(“n=%d\n〞,n);}4/30/2023442、while语句循环结构【例三】main(){intn=0,sum=0;while(sum<=10000){sum+=n;++n;}printf(“n=%d\n〞,n);}当型一般形式while(条件表达式)循环体;用于构成当型循环:先判断后执行/条件为真继续循环,直到条件为假时结束循环。【注意】条件表达式或循环体内应有改变条件使循环结束的语句,否那么可能陷入“死循环〞。4/30/2023453、do…while语句循环结构
【例四】main(){intn=0,sum=0;do{sum+=n;++n;}while(sum<=10000)printf(“n=%d\n〞,n);}一般形式do{循环语句〔组〕}while〔条件表达式〕;用于构成直到型循环:先执行后判断/条件为真继续循环,直到条件为假时结束循环。【注意】条件表达式或循环体内同样应有改变条件使循环结束的语句,否那么可能陷入“死循环〞。直到型直到sum超过10000为止4/30/202346【例五】从键盘输入一个整数12456,分析以下程序运行结果。main(){intnum,c;
printf(“请输入一个整数:“);scanf(“%d〞,&num);do{c=num%10;printf(“%d〞,c);}while((num/=10)>0);printf(“\n〞);}
/*取得num的个位数*/
/*输出num的个位数*/
/*直到num/10为0*/
结果:
65421将各位数字反序显示出来3、do…while语句循环结构例如4/30/2023474、for语句循环结构一般形式for(表达式1;条件表达式;表达式3)循环语句〔组〕;用于构成计数型当型循环:先判断后执行/条件为真继续循环,直到条件为假时结束循环。表达式1:整个循环中只执行1次,常用来对循环变量设置初值条件表达式〔表达式2〕:其值为真〔非0〕时继续执行循环语句〔组〕,否那么结束循环表达式3:常用于循环变量值的更新(循环体的一局部每次循环语句组执行完后执行一次)【例六】求∑i=1+2+3+4…+99+100(i=1~100)main(){inti,s=0;for(i=1;i<=100;i++)s=s+i;printf(“Sum=%d\n〞,s);}4/30/2023485、其他循环控制结构main(){inta,y;a=10,y=0;
do{
a+=2;y+=a;if(y>50)break;
}while(a=14);printf("a=%d,y=%d\n",a,y);}结果:a=16,y=60
变量跟踪ay10012 1212+212+14=2614+216+26=4216+216+42=5变量跟踪分析法break结束循环在switch中退出switch结构;在循环中结束循环。continue结束本次循环循环“短路〞(跳过循环体后面的语句,开始下一轮循环)。goto跳转跳到循环体外指定标号处。【注意】goto语句只能从循环内向外跳转,反之不可!根底系4/30/2023495、其他循环控制结构break结束循环在switch中退出switch结构;在循环中结束循环。continue结束本次循环循环“短路〞(跳过循环体后面的语句,开始下一轮循环)。goto跳转跳到循环体外指定标号处。【注意】goto语句只能从循环内向外跳转,反之不可!根底系求以下程序段执行后x和i的值。inti,x;for(i=1,x=1;i<=50;i++){if(x>=10)break;if(x%2==1){x+=5;
continue;}x-=3;}结果:x的值为10,i的值为6
变量跟踪ix
11→626→333→848→555→1064/30/2023505、其他循环控制结构break结束循环在switch中退出switch结构;在循环中结束循环。continue结束本次循环循环“短路〞(跳过循环体后面的语句,开始下一轮循环)。goto跳转跳到循环体外指定标号处。【注意】goto语句只能从循环内向外跳转,反之不可!main(){inti=1;
while(i<=15)if(++i%3!=2)
continue;elseprintf("%d",i);printf("\n");}结果:2581114
变量跟踪
i++i%3输出i
1→2222→303→414→5255→60……4/30/2023515、其他循环控制结构break结束循环在switch中退出switch结构;在循环中结束循环。continue结束本次循环循环“短路〞(跳过循环体后面的语句,开始下一轮循环)。goto跳转跳到循环体外指定标号处。【注意】goto语句只能从循环内向外跳转,反之不可!main(){inti,k=0;for(i=1;;i++){k++;
while(k<i*i){k++;if(k%3==0)
goto
loop;
}}
loop:printf("%d,%d",i,k);}结果:2,3
4/30/202352循环常用算法1、枚举法〔穷举法〕“笨人之法〞:把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。【例一】百元买百鸡:用一百元钱买一百只鸡。公鸡5元/只,母鸡3元/只,小鸡1元/3只。分析:这是个不定方程——三元一次方程组问题〔三个变量,两个方程〕x+y+z=1005x+3y+z/3=100设公鸡为x只,母鸡为y只,小鸡为z只。4/30/202353百元买百鸡问题分析4/30/202354main(){intx,y,z;for(x=0;x<=100;x++)for(y=0;y<=100;y++)for(z=0;z<=100;z++){if(x+y+z==100&&5*x+3*y+z/3.0==100)
printf("cocks=%d,hens=%d,chickens=%d\n",x,y,z);}}结果:x=0,y=25,z=75x=4,y=18,z=78x=8,y=11,z=81x=12,y=4,z=84【讨论此为“最笨〞之法——要进行101×101×101=1030301次〔100多万次〕运算。百元买百鸡问题分析4/30/202355百元买百鸡问题分析main(){intx,y,z;for(x=0;x<=100;x++)for(y=0;y<=100;y++){
z=100-x-y;if(5*x+3*y+z/3.0==100)printf(“cocks=%d,hens=%d,chickens=%d\n",x,y,z);}}【讨论】令z=100-x-y只进行101×101=10201次运算〔前者的1%〕取x<=19,y<=33只进行20×34=680次运算〔第1种运算的6.7%〕4/30/202356【例二】雨水淋湿了算术书的一道题,8个数字只能看清3个,第一个数字虽然看不清,但可看出不是1。编程求其余数字是什么?
[□×〔□3+□〕]2=8□□9分析设分别用A、B、C、D、E五个变量表示自左到右五个未知的数字。其中A的取值范围为2~9,其余取值范围为0~9。条件表达式即为给定算式。4/30/202357main(){intA,B,C,D,E;for(A=2;A<=9;A++)for(B=0;B<=9;B++)for(C=0;C<=9;C++)for(D=0;D<=9;D++)for(E=0;E<=9;E++)if(A*(B*10+3+C)*A*(B*10+3+C)==8009+D*100+E*10)printf(“%2d%2d%2d%2d%2d\n〞,A,B,C,D,E);}结果:32864
【例二】雨水淋湿了算术书的一道题,8个数字只能看清3个,第一个数字虽然看不清,但可看出不是1。编程求其余数字是什么?
[□×〔□3+□〕]2=8□□94/30/202358【例三】
求100~200之间不能被3整除也不能被7整除的数。
分析:求某区间内符合某一要求的数,可用一个变量“穷举〞。所以可用一个独立变量x,取值范围100~200。for(x=100;x<=200;x++) if(x%3!=0&&x%7!=0)printf(“x=%d\n〞,x);如果是求指定条件的奇数呢?
如果是求指定条件的偶数呢?
x=101;x<=200;x=x+2
x=100;x<=200;x=x+2
4/30/2023592、归纳法〔递推法〕“智人之法〞:通过分析归纳,找出从变量旧值出发求新值的规律。【例一】编程求∑i=1+2+3+4…+99+100(i=0~100)分析
i=0
S0=0(初值)
i=1
S1=0+1=S0+1i=2
S2=1+2=S1+2i=3
S3=1+2+3=S2+3i=4
S4=1+2+3+4=S3+4
………i=nSn=1+2+3+4+…+n=Sn-1+n4/30/202360【例一】编程求∑i=1+2+3+4…+n(n≤100)程序:main(){inti,n,s=0;printf("n=");scanf("%d",&n);for(i=1;i<=n;i++)s=s+i;printf("Sum=%d\n",s);}运行结果:n=100Sum=5050如果是∑i=1+1/2+1/3+…+1/n
呢?4/30/202361算法类型小结:累加型【累加型】类型诸如
□+□+□+□+……+□+□求其前n项之和的编程题。累加型算法假设设i为循环变量,s为前n项累加之和,那么程序的根本结构为:s=0;for(i=1;i<=n;i++)s=s+□;4/30/202362【例二】
编程求1-1/2+1/3-1/4+1/5-…+1/99-1/100分母为奇数时,相加分母为偶数时,相减法1:从变化规律分析……程序:main(){inti;floats=0;for(i=1;i<=100;i++)if(i%2)s=s+1/i;elses=s-1/i;printf("Sum=%f\n",s);}运行结果:Sum=1.000000错在哪里?4/30/202363【例二】
编程求1-1/2+1/3-1/4+1/5-…+1/99-1/100法2:这是个累加型算法的编程题……程序:#include<math.h>main();{inti;floats=0;for(i=1;i<=100;i++)s=s+pow(-1,i+1)/i;printf("Sum=%f\n",s);}
程序:#include<math.h>main(){inti,k=1;floats=0;for(i=1;i<=100;i++){s=s+
k/i;k=-k;}printf("Sum=%f\n",s);}累加型算法程序根本结构为:
s=0;for(i=1;i<=n;i++)s=s+□;错在哪里?(如何检查程序错误?)运行结果:Sum=0.688172运行结果:Sum=1.0000004/30/202364【例三】编程求n!〔n由键盘输入〕分析
i=0
S0=
1=S0(初值)
i=1
S1=0×1=S0×1i=2
S2=1×2=S1×2i=3
S3=1×2×3=S2×3i=4
S4=1×2×3×4=S3×4
………i=nSn=1×2×3×4×…×n=Sn-1×n4/30/202365【例三】编程求n!〔n由键盘输入〕程序:main(){inti,n,s=1;printf("n=");scanf("%d",&n);for(i=1;i<=n;i++)s=s*i;printf("Sum=%d\n",s);}运行结果:n=5Sum=120运行结果:n=8Sum=-25216Why?4/30/202366算法类型小结:阶乘型【阶乘型】类型诸如
□×□×□×□×……×□×□求其前n项之积的编程题。阶乘型算法假设设i为循环变量,s为前n项相乘之积,那么程序的根本结构为:s=1;for(i=1;i<=n;i++)s=s*□;4/30/202367【例四】
编程求∑i!=1!+2!+3!…+n!〔n由键盘输入〕外循环为累加型内循环为阶乘型法1:从变化规律分析……程序:main(){inti,j,n;floats,s1;
printf("请输入n=");scanf("%d",&n);
s=0;for(i=1;i<=n;i++){
s1=1;
for(j=1;j<=i;j++)s1=s1*j;s=s+s1;}
printf("Sum=%.0f\n",s);}运行结果:n=5Sum=153/*如果n值较大,可改为printf(“Sum=%e\n〞,s);*/4/30/202368【例四】
编程求∑n!=1!+2!+3!…+n!〔n由键盘输入〕在同一个循环中先阶乘,后累加法2:通过单循环实现……程序:main(){inti,n;floats,s1;
printf("请输入n=");scanf("%d",&n);s=0,s1=1;for(i=1;i<=n;i++){s1=s1*i;s=s+s1;}printf("Sum=%.0f\n",s);}运行结果:n=5Sum=1534/30/202369【例五】
兔子繁殖问题〔斐波那契数列问题〕
著名意大利数学家斐波那契〔Fibonacci〕1202年提出一个有趣的问题。某人想知道一年内一对兔子可以生几对兔子。他筑了一道围墙,把一对大兔关在其中。每对大兔每个月可以生一对小兔,而每对小兔出生后第三个月即可成为“大兔〞再生小兔。问一对小兔一年能繁殖几对小兔?分析:▲表示大兔,△表示小兔由分析可以推出,每月新增兔子数Fn={1,1,2,3,5,8,13,21,34,…}〔斐波那契数列〕月份n兔子数Fn1F1=12F2=13F3=2=F1+F24F4=3=F2+F35F5=5=F3+F4…nFn=Fn-1+Fn-24/30/202370【例五】例5.12
兔子繁殖问题〔斐波那契数列问题〕main(){intf1=1,f2=1,f,i,s,n;clrscr();printf("请输入月数:");scanf("%d",&n);for(s=2,i=3;i<=n;i++){f=f1+f2;s=s+f;f1=f2;f2=f;}printf("%d个月的兔子数是%d\n",n,s);}4/30/202371【例六】编程显示以以下图形〔共N行,N由键盘输入〕。*************************此类题目分析的要点是:通过分析,找出每行空格、*与行号i、列号j及总行数N的关系。其循环结构可用右图表示。分析:〔设N=5〕第1行4个空格=5-11个“*〞=2*行号-1第2行3个空格=5-23个“*〞=2*行号-1第3行2个空格=5-35个“*〞=2*行号-1第4行1个空格=5-47个“*〞=2*行号-1第5行0个空格=5-59个“*〞=2*行号-1由此归纳出:第i行的空格数N-i个;第i行的“*〞数是2i-1个。4/30/202372【例六】main(){inti,j,N;clrscr();printf("请输入N=");scanf("%d",&N);for(i=1;i<=N;i++){for(j=1;j<=N-i;j++)printf("");for(j=1;j<=2*i-1;j++)printf("*");printf("\n");}}
*************************4/30/202373除了以上例题,要求根据教材掌握:1、求按指定精度近似值问题〔例6.6〕2、判断一个数是否素数问题〔例6.8〕3、密码问题〔例6.10〕4/30/202374判断一个数是否素数问题〔例6.8另一种解法〕#include<math.h>main(){intm,k,i;clrscr();printf("x=");scanf("%d",&m);for(i=2;i<m-1;i++)if(m%i==0){printf("%disnotaprimenumber\n",m);exit(0);}printf("i=%d,%disaprimenumber\n",i,m);}把i<m-1改为i<sqrt(m-1)比较i的值4/30/202375小结循环是一组语句,计算机反复执行这组语句直到满足终止条件为止。while,do….while和for三种循环语句可以相互转化。for适用于循环次数的循环。while先判定循环条件,可能一次都不执行循环体。do…while后判定循环条件,至少保证执行一次循环体。while和do…while中都有改变循环控制变量的语句。可以通过循环变量来控制循环,在循环体中通过条件判定产生中间跳转的方法,终止循环。4/30/202376第六章数组构造数据类型之一数组:有序数据的集合,用数组名标识元素:属同一数据类型,用数组名和下标确定6.1
一维数组一维数组的定义定义方式:数据类型数组名[常量表达式];
合法标识符表示元素个数下标从0开始[]:数组运算符单目运算符优先级(1)左结合不能用()例inta[6];a[0]0145a[1]a[2]a[3]a[4]a[5]23a编译时分配连续内存内存字节数=数组维数*sizeof(元素数据类型)数组名表示内存首地址,是地址常量4/30/202377一维数组的引用数组必须先定义,后使用只能逐个引用数组元素,不能一次引用整个数组数组元素表示形式:数组名[下标]其中:下标可以是常量或整型表达式例inti=15;intdata[i];(不能用变量定义数组维数)例inta[10];printf(“%d〞,a);()必须for(j=0;j<10;j++)printf(“%d\t〞,a[j]);()例intdata[5];data[5]=10;//C语言对数组不作越界检查,使用时要注意4/30/202378一维数组的初始化初始化方式
在定义数组时,为数组元素赋初值(在编译阶段使之得到初值〕inta[5]={1,2,3,4,5};等价于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;说明:数组不初始化,其元素值为随机数对static数组元素不赋初值,系统会自动赋以0值当全部数组元素赋初值时,可不指定数组长度如inta[5]={6,2,3};
等价于:a[0]=6;a[1]=2;a[2]=3;a[3]=0;a[4]=0;如inta[3]={6,2,3,5,1};()staticinta[5];等价于:a[0]=0;a[1]=0;a[2]=0;a[3]=0;a[4]=0;只给局部数组元素赋初值inta[]={1,2,3,4,5,6};编译系统根据初值个数确定数组维数4/30/202379程序举例例读10个整数存入数组,找出其中最大值和最小值步骤:1.输入:for循环输入10个整数2.处理:(a)先令max=min=x[0](b)依次用x[i]和max,min比较(循环)假设max<x[i],令max=x[i]假设min>x[i],令min=x[i]3.输出:max和min#include<stdio.h>#defineSIZE10main(){intx[SIZE],i,max,min;printf("Enter10integers:\n");
for(i=0;i<SIZE;i++){printf("%d:",i+1); scanf("%d",&x[i]);}
max=min=x[0];
for(i=1;i<SIZE;i++){if(max<x[i])max=x[i];if(min>x[i])min=x[i];}printf("Maximumvalueis%d\n",max);printf("Minimumvalueis%d\n",min);}4/30/202380例用数组求Fibonacci数列前20个数f[0]f[1]f[2]f[3]f[4]f[5]f[19]……...11f[19]01452319235#include<stdio.h>main(){inti;
intf[20]={1,1};
for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++){if(i%5==0)printf("\n");printf("%12d",f[i]);}}4/30/202381例用冒泡法对10个数排序排序过程:〔1〕比较第一个数与第二个数,假设为逆序a[0]>a[1],那么交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上〔2〕对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置〔3〕重复上述过程,共经过n-1趟冒泡排序后,排序结束4/30/202382输入n个数给a[1]到a[n]forj=1ton-1fori=1ton-ja[i]>a[i+1]真假a[i]a[i+1]输出a[1]到a[n]#include<stdio.h>main(){inta[11],i,j,t;printf("Input10numbers:\n");
for(i=1;i<11;i++)scanf("%d",&a[i]);printf("\n");
for(j=1;j<=9;j++)for(i=1;i<=10-j;i++)
if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf("Thesortednumbers:\n");
for(i=1;i<11;i++) printf("%d",a[i]);}4/30/202383例用简单项选择择法对10个数排序排序过程:〔1〕首先通过n-1次比较,从n个数中找出最小的,将它与第一个数交换—第一趟选择排序,结果最小的数被安置在第一个元素位置上〔2〕再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换—第二趟选择排序〔3〕重复上述过程,共经过n-1趟排序后,排序结束4/30/202384例初始:[49386597761327]kji=11349一趟:13[386597764927]i=22738二趟:1327[6597764938]三趟:132738[97764965]四趟:13273849[769765]五趟:1327384965[9776]六趟:132738496576[97]kkkkjjjjjjjjjj4/30/202385Ch5_201.c输入n个数给a[1]到a[n]fori=1ton-1forj=i+1tona[j]<a[k]真假k=j输出a[1]到a[n]k=ia[i]a[k]i!=k真假#include<stdio.h>main(){inta[11],i,j,k,x;printf("Input10numbers:\n");
for(i=1;i<11;i++)scanf("%d",&a[i]);printf("\n");
for(i=1;i<10;i++)
{k=i;
for(j=i+1;j<=10;j++)
if(a[j]<a[k])k=j;
if(i!=k){x=a[i];a[i]=a[k];a[k]=x;}
}printf("Thesortednumbers:\n");
for(i=1;i<11;i++) printf("%d",a[i]);}4/30/202386#defineN6main(){inta[N],b[‘B’-60],c[]={1,2,3,4,5,6},i;for(i=0;i<N;i++)scanf(“%d%d〞,&a[i],&b[i]);for(i=0;i<N;i++)printf(“%d〞,a[i]);printf(“\n〞);for(i=0;i<N;i++)printf(“%d〞,b[i]);printf(“\n〞);for(i=0;i<N;i++)c[i]=a[i]+b[N-i-1];for(i=0;i<N;i++)printf(“%d〞,c[i]);}数组定义:必须用常量表达式数组元素引用Ch6_001.c4/30/2023876.2
二维数组及多维数组二维数组的定义定义方式:
数据类型数组名[常量表达式][常量表达式];数组元素的存放顺序原因:内存是一维的二维数组:按行序优先多维数组:最右下标变化最快例inta[3][4];floatb[2][5];intc[2][3][4];
inta[3,4];()行数列数元素个数=行数*列数inta[3][2]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]014523a[0][0]a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]intc[2][3][4]01234567………...20212223c[0][0][0]c[0][0][1]c[0][0][2]c[0][0][3]c[0][1][0]c[0][1][1]c[0][1][2]c[0][1][3]c[0][2][0]c[0][2][1]c[0][2][2]c[0][2][3]c[1][0][0]c[1][0][1]c[1][0][2]c[1][0][3]c[1][1][0]c[1][1][1]c[1][1][2]c[1][1][3]c[1][2][0]c[1][2][1]c[1][2][2]c[1][2][3]4/30/202388二维数组理解例inta[3][4];20161720181920202120222320089201011201213201415200012002320045200067a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]每个元素a[i]由包含4个元素的一维数组组成二维数组a是由3个元素组成a[0]a[1]a[2]行名014523a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[0][0]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[1][2]67101189a[0]a[1]a[2]4/30/202389二维数组元素的引用形式:数组名[下标][下标]二维数组元素的初始化分行初始化:例inta[2][3]={{1,2,3},{4,5,6}};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]123456全部初始化按元素排列顺序初始化例inta[2][3]={{1,2},{4}};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]120400部分初始化例inta[][3]={{1},{4,5}};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]100450第一维长度省略初始化例inta[2][3]={1,2,3,4,5,6};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]123456全部初始化例inta[2][3]={1,2,4};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]124000部分初始化例inta[][3]={1,2,3,4,5};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]123450第一维长度省略初始化4/30/2023901、一维数组的输入输出inta[5];scanf("%d",&a[0]);scanf("%d",&a[1]);scanf("%d",&a[2]);scanf("%d",&a[3]);scanf("%d",&a[4]);for(j=0;j<5;j++)scanf("%d",&a[j]);如果是:inta[1000];呢?for(j=0;j<5;j++)printf("%d",a[j]);初始化循环条件促使循环结束数组的输入输
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025设备材料购销合同范本范文
- 农业种植技术服务合作合同书
- 红楼梦课件无水印
- 工业园区租赁经营协议
- 员工培训与委托培养协议内容说明
- 工艺品设计与制作服务合同
- 业务洽谈合同条款审查模板
- 农业金融投资合作合同
- 诗人杜牧简介
- 2025年征兵考试题库及答案
- 人教版九年级上册历史期末复习知识点考点背诵提纲详细版
- 2025年广东省中考英语真题(原卷版)
- 捐资奖学金活动方案
- 非标自动化培训
- 2025年贵州省中考化学试卷真题(含答案解析)
- 高桩码头施工培训课件
- 孤独症相关培训课件
- 2025至2030中国工业混合式步进电机行业发展趋势分析与未来投资战略咨询研究报告
- 《大学体育理论与实践教程》大学体育课程全套教学课件
- 2025年电信网上大学智能云服务交付工程师认证参考试题库-上(单选题)
- 图文快印公司机器操作规程复习课程
评论
0/150
提交评论