C基础及其教程 2_第1页
C基础及其教程 2_第2页
C基础及其教程 2_第3页
C基础及其教程 2_第4页
C基础及其教程 2_第5页
已阅读5页,还剩147页未读, 继续免费阅读

下载本文档

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

文档简介

第4章程序的控制结构C语言大学实用教程本章学习内容算法的描述方法常用算法(累加累乘、统计、递推迭代、穷举)选择结构及相关控制语句循环结构及相关控制语句结构化程序设计的基本思想Skill:MapproblemtosolutioninflowchartandpseudocodeformsBeabletodevelopaprogramcontainingselectionandloopcontrolstructure选择结构学习内容

算法的描述方法

条件语句

开关语句

关系运算符

条件运算符

逻辑运算符

程序测试生活中的问题求解(ProblemSolvingProcess):Problem:早晨起床上班

Howtosolve:

起床

洗个热水澡

穿好衣服

吃早饭

出门上班End4.1算法及其描述方法如果改变顺序,起床→穿衣→吃早饭→洗热水澡→出门上班?生活中的问题求解(ProblemSolvingProcess)

Problem:早晨起床上班

Howtosolve:

起床

洗个热水澡

穿好衣服

吃早饭

出门上班End4.1算法及其描述方法如果改变顺序,起床→穿衣→吃早饭→洗热水澡→出门上班?“树上有10只鸟,开枪打死一只,还剩几只?”1只?9只?一只不剩?如果打死的鸟挂在树上没有掉下来,那么就剩一只,如果掉下来,就一只不剩有没有关在笼子里的鸟?用的是无声手枪吗?树上的鸟有没有聋子?会不会一枪打死两只?……4.1算法及其描述方法共性:对问题分析的全面性全面缜密的思维是优秀程序员的基本素质DatatobemanipulatedStructure,defininghowdataisstoredAlgorithm–theoperationsonthedata计算机中的问题求解设计算法(Algorithm)为解决一个具体问题而采取的、确定的、有限的操作步骤,仅指计算机能执行的算法4.1算法及其描述方法4.1算法及其描述方法算法的特性有穷性在合理的时间内完成确定性,无歧义如果x≥0,则输出Yes;如果x≤0,则输出No有效性能有效执行负数开平方没有输入或有多个输入有一个或多个输出4.1算法及其描述方法算法的描述方法自然语言描述传统流程图(Flowchart)在1966年,Bohra

与Jacopini

提出算法的图形表示N-S结构化流程图1973年,美国学者I.Nassi

和B.Shneiderman

提出伪码(Pseudocode)表示4.1算法及其描述方法4.1算法及其描述方法已知每公斤价格price,买quantity公斤的苹果,需要多少钱?

quantitypricePerkgpriceprice=quantity*pricePerkgInputProcessOutput先确定问题的输入和输出.4.2顺序结构(Sequence

Structure)给变量赋值赋值表达式语句

赋值表达式;

price=quantity*pricePerkg;输入输出数据标准库函数调用语句

scanf("%d",&pricePerkg);

printf("%d",price);ABC【例4.1】银行定期存款的年利率(rate)为2.25%,存款期为n年,存款本金为capital元,试按复利编程计算n年后的本利之和deposit。#include<math.h>#include<stdio.h>intmain(void){ intn; //定义存款期变量

doublerate=0.0225; //定义存款年利率变量

doublecapital; //定义存款本金变量

doubledeposit; //定义本利之和变量

printf("Pleaseenteryear,capital:");//显示用户输入的提示信息

scanf("%d,%lf",&n,&capital);//输入数据,数据间以逗号分隔

deposit=capital*pow(1+rate,n);//调用pow()计算存款利率之和

printf("deposit=%f\n",deposit);//打印按复利计算的存款本利之和

return0;}【例4.2】从键盘任意输入一个三位整数,要求正确分离出它的个位、十位和百位数,并分别在屏幕上输出。#include<stdio.h>intmain(void){intx,b0,b1,b2; //变量定义

printf("Pleaseenteranintegerx:"); //提示用户输入一个整数

scanf("%d",&x); //输入一个整数

b2=x/100; //用整除方法计算最高位

b1=(x-b2*100)/10; //计算中间位

b0=x%10; //用求余方法计算最低位

printf("bit0=%d,bit1=%d,bit2=%d\n",b0,b1,b2);//输出结果

return0;}【例4.3】用公式法编程计算一元二次方程ax2+bx+c=0的根,a、b和c由键盘输入,假设b2−4ac>0。#include<math.h>#include<stdio.h>intmain(void){floata,b,c,disc,p,q;printf("Pleaseentera,b,c:");scanf("%f,%f,%f",&a,&b,&c); //输入确保判别式大于0的a,b,c值

disc=b*b-4*a*c; //计算判别式的值

p=-b/(2*a);q=sqrt(disc)/(2*a);printf("x1=%.4f,x2=%.4f\n",p+q,p-q);//输出两个不相等实根

return0;}4.3选择结构应用场合计算两个数的最大值计算三角形面积之前,判断三边能否构成三角形?如果输入的是大写英文字母,则转换成小写,如果输入的是小写英文字母,则转换成大写,如果是数字字符,则显示其ASCII码值,否则什么都不显示判断某年是否是闰年……if-else单分支(SingleSelection)双分支(DoubleSelection)多分支(MultipleSelection)ifelse-if4.3选择结构(分支结构)

(SelectionStructure)4.3选择结构(分支结构)

(SelectionStructure)用于单分支控制的条件语句stepa条件stepmstepnstepbYN伪码表示stepaif(条件为真){ stepm stepn}stepb传统流程图if语句Syntax:

if

(表达式)

语句;or

if

(表达式){

语句1;

语句2; }复合语句(CompoundStatement)被当作一条语句看待用表达式表示条件if语句Syntax:

if

(表达式)

语句;or

if

(表达式){

语句1;

语句2; }如何表示条件的真和假呢?不局限于关系表达式(0或1)也可为数值表达式(0或非0)表达式的值非0时,为真#include<stdio.h>intmain(void){inta,b,max;

printf("Inputa,b:");

scanf("%d,%d",&a,&b);

if(a>b) max=a;if(a<=b) max=b;

printf("max=%d\n",max);return0;}Inputa,b:_Inputa,b:20,15_Inputa,b:20,15max=20_【例4.4】计算两整数的最大值伪码Stepaif(条件为真){ Stepm Stepn}else{ Stepx Stepy}StepzStepa条件StepmStepnStepzYNStepxStepy用于双分支控制的条件语句if-else语句Syntax:

if

(表达式)

语句1;else

语句2;or

if

(表达式)

{

语句1;

语句3;}

else

{

语句2;

语句4;}NoYes输入a和b输出maxa>b?maxbmaxaStartEnd【例4.4】计算两整数的最大值scanf("%d,%d",&a,&b);if(a>b)max=a;elsemax=b;printf("max=%d\n",max);TurnFlowcharttoCProgram#include<stdio.h>intmain(void){inta,b,max;

printf("Inputa,b:");

scanf("%d,%d",&a,&b);

if(a>b) max=a;

else max=b;

printf("max=%d",max);return0;}}

if(a>b) max=a;

if(a<=b) max=b;【例4.4】计算两整数的最大值#include<stdio.h>intmain(void){inta,b,max;

printf("Inputa,b:");

scanf("%d,%d",&a,&b);

if(a>b) max=a;

else max=b;

printf("max=%d",max);return0;}}

max=a>b?a:b;表达式1?表达式2:表达式3条件运算符和条件表达式【例4.4】用于多分支控制的条件语句

Stepa表达式1StepmStepnStepzYN表达式2YNStepx多分支如何控制呢?连续执行多个条件判断用于多分支控制的条件语句表达式1StepzN表达式2StepmStepnYYNStepx表达式1StepzN表达式2StepmStepnYYNStepx用于多分支控制的条件语句级联式if语句:else-ifStepaif

(表达式1){ Stepm}elseif(表达式2){ Stepn}

else{ Stepx}Stepz表达式1StepzN表达式2StepmStepnYYNStepx即使分支中只有一条语句,大括号最好也不省略用于多分支控制的条件语句例4.5:计算一元二次方程ax2+bx+c=0的根判别式disc=b2-4ac

判别式=0?计算判别式N判别式>0?打印相等实根打印两个不等实根YYN打印两个复根用于多分支控制的条件语句例4.5:计算一元二次方程ax2+bx+c=0的根用于多分支控制的条件语句例4.5:计算一元二次方程ax2+bx+c=0的根#include<stdlib.h>#include<math.h>#include<stdio.h>#defineEPS1e-6intmain(void){floata,b,c,disc,p,q;printf("Pleaseentera,b,c:");scanf("%f,%f,%f",&a,&b,&c);if(fabs(a)<=EPS)//测试实数a是否为0,以避免发生“除0错误”

{printf("Itisnotaquadraticequation!\n");exit(0);//退出程序

}disc=b*b-4*a*c;p=-b/(2*a);q=sqrt(fabs(disc))/(2*a);if(fabs(disc)<=EPS)//若判别式为0,则输出两个相等实根

{printf("Twoequalrealroots:x1=x2=%6.2f\n",p);}elseif(disc>EPS)//若判别式为正值,则输出两个不等实根

{printf("Twounequalrealroots:x1=%6.2f,x2=%6.2f\n",p+q,p-q);}else//若判别式为负值,则输出两个共轭复根

{printf("Twocomplexroots:\n");printf("x1=%6.2f+%6.2fi\n",p,q);printf("x2=%6.2f-%6.2fi\n",p,q);}return0;}开关语句switch(

表达式){

case

value1:

语句1; break;

case

value2:

语句2; break;

……

default

:

语句n; break;}必须是int或char!用于多路选择的switch语句

必须有空格!!

必须是常量!!它是如何执行的呢?Example:switch(month){ case1: printf("January\n"); break; case2: printf("February\n"); break; case3: printf("March\n"); break; default: printf("Others\n"); break; } printf("End");假设

month=1…thisstepwillbeexecuted.Later……caseisterminatedhere.Jumpto…January_JanuaryEnd_用于多路选择的switch语句

Example:switch(month){ case1: printf("January\n"); break; case2: printf("February\n"); break; case3: printf("March\n"); break; default: printf("Others\n"); break; } printf("End");…thisstepwillbeexecuted.Later…March_MarchEnd_假设

month=3…caseisterminatedhere.Jumpto…用于多路选择的switch语句

Example:switch(month){ case1: printf("January\n"); break; case2: printf("February\n"); break; case3: printf("March\n"); break; default: printf("Others\n"); break;}printf("End");假设没有

break?用于多路选择的switch语句

Example:switch(month){ case1: printf("January\n"); break; case2: printf("February\n");

case3: printf("March\n"); break; default: printf("Others\n"); break; } printf("End");…thisstepwillbeexecuted.Later…February_March_假设month=2…

caseisterminatedhere.Jumpto…End_…executioncontinues.Thus,thisstepisexecuted.So…用于多路选择的switch语句

Example:switch(month){ case1: printf("January\n"); break; case2: printf("February\n");

case3: printf("March\n"); break; default: printf("Others\n"); break;} printf("End");假设这两个

break也移除?month=1?month=34?用于多路选择的switch语句

default分支最好不省略!【例4.7】计算器程序编程设计一个简单的计算器程序,要求用户从键盘输入如下形式的表达式:

操作数1运算符op操作数2

然后,计算并输出表达式的值指定的运算符为 加(+) 减(-) 乘(*) 除(/)intmain(void){

intdata1,data2;/*定义两个操作符*/

charop;/*定义运算符*/ printf("Pleaseentertheexpression:"); scanf("%d%c%d",&data1,&op,&data2);/*输入运算表达式*/

switch(op) {

case'+':/*处理加法*/ printf("%d+%d=%d\n",data1,data2,data1+data2);

break;

case'-':/*处理减法*/ printf("%d-%d=%d\n",data1,data2,data1-data2);

break;

case'*':/*处理乘法*/ printf("%d*%d=%d\n",data1,data2,data1*data2);

break;

case'/':/*处理除法*/

if(0==data2) printf("Divisionbyzero!\n");

else

printf("%d/%d=%d\n",data1,data2,data1/data2);

break;

default: printf("Invalidoperator!\n"); }return0;}【例4.7】Why?思考if(0==data2)的必要性——避免"除零错误"1998年11月,《科学美国人》杂志描述了美国导弹巡洋舰约克敦号上的一起事故,除零错导致军舰推进系统的关闭为什么写成if(0==data2)?如果要求输入的算术表达式中的操作数和运算符之间可以加入任意多个空格符,那么程序如何修改?intmain(void){

intdata1,data2;

charop; printf("Pleaseentertheexpression:"); scanf("%d%c%d",&data1,&op,&data2);/*%c前有一个空格*/

switch(op) {

case'+': printf("%d+%d=%d\n",data1,data2,data1+data2);

break;

case'-': printf("%d-%d=%d\n",data1,data2,data1-data2);

break;

case'*': printf("%d*%d=%d\n",data1,data2,data1*data2);

break;

case'/':

if(0==data2) printf("Divisionbyzero!\n");

else

printf("%d/%d=%d\n",data1,data2,data1/data2);

break;

default: printf("Invalidoperator!\n"); }return0;}【例4.7】空格思考若改成对浮点数运算,两个浮点数如何比较?浮点数的有效位只有6或7位,保存的是近似值两个近似值如何比较相等?两个近似值的差足够小fabs(a-b)<1e-7

(取绝对值函数)但对判断100000和100001近似相等无能为力intmain(void){

floatdata1,data2;

charop; printf("Pleaseentertheexpression:"); scanf("%f%c%f",&data1,&op,&data2);

switch(op) {

case'+': printf("%f+%f=%f\n",data1,data2,data1+data2);

break;

case'-': printf("%f-%f=%f\n",data1,data2,data1-data2);

break;

case'*': printf("%f*%f=%f\n",data1,data2,data1*data2);

break;

case'/':

if(fabs(data2)<=1e-7)/*实数与0比较*/ printf("Divisionbyzero!\n");

else

printf("%f/%f=%f\n",data1,data2,data1/data2);

break;

default: printf("Invalidoperator!\n"); }return0;}【例4.7】思考若要求允许使用字符*、x或X作为乘号,且允许输入的算术表达式中的操作数和运算符之间加入任意多个空格符,程序如何修改?case'*':case'x':case'X':intmain(void){

floatdata1,data2;

charop; printf("Pleaseentertheexpression:"); scanf("%f%c%f",&data1,&op,&data2);

switch(op) {

case'+': printf("%f+%f=%f\n",data1,data2,data1+data2);

break;

case'-': printf("%f-%f=%f\n",data1,data2,data1-data2);

break;

case'*':

case'x': case'X': printf("%f*%f=%f\n",data1,data2,data1*data2);

break;

case'/': if(fabs(data2)<=1e-7)/*实数与0比较*/ printf("Divisionbyzero!\n");

else

printf("%f/%f=%f\n",data1,data2,data1/data2);

break;

default: printf("Invalidoperator!\n"); }return0;}【例4.7】【例4.8】分制转换采用两种方法编写程序,根据用户输入的百分制成绩,按如下转换标准将其转换成五分制成绩并输出

#include<stdio.h>intmain(void){intscore;printf("Pleaseenterscore:");scanf("%d",&score);if(score<0||score>100)//对输入数据的合法性进行检查

printf("Inputerror!\n");elseif(score>=90)printf("%d--A\n",score);elseif(score>=80)printf("%d--B\n",score);elseif(score>=70)printf("%d--C\n",score);elseif(score>=60)printf("%d--D\n",score);elseprintf("%d--E\n",score);return0;}采用两种方法编写程序,根据用户输入的百分制成绩,按如下转换标准将其转换成五分制成绩并输出

【例4.8】分制转换#include<stdio.h>intmain(void){intscore,mark;printf("Pleaseenterscore:");scanf("%d",&score);mark=score>=0&&score<=100?score/10:-1;//对score进行预处理

switch(mark){case10:case9:printf("%d--A\n",score);break;case8:printf("%d--B\n",score);break;case7:printf("%d--C\n",score);break;case6:printf("%d--D\n",score);break;case5:case4:case3:case2:case1:case0:printf("%d--E\n",score);break;default:printf("Inputerror!\n");//处理分数不在合法范围内的数据

}

return0;}【例4.8】小结if语句的三种形式if形式,if-else形式,else-if形式switch语句,break语句关系运算符,逻辑运算符,条件运算符表达式的值非0表示真,0表示假算法的概念和描述方法程序测试的概念和必要性循环结构学习内容

循环结构与循环控制方法循环语句

流程转移控制语句

嵌套循环

结构化程序设计的基本思想如何确定程序的输入和输出呢?读入5个整数,计算并显示它们的和.Input:

5个整数n1,n2,n3,n4,n5Output:

n1,n2,n3,n4,n5的和Inputexample:23456Outputexample:204.4循环结构为什么要用循环结构呢?Inputn1Inputn2Inputn3inputn4inputn5outputsumsum←n1+n2+n3+n4+n52n1Assumeinputexample:

234563n24n35n46n520sumend使用了6个不同的变量start若100个数累加,必须使用100个变量吗?counter←1,sum←0counter<6sum←sum+nfalsetruecounter++outputsuminput

n1countersum01<6 true2n0+2222<6 true32+3533<6 true45+4944<6 true59+51455<6 true614+62066<6 falsecounter-controlled

计数器每次增1仅使用3个变量Assumeinputexample:

23456计数控制的循环startend循环的控制方法标记控制SentinelControlled计数控制CounterControlled1,2,3,4,……,4,3,2,1条件控制ConditionControlled当型循环——Conditionistested

first

for循环语句真假假条件P计数控制——Loopiscontrolledbya

counterSyntaxfor

(表达式1;表达式2;表达式3)

语句Or

for(表达式1;表达式2;表达式3){

语句1

语句2 }for循环语句循环初始条件循环结束条件循环转化条件复合语句(CompoundStatement)做循环体被当作一条语句看待不要重复在循环体内改变循环变量的值控制循环次数i←0,sum←0i<5sum←sum+nfalsetruei++outputsuminputninti,sum,n;sum=0;for(i=0;i<5;i++){ scanf("%d",&n); sum=sum+n;}printf("%d",sum);for循环语句startend循环次数已知,计数控制计算并输出1+2+3……+n的值循环次数从键盘输入,计数控制sum=0的作用?

调试方法——输出每次循环累加的中间结果计算并输出1+2+3……+n的值输出每次循环累加的结果计算并输出1+2+3……+n的值

当型循环——Conditionistestedfirst

条件或计数控制——LoopiscontrolledbyconditionoracounterSyntax语句0

while(表达式){

语句1

语句2 }while循环语句真假假条件P循环初始条件循环结束条件循环变量增值直到型循环——conditionistestedlast条件或计数控制——

Loopiscontrolledbyconditionoracounter

Syntax语句0do{

语句1

语句2}while(表达式);do-while循环语句条件P假真循环初始条件循环结束条件循环变量增值计算并输出1+2+3……+n的值A当型循环真假假条件P假条件P

TestingConditionFirst计算并输出1+2+3……+n的值条件P直到型循环A假真条件PA假Testingconditionlast

计算并输出1+2+3……+n的值循环体内的语句至少被执行一次计算并输出1+2+3……+n的值如何减少循环的次数?逗号运算符(CommaOperator)多数情况下,并不使用整个逗号表达式的值更常见的是分别得到各表达式的值——顺序求值运算符主要用在循环语句中,同时对多个变量赋初值等

for(i=1,j=n;i<=j;i++,j--)表达式1,表达式2,…,表达式n循环初始条件循环转化条件循环结束条件【例4.10】计算并输出

n!=1×2×3×……×n

#include<stdio.h>intmain(void){intn;inti; //定义循环控制变量ilongp=1;printf("Pleaseentern:");scanf("%d",&n);for(i=1;i<=n;i++) //先判断后执行,循环n次

{

p=p*i; //执行累乘运算

}

printf("%d!=%ld\n",n,p);//以长整型格式输出n的阶乘值

return0;}【例4.10】计算并输出

n!=1×2×3×……×n

#include<stdio.h>intmain(void){intn;inti=1; //将循环控制变量i初始化为1

longp=1;printf("Pleaseentern:");scanf("%d",&n);while(i<=n) //先判断后执行,循环n次

{

p=p*i; //执行累乘运算

i++; //循环控制变量增值1}

printf("%d!=%ld\n",n,p); //以长整型格式输出n的阶乘值

return0;}【例4.10】计算并输出

n!=1×2×3×……×n

#include<stdio.h>intmain(void){intn;inti=1; //将循环控制变量i初始化为1

longp=1;printf("Pleaseentern:");scanf("%d",&n);do{p=p*i; //执行累乘运算

i++; //循环控制变量增值1}

while(i<=n);//先执行后判断,循环n次

printf("%d!=%ld\n",n,p);//以长整型格式输出n的阶乘值

return0;}选择三种循环的一般原则如果循环次数已知,计数控制的循环用for如果循环次数未知,条件控制的循环用while如果循环体至少要执行一次用do-while这只是“一般”原则,不是“原则”【例4.11】国王的许诺相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着8×8共64格的国际象棋棋盘说:陛下,请您赏给我一些麦子吧,就在棋盘的第1个格子中放1粒,第2格中放2粒,第3格中放4粒,以后每一格都比前一格增加1倍,依次放完棋盘上的64个格子,我就感恩不尽了。舍罕王让人扛来一袋麦子,他要兑现他的许诺。请问:国王能兑现他的许诺吗?试编程计算舍罕王共要多少粒麦子赏赐他的宰相,这些麦子合多少立方米(已知1立方米麦子约为1.42e8粒)?sum=1+2+22+23+…+263【例4.11】国王的许诺#include<math.h>#include<stdio.h>#defineCONST1.42e8 //定义符号常量CONST值为1.42e8intmain(void){intn;doubleterm;doublesum=0; //累加和变量sum初始化为0

for(n=1;n<=64;n++){term=pow(2,n-1); //根据累加项的规律计算累加项

sum=sum+term; //执行累加运算

}

printf("sum=%e\n",sum); //输出总麦粒数

printf("volume=%e\n",sum/CONST); //输出折合的总麦粒体积数

return0;}【例4.11】国王的许诺#include<stdio.h>#defineCONST1.42e8 //定义符号常量CONST值为1.42e8intmain(void){intn;doubleterm=1; //累乘变量term初始化为1

doublesum=1; //累加和变量sum初始化为1

for(n=2;n<=64;n++){term=term*2; //根据后项总是前项的2倍计算累加项

sum=sum+term; //执行累加运算

}

printf("sum=%e\n",sum); //输出总麦粒数

printf("volume=%e\n",sum/CONST); //输出折合的总麦粒体积数

return0;}【例4.12】利用

…,编程计算

的近似值,直到最后一项的绝对值小于10-4时为止,要求统计总共累加了多少项程序改错1:计算圆周率#include<math.h>#include<stdio.h>intmain(void){doublesum=0,term=1,sign=1.0;intn=1,count=0;do{

term=sign/n;//计算通项

sum=sum+term;count++;sign=-sign;n=n+2;}while(fabs(term)>=1e-4);

printf("pi=%f\ncount=%d\n",sum*4,count);return0;}利用

…,编程计算

的近似值,直到最后一项的绝对值小于10-4时为止,要求统计总共累加了多少项程序改错1:计算圆周率利用

…,编程计算

的近似值,直到最后一项的绝对值小于10-4时为止,要求统计总共累加了多少项#include<math.h>#include<stdio.h>intmain(void){doublesum=0,term=1,sign=1.0;intn=1,count=0;while(fabs(term)>=1e-4){

term=sign/n;//计算通项

sum=sum+term;count++;sign=-sign;n=n+2;}

printf("pi=%f\ncount=%d\n",sum*4,count);return0;}程序改错1:计算圆周率利用

…,编程计算

的近似值,直到最后一项的绝对值小于10-4时为止,要求统计总共累加了多少项#include<math.h>#include<stdio.h>intmain(void){doublesum=0,term=1,sign=1.0;intn=1,count=0;for(;fabs(term)>=1e-4;){

term=sign/n;//计算通项

sum=sum+term;count++;sign=-sign;n=n+2;}

printf("pi=%f\ncount=%d\n",sum*4,count);return0;}程序改错1:计算圆周率利用

…,编程计算

的近似值,直到最后一项的绝对值小于10-4时为止,要求统计总共累加了多少项#include<math.h>#include<stdio.h>intmain(void){doublesum=0,term=1,sign=1.0;intn=1,count=0;while(fabs(term)>=1e-4){sum=sum+term;count++;sign=-sign;n=n+2;term=sign/n;//计算通项}

printf("pi=%f\ncount=%d\n",sum*4,count);return0;}错在哪里?循序渐进式编程——猜数游戏想一个1~100之间的数猜对:right猜错:wrong并提示大小只猜1次直到猜对为止最多猜10次猜多个数10次猜不对就猜下一个数循序渐进式编程

——猜数游戏猜数游戏——循序渐进编程猜对:right!猜错:wrong!并提示大小【例4.6】猜数游戏想一个1~100之间的数多分支选择控制结构猜数游戏用到的库函数随机函数rand()产生[0,RAND_MAX]间的随机数magic=rand();#include<stdlib.h>RAND_MAX在stdlib.h中定义,不大于双字节整数的最大值32767产生[0,b-1]之间的随机数magic=rand()%b;产生[a,a+b-1]之间的随机数magic=rand()%b+a;怎样模拟计算机想一个数呢?#include<stdlib.h>#include<stdio.h>intmain(void){

intmagic;/*计算机"想"的数*/

intguess;/*人猜的数*/

magic=rand()%100+1;/*“想”一个[1,100]之间的数magic*/ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess);

if(guess>magic) {printf("Wrong!Toohigh!\n"); }

elseif(guess<magic) {printf("Wrong!Toolow!\n"); }

else

{ printf("Right!\n"); printf("Thenumberis:%d\n",magic); }return0;}例4.6只猜1次#include<stdlib.h>#include<stdio.h>intmain(void){

intmagic;

intguess;

int

counter;/*记录人猜次数的计数器变量*/ magic=rand()%100+1;

counter=0;/*计数器变量count初始化为0*/

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess);

counter++;/*计数器变量count加1*/

if(guess>magic) printf("Wrong!Toohigh!\n");

elseif(guess<magic) printf("Wrong!Toolow!\n");elseprintf("Right!\n");

}while(guess!=magic);

printf("counter=%d\n",counter);return0;}直到猜对为止例4.9猜数游戏用到的库函数函数rand()产生的是伪随机数#include<stdio.h>#include<stdlib.h>

intmain(void){

int

i;for(i=0;i<10;i++){

printf("%d\t",rand());}

printf("\n");return0;}为什么每次运行机器所想的数都是一样呢?猜数游戏用到的库函数随机函数srand()为函数rand()设置随机数种子,使产生的随机数“随机化”通过键入随机数种子,产生[1,100]之间的随机数scanf("%u",&seed);srand(seed);magic=rand()%100+1;如何使生成的随机数足够随机呢?#include<stdlib.h>#include<stdio.h>intmain(void){

intmagic;

intguess;

int

counter;/*记录人猜次数的计数器变量*/

unsignedint

seed;

printf("Pleaseenterseed:"); scanf("%u",&seed); srand(seed); magic=rand()%100+1; counter=0;/*计数器变量count初始化为0*/

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;/*计数器变量count加1*/

if(guess>magic) printf("Wrong!Toohigh!\n");

elseif(guess<magic) printf("Wrong!Toolow!\n");elseprintf("Right!\n");

}while

(guess!=magic); printf("counter=%d\n",counter);return0;}直到猜对为止例4.9猜数游戏用到的库函数改用系统时间作为随机数种子更好

#include<time.h>

srand(time(NULL));magic=rand()%100+1;函数time()取得系统时间的方法有两种:函数参数,函数返回值系统时间为从1970年1月1日0时0分0秒到time函数运行的那一刻所经过的时间的秒数使用NULL作为函数参数,使其不具备相应功能仅能从返回值取得系统时间,便于将函数写到表达式中#include<stdlib.h>#include<stdio.h>#include<time.h>intmain(void){

intmagic;

intguess;

int

counter;/*记录人猜次数的计数器变量*/

srand(time(NULL)); magic=rand()%100+1; counter=0;/*计数器变量count初始化为0*/

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;/*计数器变量count加1*/

if(guess>magic) printf("Wrong!Toohigh!\n");

elseif(guess<magic) printf("Wrong!Toolow!\n");elseprintf("Right!\n");

}while

(guess!=magic); printf("counter=%d\n",counter);

return0;}直到猜对为止例4.9#include<stdlib.h>#include<stdio.h>#include<time.h>intmain(void){

intmagic;

intguess;

int

counter;

srand(time(NULL)); magic=rand()%100+1; counter=0;

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;

if(guess>magic) printf("Wrong!Toolow!\n");

elseif(guess<magic) printf("Wrong!Toohigh!\n");elseprintf("Right!\n");

}while

(guess!=magic); printf("counter=%d\n",counter);

return0;

}直到猜对为止例4.9错在哪里?#include<stdlib.h>#include<stdio.h>#include<time.h>intmain(void){

intmagic;

intguess;

int

counter;

srand(time(NULL)); magic=rand()%100+1;

printf("magic=%d\n",magic); counter=0;

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;

if(guess>magic) printf("Wrong!Toolow!\n");

elseif(guess<magic) printf("Wrong!Toohigh!\n");elseprintf("Right!\n");

}while

(guess!=magic); printf("counter=%d\n",counter);

return0;

}直到猜对为止例4.9插入打印语句#include<stdlib.h>#include<stdio.h>#include<time.h>intmain(void){

intmagic;

intguess;

int

counter;/*记录人猜次数的计数器变量*/

srand(time(NULL)); magic=rand()%100+1; counter=0;/*计数器变量count初始化为0*/

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;/*计数器变量count加1*/

if(guess>magic) printf("Wrong!Toohigh!\n");

elseif(guess<magic) printf("Wrong!Toolow!\n");elseprintf("Right!\n");

}while

(guess!=magic&&counter<10); printf("counter=%d\n",counter);return0;}最多猜10次……do{ magic=rand()%100+1; counter=0;

do{

printf("Pleaseguessamagicnumber:");

scanf("%d",&guess); counter++;

if(guess>magic)

printf("Wrong!Toohigh!\n");

elsei

温馨提示

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

评论

0/150

提交评论