zoukankan      html  css  js  c++  java
  • C语言博客05--指针

    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==''  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=
    ",figure[0],exp,figure[1]);
               break;
               case 2:
                     strcpy(exp,"-");
                     *result=figure[0]-figure[1];
                     printf("%d%s%d=
    ",figure[0],exp,figure[1]);
               break;
               case 3:
                     strcpy(exp,"*");
                     *result=figure[0]*figure[1]; 
                     printf("%d%s%d=
    ",figure[0],exp,figure[1]);
               break;
               case 4:
                     strcpy(exp,"/"); 
                     *result=figure[0]/figure[1];
                     printf("%d%s%d=
    ",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=
    ",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=
    ",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=
    ",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=
    ",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设为全局变量。还有形成运算式时,原本想把整个式子都存到字符数组中,但好像行不通,后来参考了同学代码,把运算数和运算符分开,把运算数存到一维数组中,运算符存到字符数组,再分别输出。
    
  • 相关阅读:
    Linux 命令集合
    vsftpd 创建虚拟用户
    Java Web Socket
    Linux 命令集合
    YII 1.0 上传文件
    YII 1.0 扩展第三方类
    YII 1.0 发表文章用到的小物件
    YII 1.0 增删改查
    mysql 日志
    YII 1.0 小功能总结
  • 原文地址:https://www.cnblogs.com/x-m-66/p/10128291.html
Copyright © 2011-2022 走看看