计算机软件及应用流程控制_第1页
计算机软件及应用流程控制_第2页
计算机软件及应用流程控制_第3页
计算机软件及应用流程控制_第4页
计算机软件及应用流程控制_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

求方程的根。

算法的基本概念1算法(Algorithm)的概念:广义地讲算法是解决问题的方法和步骤,是对特定问题求解步骤的一种描述。计算机算法是用程序解决问题的逻辑步骤,是指令的有限序列。(1)自然语言【例】输入两个数,求其中的最大数。2算法的各种描述方法自然语言算法可表示如下:

(1)设两个数为x和y,最大数为z。

(2)输入两个数给x和y。

(3)如x大于或等于y,则最大数z的值等于x的值。否则,最大数z的值等于y的值。

(4)输出最大数z。

(5)结束算法。

概念:以特定的图形符号加上说明,表示算法的图,称为流程图或框图。符号及其意义:(2)用流程图表示开始/结束框一般处理框判断框输入/输出框流程框转接符输入xAx0?y=1y=-1truefalseA输出y流程图描述算法举例startend

⒈用框图描述函数

1x0y=-1x<0【例】已知三角形的3条边长,利用海伦公式,计算三角形的面积。其流程图描述如图3.1程序的基本结构

结构化程序设计是软件设计的第三次革命。结构化程序设计的基础是采用三种程序的控制结构。1966年BÖHM&Jacopini

证明:只要三种控制结构就能表达用一个入口和一个出口框图所能表达的任何程序逻辑。三种控制结构如下:⒈顺序结构Sequence算法描述:

f;g;框图:f;g;⒉选择结构Selection(分支结构)算法描述:if(e)f;elseg;框图:e?TRUEf;FALSEg;⒊循环结构Repetition⑴当型循环whilecistruedof;c?fTRUEFALSE⑵直到循环dof;untilcisfalsefc?TRUEFALSE三种控制结构有如下共同的特点:一个入口和一个出口;(程序执行路径的唯一性,结果再现性)无死语句;(每条语句都可能执行到)无死循环。(不能无限制执行,在确定的步骤结束)3.2选择结构Selection(分支结构)3.2.1if结构的三种形式⒈if及if-else的三种结构

由标准的分支结构可以演化成单分支、多分支结构。C语言的分支语句有if、if–else、switch三种。⑴if语句(单分支)格式:

if(expression)statement;语句表达式,非0为true,0为false。流程图e?statement;TRUEFALSE单分支的功能:(1)首先计算表达式的值。(2)若为真(非0),则执行“语句”;否则不执行“语句”,即跳过“语句”。(3)继续执行if语句后面的语句。【例3-1】已知x的值,求y=|x|。/*example3-1求y=|x|*/#include<stdio.h>voidmain(void){ floatx,y;/*定义实型数据*/printf("x=?"); scanf("%f",&x);/*输入实型数据*/ y=x;/*设y的初始值为x*/ if(x<0) y=-x;/*更改y的值为-x*/ printf("x=%10.4f\n",x); printf("y=%10.4f\n",y);/*输出*/}【例3-2】已知2个数,求2个数中的大数。/*example3-2求2个数中的大数*/#include<stdio.h>voidmain(void){ floatx,y,maxf;/*定义实型数据*/printf("x,y=?"); scanf("%f,%f",&x,&y);/*输入2个实型数据*/ maxf=x;/*设maxf的初始值为x*/ if(y>x) maxf=y;/*更改maxf的值为y*/ printf("x=%10.4f\n",x); printf("y=%10.4f\n",y); printf("maxf=%10.4f\n",maxf);/*输出*/}⑵if–else结构(双分支)格式:

if(expression) stat1;

else stat2;语句或复合语句。流程图:e?falsestat2;stat1;true举例:输出|x|。【例3-3】已知x的值,求y=|x|。/*example3-3求y=|x|*/#include<stdio.h>voidmain(void){ floatx,y;/*定义实型数据*/printf("x=?"); scanf("%f",&x);/*输入实型数据*/ if(x>=0) y=x;/*y的值为x*/ else y=-x;/*y的值为-x*/ printf("x=%10.4f\n",x); printf("y=%10.4f\n",y);/*输出*/}【例3-4】已知2个数,求2个数中的大数。/*example3-4求2个数中的大数*/#include<stdio.h>voidmain(void){ floatx,y,maxf;/*定义实型数据*/printf("x,y=?"); scanf("%f,%f",&x,&y);/*输入实型数据*/ if(x>=y) maxf=x;/*maxf的值为x*/ else maxf=y;/*maxf的值为y*/ printf("x=%10.4f\n",x); printf("y=%10.4f\n",y); printf("maxf=%10.4f\n",maxf);/*输出*/}【例3-5】输入1个数,判断其是奇数还是偶数/*example3-5判断数是奇数还是偶数*/#include<stdio.h>voidmain(void){ intx;/*定义整型数据*/printf("x=?"); scanf("%d",&x);/*输入整型数据*/ if(x%2==0) printf("%d是偶数",x);/*输出是偶数*/ else printf("%d是奇数",x);/*输出是奇数*/}⑶if–elseif结构(多分支)格式:

if(e1)stat1;

else

if(e2)stat2;

else

if(e3)stat3;…

else

if(en-1)statn-1;

elsestatn;

框图:e1?tstat1;fe2?tstat2;出口fen-1?tstatn-1;fstatn;n-1个条件,满足某个条件,执行对应的语句,然后到出口。if–elseif结构(多分支)的功能:(1)首先计算表达式1的值。(2)若表达式1的值为真(非0),则执行“语句1”;否则计算表达式2的值,若表达式2的值为真(非0),则执行“语句2”;……,即依次判断各个表达式的值,当遇到第1个为真的表达式,则执行其对应的语句,如果所有的表达式都是假,则执行else后面的语句,即在n种路中选择其中的一种。(3)接着继续执行if结构后面的语句。ifelseif结构举例:征税问题:1000以下税率为3%1000~2000税率为4%2000~3000税率为5% 3000以上税率6%输入收入,求应缴税款。#include<stdio.h>voidmain(void){floatx,rate;scanf(“%f”,&x);

if(x<1000)rate=.03;

elseif(x<2000)rate=.04;

elseif(x<3000)rate=.05;

elserate=.06;printf(“%f”,x*rate);}3/100?【例3-6】从键盘任意输入一个字符,判断其是数字、大写字母、小写字母或是其它字符。/*example3-6判断是什么字符*/#include<stdio.h>voidmain(void){charc;printf("c=?");c=getchar();/*从键盘输入字符赋给c*/

if(c>='0'&&c<='9')

printf("%cisadigit\n",c);/*数字字符*/

elseif(c>='A'&&c<='Z')printf("%cisacapitalletter\n",c);/*大写字母*/

elseif(c>='a'&&c<='z')

printf("%cisasmallletter\n",c);/*小写字母*/

elseprintf("%cisanother\n",c);/*其它*/}/*example3-7判断考试成绩*/#include<stdio.h>voidmain(void){floatscore;printf("score=?");scanf("%f",&score);/*从键盘输入考试成绩*/

if(score>=90)

printf("%4.1fisA\n",score);/*优*/

elseif(score>=80)printf("%4.1fisB\n",score);/*良*/

elseif(score>=70)

printf("%4.1fisC\n",score);/*中*/

elseif(score>=60)

printf("%4.1fisD\n",score);/*及格*/

elseprintf("%4.1fisE\n",score);/*不及格*/}【例3-7】从键盘任意输入一个百分制考试成绩,判断其是优、良、中、及格、不及格switch语句(多分支结构)格式:switch(expression){

case

常量表达式1:statement1;

case

常量表达式2:statement2;…

case

常量表达式n-1:statementn-1;

default:statementn;}只能是整型或字符型表达式。整型/字符型常量表达式。表达式的值要互不能相等!

流程:①先求expression的值。②依次比较expression和各常量表达式的值。③如果与第i个常量表达式相等,则执行第i条以后的语句。④如果都不相等,则执行default以后的语句。3.2.1switch结构和break语句语句标号的概念:#include<stdio.h>voidmain(void){chargrade;grade=getchar();switch(grade)

{case‘a’:case‘A’:printf(“90—100\n”);case‘B’:printf(“80—89\n’);case‘C’:printf(“70—79\n”);case‘D’:printf(“60—69\n”);case‘E’:printf(“<60\n”);default:printf(“error\n”);}}语句标号break语句:格式:break;作用:中断switch流程。

break;break;break;break;break;功能:(1)首先计算表达式的值。(2)然后将该值依次与每一个case中的常量值进行比较,如果相等,则执行该case常量值后面的语句组,如果不等,则继续与下一个case中的常量值进行比较,……,即将表达式的值依次与各个常量表达式的值进行相等的比较,当遇到相等的表达式,则执行其后的语句直到遇到break语句,如果所有的表达式都不等,则执行default后面的语句,即在n+1种路中选择其中的一种。(3)接着继续执行switch结构后面的语句/*example3-8(a)判断考试成绩*/#include<stdio.h>voidmain(void){charscore;printf("score=?");scanf("%c",&score);/*从键盘输入考试成绩*/switch(score){ case'A':printf("%cin90-100\n",score);/*优*/ case'B':printf("%cin80-89\n",score);/*良*/ case'C':printf("%cin70-79\n",score);/*中*/ case'D':printf("%cin60-69\n",score);/*及格*/ case'E':printf("%cin<60\n",score);/*不及格*/ }}【例3-8】以5分制的形式输入一门课程的考试成绩,打印其所在的百分制段落,如:输入B,输出80~89/*example3-8(b)判断考试成绩*/#include<stdio.h>voidmain(void){charscore;printf("score=?");scanf("%c",&score);/*从键盘输入考试成绩*/switch(score){ case'A':printf("%cin90-100\n",score);break;/*优*/ case'B':printf("%cin80-89\n",score);break;/*良*/ case'C':printf("%cin70-79\n",score);break;/*中*/ case'D':printf("%cin60-69\n",score);break;/*及格*/ case'E':printf("%cin<60\n",score);/*不及格*/}}例3-8的改进1#include<stdio.h>voidmain(void){charscore;printf("score=?");scanf("%c",&score);/*从键盘输入考试成绩*/switch(score){

case'a':case'A':printf("%cin90-100\n",score);break;/*优*/

case'b':case'B':printf("%cin80-89\n",score);break;/*良*/

case'c':case'C':printf("%cin70-79\n",score);break;/*中*/

case'd':case'D':printf("%cin60-69\n",score);break;/*及格*/case'e':case'E':printf("%cin<60\n",score);break;/*不及格*/default:printf("dataerror\n");/*提示出错信息*/}}例3-8的改进2情况1:if是A类?是A类elseif是B类?是B类elseif是C类?是C类elseif是D类?是D类else

是其它类3.2.1各种分支的嵌套情况2:if是A类?

if是A1类?是A1类

else

是A2类else

if是B1类?是B1类

else

是B2类

A类?B1类?是A1类是A2类是B1类是B2类YesNo图3-12从属的逻辑结构A1类?YesYesNoNo情况3:if是A类?

if是A1类?是A1类

else

是A2类else

是B类/*example3-9(a)求分段函数*/#include<stdio.h>voidmain(void){ intx,y;/*定义数据*/printf("x=?"); scanf("%d",&x);/*输入数据*/ if(x>0) y=1;/*x>0*/ elseif(x<0) y=-1;/*x<0*/ else y=0;/*x=0*/ printf("x=%d\n",x); printf("y=%d\n",y);/*输出*/}【例3-9】求下列分段函数的值。/*example3-9(b)求分段函数*/#include<stdio.h>voidmain(void){ intx,y;/*定义数据*/printf("x=?"); scanf("%d",&x);/*输入数据*/ if(x>=0)

if(x>0)

y=1;/*x>0*/

else

y=0;/*x=0*/ else y=-1;/*x<0*/ printf("x=%d\n",x); printf("y=%d\n",y);/*输出*/}解法二/*example3-9(c)求分段函数*/#include<stdio.h>voidmain(void){ intx,y;/*定义数据*/printf("x=?"); scanf("%d",&x);/*输入数据*/ if(x>0) y=1;/*x>0*/ else

if(x<0)

y=-1;/*x<0*/

else

y=0;/*x=0*/ printf("x=%d\n",x); printf("y=%d\n",y);/*输出*/}解法三例:对于如下的结构:

if(e1)stat1;

elsestat2;在stat1或stat2中又含有if结构:if(e2)stat3;elsestat4;称为if结构的嵌套。各种if结构都可以嵌套。

如求符号函数:

-1(x<0)y=0(x=0)1(x>0)#include<stdio.h>voidmain(void){intx,y;scanf(“%d”,&x);if(x<0)y=-1;elseif(x==0)y=0;elsey=1;printf(“x=%d,y=%d\n”,x,y);}外层内层在外层else语句中,含有一个if结构。说明:①书写采取缩进形式,便于区分。内层缩进。②else与最近的if相匹配,从内到外。y=-1;if(x!=0)if(x>0)y=1;elsey=0;x==0结果?举例:求一元二次方程ax2+bx+c=0的根。#include<stdio.h>#include<math.h>voidmain(void){floata,b,c,d,x1,x2;scanf(“%f,%f,%f”,&a,&b,&c);d=b*b-4.0*a*c;if(fabs(d)<1.0e-6){printf(“\nx1=x2=,%f”,-b/(2.0*a));}else{if(d>0){printf(“\nx1=%f”,(-b+(float)sqrt(d))/(2.0*a));printf(“\nx2=%f”,(-b-(float)sqrt(d))/(2.0*a));}else{printf(“\nx1=%f+i%f”,-b/(2.0*a),(float)sqrt(-d)/(2.0*a));printf(“\nx2=%f-i%f”,-b/(2.0*a),(float)sqrt(-d)/(2.0*a));}}}内层求相等实根。求不等实根。求共扼复根。判断实型量相等或不等用误差的方法。floata=1.0/*a=1.000001或0.999999*/a==1.0?例:输出五分制对应的百分制范围。#include<stdio.h>voidmain(void){charchGrad;chGrad=getchar();switch(chGrad){case‘a’:case‘A’:printf(“90—100\n”);break;case‘b’:case‘B’:printf(“80—89\n”);break;case‘c’:case‘C’:printf(“70—79\n”);break;case‘d’:case‘D’:printf(“60—69\n”);break;case‘e’:case‘E’:printf(“<60\n”);break;default:printf(“DataError!\n”);}}多个标号可以共用相同的语句。default语句可以省略。3.3

循环结构(Repetition)程序经常会重复执行某些相同的操作,如:求:S=1+2+3+4+…+100算法描述:①s=0;i=1;②s+=i;i++;③判断i是否小于等于100

如果i小于等于100,重复②;否则,结束。此类根据“条件”重复执行相同算法的结构,称为循环。初始化部分。循环体。含有使条件趋假的语句。循环的条件。注意:循环应在有限次完成。

C语言提供了三类实现循环的语句:

while,dowhile,for

算法1:直接写出算式。

S=1+2+3+4+5+6+7+8+9+10+11+12+13+•••+99+100;

算法2:

S=0;

S+=1;S+=2;S+=3;•••S+=99;S+=100;格式:

while(expression)

statement;表达式:值非0,表示满足条件;值为0代表不满足条件。语句(复合语句),重复执行部分(循环体)。流程:e?truestatement;false含有使条件趋假的语句。求s=1+2+3+4+…+100#include<stdio.h>voidmain(void){ints=0,i=1;while(i<=100){

s=s+i;/*s+=i;*/

i++;}printf(“s=%d\n”,s);}初始化部分循环体条件测试使条件趋假语句3.3.1while循环(当型循环)【例3-10】打印循环变量的值。/*example3-10(a)打印循环变量的值*/#include<stdio.h>voidmain(void){ inti;/*定义整型循环变量*/ i=1;/*初始化循环变量*/while(i<=10)/*循环条件*/ { printf("i=%d,",i);/*输出循环变量*/ i++;/*修正循环变量*/ }}3-10(b)/*example3-10(b)打印循环变量的值*/#include<stdio.h>voidmain(void){ inti;/*定义整型循环变量*/ i=1;/*初始化循环变量*/while(i<=10)/*循环条件*/ { printf("i=%d,",i);/*输出循环变量*/ i=i+2;/*修正循环变量*/ }}格式:

do

{ statement;}

while

(expression);

流程:statement;e?truefalse含有使条件趋假的语句。while循环与do-while循环的区别:while循环先判条件,后执行循环体;do–while循环先执行循环体,后判条件。举例:求:30!#include<stdio.h>voidmain(void){floats=1.0;inti=1;do{s*=i;i++;}while(i<=30);printf(“30!=%f”,s);}初始化。循环体。测试条件。使条件趋假。3.3.2do–while循环(直到型循环)例3-12求1到100的累加和(用do-while循环实现)。

/*example3-12求累加和*/#include<stdio.h>voidmain(void){ inti;/*定义整型循环变量*/ floatsum;/*定义累加和*/ i=1;/*初始化循环变量*/sum=0.0;/*初始化累加和*/do { sum=sum+i;/*不断累加*/ i++;/*修正循环变量*/ }while(i<=100);/*循环条件*/ printf("i=%d,",i);/*输出循环变量*/printf("sum=%f\n",sum);/*输出累加和*/}格式:

for

(e1;

e2;

e3

)

statement;流程:e1e2?truestatement;e3false求:s=1+2+3+…+100#include<stdio.h>voidmain(void){ints=0,i;

for(i=1;i<=100;i++){s=s+i;

}printf(“s=%d”,s);}使e2趋假。在for循环中,e1、e2、e3都可以省略!e1省略

i=1;e3省略

i++;初值表达式。测试表达式。增值表达式。3.3.3for循环for循环实例求100以内的偶数和。ints=0,i;for(i=2;i<=100;i+=2){s+=i;}求500以内最大的5个能被50整除数的和。inti,j,s=0;for(j=500,i=0;i<5;i++,j-=50){s+=j;}从大到小输出100以内能被5整除的数。inti;for(i=100;i>=0;i-=5)printf(“%d\n”,i);inti,j,s=0;for(i=0,j=0;i+j<=100;i++,++j){s+=i+j;}【例3-14】几种常见的空循环举例/*example3-14(a)空循环*/#include<stdio.h>voidmain(void){inti;for(i=1;i<=100;i++) { ;*循环体内空语句*/ }printf("i=%d\n",i);}

/*example3-14(b)空循环*//*for语句后打了一个分号*/#include<stdio.h>voidmain(void){ inti;for(i=1;i<=100;i++); printf("i=%d\n",i);}两种特殊循环:空循环和死循环【例3-14】几种常见的死循环举例/*example3-15(a)死循环*//*省略表达式3*/#include<stdio.h>voidmain(void){inti;for(i=1;i<=100;){ ;}printf("i=%d\n",i);}/*example3-15-(b)死循环*//*省略表达式2*/#include<stdio.h>voidmain(void){ inti;for(i=1;;i++) { ; } printf("i=%d\n",i);}无限循环和空循环①条件为恒真的循环——无限循环while(1){…}do{…}while(1);for(;;){…}通过条件控制的break语句退出循环。例:程序等待直到输入字母A。for(;;){ch=getchar();if(ch==’A’)break;}②循环体为空语句的循环——空循环for(i=1;i<=MAX;i++);作用:程序延时。空语句{;}3.3.4转移语句正常结束循环(循环条件为假,循环结束)非正常结束循环(在循环体设置条件,当条件为满足时,使用转移语句跳出循环,循环结束)break语句又称中断语句,其一般形式为:break;continue语句的一般形式为:continue;1.break语句2.continue语句

任何循环都必须在有限的时间内能够结束,而循环的结束有2种方式:循环的中断(break)和继续(continue)①循环的中断:break语句概念:循环体中可以加分支,判断是否继续执行循环,break语句可以提前结束循环。举例:求:r=1—10的圆的面积,如圆面积大于100则中断。for(r=1;r<=10;r++){area=3.14159*r*r;if(area>100)break;printf(“\n%f“,area);}满足条件,则退出循环。②继续循环:continue语句continue语句的作用是跳过本次循环剩余的循环体内容,执行下次循环。举例:求1—100内的偶数和。s=0;for(n=1;n<=100;n++){if(n%2!=0)continue;s+=n;}满足条件,跳过本次循环体剩余内容,继续下次循环。ints=0,i;for(i=2;i<100;i=i+2)s+=i;【例3-16】转移语句举例

/*example3-16(a)*//*break语句的使用*/#include<stdio.h>voidmain(void){ inti;for(i=1;i<=10;i++) { if(i%4==0)break;

printf("i=%d\n",i); }}/*example3-16(b)*//*continue语句的使用*/#include<stdio.h>voidmain(void){ inti;for(i=1;i<=10;i++) { if(i%4==0)

continue;

printf("i=%d\n",i); }}

概念:在一个循环的循环体内又包含一个完整的循环称为循环的嵌套,又叫多重循环。3.3.5各种循环的嵌套/*example3-17嵌套循环*/#include<stdio.h>voidmain(void){inti,j;for(i=1;i<=3;i++)/*外循环3次*/ { printf(“外循环i=%d:\n",i);/*输出外循环变量*/

for(j=1;j<=5;j=j+2)/*内循环3次*/

{

printf("内循环j=%d",j);/*输出内循环变量*/

}

printf("\n");/*换行*/ }}【例3-17】输出循环变量的值,分析循环的执行过程1

11

21

31

41

51

61

71

819

2

12

2……29

9

19

2……9

9如打印一9

9的乘法表:打印第一行:

for(j=1;j<=9;j++)printf(“1%d”,j);打印第二行到第九行:

for(j=1;j<=9;j++)printf(“2%d”,j);

……for(j=1;j<=9;j++)printf(“9%d”,j);

和打印第一行的操作相同,是重复操作,可用循环。#include<stdio.h>voidmain(void){inti,j;for(i=1;i<=9;i++){

printf(“\n“);}}外层循环内层循环说明:⒈内外层循环采用缩进形式。⒉while和do-while和for可以相互嵌套。⒊执行次数为内层循环次数和外层循环次数的乘积。如何打印乘法表的一半?for(j=1;j<=9;j++){printf(“%4d“,i*j);}【例3-18】打印九九乘法表3.4分支和循环的C程序设计#include<stdio.h>voidmain(void){inti,ix,iCount=0,iSum=0;for(i=1;i<=10;i++){

scanf(“%d\n”,&ix);

if(ix%2==0){iSum+=ix;iCount++;}}printf(“Num=%d\nSum=%d”,iCount,iSum);}输入10个自然数统计其中偶数的个数及偶数值和。算法框图:start定义变量初始化true输入true统计累加falsefalse输出结果end循环结构分支结构输入负数?do{

if(ix<=0)printf(“dateerror”);}while(ix<=0);算法的健壮性注意:结构应完整的包含和被包含。3.4.1应用程序循环?偶数?程序分析:此题首先找出2个数中的大数maxf,再将2个数中的大数maxf与第3个数比较,即可得出3个数中的大数/*example3-19求3个数中的大数*/#include<stdio.h>voidmain(void){ floatx,y,z,maxf;/*定义实型数据*/ printf("x,y,z=?"); scanf("%f,%f,%f",&x,&y,&z);/*输入实型数据*/ if(x>y) maxf=x; else maxf=y;if(maxf<z)maxf=z;/*此时maxf的值为x、y和z中的大数*/ printf("x=%f,y=%f,z=%f\n",x,y,z); printf("maxf=%f\n",maxf);/*输出*/}【例3-19】由键盘任意输入3个数,找出其中的最大数

/*example3-20判断闰年*/#include<stdio.h>voidmain(void){ intn;/*定义数据*/ printf("n=?"); scanf("%d",&n);/*输入年号*//*对年号进行判断*/ if((n%4==0&&n%100!=0)||n%400==0) printf("%d是闰年",n);/*输出是闰年*/ else printf("%d不是闰年",n);/*输出不是闰年*/

}【例3-20】由键盘任意输入一个年号,如:2008,判断其是否是闰年/*example3-21统计字符的个数*/#include<stdio.h>voidmain(void){charc;intdigcou=0;/*定义整型变量并初始化为0*/intcapcou=0;intsmacou=0;intothercou=0;printf("c=?");

while((c=getchar())!='\n')/*循环输入字符赋给c*/{if(c>='0'&&c<='9')digcou++;/*统计数字字符*/elseif(c>='A'&&c<='Z')capcou++;/*统计大写字母*/elseif(c>='a'&&c<='z')smacou++;/*统计小写字母*/else【例3-21】由键盘任意输入一串字符,分别统计其中大写字母、小写字母、数字、其他字符的个数othercou++;/*统计其它字符*/}printf("数字字符有%d个\n",digcou);/*输出字符个数*/printf("大写字母有%d个\n",capcou);printf("小写字母有%d个\n",smacou);printf("其它字符有%d个\n",othercou);}/*example3-22(a)求累乘积的和*/#include<stdio.h>voidmain(void){ inti;/*定义整型循环变量*/ floattemp=1.0;/*定义并初始化累乘积*/ floatsum=0.0;/*定义并初始化累加和*/ intn; printf("n=?"); scanf("%d",&n);for(i=1;i<=n;i++)/*循环条件*/ {

temp=temp*i;/*不断累乘积*/

sum=sum+temp;/*不断累加累乘积*/ }printf("sum=%f\n",sum);/*输出累加和*/}【例3-22】求累乘积的和

/*example3-22(b)求累乘积的和*/#include<stdio.h>voidmain(void){ inti,j;/*定义整型循环变量*/ floattemp;/*定义累乘积*/ floatsum=0.0;/*定义并初始化累加和*/ intn; printf("n=?"); scanf("%d",&n);for(i=1;i<=n;i++)/*外循环求累加和*/ { temp=1.0;/*初始化累乘积*/for(j=1;j<=i;j++)/*内循环求累乘积*/ { temp=temp*j;/*不断累乘积*/ } sum=sum+temp;/*不断累加累乘积*/ }printf("sum=%f\n",sum);/*输出累加和*/}【例3-22】(b)求两个数的最大公约数和最小公倍数考虑:

(1)两个数的可能共同约数有哪些?

1到两个数中的最小数(2)在这些可能共同约数中找到最大的共同约数?

从最大的可能约数开始,一个一个的试。算法思想:(1)找出两个数a,b的最小数,存入k

(2)从k开始,逐个去除a,b;如果某个数能同时除尽,则这个数就是要找的最大公约数。输入一个数,判断其是否是素数考虑:

(1)一个数如果的因子除了1和它本身外,再没有其他因子,这个数就是素数。2是最小的素数。(2)判断一个数是否素数,关键是能不能找到除1和它本身外的因子

算法思想:(1)输入数m(m>=2);

(2)从2到m-1(或者m/2,或者sqrt(m))去除m,如果其中有一个数能除尽,则m不是素数,否则m是素数。求1000以内的完数。完数即完美数,一个数如果恰好等于除它本身外的因子之和,这个数称为完数,如:6=1+2+3考虑:

没有什么好办法,对1000以内的每个数都试试,符合完数的条件则输出。算法思想:(1)对于数number,求其因子之和sumof;(2)如果number等于sumof,则这个数就是我们要找的完美数;输出完美数。观察图形规律:

(1)每行由若干个空格和星号组成;(2)第一行有3个空格,1个星号;第二行2个空格,3个星号;第三行1个空格;第四行0个空格,5个星号;于是,按规律打印即可。如果上面图形的行数是任意值n(从键盘输入),怎么办?规律:第一行的空格数n-1,星号数1;第二行空格数n-2,星号数3;…,第n行空格数0,星号数2n-1;

即第i行由n-i个空格和2i-1个星号组成。/*example3-23(a)求级数和*/#include<stdio.h>voidmain(void){ inti;/*定义整型循环变量*/ floatsum=0.0;/*定义并初始化累加和*/ intn; printf("n=?"); scanf("%d",&n);/*输入项数*/for(i=1;i<=n;i++)/*循环条件*/ { sum=sum+i;/*不断累加*/ }printf("sum=%f\n",sum);/*输出累加和*/}【例3-23】求级数的和(1)求级数的和:1+2+3+4+…+n。/*example3-23(b)求级数和*/#include<stdio.h>voidmain(void){ inti;/*定义整型循环变量*/ floatsum=0.0;/*定义并初始化累加和*/ intn; printf("n=?"); scanf("%d",&n);/*输入项数*/for(i=1;i<=n;i++)/*循环条件*/ { sum=sum+1.0/i;/*不断累加*/ }printf("sum=%f\n",sum);/*输出累加和*/}(2)求级数的和:1+1/2+1/3+1/4+…+1/n

/*example3-23(c)求级数和*/#include<stdio.h>voidmain(void){ inti;/*定义整型循环变量*/ floatsum=0.0;/*定义并初始化累加和*/ intn; printf("n=?"); scanf("%d",&n);/*输入项数*/for(i=1;i<=n;i=i+2)/*循环条件、步长为2*/ { sum=sum+1.0/i;/*不断累加*/ }printf("sum=%f\n",sum);/*输出累加和*/}(3)求级数的和:1+1/3+1/5+1/7+…+1/n

/*example3-23(d)求级数和*/#include<stdio.h>voidmain(void){ inti;/*定义整型循环变量*/ floatsum=0.0;/*定义并初始化累加和*/ floattemp=-1; intn; printf("n=?"); scanf("%d",&n);/*输入项数*/

for(i=1;i<=n;i=i+2)/*循环条件、步长为2*/ {

temp=-temp;/*正负相间*/ sum=sum+temp*(1.0/i);/*不断累加*/ }sum=sum*4;/*计算pi*/ printf("sum=%f\n",sum);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论