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语句中没有加上“&”以及会漏掉“)”或“}”,之后要多加练习养成习惯
    部分正确是因为没有考虑到所有可能的情况,之后也要学会想问题尽可能的全面
posted @ 2020-11-08 22:48  走去干饭  阅读(202)  评论(0编辑  收藏  举报