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

0.展示PTA总分



1.本章学习总结

1.1 学习内容总结

  • 循环结构的使用:

    • for循环结构:第一个是初始化,第二个是条件语句,第三个是自处理语句。 循环时第一个语句只使用一次,然后判断是否满足第二个语句,满足则进入循环体。直到不满足循环体再跳出。
    • while循环结构:先对while()括号内的条件进行判断,若为真则进入循环,否则跳出循环。

    • do-while循环结构:先执行循环体中的表达式的内容,之后再进行循环条件的判断,决定是否进行下一次的循环。

    • 总结

    1. while循环结构do-while循环结构的区别:while和do-while的区别在于判断条件的先后,即while是先判断,程序有可能不进入循环;do-while是后判断,就是说do-while无论是否满足条件都只是会进行一次循环。因此,同样的条件,两种循环的输出结过可能不同。

例如:不相同的情况:两种的输入值与循环条件相同,但是输入的值不满足循环条件,此时while不进入循环而do while会循环一次

如:


此时两种循环是不同的。

相同的情况:两种输入值与循环条件相同,同时进入循环的值与】满足循环条件,两者就是相同的。

如:


此时两种循环是相同的。

2. **for循环结构**与**while循环结构**的区别:再使用for语句时,for语句中的成分直接完成了对变量的初始化,条件的控制以及自处理语句,使程序可以直接进行;而while语句因为只有一个条件,因此需要在循环之前做好对变量的初始化等工作。但在执行起来,两者并没有很多区别。
  • 循环语句的控制

    • break:在执行循环语句时,break也起到控制循环的作用。当满足执行break的条件时,break强制循环结束,不再执行循环体中break之后的内容,并直接跳出循环。一般来说,在循环语句中,我们会用if与break搭配,当条件满足时,起到跳出循环的作用。(注意!!!在嵌套循环中,break之后只能跳出它所在的那一次循环,而不是全部)
    • continue:与break不同,当执行到comtinue语句时,continue会跳过循环体中continue下面的语句,并结束本次循环,并进入下一次循环(注意!!!是只结束本次循环,而不是跳出循环!!!),在循环语句中,一般也是与 if搭配。
  • 嵌套循环

    • 顾名思义,嵌套循环就是在一个循环中包含着其他循环(也可以叫做外循环与内循环)。在使用嵌套循环时,我们需要保持自己的逻辑性,明确内外循环分别代表这什么,并控制好变量的初始化循环的条件结束,否则很容易出错甚至会死循环。
      例如这道分硬币的题目:

      只有首先明确了三个变量的初值(循环的开始),再一层层嵌套,最后利用if的判断输出结果。

1.2 本章学习体会

  • 两周下来,我们又学习了嵌套循环,函数以及一点数据类型。现在学习起来已经开始有点难度以及吃力了,学习C语言的时间也在加长,希望可以通过大量有效的练习来巩固已经学习完的知识。
    • 嵌套循环:嵌套循环涉及了多次循环,需要在代码时有完整的逻辑。对于PTA中于龙的那道对日期合法性的判断还是不是很明白,不知道要怎么利用利用循环取判断日期的合法性。
    • 函数的定义与使用:个人感觉函数的使用大幅减少了主函数的代码量,但是我在写程序时一旦需要定自己定义的函数如果过多,我就开始有点吃力了,个人感觉使用函数还是要多练习。
  • 在这几周的学习中,特别是经过了第一次的机房考试后,我才可以感受到:只有自己一句一句写出来,经过调试和优化的代码才能真正成为你自己的代码,多与别人探讨,多独立思考,才能把学习到的知识真正变成自己的。从网上找的或是从同学那里参考的,或许短期之内会印象深刻,但是时间一长就会逐渐淡忘。你可以与同学讨论,对比同学与自己的想法与思路,最后再考虑是根据自己的私利优化还是借鉴同学的思路,最后再自己写出代码。(个人认为:思路可以参考借鉴,但是代码一定要自己写!!!)。开学已经快两个月了,但是直到现在,当写出了代码并全部正确时,心中还是会很高兴和激动。希望在今后的学习中,我还可以保持这样的状态一直努力下去。
  • 代码量:

2.PTA实验作业


2.1 PTA题目1

c03-单循环结构
7-9 龟兔赛跑 (20 分)
本题要求:在一行中输出比赛的结果:乌龟赢输出@_@,兔子赢输出^_^,平局则输出-_-;后跟1空格,再输出胜利者跑完的距离。

2.1.1 伪代码

#include<stdio.h>  
int main()
{
	定义乌龟跑的总距离 tortoiseSum;定义兔子跑的总距离 rabbitSum;定义时间T;定义rest用于判断是否休息,rest=0时奔跑,rest=30时休息;定义i;time用于循环
        输入时间T。
	令tortoiseSum = 0;rabbitSum = 0;rest = 0;
	for time = 0 to T-1 
	{
		tortoiseSum = tortoiseSum + 3;
		if 时间为10的倍数time % 10 == 0 && rabbitSum兔子距离 > tortoiseSum乌龟距离&& 休息时间rest == 0
		{
			兔子休息时间加30;
		}
		if 休息时间等于0
		{
			兔子结束休息,开始奔跑rabbitSum = rabbitSum + 9;
		}
		else休息时间不为0
		{
			随着时间过去,休息时间减少rest--;
		}
                 end if
	}
        end for
	if (乌龟跑的总距离 > 兔子跑的总距离)
	{
		输出@_@ %d"和tortoiseSum
	}
	else if (乌龟跑的总距离 < 兔子跑的总距离)
	{
		输出^_^ %d"和 rabbitSum
	}
	else
	{
		输出-_- %d"和rabbitSum
	}
       end if
	return 0;
}

2.1.2 代码截图

2.1.3 造测试数据

2.1.4 PTA提交列表及说明

说明:
1.部分正确:在第一次提交之后,出现部分错误:问题出现在循环结构中,第一次将第一个if和第二个if-else的位置写反,导致进入的条件判断先后出现问题,在time=10的倍数时,先判断
                     此时的rest,在第一个10分钟时休息时间本应加上30分钟,之后开始递减,但是此时因为位置写反,没有进行应该进行的递减,导致答案出现错误。
2.全部正确:将两个if的判断语句调换之后,全部正确。

2.2 PTA题目2

c03-单循环结构
7-10 jmu-c-二进制转10进制
输入一组二进制字符,输出其对应的十进制数。当输入回车键时,输入结束。若输入非二进制字符,输出error input!

2.2.1 伪代码

#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
	定义一个字符串num[1000]来储存输入的二进制数 ;定义i,item;sum;a
        令item = 0;sign = 1;sum = 0;
	输入数字
	for i = 0 to num[i] > 0
	{
		if (num[i] != '0' && num[i] != '1')
		{
			item = 1;
			输出error input!
			break;
		}
                end if
	}
        end for
	计算字符串的长度
	if item等于0
	{
		for i = a - 1 to 0
		{
			逐位计算每一位二级制数转换的十进制数并累加sum = sum + sign * (num[i] - '0')
			sign = sign * 2;
		}
		输出sum
	}
        end if
	return 0;
}

2.2.2 代码截图

2.2.3 造测试数据

2.2.4 PTA提交列表及说明

说明:
1.部分正确:第一次使用数组和循环,通过取余数来将输入的数字一位一位取出来,并用数组来存储分离出来的每一个数,对题目给的样例也输出了正确答案,但是提交后却是部分正确,
                    之后调试发现,一旦输入的二进制数超过了10位,数据就会溢出。因此尝试把数组的定义改成long int。
2.部分正确:第一次改为long int之后提交仍然显示部分正确。
3.在VS中经过多次调试发现数组仍会溢出,因此想到用字符串的形式来存储数字字符,最终通过了所有测试点。 

2.3 PTA题目3

c03-单循环结构
7-2 求幂级数展开的部分和
已知函数ex可以展开为幂级数1+x+x^2/2!+...+x^k/k!,现给定一个实数x,要求利用此幂级数部分和求ex​​ 的近似值,求和一直继续到最后一项的绝对值小于0.00001。

2.3.1 伪代码

#include <stdio.h>
#include <math.h>

int main()
{
    定义x, sum ,result,i
    令sum,result=1.0
    输入x
    int i;
    for  i = 1 to
    {
       后一项均为前一项再乘(x/i)result = result *(x/i);
        累加sum += result;
        if 出现一项的绝对值小于0.00001。
        {
            结束循环break;
        }
        end if
    }
    end for
    输出4位小数sum
    return 0;
}

2.3.2 代码截图

2.3.3 造测试数据

2.3.4 PTA提交列表及说明

1.部分正确:一开始循环时将分子与分母都用pow函数进行计算,导致最后在程序在进行时运行超时了
2.全部正确:后来将循环过程中的pow函数计算改为根据前后项之间的联系来进行累加,就不会出现超时,答案全部正确


3.代码互评

3.1.1

7-10 任务06-02-02 于龙又又遇见日期,叕哭了!

同学代码:

我的代码:

两段代码异同

    1. 都能实现题目的要求,对输入的日期进行合法的判断。
    2. 两段代码的总体思路上都是通过穷举法,将输入三个数据进行6种排列判断。
    1. 很明显,同学的代码虽然也是穷举法,但是很简洁;而我的代码明显太长了。
    2. 同学的代码主要使用函数来解决闰年等需要判断的量;而我全篇采用if来判断。
    3. 同学利用数组对6种排列方法进行输出;而我是用if语句对每一项进行判断,造成代码过长。

总结:这道题在写代码时一开始没有想的很多,就是利用if对6种情况判断,所以程序分成了三块类似的代码来判断,造成代码的过于冗长;而看来同学的代码后,我才发现同样是穷举法,但是同学巧妙的运用函数与数组,在达到目的的同时代码量不到我的三分之一。我同样也会数组,但是我在思考时没有想到使用它,因此,这也是我要向同学学习的地方,如何运用自己已经掌握的知识,而不是停留在最初级的写法。

3.1.2

7-10 jmu-c-二进制转10进制  

同学代码:

我的代码:

两段代码异同

    1. 两段代码都能实现题目要求,将二进制转为十进制。
    2. 都将数字用字符型的数据进行输入,来达到目的。
    3. 都使用了字符转数据的计算
    1. 同学的代码采用的时单个字符的存储;而我采用的是字符串的方式进行存储。
    2. 同学用来转进制的方式是在while循环中进行判断,合理时一边读取字符,一边进行计算转换;而我是在判断输入的二进制数合理时,对字符串的长度进行计算,最后利用循环计算。

总结:在这道题上,我和同学的想法大同小异,都想到了用字符型数据进行输入,主要区别就在单个字符的输入与字符串的输入以及代码的写法。个人认为两段代码都有自己的长处,可以互相学习,多多讨论。

posted on 2019-10-20 14:15  蔡浩伟  阅读(537)  评论(4编辑  收藏  举报