• 第五次作业指针


    1.本章学习总结

    1.1 思维导图

    1.2 本章学习体会及代码量学习体会

    1.2.1 学习体会

        换个说法吧,后面的博客,每次都说好难好难也不好。(不过也是事实)
        指针,我稍微会用的就是和数组有关联的那一部分。拿着自己写的题目去问同学,他说我指针用的太过了,也的确是,不太会用,就拿做过的课堂派作业照着葫芦画瓢,寻一点点感觉。还是指针,我用了,自己都不知道他跑到哪里去了,看了半天都没毛病,请教大佬后一语道破。目前对指针还是挺迷的,能不用指针我就尽量不用吧。(在你完全熟悉指针之前,尽量不要乱用。----这是大佬对我的寄语)。不过,有的题目用用指针还是蛮方便的。
        此次大作业,说实话,真的看得一脸懵逼。本来就不怎么会用,然后有点不知道怎么下手。不过,也不能不做,做了总比没做好,哪怕是看着别人的写的,也比自己不写好,好歹有个印象。后来和同学聊天谈到,不怎么会用指针的话,至少会多少写多少吧,先把一级的写了。后来想想也对,这不就是把大问题分解成小问题嘛,解决起来就没有那么困难。
        此次作业,我还是要认真的,上次函数大作业没写好,以至于这次要基本全部重来一遍,非常费劲,如果这次还是那么含糊的话,那下次就是和文件关联,与课设有关了。对中间要求严格一点,做的更好一点,也是为了后面能不学的那么累。
    

    1.2.2 代码累计

    2.PTA总分

    2.1截图PTA中函数题目集的排名得分

    2.2 我的总分:

    指针pta总分110
    

    3.PTA实验作业

    3.1 PTA题目1

    7-3 字符串的冒泡排序 (20 分)
    我们已经知道了将N个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的K(<N),输出扫描完第K遍后的中间结果序列。
    
    输入格式:
    输入在第1行中给出N和K(1≤K<N≤100),此后N行,每行包含一个长度不超过10的、仅由小写英文字母组成的非空字符串。
    
    输出格式:
    输出冒泡排序法扫描完第K遍后的中间结果序列,每行包含一个字符串。
    

    3.1.1 算法分析

    定义二维字符数组ch[100][20]
    for(i=0 to n)
        do
            scanf("%s",ch[i])//将字符串看做一个整体存放在数组中
    end for
    定义j
    - for(i=0 to k)循环到k轮结束
        do 
           -  for(j=0 to n-1-i)//考虑到最大的那个数在最后的情况,要减1
                do
                       -  if(ch[j]>ch[j+1])
                             定义字符数组t[20]
                             //利用函数strcpy交换ch[j]与ch[j+1]的值
                             strcpy(t, ch[j]); 
                             strcpy(ch[j], ch[j+1]);
                             strcpy(ch[j+1], t);	
                        end if
            end for
    end for
    - for(i=0 to n)
        do
            输出ch[i]
    end for
    

    3.1.2 代码截图

    3.1.4 PTA提交列表及说明

    • Q1:开始一直想着用一位数组循环存放字符串,后面发现不行
    • A1:将字符串的存储改为用二维数组
    • Q2:对字符串这个整体,不知道该怎么处理,开始想着是,读到空格就结束,前面的字符构成一个数组,就是一个字符串放在一个数组中的意思
      后面发现根本不知道该怎么表示,无从下手
    • A2:换一种思考方式,将字符串作为一个数组元素存放,将字符串看做一个整体处理
    • Q3:冒泡交换两个数的值时,定义一个指针放值,发现不行
    • A3:用函数strcpy,进行复制处理,同时将指针改为一个数组去存放相应的字符串

    4.大作业

    题目:实现小学四则运算,有3个难度级别,分别为:

    第一级是1位数的一步加减乘除计算
    第二级是2位数的2步加减运算
    第三级是3位数的2步加减运算
    改进内容:

    4.1.改造函数介绍

    1.构造字符数组存放算术表达式
    算法分析

    定义lence//表示数组长度
    - if(level == 1)
         lence = 4;//一级运算式子共有4个字符 
    - else if(level == 2) 
         lence = 9;//一级运算式子共有9个字符 
    - else 
         lence = 12;			//一级运算式子共有12个字符 
    end if
    - for( i = 0 to lence-1)
    	- for(j = 0 to level)//一级是一位数,二级两位数,三级三位数 
    		- if(level>1)//大于两位数的随机数,第一位数字不能为0 
    			- if(j==0)
                                    exp[i++] = rand() % 9+'1';//第一位数字不能为0
    			- else 
                                    exp[i++] = rand() % 10 + '0';
    			end if
    		else 
                            exp[i++] = rand() % 10 + '0';
                    end if
    	end for	
    	- if(level == 1)//等级一生成四个运算符 
    		t = rand() % 4;
    		if (t == 0) exp[i] = '+';
    		else if (t == 1) exp[i] = '-';
    		else if (t == 2) exp[i] = '*';
    		else exp[i] = '/';
    	- else		 //等级二三生成两个运算符 
    		t = rand() % 2;
    		if (t == 0) exp[i] = '+';
    		else exp[i] = '-';
    	end if
    end for
    exp[lence-1] = '=';//让最后一个为等号
    exp[lence] = '\0';
    

    截图函数代码

    2.计算结果的函数
    算法分析

    定义计算结果sum并初始化为0
    定义oldc为原来字符并复制为 + 
    do
            - if(exp[i]<='9'&&exp[i]>='0' ) //读到的字符是数字,累计起来
                    m=10*m+exp[i]-'0';
            - else 
               	- if(oldc=='+' )//加法
                	        sum += m;
               	- else if(oldc=='-')//减法
                	        sum -= m;
                    - else if(oldc=='*')//乘法
                	        sum *= m;
                    - else if(oldc=='/')//除法
                	        sum /= m;
                    end if
              	m = 0;//重新归零,不影响下次运算
               	oldc =exp[i];//赋新制
         	end if
         	i++;//i自增读下一个字符
       }while(exp[i-1]!='=');
    end do while
       返回最终结果sum;
    

    代码截图

    4.2 与原有函数代码比较

    改造前函数1和改造后的函数1

    • 在生成式子计算的时候,我改造之后的是每次调用函数生成式子,而原来的是在每个等级中循环生成式子并计算结果,改造之后大大增强了代码的可读性
    • 现有代码,巧妙运用exp存放,比原来的代码量有所减少

    改造前函数2和改造后的函数2

    • 原来计算结果是用switch语句判断符号,然后再用result去做相应的加减乘除运算,分的情况会很多,很麻烦
    • 现在改造的函数是读取存放进数组的字符,来计算结果,非常巧妙,代码量大大减少

    4.3 改进大作业总结

    • 在运用exp的时候,我参考同学代码用来sprintf将式子放入数组中,但我发现根本出不来等式,后面才知道原来还要printf将式子表示出来。然后当时运用的是指针,要申请内存,不然就会出错,总之,改来改去我就干脆把他改成数组算了,省事。但是。。。。。。后来我又改了,因为我发现自己并不熟悉sprintf的用法,后来想想,我的哪里用了指针,就是硬凑上去的嘛。于是,我就在同学建议下对三个级别分情况讨论,依次将字符存入数组中,更加简便易懂
    • 困扰我最久的就是,我分明返回了result的值,但它最后就是显示为0,经过问学长学姐,才知道原来我要把我返回的result的值赋给一个x,这样才能把正确结果存起来
    • 在计算结果的那个函数中,参考了老师提供的代码,对数字进行累计和对运算符进行不断更新,使计算看起来更方便一些,同时也和生成式子的那个指针关联起来了。
    • 指针,其实现在还是比较怕用的,因为我不太清楚他到底要怎么指。而且,此次作业对于我来说可以说是一次大改动了,上次函数大作业还有许多bug,后来就一直放着,这次就很费劲,我不想重蹈覆辙,于是又对代码进行修改,尽量少点错误。
    • 大作业是一次一次相关联的,尽量做到最好吧,不然如果这个又做不好的话,那我后面的文件和课设岂不是一团糟了。。。
  • 相关阅读:
    解题:POI 2008 Plot purchase
    1807. 斐波纳契数列简单
    1745. 单调数列
    1700. 增减字符串匹配
    1665. 计算数字
    1523. 分区数组
    1517. 最大子数组
    1598. 两句话中的不常见单词
    1594. 公平的糖果交换
    1510. 亲密字符串(回顾)
  • 原文地址:https://www.cnblogs.com/zhonghaiqing/p/10124236.html
Copyright © 2020-2023  润新知