博客作业 - 指针

1.本章学习总结

1.1 思维导图

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

1.2.1学习体会

  通过这一周的学习,让我明白了指针的重要性,在很多时候运用,会使得代码功能强大。  但我发现,可以用指针的地方,可以用数组,我比较喜欢用数组写,可能是刚刚学习指针,不怎么熟悉的结果。以后的学习中要多运用指针打打代码,这样把这种新的方法通过锻炼,熟悉起来。指针里面重点是处理字符,字符串的问题,我学会了好几个处理的字符串的函数。比如复制strcpy,赋值strcat连接函数,strcmp比较函数,strlen长度函数。这几个函数在处理很多字符串的问题上可以起到很强的作用。今后的学习中要多用指针,多学习一点string文件里面的函数。减少代码的复杂度。

1.2.2代码累计

2.PTA总分

2.1

2.2我的总分:

总分 :110

3.PTA实验作业

3.1题目介绍

3.1.1算法分析

定义字符串长度longth;存放尾数poem数组; 输入二维字符数组char 
- for i=0 to 4  
        scanf("%s",s[i]);//读入

- end for

- for i=0 to 4  //遍历
	 - longth = strlen(s[i]);//计算每一行的字符串长度
- 以下2个字节按顺序存放形成汉字
	 - poem[2*i]= s[i][longth-2];//最后一个汉字的第一个字节存放
	 - poem[2*i+1]= s[i][longth-1];//最后一个汉字的的第二个字节存放

- end for

3.1.2代码截图

3.1.3测试数据

3.1.4PTA提交列表和说明

Q:不知道怎么处理汉字的存放,没理解汉字是如何输出的。
A:百度后知道了汉字分2个字节存放,连续的2个字节输出就可以打印出一个汉字,然后就用到这种办法,把最后一个字拆分,一个字节一个字节,按顺序存放在一个数组中,形成一个大的字符串,就是结果。

4.大作业(5分)

题目:实现小学四则运算。
题目要求:
题目有3个难度级别,分别为:
第一级是1位数的一步加减乘除计算
第二级是2位数的2步加减运算
第三级是3位数的2步加减运算

4.1改进内容:

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

2.表达式运算

4.2改造函数介绍

主要上述2个函数的改造说明

1.函数1

传入实参 存放算术式的数组exp的地址,用户等级rank, 用户训练题目量num;
定义 算式和值sum,答对题数yes=0;用户输入值yournum ,循环变量i , 判断是否结束变量flag;存放运算符字符数组char
- for i=1 to num 
- do switch rank;
- case 1://生成一级运算式
 - *(exp+0)=rand()%9+'1';
- *(exp+1)=ch[rand()%2];//随机产生- + 运算符 生成随机0,对应运算符“-”;随机1,对应运算符“+”
- *(exp+2)=rand()%9+'1';
- *(exp+3)='\0';   break;  //末尾存入\0.方便运算
- case 2://生成2级,原理和一级相同
- *(exp+0)=rand()%9+'1';
-  ...... 					
- *(exp+2)=ch[rand()%4];//随机产生4种运算符
- *(exp+3)=rand()%9+'1';
 - ......       
- *(exp+5)=ch[rand()%4];
- *(exp+6)=rand()%9+'1';
- ...... 
- *(exp+8)='\0';   break;
- case 3://生成3级,原理和一级相同
- *(exp+0)=rand()%9+'1';
- ...... 
- *(exp+11)='\0';  break;                 
                   
- end switch  
- strcat(exp,"=");//连接等号
- puts(exp);//输出运算式
- sum=ComputerExp(exp);//调用计算函数计算结果 
- 嵌入输出的代码,包括结果,正确率等
- end for


截图函数代码:
函数代码参考上述构造字符数组存放算术表达式

2.函数2


传入存放运算符的数组地址exp
定义 循环变量i;循环累加值m ; 总和值sum ;存放运算符oldc;
- do while(*(exp+i))//遍历运算式数组exp
- if *(exp+i) <='9'&& *(exp+i)>='0' )   then  m=10*m+*(exp+i)-'0';//当字符属于数字时,字符运算把每一个字符转化为数字  
- else   
- do switch(oldc) //否则则为运算符。调用switch语句分别进行运算
- case '+': sum=sum+m;break;
- case '-': sum=sum-m;break;
- case '*': sum=sum*m;break;
- case '/': sum=sum/m;break;
- end switch
- m = 0;//运算完后m归0,方便下一次运算
-  oldc = *(exp+i);//存运算符,方面下一次计算
-  i++;

- end while
- return sum;//返回结果 ,方便调用运算结果


截图函数代码:
函数代码参考上述构造表达式运算

4.3 与原有函数代码比较

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

1.改造前的函数3个级别分别要用3个函数分别构造,但是改造后的函数一个函数就可以解决3个级别的问题,
2.改造前的函数每一种级别都要进行复杂的代数运算,很多个case,一步一步的进行运算,改造后的函数,不管哪一个级别,都可以统一用一个计算函数运算出来,结果返回就行。
3.改造前的函数,输出提示一个级别运用一次,多次使用了相同的东西,变量每个函数都要定义。改造后的函数,所有的变量,都只要定义一次,另外的函数要用就直接传递实参给函数,直接使用。
4.改造前的函数没有使用指针地址,改造后的函数使用了地址,在重复使用一个相同的数的情况上,改造后的函数方便很多,可以直接*取地址,直接使用,但是改造前的函数如果要使用,必须定义全局变量。
5.改造前的函数不管变量上。代码量上都比改造后的函数复杂。改造后的函数简单的2个函数就可以完成所有功能。
6.改造前的函数输出是这样:



改造后函数,一个输出函数,一个表达式直接puts(exp)!!!非常方便,简洁!

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

1.改造前的函数运算是这样的:



改造后的运算函数:
直接用 m=10m+(exp+i)-'0',这条语句,处理了所有的运算!
可见用字符数组存放后用字符运算的强大!它的优点很明显,不管一位数,二位数,一步,二步,都可以一下子处理完,不需要分开!

4.4 改进大作业总结

回顾两次作业编写过程,总结碰到问题及后续程序编写注意事项。
总结:第1次编写大作业的时候,很疑惑函数的构造,由于对函数的使用不是很熟悉,所以我第一次并未使用传参数的函数,所有的变量都是在每一个函数定义,虽然在编写的时候简单了很多,但是繁琐很多了,很多变量都重复的在使用,其效果等同与全局变量的使用。在编写的过程中,会碰见取随机值不满足位数的情况,在以后的编写中,要多运用函数传参数的写法,避免多次定义相同变量,只需要在主函数中定义一次,然后可以传参数多次使用。使用函数有个问题,就是多次使用同一个数据,要重复调用,不怎么方便。
第2次的作业:把全局变量改为地址,函数改为地址传参数,解决了第一次编写大作业的问题,只要有函数的地址,重复使用很方便,但是编写的时候也遇见了传参数出现错误的情况,比如定义形参的类型,在使用存储运算表达式的函数中,我想把和sum直接用在另外一个函数,出现错误。原因是这个sum变量是局部变量,不能够和别的函数共享,所以我想到了返回的方法,把sum作为函数的返回值。这样一更改,我的函数头名void又忘记了更改成对应的整形去定义函数,又出现错误,经过同学的指点,才发现了这一点问题。今后的编写中,要注意形参的传递要符合,有返回值函数不能够定义void。局部变量的值不能够给别的函数使用,如果要用,要用全局变量去定义,或者通过返回值使用!

posted @ 2018-12-17 21:49  秋斌  阅读(271)  评论(1编辑  收藏  举报