C语言博客作业02--循环结构
| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- | ---- |
| 这个作业的地址 | [C博客作业02--循环结构 ](https://edu.cnblogs.com/campus/jmu/2020C/homework/11483)|
| 这个作业的目标 | 学习循环结构内容,包括for循环、while循环、循环嵌套 |
| 姓名 | 韩龙飞 |
0.展示PTA总分
1.本章学习总结
1.1 for循环语法
for ([表达式1(初始化)];[表达式2(控制表达式)];[表达式3(调节器)])
{
语句;
}
先计算一次表达式1,以进行必要的初始化,后面不再计算它。
每轮循环前都要计算表达式2,以判断是否需要继续本轮循环。当控制表达式的结果为 false,结束循环。
表达式3在每轮循环结束后且表达式2计算前执行。
1.2 while、do while循环语法
while语法
while (表达式)
{
语句;
}
先计算控制表达式。如果为 true,就执行循环体,然后再次计算控制表达式。如果控制表达式为 false,程序跳过循环体,而去执行循环体后面的语句。
do while语法
do
{
语句;
}
while (表达式);
与while语句类似,唯一不同点在于循环之前会先执行语句内容,再进行判断是否执行循环。
1.3 跳出循环相关语句break\continue
break
当在循环中遇到break,就停止后期所有的循环,直接终止循环。即当符合ch=='\n'
时循环直接终止。
示例:二进制转十进制
#include<stdio.h>
int main()
{
char ch='0';
int sum=0;
int count = 0;
while (ch != '\n')
{
scanf("%c", &ch);
if (ch == '0' || ch == '1')
{
sum = sum + (ch - '0') * pow(2, count);
count++;
}
else if (ch == '\n')
{
break;
}
else
{
printf("error input!");
return 0;
}
}
printf("%d", sum);
return 0;
}
continue
当在循环内部遇到continue直接跳出,不再执行后边的语句,调到while部分。也就是说终止本次循环,回到循环入口,继续执行语句。
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i==5)
continue;
printf("%d ",i);
i = i + 1;
}
return 0;
}
1.4 循环嵌套
将一个循环放在另一个循环体中,就形成了嵌套循环。当内层循环判断为否时才会回到外部循环,继续下一次的循环。
若外层循环次数为m次,内层循环次数为n次,则内层实际执行m*n次循环。
示例:
输出由星号组成的棱形
#include<stdio.h>
int main()
{
int i;
int j;
int k;
/*上4行*/
for (i = 0; i <= 3; i++)
{
for (j = 0; j <= 2 - i; j++)
{
printf(" ");
}
for (k = 0; k <= 2 * i; k++)
{
printf("*");
}
printf("\n");
}
/*下3行*/
for (i = 0; i <= 2; i++)
{
for (j = 0; j <= i; j++)
{
printf(" ");
}
for (k = 0; k <= 4 - 2 * i; k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
学习体会
-
一开始对于循环条件的设置十分彷徨,本来数学就不怎么好的我对于小于和小于等于的条件设置没有那么敏感,导致需要多次调试修改才能达到预期效果。在经过几周的学习后已经可以很明确的确定判断条件。
-
预习的时候觉得嵌套很麻烦,现在觉得更麻烦了。(我是谁?我到哪一步了?)
-
感觉如果对于语句不是足够熟悉的话很难能够称心的编出代码,因此我觉得要对每条语句的作用烂熟于心。
-
在自己编写代码的过程中疯狂碰壁,从一开始的心急火燎慢慢的变成了心平气和。
-
希望于龙可以自己解决问题……
2 编程技巧总结
1.求二进制数
num = num * 2 + ch - '0';
与调用pow函数计算的十进制数相比,少了一个用来记录进位情况的变量,而且运算更加快。
#include <stdio.h>
int main()
{
char ch;
int num=0;
while ((ch = getchar()) != '\n')
{
num = num * 2 + ch - '0';
}
printf("%d", num);
return 0;
}
2.利用flag的转换进行判断
flag变量在代码中作为一种信号,当满足某种条件时进行0与1的转换,从而判断是否执行之后的语句,化繁为简。
/*计算单词长度*/
#include<stdio.h>
int main()
{
char x;
int count = 0, flag = 1;
do {
scanf("%c", &x);
if (x != ' ')
{
count++;
}
if (x == ' ' && count != 0)
{
printf("%d", count);
flag = 0;
count = 0;
}
if (flag == 0 && x != '.' && x != ' ')
{
printf(" ");
}
if (flag == 0 && x != ' ')
{
flag = 1;
}
} while (x != '.');
if (count != 1)
{
printf("%d", count - 1);
}
}
3.数字逆序
digit用来记录每次x取余10得到的个位数
ret记录每次循环得出的数,即用每位数算出最后的逆序值
while ( x> 0 )
{
digit = x%10;
printf("%d ", digit);
ret = ret*10 + digit;
printf("x=%d,digit=%d,ret=%d\n", x, digit, ret);
x /= 10;
}
4.字母小写转大写
利用表达式ch = ch - 'a' + 'A';
即可实现字母的小写转大写,主要考察的还是对ascⅡ码的熟悉程度。
3.PTA实验作业
3.1 数列求和问题
3.1.1 伪代码
定义变量N用于存放输入的数列项数
定义变量i为分子
定义变量sum为前N项和
定义前N项和为0
输入数列项数;
for(i=1;i<=N;i++)
计算出前N项和
end for
输出前N项和并保留三位小数
3.1.2 代码截图
3.1.3 PTA提交列表及说明
3.2 图形打印问题
3.2.1 数据处理
数据表达:
分别定义整型变量n,i,k,j,mid和字符型变量ch
其中n为图形所占的行数
i用于行数的循环
k用于控制字母前空格数
j用于控制输出空心空格和字母
mid为图形的最长行数
ch用于控制输出的字母
数据处理:外层循环为图形行数的循环,内层有两个循环,分别为每行第一个字母前的空格数和输出字母或空格的循环判断