C博客作业01--分支、顺序结构
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
(1) 输入输出函数:
- printf()函数:输出“ ”里面的内容,如果有%d或者%f则输出%d或者%f对应的内容;%d对应的数据是整型,%f对应的是浮点型,输出的时候要从左到右一 一对应;同时%d或%f可以加宽度限制词,制定数据的输出宽度,比如%4d,则这个数据的输出宽度就是4;%f也是可以如此,而且因为输出的是浮点型,所以%f还可以控制小数点位数,比如%.2f就是保留到小数点后两位,其余的会四舍五入舍去;此外还学到了%c对应的数据是字符型。
- scanf()函数:输入数据读入变量里面;比如scanf("%d",&a),就是把我们输入的一个整型数据读入a这个变量里面;这里%d对应的是整型,还有%lf对应的数据是双精度浮点型,%f对应的数据是单精度浮点型;%c对应的是字符型。如果有多个数据的话,那么它们的类型、个数、位置要一 一对应
- getchar()函数:用法是从键盘输入一个字符,并赋值给一个字符型变量。
- putchar()函数:用法是输出一个字符型常量或者变量。
(2) 数据类型
- 上文我们已经讲到了几个数据类型,那么它们是要怎么来的呢?它们是要定义来的,在一个程序中,所有的变量、标识符都是要定义的;目前我学到了几个C语言数据类型:int(整型);char(字符型);float(单精度浮点型)和double(双精度浮点型)。比如 int a = 3;就是定义一个整型变量a,这里赋给它的值是3。
- 此外我了解到float和double都是浮点型(实型),用于存放浮点数(实数),但它们有区别,区别在于double型数据占用空间更大,精度更高,取值范围更大;所以如果没有题目要求,一般我会用double。
(3)选择结构:
- if else语句,也就是二分支结构,先来看一下它的一般形式:
if(表达式)
{
语句1
}
else
{
语句2
}
这里如果表达式的值为“1”(真)(非0的数其实也可以),则执行语句1,如果表达式的值为“0”(假),则执行语句2,这里的话其实else可以省略,这样的话如果表达式的值是“0”,则什么也不做,继续执行下面的语句。
- if else if语句:其实就是if else语句的升级版,可以有更多的分支,更多种的判断情况,更多路的选择,其一般形式为:
if(表达式1)
{
语句1;
}
else if(表达式2)
{
语句2;
}
...
else
{
语句n;
}
用图来理解比较简单:
- switch语句:switch语句可以处理多分支选择问题,如果在switch语句的每个语句段中都使用break语句,这是switch语句的主要使用方法,一般形式为:
switch(表达式)
{
case 常量表达式1:语句段1;break;
case 常量表达式2:语句段2;break;
case 常量表达式3:语句段3;break;
......
case 常量表达式n:语句段n;break;
default:语句段n+1;break;
switch语句的执行流程如下图,首先求解表达式,如果表达式的值与某个常量表达式的值相等,则执行该常量表达式后的相应语句段,如果表达式的值与任何一个常量表达式的值都不相等,则执行default后面的语句段,最后执行break语句,跳出switch语句。这里需要注意的是“常量表达式”必须是一个常量。
(4)运算优先级:
(5)常用的数学函数:
1.平方根函数sqrt(x):计算x的平方根;
2.绝对值函数fabs(x):计算x的绝对值;
3.幂函数pow(x,n):计算x的n次方;
4.指数函数exp(x):计算e的x次方;
5.对数函数log(x):计算ln(x)。
1.2本章学习体会
- 学习感受:刚学习C语言时,似对世界说:Hello,World!如雨后春笋般在C语言的学习中疯长。上课学习效率不错,当把知识运用到题目完成解题后会很有成就感。在为pta题目努力思考后,我总是会想到老师在旁边的叨语:“C语言不可能看会、听会,只能练会!”这也成了我成为C语言学习者的第一柱里程碑。我对自己充满了信心。
- 代码量:1146行(仅计算pta正确的代码量)
2.PTA实验作业
2.1jmu-c-二进制转10进制
2.1.1数据处理
- 数据表达:
char num;把我们要输入的二进制位数转化成许多字符1或0的合并。(因为后来我发现我们数据的输入超过了int的整型范围)
int digit;digit就是二进制位对应的十进制位,是整型。 - 数据处理:
scanf("%c", &num);
if (num != '1' && num != '0' && num != '\n')
else if (num == '1')
else if (num == '0')
digit = digit * 2 + 0;
2.1.2代码截图
2.1.3 本题可扩展功能:
初看 char num;scanf("%c", &num);好像很奇怪,其实这样是将输入的一串数字转化为一个一个的字符,再一 一用for循环考虑每一位数,这样输入的数字就可以超过int整型范围,又可以每一个数都顾及到,比如输入1111111111111111(16个1),在char的定义下,就可以变成16个‘1’,最后运算各个数字,就可以得到digit。
2.1.4 PTA提交列表及说明:
- 1.PTA测试点“多个1”其实已经超过了int整型范围(百思不得其解,错了好几次,后来询问别人才得知),我用int num;bit=num%10,(拿num的个位数)num=num/10(把num的个位去掉一位)去计算就错了。
- 2.把int改用double以后发现%不能用了,需要寻找新方法新思路。于是就想到了把一串数字变成一串字符的思路。
2.2 7-11 简单计算器:
2.2.1数据处理
- 数据表达:
1.int num;//输入的数值(除了第一个数值给digit了);
2.int digit;//循环结果;
3.char op;//定义运算符号;
4.int flag = 0;判断输入的正误;flag=1则输入错误; - 数据处理::digit = digit + num;
digit = digit - num;
digit = digit * num;
flag = 1;
digit = digit / num;
2.2.2代码截图
2.2.3本题可扩展功能:
考虑有括号运算()可以扩展此功能;
思路就是用if判断op是否是‘(’,是就进入另一个for循环里面在里面运算,直到遇到‘)’则结束运算,同时晚一点判断op是否是+-*/。
2.2.4 PTA提交列表及说明
- 1.一开始把判断op是否是‘=’的判断句放着输入数字的语句的后面,使得\n被读进op里面变成非法运算符。
- 2.除数为0的情况没有考虑,一看题目有思路就疏忽大意,原来题目已经把除数为0的情况给考虑了。
- 3.非法运算符的情况没有考虑
2.3 7-12 任务06-02-01 于龙遇见日期,又哭了!
2.3.1数据处理
- 数据表达:
int num1, num2, num3;输入3个正整数
char char1, char2;2个无关字符
int year, month, day;年,月,日
int optionalDay = 0;某一月的最后一天
int leapyear = 0;//判断闰年
int flag = 0;//判断数据正误 - 数据处理:(看图片就好了,于龙又哭了)
2.3.2代码截图
2.3.3本题可扩展可能:
算了吧,脑阔疼。
2.3.4PTA提交列表及说明:
- 1、毫无思路,头脑空白。
- 2、知道闰年并逐一判断,应该有哪里疏漏了,于是引进leapyear判断。
- 3、只考虑输入值的大小是不够的,还要考虑月份。
- 4、月份与日份的交换。
3.阅读代码
找一份优秀代码,理解代码功能,并讲出你所选代码优点及可以学习地方。