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 代码截图

C语言博客作业02--循环结构_第1张图片

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 代码截图

C语言博客作业02--循环结构_第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 代码截图

C语言博客作业02--循环结构_第3张图片

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提交列表
    C语言博客作业02--循环结构_第4张图片

  • 说明:

    结果 原因
    部分正确 内循环上限太小,有些Fibonacci数无法输出
    答案正确 修改上限之后,答案正确
    部分正确 删除条件表达式后多输出了一个1
    答案正确 将循环之前的if语句删除即可

3.代码互评

第一份代码

  • 同学代码截图
    C语言博客作业02--循环结构_第5张图片
  • 自己代码截图
    C语言博客作业02--循环结构_第6张图片
  • 评价:
    1.同学使用了数组来存储每个素数,最后进行处理,我则是判断是素数后马上进行处理
    2.同学是以()%d+)...(%d=%d)的形式来控制输出格式,我则是用(%d)(+)(%d)...(=%d)的形式控制输出格式
    3.我使用了自定义函数来判断素数,而同学是直接在main函数中处理

    第二份代码

  • 同学代码截图
    C语言博客作业02--循环结构_第7张图片
  • 自己代码截图
    C语言博客作业02--循环结构_第8张图片
  • 评价:
    1.同学直接让num满足2^n-1这个条件,而我的for循环虽然也是先满足这个条件,但显然造得不够好
    2.同学在main函数中判断素数,而我使用自定义函数判断素数
    3.虽然思路都是差不多,但是明显同学的代码比我要简洁许多,值得学习


你可能感兴趣的:(C语言博客作业02--循环结构)