nullnull教学目标教学目标掌握循环结构的程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
和经典的算法
掌握三种循环语句的应用。
掌握循环结构的嵌套。
掌握break和continue语句的使用。
教学
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
教学内容
while语句
do-while语句
for语句
循环的嵌套
break和continue语句引例一引例一求任意圆面积,∏取3.14159
要求输入半径,判断是否是负数,如果是负数循环输入半径,直到输入非负数,求圆面积,输出面积
引例二引例二求t=2100
一种解法t=pow(2.0,100.0);
第二种解法
t=1(积变量);i=1(计次数变量)
执行语句t=t*2;i++ 100次;
循环结构需要解决的两个问题循环结构需要解决的两个问题控制循环执行的条件表示(循环条件的描述)
可以使用c中的任意表达式,一般是关系表达式或逻辑表达式
循环结构的结构描述
nullwhile语句
格式:while(表达式) 语句;
执行流程:如果是多条语句也需要使用复合语句,即用打括号{}括住这一组语句,这一组语句称为循环体引例一while实现#include
#include
#define PI 3.14159
void main()
{ float r,s;
scanf("%f",&r);
s=(float)(PI*pow(r,2.0));
printf("半径=%f的圆面积为:%f",r,s);
}
while(r<0)
scanf("%f",&r);
引例一while实现引例二while实现
求t=2100引例二while实现
求t=2100#include
/*#include */
void main()
{
int i=1;
float t=1.0;
printf("2的100次方=%f\n",t);
/*printf("%f",pow(2,100));*/
}while(i<=100)
{
t=t*2;
i++;
}null实际问题:
有一个水缸,第一次倒入一瓶矿泉水,
第二次倒入两瓶矿泉水,
依次倒入三,四……十瓶矿泉水,
问水缸里最后一共倒入几瓶矿泉水。 其数学模型为:
求1+2+3+……+10
典型的累加和问题null这是一个典型的用循环结构解决的问题
算法分析:
用加数变量i来表示每次加入累加器(和变量)中的值
i初值为0,从1开始累加到累加器的变量后,自加1,然后再累加到累加器中,累加操作在
i<10时一直进行。
换句话说:需要进行的操作是在加数变量i<10的情况下,需要重复执行语句组: (i=i+1;sum=sum+i;)
010程序实现#include
void main( )
{
int i = 0 ,sum = 0;
while( i < 10 ) /*循环结构*/
{
i = i + 1;
sum = sum + i;
}
printf("%d",sum);
}程序实现累加累积问题累加累积问题编程实现
2+4+6+8+……+2*n,n从键盘输入
1+3+5+……+2*n-1
n!
xy示例1 :2+4+6+8+……+2*n程序实现#include
void main( )
{
int i = 0 ,sum = 0;
int n;
Scanf(“%d”,&n);
while( i < 10 ) /*循环结构*/
{
i = i + 1;
sum = sum + i;
}
printf("%d",sum);
}示例1 :2+4+6+8+……+2*n程序实现2*in2*ni2练习:1+3+5+……+2*n-1示例2:n!程序实现
分析:n!=1*2*3*……*n#include
void main( )
{
int i = 0 ,sum = 0;
int n;
Scanf(“%d”,&n);
while( i < 10 )
{
i = i + 1;
sum = sum + i;
}
printf("%d",sum);
}示例2:n!程序实现
分析:n!=1*2*3*……*n*n1#include
void main( )
{
int i = 0 ,t = 1;
int n;
Scanf(“%d”,&n);
while( i < n ) /*循环结构*/
{
i = i + 1;
t = t* i;
}
printf("%d",t);
}练习:xy示例3:统计输入的一批学生的平均成绩从键盘输入一批学生的成绩,计算平均分。
分析:
求累加和
确定循环条件
不知道输入数据的个数,无法事先确定循环次数
用一个特殊的数据作为正常输入数据的结束
标志
禁止坐卧标志下载饮用水保护区标志下载桥隧标志图下载上坡路安全标志下载地理标志专用标志下载
,比如选用一个负数作为结束标志。示例3:统计输入的一批学生的平均成绩null#include
int main(void)
{ int num;
double grade, total;
num = 0; total = 0;
printf("Enter grades: \n");
scanf("%lf", &grade); /* 输入第1个数*/
while (grade >= 0) { /* 输入负数,循环结束 */
total = total + grade;
num++;
scanf ("%lf", &grade);
}
if(num != 0)
printf("Grade average is %.2f\n", total/num);
else
printf(" Grade average is 0\n");
return 0;
}Enter grades: 67 88 73 54 82 -1
Grade average is 72.80Enter grades: -1 67 88 73 54 82
Grade average is 0修改程序:成绩个数从键盘输入?nulldo-while语句
格式:do
语句
while(表达式);
执行流程:分号;一定不能丢While 与do-while区别While 与do-while区别当循环条件一开始就不成立的话:
while的循环体一次都不运行;
do-while的循环体会运行一次;
换句话说不管在何种情况下do-while的循环体至少会运行一次示例1:示例1: #include
void main()
{ int k =100; while (k<0)
k=k-1; printf("%d",k);
}
#include
void main()
{ int k =100; do
k=k-1;
while (k<0) ;
printf("%d",k);
}99示例2:示例2:#include
void main( )
{
int i,sum=0;
scanf("%d",&i);
while(i<=10 )
{
sum=sum+i;
++i;
}
printf("sum=%d",sum);
}#include
void main( )
{
int i,sum=0;
scanf("%d",&i);
do
{
sum=sum+i;
++i;
}while(i<=10 );
printf("sum=%d",sum);
}示例3:引例一do-while实现示例3:引例一do-while实现#include
#include
#define PI 3.14159
void main()
{ float r,s;
scanf("%f",&r);
while(r<0)
scanf("%f",&r);
s=(float)(PI*pow(r,2.0));
printf("半径=%f的圆面积为:%f",r,s);
}
do
{
scanf("%f",&r);
}while(r<0 );null示例4:编写满足1+2+3+…+n<500中最大的n并求其和的程序。本题是一个累加求和的问题,
当累加和sum500时反复执行
循环体(n=n+1; sum+=n;),否则结束循环。01null #include
void main( )
{
int n = 0 , sum = 0;
do
{
++n;
sum += n;
}while ( sum < 500 );
printf(“n=%d,sum=%d" , n – 1,sum);
}请使用while改写该例?结果n=31 sum=496 示例5:统计一个整数的位数 示例5:统计一个整数的位数从键盘读入一个整数,统计该数的位数。
举例:12345
12345/10=1234,count=1
1234/10=123, count=2
123/10=12, count=3
12/10=1, count=4
1/10=0, count=5
定义变量number,count=0程序解析-统计一个整数的位数int main(void)
{ int count, number;
count = 0;
printf(“Enter a number: ");
scanf ("%d", &number) ;
if (number < 0) number = -number;
do {
number = number / 10;
count ++;
} while (number != 0);
printf("It contains %d digits.\n", count);
return 0;
}程序解析-统计一个整数的位数Enter a number: 12534
It contains 5 digits.Enter a number: -99
It contains 2 digits.Enter a number: 0
It contains 1 digits.while (number != 0) {
number = number / 10;
count ++;
}写成while循环会出什么问题?示例5扩展1 将一个正整数逆序输出示例5扩展1 将一个正整数逆序输出确定:循环条件和循环体(循环不变式) 12345 5 4 3 2 1
12345 % 10 = 5 12345 / 10 = 1234
1234 % 10 = 4 1234 / 10 = 123
123 % 10 = 3 123 / 10 = 12
12 % 10 = 2 12 / 10 = 1
1 % 10 = 1 1 / 10 = 0 结束循环不变式 x%10 x=x/10
循环结束条件 x==0scanf( “%d”, &x);
while (x != 0){
digit = x %10;
x = x/10 ;
printf( "%d ", digit);
}null12345 /10000 = 1
12345 %10000 =2345
2345 /1000 = 2
2345%1000 =345
345 /100 = 3
345%100 =45
45 /10 = 4
45%10 =5
5/1= 5
5%1=5示例五扩展2 输入一个整数,从高位开始逐个数字输出。x!=0
X=x/10;
Count++p!=0输出x/p;
x=x%p
p=p/10
先判断其为几位数,
找输入数据对应的最高位的10的幂p;
从最高位逐个输出各位
X=x/10;
Count++输出x/p;
x=x%p
p=p/10
X=x/10;
Count++输出x/p;
x=x%p
p=p/10
X=x/10;
Count++p!=0输出x/p;
x=x%p
p=p/10
X=x/10;
Count++null两段主要程序:
(1)do
{
x =x /10;
count++;
} while (x != 0)
p= pow(10,count-1);
(2)while(p!=0) { printf(“%d ”,x/p) ;
x=x%p;
p=p/10;
}求为几位数,以确定一开始的除数得到最高位输出,同时得到下一个待处理数和下一个除数,为下次循环做准备完整程序完整程序void main(void)
{ int count, x;
count = 0;
printf(“Enter a number: ");
scanf ("%d", &x) ;
if (x < 0) x = -x;
do {
x = x / 10;
count ++;
} while (x != 0);
printf("It contains %d digits.\n", count);
},temp,p; temp=x;p=(int)pow(10,(count-1));
x=temp;
while(p!=0)
{
printf("%d ",x/p);
x=x%p;
p=p/10;
}
}
nullfor语句
格式:
for(表达式1;表达式2;表达式3) 语句;
执行流程:1、表达式1,2,3
可以是任何类型
的表达式,甚至
可以省略,但是中间的分号(;)不能省略。
2、表达式1只做一次
null #include “stdio.h”
void main( )
{
int i ,sum=0;
for(i=1; i<=10; i++)
sum=sum+i;
printf("%d",sum);
}用for语句实现1+2+3+4+……+10请与前面的while,do_while 的实现作比较while 和 for 的比较while 和 for 的比较for (i = 1; i <= 10; i++)
sum = sum + i; i = 1; /* 循环变量赋初值*/
while (i <= 10) /*循环条件*/
{
sum = sum + i;
i++; /*循环变量的改变*/
}null如:n = 1;
for ( ; n <= 10; )
{ sum = sum + n;
n++;
} 1、同时省略表达式1和表达式3,只有表达式2,相当于while语句While(n<=10)for的几种形式null
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
2.省略表达式1时,应在 for 前写表达式1;
如: n = 1;
for ( ; n <= 100 ; n++ ) sum = sum + n;3. 表达式3省略时,表达式3应该写在循环体内
如: for ( n = 1; n <= 10 ; )
{ sum+= n; n += 2; }null4.表达式2省略时,将成为“死循环”,
需要在循环体中引入 特殊的退出语句以退出循环
如: for ( n =1; ; n++)
{ if ( n > 10 ) break;
sum+= n;
}5. 表达式2一般是关系表达式或逻辑表达式,也可以是其他的合法表达式比如数值表达式或字符表达式,只要其值不等于0 就执行循环体如: for( n = 1; n - 4; n++)
sum = sum + n;
当 n 的值等于4时终止循环。n - 4 是数值表达式。 null表达式1;表达式3;}{}这个分号
不能移走这个分号
不能丢掉for ( 表达式1 ; 表达式2 ; 表达式3 )
{语句表达式1可以移到
for语句的前边表达式3可以移到
循环题语句的后边表达式2为空
值永远为真
成为死循环null for(i=1,j = n;i < j;i + +,j - - )语句;for的另外一种形式逗号表达式for( j=2, find=1; j<=x-1&&find==1; j++)
if( x%j==0 ) find=0;null逗号运算符和逗号表达式
逗号运算符: ,
逗号表达式:
表达式1,表达式2
求解过程:
先求解表达式1,再求表达式2,整个逗号表达式的值是表达式2的值。
逗号运算符是所有运算符中级别最低的。
null逗号运算符和逗号表达式(续)
例如
a=4*6,a+5
/*整个逗号表达式的值为29。*/
注意
一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式,例如:
(a=4*6,a+5),a+6
/*整个表达式的值为30。*/
练习:练习:下面程序段的输出结果:
int a,b,c;
a=(b=c=5,++b,b+(c++));
printf("a=%d,b=%d,c=%d\n",a,b,c);
下面程序段的输出结果:
int a=10,b=10,c,d;
c=(++a,b++,a++,++b);
d=--a,b--,--a,b--;
printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
a=11,b=6,c=6 a=10,b=10,c=12,d=11考虑写成b++后c的值?null 循环结构中需要注意的地方: (1)复合语句{ }
(2)空语句 ;复合语句{}for (fahr = lower; fahr <= upper; fahr ++) {
celsius = (5.0 / 9.0) * (fahr - 32.0);
printf("%d %6.1f\n", fahr, celsius);
}for (fahr = lower ; fahr <= upper; fahr = fahr + 1)
celsius = (5.0 / 9.0) * (fahr - 32.0);
printf("%d %6.1f\n", fahr, celsius); 复合语句{}nullfor (fahr = lower ; fahr <= upper; fahr = fahr + 1);
celsius = (5.0 / 9.0) * (fahr - 32.0);
printf("%d %6.1f\n", fahr, celsius); 空语句; 循环语句的选择 循环语句的选择如果循环次数已知
优先使用for语句
如果循环次数未知
如果循环体要求至少执行一次
优先使用do-while
否则
使用while语句
小结小结
格式:while(表达式) 语句
while语句
格式:do 语句
while(表达式);
do — while 语句1:逗号表达式的正确计算;
2:循环结构及while、do-while语句小 结 :
格式:
for(表达式1;表达式2;表达式3) 语句
0真(非0)表达式2?语句
计算表达式3循环体外语句表达式1执行流程: for语句表达式1,2,3
可以是任何类型
的表达式,甚至
可以省略。小 结 :循环结构示例循环结构示例示例1:输入一批学生的成绩,求最高分
for结构实现
while结构实现
do-while结构实现解一: 输入一批学生的成绩,求最高分(for)#include
int main(void)
{ int i, mark, max, n;
printf("Enter n: "); scanf ("%d", &n);
printf("Enter %d marks: ", n);
scanf ("%d", &mark); /* 读入第一个成绩 */
max = mark; /* 假设第一个成绩是最高分 */
for (i = 1; i < n; i++ ){
scanf ("%d", &mark);
if (max < mark)
max = mark;
}
printf("Max = %d\n", max);
return 0;}解一: 输入一批学生的成绩,求最高分(for)Enter n: 5
Enter 5 maks:67 88 73 54 82
Max = 88Enter n: 0
?解二:输入一批学生的成绩,求最高分(while)#include
int main(void)
{ int mark, max;
printf(“Enter marks:");
scanf ("%d", &mark); /* 读入第一个成绩 */
max = mark; /* 假设第一个成绩最高分 */
while (mark >= 0){
if(max < mark)
max = mark ;
scanf ("%d", &mark );
};
printf("Max = %d\n", max);
return 0;
}解二:输入一批学生的成绩,求最高分(while)Enter marks:67 88 73 54 82 -1
Max = 88Enter marks:-1
解三:输入一批学生的成绩,求最高分(do-while)#include
int main(void)
{ int mark, max;
max = -1; /* 给max赋一个小初值 */
printf(“Enter marks: ");
do{
scanf ("%d", &mark );
if (max < mark)
max = mark;
} while(mark >= 0);
printf("Max = %d\n", max);
}解三:输入一批学生的成绩,求最高分(do-while)Enter marks: 67 88 73 54 82 -1
Max = 88Enter marks: -1
示例2: 求 1-1/3+1/5-… 的前n项和示例2: 求 1-1/3+1/5-… 的前n项和分析:1、找出加数和循环次数的关系
设循环变量为i,加数变量item,两者关系 item = 1.0/(2 * i - 1);
2、+-号处理(两种方式)
方式一:设一标志变量flag,初始值为1,然后每次循环执行
item = flag*item;
sum=sum+item;
flag=-flag;
方式二:用选择结构,在i为奇数时执行sum=sum+item;,而为偶数时执行sum=sum-item;null关键语句:
求前n项和,即循环n次,每次累加1项。
for (i = 1; i <= n ; i++)
sum = sum + item (第i项)
item = flag * 1.0 / (2*i-1)
flag = -flag示例2 源程序第一种方式的源程序:
#include
int main(void)
{ int denominator, flag, i, n;
double item, sum;
printf(“Enter n: ");
scanf ("%d", &n);
flag=1;
sum = 0 ;
for ( i = 1; i <= n; i++ ) {
item = flag * 1.0/( 2*i-1); /* 计算第i项的值 */
sum = sum + item ; /* 累加第i项的值 */
flag = -flag; /* 准备下一次循环 */
}
printf ( "sum = %f\n", sum);
return 0;
}示例2 源程序示例2 源程序第二种方式的源程序:
#include
int main(void)
{ int denominator, flag, i, n;
double item, sum;
printf(“Enter n: ");
scanf ("%d", &n);
flag=1;
sum = 0 ;
for ( i = 1; i <= n; i++ ) {
item = 1.0/( 2*i-1); /* 计算第i项的值 */
if(i%2!=0)
sum = sum + item ; /* 累加第i项的值,i为偶数减,奇数加 */
else
sum = sum - item ;
}
printf ( "sum = %f\n", sum);
return 0;
}示例2 源程序示例2的实际应用:
用格里高利公式求π的近似值示例2的实际应用:
用格里高利公式求π的近似值使用格里高利公式求π的近似值,要求精确到最后一项的绝对值小于10–4。
程序解析-求π的近似值#include
int main(void)
{
int denominator, flag;
double item, pi;
flag = 1; i= 1 ; item = 0.0; pi = 0;
while(fabs (item) >= 0.0001) {
item = flag * 1.0 / (2*i-1);
pi = pi + item;
flag = -flag;
i++;
}
pi = pi * 4;
printf ( “pi = %f\n”, pi);
return 0;
}程序解析-求π的近似值pi = 3.141613 fabs(item) < 0.0001null
分析:设term代表求和公式中的每一项,则第i项总可以用第i-1项推算出来,即
term=term/i。
主要的程序片段如下:
e=1.0; term=1.0;
for (i=1;i<=n;i++)
{term/=i; e+=term; }
示例3:用近似公式求e≈1+1/1!+1/2!+…+1/n!示例4 统计输入的一批字符中各类字符的数量示例4 统计输入的一批字符中各类字符的数量输入10个字符,统计其中英文字母、数字字符和其他字符的个数。 程序解析#include
int main(void)
{ int digit, i, letter, other;
char ch;
digit = letter = other = 0;
printf(“Enter 10 characters: ");
for(i = 1; i <= 10; i++){
ch = getchar(); /* 从键盘输入一个字符,赋值给变量 ch */
if((ch >= 'a' && ch <= 'z' ) || ( ch >= 'A' && ch <= 'Z'))
letter ++;
else if(ch >= '0' && ch <= '9') /* 如果ch是数字字符 */
digit ++;
else
other ++;
}
printf("letter=%d,digit=%d,other=%d\n",letter,digit,other);
return 0;
} 程序解析input 10 characters: Reold 123?
letter=5, digit=3, other=2 多层缩进的
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
写格式
使程序层次分明 示例4修改示例4修改输入若干个字符(以字符’#’为结束标志),统
计其中英文字母、数字字符和其他字符的个
数。
定义一个标志结束循环示例 程序解析#include
int main(void)
{ int digit, letter, other;
char ch;
digit = letter = other = 0;
printf("Enter characters: ");
while((ch=getchar())!='#')
{
if((ch >= 'a' && ch <= 'z' ) || ( ch >= 'A' && ch <= 'Z'))
letter ++;
else if(ch >= '0' && ch <= '9') /* 如果ch是数字字符 */
digit ++;
else
other ++;
}
printf("letter=%d,digit=%d,other=%d\n",letter,digit,other);
return 0;
}} 程序解析考虑将空格单独统计的程序改法?null有一对小兔,过一个月之后长成大兔,到第三个月就可以生下一对小兔,并且以后每个月都 生下一对小兔。而所生的一对小兔也同样到一个月之后长成大兔,到第三个月就可以生下一 对小兔,并且以后也每个月都生下一对小兔.假设所有的兔子均不死亡,问一年后共有多少对兔子?。 示例5 (Fibonacci数列)数学模型数学模型:
“裴波那契数列”,即:1,1,2,3,5,8,13…. 数列,表示为: 数学模型递推问题null分析:设当前项为f,前一项为f1,前二项为f2。首先根据f1和f2推出f,再将f2作为f1,f作为f2,再推出f,如此一直递推下去:
1 1 2 3 5
第一次 f1 + f2 → f
↓ ↓
第二次 f1 + f2 → f
↓ ↓
第三次 f1 + f2 → fnullf1=f2=1;
for (i=3;i<=12;i++)
{f=f1+f2;
printf ("%10.0f ",f);
f1=f2; f2=f;
}
关键程序段如下:思考:该例改为求这一数列,直到其数不小于105 ,应该如何编程?null该例改为求这一数列,直到其数不小于105 ,程序解析f1=f2=1;
do
{f=f1+f2;
printf ("%10.0f ",f);
f1=f2; f2=f;
}
while(f<1e+5)
null小猴在一天摘了若干个桃子,当天吃掉一半多一个;第二天接着吃了剩下的桃子的一半多一个;以后每天都吃尚存桃子的一半多一个,到第7天早上要吃时只剩下一个了,问小猴那天共摘下了多少个桃子?示例6 猴子吃桃子。null算法分析:
这是一个“递推”问题,先从最后一天推出倒数第二天的桃子,再从倒数第二天的桃子推出倒数第三天的桃子……。
设第n天的桃子为xn,那么它后一天(第n+1天)
的桃子数为xn+1=xn/2-1,由此公式推出第n天的桃子数和第n+1天的桃子数关系为:xn= (xn+1+1) *2
则第n-1天的桃子数为:xn-1=(xn+1)*2
设每天的桃子数为x,第7天的桃子数为1,则x初值为1,用循环变量i表示天数,i从6变到1,每次执行x=(x+1)*2即可求出当天的桃子数,当i=1时得到的x即为第一天的桃子
参考程序参考程序x=1;
for(i=6;i>0;i--)
{
x=(x+1)*2;
printf(“第%d天的桃子数为:%d”,i, x);
}
练习:阅读下列算法, 完成什么功能?#include
void main( )
{int j, find, x;
scanf ( "%d", &x );
for( j=2, find=1; j<=x-1&&find==1; j++)
if( x%j==0 ) find=0; /*x不是素数*/
if( find==1) printf("%d是素数\n",x);
else printf( "%d不是素数\n",x );
}
练习:阅读下列算法, 完成什么功能?for(j=2,find=1; j<=x-1&& find==1; j++) find=0 输出"是"标志 输出"不是"标志嵌套循环嵌套循环实际问题:
打印如下图型算法算法将打印5个*的程序执行5次
for(i=1;i<=5;i++)
{ 打印5个*
换行
}
考虑这段程序的写法完整的程序段:
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
printf("*");
printf("\n");
}printf(“*****”)null循环的嵌套一个循环体内又包含另一个完
整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,
这就是多重循环。
nullfor()
{… while() {…} … }Do
{ … for()
{…} … }while()while()
{
…
for()
{…}
… }for()
{ … for()
{…} }以下四种均为合法的嵌套循环结构嵌套循环的执行过程嵌套循环的执行过程例:for(i=1;i<=3;i++)
{ for(j=1;j<=2;j++)
printf(“*”);
printf(“\n”);
}循环执行次数:外循环次数*内循环次数 外层循环变量 i 的每个值,内层循环变量 j 变化一个轮次;
内外层循环变量不能相同,分别用 i 和 j
内循环必须完整嵌套在外循环中nullfor (i = 1; i <= 100; i++)
for (j = 1; j <= i; j++)
printf ("%d %d\n", i, j );嵌套循环的执行过程示例null
1
2 4
3 6 9
4 8 12 16
5 10 15 20 25
6 12 18 24 30 36
7 14 21 28 35 42 49
8 16 24 32 40 48 56 64
9 18 27 36 45 54 63 72 81示例1 打印如图所示的乘法表。用外循环变量i控制行,i的变化范围为1到9;
内循环变量j控制列,j的变化范围由i决定,即第i行时j的变化为从1到i
内循环的循环体为打印i*j的值,比如i=7时,打印4*1=4,4*2=8,4*3=12,4*4=16。
外循环的循环体是:一个完整的内循环加上一条换行语句用外循环变量i控制行,i的变化范围为1到9;
内循环变量j控制列,j的变化范围由i决定,即第i行时j的变化为从1到i
内循环的循环体为打印i*j的值,比如i=7时,打印4*1=4,4*2=8,4*3=12,4*4=16。
外循环的循环体是:一个完整的内循环加上一条换行语句算法思路:参考程序:参考程序:#include
void main()
{
int i,j;
for( i = 1;i <= 9;i++ )
{
for( j = 1;j <= i;j++)
printf("%3d" , i * j);
printf("\n");
}
}
考虑下面两种情况的实现考虑下面两种情况的实现内循环变量j从1变到9即可null内循环变量j从i变到9即可示例2打印如图所示图形示例2打印如图所示图形算法:用外循环控制行数
用内循环控制每行的空格数和*数
要点:找出空格数和*数和行数的关系程序解析.
#include
void main()
{
int n,i,j,k;
printf("请输入图形的行数:");
scanf("%d", &n);
printf("\n");
for(i=1;i<=n;i++)
{ for(j=1;j<=n-i;j++) /*控制j行的空格个数*/
printf(" ");
for(k=1;k<=2*i-1;k++)
printf("*");
printf("\n");
}
}程序解析.
光标换行 for (k=1;k<=2*i-1;k++)
printf("*");printf("\n"); *
***
*****
…………n行 for (j=1;j<=n-i;j++)
printf(" ");思考下述两种图形的程序实现思考下述两种图形的程序实现图一图二均为考虑空格的变化规律
图一:省略空格
图二:空格数和*数和为2*n-1null#include
void main()
{
int n,i,j;
printf("请输入图形的行数:");
scanf("%d", &n);
printf("\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=2*i-1;j++)
printf("*");
printf("\n");
}
}图一程序实现null#include
void main()
{
int n,i,j,k;
printf("请输入图形的行数:");
scanf("%d", &n);
printf("\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=2*(n-i);j++)
printf(" ");
for(k=1;k<=2*i-1;k++)
printf("*");
printf("\n");
}
}图二程序实现null示例3:求出式子的前n项的值:1+22-33+44-55…
#include
void main()
{ int i,j,sum=1,temp,n;
scanf("%d",&n);
for(i=2; i<=n;i++)
{
求加数项temp;
if(i%2==0)
sum=sum+temp;
else
sum= sum-temp;
}
printf("sum is: %d\n",sum);
} temp=1;
for(j=1; j<=i;j++)
temp=temp*i;
完整程序完整程序#include
void main()
{ int i,j,sum=1,temp,n;
scanf("%d",&n);
for(i=2; i<=n;i++)
{
temp=1;
for(j=1; j<=i;j++)
temp=temp*i;
if(i%2==0)
sum=sum+temp;
else
sum= sum-temp;
}
printf("sum is: %d\n",sum);
}
另外一种程序实现另外一种程序实现#include
void main()
{ int i,j,sum=1,temp,n,sign=1;
scanf("%d",&n);
for(i=2; i<=n;i++)
{ temp=1;
for(j=1; j<=i;j++)
temp=temp*i;
sum=sum+temp*sign;
sign=-sign;
}
printf("sum is: %d\n",sum);
}
示例4 求1! + 2! + …. + 100!for (i = 1; i <= 100; i++){
item = i !
sum = sum + item;
}for(i = 1; i <= 100; i++) {
item = 1;
for (j = 1; j <= i; j++) item = item * j;
sum = sum + item;
}示例4 求1! + 2! + …. + 100!源程序#include
int main(void)
{ int i, j;
double item, sum; /* item 存放阶乘 */
sum = 0;
for(i = 1; i <= 100; i++) {
item = 1; /* 每次求阶乘都从1开始 */
for (j = 1; j <= i; j++) /* 内层循环算出 item = i! */
item = item * j;
sum = sum + item;
}
printf("1! + 2! + 3! + … + 100! = %e\n", sum);
}源程序内层循环的初始化内层循环的初始化for(i = 1; i <= 100; i++) {
item = 1;
for (j = 1; j <= i; j++)
item = item * j;
sum = sum + item;
}求1! + 2! + …. + 100!item = 1;
for(i = 1; i <= 100; i++){
for (j = 1; j <= i; j++)
item = item * j;
sum = sum + item;
}求1! + 1!*2! + …… + 1!*2!*……*100! 示例5 古典算术问题-搬砖头示例5 古典算术问题-搬砖头某地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬一块。
问用45人正好搬45块砖,有多少种搬法?穷举法也称枚举法思路:设男人、女人、小孩各为x、y、z个,根据题目要求,列出方程为:
x+y+z=45
3x+2y+0.5z=45
三个未知数,两个方程,此题有若干个解。
解决此类问题采用“穷举法”,把每一种情况都考虑到。
方法一:最简单三个未知数利用三重循环来实现。
方法二:从三个未知数的关系,利用两重循环来实现。
列出所有可能结果,将满足条件的结果打印nullfor (men = 0; men <= 45; men++)
for (women = 0; women <= 45; women++)
for (child = 0; child <= 45; child++)
if ((men+women+child==45) && (men*3+women*2+child*0.5==45))
printf("men=%d women=%d child=%d\n", men, women, child);源程序(2)for (men = 0; men <= 15; men++)
for (women = 0; women <= 22; women++){
child=45-women-men;
if (men * 3 + women * 2 + child * 0.5 == 45)
printf("men=%d women=%d child=%d\n", men, women, child);
}源程序(2)for (men = 0; men <= 45; men++)
for (women = 0; women <= 4