C博客作业01--分支、顺序结构
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
1.学习数据类型
int整型、double双精度浮点型、float单精度浮点型、char字符型等。
2.学习输入及输出函数的使用
scanf("%d",&n);//输入数据给n
printf("%d",n);//输出d的数据
getchar( )//输入一个字符
putchar( )//输出一个字符
3.学习分支结构
if(a>b)//判断a和b的大小,如果a>b输出a
{
printf("%d",a);
}
if( )//二分支结构
{
}
else
{
}
if( )//多分支结构
{
}
else if( )
{
}
else
{
}
switch( )//多分支结构
{
case( ):
( ) ;
break;
case( ):
( ) ;
break;
default:
( ) ;
break;
}
4.学习循环结构
for(i=1;i<=10;i++)//从1累加到10。
{
sum+=i;
}
i=1;//求1到10的累加和,先判断再循环。
while(i<=10)
{
sum+=i;
i++;
}
i=1;
do//累加1到10,先循环一次再判断。
{
sum+=i;
i++;
}while(i<=10);
5.学习逻辑运算符
- &&逻辑与
- ||逻辑或
- !逻辑非
1.2 本章学习体会
- 由于之前没有接触过c语言,所以开学以来基本以看书和mooc自学为主。
- 对于pta上的题目,难点在于题目本身的复杂度以及要以计算机的计算方式进行思考和设计,和平常的思维有许多不同点。
- 当代码出现错误时,查错的过程就十分麻烦,有时vs测试没问题,而pta却显示答案错误,就造成要花比写代码还多的时间进行差错,甚至有时还找不到错误点。
- 当题目情况复杂多变时,整体的规划思路就需要很清晰,语句结构的使用就复杂多变,科学合理的使用将会使得程序精简易懂。
- 对于打代码来说,打字的速度十分重要,尤其是C语言中出现的许多种符号。
- 这两周的代码量约1800行。
2.PTA实验作业
2.1 题目名1
7-9 龟兔赛跑
2.1.1 数据处理
数据表达:定义整型变量min来读入输入的比赛时间,定义整型变量time来进行比赛中的计时,定义整型变量rabbitMeter和turtleMeter来分别记录兔子和乌龟比赛中所跑的路程,定义整型变量i来进行循环结构。
数据处理:
1.先将变量rabbitMeter、rabbitMeter和time初始化为0。
2.随着time++,rabbitMeter每分钟增加9,turtleMeter每分钟增加3。
3. 每十分钟判断兔子所跑路程是否大于乌龟,如果是则进入步长为30的循环,time不断加1,turtleMeter不断加3,如果比赛时间结束则跳出循环。
4. 判断乌龟和兔子的胜负,输出胜者路程。
2.1.2 代码截图
2.1.3 本题可扩展功能
- 定义浮点型变量使,使比赛时间为小数时也可进行对比。
- 可计算出兔子的平均速度,从而不再用路程对比胜负,而是通过兔子的速度与乌龟的速度进行胜负的区分。
printf("兔子的平均速度:%d",rabbitMeter/min);
- 输出每分钟兔子和乌龟的路程数。
在内外循环加入printf函数输出数据。
2.1.4 PTA提交列表及说明
- Q1:缺少第32行的条件判断,time超过了比赛时间min,导致do while死循环。
- A1:在32行加入条件判断语句如果time==min就跳出循环。
- Q2:当比赛时间为10分钟,即min=10,使time%10==0的条件判断成立,使tinm超过min而进入死循环。
- A2:在20行加入判断time是否等于min,成立则退出循环。
- Q3:当平局时未输出胜者路程,认为没有胜者...
- A3:平局时输出两者中任一路程。
2.2 题目名2
7-12 判断一个三位数是否为水仙花数
2.2.1 数据处理
数据表达:定义4个整型变量number,bit,ten,hundred。
number表示输入的数据,bit为个位数字,ten为十位数字,hundred为百位数字。
数据处理:
1.bit = number % 10;个位通过除10的余数得到。
2.ten = number / 10 % 10;百位通过除10后再除10的余数得到。
3.hundred = number / 100;百位通过除100直接得到。
4.通过if (hundred == 0 || hundred >= 10)判断number是否为3位数。
5.通过if(pow(bit, 3) + pow(ten, 3) + pow(hundred, 3) == number)判断该数是否为水仙花数。
2.2.2 代码截图
2.2.3 本题可扩展功能
- 不仅仅判断一个3位数是否为水仙花数,可拓展至大于3位数的数。
可使用do while循环cnt++记录位数当指数,再循环分出各位上的数bit,判断sum+=pow(bit,cnt)==number是否成立。 - 可输出N位数的所有水仙花数
- 可用函数判断水仙花数,并输出给定区间内的水仙花数
定义两个函数一个判断水仙花数,另一个输出区间内的水仙花谁。
2.2.4 PTA提交列表及说明
- Q1:一开始对十位数字的求法不明白。
- A1:三位数通过除10变成两位数,再通过%10,得到十位数字。
- Q2:第一二个if else if 条件的位置先后错误,导致1000被认为是水仙花数。
- A2:先判断是否为3位数,再判断是否为水仙花数,if else if条件先后十分重要。
2.3 题目名3
7-3 输出三角形面积和周长
2.3.1 数据处理
数据表达:
1.定义整型变量a,b,c分别表示三角形的三条边。
2.定义双精度浮点型变量area用于表示面积,perimeter用于表示周长,s用于表示计算area的辅助变量。
数据处理:
1.输入变量a,b,c。
2.若a<b+c或b<a+c或c<a+b,则三条边可以构成三角形进入area和perimeter运算。
3.s=(a+b+c)/2.0;
area=pow(s*(s-a)*(s-b)*(s-c),0.5);
perimeter=a+b+c;
输出area和perimeter。
6.若不满足上面条件,则三条边不能构成三角形,直接输出"These sides do not correspond to a valid triangle"。
2.3.2 代码截图
2.3.3 本题可扩展功能
- 将a、b、c定义成浮点型变量,可计算边长为小数的三角形。
double a; double b; double c; - 如果输入两边长度和两边的夹角的角度,则可以用公式area=0.5sinAbc来计算三角形面积,perimeter=b+c+sqrt(bb+cc-2bccosA)计算三角形周长
- 类似地,可以通过正余弦定理和已知的边角数据,解三角形得出三角形的周长和面积。
2.3.4 PTA提交列表及说明
(由于在VS调试后复制到PTA所以一条过)
- Q1:逻辑运算符使用错误,三角形成立判断错误。
- A1:将||改成&&,任意两边和大于第三边成立。
- Q2:数据类型错误,错写为s=(a+b+c)/2。
- A2:改为s=(a+b+c)/2.0得到浮点型数据。
3.阅读代码
该代码的功能是在长度为n的数组中找出重复次数超过n/2的数,即寻找数组中的“众数”。
核心思路与做法:
- 该代码运用了一种巧妙的方法——摩尔投票法,即每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。
此方法的核心就是对拼消耗,由于要找的数是数组中最多的,将其与其它数消耗,最后肯定会剩下。 - 大体思路:在代码中额外引入了一个虚拟数组,若虚拟数组为空则加入当前元素。虚拟数组非空,则将当前元素与虚拟数组元素对比,若相同则加入虚拟数组,否则删除这对不同的元素,最后多余的就是数量超n/2的数。
- 具体数据:
1.该代码的数组为[2,2,1,1,1,3,3,1,1,1],开始循环时虚拟数组加入元素2。
2.将其与下个元素2比较,结果相同加入虚拟数组变为[2,2]。
3.与下个元素1比较,结果不同删去2和1,虚拟数组变[2]。
4.与下个元素1比较,结果不同删去2和1,虚拟数组为空。
5.虚拟数组为空,加入下个元素1,虚拟数组变[1]。
6.与下个元素3比较,结果不同删去3和1,虚拟数组为空。
7.虚拟数组为空,加入下个元素3,虚拟数组变[3]。
8.与下个元素1比较,结果不同删去3和1,虚拟数组为空。
9.虚拟数组为空,加入下个元素1,虚拟数组变[1]。
10..与下个元素1比较,结果相同加入1,虚拟数组为[1,1]。
11.循环结束输出结果超n/2的数为1。 - 再回顾一下这个过程,其实就是删除(抵消)了(2,1) 、(2,1)、(1,3)、(3,1)剩下了(1,1)。
此代码优点及可学习之处:
- 此代码巧妙的运用摩尔投票法,将问题形象化,使复杂抽象的问题变的具体。
- 通过不同元素之间的相互抵消,从而留下数量最多的元素。
- 代码中,定义虚拟数组与所求数组进行循环对比十分简洁巧妙。
- 分析问题时,找到合适的思路与方法至关重要,好的方法与思路不仅简洁,而且省时、高效。