1.本章学习总结#
1.1 思维导图##
1.2 本章学习体会及代码量学习体会##
1.2.1 学习体会###
通过学习了指针,在函数使用时,可以只传地址,而不用像以前一样,传这个组,这样可以节省内存,又提高了传输效率。指针还可实现动态内存分配,避免造成内存浪费。通过函数改变一个变量的值,就得用指针传递。如果用普通变量传递,则无法实现。
但初学指针,对指针的使用还是不熟练。p是一个内存地址值,*p是地址p指向的内容。对p和*p的使用还比较模糊。p++即可实现指针指向数组的下一个元素,指针的使用还是比较方便的。
1.2.2 代码累计###
2.PTA总分#
2.1截图PTA中函数题目集的排名得分##
2.2 我的总分##
总分:110
3.PTA实验作业#
3.1PTA题目1##
求子串在母串中最后一次出现的地址
给定程序中函数fun的功能是:求出在字符串中最后一次出现的子字符串的地址,通过函数值返回,在主函数中输出从此地址开始的字符串;若未找到,则函数值为NULL。
3.1.1 算法分析###
char *fun (char *s, char *t )
定义 i,j,count=0;
char *str1,*str2,*a;
a=NULL;
while(*s)
str1=s; //把母串赋给str1数组
str2=t; //把子串赋给str2数组
while(*str2)
if *str1==*str2 then //判断t指针所指的字符串是否和s所指字符串里面的子串相同
str1++;str2++;
end if
else
break;
end while
if *str2=='\0' then //t指针所指的字符串在s指针所指的字符串中最后一次出现的地址
a=s;
end if
s++; //缩小s数组的范围
end while
返回a
3.1.2 代码截图###
3.1.3 PTA提交列表及说明###
- Q1:求出在字符串中最后一次出现的子字符串的地址
- A1:先找两个数组把子串和母串存起来,通过比较两个字符串是否有一个相同的元素,若有,接着往下比较,若有部分元素不同则跳出循环,字符串s自增,缩小比较范围,直到字符串str2到末端,把剩余的s字符串的内容赋给a数组,返回a数组,重复操作直到s数组结束,即可得到字符串中最后一次出现的子字符串的地址
4.大作业#
题目:实现小学四则运算##
4.1.改造函数介绍###
1.函数1
定义 level //题目难度
定义 result,answer;//答案、用户回答
定义题目数量n,i
char exp[3]; //存放运算符的数组
定义 right=0,wrong=0;
输入答题数量
for i=1 to n do //输出n道题目
输出菜单
输入题目难度
if level==0 then //提前结束答题
break;
end if
CreateExp(exp,level,&result); //调用生成运输式的函数
Judge(result,answer,&right,&wrong);
end for
出用户答题的正确率
2.函数2
void CreateExp(char *exp,int level,int *result) //形成三种不同的运算式
定义 c,d;
定义 i,j=pow(10,level);
定义存放运算数的数组 figure[4];
srand((time(NULL)));
if level>=2 then //两步运算和三步运算类似,就用同一种方法
level=2;
end if
for i=0 to level do //产生随机运算数
figure[i]=rand()%j;
while(i>=1&&figure[i]==0) //除法计算时避免除数为0
figure[i]=rand()%j;
end while
end for
switch(level)
case 1: //一位数的一步运算
c=rand()%4+1;
switch(c)
case 1:
strcpy(exp,"+");
*result=figure[0]+figure[1];
printf("%d%s%d=\n",figure[0],exp,figure[1]);
break;
case 2:
strcpy(exp,"-");
*result=figure[0]-figure[1];
printf("%d%s%d=\n",figure[0],exp,figure[1]);
break;
case 3:
strcpy(exp,"*");
*result=figure[0]*figure[1];
printf("%d%s%d=\n",figure[0],exp,figure[1]);
break;
case 4:
strcpy(exp,"/");
*result=figure[0]/figure[1];
printf("%d%s%d=\n",figure[0],exp,figure[1]);
break;
break;
case 2: //两、三位数的两步运算
d=rand()%4+1;
switch(d)
case 1:
strcpy(exp,"+");
*result=figure[0]+figure[1]+figure[2];
printf("%d%s%d%s%d=\n",figure[0],exp,figure[1],exp,figure[2]);
break;
case 2:
strcpy(exp,"-");
*result=figure[0]-figure[1]-figure[2];
printf("%d%s%d%s%d=\n",figure[0],exp,figure[1],exp,figure[2]);
break;
case 3:
strcpy(exp,"*");
*result=figure[0]*figure[1]*figure[2];
printf("%d%s%d%s%d=\n",figure[0],exp,figure[1],exp,figure[2]);
break;
case 4:
strcpy(exp,"/");
*result=figure[0]/figure[1]/figure[2];
printf("%d%s%d%s%d=\n",figure[0],exp,figure[1],exp,figure[2]);
break;
break;
3.函数3
void Judge(int result,int answer,int *right,int *wrong) //用户输入并判断用户回答是否正确,统计正确、错误个数
定义 c;
srand((time(NULL)));
输入用户答案
If answer==result then //若用户回答正确,祝贺用户
(*right)++;
c=rand()%4+1;
switch语句随机生成赞美用户的提示语
end if
else //若用户回答错误,给出正确答案
(*wrong)++;
c=rand()%4+1;
switch语句随机生成鼓励用户的提示语
4.3 与原有函数代码比较
代码行数比原来少了很多,代码看起来更简洁了,实现的功能也比以前多了,这次有设置随机的用户答题提示语,对输入答题数目和题目难度的选择有进行了非法字符的处理,基本的功能有实现,但生成运算式的方法比较呆板,而且二步运算的运算式都是一样的,没有实现两个运算式是随机的。
4.4 改进大作业总结
这次大作业中,使用了指针来做,对指针有了更深的了解,也体会到了指针真的是个好东西,它实现了普通数组、变量所不具备的功能,方便了某些功能的实现,且使用指针后的代码比原来简洁多了,可读性也大大增强了。本次作业中,刚开始把CreateExp这个函数里的result变量设为普通变量,后面发现需要把result的结果传到Judge函数中与用户的回答比较,判断用户回答是否正确时,就发现毛病了。后来就把result设为指针,通过改变指针内容来把改变后的result传回主函数中,再传到Judge函数中。对right、wrong变量也采取同样的做法。相比第一次大作业,是讲right、wrong设为全局变量。还有形成运算式时,原本想把整个式子都存到字符数组中,但好像行不通,后来参考了同学代码,把运算数和运算符分开,把运算数存到一维数组中,运算符存到字符数组,再分别输出。