期中上机崩盘考

很常规的一道题,半小时不到写完,然后反反复复调试了一个多小时才找到了问题所在,导致第二题直接没写完,总评啪的就直接下90了(最终倒是没下,可能调规则了)。真的及其恼火,考试水逆也不是一次了,上学期期末上机同样状况连连,有必要提点提点,以此为戒。

题目描述简化为:从单行输入(程序语句,以';'作结)中提取合法标识符,在输出中按字母序降序输出所有无重复标识符。

基本想法
1.读取输入于数组buf
2.int i遍历buf:遇目标字符则持续记录在tmp构成标识符;遇非目标字符则完结当前标识符进行存储操作,同时重新开始记录

    for(i=0,cnt=0;buf[i]!=';';i++)
    {
        if(isident(buf[i])) tmp[cnt++]=buf[i];//判断目标字符isident()
        else if(cnt!=0)
        {
            tmp[cnt]='\0';
            readInOrder(tmp);//存储操作readInOrder()
            cnt=0;
        }
    }

3.判断操作:
输入的标识符有可由“字母、数字、下划线”组成,但数字又不能开头。这里便先读入“数字开头的非法标识符”,在存储操作中筛去(及isdigit(tmp[0])

int isident(char c) { return isdigit(c) || isalpha(c) || c=='_'; }
//这里||很容易手顺写成&&

4.存储操作:
readInOrder(tmp)这里为方便有序插入,使用链表;增加“去数字开头非法标识符”“去重复标识符”操作

核心bug源起

1.在readInOrder()中的去重操作

if(strcmp(q->ch,p->ch)==0) //p为待添加结点,q从list开始运动到待插入位置之后
{
    free(p);
    return;
}

q可能移至list末端,此时q为NULL,怎么能q->ch呢!所以爆炸,1h后检查出:要加上q!=NULL

2.main函数中for循环结束后

最后的tmp[0..cnt-1]并未接受处理,有概率拉掉最后一个标识符的读入!这一点在很多类似操作中都有遇到,之前也错过,结果不长记性!

总体反思

1.编程能力本身
 自以为链表比较简单,没有多少在意。然而做了几周栈的题目,链表的操作竟然显得生疏。对部分链表操作的经典雷区变的不够警醒;以前花大力气写的题目,过一段时间可能又觉得令人头大。

 需要持续的练习(一曝十寒...)->练习时有及时记录(经典操作,经典雷区)->经典操作是否应该多敲敲。

 究竟怎样最大效率地拥有高超而稳定的编程能力?需要具备什么样的长期素质?要时刻去想去领会。

2.高效调试能力
那么一个小错误,那么几行代码,调试了那么久,很大程度是调试能力和调试心态的问题。以后少找助教,多加限时调试/

  1. 对程序块要杀伐果断,确认无误便不再怀疑;
  2. 调整合适的调试输出格式并不误砍柴功,胡乱输出+瞎蒙修正多半提供无效调试;
  3. 确认程序爆炸处:从“在循环/函数的开始/结尾处输出”切入,一个循环一个循环向下依次输出,查看阻塞部分,多半比较清晰

不要有那种一定要做完的着急心态,躺平面对一切永远是最稳定最佳的,但这也需要平时到位的练习

posted @ 2021-05-07 15:44  Xlucidator  阅读(47)  评论(0编辑  收藏  举报