zoukankan      html  css  js  c++  java
  • 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
    ");
                   break;
            case 8:
                   printf("B
    ");
                   break;
            case 7:
                   printf("C
    ");
                   break;
            case 6:
                   printf("D
    ");
                   break;
            default:
                   printf("E
    ");
                   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语句中没有加上“&”以及会漏掉“)”或“}”,之后要多加练习养成习惯
      部分正确是因为没有考虑到所有可能的情况,之后也要学会想问题尽可能的全面
  • 相关阅读:
    常用css3属性
    jQuery瀑布流
    jQuery事件对象
    jQuery动画
    面向对象复习
    php 面向对象
    git
    存储数据
    ajax
    对象
  • 原文地址:https://www.cnblogs.com/jmlzh/p/13946331.html
Copyright © 2011-2022 走看看