第 6讲 程序的控制结构循环结构程序设计综合结构程序设计
请大家及时到我的个人主页 http://cs.cqupt.edu.cn/xiejb
或公共邮箱 http://stu.cqupt.edu.cn中查看作业回复及下载课件自学
因课堂时间有限,不能把所有例题都讲到,请大家 课下一定多看相关例题
2
作业答案
习题 4.3:输出小九九乘法表
(关键是 循环嵌套 的语句执行顺序)
执行顺序??
#include <stdio.h>
main()
{ int i,j,m;
for (i=1; i<=9; i++)
printf(“%4d”,m);
printf("\n");
for (i=1; i<=9; i++)
printf(" -");
printf(“\n”); /*以上打印表头 */
for (i=1; i<=9; i++) /*i可表示第一个乘数从 1到 9*/
{
for (j=1; j<=9; j++) /*j可表示第二个乘数从 1到 9*/
{ m=i*j;
printf("%4d",m);
}
printf("\n");
}
}
/*互不相关的循环可以使用相同的循环变量 */
/*相关的循环(例如嵌套)一定不能使用相同的循环变量 */?习题 4.6:
scanf(“%d”,&num);/*输入 */
sum1+=num;/*求和 */
while(--num>=1) /*循环条件 */
先--和后--不同,
例:
x=1;
Y=x++;
Y=++x;
详细用法请查阅
P1034.4.3一节
3
作业答案
习题 4.9
思路:根据 输入 的 year得到 不同的利率,由此 求出 不同的利息,再输出。
方法一:用 if-else
方法二:用 switch()
进一步,可以使用函数。
}
else /*是 0*/
{ printf("%d is 0 \n",m);}
}
if (m % 2 == 0) /*是否为偶数 */
{ printf("%d is even\n",m); } /*是偶数 */
else
{ printf("%d is odd\n",m); } /*是奇数 */
}
方法一:
#include<stdio.h>
void main()
{int year;float capital,interest;
printf(“please input capital and year:”);
scanf(“%f,%d”,&capital,&year); /*输入数据 */
if(year==1) /*下面的几个分支分别根据不同年限计算利息 */
{interest=year*12*0.0063*capital; }
if(year==2)
{interest=year*12* 0.0066* capital; }
if(year==3|| year==4)
{interest=year*12* 0.0069* capital; }
if(year>=5&& y ar<=7)
{interest=year*12* 0.0075* capital; }
if(year>=8)
{interest=year*12*,0085* capital; }
printf(“the sum o capital and interest is,%f”,capital+interest);
/*最后输出计算结果 */
}
方法二:
#include<stdio.h>
void main()
{int year;float capital,interest;
printf(“please input capital and year:”);
scanf(“%f,%d”,&capital,&year); /*输入数据 */
switch(year) /*下面的几个分支分别根据不同年限计算利息 */
{case 1:interest=year*12*0.0063*capital; break;
case 2:interest=year*12*0.0066*capital; break;
case 3:
case 4:interest=year*12*0.0069*capital; break;
case 5:
case 6:
case 7:interest=year*12*0.0075*capital; break;
default:interest=year*12*0.0085*capital; break;
}
printf(“the sum of capital and interest is,%f”,capital+interest);
/*最后输出计算结果 */
}
用函数计算利息:
#include<stdio.h>
/*函数功能:根据本金,年份和利率计算利息 */
float Interest(float capital,int year,float rate)
{return (capital*year*12*rate);}
void main()
{int year;float capital,interest;
print (“please input capital and year:”);
scanf(“%f,%d”,&capital,&year); /*输入数据 */
switch(year) /*下面根据不同年限和不同利率调用函数 */
{case 1,interest=Interest(capit l,year,0.0063); break;
case 2,interest=Interest(capital,year,0.0066); break;
case 3:
case 4,interest=Interest(capital,year,0.0069); break;
case 5:
case 6:
case 7,interest=Interest(capit l,year,0.0075); break;
default,interest=Interest(capital,year,0.0085); break;
}
printf(“the sum of capital and interest is,%f”,capital+interest);
/*最后输出计算结果 */
}
4
课堂练习 P107例 4-24
输入整数 K
输出位数 n
计算结束求倒数第 n位并输出
T还未除尽
n=0
n++;
输出 k%10;
k=k/10;
5
#include <stdio.h>
void main( )
{
int k,n=0;
printf("k=?");
scanf("%d",&k);
printf("\n");
do
{
n++; /* 计数器 n加 1,下边要计算倒数第 n位 */
printf(“%d”,k%10); /* 求倒数第 n位并输出 */
k/=10; /* 为下一次循环做准备 */
} while(k>0);
printf("\n n=%d",n);
}
例 4-24程序
P107书中程序有何不妥?
6
P111例 4- 28
求 1!+2!+… +n!
算法:
输入
计算
输出
循环开始,i=1;sum=0;
循环条件,i<=n
循环体:计算 i!,然后,sum+=i!
7
P111例 4- 28程序一
#include <stdio.h>
main()
{int i,n; double term,sum;
printf(“please input n:”);
scanf(“%d”,&n);
for(i=1,term=1,sum=0;i<=n;i++)
{ term*=i;
sum=sum+term;
}
/* 找规律(通项) */
printf(“sum=%lf\n”,sum);
}
递推法!
求 i!还可以怎样求?
8
P111例 4- 28程序二
#include <stdio.h>
main()
{int i,n; double term,sum;
printf(“please input n:”);
scanf(“%d”,&n);
for(i=1,sum=0;i<=n;i++)
{ for(j=1;j<=i;j++)
{term*=j;}
sum=sum+term;
}
/* 找规律(通项) */
printf(“sum=%lf\n”,sum);
}
循环嵌套
执行顺序?
前边的一个程序效率要高些
9
例 4- 35百钱买鸡问题
用列举(又称穷举、枚举)法
#include <stdio.h>
main()
{ int x,y,z;
printf("Man \t Women \t Childern\n");
for (x=0; x<=20; x++)
for (y=0; y<=33; y++)
{z = 100 – x - y;
if (5*x+3*y+z/3.0 == 100)
printf(“\n%d\t%d\t%d\n",x,y,z);
}
}


)2(10 03/35
)1(10 0
zyx
zyx
10
写循环结构程序设计
一般情况下:
如果循环次数已知,用 for
如果循环次数未知,用 while
如果循环体至少要执行一次,用 do-while
!!!关键
单重循环:归纳出每次循环要做的共同工作 (规律 ),即是循环体。
循环嵌套,(例:九九乘法表) 根据关系分析清楚哪是外层,哪是内层,一层一层写算法,
一层一层写程序
11
练习一:读程序功能
#include<stdio.h>
main()
{int i,sum;
for(i=1; ; i++)
{if (i>100) break;
sum+=i;
}
printf(“sum=%d”,sum);
}
结束当前所在循环,
转到循环花括号结束后的语句。
有 嵌套的时候要注意 结束的是哪一层的循环。
12
练习二:读程序功能
#include<stdio.h>
main()
{int i,sum;
for(i=1; i<=100; i++)
{if (n%2) continue;
sum+=i;
}
printf(“sum=%d”,sum);
}
结束本次循环中
continue后边的语句,继续下一次循环。
注意转向。
13
break和 continue
注意二者的区别
作业之一:
分析书中 P112- 114例 4- 29和例 4- 30的功能
另外一个转向语句 goto,不建议使用,
请大家自学!
14
P115例 4- 17
统计班级学生平均成绩
算法:
输入学生人数 n
统计总成绩 sum
输入一个学生的成绩
求和 sum
输出平均成绩 aver
15
#include <stdio.h>
void main( )
{
int i,n;
float sum,score,average=0.0;
printf("\n n=?");
scanf("%d",&n);
for(i=1;i<=n;i++)
{ printf("\n score=?");
scanf("%f",&score); /* 输入学生成绩 */
if(score<0.0 || score>100.0) /* 判断成绩的合法性 */
continue;
sum += score; /* 求成绩之和 */
}
average = sum/n; /* 求平均成绩 */
printf("\n average =%f",average);
getch( );
}
P115例 4- 17程序
16
本讲小结
掌握循环结构尤其是带有嵌套的程序设计,掌握综合结构的程序设计
能够读懂程序功能,并能分析出其运行结果
理解和掌握两个常用算法,递推法和列举法
应掌握 的语法内容
for语句,尤其是循环嵌套的执行顺序
break和 continue的区别
++ -- 两种运算符的运算规则?基本要求,118页例 4- 36之前的例子应该会读会写,
有兴趣的同学可继续学习后边的例题。
下节课讲循环结构程序设计和综合结构的程序设计,请提前预习
17
作业:
分析书中 P112- 114例 4- 29和例 4-
30的功能
习题 4.12