C语言博客作业02--循环结构
0.展示PTA总分
本月活动较多,刷pta的题量较少,一定在这几天补上,望老师理解
1.本章学习总结
1.1 学习内容总结
1.while循环
while循环作为最基本的循环结构,同时也是最简单的循环结构,其结构格式如下:
while(循环条件)
{
循环语句
}
当循环条件成立时,则进入循环,执行循环语句,执行完一次循环语句时,重新判断是否符合循环条件,符合则继续执行循环,直到循环条件不成立则结束循环。
2.do while循环
do while循环与while循环相似,只不过do while循环相较于while循环来说,无论一开始是否符合循环条件,都会进行一次循环,其结构格式如下:
do
{
循环语句
}while(循环条件);
3.for循环
for循环也是一个与while循环相似的循环结构,不同之处在于for循环可以将进循环前的初始化以及循环语句的末尾处理与循环条件放在一起,其格式如下:
for(初始化;循环条件;结尾处理)
{
循环语句
}
1.2 本章学习体会
学习感受:
1.循环结构有许多种,如何正确地选择适合不同程序的循环结构是本章学习的一个重点,有时候换一种循环结构会让代码变得更加简洁。
2.由于循环结构能够重复执行循环语句的特点,是否能熟练地运用以及阅读嵌套循环是本章学习中应着重培养的能力。
代码量
500左右
2.PTA实验作业
2.1 7-10 任务06-02-02 于龙又又遇见日期,叕哭了! (10 分)
2.1.1 伪代码
声明用于检查日期合理性的函数IsCheckDate(int year,int month,int day);
定义用于存储输入的三个数字的整型变量num1,num2,num3
定义用于存储输入的两个字符的字符型变量ch1,ch2
定义一个用于记录合法日期的个数的整型变量count=0
输入数据("%d%c%d%c%d",&num1,&ch1,&num2,&ch2,&num3)
if(IsCheckDate(num1,num2,num3)==0)count++;//判断每种情况是否可行,然后计数
if(IsCheckDate(num1,num3,num2)==0)count++;
if(IsCheckDate(num2,num1,num3)==0)count++;
if(IsCheckDate(num2,num3,num1)==0)count++;
if(IsCheckDate(num3,num1,num2)==0)count++;
if(IsCheckDate(num3,num2,num1)==0)count++;
如果(count>0)
输出记录的个数
否则
输出Invalid Date!
return 0;
定义函数IsCheckDate(int year,int month,int day);
{
定义一个用于存储二月天数的整型变量FebruaryDay=28;
if(year是闰年)
{
FebruaryDay=29;
}
if(month大于12)
{
返回1
}
else if(month等于2)
{
if(month小于等于FebruaryDay)返回0;
else 返回1;
}
else if(month等于小月)
{
if(day小于等于30)返回0;
else 返回1;
}
else
{
if(day小于等于30)返回0;
else 返回1;
}
}
2.1.2 代码截图
2.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
2/3/1 | 6 | 都小于12时 |
13+12+45 | 1 | 只有1种情况符合时 |
29,2,2019 | Invalid Date! | 所有情况都不符合时 |
2.1.4 PTA提交列表及说明
提交列表说明:
1.部分正确:忘记考虑都不合法的情况
2.部分正确:忘记考虑都不合法的情况
3.全部正确:考虑了都不合法的情况
2.2 7-9 单词长度 (15 分)
2.2.1 数据处理
定义一个字符型变量word依次存储输入的每一个字符
定义一个整型变量count=0来记录单词长度
定义一个整型变量flag1=0来判断一个单词的开始
定义一个整型变量flag2=0来判断输出的是否是第一个单词长度,调整输出的格式。
do
{
count=0
do
{
scanf("%c", &word);//依次录入每一个字符
if(word不是空格或句号)//判断输入的是否为字符,是则count++
{
flag1 = 1;//表示正在输入单词
count++;
}
}while(word不是空格或句号)
if (flag1)//flag1为1时,表示已经输好了一个单词
{
if (flag2)
{
printf(" ");
}
printf("%d", count);
flag1 = 0;//复位,等待下一个单词输入
flag2 = 1;//flag2=1时表示已经输出了一个单词长度
}
} while (word != '.');
return 0;
}
2.2.2 代码截图
2.2.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
It's great to see you here. | 4 5 2 3 3 4 | 正常语句 |
(空格)(空格)It's great to see you here(空格)(空格). | 4 5 2 3 3 4 | 正常语句前后加空格 |
(空格)(空格). | 仅空格 | |
. | 仅句号 | |
Hello. | 5 | 一个单词 |
2.2.4 PTA提交列表及说明
提交列表说明:
1.部分正确:单词只考虑了字母与单引号
2.全部正确:修改了错误
3.全部正确:加了注释
2.3 7-9 龟兔赛跑 (20 分)
2.3.1 数据处理
定义一个整型变量T用于存储时间
定义一个整型变量tDistance=0用于记录乌龟跑的距离
定义一个整型变量rDistance=0用于记录兔子跑的距离
定义一个整型变量runTime=0记录兔子跑的时间
定义一个整型变量restTime=0记录兔子休息的时间
定义一个整型变量flag=0判断兔子是否应该休息
scanf("%d",&T);
for(;T>0;T--)//时间按分钟来消耗
{
if(flag)//flag==1说明兔子该休息了
{
restTime++;
if(restTime能被30整除)//说明已经休息了30分钟
{
flag=0;
}
}
else//如果兔子继续跑
{
rDistance+=9;
runTime++;
}
if(兔子跑了10分钟并且跑的距离比乌龟长)
{
flag=1;
}
tDistance+=3;//乌龟每分钟都在匀速跑
}
if(兔子跑得快)
{
printf("^_^ %d",rDistance);
}
else if(一样快)
{
printf("-_- %d",rDistance);
}
else
{
printf("@_@ %d",tDistance);
}
return 0;
2.3.2 代码截图
2.3.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
242 | @_@ 726 | 双方奔跑乌龟赢 |
9 | _ 81 | 不足10分钟 |
11 | _ 90 | 兔子睡觉中赢 |
2.3.4 PTA提交列表及说明
提交列表说明:
1.部分正确:for循环循环条件为T>=0多跑了一分钟
2.全部正确:修改了错误
3.代码互评
同学代码截图
(智凯同学的代码)
自己代码截图
1.两段代码的主函数其实思路相似,都是运用全排列的方式罗列出所有排序方式,再通过函数进行判断,记录合法日期组合数
2.两段代码的不同之处在于函数的设计,智凯同学巧妙地运用了数组来存储每个月的天数,在检验合法日期时就可以直接提取出来检验,使代码更加简洁。
3.而我是直接通过月份来判断天数,用的是分支结构,感觉智凯的方法更加精巧,可以多多学习。
同学代码截图
(智凯同学的代码)
自己代码截图
1.对于时间,我是直接将T拿来减,而智凯是定义了一个i来计算,i也可以用于后面的计算。
2.对于休息时间的判断,我是用余数是否等于0来判断,而智凯是直接判断是否等于30,这样需要在后面将休息时间复位。
3.对于兔子跑步的时间的判断,我另外定义了一个变量,而智凯直接用i是否能被10整除来判断,显得更加简洁。
4.我觉得智凯下面这段代码还可以优化,将if嵌套改为一个if就行(将判断条件改为if(i%10==0&&rabbit>tortoise)):