C语言博客做业05--指针

1.本章学习总结

1.1 思惟导图



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

1.2.1 学习体会


  • 1. 老师说过指针的学习很重要,指针是C的灵魂,也给咱们演示了,的确c里面不少都用到了指针,指针是C的灵魂说得很对啊。(⊙v⊙)。
  • 2.指针的学习感受难度很大了,由于抽象化了,不是再像数组或者函数与数学有些类似的那样就能够好理解些。指针跟咱们之前学习了解的数据类型不同,指针虽然也是一种数据类型,只不过是专门存放地址的数据类型。
  • 3. 指针的算术运算对于理解指针的理解也是颇有帮助的,由于也算是符合它“指”的特色,指针的加法运算便是指针当前所指的位置再移动n个单元,而且结果仍是个指针。两个指针不能进行加法运算,这是非法操做,由于进行加法后,获得的结果指向一个不知所向的地方,并且毫无心义。两个指针能够进行减法操做,但必须类型相同。
  • 4.指针的运用仍是很方便的,特别是在函数上面,原本在学习和使用函数的时候就有一些比较不方便的地方:函数只能返回一个值,并且还有想要经过形参改变实参也是比较麻烦的。学习了指针之后,能够经过直接改变指针的所指对象的内容来解决函数只返回一个值的问题。并且一个函数若是使用了指针做为形参,要保证行参和实参类型一致,不然须要强制转换。︿( ̄︶ ̄)︿ ( ̄︶ ̄)︿( ̄︶ ̄)︿
  • 5.后来老师又教会咱们各类有关于动态分配内存有关的函数,动态存储分配函数mallo(),动态存储分配函数calloc(),动态存储释放函数free(),动态存储分配函数须要本身慢慢理解,这些须要很好的思惟,由于抽象化仍是不少的,要本身去想象,并且要考虑到不少地方,最后还要释放动态分配的空间

1.2.2 代码累计

2.PTA总分

2.1截图PTA中函数题目集的排名得分



2.2 个人总分:

总分:110

3.PTA实验做业

3.1 PTA题目1

7-2 说反话-增强版 :
给定一句英语,要求你编写程序,将句中全部单词的顺序颠倒输出。

输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。

3.1.1 算法分析

定义i,j,k为循环变量,num1为为计算字符中空格的数目 ,num为计算字符的长度
定义a数组为要求输入的数组 ,b为倒序输出
num=strlen(a);    //计算总共有多少字符
if num等于1 then
输出这个字符
返回0
end if
for i=0 to a[i]  do
     if a[i]等于' ' num1++  // 计算空格数目
if  num1等于num then//全是空格的数组
    返回0 
end if
for i=num-1 to 0 do
    if a[i]不等于' ' then
       b[j++]=a[i]   //将a数组反着输入到b中
    end if
    else
      if a[i-1]等于' ' then  //若是下一个仍是空格则继续循环 
         continue
      end if
      if num1等于1 then   //解决一个单词后面一个一个空格
         continue
      for k=j-1 to 0 do  //输出
         倒序输出b数组
      end for
     j=0
end for
if i==-1
   for k=j-1 to 0 do  
         倒序输出b数组
      end for

3.1.2 代码截图

3.1.3 PTA提交列表及说明


Q1:一开始各类错误,有超时啊,有格式错误啊,有答案错误。。。
A1:才发现我把循环的位置弄错了,把循环包括的范围直接连最后的输出也包括进去了
Q2:最后输出的时候仍是错了。。。全是格式错误,并且改了特别久都是格式错误。。。
A2:再定义了个变量num1,经过num1计算空格有多少就能够来分别控制到底该怎么输出了,经过判断num1与num的关系来看是否全是空格
Q2:最后一个测试点一直过不去:是不是一个单词后面接一个空格这种状况,调了好多种办法,试过再新增一个变量还有其余方法
A3:最后仍是用了num1的做用,若是num1等于1,证实只出现一个空格并且仍是在末尾部分

4.大做业

4.1.改造函数介绍

函数1构造字符数组存放算数表达式而且还包含了对于不合法或者超出该级别小学生学习范围的表达式的处理;函数3计算出表达式的结果并将结果返回

1.函数1:构造字符数组存放算术表达式及整除状况


算法分析:(对于计时函数等就不介绍了)
void CreateExp(char *exp,int level,int number)
定义字符数组Ch为[-,+,*,/]
定义Flag为判断可否整除 
定义answer为读者输入的答案,i为循环变量初值为1, flag为是否继续学习,result正确结果,count为题目数量
for i=1 to number  do
     switch level do
                case 1 do exp[0]=rand()%10+'0'  exp[1]=Ch[rand()%4]  exp[2]=rand()%9+'1'
                                 if exp[1]等于'/' then  //当为除法运算时候,要给小学生考虑下给它能够整除的状况
                                              Flag=(exp[0]-'0')%(exp[2]-'0') //判断能不能整除的状况 
                                              while(Flag不等于0)do  //不能整除的时候
                                                        exp[2]=rand()%9+'1'
                                Flag=(exp[0]-'0')%(exp[2]-'0')
                                              end while
                                 end if
                  break
                 case 2 do exp[0]=Rand(2)  exp[1]=Rand(1) exp[2]=Ch[rand()%4] ......exp[8]='\0' //参照等级一,把等级二的7位字符分别存进字符数组exp中 
                 break
         case 3    do       exp[0]=Rand(2) exp[1]=Rand(1) exp[2]=Rand(1) exp[3]=Ch[rand()%4] ......exp[11]='\0'  //参照等级一,把等级二的10位字符分别存进字符数组exp中 
         break
改进这段代码是真的痛苦啊。。。改特别久绝望的啊,一直以为语法没错,但是就是随机数这里一直错误,我一开始把随机计算运算符号的也弄一个函数,后来好像就由于这样,致使随机数输出的时候出错了,还有各类死循环,状况见下图

函数1惨不忍睹的错误:

随机数一点都不随机。。。





万恶的不知道怎么的就死循环了。。。算法

2.函数2

在函数1中就包括有函数2的要求内容,因此在这里就不介绍了


(PS:我将exp[2]的值直接不包含0这样子就能够不用担忧除数为0的状况了)数组

3.函数3:表达式运算

算法分析:
定义字符ch为存放计算符号
定义循环变量I,result为计算结果,sum为每位数,flag为控制变量
for i=0 to exp[i] do
     if   exp[i]>='0'&&exp[i]<='9'   //将不是运算符号的字符一个个变成数字 then
           sum=sum*10+exp[i]-'0'   //将每个字符除了运算符号外转化为数字存在sum里
           if   level==1&&i==2||level==2&&i==7||level==3&&i==10  //当将最后一个运算符号存给ch时候下一循环是不会在进入到计算循环里面的 
                    switch(ch)  //判断最后一个运算符号是什么 ,而且计算出最后结果  
                     case '+': result+=sum break
                     case '-': result-=sum break
                     case '*': result*=sum break
                     case '/': result/=sum  break
                         end switch
            end if
    end if
    else
            if flag等于0  then   //当遇到第一个运算符号时候,再将计算符号存到ch中 
                result=result+sum
        flag++
        ch=exp[i]
        sum=0
        continue
           end if
           else
                 switch ch   //计算结果             
               case '+': result+=sum break
               case '-': result-=sum break
               case '*': result*=sum break
               case '/': result/=sum break
                   end switch
            ch=exp[i];
            sum=0;
            end else
end for
return result

4.3 与原有函数代码比较

函数1与原有函数代码比较

原有函数的截图(特别长只截取了难度为1级的代码其他两个等级也是差很少的)

函数

  • 1. 首先最直观的一点就是代码量少了不少,真的少了特别特别多,直接就是百行没了,并且感受改进后的代码看起来比较牛了,这样子调用感受就是会比较高大上的感受吧,并且原本还设置了好多个变量,来放置各个随机数的值,这样子也使得代码看起来很冗长繁琐。
  • 2.没改进前的代码在一个函数中有不少种功能有创造计算式、还有判断除数为不为0状况、判断答案正确与否,还有计算功能,不少功能,也使得这个函数看起来很杂乱,并且也有不少重复的功能感受应该能够再放在一个函数中
  • 3.这一次还有个新的亮点就是随机数时直接使用rand()%9+1,这样就不会获得除数为0的状况也就能够不用再去判断除数是否为0的状况,没改进前为了这个除数不能为0状况实在是写得很长,还有这回考虑到了小学生除法最好是能够整除的状况。。。

函数3与原有函数代码比较

原有函数的截图

学习

  • 1. 改进前的代码实在是很麻烦啊,每一个等级的难度,我都各自设了一个对应的函数来计算他们的结果,这样子就很麻烦了,代码也很长,并且功能实际上是重复了已经,可是那时候也想过改进,可无从下手,这回有老师的代码能够参考,这样子就把这一部分的不少代码量都给省掉了
  • 2.改造后的代码也不用判断是一级难度仍是二三级难度了,直接用一个计算函数就解决了,将这些具备相同功能的代码给弄进了一个函数里面,并且特别是这个新函数代码的可读性更好了,巧妙的将字符转化为数字再累计还有对运算符号的判断,整个代码看起来更牛逼了

4.4 改进大做业总结

1. 二级三级的难度乘除法中一开始改写改着。。。随机数全都不随机了。。。三个数中必定有两个数是相同,改了特别久,原本是将随机数的出现放在一个函数中,运算符号也放在一个函数中,后来我参考了秋斌的代码还有一只调试,才发现是*exp[+(i++)]错误了,我就直接用数组方法和将计算符号的函数去掉不用函数了,这样才解决了

 2.我一开始在书写计算函数的时候也是参照老师所给的代码写的,写着在和本身原本的代码进行对比,而后。。。新代码最后算出来的result是一个数的值,这就绝了啊,最后仍是给写出来了。。。改了好久的代码。。。真的好久

 3.经过指针改进代码仍是用得少不习惯不熟悉,仍是许多不懂,有时候写完一段一编译各类编译错误,函数的封装仍是很重要的,各类衔接都很关键,若是用得好能够减小不少工做量,代码看起来也会很精简

 4.不少功能若是同样的话能够再把它封装一下,在以前也有这个想法,但是一直没实现由于函数传递参数的缘由致使要改得面目全非。如今学了指针能够直接经过改内容就能够将各类功能封装成一个函数

 5.大做业仍是有些bug没能处理,就是要判断整除的方法,我是经过Flag这个变量来判断是否能够整除,但是这样耗时就有点久了,有时候devc直接卡住了

 6.做业不能再拖了…不能再拖下去拖到最后一天才写了,根本没时间去改大做业啊,好不容易改了也是不少bug…之后不能再将做业拖着了……
相关文章
相关标签/搜索