这个作业属于哪个班级 | C语言--网络2011/2012 |
---|---|
这个作业的地址 | C博客作业00--循环结构 |
这个作业的目标 | 学习循环结构内容,包括for循环、while循环、循环嵌套 |
姓名 | 张官德 |
0.PTA总分排名
1.本章学习总结
1.1 for循环语法
语法: for(循环变量赋初值; 循环条件; 循环变量增量)
- 注意语句间用‘;’隔开,不是‘,’。
并不是所有的条件都要填,例如循环条件不填则代表这个函数进入无限循环。
简单案例如:
#include <stdio.h>
#include<math.h>
int main()
{
int n;
int i;
double sum=0;
scanf("%d", &n);
for (i = 1; i <= n; i++) {
sum = sum + pow(-1, i +1 )*i / (2 * i - 1);
}
printf("%.3f", sum);
return 0;
}
1.2 while、do while循环语法
语法:
- while
while(条件)
{循环体}
- do while
do
{循环体}
while(条件)
- while先判断条件后进入循环;
do while先做一次循环后再判断条件,比较适合用于第一个条件特殊情况的例子。
案例如
- 用do-while语句计算从1加到100的值
#include <stdio.h>
int main(){
int i,sum=0;
i=1;
do{
sum=sum+i;
i++;
}
while(i<=100);
printf("%d
",sum);
return 0;
}
1.3 跳出循环相关语句breakcontinue
-
break语句在循环体中使用,表示结束循环,常用于在死循环中找到正确的值后退出。
也用于switch-case语句中,执行case语句后退出。 -
continue语句在循环中使用,表示结束下面循环语句,并且重新开始循环,常用于循环中符合条件的情况下执行(如例题所示)。
案例一(break)
#include<stdio.h>
int main(void)
{
int n,N,a,i;
scanf("%d %d",&n,&N);
for(i=1;;i++)
{
scanf("%d",&a);
if(a<0||i>N)
{printf("Game Over
");
break;}
if(a>n)
printf("Too big
");
else if(a<n)
printf("Too small
");
else if(a==n&&i==1)
{printf("Bingo!
");
break;}
else if(a==n&&i>1&&i<=3)
{printf("Lucky You!
");
break;}
else if(a==n&&i>3&&i<=N)
{printf("Good Guess!
");
break;}
}
}
案例二(continue)
- 题目:输出0到100以内偶数的和
#include <stdio.h>
int main()
{
int sum = 0;
for(int i=0;i<=100;i++)
{
if(i % 2 != 0){
continue;
}
sum += i;
}
printf("100位数字中的偶数和为:%d",sum);
return 0;
}
1.4 嵌套循环
- 嵌套循环是指在大循环中套用小循环如
for( ; ;){
for( ; ;){}
}
经典案例(硬币换算)
#include<stdio.h>
int main() {
int money;
int i;
int j;
int k;
int count = 0;
scanf("%d", &money);
for (i = money/5; i >0; i--) {
for (j = money / 2; j >0; j--) {
for (k =money; k>0 ; k--) {
if (i * 5 + j * 2 + k == money) {
printf("fen5:%d, fen2:%d, fen1:%d, total:%d
", i, j, k, i + j + k);
count++;
}
}
}
}
printf("count = %d", count);
return 0;
}
- 像嵌套循环这类题集一定要理清楚思路,大循环是什么?小循环如何嵌套进去?像这个硬币换算,以前不会做,现在觉得简单了,是因为了解到“大循环循环一次,小循环整个运行完”,理解后就豁然开朗了。
学习体会
- 戒骄戒躁,嵌套循环思路不能乱。
- 合理利用break与continue,在代码中畅通无阻。
- 多次练习才能掌握好(如换硬币题)
- 不会就要去求助他人,别在一棵树上吊死。
2 编程技巧总结
- 数列求和问题
如
- 数列求和关键点在于规律,凡是数列都会有规律,如本题,应该想到每次循环加上的项应该是前一项的10倍加上a,问题就解决了。
- 字符如何转数字、数字逆序问题等
- 字符转数字只要将字符减去一个字符‘0’即可,同理数字转字符加上一个字符即可(注意字符Ascall码所对应的值)。
- 数字逆序问题在于在循环中巧妙的运用‘%’和‘/’解析每一个数,然后将第一个数乘10n(n为位数),加上第二个数乘10(n-1),以此类推。
- 图形打印问题
- 此类题目应该与嵌套循环结合,从视频中注意到i j k的关系表达式式关键,思考如何才能用简洁的代码打出。
- 四则运算
注意点:while循环和switch-case复合使用
如案例:简单计算器
循环语句为
while (1) {
scanf("%d ", &num);
switch (c) {
case '+':
sum += num;
break;
case '-':
sum -= num;
break;
case '*':
sum *= num;
break;
case '/':
if (num == 0) {
printf("ERROR");
goto out;
}
sum = sum / num;
break;
default:
printf("ERROR");
goto up;
break;
}
- 小心除数为0的特殊情况!
3.PTA实验作业
3.1 数列求和问题
- 伪代码
int 首项a;总项数n;
int 储存a的数b;
int 计数i;
定义 总和sum=0;
输入a,n;
for(i=1;i<=n;i++){
和前一项相加赋值给sum;
}
输出sum;
- 注意点:每次乘10后都要加a,如何实现,可以用b储存。
3.2图形打印问题
数据处理:定义计数的i j k;
i控制行数;j控制空格;k控制*数;
代码:
- 此类题目应该与嵌套循环结合,从视频中注意到i j k的关系表达式式关键,思考如何才能用简洁的代码打出(不要像我一样复杂。。)
3.3 printf 调试检误
例:
- 提交列表: