C博客作业01--分支、顺序结构
0.展示PTA总分
- 顺序结构
- 分支结构
1.本章学习总结
1.1 学习内容总结
1.学习简单的三个数按顺序排列。
#include<stdio.h>
int main()
{
int num1,num2,num3; //定义3个基本整型变量来存放三个数num1、num2、num3
int n; //定义第4变量来进行之后的数字交换处理
scanf("%d%d%d",&num1,&num2,&num3); //输入任意3个数
if(num1>num2) //如果num1大于num2,借助中间变量n实现num1与num2值的互换
{
n = num1;
num1 = num2;
num2 = n;
}
if(num1>num3) //如果num1大于num3,借助中间变景n实现num1与num3值的互换
{
n = num1;
num1 = num3;
num3 = n;
}
if(num2>num3) //如果num2大于num3,借助中间变量n实现num2与num3值的互换
{
n = num2;
num2 = num3;
num3 = n;
}
printf("%d %d %d",num1,num2,num3); //输出函数顺序输出num1、num2、num3的值
return 0;
}
2.学习了随机数函数。
#include<stdio.h>
#include<stdlib.h> //随机数必备
#include<time.h> //随机数必备
int main()
{
int number;
srand(time(0)); //生成不同随机种子
number = rand()%100; //生成随机数赋值给number (%100表示随机数的范围是0~99)
printf("%d",number);
return 0;
}
3.学习了while、for语句的简单运用以及字符型变量的简单应用。
while( ) //当条件不满足括号内表达式时停止循环
{
//循环语句
}
for( ; ; ) //第一个空开始循环时执行一次,总共执行一次,第二个空为判断条件是否成立,第三个空当循环语句执行完后进行。
{
//循环语句
}
char a,b; //定义字符型变量a,b
a=getchar(); //输入一个字符
/*或*/
scanf("%c",&b); //同是输入一个字符
putchar(a); //输出字符a
/*或*/
printf("%c",b); //输出字符b
4.多个函数。
- sqrt(x):求平方根。
- pow(a,b):计算a的b次方。
- fabs(x):计算绝对值
1.2 本章学习体会
- 由于开学前有对c语言进行适中的预习跟练习,这使得我在平常课程中并没有不习惯或者听得晕头转向的情况,所以刚开学的课程我会感觉比较的轻松,当然后面的课程毕竟会越来越难,我也会继续不断的预习练习。
- 至于老师的话,我并没有太多的意见跟建议,毕竟大学学习还是主要靠自己。
- 代码量
时间 | 题数 | 代码行数 |
---|---|---|
两周 | 54~60 | 1242~1346 |
2.PTA实验作业
2.1 7-8 念数字
2.1.1 数据处理
数据表达:变量有int类型的num,bit,flag,count,x,y。其中num为输入的整数、bit为整数各个位的数字、flag表示状态,即是否输入第一个拼音、count为计整数位数、x跟y均为在后面代码中来储存杂数。
数据处理:
num:scanf("%d",&num); //输入整数num
count: //由于后续代码须用到num所以不直接使用num进行计位数
x = num;
while (x > 0)
{
x = x / 10;
count++; //计算位数
}
bit: //bit将处于循环语句中,这里先显示主要语句
x = pow(10, count - 1);
bit = num / x;
flag: //先令flag=1,此时执行第一个输出,输出结束后令flag=0,转移到后续第2、3···项的输出
flag=1;
2.1.2 代码截图
2.1.3 本题可扩展功
能
- 由于原代码在对于一个或多个零结尾时比较繁琐,所以既然是读数字,那能不能用字符输入来做呢?因此我改变思路,重新编写了代码,如图:
并且答案也是正确的:
2.1.4 PTA提交列表及说明(此代码为扩展前的代码)
- Q1:对sum取各个位数的代码有部分的缺漏导致运行超时。
- A1:vs进行调试后才发现缺漏,于是补上了相关代码。然而只是部分正确。
- Q2:对于以一个或多个0结尾的调试并不满足答案。
- A2:经调试后发现凡是以0结尾,均不会输出“ling”,于是我通过计算这整数结尾部分0的位数再进行对“ling”的循环输出才解决了问题。当然,在正确的过程中也是不断的调试。
2.2 7-9 龟兔赛跑
2.2.1 数据处理
数据表达:类型为int的变量T储存输入的时间、int rabbitDistance;int TortoiseDistance分别表示兔子的距离跟乌龟的距离、int flag用flag来表示兔子的状态int runTime;int restTime分别表示兔子持续跑的时间以及休息时间。
数据处理:
T:
scanf("%d",&T); //输入时间
int rabbitDistance=0;
int TortoiseDistance=0; //后续做累加,先让初始值为0
flag=1; //令flag=1表示兔子跑的状态
2.2.2 代码截图
2.2.3 本题可扩展功能
- 能不能不用累加的方式,通过找时间跟距离的规律作为判断兔子跟乌龟的根据呢?所以我花了较多的时间,想去找到恰好兔子休息完开始跑时的距离跟乌龟距离相同的时间点,在这个时间段内对时间进行分段分析。分析如下:
其中runover表示兔子10每分钟跑完;restover表示兔子30分钟休息完
时间|兔子|乌龟|两者|距离
--|:--😐:--😐:--😐:--😐--:
0| | |✔|0
10/runover|✔| | |90
30| | |✔|90
40/restover| |✔| |120
45| | |✔|135
50/runover|✔| | |180
60| | |✔|180
80/restover| |✔| |240
90/run| | |✔|270
- 可见当时间到90时两者持平此时兔子将继续跑符合上述的恰好时间点。此时判断T%90的值处于哪个时间段即可判断输赢
- 但是,这种方法对于距离的计算较于繁琐,我并没有深究。
2.2.4 PTA提交列表及说明
- Q1:测试发现时间小于40分钟答案正确,一旦超过就错误,不过也有碰巧的答案。
- A1:通过断点调试,发现当兔子休息时间达30时没有初始为0,导致结果错误。后续补上。
- Q2:补上之后发现数据较小时(0<T<45),答案正确,其余错误。
- A2:调试发现兔子在跑时,当乌龟距离大于兔子,runTime由于在if (runTime == 10 && rabbitDistance > TortoiseDistance)的判断句下没有被初始为0.所以将判断句分割为嵌套句并将runTime=0放在外层。
2.3 7-12 任务06-02-01 于龙遇见日期,又哭了!
2.3.1 数据处理
数据表达:定义类型为int的变量year,month,date来储存年,月,日。int num1,num2,num3;分别表示按顺序输入的三个数,char ch1,ch2;表示两数间的字符。
数据处理:
scanf("%d%c%d%c%d", &num1, &ch1, &num2, &ch2, &num3); //将数字储存在num中
year:
对三个num取最大值将最大值赋值给year。
month与date将在判断句中被赋值。
2.3.2 代码截图
2.2.3 本题可扩展功能
- 原代码采用了大量的if判断语句,所以我项能不能用数组的知识来解决,但由于本人预习不深,只有初步的想法,并不能付诸实践。
2.3.4 PTA提交列表及说明
- Q1:当num2与num3的值均较大时,答案不符合。
- A1:**经调试发现均大于12输出"Invalid Date!"后程序没有停止,所以在后面加上的return 0;语句。
- Q2:当输入的三个数据有两个数据相同时,答案错误。
- A2:通过断点调试,发现赋值语句由于大意打错,更改后答案正确。
3.阅读代码
ACM题库: poj 1664 放苹果
- 代码理解:m个苹果放到n个盘子
- 当m=0时,此时无论多少盘子仅有一种,或当n=1时,无论多少苹果也仅有一种放法。
- 当n>m时,则空下的盘子至少有n-m个,所以此时m放n个与m放m个结果一样。
- 当m>=n时
1.每个盘子均有苹果,此时可表示为m-n个苹果放n个盘子。
2.空一个盘子,此时表示为m-1个苹果放n个盘子。 - 之后每一步均按此循环直到m=0或者n=1,此时返回值为1,即+1。
- 值得学习的地方。
1.此代码采用了递归算法,将复杂的排序简化,从而使得代码简练。
2.学习了如何在函数内的循环 ,更新了我对函数进一步的理解。