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