C博客作业03--函数
| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C博客作业03--函数 |
| 这个作业的目标 | 学习如何设计函数、C语言基本数据类型 |
| 姓名 | 曹卉潼 |
0.展示PTA总分
1.0本章学习总结
1.1 函数定义、调用、声明
1.函数的定义
函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数两种。比如scanf()、printf()等为库函数,由C语言系统提供定义,编程时直接调用即可;而某些需要用户自己定义,属于自定义函数。
函数定义的一般形式为:
函数类型 函数名(形式参数表)/*函数首部*/ //形参表不能写成 double x,y;函数首部后面不能加分号
{
函数实现过程 /*函数体*/ //用于计算、完成特定工作,并用return返回运算的结果
}
2.函数的调用
函数调用的一般形式为:
函数名(实际参数表)
函数的形参必须是变量,用于接收实参传递过来的值;而实参可以是常量、变量或表达式,其作用是把常量、变量、或表达式的值传递给形参。
参数的传递是单向的,只允许实参把值复制给形参,形参的值即使在函数中改变了,也不会反过来影响实参。
3.函数原型声明
如果自定义函数放在主调函数后面,需要在函数调用前加上函数原型声明。
函数声明的一般格式为:
函数类型 函数名(参数表);//函数声明是一条C语句,要加分号
1.2 全局、局部变量、静态局部变量
1.全局变量
定义在函数外面而不属于任何函数的变量称为全局变量。作用范围是从函数定义到程序所在文件的结束,他对作用范围内所有的函数都起作用。
一般吧全局变量定义在程序的最前面且可以和局部变量同名
2.局部变量
定义在函数内部的变量称为局部变量
3.静态局部变量
静态变量定义格式:
static 类型名 变量表
静态变量赋初值只在函数第一次调用时起作用,若没有赋初值,系统将自动赋0,静态变量只能用于所定义函数,而不能用于其他函数。
1.3 C数据类型及注意点
-
基本数据类型:
-
强转类型转换:
使用强制类型转换运算符可以将一个表达式转换成给定的类型,一般形式是:
(类型名) 表达式;
强制转换是运算符不是函数,(int)x不能写成int(x)
1.4 C运算符
- 算数运算符
用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。 - 关系运算符
用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。 - 逻辑运算符
用于逻辑运算。包括与(&&)、或(||)、非(!)三种。 - 位操作运算符
参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。 - 赋值运算符
用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。 - 指针运算符
用于取内容(*)和取地址(&)二种运算。 - 求字节数运算符
用于计算数据类型所占的字节数(sizeof)。 - 特殊运算符
有括号(),下标[],成员(→,.)等几种。 - 双目运算符
2.综合作业:小学生口算表达式自动生成系统
2.1.模块流程图
2.2.函数功能及全局变量介绍
void OperateMenu();//游戏操作界面
void GradeOneMenu();//一年级
void GradeTwoMenu();//二年级
void GradeThreeMenu();//三年级
int GetValue(int grade);//生成随机操作数函数
char GetSign(int grade);//生成随机运算符函数
2.2.1.全局变量
2.2.2 菜单相关函数
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
void OperateMenu();//游戏操作界面
void GradeOneMenu();//一年级
int GetValue(int grade);
int GetSign(int grade);
int main(void)
{
OperateMenu();//游戏操作界面
return 0;
}
void OperateMenu()//游戏操作界面
{
char option;
int i;
int temp;
system("cls");//清屏
do
{
system("cls");
printf("******************************************\n");
printf("1.一年级口算\n");
printf("2.二年级口算\n");
printf("3.三年级口算\n");
printf("4.退出系统\n");
printf("******************************************\n");
printf("请输入您的选择:");
scanf(" %c", &option);
switch (option)
{
//输出菜单
case '1':
system("cls");
GradeOneMenu();
//GradeOneMenu();
break;
case '2':
break;
case '3':
break;
case '4':
printf("\n谢谢您的参与!\n");
Sleep(500);
exit(0);
default:
printf("您输入不对,只能输入1,2,3,4,请重输!\n");
Sleep(500);
}
} while (!(option >= '1' && option <= '4'));
}
2.2.2 出题相关函数
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("输入你想做的题数:");
int cnt;//要做的题目数量
int i;
double rightPercentage;//正确率
int value1, value2;
char sign;
int answer, realAnswer;
int rightcnt = 0;
int temp;
scanf("%d", &cnt);
for (i = 1; i <= cnt; i++)//连续输出算式
{
value1 = GetValue(1);//1.生成操作数函数
value2 = GetValue(1);
sign = GetSign(1);//2.生成随机运算符函数
if (value1 < value2)
{
temp = value1;value1 = value2;value2 = temp;
}
printf("%d%c%d= ", value1, sign, value2);//4.生成表达式
scanf("%d", &answer);
switch (sign)
{
case '+': realAnswer = value1 + value2;//计算正确答案
case '-': realAnswer = value2 - value2;
}
if (realAnswer == answer)//判断用户的计算结果
{
rightcnt++;//正确题目数量
printf("算对了!");
}
else
{
printf("算错了-_- 答案是:%d", realAnswer);//用户算错时输出正确答案
}
printf("\n");
Sleep(2000);
}
rightPercentage=rightcnt*1.0/count;
Printf("你的正确率是:%.0lf",rightPercentage);
Sleep(1000);
}
}
}
}
void GradeTwoMenu()//二年级
{
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("输入你想做的题数:");
int cnt;//要做的题目数量
int i;
double rightPercentage;//正确率
int value1, value2;
char sign;
int answer, realAnswer;
int rightcnt = 0;
int temp;
scanf("%d", &cnt);
for (i = 1; i <= cnt; i++)//连续输出算式
{
sign = GetSign(1);//2.生成随机运算符函数
if (sign == '*')
{
value1 = GetValue(1);
value= GetValue(1);
}
else if (sign == '/')
{
value2 = GetValue(1);
value1 = GetValue(1) * value2;
}
else
{
value1 = GetValue(2);
value2 = GetValue(2);
}
if (value1 < value2)
{
temp = value1;value1 = value2;value2 = temp;
}
printf("%d%c%d= ", value1, sign, value2);//4.生成表达式
scanf("%d", &answer);
switch (sign)
{
case '+': realAnswer = value1 + value2; break;
case '-': realAnswer = value2 - value2; break;
case '*': realAnswer = value1 * value2; break;
case '/': realAnswer = value1 / value2; break;
}
if (realAnswer == answer)
{
rightcnt++;
printf("算对了!");
}
else
{
printf("算错了-_- 答案是:%d", realAnswer);
}
printf("\n");
Sleep(2000);
}
rightPercentage=rightcnt*1.0/count;
Printf("你的正确率是:%.0lf",rightPercentage);
Sleep(1000);
}
}
}
void GradeThreeMenu();//三年级
void GradeThreeMenu()//三年级
{
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("输入你想做的题数:");
int cnt;//要做的题目数量
int i;
double rightPercentage;//正确率
int value1, value2;
char sign;
int answer, realAnswer;
int rightcnt = 0;
int temp;
scanf("%d", &cnt);
for (i = 1; i <= cnt; i++)//连续输出算式
{
value1 = GetValue(3);//1.生成操作数函数
value2 = GetValue(3);
sign = GetSign(2);//2.生成随机运算符函数
if (sign == '/')
{
Value2 = Getvalue(3);
Value1 = Getvalue(2) * Value2;
}
else
{
Value1 = Getvalue(2);
Value2 = Getvalue(2);
}
if (value1 < value2)
{
temp = value1;value1 = value2;value2 = temp;
}
printf("%d%c%d= ", value1, sign, value2);//4.生成表达式
scanf("%d", &answer);
switch (sign)
{
case '+': realAnswer = value1 + value2; break;
case '-': realAnswer = value2 - value2; break;
case '*': realAnswer = value1 * value2; break;
case '/': realAnswer = value1 / value2; break;
}
if (realAnswer == answer)
{
rightcnt++;
printf("算对了!");
}
else
{
printf("算错了-_- 答案是:%d", realAnswer);
}
printf("\n");
Sleep(2000);
}
rightPercentage=rightcnt*1.0/count;
Printf("你的正确率是:%.0lf",rightPercentage);
Sleep(1000);
}
}
}
1.先对用户询问是否想继续答题,若不想退到主菜单
2.让用户输入题目数量然后连续输出算式,因为涉及到减法且一二年级没有学习负数的运算,三年级没有学习小数运算,
所以当第一个数<第二个数时将二者交换位置以实现在正数范围内的运算
3.让计算机算出正确答案与用户的答案进行比较,记录答题情况,算错时输出正确答案
4.题目全部答完后计算正确率
int GetValue(int grade)//1.生成操作数函数
{
int value;
value = 1 + rand() % 9;//10以内
value = 1 + rand() % 99;//两位数以内
value = 1 + rand() % 999;//三位数以内
return value;
}
char GetSign(int grade)//2.生成随机运算符函数
{
char sign;
int value = 0;
switch (grade)
{
case 1:value = rand() % 2; break;//一二年级只做加减运算
case 2:value = rand() % 4; break;//三年级四种运算都可以做
}
switch (value)
{
case 0:sign = '+'; break;
case 1:sign = '-'; break;
case 2:sign = '*'; break;
case 3:sign = '/'; break;
}
return sign;
}
2.3.运行结果截图,测试用例
2.4.大作业中编程技巧总结
使用随机种子以实现随机数和随机运算符的生成
用开关语句可以控制四种运算符使代码看起来简洁明了,可读性高