是啾咪呀。

又惘又怠

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

0.展示PTA总分

  • 单循环题目集

  • 嵌套循环题目集

1.本章学习总结

1.1学习内容总结

  • (a)while语句

    while(表达式) 
    {
              循环体语句;
    }
    
  • 执行流程:当表达式的值为“真”时,循环执行,直到表达式的值为“假”,循环终止并继续进行while的下一条语句。简单案例:求奇数和

  • (b)for语句改while语句

    表达式1;
      while(表达式2)
      {
              for的循环体语句;
              表达式3;
       }
    
  • (c)do-while语句

    min=a;
    while(grade>=0)
    {
        if(grade<min)
        {
            min=grade;
        }
    }
    
  • 执行流程:第一次进入循环时,首先执行循环体语句,然后再检查循环控制条件,即计算表达式,若值为“真”,继续循环,直到表达式的值为“假”,循环结束,执行do-while的下一条语句。简单案例:找出最小值

  • (abc)比较for循环,while循环,和do-while循环的区别。

  • 1)for语句和while语句都是循环前判断条件,只有条件满足时才会进入循环,如果一开始条件就不满足,则循环一次都不执行,但是do-while循环至少会执行一次循环体。

  • 2)一般情况下,如果题目指定了循环次数,用for语句更加清晰,当然也可以用while语句,而如果没有指定循环次数,而是由某一项的值来控制循环,用while循环可能更合适。

  • (d)break语句与continue语句的应用

  • 1)break语句和continue语句一般用于循环语句中,不过,break语句还可以用在switch-case结构中。在循环语句中,一旦执行了break语句,循环提前结束,不再执行循环体中位于其后的其它语句。break语句应该和if语句配合使用,即条件满足时,才执行break跳出循环;否则,若break无条件执行,都会结束循环,有时需要区分循环的结束条件。

  • 2)continue语句的作用时跳过循环体中continue后面的语句,继续下一次的循环。

  • 简单案例:

  • (e)求最大值最小值

  • 小贴士
    min初值:1.输入的第一个数作为初值。2.比输入数都大的数。

    max初值:1.输入的第二个数作为初值。2.比输入数都小的数。

  • (f)二进制转十进制

    #include <stdio.h>
    int main()
    {
    	char ch;
    	int num=0;
    	while ((ch = getchar()) != '\n')
    	{
    		num = num * 2 + ch - '0';
    	}
    	printf("%d", num);
    	return 0;
    }
    
  1. 小贴士num=num乘2+ch-‘0’是一个很好用的工具,其实换个思路理解,如果我们换成 num=num乘10+ch-‘0’,则是我们对拿到的数依次进位,就能比较好的理解这个。

1.2本章学习体会

  • 在本章节里,我们开始写的代码会比一开始更长,更复杂一点,这时候,就要求我们对某些经常用到的代码结构足够的熟悉,对某些部分代码的特定功能要滚瓜烂熟,并且要学会优秀代码的操作过程,这样可以大大减少我们花费的时间,提高程序的效率,在上一次的c语言上机课时,由于我对设计求素数函数这个不能理解,一直被卡住很久,然后就很心塞塞。
  • 这两周的代码量
这两周代码量
816
  • 计算这两周的代码量,并没有达到目标,现实很骨感,加上自己写一道题花费的时间有点多,所以总体量会偏少,愿自己以后以后能够孰能生巧,并且认真看题目,真的好惨,如果因为没认真看题目在那边死纠结。T_T

2.PTA实验作业

2.1题目名:7-2梅森数

  • 题目:形如2n−1的素数称为梅森数(Mersenne Number)。例如22−1=3、23−1=7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了231−1=2147483647是一个素数,堪称当时世界上“已知最大素数”的一个记录。

    本题要求编写程序,对任一正整数nn<20),输出所有不超过2的n次方−1的梅森数。

2.1.1伪代码

a)定义变量n存放正整数,
定义end为不超过2的n次方的最大梅森数,
定义digit为梅森数。
b)定义函数Digit(double n)来求梅森数,
定义函数Isprime()来判断是不是素数。
c)
输入成绩;
if(n==1)
没有梅森数;
end if
if(n==2)
输出梅森数3;
end if
for i=2 to end do
调用函数Digit(i)输出梅森数
if(调用Isprime()函数来判断梅森数是否为素数)
如果是,则输出梅森数;
end if
end for

2.1.2代码截图

2.1.3造测试数据

输入数据 输出数据 说明
1 None 没有梅森数
2 3 只有一个梅森数
6 3 7 13 答案正确
20 3 7 31 127 8191 131071 524287 答案正确

2.1.4PTA提交列表及说明

提交列表说明

1.部分正确:对最小整数缺少判断。
2.部分正确:一开始是digit<=end,则会多输出一个梅森数,于是把等号去掉。
3.部分正确:发现等号去掉以后,对n=2不成立,于是n=2另外分析。

2.2 题目名:水仙花数

  • 水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。

2.2.1伪代码

a)定义变量N表示几位数
定义term表示N位数的最小值
定义value1表示用来存储帧数分解以后的各个数
定义value2存储这个数的个位数
定义value3存储各个数N次方以后的值
定义sum用来存储这个数各个数的立方和。
b)
定义Mypow()函数用来求N位数的最小值,
定义mypow()用来定义整数的各个数的N次方和。
c)
输入N;
求N位数的最小值term
for i=term to term*10 do
do
{  取各位:value1=value2%10;
   去个位:value2=value2/10;
   算N次方和:value3=mypow(value1,N);
   sum对各个数N次方和求和
   if sum和i相等
   输出水仙花数
   对sum重新赋值,进行下一次求和
   end if
 }
 end for

2.2.2代码截图

2.2.3造测试数据

输入数据 输出数据 说明
3 153 370 371 407 数据正常
2 没有 异常数据
7 1741725 4210818 9800817 9926315 数据正常

2.2.4PTA提交列表及说明

  • 提交列表说明:
1.答案错误:一开始没有看清题目,所以只是以为是做个的那道题,求三位数的水仙花数,于是提交,答案错误。
2.答案错误:后来发现了,又开始纠结于如果N等于四,等于五,怎么求把每个数分开,那个时候自己脑袋一定是装了浆糊,所以没转过来,在那边纠结了很久,于是错误了很多次,后来才发现只要取余就可以。
3.编译错误:复制过去scanf没改过来。
4.格式错误:最后我纠结的地方在格式,因为我用鼠标弄输出样例,发现前三个数后面有空格,最后一个数没有,于是在那边想了很久,不知道怎么解决,因为对于不同的N,它的水仙花数数量也不是固定的,无法通过限制条件来解决,后来发现是我鼠标弄得方式不对头,于是出现了那种情况,后来就可以了。

2.3题目名:图形打印

  • 题目要求读入菱形起始字母和菱形的高度,然后输出空心字符菱形。所谓“空心菱形”是指:每行由两端为字母、中间为空格的字符串构成,每行的字符串中心对齐;上半部分相邻两行字符串长度差2,且字母从给定的起始字母逐一递增;下半部分与上半部分对称。

2.3.1伪代码

1.a)
定义字符型变量ch来存储输入的字母,
定义n来表示输入的行数,
定义mid=(n+1)/2表示中间一行,
定义ch1表示每一行都换成不同的字母。
2.b)
输入ch和n;
算出中间行mid;
for i=1 to n do
for j=1 to j=fabs(mid-i)do
输出空格;
for k=1 to k=n-2*fabs(mid-i))
如果时第一个和最后一个,则输出字母
如果不是,则输出空格;
最后换行;
end for

2.3.2代码截图

2.3.3造测试数据

2.3.4PTA提交列表及说明

  • 列表说明:
虽然是一次通过,那是因为刚刚看完超星的视频,可是当我自己再去打一遍时,仍然发现了问题,在vs里,如果没有再定义一个ch1,直接把表达式放到printf,那样是输出不了东西的,因为里面有函数,所以需要在外面在定义一个变量,同时,自己打的时候忘记了换行。

3.代码互评

3.1题目名:龟兔赛跑

  • 乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

同学代码截图



自己代码截图



二者比较

1.我们思考的方式不同,同学的代码是在每十分钟时,如果条件允许,对乌龟的路程加上90,时间加上30。
2.她的代码设计的变量更少,并且其实更容易被人理解,不用绕比较远的路,更加直接。

3.2 题目名:二进制转十进制

  • 输入一组二进制字符,输出其对应的十进制数。当输入回车键时,输入结束。若输入非二进制字符,输出error input!

同学代码截图

自己代码截图

二者比较

1.在读入二进制数时,我们通常想的是把数一个一个从末尾取出来,或者定义一个大的数组用数组存取来,但是同学的代码用getchar()尽管是从头开始存储,但是下面的num=num*2+ch-‘0‘可以直接转为十进制,不用考虑从后面还是前面取。
2.我觉得同学的代码更简单方便,并且效率也会比我的高,因为我用了pow()函数,我觉得这种代码应该是我要学习的。
posted @ 2019-10-20 22:04  是啾咪呀。  阅读(501)  评论(0编辑  收藏  举报