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.虽然思路都是差不多,但是明显同学的代码比我要简洁许多,值得学习

posted @ 2019-10-20 20:10  朱振豪  阅读(523)  评论(3编辑  收藏  举报