C语言博客作业03--函数
| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C博客作业03--函数 |
| 这个作业的目标 | 学习如何设计函数、C语言基本数据类型 |
| 姓名 | 廖浩轩 |
0.展示PTA总分
(7.1和7.5未拿满分,7.1明明是正确的但是不给我通过,7.5应该存在编程问题,暂时没找出来)
1.本章学习总结
1.1 函数定义、调用、声明
函数声明:分为有无返回值两种情况:
1.有返回值时:前面用int float double char 来定义,如int f(int n);
2.无返回值时:前面用void来写在前面,如void f(int n);
函数定义
1.无参函数的定义:如果函数不接收用户传递的数据,那么定义时可以不带参数
例如,定义一个函数,计算从 1 加到 100 的结果:
int sum()
{
int i, sum=0;
for(i=1; i<=100; i++)
{
sum+=i;
}
return sum;
}
2.有参函数的定义:如果函数需要接收用户传递的数据,那么定义时就要带上参数
数据通过参数传递到函数内部进行处理,处理完成以后再通过返回值告知函数外部
例如,计算从 m 加到 n 的结果:
int sum(int m, int n)
{
int i, sum=0;
for(i=m; i<=n; i++)
{
sum+=i;
}
return sum;
}
补充:函数不能嵌套定义
函数调用:没返回值的函数一般直接调用如:f(n); 有返回值的一般语言定义一个变量如c=f(n);
1.2 全局、局部变量、静态局部变量
局部变量:定义在函数内部的变量称为局部变量,它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错
例如:
int f1(int a)
{
int b,c; //a,b,c仅在函数f1()内有效
return a+b+c;
}
int main()
{
int m,n; //m,n仅在函数main()内有效
return 0;
}
全局变量:在所有函数外部定义的变量称为全局变量,它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件
例如:
int a, b; //全局变量
void func1()
{
//TODO:
}
float x,y; //全局变量
int func2()
{
//TODO:
}
int main()
{
//TODO:
return 0;
}
静态局部变量:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,静态局部变量在编译时赋初值,即只赋初值一次。
说明:如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值 0(对 数值型变量)或空字符(对字符变量)
1.3 C数据类型及注意点
数据类型:
1.整型变量
int类型
取值范围(16位):-32768~32767(-2^15— 2^15-1)
转换说明:%d
short int(或简写为short)
取值范围(16位):-32768~32767(-2^15— 2^15-1)
转换说明:%d
-long int(或简写为long)
取值范围(16位):取值范围(16位)-2147483648~2147483648(-2^31— 2^31-1)
转换说明:%ld
unsigned+声明语句表示无符号类型(即非负数)
转换说明:%u (十进制无符号整数 )l和u能一起用(%lu)
2.浮点数
单精度float
取值范围:10^-37 —10^37
转换说明:%f
双精度double
取值范围:(2^63— 2^63-1)
转换说明:%f
注意点:
- 赋值中的类型转换当赋值运算符两边的运算对象类型不同时,将要发生类型转换,转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型
- 一般相关的值与值的数据类型应该要相互对应好,这样一般可以避免范围不够造成的程序数据溢出
- 浮点类型的不能做“模”运算
1.4 C运算符
- 算术运算符
- 一元运算符:+(正号)、-(负号)、++(增1)、--(减1)
- 二元运算符:+(求和)、-(求差)、*(求积)、/(求商)、%(求余)
(一元运算符的优先级一般高于二元运算符)
- 赋值运算符
- 基本赋值
=
- 复合赋值:
+=、-=、*=、/=、%=
a+=b; 等价于 a=a+b;
a-=b; 等价于 a=a-b;
a*=b; 等价于 a=a*b;
a/=b; 等价于 a=a/b;
(由于赋值运算符的优先级很低,仅高于逗号运算符,故最后做赋值操作)
- 逻辑运算符
- 一元:!(逻辑非)
- 二元:&&(逻辑与)、||(逻辑或)
- 关系运算符
- 二元:>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、==(等于)和 !=(不等于)
(在以上 6 种关系运算符中,前 4 个的优先级高于最后两个)
总结
算术、逻辑、关系、赋值运算符的优先级顺序为:
逻辑非 !>算术>关系>逻辑与&&、逻辑或||>赋值=
学习体会
- 函数容易理解但不容易应用,需要进行较多的练习
- 数据类型是比较基础的东西,需要熟记并灵活运用
- 运算符要分清含义和优先级,要做到能准确的使用
2.综合作业:小学生口算表达式自动生成系统
2.1 板块流程图
各年级模块流程图
2.2 函数功能及全局变量介绍
2.2.1 全局变量
int num;//题目数量
int digital1;//随机数1
int digital2;//随机数2
int operators;//随机运算符
int right;//正确答案
int answer;//操作者回答
int temp;//交换数字储存
int reckon = 0;//答对次数
int i = 0;//循环次数
char ch;//判断是否继续答题
double accuracy;//正确率
2.2.2 菜单相关函数
void GradeOneMenu();//一年级界面
void GradeOneMenu()//一年级
{
while (1)
{
system("cls");
printf("*********************一年级小朋友好!********************************\n");
printf("系统将随机生成你希望数量的口算式,如果您会做,则输入y,输入结果。\n");
printf("**如果您不想做,输入n退回主菜单。\n");
printf("***************************************************************\n");
printf("是否继续答题y/n:");
char ch;
scanf("\n%c", &ch);
if (ch == 'n')//返回主菜单
{
Sleep(500);
OperateMenu();
return;
}
else//选择答题
{
printf("输入你想回答的题目数量:");
scanf("%d", &num);
do
{
i++;
printf("是否继续答题,是则输入y,否则输入n:");
scanf("\n%c", &ch);
if (ch == 'n')
{
break;
}
else
{
srand((unsigned)time(NULL));
digital1 = Random_Numbers(1);
digital2 = Random_Numbers(1);
operators = Random_Operators(1);
if (operators == '-' && digital2 > digital1)
{
digital1 = temp;
digital1 = digital2;
digital2 = temp;
}
printf("%d%c%d=?\n", digital1, operators, digital2);
scanf("%d", &answer);
switch (operators)
{
case '+':right = digital1 + digital2; break;
case '-':right = digital1 - digital2; break;
case '*':right = digital1 * digital2; break;
case '/':right = digital1 / digital2; break;
}
if (right == answer)
{
printf("恭喜你回答正确!");
reckon++;
}
else
{
printf("你答错了真可惜,正确答案是:%d,再来一题吧。\n",right);
}
}
} while (i < num);
accuracy = 1.0*reckon / num;
printf("你的正确率是:%.2f", accuracy);
Sleep(2500);
}
}
}
2.2.3 出题相关函数
int Random_Numbers(int grade);//生成随机数
int Random_Numbers(int grade)//生成随机数
{
int digital;
if (grade == 1)
{
digital = 1 + rand() % 9;//生成十以内随机数
}
if (grade == 2)
{
digital = 1 + rand() % 99;//生成一百以内随机数
}
if (grade == 3)
{
digital = 1 + rand() % 999;//生成一千以内随机数
}
return digital;
}
char Random_Operators(int grade);//生成随机运算符
char Random_Operators(int grade)//生成随机运算符
{
char operators;
int digital;
if(grade == 1)
{
digital = 1 + rand() % 1;//生成1到2
}
else
{
digital = 1 + rand() % 3;//生成1到4
}
switch (digital)
{
case 1:operators = '+'; break;
case 2:operators = '-'; break;
case 3:operators = '*'; break;
case 4:operators = '/'; break;
}
return operators;
}
2.3 运行结果截图,测试用例
一年级
二年级
三年级
2.4 大作业中编程技巧总结
- 在编程之前如果操作比较复杂有必要先设计一个流程图,用流程图来整理清楚整个流程
- 对照流程图编程时,要学会运用函数分装,不要都写在main或某一函数中
- 独立功能代码块、重复功能代码块、各种异常情况要单独封装函数处理,让程序的扩展性更强