C语言博客作业02--循环结构

2019/10/20 20:10
阅读数 29

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

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部