1.本章学习总结

1.1思维导图

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

1.2.1 学习体会

  • 理解了指针在代码中的使用方法,学会使用指针进行参数操作
  • 学会了结构体的定义方式与结构体的使用
  • 经过持续一个周末的大作业重写,加强了指针在函数中的应用,学会利用数组与指针的关系进行操作

1.2.2 代码累计

2.PTA总分

2.1截图PTA中的排名得分

2.2 我的总分

指针:125

总分:125

3. PTA实验作业

3.1 PTA题目1

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

3.1.1 算法分析

  1. 输入字符串a
  2. mark=strlen(a)
  3. for i=mark-1 to 0
  4. if a[i]!=空格 ( a[i-1]=空格 i = 0 //a[i]为单词首字母
  5. p=&a[i]
  6. flag++
  7. if flag!=1
  8. 输出空格
  9. end if
  10. do
  11. {
  12. 输出*p
  13. p++ //指针移到下一位
  14. }while *p!=空格 *p!=\0
  15. end if
  16. end for

3.1.2 代码截图

3.1.3 测试数据

3.1.4 PTA提交列表及说明

说明:

Q1:数组范围不够大造成越界

A1:数组范围加大至500001

Q2:发现最开始的思路出现了大量重复的无用判断

A2:修正后运行时间大幅缩短

4.大作业

4.1 介绍改进函数

4.1.1 函数CreateExp

  1. mk标记数组初始位置
  2. if level=1
  3. mark=1 //一个操作符
  4. else
  5. mark=2 //二个操作符
  6. end if
  7. 指针移动至第一个操作符
  8. do
  9. {
  10. do
  11. {
  12. //调用CreateOp函数填入运算符,同时指针向前移动
  13. //调用CreateNum函数填入运算数,同时指针向前移动
  14. //指针移动到下一个操作符的位置
  15. mark--
  16. }while(mark)
  17. *exp='='
  18. *exp+1='\0' //结束字符串
  19. 调用CreateNum函数填入最后一个运算数
  20. exp=mk //指针回到字符串起始位置
  21. }while(调用IsExp函数查错)
  22. 输出字符串



下级函数CreateNum

  1. 根据level生成随机数
  2. do
  3. {
  4. p-- //指针前移
  5. *p=a[i]%10+'0'
  6. a[i]=a[i]/10
  7. }while(a[i]!=0)
  8. 返回指针位置

关于函数CreatNum中为什么不使用rand()%100和rand%1000

  • 使用rand()%100和rand%1000时发现了神奇的bug

  • 计算式出现了不可能存在的4位数字
  • 输出三个运算数查错

  • 发现运算数没有问题
  • 观察输出的计算式 发现bug所在
  • 由于使用以下式子移动指针

  • 导致指针移动时留下了 红色标记的空位 并被随机填充

  • 将这类情况一一用IsExp函数剔除,感觉不如直接在生成时直接避免

下级函数CreateOp

  1. 根据level生成除数num
  2. flag=rand()%num
  3. 根据flag生成相应运算符
  4. *q=生成的运算符
  5. 返回指针位置

4.1.2 函数IsExp

  1. if level=1 操作符 /
  2. if 运算数2 0
  3. return 1
  4. if 计算式不能整除
  5. return 1
  6. end if
  7. return 0



在CreateExp函数中的使用方法

4.1.3 函数ComputeExp

  1. 定义数组a存放运算数和得数
  2. 定义字符数组op存放运算符
  3. for (i=0 ,j=0;(exp+i)!='=';i++) //遍历计算式
  4. if *(exp+i)为数字
  5. a[j]=a[j]*10+*(exp+i)-'0' //将数字字符存入a[i]中
  6. else
  7. op[j]=*(exp+i) //运算符存入op
  8. j++
  9. end if
  10. 根据运算符进行计算
  11. 将结果存入a[3]
  12. if a[2]存在
  13. 进行第二步运算
  14. 将结果存入a[3]
  15. end if
  16. return a[3] //返回正确答案

4.2 和原版的比较

4.2.1 函数CreateExp

原版代码:



  • 原版的生成运算符方式头异常的铁,使用嵌套二层switch把所有可能的情况全部列举出来,形成大量重复代码
  • 新版代码采用指针移动的方法输入字符,简化了整个函数
  • 原版直接输出计算式的符号与数字
  • 新版将计算式存入字符串后输出,同时也将计算式保留,使函数ComputeExp可以使用该计算式

4.2.2 函数IsExp

emmm原版根本没有这个函数

4.2.3 函数ComputeExp

原版代码:(见4.2.1图)

  • 原版代码在生成运算符后立即对前后两个运算符进行运算,思路过于直白,重复代码过多
  • 新代码将输出的字符串逆向转换为数字和运算符,并计算出正确答案

4.3 改进大作业总结

  • 原版的大作业只用了183行代码/三个函数完成了四则运算的操作,而且检查输入错误的方法异常诡异,完全没有半点改的空间
  • 主要是因为某位老哥在他上次的作业完美重现了我诡异的代码,事实证明改了变量名代码查重就没用了,我想看一下那位老哥要厉害到什么程度才能改我上次做的神奇玩意
  • 所以本次大作业除了输入提示和上次长得一样,其它全盘推翻重写
  • 学会细化函数的分工,使main函数尽可能简洁
  • 用输入字符串代替输入字符,防止程序出错
  • 用指针代替了全局变量实现函数间参数改变
  • 用查错函数IsExp解决了小学生四则运算中出现的我也不会做的题,如:3/7
  • 有多处使用了字符串转数字/数字转字符串的操作,一时半会没法整出一个统一的函数进行转换,下次将再改进

C博客作业05—指针的更多相关文章

  1. C语言博客作业05——指针

    1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量 1.2.1学习体会 可能因为之前数组那块儿的作业拖得太久了,以至于我觉得指针学的好快,还没反应过来就教完了,然后一开始做题的时候,就是一脸 ...

  2. C语言l博客作业05

    问题 回答 这个作业属于哪个课程 C语言程序设计ll 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-2/homework/9830 我在这 ...

  3. C语言I博客作业05

    内容 答案 这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 C语言I作业05 我在这个课程的目标是 更熟练的运用编译函数问题 这个作业在哪个具体方面帮助我实现目标 PTA实验作业 参考文 ...

  4. C语言|博客作业05

    这个作业属于哪个课程 C语言程序设计II 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/9825 我在这个课程的 ...

  5. c语言1博客作业05

    一.本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-3/homework/9831 我 ...

  6. C语言Ⅰ博客作业05

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/9827 我在这个课程的目 ...

  7. C语言博客作业05

    这个作业属于哪个课程 C语言程序设计II 这个作业要求在那里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/9827 我在这个课程的目 ...

  8. DS博客作业05——树

    1.本周学习总结 1.1思维导图 1.2学习体会 学习:相比于之前的数据结构,树多了很多性质,相应的也多了很多计算题,不得不说,专有名词也是颇多.觉得树最独特的地方就是它的兄弟.孩子结点,用以组成了它 ...

  9. DS博客作业05—树

    1.本周学习总结 1.1思维导图 1.2学习体会 本周学习了树的相关知识,了解了树结构体的应用和基本操作 学习了二叉树的遍历,创建以及哈夫曼树的相关操作 通过树的构建等操作熟练了递归的使用 2.PTA ...

随机推荐

  1. FoxPro 游标指针操作

    查询上一记录skip -1 *相对定位 指针向上移动一条记录if bof() *测试当前记录指针是否超出第一条记录  go top *绝对定位表的第一条记录endifthisform.refresh ...

  2. my sql存储过程 基本使用

    --------------创建不带参数的存储过程----------------- DELIMITER;; drop PROCEDURE if EXISTS selectStudent; creat ...

  3. 对List集合进行排序

    一.说明 使用Collections工具类的sort方法对list进行排序 新建比较器Comparator 二.代码 排序: import java.util.ArrayList; import ja ...

  4. C++ 20170807

    mesos/3rdparty/stout/include/stout/err.hpp=======================================================str ...

  5. js练习 closure

    window.onload = function() {            for (var i = 1; i < 4; i++) {                var id = doc ...

  6. Redis 授权操作

    [Redis 授权操作] AUTH password 通过设置配置文件中 requirepass 项的值(使用命令 CONFIG SET requirepass password ),可以使用密码来保 ...

  7. etcd 命令行

    比较重要的配置 -name 节点名称,默认是UUID-data-dir 保存日志和快照的目录,默认为当前工作目录-addr 公布的ip地址和端口. 默认为127.0.0.1:2379-bind-add ...

  8. java webservice maven spring Class Not Found Exception解决

    project clean——>maven clean——>update maven ——>server clean——>build project ——>maven i ...

  9. http://classworlds.codehaus.org/apiusage.html

    API Usage The Java API can be used to create new realms and connect realms together through importat ...

  10. Openssl dgst命令

    一.简介 消息摘要可以对任意长度的消息产生固定长度(16或20个字节)的信息摘要,理论基于单向HASH函数,根据消息摘要无法恢复出原文,所以是安全的:消息原文和消息摘要是一一对应的,所以又被称作指纹. ...