C博客作业01--分支、顺序结构

0.展示PTA总分

  • 顺序结构

  • 分支结构

1.本章学习总结

1.1 学习内容总结

1.学习简单的三个数按顺序排列。

#include<stdio.h>
int main()
{
int num1,num2,num3;    //定义3个基本整型变量来存放三个数num1、num2、num3
int n;             //定义第4变量来进行之后的数字交换处理

    scanf("%d%d%d",&num1,&num2,&num3);    //输入任意3个数

    if(num1>num2)    //如果num1大于num2,借助中间变量n实现num1与num2值的互换
    {
        n = num1;
        num1 = num2;
        num2 = n;
    }
    if(num1>num3)    //如果num1大于num3,借助中间变景n实现num1与num3值的互换
    {
        n = num1;
        num1 = num3;
        num3 = n;
    }
    if(num2>num3)    //如果num2大于num3,借助中间变量n实现num2与num3值的互换
    {
        n = num2;
        num2 = num3;
        num3 = n;
    }
    printf("%d %d %d",num1,num2,num3);    //输出函数顺序输出num1、num2、num3的值
return 0;
}

2.学习了随机数函数。

#include<stdio.h>
#include<stdlib.h>              //随机数必备
#include<time.h>              //随机数必备
int main()
{
int number;
srand(time(0));             //生成不同随机种子
number = rand()%100;         //生成随机数赋值给number (%100表示随机数的范围是0~99)
printf("%d",number);
return 0;
}

3.学习了while、for语句的简单运用以及字符型变量的简单应用。

while( )           //当条件不满足括号内表达式时停止循环
{

                   //循环语句

}

for(  ;   ;  )       //第一个空开始循环时执行一次,总共执行一次,第二个空为判断条件是否成立,第三个空当循环语句执行完后进行。
{

                      //循环语句

}

char a,b;             //定义字符型变量a,b
a=getchar();         //输入一个字符
/*或*/
scanf("%c",&b);        //同是输入一个字符

putchar(a);             //输出字符a
/*或*/
printf("%c",b);          //输出字符b

4.多个函数。

  • sqrt(x):求平方根。
  • pow(a,b):计算a的b次方。
  • fabs(x):计算绝对值

1.2 本章学习体会

  • 由于开学前有对c语言进行适中的预习跟练习,这使得我在平常课程中并没有不习惯或者听得晕头转向的情况,所以刚开学的课程我会感觉比较的轻松,当然后面的课程毕竟会越来越难,我也会继续不断的预习练习。
  • 至于老师的话,我并没有太多的意见跟建议,毕竟大学学习还是主要靠自己。
  • 代码量
时间 题数 代码行数
两周 54~60 1242~1346

2.PTA实验作业

2.1 7-8 念数字

2.1.1 数据处理

数据表达:变量有int类型的num,bit,flag,count,x,y。其中num为输入的整数、bit为整数各个位的数字、flag表示状态,即是否输入第一个拼音、count为计整数位数、x跟y均为在后面代码中来储存杂数。
数据处理:
num:scanf("%d",&num);                    //输入整数num

count:                    //由于后续代码须用到num所以不直接使用num进行计位数
x = num;							
while (x > 0)
    {
	x = x / 10;
	count++;                    //计算位数
    }

bit:                    //bit将处于循环语句中,这里先显示主要语句
x = pow(10, count - 1);
bit = num / x;

flag:                    //先令flag=1,此时执行第一个输出,输出结束后令flag=0,转移到后续第2、3···项的输出
flag=1;                                               

2.1.2 代码截图


2.1.3 本题可扩展功

  • 由于原代码在对于一个或多个零结尾时比较繁琐,所以既然是读数字,那能不能用字符输入来做呢?因此我改变思路,重新编写了代码,如图

并且答案也是正确的

2.1.4 PTA提交列表及说明(此代码为扩展前的代码)

  • Q1:对sum取各个位数的代码有部分的缺漏导致运行超时。
  • A1:vs进行调试后才发现缺漏,于是补上了相关代码。然而只是部分正确。
  • Q2:对于以一个或多个0结尾的调试并不满足答案。
  • A2:经调试后发现凡是以0结尾,均不会输出“ling”,于是我通过计算这整数结尾部分0的位数再进行对“ling”的循环输出才解决了问题。当然,在正确的过程中也是不断的调试。

2.2 7-9 龟兔赛跑

2.2.1 数据处理

数据表达:类型为int的变量T储存输入的时间、int rabbitDistance;int TortoiseDistance分别表示兔子的距离跟乌龟的距离、int flag用flag来表示兔子的状态int runTime;int restTime分别表示兔子持续跑的时间以及休息时间。
数据处理:
T:
scanf("%d",&T);                    //输入时间

int rabbitDistance=0;
int TortoiseDistance=0;                    //后续做累加,先让初始值为0

flag=1;                    //令flag=1表示兔子跑的状态

2.2.2 代码截图


2.2.3 本题可扩展功能

  • 能不能不用累加的方式,通过找时间跟距离的规律作为判断兔子跟乌龟的根据呢?所以我花了较多的时间,想去找到恰好兔子休息完开始跑时的距离跟乌龟距离相同的时间点,在这个时间段内对时间进行分段分析。分析如下:
    其中runover表示兔子10每分钟跑完;restover表示兔子30分钟休息完

时间|兔子|乌龟|两者|距离
--|:--😐:--😐:--😐:--😐--:
0| | |✔|0
10/runover|✔| | |90
30| | |✔|90
40/restover| |✔| |120
45| | |✔|135
50/runover|✔| | |180
60| | |✔|180
80/restover| |✔| |240
90/run| | |✔|270

  • 可见当时间到90时两者持平此时兔子将继续跑符合上述的恰好时间点。此时判断T%90的值处于哪个时间段即可判断输赢
  • 但是,这种方法对于距离的计算较于繁琐,我并没有深究。

2.2.4 PTA提交列表及说明

  • Q1:测试发现时间小于40分钟答案正确,一旦超过就错误,不过也有碰巧的答案。
  • A1:通过断点调试,发现当兔子休息时间达30时没有初始为0,导致结果错误。后续补上。
  • Q2:补上之后发现数据较小时(0<T<45),答案正确,其余错误。
  • A2:调试发现兔子在跑时,当乌龟距离大于兔子,runTime由于在if (runTime == 10 && rabbitDistance > TortoiseDistance)的判断句下没有被初始为0.所以将判断句分割为嵌套句并将runTime=0放在外层。

2.3 7-12 任务06-02-01 于龙遇见日期,又哭了!

2.3.1 数据处理

数据表达:定义类型为int的变量year,month,date来储存年,月,日。int num1,num2,num3;分别表示按顺序输入的三个数,char ch1,ch2;表示两数间的字符。
数据处理:

scanf("%d%c%d%c%d", &num1, &ch1, &num2, &ch2, &num3);            //将数字储存在num中

year:
对三个num取最大值将最大值赋值给year。

month与date将在判断句中被赋值。

2.3.2 代码截图



2.2.3 本题可扩展功能

  • 原代码采用了大量的if判断语句,所以我项能不能用数组的知识来解决,但由于本人预习不深,只有初步的想法,并不能付诸实践。

2.3.4 PTA提交列表及说明

  • Q1:当num2与num3的值均较大时,答案不符合。
  • A1:**经调试发现均大于12输出"Invalid Date!"后程序没有停止,所以在后面加上的return 0;语句。
  • Q2:当输入的三个数据有两个数据相同时,答案错误。
  • A2:通过断点调试,发现赋值语句由于大意打错,更改后答案正确。

3.阅读代码

ACM题库: poj 1664 放苹果


  • 代码理解:m个苹果放到n个盘子
    • 当m=0时,此时无论多少盘子仅有一种,或当n=1时,无论多少苹果也仅有一种放法。
    • 当n>m时,则空下的盘子至少有n-m个,所以此时m放n个与m放m个结果一样。
    • 当m>=n时
      1.每个盘子均有苹果,此时可表示为m-n个苹果放n个盘子。
      2.空一个盘子,此时表示为m-1个苹果放n个盘子。
    • 之后每一步均按此循环直到m=0或者n=1,此时返回值为1,即+1。
  • 值得学习的地方。
    1.此代码采用了递归算法,将复杂的排序简化,从而使得代码简练。
    2.学习了如何在函数内的循环 ,更新了我对函数进一步的理解。
posted @ 2019-10-05 20:15  1911-黄荣煌  阅读(404)  评论(2编辑  收藏  举报