C博客作业01--分支、顺序结构
| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C博客作业00--顺序分支结构 |
| 这个作业的目标 | 初步认识C语法,掌握数据表达、printf、scanf语法及分支结构内容
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
1.1.1 数据类型总结
整数型变量 int 输入 %d 输出 %d 占据4个存储单元
浮点型变量 double 输入 %lf 输出%f 占据8个存储单元
字符型变量 char 输入 %c 输出 %c 占据1个存储单元
1.1.2 逻辑运算符 或|| 且&& 非!
单独使用:
3或4 3||4
3且4 3&&4
非3 !3
组合使用:
3或4且5或7 (3||4)&&(5||7)
3且4或5 (3&&4)||5
1.1.3 顺序结构
顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三部曲的程序就是顺序结构,它的执行顺序是自上而下,依次执行,优点是简洁明了,缺点是功能有限,只能进行单一计算,无法判断再做选择。
例:据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高,请你计算其标准体重应该是多少?
只需写出代码如下即可(include左边有#)
include <stdio.h>
int main()
{
int H;
100<H&&H<=300;
scanf("%d",&H);
printf("%.1f", (H-100)*0.9*2);
return 0;
}
可以看出,本题进行的就是一个简单的输入输出过程,只不过进行了一个表达式计算,并没有涉及条件判断或选择。
1.1.4 分支结构
分支结构就是在顺序结构的基础上再加上一个判断的过程,通过判断选择路径,类似一个岔路口,去往不同地方,达到不同目的。
基础语句 if else/switch case break
单分支
if(条件)
{
分支体
}
双分支
if(条件)
{分支1}
else
{分支2}
多分支(嵌套)
if(条件1) {分支1};
else if(条件2) {分支2}
else if(条件3) {分支3}
……
else if(条件n) {分支n}
else {分支n+1}
需要注意的是,使用分支语句是为了更快地解决问题,很明显,如果分支过多,也使计算变得复杂,所以一般超过3重嵌套之后,使用switch语句
switch语句其实也是多分支语句,不同的是,它的判断条件是确定的值,所有分支都是并列的,它的程序执行时,从第一条开始,如果匹配则继续后面的分支,直到遇到break语句,退出,如果不匹配,则依次查看下一分支是否匹配
if else语句比较典型的例子是计算分段函数:
代码如下:(include左边有#)
include <stdio.h>
include <math.h>
int main()
{
double x,y;
scanf("%lf",&x);
if(x<0){
y=(x+1)*(x+1)+2*x+1/x;
}else{
y=pow(x,0.5);
}
printf("f(%.2f) = %.2f",x,y);
return 0;
}
switch语句例题成绩转换:
我一开始的思路:
通过判断成绩范围,利用if else语句来设计程序
if (score>=90)
{
printf("A");
}
之后通过老师的指导,学会了利用取余和switch语句知识结合在一起设计程序
思路是通过对得分score这一两位整数取余,得到对应的一个10以内的整数,通过switch语句判断,再进入不同的分支
代码如下:(include左边有#)
include <stdio.h>
int main()
{
int score;
scanf("%d",&score);
score/=10;
switch(score){
case 10:
case 9:
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("C\n");
break;
case 6:
printf("D\n");
break;
default:
printf("E\n");
break;
}
return 0;
}
反思:首先,一开始会出现格式错误,令我很疑惑,之后细心检查发现,case与数字之间要有一个空格,这一小细节需要注意;此外,一题可以多解,应当多动脑筋多思考,尝试不同的解题方法;最后,知识间的融合作用,看似无关的知识放在一起也可能发生化学反应,产生效果,拥有某种功能,从而方便程序设计
1.2 编程技巧总结
1.2.1 随机函数
开头要有头文件#<stdlib.h>
伪随机数rand() 因为它是按照指定的顺序来产生整数,因此不算真正意义上的随机数,叫做伪随机数
随机数生成器srand()即随机种子,这个函数可以使程序每次运行时生成一个新序列的随机数值,实现真正意义上的“随机”
1.2.2 取余和取个位
例:
取234除2的余数 就是234%2
对234取个位4 就是234/10
1.2.3 利用数学函数处理问题(要有头文件 #include <math.h>)
数学函数sqrt、pow、fabs、exp、log
sqrt求平方根
pow求幂函数
fabs求绝对值
exp求以e为底的指数函数
log() 求以e为底数的对数函数
例:
sqrt(4) 就是对4开平方,结果是2
pow(2,3)就是计算2的3次方,结果是8
fabs(-8) 就是计算-8的绝对值,结果为8
exp(0) 就是计算e的0次方,结果为1
log(e) 就是计算以e为底数的e的对数,结果为1
1.2.4 做除法要根据除数和被除数的大小来确定精度
例:
2/10 结果是0 因为2不够除10
应该改为 2.0/10 结果就是0.2
1.2.5 利用temp和不用temp实现两个数的交换
用temp:
temp=b;
b=a;
a=temp;
不用temp:
a=a+b;
b=a-b;
a=a-b;
1.3 本章学习体会
*收获:首先,对C语言的理解更进一步,关于格式错误和编译错误等错误的出现也有了经验,知道大概错在哪里,要如何进行修改,不再像刚开始一样,虽然还是挺蒙,但不会那么蒙;其次,学会了数学函数和一些编程小技巧,关于设计程序计算数学题目的问题也更有把握,关于取余、两数交换的知识也更加清晰;最后,对于知识间的融合有了一点理解,看似不相干,实则可以搭配在一起进行使用,更快速地解决问题,针不戳
*不足:代码量不足,需要养成好的编程习惯,理解还太浅薄...其实总而言之是花的时间太少
2.PTA实验作业
2.1 前天是哪天
2.1.1 数据处理
定义年份year、月份month、日期day等为变量
一开始考虑给二月一个单独变量number,因为闰年平年它的天数不同,但最终还是选择不给它设变量,对实验影响不大
2.1.2 我的思路
首先判断年份是否是闰年
是:二月29天 否:二月28天
其次判断日是否大于3
若day>3,月份不变 day = day-3
若day<=3, 则进一步判断月份是大月还是小月,大月则day=31+day-3,小月则30+day-3,闰年三月则day=29+day-3,平年三月则day=28+day-3
还需要注意一月,当month==1,且day<=3, 就令month=12,day=31+day-3
2.1.3 代码如下(include左边有#)
include <stdio.h>
int main()
{
int year, month, day;
scanf("%d-%d-%d", &year, %month, %day);
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
if(day<=3&&(month==3||month==5||month==7||month==8||month==10||month==12))
{
month = month-1;
day = 31+day-1;
}
if (day<=3&&month==1)
{
year=year-1;
month = 12;
day=31+day-3;
}
if(day<=3&&(month==4||month==6||month==9||month==11))
{
month = month-1;
day= 30+day-3;
}
if (day<=3&&month==2)
{
month = month-1;
day= 29+day-3;
}
if (day>3)
{
day=day-3;
}
}
else
{
if(day<=3&&(month==3||month==5||month==7||month==8||month==10||month==12))
{
month = month-1;
day = 31+day-1;
}
if (day<=3&&month==1)
{
year=year-1;
month = 12;
day=31+day-3;
}
if(day<=3&&(month==4||month==6||month==9||month==11))
{
month = month-1;
day= 30+day-3;
}
if (day<=3&&month==2)
{
month = month-1;
day= 28+day-3;
}
if (day>3)
{
day=day-3;
}
}
printf(“%d-%d-%d”, year, month, day);
return 0;
}
反思:就本题而言,我的代码明显不够简洁,比如day<=3这一条件,重复出现多次,如何优化升级C语言的表达,我将通过学习掌握
2.2 计算油费
现在90号汽油6.95元/升、93号汽油7.44元/升、97号汽油7.93元/升。为吸引顾客,某自动加油站推出了“自助服务”和“协助服务”两个服务等级,分别可得到5%和3%的折扣。
本题要求编写程序,根据输入顾客的加油量a,汽油品种b(90、93或97)和服务类型c(m - 自助,e - 协助),计算并输出应付款。
2.2.1 数据处理
定义变量:加油量oil 种类type, 字符型变量:服务类型 service, 浮点型变量:油费 money
2.2.2 我的思路
先判断加的汽油种类,用加油量乘以相应价格得到油费,再判断选择的服务类型,计算优惠后的最终油费
2.2.3 代码如下(include左边有#)
include <stdio.h>
int main()
{
int oil,type;
char service;
double money;
scanf("%d%d %c", &oil, &type, &service);
if(type==90)
{
money=oil*6.95;
}
else if(type==93)
{
money=oil*7.44;
}
else if(type=97)
{
money=oil*7.93;
}
if(service=='m')
{
money=money*0.95;
}
else if(service='e')
{
money=money*0.97;
}
printf("%.2f", money);
return 0;
}
反思:其实这道题目不会难,关键是要理清题意,静下心来分析,不要被文字和数据的“看似复杂”吓倒,再根据题意逐步设计程序即可
2.3 龟兔赛跑
2.3.1 单步调试截图
2.3.2 代码截图
2.3.3 PTA提交列表及说明
- Q1:不懂怎么正确表达兔子跟乌龟的运动过程
- A1:看超星课程,边看边理解,再自己尝试编写程序,若有错误再进行纠正,直到掌握为止
- Q2:编译错误和部分正确
- A2:编译错误是因为最基本的scanf语句中没有加上“&”以及会漏掉“)”或“}”,之后要多加练习养成习惯
部分正确是因为没有考虑到所有可能的情况,之后也要学会想问题尽可能的全面