1. 本章学习总结
1.1 思维导图
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
这几周学习了函数,题目还是原样只是多了种做题的方法。一开始看书感觉声明,定义啊,还有全局变量那些,文绉绉的,都看不太下去,还不如直接做题。但是在做课堂派时,发现没有看书除了简答题填不出来,连选择题都可能会做错。可能实践都需要理论支撑吧。几周学习下来觉得掌握的还是可以,可以分得清不同变量的作用范围和生存周期,函数返回值该如何设定,函数该如何设计。
1.2.2 代码累计
2. PTA总分
2.1 截图PTA中函数题目集的排名得分
2.2 我的总分:145
3. PTA实验作业
3.1 PTA题目1
6-8 使用函数验证哥德巴赫猜想
哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。
其中函数prime当用户传入参数p为素数时返回1,否则返回0;
函数Goldbach按照格式“n=p+q”输出n的素数分解,其中p≤q均为素数。
又因为这样的分解不唯一(例如24可以分解为5+19,还可以分解为7+17),要求必须输出所有解中p最小的解。
3.1.1 算法分析
- 判断素数函数
- if p<2
- 返回0
- else
- 定义i
- for i=2 to i<p do
- if p%i==0 then
- 返回0
- end if
-返回1
- if p%i==0 then
- end for
- 输出哥德巴赫数函数
- 定义i
- for i=2 to i<=n/2 do
- if prime(i)&&prime(n-i) then
- 输出 n=i+(n-i)
- break
- end if
- if prime(i)&&prime(n-i) then
- end for
3.1.2 代码截图
3.1.3 测试数据
测试数据1
测试数据2
测试数据3
3.1.4 PTA提交列表及说明
Q1:编译错误???
A1:觉得编译错误实在很不应该,在dev试过在copy过去都能错误掉,,,
Q2:部分正确
A2:一开始没有用break结束if语句导致连一个数有多种方法输出和题目要求不符,后来加了个break,就可以了
4.大作业
4.1函数关系图
4.2.函数功能介绍
1.函数1
void Screen();
int Menu(int n);
功能:生成界面让整个游戏看起来友好,比较有体验感
void Screen()
{
printf("----------------------------------------------\n");
printf(" 欢迎来到我们的游戏 ^_^ \n");
printf(" 输入1进来游戏菜单,输入0退出游戏 \n");
}
int Menu(int n)
{
scanf("%d",&n);
while(n!=0&&n!=1)
{
printf("操作错误哦,重新再输入吧\n");
scanf("%d",&n);
}//让输入是0或1
if(n==1)
{
printf(" 菜单 \n");
printf(" 1.等级1:1位数的一步加减乘除计算 \n");
printf(" 2.等级2:2位数的2步加减运算 \n");
printf(" 3.等级3:3位数的2步加减运算 \n");
printf(" 清选择等级进入游戏吧 \n");
}
else
{
printf("希望你玩得愉快,下次再来哦");
exit(0);
}
}
2.函数2
void LevelChoose();
void TitieNumber(int n);
功能:等级选择,然后这个等级选择将会是后续游戏的起点,并且在选择等级后让用户输入想做的题数
void LevelChoose()
{
scanf("%d",&level);
while(level!=1&&level!=2&&level!=3)
{
printf("你选择的等级不在我们的范围内,清重新输入哦\n");
scanf("%d",&level);
}//确保选择的等级在范围内
TitieNumber(level);//调用TitieNumber函数,实参为level传入到该函数中作为输出
}
void TitieNumber(int n)
{
printf("欢迎来到%d级的游戏,清选择想做的题目数量:\n",n);
scanf("%d",&number);
}
函数3
void Number();
void Operation();
功能:利用srand()函数随机生成数字,运算符,来组成算式供给用户做题,并且各个等级不同
void Number()
{
switch(level)
{
case 1:
srand(time(NULL));
num1=rand()%10;
num2=rand()%10;
break;
case 2:
srand(time(NULL));
num1=rand()%100;
num2=rand()%100;
num3=rand()%100;
break;
case 3:
srand(time(NULL));
num1=rand()%1000;
num2=rand()%1000;
num3=rand()%1000;
break;
}
}
void Operation()
{
int operation_1,operation_2;
srand(time(NULL));
operation_1=rand()%4;
operation_2=rand()%2;
if(level==1)
{
switch(operation_1)
{
case 0:ch1='+';break;
case 1:ch1='-';break;
case 2:ch1='*';break;
case 3:ch1='/';break;
}
}
else
{
switch(operation_2)
{
case 0:ch2='+';ch3='+';break;
case 1:ch2='-';ch3='-';break;
}
}
}
函数4
void GameBegin();
double Gameresult();
功能:游戏开始了,根据选择的等级随机生成题目,并且调用Gameresult()函数来判断对错,并且统计正确和错误题数
void GameBegin()
{
int response;
if(level==1)
{
printf("你的题目是%.0f %c %.0f =\n",num1,ch1,num2);
}
else if(level==2)
{
printf("你的题目是%.0f %c %.0f %c %.0f =\n",num1,ch2,num2,ch3,num3);
}
else
{
printf("你的题目是%.0f %c %.0f %c %.0f =\n",num1,ch2,num2,ch3,num3);
}
scanf("%d",&response);
if(response-Gameresult()<0.00001)//调用Gameresult()函数来判断对错
{
printf("太棒了,你做对啦\n\n");
printf("你还想继续做题吗?是的话选1,不继续按任意键哦\n\n");
right++;
}
else
{
printf("啊哦,做错了呢\n\n");
printf("正确答案是%d\n\n",Gameresult());
printf("别气馁,再来一题吗?是的话选1,不继续按任意键哦\n\n");
wrong++;
}
int n;
scanf("%d",&n);
printf("\n");
if(n!=1) //如果用户想提前退出按任意键即可
{
printf("希望你玩得愉快,下次再来哦");
exit(0);
}
if(right+wrong>number)//如果用户做的题数超过了一开始输入的题数给出提示语
{
printf("你的做题数目到了呢\n");
Accuracy();
exit(0);
}
}
double Gameresult()
{
double result;
switch(ch1)//j一级难度的一步运算i
{
case '+':result=num1+num2;break;
case '-':result=num1-num2;break;
case '*':result=num1*num2;break;
case '/':result=num1/num2;break;
}
switch(ch2)//二,三级难度的两步运算
{
case '+':result=num1+num2;break;
case '-':result=num1-num2;break;
}
switch(ch3)
{
case '+':result=result+num3;break;
case '-':result=result-num3;break;
}
return result;
}
函数4
void Accuracy();
功能:根据之前统计的正确题数和错误题数计算正确率,正确率大于百分之75才输出正确率
void Accuracy()
{
if(right/(right+wrong)>0.75)
{
printf("你的正确率有%d%%呢\n欢迎下次再来玩游戏呀\n",100*right/(right+wrong));
}
else
{
printf("你的正确率有点低啊,不过没关系,多加练习\n");
}
}
4.3 运行结果截图
测试结果1
测试结果2
测试结果3
测试结果4
4.4 调试碰到问题及解决办法
Q1:一开始值的传递想用函数调用,没有想到全局变量,然后整个代码的思路都乱七八糟的
A1:在大佬的提醒下,想到了还可以用全局变量,就不用函数调用来传值了
Q2:在随机产生运算符这里愣了一下
A2:想用数组解决来着,但是运算符也不多,于是用来switch
Q3:在测试数据时,发现除法像5/2这种情况就会出错,因为一开始定义的随机数都是int型
A3:于是把它们都改成了double型,并且在判断是否正确时,让它们的误差在一定范围里是正确的
4.5 大作业总结
- 我的编写过程
- 先输出个界面让整个游戏比较友好
- 进入主题,选择等级,随机得到算式
- 然后判断用户输入的数是否正确
- 这是大概的思路,然后在函数里面完善各个分支
- 遇到的问题
- 值的传递卡住了,后来用了全局变量
- 代码量一大,有的这个地方错了改一下,另一个相对的地方会忘记改,老是编译错误
- 产生随机数这个函数不常用,有些不熟悉,只好靠百度了
- 直接要退出游戏的话,原本想用return 0;的,后来我的函数返回型都是void,就用了exit(0);来退出游戏
- 整个游戏的代码打了挺久的,都是bug