1.学习了指针以为指针相对来讲比较抽象,并且在上指针课以前未进行预习,因此刚开始学会比较吃力,但经过老师的课堂派pta训练 相对跟上一些进度,可是对指针掌握程度相对欠缺; 2.学完指针,指针的好处在函数上是一个体现,以前函数只能返回一个值;但有了指针,能够经过传递多个地址,在本身定义的函数中 完成对这些地址中的值进行更改,则原函数中的变量的值也会相应更改,至关于一个函数能够传回多个值; 3.学习了字符串的赋值要借助strcpy函数,不能依靠等号进行赋值,以及字符串的链接和长度比较都要调用函数来实现; 4.指针传递的是地址,能够明显提升大数据传递效率;
给定一句英语,要求你编写程序,将句中全部单词的顺序颠倒输出。
定义i,j 定义字符数组a; 输入字符串a; 定义整型变量n用于存放a字符串的长度; 定义count计数一个单词的长度; 定义flag,flag=1不输出空格;flag=0时输出空格; for i=n-1 to 0 do i-- if a[i]==' '&&count!=0 then //遇到空格且所记单词数大于0时准备输出单词 if flag==1 then flag=0 //第一个单词以前不用输出空格 else 输出空格 end if for j=i+1 to i+count do j++ 输出a[j] count=0 /*当一个单词输出完后,count清零,从新计数*/ else if a[i]!=' ' then count++ /*在还没遇到空格以前,计数加一*/ end if end for if count>0 then if flag==0 then 输出空格 end if for i=0 to count do 输出a[i] end for /*若是a[0]等于字母则在循环中没法输出最后一个单词,这个if语句用于解决a[0]不等于空格的状况*/
题目:实现小学四则运算。 题目要求: 题目有3个难度级别,分别为: 第一级是1位数的一步加减乘除计算 第二级是2位数的2步加减运算 第三级是3位数的2步加减运算
说明:函数1构造字符数组存放算数表达式;函数3计算出表达式的结果并将结果返回;
思路:生成相应的随机数和随机运算符并依次赋给exp字符数组,最后输出字符数组。 (注:其中穿插不合法状况的判断,使生成的表达式中不含不合法的表达式)
void CreateExp(char *exp,int level) 定义整型变量x,y用于生成随机数 定义整型变量m判断生成的是几位数的数,n判断运算符的类型的个数 定义字符数组str并赋初值零 定义i用于限制运算式子的步数 switch level do case 1 do m=10;n=4;i=3; break case 2 do m=100;n=2;i=5;break case 3 do m=1000;n=2;i=5;break end switch while i-- do if i%2==1 then y=rand()%n /*判断运算符类型*/ switch y case 0:strcat(exp,"+");break; ...... /*这个switch用于判断四种状况,并将符合条件的运算符链接到exp上*/ end switch else then x=rand()%m; if level==1 and i==0 and y==3 and x==0 then //除数为0的不合法状况 i++ continue end if if level==1 and i==0 and y==3 end ((exp[0]-'0')%x!=0)//等级一中除法运算不能整除的不合法状况 i++ continue end if 用itoa函数实现将一串整型数转化为字符串,并存在str数组中 将str链接在exp后 end if end while 输出表达式的字符串exp
判断不和法的状况已经包含在函数1中并进行了相应的注释。
思路:将字符数字转化为整型数字,并依次一步一步的计算并赋值给result,最后算出表达式结果,并将结果result返回。
int ComputeExp(char *exp,int level) 定义整型变量i,j用于循环 定义len,将exp数组长度的值赋给len 定义result用于存放表达式计算结果 定义flag,flag=0时说明是第一个运算符出现的状况 定义字符变量ch暂时存放运算符 for i=0 to len do if exp[i]>='0'&&exp[i]<='9' then num=num*10+exp[i]-'0' else if flag==0 then /*第一个运算符出现的状况*/ result=result+num num=0,flag=1; //进行完一次运算后num清零 ch=exp[i] //将运算符赋值给ch else switch ch do case '+':result+=num;break; ...... 判断是相应的运算符后进行运算 end switch ch=exp[i] num=0 //进行完一次运算后num清零 end if 返回result的值
1.增长了一个规范不合法输入函数:void correctScanf(int *x)(如图1)
以前还没学指针因此对返回输入值操做相对困难,而后此次更改的时候就加了这个函数,
方便每次输入时调用;以前每次输入都得用到此代码,如今调用就能够实现,简化了代码。算法
2.函数1:void CreateExp(char *exp,int level) 和以前int gradeOne(int n) ; int gradeTwo(int n) ; int gradeThree(int n);三个函数的比较
(1)等于将三个函数整合到一个函数中去执行,如今这个函数的封装能够实现以前三个函数的输出表达式的功能,简化了代码;
(2)可是以前的代码的直观性更强,更容易读懂;其中对三个等级的判断条件有所不一样,分开讨论,代码相对比较有逻辑性;
(3)这个函数是将一个表达式存放在字符数组中并输出,而以前函数的输出表达式的方式相对简单粗暴,直接将生成的两个数和运算符用printf输出;数组
3.函数3:int ComputeExp(char *exp,int level) 和以前int gradeOne(int n) ; int gradeTwo(int n) ; int gradeThree(int n);三个函数的比较
(1)以前的三个函数是对数直接的运算计算出表达式结果,而函数3则是将字符串中的数转化为整型在进行运算,相对较麻烦;
(2)可是函数3这样的函数封装,调用起来的灵活性比较强,而以前三个函数只能在相应等级中实现;函数
1.改用指针传表达式的数组和计算表达式的结果,使各个函数的分工更加明确,代码也更加有条理; 2.改进过程当中遇到的问题较多,也较上次复杂,如将表达式转为字符串形式,两位数和三位数的整数的转化相对复杂, 可是经过上网查找资料,发现调用itoa函数就能够简单实现; 3.大做业的代码相对还有欠缺,如做答是在主函数中,其实还能够用一个函数进行封装实现; 4.代码量一多,函数的封装很是关键,函数封装好只要在主函数中调用就能够了,能够简化不少代码,与改进前相比, 代码行数减小了一百行左右,由三百多行减小到两百多行;