C博客作业03--函数
| 这个作业属于哪个班级 |
| ---- | ---- | ---- |
| 这个作业的地址 |
| 这个作业的目标 | 学习如何设计函数、C语言基本数据类型 |
| 姓名 | 黄静 |
0.展示PTA总分
1.本章学习总结
1.1 函数定义、调用、声明
1.1.1 函数定义
函数定义的一般形式:
函数类型 函数名(形式参数表)//函数首部(后面不能加分号)
{
函数实现过程 //函数体
}
如:
void 函数名(参数表)//不返回运算结果的函数定义,其中void不能省略,否则函数类型会被默认定义为int
{
函数实现过程
return;//可以省略return
} //这类函数通常用于屏幕输出等;
1.1.2 函数调用
函数调用的一般形式:
函数名(实际参数表);
如:volume=cylinder(radius,height);
printf("%f",cylinder(radius,height));
if(IsPrime(num)==1)
1.1.3 函数声明
函数声明的一般格式:
函数类型 函数名(参数表);
如:double cylinder(double r,double h);
1.1.4 举例
void ListMenu;//函数说明
int main()
{
ListMenu();//函数调用
}
void ListMenu()//函数定义
{
...
...
}
1.1.5 函数返回
函数返回的一般形式: return 表达式;
如:return 0; return sum; //return语句只能返回一个值
技巧:终止函数,提前结束,可以用return
1.2 全局、局部变量、静态局部变量
1.2.1 全局变量
- 定义:定义在函数外而不属于任何函数的变量
- 作用范围:从定义开始到程序所在文件结束
- 定义位置:只要在函数外部即可,可以定义在程序头部,也可以定义在两个函数中间或尾部(一般情况下放在程序最前面)
1.2.2 局部变量
- 定义:定义在函数内部的变量
- 作用范围:局限于所在的函数内部
- 定义位置:在函数的内部,也允许定义在复合语句内部
1.2.3 全局与局部同名
提示:允许局部变量与全局变量同名,同名时,局部变量优先该函数中全局变量不起作用,由局部变量起作用,对于其它不存在同名变量的函数,全局变量依然有效
1.2.4 静态局部变量
- 定义:存放在静态存储区中,不会因为普通局部变量一样被系统回收,生存周期持续到程序结束
- 特点:存储单元被保留,一旦再次调用,重新被激活,上一次调用后的值仍然保存
- 定义格式:
static 类型名 变量表;//如 static int a = 1;
1.3 C数据类型及注意点
每个数据类型特点及其相关知识的扩展。如浮点误差、字符型数据输入问题等等
1.3.1 数据存储(二进制)
- 原码:符号位是1,其余各位表示数值的绝对值
- 反码:符号位是1,其余各位对原码取反
- 补码:反码加1
如:-1
原码:1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
反码:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
补码:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
知识点:
- 0代表正数,1代表负数
- 正数的原码,反码,补码三者相同
1.3.2 整数的表示
十进制:由正负号,阿拉伯数字0~9组成,首位数字不能是0 如:16
八进制:由正负号,阿拉伯数字0~7组成,首位数字必须是0 如:020
十六进制:由正负号,阿拉伯数字09,英文字符af或A~F组成,首位数字前必须有前缀0x或0X 如:0X10
1.3.3 浮点型
- 浮点表示法:由正号,负号,阿拉伯数字0~9和小数点组成,且小数点的前后至少一边要有数字
- 科学计数法:由正号,负号,数字和字母e(或E)组成,e是指数的标志,e之前要有数据,e之后的指数只能是整数
1.3.4 数据输入与输出
整型数据
数据类型 | 十进制 | 八进制 | 十六进制 |
---|---|---|---|
int | %d | %o | %x |
long | %ld | %lo | %lx |
unsigned | %u | %o | %x |
unsigned long | %lu | %lo | %lx |
浮点型数据 | |||
数据类型 | 格式 | 含义 | |
---- | -- | -- | |
输出 float | %f | 以小数形式输出浮点数(6位小数) | |
输出 double | %e | 以指数形式输出浮点数(小数点前有且仅有一位非零数字) | |
输入 float | %f / %e | 以小数形式或整数形式输入一个单精度浮点数 | |
输入 double | %lf / %le | 以小数形式或整数形式输入一个双精度浮点数 | |
注意:浮点数由于精度原因,会出现误差,可用加上0.000001来解决 |
如:[题目详情] (https://pintia.cn/problem-sets/1325601530091618304/problems/1328185902096871424)
7-2 买U盘(误差修正版) (10分)
IT 协会举办程序设计竞赛,准备购买 U 盘作奖品。请编写程序,根据活动经费和 U 盘单价预估可购买 U 盘的最大数量。
输入格式
活动经费和 U 盘单价
输出格式
可购买 U 盘的最大数量
输入样例
660.8 47.2
输出样例
14
代码如下:
1.4 C运算符
1.4.1 转义字符
字符 | 含义 |
---|---|
\n | 换行 |
\t | 横向跳格 |
|反斜杠 | |
" | 双引号 |
' | 单引号 |
\ddd | 1~3位八进制整数所代表的字符 |
\xhh | 1~2位十六进制整数所代表的字符 |
1.4.2 优先级和结合性
优先级从高到低:
运算符总类 | 运算符 | 结合方向 |
---|---|---|
逻辑运算符 | ! | 从右向左(右结合) |
算数运算符 | ++ -- + - | 从右向左(右结合) |
* / %(双目) | 从左向右(左结合) | |
+ -(单目) | 从左向右(左结合) | |
关系运算符 | < <= > >= | 从左向右(左结合) |
== != | 从左向右(左结合) | |
逻辑运算符 | && | 从左向右(左结合) |
或 | 从左向右(左结合) | |
条件表达式 | ?: | 从右向左(右结合) |
赋值运算符 | = += -= *= /= %= | 从左向右(左结合) |
逗号运算符 | , | 从左向右(左结合) |
1.4.3 复合运算符和关系运算符
复合运算符: += -= *= /= %=
关系运算符: < <= > >= == !=
1.4.4 位运算
按位“与”:&
按位“或”:|
取反:~
按位“异或”:^
左移:<<
右移:>>
应用:
位逻辑运算符
A | B | ~A | A或B | A&B | A^B |
---|---|---|---|---|---|
0 | 0 | 1 | 0 | 0 | 0 |
0 | 1 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 1 | 1 | 0 |
学习体会
从我已写的代码和题目中发现,我写代码时运用函数经常会在运行时没有东西输出,有些题目还没有找到原因,我会继续仔细发现问题所在,还有,位运算逻辑符我觉得比较难,就像上一题二进制取反,我就想不出来,所以,我还需要继续加强对二进制的理解与学习,争取更加熟悉二进制表示,借用课本上的分析和表格了解各种位运算符是怎样改变二进制数的。
2.综合作业:小学生口算表达式自动生成系统
2.1.模块流程图
函数简介
总框架
一年级模块流程图
二年级模块流程图
三年级模块流程图
注意由于小朋友只学过整除,所以我在除法时用两个随机数的乘积除以其中一位随机数,来确保除法能够被整除(在流程图/1/处)
代码如下:
if (op == '/')//如果为除法,用二者乘积num来除以其中的一位数
{
temp = num1;
num1 = num;
num = temp;
}
2.2.函数功能及全局变量介绍
2.2.1 函数功能
我所用的函数就如上方途中所示,具体代码为:(此处列举我所用的函数的函数声明)
void OperateMenu();//游戏操作界面
void GradeOneMenu();//一年级
void GradeTwoMenu();//二年级
void GradeThreeMenu();//三年级
int GetOperands(int grade);//生成随机操作数
char GetOperator(int grade);//生成随机运算符
void PutExpression(int num1, int op, int num2);//输出表达式的函数
int GetAnswer(int num1, char op, int num2);//计算正确函数
void Compliment();//输出夸奖的话
void Encouragement();//输出鼓励的话
2.2.2 全局变量
因为不管是几年级,算什么表达式,都需要合计正确率,所以说,我把做对的题数,做错的题数,总题数作为全局变量
int right = 0;//计算答对的题数
int wrong = 0;//计算答错的题数
int n = 0;//计算答题总数
2.2.3 菜单相关函数
函数功能
- 使用printf显示菜单系统界面,选择年级
函数思路 - 使用switch选择一,二,三年级
函数代码
2.2.2 出题相关函数
- 函数:生成随机操作数,生成随机运算符,输出表达式的函数
函数功能 - 生成随机算术表达式
函数思路
随机操作数:使用rand函数,调用两次产生两个随机数
随机运算符:使用rand函数,产生数字,switch结构把数字改为字符,之后输出,小学一年级只有加减,只需要产生两个随机数,二年级三个随机数,三年级
四个随机数
表达式:将上面产生的元素拼装成表达式输出
函数代码
注意点
* 小学一二三年级没有学习负数,当运算符为减号时,如果前面的数小于后面的数,则二者交换
* 小学三年级还没有学小数,所以当运算符为除法时,我把它改为两个随机数的乘积除以其中一位随机数,确保除法得数一定为整数
* 小学一年级只有一位数加减,小学二年级两位数加减和一位数乘法,小学三年级两位数加减,一位数乘两位数,两位数/三位数 除一位数
2.2.3 结束函数
函数功能
- 在小朋友回答结束后,输出夸奖或鼓励的话
函数思路 - 使用rand输出随机数,每个随机数代表一句语句,从而使输出随机语句
函数代码
2.3 运行结果截图,测试用例
2.4 大作业中编程技巧总结
1:随机数问题
问题:我在一年级加减的时候调用随机函数,有设置随机种子,但每次产生的数字相同,如3-3,2+2
原因:当计算机运行时,时间非常短,以time作为种子数,多次调用randW()函数产生的种子数是一样的,就会出现相同的随机数。
可以看到在主函数中调用两次rand函数后,num1的数据和num2的数据是完全相同的。
解决方法:只要随机种子srand(time(0))运行一次就可以,所以我把srand从随机数函数中移除,移到调用函数之前,所以srand每次只运行一次
2:system("cls");//清屏
3:Sleep(3000);//停留
4:控制除法得数为整数:用两数乘积除其中一位数
5:输出百分号:正确率:%.2f%%(输出为:正确率:100.00%)
6:随机运算符:产生随机数,每个随机数代表一个运算符