zoukankan      html  css  js  c++  java
  • C博客作业05—指针

    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 算法分析

    输入字符串a
    mark=strlen(a)
    for i=mark-1 to 0
        if a[i]!=空格 且 ( a[i-1]=空格 或 i = 0) //a[i]为单词首字母
            p=&a[i]
            flag++
            if flag!=1
                输出空格
            end if
            do
            {
                输出*p
                p++ //指针移到下一位
            }while *p!=空格 且 *p!=
        end if
    end for
    

    3.1.2 代码截图

    3.1.3 测试数据

    3.1.4 PTA提交列表及说明

    说明:

    Q1:数组范围不够大造成越界
    A1:数组范围加大至500001
    Q2:发现最开始的思路出现了大量重复的无用判断
    A2:修正后运行时间大幅缩短

    4.大作业

    4.1 介绍改进函数

    4.1.1 函数CreateExp

    mk标记数组初始位置
    if level=1
    mark=1 //一个操作符
    else
    mark=2 //二个操作符
    end if
    指针移动至第一个操作符
    do
    {
        do
        {
            //调用CreateOp函数填入运算符,同时指针向前移动
    
            //调用CreateNum函数填入运算数,同时指针向前移动
    
            //指针移动到下一个操作符的位置
            mark--
        }while(mark)
        *exp='='
        *exp+1='' //结束字符串
        调用CreateNum函数填入最后一个运算数
        exp=mk //指针回到字符串起始位置
    }while(调用IsExp函数查错)
    输出字符串
    


    下级函数CreateNum

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

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

    • 使用rand()%100和rand%1000时发现了神奇的bug
    • 计算式出现了不可能存在的4位数字
    • 输出三个运算数查错
    • 发现运算数没有问题
    • 观察输出的计算式 发现bug所在
    • 由于使用以下式子移动指针
    • 导致指针移动时留下了 红色标记的空位 并被随机填充
    • 将这类情况一一用IsExp函数剔除,感觉不如直接在生成时直接避免

    下级函数CreateOp

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

    4.1.2 函数IsExp

    if level=1 且 操作符 为 /
        if 运算数2 为 0
        return 1
        if  计算式不能整除
        return 1
    end if
    return 0
    


    在CreateExp函数中的使用方法

    4.1.3 函数ComputeExp

    定义数组a存放运算数和得数
    定义字符数组op存放运算符
    for (i=0 ,j=0;(exp+i)!='=';i++) //遍历计算式
        if *(exp+i)为数字
            a[j]=a[j]*10+*(exp+i)-'0' //将数字字符存入a[i]中
        else
            op[j]=*(exp+i) //运算符存入op
            j++
        end if
    根据运算符进行计算
    将结果存入a[3]
    if a[2]存在
    进行第二步运算
    将结果存入a[3]
    end if
    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
    • 有多处使用了字符串转数字/数字转字符串的操作,一时半会没法整出一个统一的函数进行转换,下次将再改进
  • 相关阅读:
    自我介绍
    秋季学期总结
    第七周编程总结
    第六周作业
    第五周编程总结
    第四周编程总结
    第三周作业
    第二周作业
    抓老鼠啊~亏了还是赚了
    币值转换
  • 原文地址:https://www.cnblogs.com/kisamko/p/10113361.html
Copyright © 2011-2022 走看看