C语言博客作业02--循环结构
0.展示PTA总分
0.1 单循环题目集
0.2 嵌套循环题目集
1.本章学习总结
1.1 学习内容总结
第四章(始于4.3)
1.break与continue
break的作用是终止循环,而continue的作用是跳过本次循环下面的语句进入下一个循环。break不仅可以用于循环中也可以用于switch语句中,而continue只能用于循环之中。它们往往要和if语句搭配使用。
break实例:
for(i=2;i<=n;i++)
{
if(m%i==0) break;
}
执行break语句后就退出for循环
continue实例:
for(i=2;i<=n;i++)
{
if(flag) continue;
i++;
}
执行continue后此次循环就不会执行i++;
语句了
2.嵌套循环
嵌套循环就是多个循环的叠加,往往这类题目会比较困难,例如打印九九乘法表、(空心)金字塔等等。嵌套循环需要注意初始化语句的放置位置。
实例:
for (i = 1; i <= n; i++)
{
for (j = 1; j <= i; j++)
{
printf("%d*%d=%-4d", j, i, i * j);
}
printf("\n");
}
内外循环各控制一个数变化,实现嵌套循环
3.关于循环语句的选择
一般来说,如果事先给定了循环次数,首选for语句;如果循环次数不明确,需要通过其他条件来控制循环,通常选用while或者do-while语句;如果必须先进入循环,经过循环体运算得到控制条件后,在判断是否进行下一次循环,自然是do-while语句更为合适。
- 基本语法:
for循环:for(初始表达式;条件表达式;步长表达式) 循环体
while循环:while(循环条件) 循环体
do-while循环:do {循环体} while(循环条件);
第五章
1.函数定义、声明与调用
函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数。函数定义的一般形式为
函数类型 函数名(形式参数表)
{
函数体
}
例如:
int even(int n)
{
if(n%2==0) return 1;
else return 0;
}
函数如果放在main函数之后,则应在之前给与声明,如int even(int n);
函数调用通常有以下形式:k=fun(x)
, if(fun(x))
, fun(x)
等等
2.结构化程序设计思想
结构化程序设计强调程序设计的风格和程序结构的规范化,提倡清晰的结构,其基本思路是将一个复杂问题的求解过程划分为若干阶段,每个阶段要处理的问题都应是容易被理解和处理的。例如开发一个学生成绩统计程序,应将其分解为成绩输入,数据计算,数据查找和输出成绩四个部分,其中数据计算又可以细分为计算学生平均分和计算课程平均分。当这一个个简单的小问题都处理完毕的时候,整个复杂的问题也就随之解决了。
3.全局变量
全局变量具有全局的生存期和作用域,它往往会用于多个函数和实现返回多个值。全局变量定义于函数之外,例如:
float cash;
int main()
{
函数体
}
4.静态局部变量
静态局部变量具有全局的生存期和局部的作用域。静态局部变量会保存上一次被调用的值,当再次调用的时候,静态局部变量会被重新激活。静态局部变量定义格式为static 类型名 变量名
使用静态局部变量求阶乘:
double fact_s(int n)
{
static double f = 1;
f=f*n;
return f;
}
第六章
1.原码、补码和反码
正数的原码、补码和反码都相同,而负数的反码是符号位为1,其余各位对原码取反,其补码是反码加1。例如(以-1为例):
-1的原码 | 10000000 00000001 |
---|---|
-1的补码 | 11111111 11111110 |
-1的补码 | 11111111 11111111 |
2.转义字符 | |
有一些字符,如回车、退格符等控制码,它们不能在屏幕上显示,也无法从键盘输入,只能用转义字符来表示。部分转义字符如表所示: |
字符 | 含义 |
---|---|
\n | 换行 |
\t | 横向跳格 |
|反斜杠 | |
\" | 双引号 |
\' | 单引号 |
\ddd | 1-3位八进制正数所代表的字符 |
\xhh | 1-2位十六进制整数所代表的字符 |
1.2 本章学习体会
-
这段时间我进一步巩固了所学习的知识点,并通过精读教材处理了一些细节问题,对于C语言的应用更加熟练了。这段时间我觉得最大的收获是接触了结构化程序设计思想,这种思想将复杂问题简单化,我觉得如果能够熟练应用的话,自己编写代码的能力会得到质的飞跃。但是要做到知行合一是很难的,但是我会去努力实践。
-
两周的代码量统计如下:
PTA题集|c04--嵌套循环|c05-函数|2019-test01-顺序分支结构|总计
:-😐:-😐:-😐:-😐:-:
代码量|337|223|212|772
2.PTA实验作业
2.1 jmu-c-二进制转10进制
2.1.1 数据处理
-
数据处理:
变量|由来|类型
:-😐:-😐:-:
ch|记录输入的每个字符|char
sum|记录总和|double
flag|是否为合法二进制字符的标志|int -
伪代码:
定义ch存放字符
定义sum记录总和
定义flag作为合法标志
while 读入字符赋给ch并不等于换行符
if ch等于1或者0 then
累加到sum
else
输出error input!
标志不合法
退出循环
end if
if 合法 then
输出sum
end if
2.1.2 代码截图
2.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
00001000 | 8 | 多个0 |
123456 | error input! | 不是二进制数 |
111111111111 | 4095 | 多个1 |
987654 | error input! | 不是二进制数 |
2.1.4 PTA提交列表及说明
-
PTA提交列表
-
说明:
结果|原因
:-😐:-:
部分正确|直接用int binaryNumber
存放这个二进制数,但是多个1这个测试点会超过int的范围,而类型换成double就无法使用%
答案正确|使用字符串存放二进制数可以解决问题,但是比较麻烦
答案正确|实践老师课堂讲解的方法,使用char ch
存放字符,能够简单明了地解决问题
2.2 水仙花数
2.2.1 数据处理
-
数据处理:
变量|由来|类型
:-😐:-😐:-:
n|记录正整数的位数|int
upper|循环上限|int
sum|记录各位数字的n次方之和|int
mask|记录各位数字的n次方|int
temp|记录各位数字|int
num|记录原数|int
i,j|循环变量|int -
伪代码:
定义n记录正整数的位数
定义upper作为循环上限
定义sum记录各位数字的n次方之和
定义mask记录各位数字的n次方
定义temp记录各位数字
定义num记录原数
定义i,j作为循环变量
scanf从键盘读入n值
for i=循环下限 to 循环上限
保留i值
将sum清零
while num不为0
取num的个位并记录个位
for j=1 to n
计算该位的n次方
end for
累加到sum并舍弃个位
end while
if sum与i相等 then
输出i
end for
2.2.2 代码截图
2.2.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
4 | 1634 8208 9474 | N较小 |
7 | 1741725 4210818 9800817 9926315 | 最大N |
2.2.4 PTA提交列表及说明
-
PTA提交列表
-
说明:
结果|原因
:-😐:-:
答案错误|误认为是每位数字的三次方之和与原数相等为水仙花数
部分正确|循环内调用pow函数导致超时
答案正确|使用for循环代替pow函数来计算每位数字的n次方
2.3 使用函数输出指定范围内的Fibonacci数
2.3.1 数据处理
-
数据处理:
- fib函数:
变量|由来|类型
:-😐:-😐:-:
fib1|第一个Fibonacci数|int
fib2|第二个Fibonacci数|int
fib|记录后一个Fibonacci数|int
i|循环变量|int- PrintFN函数:
变量|由来|类型
:-😐:-😐:-:
flag|控制格式输出|int
cnt|有无Fibonacci数的标志,0为无,1为有|int
num|记录fib(j),避免多次调用fib(int n)函数|int
i,j|循环变量|int -
伪代码:
定义函数fib(形参为n)的类型为int
定义fib1作为第一个Fibonacci数
定义fib2作为第一个Fibonacci数
定义fib记录后一个Fibonacci数
定义i作为循环变量
if n为1或2 then 返回1
for i=3 to n do
令fib等于前两项之和
将fib1和fib2后移一项
end for
返回 fib1
定义函数PrintFN(形参为m,n)的类型为void
定义i,j作为循环变量
定义flag控制格式输出
定义cnt作为有无Fibonacci数的标志,0为无,1为有
定义num记录fib(j),避免多次调用fib(int n)函数
for i=m to n do
for j=1 to 无穷大 do
调用fib赋值给num
if num和i相等 then
输出i
end if
if num大于i then 退出循环
end if
end for
end for
if cnt为0 then 输出No Fibonacci number
2.3.2 代码截图
2.3.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
33 90 8 | fib(8) = 21 34 55 89 | 左端点是完数 |
2100 2300 7 | fib(7) = 13 No Fibonacci number | 空集 |
0 10000 7 | fib(7) = 13 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 | 最大范围 |
34 55 7 | fib(7) = 13 34 55 | 两端点都是F数 |
2.3.4 PTA提交列表及说明
-
PTA提交列表
-
说明:
结果|原因
:-😐:-:
部分正确|内循环上限太小,有些Fibonacci数无法输出
答案正确|修改上限之后,答案正确
部分正确|删除条件表达式后多输出了一个1
答案正确|将循环之前的if语句删除即可
3.代码互评
第一份代码
- 同学代码截图
- 自己代码截图
- 评价:
1.同学使用了数组来存储每个素数,最后进行处理,我则是判断是素数后马上进行处理
2.同学是以()%d+)...(%d=%d)的形式来控制输出格式,我则是用(%d)(+)(%d)...(=%d)的形式控制输出格式
3.我使用了自定义函数来判断素数,而同学是直接在main函数中处理
第二份代码
- 同学代码截图
- 自己代码截图
- 评价:
1.同学直接让num满足2^n-1这个条件,而我的for循环虽然也是先满足这个条件,但显然造得不够好
2.同学在main函数中判断素数,而我使用自定义函数判断素数
3.虽然思路都是差不多,但是明显同学的代码比我要简洁许多,值得学习