C语言博客作业02--循环结构
| 这个作业属于哪个班级 |
| ---- | ---- | ---- |
| 这个作业的地址 |
| 这个作业的目标 | 学习循环结构内容,包括for循环、while循环、循环嵌套 |
| 姓名 | 黄静 |
0.展示PTA总分
1.本章学习总结
1.1 for循环语法
1.1.1 基本框架
for(表达式1;表达式2;表达式3) { 循环语句 }
1.1.2 知识点
- 表达式1:初始动作
- 表达式2:条件
- 表达式3:每轮的动作
- for中的每一个表达式都是可以省略的
1.2 while、do-while循环语法
1.2.1 基本框架
- while循环语法
while(表达式)
{
循环体语句
}
- do-while循环语法
do{
循环体语句
}while(表达式);
1.2.2 知识点
- while循环语法
- 当条件满足时,不断重复循环体内的语句
- 条件成立是循环继续的条件
- do-while循环语法
- 执行一次循环体语句之后再判断循环条件
- 满足条件才进行下一轮循环
- 表达式最后要加分号
1.2.3 区别
循环类型 | 执行顺序 | 执行次数 | 适用情况 |
---|---|---|---|
for循环 | 在循环顶部先判断是否满足循环条件 | 可以一次也不执行 | 适合固定次数和有范围的循环 |
while循环 | 在循环之前判断是否执行 | 可以一次也不执行 | 适用于循环次数未知,条件控制的循环 |
do-while循环 | 执行之后判断是否循环 | 循环至少执行一次 | 适用于循环次数未知,条件控制,需要先执行的循环 |
1.3 跳出循环相关语句break/continue
1.3.1 break
- 跳出循环
- 用于switch语句中
1.3.2 continue
- 跳出循环这一轮剩下的语句,跳到循环开始,判断循环条件,进入新一轮循环
1.4 循环嵌套
1.4.1 嵌套类型
for语句与for语句形成嵌套,for语句也可与while,do-while语句相互嵌套,构成多重循环。
例如:
一: 二: 三: 四:
while() do for() while()
{... {... {... {...
while() do for() for()
{... { {...} {...}
} ...}while(); ... ...
... }while(); } }
}
注意点:外循环一次,内循环一轮,内循环务必要注意是否有变量需要重置
1.4.2 嵌套错误
- 并列for
- 循环混乱或循环变量相同
- 初值混乱,内循环务必要注意是否有变量需要重置
1.5 学习体会
- 从循环开始,代码难度较之前来说增大了不少,尤其是循环嵌套,十分考验自己的逻辑思维能力,有些测试点都不知道是什么,为什么错
- 看到较难的题目常常没有思路,甚至有些难题需要参考别人的思路与做法才能写出自己的代码,很多题目不是代码不会写,而是想不到思路
- 因为代码越来越复杂,所以缩进与注释,大括号换行这些小细节非常重要
- 有些经常遇见的编程技巧和题型可以直接记下来,防止突然想不起来或者花时间去思考
2 编程技巧总结
2.1 判断是否为素数
2.1.1 做法
- 素数判断范围 [2,m-1]或[2,m/2]或[2,根号m]
- 设flag,判断是否素数:flag=1,若循环中满足条件,flag=0,循环结束根据flag状态判断是否素数
- 利用循环变量值判断
2.1.2 代码举例
if(m==1)// 1不是素数
{
flag=0;//引入flag作为标志
}
for(i=2;i<=m/2;i++)//循环
{
if(m%i==0)//不是素数
{
flag=0;//flag的值改为0
break;
}
}
if(flag=1)
{
printf("yes\n");
}
else
{
printf("no\n");
}
2.2 通过循环打印图形
2.2.1 做法
运用双重for的循环嵌套实现
2.2.2 代码举例
for(i=1;i<=n;i++)//控制图形的行数
{
for(j=1;j<=n;j++)//控制每一行中的元素
{
...
}
}
另外:还可以通过加绝对值的方式使代码精简
如:
for(i=1;i<=7;i++)
{
for(k=1;k<=abs(4-i);k++)
{
printf(" ");
}
for(j=1;j<=7-2*abs(4-i);j++)
{
printf("*");
}
printf("\n");
}
2.3 max初值/min初值
2.3.1 做法
- 输入的第一个数
- 比输入数都小/大的数
2.3.2 代码举例
scanf("%d",&max);或scanf("%d",&min);//把第一个数赋给最大值/最小值
if(num > max) if(num < min)
{ {
max=num;//把更大的数赋给max min=num;//把更小的数赋给min
} }
2.4 统计整数位数
2.4.1 做法
- 取最后一位数用取余
x=num%10;
- 除去最后一位数用除法
x=num/10;
- 需要计数用自增
count++;
2.4.2 代码举例
count=0;//赋给初始值
do{
number=number/10;//每次除去一位数
count++;//累计位数
}while(number!=0);
注意:累加一定要先赋予初始值
2.5 交错数列实现方式
2.5.1 做法
- **使用sign来实现正负号转变
2.5.2 代码举例
for(i=1;i<=n;a +=1 ,b +=2)//循环求数列之和
{
sum+=a/b*sign;//求和
sign=-sign;//使用sign实现正负转化
i++;
}
2.6 大小写字母的转化方式
2.6.1 做法
- 小写转换为大写:定义一个字符型变量op,则op+'A'-'a'的结果即为大写
- 大写转换为小写:定义一个字符型变量op,则op-'A'+'a'的结果即为小写
2.6.2 代码举例
- 小写转换为大写:
op=op+'A'-'a';
- 大写转换为小写:
op=op-'A'+'a';
2.7 字符转数字问题
2.7.1 做法 ch=ch-'0';
代码举例 scanf("%c",char);
ch=ch-'0';
2.8 四则运算
2.8.1 做法
运用'+' '-' '*' '/'
进行计算
2.8.2 代码举例
2.9 数字逆序
2.9.1 做法
- 每分离一位数,就把这位数变为个位,之前的乘以十升为高位,以此类推
2.9.2 代码举例
do
{
n = num % 10;//取最后一位数
sum = sum * 10 + n;//组成新的数字
num = num / 10;//去除最后一位
}while(num != 0 );
注意:sum要给初始值 0;
3.PTA实验作业
3.1 数列求和问题
典例:题目详情
7-2 特殊a串数列求和 (20分)
给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。
输入格式:
输入在一行中给出不超过9的正整数a和n。
输出格式:
在一行中按照“s = 对应的和”的格式输出。
3.1.1 流程图或伪代码介绍思路
伪代码:
定义变量a(a的值),n(n个数),sum(计算并存储每一项的值),s(数列之和);
for (int i=1;i<=n;i++)
{
下一项数表达式;//根据数列中前一项和后一项的关系得到下一个数的值
s等于sum累加求和;
}
end for;
输出s的值;
return 0;//结束程序;
3.1.2 代码截图
代码如下:
3.1.3 PTA提交列表及说明
错误说明
* scanf输入格式错误,不小心把引号错误打在了&n号后面;
3.2 图形打印问题
7-5 打印菱形图形 (10分)
打印出如下图案(菱形)
*
***
***
*
第一行图形符号前面有5个空格
输出格式:
以菱形的格式输出7行由乘号构成的图形,每个乘号占固定1位,第一行乘号前有5个空格。
3.2.1 数据处理
做法
运用循环嵌套的方法,分别控制行数与每行的元素,进行处理
- 定义两个for循环中的变量i,j;
- 第一个for循环
for (i = 1;i <= 7;i++)//控制行数
,第一个大循环结束时换行 - 将七行分为前四行和后三行
- 第二,三,四,五个for循环
for (j = 1;j <= 6 - i;j++)//输出空格的循环
for (j = 1;j <= 2 * i - 1;j++)//输出乘号的循环
和for (j = 1;j <= i - 2;j++)//输出空格的循环
for (j = 1;j <= 1 + 2 * (7 - i);j++)//输出乘号的循环
- 进行for循环嵌套
3.2.2 代码截图
代码举例
3.2.3 PTA提交列表及说明
说明:我在编译器上有运行过,观察是否有错误。需要注意的是j的可取范围,需要找到正确的规律,还要注意第一行是五个空格开始。
3.3 自选一题,介绍printf调试如何检查错误
< 7-8 换硬币 (20分)题目详情
将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。
输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。
3.3.1 单步调试截图
-
由于我代码运行只输出最后一句count = 0;所以我怀疑数据未进入循环;于是进行printf调试,在每个for循环下设printf语句
最后输出结果如图:
-
发现没有i,j,k的值输出,说明在进入循环时就出了问题
-
在循环上方找问题,发现money误用了double型
-
改正后,在下方测试区测试,答案正确
3.3.2 代码截图
3.3.3 PTA提交列表及说明
说明:因为money定义为double类型使得money/2有小数;而我的初衷是希望将小数舍去,得到可取的最大整数,所以情况出错,没有循环内的值输出,我将类型改为int后,可以成功输出,答案正确。