经过这一周的学习,让我明白了指针的重要性,在不少时候运用,会使得代码功能强大。 但我发现,能够用指针的地方,能够用数组,我比较喜欢用数组写,多是刚刚学习指针,不怎么熟悉的结果。之后的学习中要多运用指针打打代码,这样把这种新的方法经过锻炼,熟悉起来。指针里面重点是处理字符,字符串的问题,我学会了好几个处理的字符串的函数。好比复制strcpy,赋值strcat链接函数,strcmp比较函数,strlen长度函数。这几个函数在处理不少字符串的问题上能够起到很强的做用。从此的学习中要多用指针,多学习一点string文件里面的函数。减小代码的复杂度。
总分 :110算法
定义字符串长度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
Q:不知道怎么处理汉字的存放,没理解汉字是如何输出的。
A:百度后知道了汉字分2个字节存放,连续的2个字节输出就能够打印出一个汉字,而后就用到这种办法,把最后一个字拆分,一个字节一个字节,按顺序存放在一个数组中,造成一个大的字符串,就是结果。数组
题目:实现小学四则运算。
题目要求:
题目有3个难度级别,分别为:
第一级是1位数的一步加减乘除计算
第二级是2位数的2步加减运算
第三级是3位数的2步加减运算函数
1.构造字符数组存放算术表达式
学习
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 截图函数代码: 函数代码参考上述构造字符数组存放算术表达式
传入存放运算符的数组地址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;//返回结果 ,方便调用运算结果 截图函数代码: 函数代码参考上述构造表达式运算
1.改造前的函数3个级别分别要用3个函数分别构造,可是改造后的函数一个函数就能够解决3个级别的问题,
2.改造前的函数每一种级别都要进行复杂的代数运算,不少个case,一步一步的进行运算,改造后的函数,无论哪个级别,均可以统一用一个计算函数运算出来,结果返回就行。
3.改造前的函数,输出提示一个级别运用一次,屡次使用了相同的东西,变量每一个函数都要定义。改造后的函数,全部的变量,都只要定义一次,另外的函数要用就直接传递实参给函数,直接使用。
4.改造前的函数没有使用指针地址,改造后的函数使用了地址,在重复使用一个相同的数的状况上,改造后的函数方便不少,能够直接*取地址,直接使用,可是改造前的函数若是要使用,必须定义全局变量。
5.改造前的函数无论变量上。代码量上都比改造后的函数复杂。改造后的函数简单的2个函数就能够完成全部功能。
6.改造前的函数输出是这样:
改造后函数,一个输出函数,一个表达式直接puts(exp)!!!很是方便,简洁!3d
1.改造前的函数运算是这样的:
改造后的运算函数:
直接用 m=10m+(exp+i)-'0',这条语句,处理了全部的运算!
可见用字符数组存放后用字符运算的强大!它的优势很明显,无论一位数,二位数,一步,二步,均可以一会儿处理完,不须要分开!指针
回顾两次做业编写过程,总结碰到问题及后续程序编写注意事项。
总结:第1次编写大做业的时候,很疑惑函数的构造,因为对函数的使用不是很熟悉,因此我第一次并未使用传参数的函数,全部的变量都是在每个函数定义,虽然在编写的时候简单了不少,可是繁琐不少了,不少变量都重复的在使用,其效果等同与全局变量的使用。在编写的过程当中,会遇见取随机值不知足位数的状况,在之后的编写中,要多运用函数传参数的写法,避免屡次定义相同变量,只须要在主函数中定义一次,而后能够传参数屡次使用。使用函数有个问题,就是屡次使用同一个数据,要重复调用,不怎么方便。
第2次的做业:把全局变量改成地址,函数改成地址传参数,解决了第一次编写大做业的问题,只要有函数的地址,重复使用很方便,可是编写的时候也碰见了传参数出现错误的状况,好比定义形参的类型,在使用存储运算表达式的函数中,我想把和sum直接用在另一个函数,出现错误。缘由是这个sum变量是局部变量,不可以和别的函数共享,因此我想到了返回的方法,把sum做为函数的返回值。这样一更改,个人函数头名void又忘记了更改为对应的整形去定义函数,又出现错误,通过同窗的指点,才发现了这一点问题。从此的编写中,要注意形参的传递要符合,有返回值函数不可以定义void。局部变量的值不可以给别的函数使用,若是要用,要用全局变量去定义,或者经过返回值使用!code