这个作业属于哪个班级 | C语言--网络2011/2012 |
---|---|
这个作业的地址 | C博客作业03--函数 |
这个作业的目标 | 学习如何设计函数、C语言基本数据类型 |
姓名 | 汪月月 |
0.展示PTA总分
1.本章学习总结
1.1 函数定义、调用、声明
定义
函数类型 函数名(形参类型 形参变量,...)
{
函数内容;
}
- 函数类型即返回值类型,例如int double,不需要返回值时则用void。
- 函数名尽量用驼峰命名法,除非指定函数名。
- 形参与实参:函数定义的是形参,传给函数的是实参,将实参的值传给形参,类型要相同。
- 如果需要返回值,记得return。
int numberSum(int n)
{
int i,sum = 0;
for (i = 1; i <= n; i++)//1--n求和
{
sum += i;
}
return sum;//返回求和结果
}
调用
变量=函数名(实参);
如果没有返回值就不需要等于变量。
声明
使用函数时要对其进行声明,才能更好使用。
在main函数前面对其进行声明
函数类型 函数名(形参类型 形参变量,...);
最后的分号不要忘记。
1.2 全局变量、局部变量、静态局部变量
- 作用区域
- 全局变量:作用于整个程序
- 局部变量作用于本函数
- 存储区
- 全局变量和静态局部变量在静态存储区
- 局部变量在栈中
- 作用时间
- 全局变量和静态局部变量分配一次内存,一直都在
- 局部变量只在使用函数时会出现
- 初始值
- 全局变量和静态局部变量为0
- 初值不定
1.3 C数据类型及注意点
类型转换
- 从int转换为float时, 不会发生溢出,但可能有效数字被舍入。
- 从int或float转换为double时, 因为double的有效位数更多,故能保留精确值。
- 从float 或double转换为int时,因为int没有小数部分且表示范围更小,故可能发生溢出。将大的浮点数转换为整数可能会导致程序错误。
char-->short-->int-->unsighed int-->long-->unsighed long-->double<--float
double型相除
double型变量相除时,需要先转换成二进制,计算后再转化为十进制,因为存在小数,所以转化为十进制时,存在误差,
导致整除结果不准确,可以加上0.000001保证数据正确性。
1.4 C运算符
1. 赋值运算符
= ,+= ,-= ,*= ,/= ,%=
只有初始化后才能使用
2. 算术运算符
/ ,- ,+ ,* ,% ,++ ,--
a++为后增运算,++a为前增运算,最后结果都是a加了1.
不同的是,将其赋给某个变量时进行的操作不同。
3. 关系运算符
== ,< ,> ,<= ,>= ,!=
尤其注意==,不要少写
4. 逻辑运算符
&& ,|| ,!
5. 三元运算符
例如:int max=a>b?a:b;
判断a和b的值,如果a>b成立就让max=a,否则max=b;
6. 位运算
优先级
!> 算术运算符>关系运算符>&&>||>赋值运算符
2.小学生口算表达式自动生成系统
2.1模块流程图
2.2函数功能及全局变量介绍
void OperateMenu();//游戏操作界面
void GradeOneMenu();//一年级
void GradeTwoMenu();//二年级
void GradeThreeMenu();//三年级
int operandsNumber(int grade);//生成操作数函数
char opera(int grade);//生成随机运算符函数
int ComputerResult(int numberOne, int numberTwo, char b);//计算结果函数
void Correct();//回答正确函数
void Incorrect();//回答错误函数
列举一个年级的例子
#include"HeadfileCalculation.h"
void GradeThreeMenu()//三年级
{
while (1)
{
system("cls");
printf("*********************三年级小朋友好!********************************
");
printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。
");
printf("**如果您不想做,输入n退回主菜单。
");
printf("***************************************************************
");
int value1, value2;
int UserNumber, ComputerNumber;
char opre;
char ch;
value1 = operandsNumber(3);/*生成操作数*/
value2 = operandsNumber(3);/*生成操作数*/
opre = opera(3 );/*生成随机运算符*/
while (opre == '-' && value1 < value2)//结果不能是负数
{
value2 = operandsNumber(3);
}
while (value1 % value2 != 0)//判断整除
{
value2 = operandsNumber(3);
}
printf("%d %c %d =
", value1, opre, value2);//输出表达式
printf("是否继续答题y/n:");
scanf("
%c", &ch);
if (ch == 'n')
{
Sleep(1000);
OperateMenu();
return;
}
else//选择答题
{
printf("请输入你的答案:
");
scanf("%d", &UserNumber);//用户计算的结果
ComputerNumber = ComputerResult(value1, value2, opre);//计算机的结果
if (UserNumber == ComputerNumber)
{
Correct();//正确提示
Sleep(1000);
}
else
{
Incorrect();//错误提示
Sleep(1000);
}
}
}
}
其他功能函数
#include"HeadfileCalculation.h"
int ComputerResult(int numberOne, int numberTwo, char b)//计算结果函数
{
int result = numberOne;
if (b == '+') { result = result + numberTwo; }
if (b == '-') { result = result - numberTwo; }
if (b == '*') { result = result * numberTwo; }
if (b == '/') { result = result / numberTwo; }
return result;
}
void Correct()//正确提示函数
{
switch (rand() % 4)
{
case 0:
printf("你太棒了!
");
break;
case 1:
printf("恭喜你答对了!
");
break;
case 2:
printf("你太强了!
");
break;
case 3:
printf("继续保持好成绩!
");
break;
}
}
void Incorrect()//错误提示函数
{
switch (rand() % 4)
{
case 0:
printf("答错了,继续努力!
");
break;
case 1:
printf("别灰心,继续加油!
");
break;
case 2:
printf("再接再厉!
");
break;
case 3:
printf("再试一次!
");
break;
}
}
int operandsNumber(int grade)//生成操作数
{
int num;
switch (grade)
{
case 1:
num = 1 + rand() % 9;
break;
case 2:
num = 1 + rand() % 99;
break;
case 3:
num = 1 + rand() % 999;
break;
}
return num;
}
char opera(int grade)//生成随机运算符函数
{
int selt;
char op;
if (grade == 1)
{
selt = rand() % 2;
}
if(grade==2||grade==3)
{
selt = rand() % 2+2;
}
switch (selt)
{
case 0:
op = '+';
break;
case 1:
op = '-';
break;
case 2:
op = '*';
break;
case 3:
op = '/';
break;
}
return op;
}
2.3运行结果截图,测试用例
将代码分装
2.4大作业中编程技巧总结
- 分装函数
将使用多次的函数分装成函数,更方便简洁 - 注释
有注释能更加清楚的知道每一部分的作用 - 多文件编程
将不同作用的函数分到不同文件中,使得主函数更加简洁