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:随机运算符:产生随机数,每个随机数代表一个运算符

2.4 代码提交

posted @ 2020-11-30 19:03  栀夏~  阅读(312)  评论(2编辑  收藏  举报