博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言博客作业05--指针
阅读量:4567 次
发布时间:2019-06-08

本文共 4263 字,大约阅读时间需要 14 分钟。

1.本章学习总结

1.1 思维导图

1474714-20181216114144821-1268406933.png

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

1.2.1 学习体会

1.学习了指针觉得指针相对来说比较抽象,而且在上指针课之前未进行预习,所以刚开始学会比较吃力,但通过老师的课堂派pta训练相对跟上一些进度,但是对指针掌握程度相对欠缺;2.学完指针,指针的好处在函数上是一个体现,之前函数只能返回一个值;但有了指针,可以通过传递多个地址,在自己定义的函数中完成对这些地址中的值进行更改,则原函数中的变量的值也会相应更改,相当于一个函数可以传回多个值;3.学习了字符串的赋值要借助strcpy函数,不能依靠等号进行赋值,以及字符串的连接和长度比较都要调用函数来实现;4.指针传递的是地址,可以明显提高大数据传递效率;

1.2.2 代码累计

1474714-20181216221457601-89688113.png

2.PTA总分

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

1474714-20181215111845576-1415733657.png

2.2 我的总分:

  • pta总分:110分

3.PTA实验作业

3.1 PTA题目1

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

3.1.1 算法分析

定义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 ifend forif 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 代码截图

方法一:(上面的算法分析为此代码的)

1474714-20181215111337568-1619421045.png

方法二:(由于思路基本相同所以没有写算法分析;判断的条件有所不同,题目显示大小写有区分所以用大小写来判断亦可实现)

1474714-20181216142040540-1313022530.png

3.1.3 PTA提交列表及说明

1474714-20181215121118499-1353740639.png

  • Q1:刚开始提交部分错误显示“最小词,前有空格”;
  • A1:通过改变空格输出为输出来查错(如图一),发现一个单词输出后面带;通过flag判定条件解决;
  • Q2:最大句子出现运行时错误;
  • A2:将字符数组的范围调大;
  • Q3:只有一个单词的情况,程序不输出;
  • A3:在第一个for语句外单独设置一个判定条件,单独判断和输出一个单词的情况;

4.大作业

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

4.1.改造函数介绍

说明:函数1构造字符数组存放算数表达式;函数3计算出表达式的结果并将结果返回;

1.函数1

思路:生成相应的随机数和随机运算符并依次赋给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

函数代码

1474714-20181216154359329-101317863.png

1474714-20181216155449601-1086740371.png

2.函数2

判断不和法的情况已经包含在函数1中并进行了相应的注释。

3.函数3

思路:将字符数字转化为整型数字,并依次一步一步的计算并赋值给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的值

函数代码

1474714-20181216200926121-1626500707.png

1474714-20181216200851523-2055039111.png

4.2 与原有函数代码比较

  • 1.增加了一个规范不合法输入函数:void correctScanf(int *x)(如图1)

    之前还没学指针所以对返回输入值操作相对困难,然后这次更改的时候就加了这个函数,
    方便每次输入时调用;之前每次输入都得用到此代码,现在调用就可以实现,简化了代码。

    图1

    1474714-20181216214510177-1864463249.png

  • 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这样的函数封装,调用起来的灵活性比较强,而之前三个函数只能在相应等级中实现;

4.3 改进大作业总结

1.改用指针传表达式的数组和计算表达式的结果,使各个函数的分工更加明确,代码也更加有条理;2.改进过程中遇到的问题较多,也较上次复杂,如将表达式转为字符串形式,两位数和三位数的整数的转化相对复杂,但是通过上网查找资料,发现调用itoa函数就可以简单实现;3.大作业的代码相对还有欠缺,如作答是在主函数中,其实还可以用一个函数进行封装实现;4.代码量一多,函数的封装非常关键,函数封装好只要在主函数中调用就可以了,可以简化很多代码,与改进前相比,代码行数减少了一百行左右,由三百多行减少到两百多行;

大作业运行结果展示

1474714-20181217210656183-603337469.png

1474714-20181217212145419-1410074548.png
1474714-20181217212236579-2092366837.png

转载于:https://www.cnblogs.com/vanishzeng/p/10122790.html

你可能感兴趣的文章
四则运算个人项目 最终版
查看>>
java线程系列---java5中的线程池
查看>>
SQL表连接
查看>>
新秀系列C/C++经典问题(四)
查看>>
memset函数具体说明
查看>>
经常使用的android弹出对话框
查看>>
确保新站自身站点设计的合理性的六大注意点
查看>>
promise
查看>>
Go 网络编程笔记
查看>>
[]Java面试题123道
查看>>
中间件与auth认证的那点儿所以然
查看>>
Scala
查看>>
Android 中LinearLayout控件属性
查看>>
面向对象之多态性
查看>>
树状数组
查看>>
【2019.8.14 慈溪模拟赛 T1】我不是!我没有!别瞎说啊!(notme)(BFS+DP)
查看>>
多任务--进程 及 进程间通信
查看>>
多线程/多进程+QProgressBar实现进度条
查看>>
多任务(进程)案例----- 拷贝文件夹
查看>>
Kotlin的快速入门
查看>>