我の第四篇博客
| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C博客作业03--函数 |
| 这个作业的目标 | 学习如何设计函数、C语言基本数据类型 |
| 姓名 | 付峻霖 |
0.展示PTA总分
1.本章学习总结
1.1 函数定义、调用、声明
⭐ 语法
#include<stdio.h>
int main()
{
{
void printstar(); //对printstar函数声明
void print_message(); //对print_message函数声明
printstar(); //调用printstar函数
print_message(); //调用print_message函数
printstar(); //调用printstar函数
}
}
void printstar() //定义printstar函数
{
printf("***************\n");
}
void print_message() //定义print_message函数
{
printf("Hello World!\n");
}
⭐ 案例:使用函数求素数和
案例其实非常多,说白了函数调用,就是把原本的复杂问题简单化,把需要做的几件事情,分别放在几个区域去做,看起来比较友好。
1.2 全局、局部变量、静态局部变量
⭐ 全局变量:具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。
⭐ 局部变量:也只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期
间存在,函数的一次调用结束后,变量就被撤销,其所占用的内存也被收回。
⭐ 静态变量:会被放在程序的静态数据存储区里,这样可以在下一次调用的时候还可以保持原来的赋值。
1.3 C数据类型及注意点
名称 | 类别名 | 转换说明 | 特点 |
---|---|---|---|
[有符号]整型 | int | %d十进制,%x15进制,%X16进制数,%o八进制 | 有正负 |
[无符号]整型 | unsigned | %u | 只有正 |
字符型 | char | %c | 字符要用单引号 |
单精度浮点型 | float | %lf | 有浮点误差 |
双精度浮点型 | double | %f | 有浮点误差 |
⭐ 浮点误差如何解决呢? | |||
如果是一个非常接近整数的值,13.999999这类的话,加上一个0.000001就可以解决。 | |||
而且浮点数判断是否相等,也不能直接(i == 10.0),而应该是(i - 10.0 <= 0.000001) | |||
⭐ 为何int类型只能到2的31次方呢? | |||
那是因为最高位的1和0用来定义正负号了 | |||
⭐ unsigned的作用就是将数字类型无符号化 | |||
例如 int 型的范围:-2^31 ~ 2^31 - 1,而unsigned int的范围:0 ~ 2^32。 |
1.4 C运算符
⭐1. 取余左右两边操作数必须是整数,如5%3
⭐2. 单目双目中的目指的是操作数个数
⭐3. 运算符的优先级和结合性
案例:a+=a-=a*a;
结合性:所有赋值运算符都是从右往左结合。
优先级:先乘除后加减
//因此可以把上面的表达式拆分成以下两个表达式
//1.a=a-a*a
//2.a=a+a
⭐4. 强制类型转换
#include<stdio.h>
int main()
{
printf("整型输出:%d\n", 1 + (int)2.0);//强制类型转换, int(2.0)
printf("浮点数输出:%f\n", 1 + 2.0); //强制转换成浮点数
}
2.综合作业:小学生口算表达式自动生成系统
2.1.模块流程图
⭐一年级流程图
⭐二年级流程图
⭐三年级流程图
2.2.函数功能及全局变量介绍
2.2.1.全局变量
变量名,作用
char a;//是否要继续做题的字符
int sum;//总答题数量
int conserve;//用于保存expression返回的值
static int amount = 0;//答题总数
int right = 0; //答对的题目数量
int wrong = 0; //答错的题目数量
2.2.2 菜单相关函数
函数功能、思路
⭐从游戏界面进入答题系统
void OperateMenu();//游戏操作界面
int GradeOneMenu();//一年级答题系统
int GradeTwoMenu();//二年级答题系统
int GradeThreeMenu();//三年级答题系统
函数代码
1.游戏操作界面
void OperateMenu()//游戏操作界面
{
char option;
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': //难度二年级
system("cls");
GradeTwoMenu();
break;
case '3': //难度三年级
system("cls");
GradeThreeMenu();
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.一年级答题系统
int GradeOneMenu() //一年级答题系统
{
int oneright = 0; //一年级题目正确个数
int onewrong = 0; //一年级题目错误个数
while (1)
{
system("cls");
printf("*********************一年级小朋友好!********************************\n");
printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。\n");
printf("**如果您不想做,输入n退回主菜单。\n");
printf("***************************************************************\n");
/*1.生成操作数函数*/
/*2.生成随机运算符函数*/
/*3.根据年级判断生成的表达式是否合理的函数(选做)*/
/*4.生成表达式函数,并输出展示*/
printf("请输入你的答题的数量:");
scanf("%d", &sum); //输入答题数量
for (amount = 0; amount < sum; amount++)//题目循环
{
conserve = OneExpression();//保存返回值
if (conserve == 1)//如果返回值为1
{
right++; //正确数+1
oneright++;//总正确数+1
}
else
{
wrong++; //错误数+1
onewrong++;//总错误数+1
}
if (amount < sum - 1)
{
Sleep(500);
printf("是否要继续做题?输入n即可退出答题,按下回车可继续\n");
getchar();
scanf("%c", &a);
if (a == 'n')
{
system("cls");
printf("************************\n");
printf(" 小朋友你好!\n");
printf("你在本次游戏中一共答了%d题\n", amount + 1);
printf("本次游戏答对了%d题\n本次游戏答错了%d题\n", oneright, onewrong);
printf("本次游戏您的正确率为%.2f\n", oneright * 1.0 / (amount + 1));//正确率
printf("\n 累积答对了%d题\n 累积答错了%d题\n", right, wrong);
printf(" 累积正确率为%.2f\n", right * 1.0 / (right + wrong));
printf("************************\n");
Sleep(1000);
printf("再输入n可返回操作界面噢~\n");
getchar();
if (getchar() == 'n')//如果为n
{
OperateMenu();//则返回操作界面
}
}
else
{
continue; //如果不为n,则继续答题
}
}
}
system("cls");
printf("************************\n");
printf(" 小朋友你好!\n");
printf("你在本次游戏中一共答了%d题\n", amount);
printf("本次游戏答对了%d题\n本次游戏答错了%d题\n", oneright, onewrong);
printf("本次游戏您的正确率为%.2f\n", oneright * 1.0 / amount);//正确率
printf("\n 累积答对了%d题\n 累积答错了%d题\n", right, wrong);
printf(" 累积正确率为%.2f\n", right * 1.0 / (right + wrong));
printf("************************\n");
Sleep(1000);
printf("输入n可返回操作界面噢~\n");
getchar();
if (getchar() == 'n')
{
OperateMenu();
}
}
}
3.二年级答题系统
int GradeTwoMenu() //二年级答题系统
{
int tworight = 0; //二年级题目正确个数
int twowrong = 0; //二年级题目错误个数
while (1)
{
system("cls");
printf("*********************二年级小朋友好!********************************\n");
printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。\n");
printf("**如果您不想做,输入n退回主菜单。\n");
printf("***************************************************************\n");
/*1.生成操作数函数*/
/*2.生成随机运算符函数*/
/*3.根据年级判断生成的表达式是否合理的函数(选做)*/
/*4.生成表达式函数,并输出展示*/
printf("请输入你的答题的数量:");
scanf("%d", &sum); //输入答题数量
for (amount = 0; amount < sum; amount++) //题目循环
{
conserve = TwoExpression();//保存返回值
if (conserve == 1)//返回值为1
{
right++; //正确数+1
tworight++;//则总正确数+1
}
else //返回值为0
{
wrong++; //则错误数+1
twowrong++;//则总错误数+1
}
if (amount < sum - 1) //打印是否继续答题?
{
Sleep(500);
printf("是否要继续做题?输入n即可退出答题,按下回车可继续\n");
getchar();
scanf("%c", &a);
if (a == 'n')//如果为n,则结束答题
{
system("cls");
printf("************************\n");
printf(" 小朋友你好!\n");
printf("你在本次游戏中一共答了%d题\n", amount + 1);
printf("本次游戏答对了%d题\n本次游戏答错了%d题\n", tworight, twowrong);
printf("本次游戏您的正确率为%.2f\n", tworight * 1.0 / (amount + 1));//正确率
printf("\n 累积答对了%d题\n 累积答错了%d题\n", right, wrong);
printf(" 累积正确率为%.2f\n", right * 1.0 / (right + wrong));
printf("************************\n");
Sleep(1000);
printf("再输入n可返回操作界面噢~\n");
getchar();
if (getchar() == 'n')//如果为n
{
OperateMenu();///则返回操作界面
}
}
else
{
continue; //如果不为n,则继续答题
}
}
}
system("cls");
printf("************************\n");
printf(" 小朋友你好!\n");
printf("你在本次游戏中一共答了%d题\n", amount);
printf("本次游戏答对了%d题\n本次游戏答错了%d题\n", tworight, twowrong);
printf("本次游戏您的正确率为%.2f\n", tworight * 1.0 / amount);//正确率
printf("\n 累积答对了%d题\n 累积答错了%d题\n", right, wrong);
printf(" 累积正确率为%.2f\n", right * 1.0 / (right + wrong));
printf("************************\n");
Sleep(1000);
printf("输入n可返回操作界面噢~\n");
getchar();
if (getchar() == 'n')//如果为n
{
OperateMenu();//则返回操作界面
}
}
}
4.三年级答题系统
int GradeThreeMenu() //三年级答题系统
{
int threeright = 0; //三年级题目正确个数
int threewrong = 0; //三年级题目错误个数
while (1)
{
system("cls");
printf("*********************三年级大朋友好!********************************\n");
printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。\n");
printf("**如果您不想做,输入n退回主菜单。\n");
printf("***************************************************************\n");
/*1.生成操作数函数*/
/*2.生成随机运算符函数*/
/*3.根据年级判断生成的表达式是否合理的函数(选做)*/
/*4.生成表达式函数,并输出展示*/
printf("请输入你的答题的数量:");
scanf("%d", &sum); //输入答题数量
for (amount = 0; amount < sum; amount++) //题目循环
{
conserve = ThreeExpression();//保存返回值
if (conserve == 1) //返回值为1
{
right++; //正确数+1
threeright++;//总正确数+1
}
else //返回值为0
{
wrong++; //错误数+1
threewrong++;//总错误数+1
}
if (amount < sum - 1)
{
Sleep(500);
printf("是否要继续做题?输入n即可退出答题,按下回车可继续\n");
getchar(); //吸收回车
scanf("%c", &a);
if (a == 'n')//如果是n,则结束答题
{
system("cls");
printf("************************\n");
printf(" 小朋友你好!\n");
printf("你在本次游戏中一共答了%d题\n", amount + 1);
printf("本次游戏答对了%d题\n本次游戏答错了%d题\n", threeright, threewrong);
printf("本次游戏您的正确率为%.2f\n", threeright * 1.0 / (amount + 1));//正确率
printf("\n 累积答对了%d题\n 累积答错了%d题\n", right, wrong);
printf(" 累积正确率为%.2f\n", right * 1.0 / (right + wrong));
printf("************************\n");
Sleep(1000);
printf("再输入n可返回操作界面噢~\n");
getchar();
if (getchar() == 'n')//如果是n,则返回操作界面
{
OperateMenu();
}
}
else
{
continue;//如果不是n,则继续答题
}
}
}
system("cls");
printf("************************\n");
printf(" 小朋友你好!\n");
printf("你在本次游戏中一共答了%d题\n", amount);
printf("本次游戏答对了%d题\n本次游戏答错了%d题\n", threeright, threewrong);
printf("本次游戏您的正确率为%.2f\n", threeright * 1.0 / amount);//正确率
printf("\n 累积答对了%d题\n 累积答错了%d题\n", right, wrong);
printf(" 累积正确率为%.2f\n", right * 1.0 / (right + wrong));
printf("************************\n");
Sleep(1000);
printf("输入n可返回操作界面噢~\n");
getchar();
if (getchar() == 'n')
{
OperateMenu();//如果是n,则返回操作界面
}
}
}
2.2.2 出题相关函数
函数功能、思路
⭐从答题系统中调用随机表达式和鼓励的话
void WrongRand();//回答错误鼓励的话
void RightRand();//回答正确鼓励的话
int OneExpression();//一年级随机表达式
int TwoExpression();//二年级随机表达式
int ThreeExpression();//三年级随机表达式
int TwoDivision();//二年级除法
int ThreeDivision();//三年级除法
函数代码
1.回答错误鼓励的话
void WrongRand()//回答错误的鼓励
{
int language = rand() % 5 + 1;//鼓励的语言
switch (language)
{
case 1:
{
printf("答错了噢,别气馁!\n");
break;
}
case 2:
{
printf("答错啦,是不是马虎了呢?\n");
break;
}
case 3:
{
printf("你答错了,不要灰心,再接再厉噢~\n");
break;
}
case 4:
{
printf("答错啦,未曾失败的人恐怕也未曾成功过。\n");
break;
}
case 5:
{
printf("答错啦,失败是成功的mother~\n");
break;
}
}
}
2.回答正确鼓励的话
void RightRand()//回答正确的鼓励
{
int language = rand() % 3 + 1;//鼓励的语言
switch (language)
{
case 1:
{
printf("答对啦,你真棒!继续加油鸭~\n");
break;
}
case 2:
{
printf("答对啦,不要骄傲噢~\n");
break;
}
case 3:
{
printf("答对啦,但成功只是一个过程,并不是一个结果。继续加油噢~\n");
break;
}
}
}
3.一年级随机表达式
int OneExpression()//一年级随机生成表达式
{
int num1, num2; //两随机数
int result; //真正的答案
int userresult; //小学生输入的答案
srand(time(0));
num1 = 1 + rand() % 9;//十以内的随机数
num2 = 1 + rand() % 9;//十以内的随机数
char ch;
int num = 1 + rand() % 2;//生成1到2的随机数 分别代表加减
int swap;
if (num1 < num2)//交换数字
{
swap = num1; num1 = num2; num2 = swap;
}
printf("请回答下面的问题,打出你认为的结果。\n");
switch (num) //随机加减
{
case 1:
ch = '+'; printf("%d%c%d=", num1, ch, num2);
result = num1 + num2;//答案
break;
case 2:
ch = '-'; printf("%d%c%d=", num1, ch, num2);
result = num1 - num2;//答案
break;
}
scanf("%d", &userresult);
if (userresult != result)//如果不相等,那么鼓励一下
{
printf("正确答案为%d\n", result);
WrongRand();//答错了,不要气馁
return 0;
}
else //如果相等,也鼓励一下
{
RightRand();//答对了,鼓励一下
return 1;
}
}
4.二年级随机表达式
int TwoExpression()//二年级随机生成表达式
{
int num1, num2; //两随机数
int Result; //真正的答案
int UserResult; //小学生输入的答案
srand(time(0));
num1 = 1 + rand() % 20;//1到20的随机数
num2 = 1 + rand() % 20;//1到20的随机数
char ch;
int num = 1 + rand() % 4;//生成1到4的随机数 分别代表加减乘除
int swap;
if (num1 < num2)//交换数字
{
swap = num1; num1 = num2; num2 = swap;
}
printf("请回答下面的问题,打出你认为的结果。\n");
switch (num) //随机加减乘除
{
case 1:
ch = '+'; printf("%d%c%d=", num1, ch, num2);
Result = num1 + num2;//答案
break;
case 2:
ch = '-'; printf("%d%c%d=", num1, ch, num2);
Result = num1 - num2;//答案
break;
case 3:
ch = '*'; printf("%d%c%d=", num1, ch, num2);
Result = num1 * num2;//答案
break;
case 4:
ch = '/';
/*printf("%d%c%d=", num1, ch, num2);*/
Result = TwoDivision();//答案
break;
}
scanf("%d", &UserResult);
if (UserResult != Result)//如果不相等,那么鼓励一下
{
printf("正确答案为%d\n", Result);
WrongRand();//答错了,不要气馁
return 0;
}
else //如果相等,也鼓励一下
{
RightRand();//答对了,鼓励一下
return 1;
}
}
5.三年级随机表达式
int ThreeExpression()//三年级随机表达式
{
int num1, num2; //两随机数
int result; //真正的答案
int userresult; //小学生输入的答案
srand(time(0));
num1 = 1 + rand() % 30;//30以内的随机数
num2 = 1 + rand() % 30;//30以内的随机数
char ch;
int num = 1 + rand() % 4;//生成1到4的随机数 分别代表加减乘除
int swap;
if (num1 < num2)//交换数字
{
swap = num1; num1 = num2; num2 = swap;
}
printf("请回答下面的问题,打出你认为的结果。\n");
switch (num) //随机加减乘除
{
case 1:
ch = '+'; printf("%d%c%d=", num1, ch, num2);
result = num1 + num2;//答案
break;
case 2:
ch = '-'; printf("%d%c%d=", num1, ch, num2);
result = num1 - num2;//答案
break;
case 3:
ch = '*'; printf("%d%c%d=", num1, ch, num2);
result = num1 * num2;//答案
break;
case 4:
ch = '/';
/*printf("%d%c%d=", num1, ch, num2);*/
result = ThreeDivision();//答案
break;
}
scanf("%d", &userresult);
if (userresult != result)//如果不相等,那么鼓励一下
{
printf("正确答案为%d\n", result);
WrongRand();//答错了,不要气馁
return 0;
}
else //如果相等,也鼓励一下
{
RightRand();//答对了,鼓励一下
return 1;
}
}
6.二年级除法
int TwoDivision() // 二年级除法
{
int num3;
int num4;
do
{
num3 = rand() % 15 + 1;//随机数
num4 = rand() % 5 + 1;//随机数
if (num3 % num4 == 0)//需要整除
{
printf("%d/%d=", num3, num4);
}
} while (num3 % num4 != 0);
int num5 = num3 / num4;
return num5;
}
7.三年级除法
int ThreeDivision() // 三年级除法
{
int num3;
int num4;
do
{
num3 = rand() % 40 + 1;//随机数
num4 = rand() % 5 + 1;//随机数
if (num3 % num4 == 0)//需要整除
{
printf("%d/%d=", num3, num4);
}
} while (num3 % num4 != 0);
int num5 = num3 / num4;
return num5;
}
2.3.运行结果截图,测试用例
2.4.大作业中编程技巧总结
总结大作业编程中用到哪些课堂没有学过知识点
- 学会了用system("cls")清屏,使界面更简洁
- 学会了Sleep(数字)来延迟界面,(数字)为暂缓的时间
- 遇到大工程的时候,不能盲目直接去敲代码,而是要先用流程图构思好,然后把用户的需求分成好几个点,分别去写。