钟海清

导航

第五次作业------指针

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,后来就一直放着,这次就很费劲,我不想重蹈覆辙,于是又对代码进行修改,尽量少点错误。
  • 大作业是一次一次相关联的,尽量做到最好吧,不然如果这个又做不好的话,那我后面的文件和课设岂不是一团糟了。。。

posted on 2018-12-17 22:26  haiqingz  阅读(373)  评论(2编辑  收藏  举报