C语言I博客作业03
作业头
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/CST2020-4 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/CST2020-4/homework/11455 |
这个作业的目标 | 掌握使用for循环语句实现指定次数的循环程序设计,学会阅读代码,挑战这次作业满分 |
学号 | 20209078 |
1.PTA实验作业(15分/题)
1.1 题目1 比较大小
本题要求将输入的任意3个整数从小到大输出。
1.1.1实验代码截图
1.1.2数据处理
数据表达:定义了三个整形变量a,b,c用来输入进行比较的三个数。再定义一个整形变量d来实现值的互换。
数据处理:调用了scanf(),printf(),if语句。
1.1.3 PTA提交列表及说明
说明:
Q1: 一开始用if-else 结构写的,发现答案全错了,编译上没什么问题。
A1:发现else后面不能加条件,于是只好拆成三个if。
Q2:第二处错误(格式):
printf("%d>%d>%d",a,b,c);
A2:改正之后:
printf("%d->%d->%d",a,b,c);
1.2 题目2 计算阶乘和
对于给定的正整数N,需要你计算 S=1!+2!+3!+...+N!
1.2.1 实验代码截图
1.2.2 数据处理
数据表达:用了N,i,a,b四个整形变量,将a,i两个变量重置为1,将b重置为0,通过scanf()的输入得到N进行循环运算。
数据处理:利用for循环实现阶乘的同时进行累加处理。
1.2.3 PTA提交列表及说明
说明:
Q1:一开始用两个for分别写阶乘和累加的,导致部分正确。
A1:仔细一想{}表示的是一个代码块,阶乘的循环所得到的a也许不能放到下一个代码块去,所以我就把阶乘和累加写到一起去了(如1.2.1图)。结果答案正确。
1.3 打印沙漏
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
1.3.1 实验代码截图
1.3.2 数据处理
数据表达:用了N,i,j,k,p,q,m,n,s,count,count1这十一个整形变量和字符型变量c,通过定义,赋值,输入而来。
数据处理:引用char c;来输出字符“*”,利用for循环输出 *,空格,和换行。并引用if-else进行判断输出,用break提前跳出。
1.1.3 PTA提交列表及说明
说明:
刚开始写这道题的时候还刚开始接触C语言,然后C语言群里的学长们扬言:“写出这道题免面试进ACM"。好家伙,当时看到这道题我就想到可能要用循环什么的,结果还真是哈。当时不知怎么就感觉没啥思路的,然后就没写了。这周老师教了循环了,回来看看这题,就试着写了一下。
Q1:这周的第一次大尝试是用for循环输出,然后考虑到要换行和空格,就一股脑地写到一起去了,然后出现了那让人心肺骤停的四个字——编译错误。
A1:经过翻书和百度搜索,才明白要定义一个字符型变量,也就是char c;用来输出“*”,后面整理了一下思路,又重新改了一次。
Q2:第二次大尝试,经过各种小改动终于不是编译错误了。但是出现了一个之前从未遇到过的错误——运行超时。好嘛,按群里之前的说法就是写了死循环,至于怎么改?只能问了啊。
A1:我本来以为要改的话应该挺麻烦的,结果学长就说了一句:你在第一个for末尾加个break;就行。我在后面加了之后提交,诶,还真对了,神奇!之后我就百度了一下break的含义,原来是跳出循环啊。
2.阅读代码(-5——5分)
找一份优秀代码,理解代码功能,并讲出你所选代码有点及可以学习的地方。参考网站:
- ACM解题
- leecode面试数题网站,找简单题目阅读分析。
题目:
原型是一个3D游戏,它允许你控制一个叫Alex的人有很多超级能力完成任务与肠道。亚历克斯有在空中滑翔的能力。更重要的是,他最多可以做3级滑翔,这意味着在他着陆之前,他有两次机会调整和执行另一个滑翔。我们假设每次滑翔时,他的垂直速度变为零,并以新的速度向前滑翔。由于重力,轨道是抛物线。
为了使问题更简单,我们现在只考虑最多2级滑行。第一次滑翔数学方程的二项式系数为a,第二次为-b,即(y - y0) = -ax2, (y - y0) = -b(x - x0)2。如上图所示,Alex从1号楼的顶部滑翔,做一个1层或2层的滑翔,然后正好降落在b点上。而且,在1号楼和b点之间还有一个Building2, Alex必须避免撞到上面。
输入
不超过15例。继续操作,直到文件结束。
每一种情况只包含一行六个实数h1, h2, d1, d2, a, B, h1是Building1的高度,h2是Building2的高度,d1是Building1到Building2的x距离,d2是点B到Building1的x距离。这四个数在[0,1000],满足d1 < d2。a和b在(0,1000)区间。
输出
如果Alex有可能降落在B点,打印Yes,否则打印No。
样例输入
25 1 6 7 11 1
4 3 1 2 1 1
样例输出
YES
YES
HINI
在第二种情况下,Alex只是在建筑物上滑行而没有撞到它。
代码:
#include <cstdio>
#include <cmath>
const double eps=1e-9;
double h1,h2,d1,d2,a,b;
bool check(double x0){
double y;
if(x0<d1){
double y0=h1-a*x0*x0;
y=y0-b*(d1-x0)*(d1-x0);
}
else if(x0-eps>d2) return false;
else y=h1-a*d1*d1;
return y+eps>=h2;
}
int main(){
while(scanf("%lf %lf %lf %lf %lf %lf",&h1,&h2,&d1,&d2,&a,&b)==6){
double A=a+b;
double B=-2.*b*d2;
double C=b*d2*d2-h1;
double det=B*B-4*A*C;
bool ans=false;
if(det+eps>=0){
det=sqrt(fabs(det));
double x1=(-B-det)/(2*A);
double x2=(-B+det)/(2*A);
if(x1+eps>=0.) ans=ans||check(x1);
if(x2+eps>=0.) ans=ans||check(x2);
}
puts(ans?"Yes":"No");
}
return 0;
}
这道题通过阅读代码有以下思路:
摘自牛客网评论
- 通过这道题我看出来了:如果是靠代码解决数学问题,宜先列举数学思路,然后将思路转换为代码。
这个代码对我来说是超纲的,而且这是C++的代码,和C语言不是很相同。
但是它们都具备完整性。如主函数main()是整个代码的主体。然后程序的结构都相似。
值得学习的地方:
这个代码是ACM竞赛中一道题的答案,具有专业性和简约性,我们可以通过例如int a=0;来简化int a;a=0;来缩短代码行数。通过多个if来简化if-else结构,避免代码冗长。
3.学习总结(15分)
3.1 学习进度条(5分)
周/日期 | 这周所花的时间 | 代码行 | 学到的知识点简介 | 目前比较迷惑的问题 |
---|---|---|---|---|
10/12——10/18 | 40h | 581 | printf(),scanf()的用法,if-else的用法 | 为什么只有VS需要用scanf_s(),别的编译器甚至视作错误代码 |
10/19——10/23 | 33h | 617 | for循环 | for循环的原理 |
10/24——10/25 | 13h | 262 | do...while循环 | 运用方式 |
10/26——11/1 | 15h | 458 | 自定义函数 | 没学会 |
11/2——11/8 | 19h | 144 | pow(),sqrt()函数 | 如何不感冒如何止咳(bushi)如何自定义函数 |
3.2 累积代码行和博客字数(5分)
时间 | 博客字数(字符) | 代码行数 |
---|---|---|
第一周 | 1951 | 879 |
第二周 | 1994 | 458 |
第三周 | 6917 | 144 |
3.3 学习感悟(5分)
请回顾自己的本周的学习过程,如果你有新的想法或者新的方法,请及时记录下来。
感悟:第三周的学习,我们学习了for的循环。个人建议课堂的作业可以加点时间,不然着实很赶。
学习过程的总结:
- 1.作业越来越多,像这个博客园作业真的花了我很长时间。
- 2.注意身体不能感冒,我第二周和第三周的代码行数少这么多大部分都是因为感冒眼睛疼然后没打代码。
- 3.老师开学就说过干计算机这行自学是必须的,所以我都会选择向后面预习。遇到不会的、难懂的我就会上百度搜索,问别人,争取弄懂它。