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

眉间皱痕 提交于 2019-12-09 09:47:00

第二次C博客作业


Q0.展示PTA总分

  • 单循环结构

  • 嵌套循环


Q1.本章学习总结

1.1 学习内容总结

  • 单循环结构(for语句)
    • 先判断再循环,常在知道循环次数时候使用
    • 表达式1为一个不参与循环的单次表达式,其可作为某一变量的初始化赋值语句,用来给循环控制变量赋初值,也可用来计算其它与for循环无关但先于循环部分处理的一个表达式
    • 表达式2为判断循环条件的语句,为真(1)时执行循环体语句,为假(0)时结束循环
    • 表达式3每次循环结束后执行一遍,然后再转到表达式2进行判断
    • 表达式1,2,3均可以为空,但必须要有一个“;”符号!并且它们都可以有多个表达式,中间用“,”连接
    • 循环体语句只有一句时可以省略大括号,但一般建议还是写上大括号方便阅读

    for (表达式1; 表达式2; 表达式3)   
    {
        循环体语句;    //需要被多次执行的内容
    }
    
  • 单循环结构(while和do-while语句)
    • 两者代码结构十分相似,但要注意do-while语句中while()后要加分号
    • while语句先判断再循环,do-while语句先循环再判断,两者一般都用于不知道循环次数的情况(知道次数也可用)
    • 表达式1、2为判断循环条件的语句,为真(1)时执行循环语句,为假(0)时结束循环
    • 由于do-while语句先循环再判断,导致它在第一次进入循环时就不符合条件的情况下,也会执行一次循环,而for、while语句会直接结束循环

    while (表达式1)   
    {
        循环语句1;
    }

    do
    {
        循环语句2;
    } while (表达式2);   
    
  • 简单案例:用三种单循环结构计算1+2+…+100的值

运行完毕后三者都计算出正确答案5050

  • 嵌套循环
    • 顾名思义,循环中再次进行循环,但要注意检查循环结构,经常会出现死循环的情况
    • 可以为多个for连用,while与for连用等等情况
    • 要特别注意什么时候要在外部循环后,内部循环前对某些变量进行初始化(如计算多个阶乘之和在每次执行完内部循环后都要重置项为1)
    • 注意循环次数,若有多个嵌套循环执行的次数会相当大,影响程序效率,需要想办法控制循环次数(如课本中的男人、女人、小孩搬砖问题)
  • continue与break语句
    • break语句:跳出本层循环(如果要跳出嵌套循环则还需要更多的break)
    • continue语句:跳出本次循环,进入下一轮循环,并且它只能用于循环语句中
        /*continue和break语句简单说明*/

    for (i = 1; i <= 5; i++)
    {
        if (i == 3)
            continue;    //当i的值为3时直接跳过了下面的printf(),执行下一次i=4时的循环
        printf("A");     //最终输出了4个A
    }

    for (i = 1; i <= 5; i++)
    {
        if (i == 3)
            break;       //当i的值为3时直接结束循环
        printf("A");     //最终仅输出了2个A
    }
    

1.2 本章学习体会

  • 进入到循环结构后,课程难度也慢慢上去了,题目的复杂程度一下子飙升了,需要我们更加努力的去思考
  • 这也意味着动手敲代码越来越重要!!只看书是很难解决疑问的!
  • 循环结构是可能是代码中最最最重要的一部分了,不会的问题一定要抓紧时间解决了,不然到了数组等部分会相当相当痛苦
  • 代码量的话这周把2840题库中除了链表以外的都做完了,所以下次开始就没有这个量了……


Q2.PTA实验作业

2.1 求幂级数展开的部分和

2.1.1 伪代码

    x为用户输入的数字
    result用于保存最终结果,初始值为0
    item用于记录每项的值,初始值为1
    i用于记录当前为第几项,初始为1
    flag1为分母,flag2为分子

    输入x

    while item大于0.00001
        result = result + item;
        flag1 = 1;
        flag2 = 1;
        for j = 1; j <= i; j++
            flag1 = flag1 * j;
        end for
        for j = 1; j <= i; j++
            flag2 = flag2 * x;
        end for
        item = flag2/flag1;
        i++;
    end while
    result = result + item;
    
    输出结果result

2.1.2 代码截图

2.1.3 造数据测试

输入数据 输出数据 备注
0 1.0000 x取最小值
1 2.7183
1.2 3.3201 题目的例子
5 148.4132 x取最大值
0.1 1.1052

2.1.4 PTA提交列表及说明

  • 第1、2个部分正确:取x=5时程序运行超时。删除了代码中所有运用pow()的部分,改为用for来计算次方。
  • 第3、4个部分正确:计算次方的循环中乘的值不正确,将j改成了x
  • 第5个部分正确:x=5时答案仍然错误,经多次F11测试和用计算器计算e的5次方后发现最后结果少算一项,在输出前补上了这一项

2.2 简单计算器

2.2.1 伪代码

    ch1保存上一次输入的符号
    ch2保存新输入的符号
    a为输入的数字
    result保存已经计算的结果
    flag用于记录是否出现非法运算,初始为0

    输入算式,读取第一个数字和符号
    result=第一个数字

    while ch1不为等号
        读取下一个数字和字符

        switch ch1的符号  
        为加号时:result = result + a; break;
        为减号时:result = result - a; break;
        为乘号时:result = result * a; break;
        为除号时:
            if 除数不为0
                result = result / a;
                break;
            else  
                flag = 1;
                break;
            end if
        为其他符号时:flag = 1; break;  
        end switch
        ch1 = ch2;  
    end while

    if flag值为0  
        输出result
    else  
        输出ERROR
    end if

2.2.2 代码截图

2.2.3 造数据测试

输入数据 输出数据 备注
1+2*10-10/2= 10 题目的例子
1= 1 最小表达式
2+2/0= ERROR 除数为0
2+2*3&4= ERROR 非法表达式
1+3-2*0= 0 结果为0的情况

2.2.4 PTA提交列表及说明

(采用了2840题库中第一次做这题时的提交列表)

  • 第1个部分正确:除数为0的情况忘记写上,补充上了上去
  • 第2、3个部分正确:补充完除数为0的情况后还优化了代码(反向优化),结果出现了最小表达式的错误,单独增加了第一个符号就是等号的判断
  • 答案正确(本次题库中的):再一次优化了代码,减少了变量和多余的判断

(2840题库中这题上次写的部分代码)


2.3 单词长度

2.3.1 伪代码

    flag记录是不是第一个输出的数字
    count记录长度
    ch记录字符
    flagLetter记录是否遇到过空格或点以外的字符

    do
    {
        输入句子,每次读取一个字符
        if 读入的不是空格或点
            count++;
            flagLetter = 1;
        end if
        if 遇到过空格和点以外的字符,且又遇到了空格或点
            if flag值为0
                输出第一个单词长度,不带任何空格
                flag = 1;
            else   
                输出单词长度,前面带一个空格
            end if
            count = 0;
            flagLetter = 0;  
        end if
    } while ch不是”.”

2.3.2 代码截图

2.3.3 造数据测试

输入数据 输出数据 备注
It's great to see you here. 4 5 2 3 3 4 题目的例子
. 空句子
apple. 5 一个单词
(空格)(空格)abc(空格)(空格)(空格)de f(空格)(空格). 3 2 1 开头结尾多空格,连续多个空格

2.3.4 PTA提交列表及说明

第1个部分正确:空句子、连续多个空格、开头结尾多空格测试点无法通过,一开始的代码是遇到空格、点就会输出一个长度,导致输出了很多不必要的0,之后将代码进行了优化,新增加了变量flagLetter来判断是否有遇见过字母或其他字符,有遇过再输出长度
第2-5个部分正确:空句子测试点过不了,这个纯属画蛇添足了,当时写这里的时候单独写了一段代码,空句子时输出长度为0(自己觉得非常完美!没有任何问题!),还找同学说吐槽你看这个PTA是不是有问题啊我这写的哪里有问题啊。后来有人过了这个测试点,问了一下才知道空句子什么都不能输出……于是删掉那段多余的代码就通过了


Q3.代码互评

3.1 二进制转十进制

同学代码

我的代码

  • 我的代码使用了数组,先保存下所有输入的数,再进行后面的步骤,同学的代码读取一个使用一个,效率更高
  • 我的代码将储存的数组反用,同学的代码正向读取正向使用
  • 我的代码使用了函数pow(),并且随着count的增加程序效率会越来越低,而同学的代码没有使用这个,效率很高
  • 我们的代码都使用了变量flag来记录是否有遇到非法数字并控制输出的内容

3.2 编程打印空心字符菱形

同学代码

我的代码

  • 同学的代码将菱形的上下部分的for循环分开来写,我的代码则是在一个大的for循环中完成
  • 我的代码单独使用了两个变量k和kk分别来记录字母前的空格数和菱形中间的空格数,同学的代码则是找出他们之间的关系式进行使用,相比下我的代码更利于阅读,同学的代码使用的变量更少,程序效率略高一些
  • 我们的代码中都有一个关键数字,即为(行数+1)/2
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!