版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
循环结构的程序设计1第6章循环结构的程序设计本章要点循环语句的执行流程不同形式的循环控制多重循环问题简单算法设计2第6章循环结构的程序设计循环的基本概念while语句for语句do_while语句转移语句循环应用36.1循环的基本概念 提出问题提问:从键盘上输入10个整数并求和,怎么编程?回答:在程序中写10个scanf语句,还可以写%d%d…提问:从键盘上输入500个整数并求和,怎么编程?回答:这个,嗯……???不会让我写500个……以上问题的实质是:将scanf函数重复执行N遍。我们可以引出一个概念“循环”,简单而言:循环就是不断反复地执行同一段程序。?46.1循环的基本概念
循环
反复执行同一段程序,直到满足一定的条件后才停止执行该段程序。
C语言中控制循环的语句:
whilefordo_while5第6章循环结构的程序设计循环的基本概念while语句for语句do_while语句转移语句循环应用66.2while语句while语句格式while(表达式)语句; 说明:语句可是简单语句,也可是复合语句。while语句的执行流程76.2while语句表达式?执行语句成立不成立执行while循环之后的语句循环控制条件循环体while(表达式) 语句;8例:从键盘输入10个整数,求这10个整数之和程序主体:count<10?输入num成立不成立输出结果total计数器count=0累加器total=0total+=numcount++开始结束while(count<10){}count++;scanf("%d",&num);total+=num;89#include<stdio.h>intmain(){intcount,num,total;
/*count:计数器,num:输入的整数*/count=0;total=0; /*total:存放累加和*/while(count<10)/*循环控制条件*/{printf("EntertheNo.%d=",count);/*循环体*/scanf("%d",&num);total+=num;/*计算累加和*/
count++;
} printf("Total=%d\n",total);}10例:求n的阶乘n!(1<=n<=10)程序主体:
while(i<=n){ s*=i;i++;}i<=n?s*=i成立不成立输出结果计数器i=1累积器s=1i++开始结束递推公式:f(n)=1 当n=1时f(n)=f(n-1)*n当n>1时116.2while语句#include<stdio.h>intmain(){longs=1; /*s:存放累积结果*/inti=1; /*i:计数器,同时是累积的对象*/while(i<=10)/*循环控制条件*/{ /*循环体*/ s*=i; /*计算累积和*/i++;} printf(“10!=%d\n",s);}以求10!为例126.2while语句比较total=0;count=0;while(count<10){…total+=num;count++;}s=1;i=1;while(i<=10){…s*=i;i++;}10个数相加10个数相乘13例:分析程序运行结果#include<stdio.h>intmain(){ intn=0; while(n<3) printf(“nis%d\n”,n); n++;}结果:程序将不停的打印“nis0”,直至终止程序无法正常终止的程序,称为“死循环”。结论:while语句循环体中,一定要有能够对循环控制条件产生影响的语句,避免出现“死循环”现象。{}14例:求1413的最后三位数。问题分析:14的13次方已经超出了计算机所能表示的整数范围乘法规律:乘积的最后三位的值只与乘数和被乘数的后三位有关C语言中最长的整数是:无符号长整型数:0~429496729510位1410=28925465497612位问题被简化为求三位数乘法156.2while语句intmain(){inti=1,x,y,a=1;printf("InputXandY:");scanf("%d**%d",&x,&y);
while(i<=y){a=a*x%1000;i++;}printf("3digitsis:");printf("%d\n",a%1000);}InputXandY:14**133digitsis:144InputXandY:15**123digitsis:625166.2while语句如何一次输入多个字符或数值例:将从键盘输入的一行字符(回车结束)复制到标准输出(显示器)。
回顾字符输入输出函数: getchar():调用时,等待用户按键,输入的字符存入键盘缓冲区,直到用户按Enter为止(Enter即\n也在缓冲区)。输入Enter后,getchar从输入流每次读一个字符,作为其返回值。其它未读的字符保留在缓冲区,待下一个getchar调用。176.2while语句#include<stdio.h>intmain(){charch;ch=getchar();while(ch!=‘\n’){putchar(ch); ch=getchar();}}ch!=‘\n’?显示ch成立不成立ch=读入一个字符ch=读入下一个字符开始结束ab13cdeab13cdeputchar(ch=getchar());putchar(getchar());186.2while语句#include<stdio.h>intmain(){charch;while((ch=getchar())!=‘\n’) putchar(ch);}一段更简洁的程序196.2while语句例:输入若干整数,竖排输出,当输入为0时程序结束。如:输入13-63560输出: 13 -6
356 scanf(…):调用时,等待用户输入,输入的内容存入键盘缓冲区,直到用户按Enter为止。输入Enter后,scanf从输入流每次按格式读一个单元,作为其返回值。其它未读的内容保留在缓冲区,待下一个scanf调用。206.2while语句#include<stdio.h>intmain(){intx;scanf(“%d”,&x);while(x){printf(“%d\n”,x); scanf(“%d”,&x);}}scanf()把缓冲区的内容全部读完以后,才再次等待用户从键盘输入输入:13-63560输出:13-6356输入:13-635607输出:13-6356输入:13-6216.2while语句循环嵌套
在循环体中,又包含有循环语句。
while { … while {
… }
… }22例:输出下三角形乘法九九表。
123456789---------------------------------------------12436948121651015202561218243036714212835424981624324048566491827364554637281
假设:行号为i,列号为j
则第i行中一共要输出i个乘积,每一项为i*j。(1<=i<=9)(1<=j<=i)i=6j=5i*j屏幕上的字符只能从上到下逐行显示,同一行内,只能从左到右逐字显示。2223显示要求
屏幕上的字符只能从上到下逐行显示,同一行内,只能从左到右逐字显示。伪代码(Pseudocode)while(控制显示n行){while(控制显示一行中的m个字符){输出一个需要的字符;列计数器j++;}行数计数器i++;}24 #include<stdio.h>intmain(){inti=1,j;/*i:行计数器j:列计数器*/while(i<=9)/*控制打印表头*/printf("%4d",i++);printf("\n--------------------------------------\n");i=1;while(i<=9){j=1;/*列计数器置1*/while(j<=i)/*嵌套的二重循环,输出第i行*/ {printf("%4d",i*j);j++;/*列计数器+1*/}printf("\n");/*一行输出结束后,输出\n*/i++;/*行计数器+1*/}}外层循环体执行1次,内层循环要完整执行1次25第6章循环结构的程序设计循环的基本概念while语句for语句do_while语句转移语句循环应用266.3for语句for语句格式for(表达式1;表达式2;表达式3) 语句;说明:语句可是简单语句,也可是复合语句。for语句的执行流程27循环初始条件循环控制条件表达式2?执行语句成立不成立执行for循环之后的语句执行表达式3执行表达式1循环体
for(表达式1;表达式2;表达式3)语句;for语句等价于下列语句:表达式1;while(表达式2){语句;表达式3;}286.3for语句#include<stdio.h>intmain(){longn=1;inti; i=1;while(i<=10){n*=i; i++;} printf(“10!=%d\n",n);}for(i=1;i<=10;i++) n*=i; for语句最常用的形式:for(初值;控制条件;增量)语句;29例:用for语句实现打印乘法九九表#include<stdio.h>intmain(){inti,j;for(i=1;i<=9;i++)printf("%4d",i);printf("\n--------------------------------------\n");for(i=1;i<=9;i++)for(j=1;j<=i;j++) printf(j==i?"%4d\n":"%4d",i*j);}输出函数printf中使用了“?”操作,含义相当于:if(j==i) printf("%4d\n",i*j);else printf("%4d",i*j);30for语句的变化形式
for语句中的三个表达式中的任意一个都是可以省略的,但是分号不能省略。省略表达式2,则:
for(表达式1;;表达式3)省略表达式1和表达式3,则:
for(;表达式2;)
据此可得结论:所有用while语句实现的循环都可以用for语句实现。表达式1、2、3全省略,则:
for(;;)等同于:while(表达式)构成一个死循环等同于:while(1)316.3for语句
草原上有一对小兔子,它们刚出生后的第1个月就会逐步长大,到了第2个月末就生出一对小兔子。第3个月大兔子会继续生一对小兔子,而第2个月出生的小兔子会逐步长大。第4个月时,第1月出生的兔子继续生育,第2月出生的小兔子也可以生育一对小兔子了,第3月出生的小兔子则逐步长大……
假设这些草原的兔子非常长寿,可以认为它们不会死亡。请建立数学模型,计算第N个月时,草原上将会有多少对兔子?326.3for语句例:数列1、1、2、3、5、8、13、21、…是著名的菲波那契数列,其递推通项公式为:
F1=F2=1 Fn=Fn-1+Fn-2 (n>=3)
为求出第N项的值,请编写程序。 根据递推通项公式,可用递推法编写程序,计算第N项的值。336.3for语句递推法
由初始的已知条件开始,先计算出第(N-1)步的结果,再利用已知的前(N-1)项结果,按递推公式(或遵照递推规则),推出第N步结果。 递推法是程序设计中最常用的方法之一,使用递推法必须有明确的递推初始值和递推规则(递推公式)。34程序主体f=f2=1;for(i=3;i<=n;i++){f1=f2;f2=f;f=f1+f2;}i<=n?向前传递前两项f1=f2f2=f成立不成立初始化:f=f2=1计算f=f1+f2递推项:i=3i++数列对应关系:f1,f2,f递推计算f1=f2=1;for(i=3;i<=n;i++){f=f1+f2;f1=f2;f2=f;}35#include<stdio.h>intmain(){longf1,f2,f;inti;for(;;){printf("Inputn=?");scanf("%d",&n);if(n>=3)break; /*退出for循环*/elseprintf("\nInputniserror!\n");} /*控制输入正确的N值*/f=f2=1;/*设置递推初始值*/for(i=3;i<=n;i++)/*用递推法计算第N项的值*/{f1=f2;f2=f;f=f1+f2;}printf("No.%dis%d\n",n,f);}36语句中的逗号(,)运算 逗号(,)运算常见的三种用途是:在变量说明表中用来分隔变量,起分隔符的作用,如:inti,j,k,m[3],*p;在函数的参数表中分隔参数。如:printf("n=%d,x=%d\n",n,x);在语句中使用。其形式是:表达式n1,表达式n2; 用逗号分隔开的表达式从左到右进行计算,结果的类型和值是最右边表达式的类型和值。376.3for语句例:输出下列字符串:azbycxdwevfugthsirjqkplomn分析:奇数位上的字符从'a'开始逐次递增,偶数位上的字符从'z'开始逐次递减。#include<stdio.h>intmain(){chari,j; /*i:奇位字符j:偶位字符*/for(i='a',j='z';i<j;i++,j--) printf("%c%c",i,j);/*输出两个字符*/printf("\n");}azbycxdwevfugthsirjqkplomn38第6章循环结构的程序设计循环的基本概念while语句for语句do_while语句转移语句循环应用396.4do_while语句do_while语句格式
do{ 语句; }while(表达式);do_while语句的执行流程406.4do_while语句表达式?执行语句成立不成立执行while子句之后的语句循环控制条件循环体后判断do{ 语句;}while(表达式);416.4do_while语句do_while语句的特点 与while和for的区别:
do_while语句先执行循环体然后再判断循环控制条件;使用do_while构成的循环,循环体部分至少要执行一次,使用while和for构成的循环,循环体部分有可能一次也不会执行。 do_while语句条件表达式后面的分号不是空语句。426.4do_while语句#include<stdio.h>intmain(){longn=1;inti; i=1;while(i<=10){n*=i; i++;} printf(“10!=%d\n",n);}for(i=1;i<=10;i++) n*=i; i=1;do{n*=i; i++;}while(i<=10);436.4do_while语句例:输入一个>=0的整数,要求以相反的顺序输出。例如:输入12345,则输出为54321。思路:可以从个位开始,按位输出整数的每一位
intmain(){unsignedintnum;printf("Inputthenumber:");scanf("%d",&num);do{printf("%d",num%10);num/=10; /*num缩小10倍*/}while(num!=0);}简单转变为while或for语句,程序将不能处理数字0。446.4do_while语句例:从键盘输入任意的字符,按下列规则进行分类计数。第一类‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’第二类‘+’,‘-’,‘*’,‘/’,‘%’,‘=’第三类其它字符当输入字符‘\’时先计数然后停止接收输入。45intmain(){intclass1=0,class2=0,class3=0;charch;do{putchar(ch=getch());/*函数的嵌套调用*/switch(ch){case'0':case'1':case'2':case'3':case'4':case'5’:case'6':case'7':case'8':case'9':class1++;break;/*对分类1计数*/case'+':case'-':case'*':case'/':case'%':case'=':class2++;break;/*对分类2计数*/default:class3++;break;/*对分类3计数*/}}while(ch!='\\');printf("class1=%d,class2=%d,class3=%d\n",class1,class2,class3);}46循环语句小结C语言提供三种循环:for、while、do_whilefor和while先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件;while和do-while语句的条件表达式只有1个,for语句有3个表达式,表达式2是条件表达式;while、do-while、for可以相互替换使用;while语句多用于不需要赋初值的或循环次数不定的情况;
for语句多用于要赋初值或循环次数固定的情况;
do-while语句多用于至少要运行一次的循环;循环语句可串可并可嵌套,但不能交叉。47循环语句小结为了保证循环正常运行,应该特别注意:循环控制条件控制条件的初始状态(初始值)循环体内部对控制条件的影响以上三个方面相互配合,相互影响,共同完成循环控制48第6章循环结构的程序设计循环的基本概念while语句for语句do_while语句转移语句循环应用496.5转移语句转移语句的作用 改变程序的运行流程C语言转移语句breakcontinuegotoreturn506.5.1break语句格式 break;功能在switch语句中结束case子句,使控制转到switch语句之外。在循环语句的循环体中使用,结束循环过程,使控制转移到整个循环语句之外的下一条语句处。51break语句的执行流程表达式?成立不成立后续语句break表达式2?成立不成立后续语句执行表达式3执行表达式1break表达式?成立不成立后续语句breakwhile语句for语句do-while语句52例:求555555的约数中最大的三位数intmain(){intj;longn;printf("Pleaseinputnumber:");scanf("%ld",&n);
/*所求的约数的可能取值是从999到100,j从大到小*/for(j=999;j>=100;j--)if(n%j==0)/*若能被j整除,则j是约数*/{printf("3digitsin%ld=%d\n",n,j); break;/*控制退出循环*/}return0;}536.5.1break语句break语句使用注意在嵌套循环中,break语句仅能退出一层(当前层)循环;若在循环语句中包含了switch语句,那么switch语句中的break语句仅能使控制退出switch语句;break语句并不是程序设计中必不可少的语句,可以通过改变程序的结构去掉。546.5.2continue语句格式continue;功能
continue语句仅能在循环语句中使用:它的作用不是结束循环,而是开始一次新的循环。对于for语句,将控制转到执行表达式3和条件测试部分;对于while和do-while语句,将控制转到条件测试部分;从逻辑上讲,适当改变程序的结构就可以不需要使用continue语句。55continue语句的执行流程表达式?成立不成立后续语句continue表达式2?成立不成立后续语句执行表达式3执行表达式1continue表达式?成立不成立后续语句continuewhile语句for语句do-while语句56例:输入10个整数,求其中正数的个数及平均值,精确到小数点后两位。
intmain(){inti,count=0,j,sum=0;for(i=1;i<=10;i++){printf("Inputinteger:");scanf("%d",&j);
if(j<=0) continue;
/*结束本次循环,不进行后续操作*/count++;/*计数器*/sum+=j;/*求累加和*/}if(count>0)printf("Plusnumber:%d,averagevalue:%.2f", count,1.0*sum/count);elseprintf("Plusnumber:0,averagevalue:0");}576.5.3goto语句格式 goto标号;功能
将程序控制转移到标号所指定的语句处继续执行。标号的唯一功能就是作为goto语句的目标。标号的作用域是它所在的整个函数。注意:为了保证程序的结构化,不允许使用向上goto语句586.5.3goto语句例:已知一首项大于0的等差递增数列的前四项和为26,前四项的积为880,求这数列。设数列的第一项为a(a>0),公差为d(d>0)。则该数列满足条件:a+(a+d)+(a+2*d)+(a+3*d)=4*a+6*d=26a*(a+d)*(a+2*d)*(a+3*d)=880可以推出,首项a和公差d的取值范围为:1<=a<=51<=d<=3可以使用穷举的方法,在首项a和公差d的取值范围内进行判断。596.5.3goto语句intmain(){inta,x,y,d,i;for(a=1;a<=5;++a)
/*在a的范围内穷举*/for(d=1;d<=3;++d)/*在d的范围内穷举*/{x=a+(a+d)+(a+2*d)+(a+3*d);/*前四项的和*/ y=a*(a+d)*(a+2*d)*(a+3*d);/*前四项的积*/ if(x==26&&y==880)/*若满足条件*/
goto
out;/*退出二重循环*/}out:
/*语句标号*/for(i=0;i<=20;++i)/*输出运行结果*/printf("%d,",a+i*d);}606.5.3goto语句intmain(){inta,x,y,d,i,flag=1;/*flag:标志变量*/for(a=1;a<=5&&flag;++a)/*flag!=0是进行循环*/for(d=1;d<=3&&flag;++d){x=a+(a+d)+(a+2*d)+(a+3*d);/*前四项的和*/ y=a*(a+d)*(a+2*d)*(a+3*d);/*前四项的积*/ if(x==26&&y==880)/*若满足条件*/ {for(i=0;i<=20;++i)/*输出结果*/printf("%d,",a+i*d);
flag=0;
/*控制退出二重循环*/}}}通过增加标志变量可以有效地控制循环616.5.4return语句格式格式1:return;格式2:return(表达式);功能return语句使程序从被调用函数中返回到调用函数的调用处继续运行;如果return后跟一表达式,则该表达式的值会从被调用函数中带回到调用它的函数,称为返回值。几个程序片段ints=1,i=1;scanf(“%d”,&n);while(i<=n)s*=i++;62求阶乘intpower(intx,inty){intpro=1;while(y-->0)pro*=x;returnpro;}63子函数power:计算x的y次方不要用标准库函数pow处理整型intm=0;scanf("%d",&n);do{m=m*10+n%10;n/=10;}while(n!=0);64求反序数例:求最大最小数的算术运算结果用例输入:15,1,11,2,0,3,+,=输出:15+0=15如何用字符输入形式读入一个整数?ints=0;charch;while((ch=getchar())!=‘=’){if(ch>='0'&&ch<='9')s=s*10+ch-'0';else…}65inta,b;charch;scanf(“%d%c%d”,&a,&ch,&b);scanf(“%c”,&ch);输入35后,a为3,b为5,ch为'\n'66“字符”对“%d”来讲是非法输入,但对%c是合法的,空格和\n等也将不作为输入结束标志。charch;while((ch=getchar())!='=')putchar(ch);67如何判断“没有任何一项匹配上”?6869第6章循环结构的程序设计循环的基本概念while语句for语句do_while语句转移语句循环应用70程序设计的一般步骤分析题意,明确问题的性质数值问题/非数值问题建立问题的描述模型数学模型/过程模型设计/确定算法数学问题:数值分析非数学问题:数据结构/算法分析与设计一般方法:穷举/递推/递归/…...编程调试分析运行结果716.6循环应用穷举法
72例:百钱百鸡问题中国古代数学家张丘建在他的《算经》中提出了著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?
问题分析与算法设计设:要买x只公鸡,y只母鸡,z只小鸡,可得到方程:x+y+z=100① 5x+3y+z/3=100②取值范围:0<=x,y,z<=100
可以采用穷举法求解:将变量x、y、z的所有取值可能代入方程进行计算73intmain(){intx,y,z,j=0;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==100)printf("%2d:cock=%2dhen=%2dchicken=%2d\n",++j,x,y,z);}运行结果:1:cock=0hen=25chicken=752:cock=3hen=20chicken=77………………7:cock=12hen=4chicken=84z<=100满足方程?YN输出z++z=0y<=100y++y=0x<=100x++x=0开始结束74丢失重要条件:z应该能够被3整除。intmain(){intx,y,z,j=0;for(x=0;x<=20;x++)for(y=0;y<=33;y++)for(z=0;z<=100;z++)if(z%3==0&&x+y+z==100&&5*x+3*y+z/3==100)printf("%2d:cock=%2dhen=%2dchicken=%2d\n",++j,x,y,z);}运行程序,正确的结果:1:cock=0hen=25chicken=752:cock=4hen=18chicken=783:cock=8hen=11chicken=814:cock=12hen=4chicken=84z+=3)75优化程序:for(x=0;x<=20;x++)for(y=0;y<=33;y++)for(z=0;z<=100;z++)if(z%3==0&&x+y+z==100&&5*x+3*y+z/3==100)printf("%2d:cock=%2dhen=%2dchicken=%2d\n",++j,x,y,z);再优化:for(x=0;x<=20;x++)for(y=0;y<=(100-5*x)/3;y++){z=100-x-y;if(z%3==0&&5*x+3*y+z/3==100)printf("%2d:cock=%2dhen=%2dchicken=%2d\n",++j,x,y,z);}76例:新娘和新郎问题:三对情侣参加婚礼,三个新郎为A、B、C,三个新娘为X、Y、Z。有人不知道谁和谁结婚,于是询问了其中的三位,听到的回答是这样的:A说他将和X结婚;X说她的未婚夫是C;C说他将和Z结婚。这人听后知道他们在开玩笑,全是假话。请编程找出谁将和谁结婚。问题分析与算法设计:设:A、B、C三人用1、2、3表示,将X和A结婚表示为x=1,将Y不与A结婚表示为y!=1。则:x!=1A不与X结婚x!=3X的未婚夫不是Cz!=3C不与Z结婚 题意还隐含:x!=y且x!=z且y!=z77intmain(){intx,y,z;for
(x=1;x<=3;x++)/*穷举X的全部可能配偶*/for
(y=1;y<=3;y++)/*穷举Y的全部可能配偶*/
for(z=1;z<=3;z++)/*穷举Z的全部可能配偶*/if(x!=1&&x!=3&&z!=3&&x!=y&&x!=z&&y!=z){printf("Xwillmarryto%c.\n",'A'+x-1); printf("Ywillmarryto%c.\n",'A'+y-1);printf("Zwillmarryto%c.\n",'A'+z-1);}}78例:设有一个正整数X,当X加上100后得到的数Y是一个正整数的平方,然后用Y再加上68,又是另外一个正整数的平方,你能算出X为多少吗?问题分析与算法设计: 根据题目直接列方程:
y=x+100 y=m*m y+68=n*n 取值范围:x>0;n>m>10的整数79intmain(){intx,y,m,flag; /*flag:标志变量*/for(x=0,flag=1;flag;x++)/*穷举x*/{y=100+x;/*计算y*/for(m=10;m*m<y;m++);if(m*m==y)/*判断y是否为一个数的平方*/{for(;m*m<y+68;m++);if(m*m==y+68)/*判断y+68*/{printf("%d\n",x);flag=0;/*flag置0,结束循环*/}}}}穷举x、m、n80intmain(){inty,m,flag; for(y=101,flag=1;flag;y++)/*穷举y*/{for(m=10;m*m<y;m++);if(m*m==y){for(;m*m<y+68;m++);if(m*m==y+68){printf("%d\n",y-100);flag=0;}}}}穷举y、m、n81intmain(){intm,n,flag;/*flag:标志变量*/for(m=10,flag=1;flag;m++){/*通过穷举m,直接构造平方数y*/for(n=10;n*n<m*m+68;n++);/*判断m*m+68是否为平方数*/if(n*n==m*m+68){printf("%d\n",m*m-100);flag=0;/*flag置0,结束循环*/}}}穷举m、n826.6循环应用穷举法的关键判断问题是否适合使用穷举法明确穷举的终止条件穷举的对象(变量)的范围注意效率——减少尝试次数83求555555的约数中最大的三位数求不超过n的最大素数求首项大于0的等差数列:前四项和为26,前四项的积为880从键盘上任意输入一个正整数,要求判断该正整数是否是另一个整数的平方。百钱百鸡新娘和新郎其它排列组合问题亲密数、黑色星期五、求各位数字之和等于5且能被5整除的整数、马戏团观众人数、求等于其各位数字的阶乘之和的正整数、求满足条件的等差数列、乒乓球比赛对阵方案…846.6循环应用图形问题85例:在一行中输出n个*号。
例如,输入n=4,输出的图形如下:****基本语句: 输出一个*号:printf(“*”); 或putchar(‘*’);基本算法: 1.输入n 2.重复输出n个*; 3.输出一个\nscanf(“%d”,&n);while(n>0){printf(“*”);n--;}printf(“\n”);86例:输出边长为n的正方型 例如,输入n=4,输出如下图形:****************算法分析与设计:
1.输入n; 2.重复输出n行,每行输出n个*; 加细一: 1.输入n; 2.for(i=1;i<=n;i++) 输出一行中的n个*;87 加细二: 1. 输入n; 2. for(i=1;i<=n;i++) { 输出n个*
; 换新行; } 加细三: 1. 输入n; 2. for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf(“*”); printf(“\n”); }88整理,得到程序如下:intmain(){intm,i,j;scanf(“%d”,&n);for(i=1;i<=n;i++) /*控制输出n行*/{for(j=1;j<=n;j++)/*输出一行中的n个*号*/ printf(“*”);printf(“\n”);}}分析方法——逐步求精法 对于比较复杂问题,不可能一下得到程序,可以先将简单的部分明确出来,再逐步对复杂部分进行细化,一步一步推出完整程序。89例:输出边长为n的平行四边形
例如,输入n=4,输出如下图形:
****************算法分析与设计: 在正方型每行*号的前面先多输出若干个空格。对于第i行,1<=i<=n,则应先输出个空格。
n-i90intmain(){intn,i,j;scanf(“%d”,&n);for(i=1;i<=n;i++) /*控制输出n行*/{for(j=1;j<=n-i;j++)/*控制输出n-i个空格*/printf(“”);for(j=1;j<=n;j++)/*输出一行中的n个*号*/ printf(“*”);printf(“\n”);}}关键在于找出每行要输出的空格和*的个数91i=1n…j=ii=1n…i+j=n+1**************
***
**
*j控制输出i个*j:i-1个
**********
*
**
******
*j:n-i+1个*j:n-i个
j:n-i+1个*j:i个*j=n-i+192例:输出n行用*组成的等腰三角形 例如,输入n=4,输出如下图形:
*
***
********
****j=1…n-i
j=1…2i-1*(“\n”)i=1…ni个*i-1个*93例:输出边长为n的菱形 例如,输入n=4,输出如下图形:
*
***
********
*************j=1…n-i
j=1…2i-1*i=1…nj=1…n-i
j=1…2i-1*i=n-1…1i=123432194例:输出边长为n的空心菱形 例如,输入n=4,输出如下图形:
*
**
*********j=1…n-i
j=1…2i-1如果j=1或2i-1*其它i=1…n同左i=n-1…195打印图形小结intmain(){
intn,i,j;
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”);}}*
***
********
****外层循环控制打印图形的行数,循环量即是行数循环体内是一行内打印的各种字符循环体内最后一条语句是回车换行,决定以上内容为一行一种连续字符用一个循环,字符的个数用循环次数控制特殊情况特殊处理96
*
**
*********
*
**
*********97例:打印数字魔方。 例如,输入n=5,输出的图形如下:
12345 23451 34512 45123 51234
基本算法:重复打印n行。第i
行的第一个数字为i,之后依次递增,但以n为模:aij=(i+j-2)%n+1
输出项aij与前一项的关系,或者与行i、列j的关系98intmain(){inti,j,n;printf("EnterN:");scanf("%d",&n);for(i=1;i<=n;i++)/*控制打印n行*/{for(j=1;j<=n;j++)/*打印行中的数字*/printf("%d",(i+j-2)%n+1);printf("\n");}}99例:输出数字阵列:
1234 5678 9101112 13141516算法分析与设计: 设法找到数字的分布规律,用循环的方式自动生成。阵列中数字按行的顺序依次是1,2,…16。100#defineN4intmain(){inti,j,k=1;for(i=1;i<=N;i++){for(j=1;j<=N;j++)printf(“%4d”,);printf(“\n”);}}在行、列输出循环的基础上加入一个自增变量k++101例:输出数字阵列:
1234 1213145 1116156 10987算法分析与设计:
用二维数组a[n][n]更简单一些。102例:打印数字菱形:
4 434 43234 4321234432344344算法分析与设计:
在实心菱形基础上加入一个自变量k103voidtri(intn,intq){intj,k=n;for(j=1;j<=n-q;j++)printf("");for(j=1;j<=q;j++)printf("%-2d",k--);k++;for(j=q-1;j>=1;j--)printf("%-2d",++k);printf("\n");}intmain(){intm,i;scanf("%d",&m);for(i=1;i<=m;i++)tri(m,i);for(i=m-1;i>=1;i--)tri(m,i);}104例:打印数字菱形:
1361015第1行 25914第2行 4813 712 11算法分析与设计:
判断输出项aij与行号i和列号j之间的关系。增1增2增3增4增3增4增5增2增4增5增3每行第一个数k加当前行的行号i等于下一行第一个数;当前数m加上该数所在行号i和列号j,等于下一个数105intmain(){inti,j,n,m,k=1;scanf(“%d”,&n);for(i=1;i<=n;i++){m=k;for(j=1;j<=n-i+1;j++){printf(“%4d”,m);
m=m+i+j;}printf(“\n”);
k=k+i;}}106打印字符图形小结先考虑形状的输出——用来控制循环;然后考虑数字或字符的分布规律——按照从上到下、从左到右的打印顺序,当前位置的输出项与行号i和列号j以及前一个输出项之间的关系。107思考:打印回形方阵: 要求:从键盘输入边长n,输出回形方阵。例如,输入n=5,n=6,输出的图形如下:
11111 111111 12221 122221 12321n=5 123321n=6 12221 123321 11111 122221 111111108D.i>(n+1)/2j>(n+1)/2C.i>(n+1)/2j<=(n+1)/2B.i<=(n+1)/2j>(n+1)/2A.i<=(n+1)/2j<=(n+1)/2
将图形分为四个区:11111 11111112221 12222112321 12332112221 12332111111 122221 111111上三角元素的行号小于列号,输出与行号一致下三角元素的行号大于列号,输出与列号一致1096.6循环应用图形问题的关键没有明确的数学模型,依靠对图形的观察屏幕上的字符只能从上到下逐行显示,同一行内,只能从左到右逐字显示多使用循环,有时要用到数组算法的核心问题是确定循环控制变量i、j的范围输出项aij与行i、列j的关系,或与上一个输出项的关系110编写程序的实用步骤建立数学模型确定整体控制流程:用顺序、分支还是循环循环
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024简单个人房屋租赁合同书
- 2025个人房屋租赁合同样书
- 标准二手写字楼买卖合同6篇
- 精准医疗的基石实时超声科案例分析
- 视频编辑初级教程制作专业影音作品
- 课题申报参考:可行能力视角下进城农民农村集体经济组织权益的保障机制重构研究
- 2024年AB胶项目资金需求报告
- 科技产品在小红书的营销策略研究
- 二零二五年度工业厂房租赁安全风险评估与管理合同3篇
- 二零二五年度电子商务平台交易催收保密合同2篇
- 图像识别领域自适应技术-洞察分析
- 个体户店铺租赁合同
- 礼盒业务销售方案
- 二十届三中全会精神学习试题及答案(100题)
- 小学五年级英语阅读理解(带答案)
- 仁爱版初中英语单词(按字母顺序排版)
- (正式版)YS∕T 5040-2024 有色金属矿山工程项目可行性研究报告编制标准
- 小学一年级拼音天天练
- 新概念英语第二册考评试卷含答案(第49-56课)
- 【奥运会奖牌榜预测建模实证探析12000字(论文)】
- 保安部工作计划
评论
0/150
提交评论