经过学习了指针,在函数使用时,能够只传地址,而不用像之前同样,传这个组,这样能够节省内存,又提升了传输效率。指针还可实现动态内存分配,避免形成内存浪费。经过函数改变一个变量的值,就得用指针传递。若是用普通变量传递,则没法实现。 但初学指针,对指针的使用仍是不熟练。p是一个内存地址值,*p是地址p指向的内容。对p和*p的使用还比较模糊。p++便可实现指针指向数组的下一个元素,指针的使用仍是比较方便的。
总分:110
求子串在母串中最后一次出现的地址 给定程序中函数fun的功能是:求出在字符串中最后一次出现的子字符串的地址,经过函数值返回,在主函数中输出今后地址开始的字符串;若未找到,则函数值为NULL。
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
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 改进大做业总结3d
此次大做业中,使用了指针来作,对指针有了更深的了解,也体会到了指针真的是个好东西,它实现了普通数组、变量所不具有的功能,方便了某些功能的实现,且使用指针后的代码比原来简洁多了,可读性也大大加强了。本次做业中,刚开始把CreateExp这个函数里的result变量设为普通变量,后面发现须要把result的结果传到Judge函数中与用户的回答比较,判断用户回答是否正确时,就发现毛病了。后来就把result设为指针,经过改变指针内容来把改变后的result传回主函数中,再传到Judge函数中。对right、wrong变量也采起一样的作法。相比第一次大做业,是讲right、wrong设为全局变量。还有造成运算式时,本来想把整个式子都存到字符数组中,但好像行不通,后来参考了同窗代码,把运算数和运算符分开,把运算数存到一维数组中,运算符存到字符数组,再分别输出。