第五次作业---指针
1.本章学习总结(2分)
1.1 思维导图
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
实际上还是没怎么明白该怎么用指针,指针的题集实际上都是用数组写的,感觉没什么区别又好像很有区别,令人头疼。感觉进度好快,有点赶不上,题集刷得慢,概念不清晰,甚至连有的编译错误都因为概念上的不清晰难以找出错误。整个写题过程都充满了不确定,不自信,不明白。明明自己写得没有问题,但却老觉得都是问题。特别难受。如果光是看的话,多多少少是可以看明白的,自己写就有一点点悬。
1.2.2 代码累计
2.PTA总分(2分)
2.1截图PTA中函数题目集的排名得分
2.2 我的总分:
110分
3.PTA实验作业(1分)
3.1 PTA题目1
字符串的冒泡排序
3.1.1 算法分析
int i,j;
int N,K;
char s[110][20],temp[20];
scanf("%d %d",&N,&K);
i from 0 to N scanf("%s",s[i]);
i from 0 to K
j from 0 to N-i-1
if(strcmp(s[j],s[j+1])>0) //字符串比较
strcpy(temp, s[j]); //字符串复制
strcpy(s[j], s[j+1]);
strcpy(s[j+1], temp);
end if
i from 0 to N printf("%s\n",s[i]);
3.1.2 代码截图
3.1.4 PTA提交列表及说明
- 整个代码就是对字符串函数运用理解不够清晰,所以老是错,本来整体是不会有什么大问题,但是因为理解不清晰,所以有的时候直接进行比较或者=,就导致结果总是不对。
4.大作业(5分)
题目:实现小学四则运算。
在函数那章,我们已经实现小学四则运算这份作业,现在要求大家把之前设计函数升级改造,原来的函数大家都是用全局变量实现不同函数参数传递,这次作业要求改地址传递,减少全局变量的使用。
题目要求:
题目有3个难度级别,分别为:
第一级是1位数的一步加减乘除计算
第二级是2位数的2步加减运算
第三级是3位数的2步加减运算
改进内容:
1.构造字符数组存放算术表达式
不管哪个级别的算式,请都生成一个字符数组存放。不管用户选择哪个级别题目,都能在表达式生成函数中生成一个算术式子。具体函数接口
j=0;
exp[j]=rand()%9+1;
j++;
cr[0]=ch[rand()%4];
exp[j]=rand()%9+1;
j++;
printf("%d%c%d",exp[0],cr[0],exp[1]);
printf("=");
2.表达式是否合法(选做)
对于不合法或者超出该级别小学生学习范围的表达式,视为不合法,需重造一个。不合法表达式体现有除数为0的表达式、1,2级别中出现不能整除的除法表达式或其他不合法情况
double calculate(int *exp,char *c,int n)
{
double answer=0;
int i;
answer=exp[0];
for(i=1;i<n;i++)
switch(c[i-1])
{
case '+':answer+=(double)exp[i];
break;
case '-':answer-=(double)exp[i];
break;
case '*':answer*=(double)exp[i];
break;
case '/':if(exp[i]!=0) answer/=(double)exp[i];
else printf("ERROR\n");break;
}
return answer;
}
3.表达式运算
根据字符表达式,能计算其结果。有能力同学深入研究表达式优先级。
这块代码可以参考这题做法:
#include <stdio.h>
int main()
{
int m=0, sum=0;
char c, oldc='+';
do {
c = getchar();
if( c<='9'&&c>='0' )
m = 10*m + c - '0';//1
else
{
if( oldc == '+' )
sum += m;
else
sum -= m;
m = 0;//2
oldc = c;
}
} while(c!='=');
printf("sum=%d", sum);
return;
}
4.1.改造函数介绍
主要上述三个函数的改造说明
1.函数1
伪代码介绍函数思路
int a,b,c,i,t,m,j=0;
char ch[4]={'+','-','*','/'},cr[3];
int exp[100],right=0;
double answer,response;
if(implement==1)
i from 0 to num
j=0;
exp[j]=rand()%9+1;
j++;
cr[0]=ch[rand()%4];
exp[j]=rand()%9+1;
j++;
printf("%d%c%d",exp[0],cr[0],exp[1]);
printf("=");
answer=calculate(exp,cr,2);
scanf("%lf",&response);
if(response==0&&answer!=0) break;
if(response!=answer)
printf("不对噢 下一题继续努力\n正确答案是 %.2lf\n",answer );
if(response==answer)
printf("恭喜你答对啦 继续保持啊\n");
right++;
end if
if(implement==2||implement==3)
for(i=0;i<num;i++)
j=0;
if(implement==2)
exp[j++]=rand()%90+10;
cr[0]=ch[rand()%2];
exp[j++]=rand()%90+10;
cr[1]=ch[rand()%2];
exp[j++]=rand()%90+10;
else if(implement==3)
exp[j++]=rand()%900+100;
cr[0]=ch[rand()%2];
exp[j++]=rand()%900+100;
cr[1]=ch[rand()%2];
exp[j++]=rand()%90+10;
printf("%d%c%d%c%d",exp[0],cr[0],exp[1],cr[1],exp[2]);
printf("=");
answer=calculate(exp,cr,3);
scanf("%lf",&response);
if(response==0&&answer!=0) break;
if(response!=answer)
printf("不对噢 下一题继续努力\n 正确答案是 %.2lf\n",answer);
if(response==answer)
printf("恭喜你答对啦 继续保持啊\n");
right++;
end if
doExercise( right,num);
截图函数代码。
2.函数2
伪代码介绍函数思路
double answer=0;
int i;
answer=exp[0];
i from 1to n
switch(c[i-1])
case '+':answer+=(double)exp[i];
break;
case '-':answer-=(double)exp[i];
break;
case '*':answer*=(double)exp[i];
break;
case '/':if(exp[i]!=0) answer/=(double)exp[i];
else printf("ERROR\n");break;
return answer
截图函数代码。
3.函数3
伪代码介绍函数思路
double correctRate;
printf("您一共做了%d道题,共做对%d道题",num,right);
correctRate=(1.0*right)/num;
printf("您的正确率是 %.2lf",correctRate)
截图函数代码。
4.3 与原有函数代码比较
改造前的函数主要是按照三个等级来直接分类,比较直接且暴力,而且使用了大量的全局变量;改造后的就是按照等级,计算和判断正确率来分类,然后就是一层套一层,其实好像也挺暴力的。但是,第一种就每个函数其实做的事情都差不多,像是其实就在重复三件相同的事情,没有起到函数应该有的效果。
4.4 改进大作业总结
- 两次代码最直接的问题就是无从下手吧,不知道要怎么做,头秃。
- 相比于第一次的代码,这一次的函数运用比上一次的直接三个等级会麻烦一些,然后自己实际上没怎么完整的使用过函数,业务不熟练,老是有这里那里的小错误,导致代码没办法运行。
- 又因为用了数组,数组在函数的传递自己又不是很明确,老是搞不清楚。不过经过这回的大作业,还是明确了很多。