0.展示PTA总分
![](https://img2018.cnblogs.com/blog/1772649/201910/1772649-20191005230152204-2059577986.png ''顺序'')
![](https://img2018.cnblogs.com/blog/1772649/201910/1772649-20191005230352627-437890695.png ''分支'')
1.本章学习总结
1.1 学习内容总结
1.运算符需注意的要点
- '/'的左右两边如果均为整型数,其结果也为整型;‘%’的左右两边只能为整型数;
- 优先级:逻辑运算符<关系运算符(判断是否相等的运算符比其他的关系运算符低)<算术运算符。
2.数据类型及其输入输出
-
数据类型:
- int(整型):输入时调用scanf()函数,格式控制说明为%d;输出时调用printf()函数,格式控制说明为%d;
- char(字符型):调用函数scanf()和printf()来输入输出字符,格式控制说明均为%c; 或者可以用getchar()来输入函数(一次只能读入一个字符),一般调用格式为:
ch=getchar()
,用putchar来输出函数(一次只能输出一个字符),一般调用格式为:putchar=(ch)
。 - float(单精度浮点型):调用函数scanf()和printf()来输入输出浮点数,格式控制说明均为%f;
- double(双精度浮点型):输入时调用scanf()函数,格式控制说明为%lf;输出时调用printf()函数,格式控制说明为%f;
- double和float的区别:
- 字节:float为4,double为8;
- 有效位数:float为8,double为16;
- 处理速度:float比double快;
- 数值范围:float:[-3.40E+38,+3.40E+38];double:[-1.79E+308,+1.79E+308]。
-
printf()函数的输出格式注意:
- 关于浮点数保留n位小数:printf("%.nf",x);
- 关于整数输出n位数,不够n位的往左补零:printf("%0nd",x);
- 指定整型的数据输出宽度为n(包括符号位),若实际位数小于n,往左(右)补空格,若大于等于n则按实际位数输出:printf("(-)%nd",x)。
3.常用数学函数(使用时需要加上头文件‘#include <math.h>’)
- 平方根函数sqrt(x):计算(sqrt{x});
- 绝对值函数fabs(x)和abs(x):计算|x|;
- 幂函数pow(x,n):计算(x^n);
- 指数函数exp(x):计算(e^x);
- 以e为底的对数函数log(x):计算lnx。
- 以上函数除了abs(x)的定义格式是整型的,其他都是double型的。
4.for语句
- 一般形式为:
for(表达式1;表达式2;表达式3)
循环体语句
5.分支结构
- 二分支结构:if else语句;
- 多分支语句:switch 语句、else if语句、嵌套的if-else语句;
- 三种语句的比较:else if语句和switch语句的逻辑结构比if else的嵌套语句更清晰,if else嵌套语句需要注意if和else的配套使用,容易出错,且运行效率较低;else if语句和switch
语句相比,switch语句的运行效率更高,但是switch的缺点是其表达式和常量表达式只能是字符型或者整型,而else if语句的表达式也可以是浮点型;
- 三种语句的比较:else if语句和switch语句的逻辑结构比if else的嵌套语句更清晰,if else嵌套语句需要注意if和else的配套使用,容易出错,且运行效率较低;else if语句和switch
6.课堂拓展:
随机数:
#include <stdio.h>
#include <stdlib.h> //是存放rand()和srand()的头文件;
#include <time.h> //是存放time(0)的头文件;
int main()
{
srand(time(0)); //生成随机种子,产生不同随机数,time(0)是返回从1970年1月1日0时0分0秒到目前为止经过的时间,单位为秒,这边用来初始化srand的起始值;
int x=rand()%100; //生成范围为[1,99]的随机数;
printf("%d",x)"
return 0;
}
1.2 本章学习体会
- 即使暑假有提前接触C语言,可是感觉学起来还是有点吃力,意识到是课后没有总结到位,无法融汇贯通,已经买好了笔记本,希望以后课后把笔记和需要注意的地方记在本子上;
- 在刷pta时感觉到逻辑思维方面还是不够好,经常思维紊乱。但是在刷题的过程中,逐渐开始找到一种乐趣,卡了很久的题目突然写出来的那一刻的开心喜悦是无法用言语来形容的!!
- 这两周的代码量为1126(距自己定的目标还差274行)代码练习还是不够!!
2.PTA实验作业
2.1计算天数 (15 分)
2.1.1 数据处理
- 数据表达:
- int year; 储存年份;
- int month;储存月份;
- int day;储存日期;
- int all;储存总天数;
- 数据处理:
运用了else if语句,将每一个月的天数自己累加起来;用月份来进行判断应该进入哪个分支。先按不是闰年的计算,最后判断是否为闰年和是否为闰年过2月再决定是否加1;
2.1.2 代码截图
2.1.3 本题可扩展功能
可以用switch语句合理运用break,可以简便很多运算,提高运行效率。
2.1.4 PTA提交列表及说明
- Q1:编译错误
- A1:这就是不用编译器写代码的下场....
- Q2:不知道判如何断闰年
- A2:闰年就是能被4整除不被100整除和能被400整除的数;
- Q1:什么时候要加1;
- A2:年份为闰年而且要过2月.
2.2简单计算器 (20 分)
2.2.1 数据处理
- 数据表达:
- int number; 储存用户输入的数;
- int all = 0; 储存计算结果;
- char symbol; 储存用户输入的运算符;
- int judge = 1; 判断是否要输出结果,为1时输出结果,为0时则不输出;
- 数据处理:
- 首先读入一个数字和一个运算符,先进入whlie循环;
- 根据用户输入的运算符进入switch语句进行选择运算;
- 如果中途遇到用户输入错误,对judge进行改值,在最后判断judge的值来决定要不要输出结果;
2.2.2 代码截图
2.2.3 本题可扩展功能
要求考虑四则运算符的优先级 (感觉这样拓展有点变态)
2.2.4 PTA提交列表及说明
- Q1:要如何避免用户输入错误时输出all的结果?
- A1:设置变量judge=1,在用户输入错误时改变judge的值,最后在输出all的结果时判断一下judge的值来决定是否输出all;
2.3任务06-02-01 于龙遇见日期,又哭了! (10 分)
2.3.1 数据处理
- 数据表达:
- int X; 储存用户输入的第一个数;
- int Y; 储存用户输入的第二个数;
- int Z; 储存用户输入的第三个数;
- char symbol1; 读取用户输入的第一个字符;
- char symbol2; 读取用户输入的第二个字符
- int year; 储存年份;
- int month; 储存月份;
- int day; 储存日期;
- 数据处理:
先判断X,Y,Z的值是否都大于12,如果是,则数据不合法。再判断X,Y,Z中最大的数,赋值给year。比较剩下两个数,如果有一个大于12,则赋值给日期,如果没有则按顺序赋值给月份,日期。再按month的值来判断,day是否超过天数;
2.3.2 代码截图
2.3.3 本题可扩展功能
对于我现在的水平来说,这已经是一道很优秀的题目了。(太难了我QAQ)
2.3.4 PTA提交列表及说明
- Q1:刚开始测试点12@12#12一直运行错误
- A1:在刚开始对X,Y,Z大小判断时,没有考虑到相等的情况,加上等号后就可以了;
- Q2:日期不合法的测试点过不了;
- A2: 只考虑到X,Y,Z大于31不合法,其实应该是三个数都大于12就不合法了,如果是大于31,某些测试点例如13.14.15就过不了;
3.阅读代码
- 3.1功能
- 对间谍输入的字符,按第一行输入的行列数进行螺旋输出,然后每个字符-7,得到间谍的信息;
- 3.2思路
- 用数组char a[20] [20]来保存字符,设置变量isRow,改变其命题的真假来进入输出数组某一行或者某一列列的分支;设置变量isOrder,改变其命题的真假来进入要正序输出数据的某一行(列),还是倒序输出。再利用循环遍历输出数组。
- 3.2优点
1.运用二维数组保存各个字符,不需要申请多个变量储存字符,减少了代码量;
2.巧妙设置两个变量isRow和isOrder,每进行完一次循环就对其命题进行取反,以此进入不同分支来输出字符;
3.用一个循环条件while (scanf("%d %d", &r, &c), r && c)
来判断用户输入的r和c是否正确,以此来判断是否进入循环,如果输入错误则不进入循环直接退出程序,如果直接用scanf()函数来输入,用户输入错误时,程序依旧会运行,可能导致程序崩溃;