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设为全局变量。还有形成运算式时,原本想把整个式子都存到字符数组中,但好像行不通,后来参考了同学代码,把运算数和运算符分开,把运算数存到一维数组中,运算符存到字符数组,再分别输出。