幫朋友分析程序--新手看看
    查看(1200) 回復(0)
    lyh2006
    • 積分:1982
    • 注冊于:
    發表于
    樓主
    考研之路已結束,閑得無聊,正好一個今年跨考的朋友叫我幫他看看寫的代碼為什么運行不了,就分析了一下,
    發現了一些常見的問題,這正是不會寫代碼的新人常見的問題,于是就發上來了.新手可以看看,高手就不用看笑話了.
    如果發現自己動力能力很差的同學,也可以看看,從中找找啟發.
           部分代碼:
    復制內容到剪貼板
    代碼:
    #define maxsize 50
    typedef int type;
    typedef struct
    {
            type  elem[maxsize];
            int length;
    }sqlist;
    void initlist(sqlist *l)
    {
            l=(sqlist *)malloc(sizeof(sqlist));
            l->length=0;
    }
    int listinsert(sqlist *&l,int i,type e)
    {
            int j;
            if(i<1||i>l->length+1)
                    return 0;
            i--;
            for(j=l->length;j>i;j--)
                    l->elem[j]=l->elem[j-1];
            l->elem=e;
            l->length++;
            return 1;
    }
    ......
    main()
    {
            sqlist *l;
            type x;
            initlist(l);
            listinsert(l,1,1);
            listinsert(l,2,2);
    ......
    1.這個sqlist跟本沒有價值.
    明顯作者意圖是寫一個鏈表.但鏈表的特點是什么?是方便插入刪除運算,大小易擴充.
    而這里用的靜態數組實現,還define了maxsize,而insert中也沒有重分配空間的意圖.鏈表的特點在這里完全沒有體現出來.
    插入刪除需要大量元素移動,malloc一個固定大小出來,大了是浪費,小了就沒用了.
    這些是學習數據結構是要理解的基礎東西.每一種數據結構存在的優缺點一定要弄清楚.
    2.代碼風格
    看這種風格就知道又是嚴奶奶"類C"的受害者.特別是把C++的引用搞到C上面,害了多少初學者.
    對于C,可以看到很多代碼都是直接把結點指針就定義成鏈表類型了.
    #define list node*
    而對于C++,則采用類,類中封裝頭結點(指針),可能還會封裝length,在構造函數中初始化.
    class list
    {
      node* head;
      int length;
    };
    這些東西混用之后就有點四不像的感覺了.特別是現在看sqlist *&l 這樣的東西覺得特別扭(雖然一年前我也寫這種句子).
    按C的習慣,可以選擇用指針實現引用的功能.C代碼中是沒有引用的.但可以用sqlist **l 呀.
    其實這里 initlist按C風格來做,可以用個宏來寫,還更美觀些而且不會出現弄不清引用,參數傳遞等容易犯的錯誤.
    復制內容到剪貼板
    代碼:
    #define INITLIST(l) do{           
      l=(sqlist *)malloc(sizeof(sqlist));   
      l->length=0;}while(0)   
    如果看過linux內核的代碼,就會發現很多地方都用這類的宏.反正感覺是比類C看起來地道.
    3.函數參數傳遞
    這是新手最容易出的問題.我拿到代碼就編譯,運行后內存錯誤.然后就發現initlist沒能正確地完全任務
    再看發現 void initlist(sqlist *l) 這里,l傳值進去后的修改是不會返回到實參的,新手在這些地方很容易出錯.
    C語言的基礎一定要學扎實.這里可以改一改,比如以引用方式傳void initlist(sqlist * &l).或者我上面也寫了,用宏實現就沒有傳參的問題.
    而后面那個listinsert不必用傳引用的方式,因為在函數內部修改的不是sqlist指針而是其指向的空間.這里可以看出來我這位朋友對函數參數傳遞還是沒理解透.
    希望對這個還不熟的朋友們都回顧一下.
    4.文件包含問題
    朋友把代碼發給我的時候亂七八糟的,上面已經是整理過后的片斷了.原始的上面還好多extern...函數定義和聲明都放的.cpp,還把cpp文件都include進去...
    文件包含其實說簡單很簡單,說深很深.反正記住是聲明放在頭文件,實現放在cpp文件中.
    以上是不會寫代碼的人要克服的基本問題.只是一個簡單的分析.
    當然我朋友跨考的,確實這些地方還很不足.其實去年我也是這種樣子,嘿嘿.
    各位研友可以看看自己存在哪些類似的問題并引起注意.動手能力也是慢慢練上來的.多動手就容易了.
    最后祝11的研友好運~

    回復話題
    上傳/修改頭像

    目前中國有20元紙幣嗎?

    考研論壇提示:
    1、請勿發布個人聯系方式或詢問他人聯系方式,包括QQ和手機等。
    2、未經允許不得發布任何資料出售、招生中介等廣告信息。
    3、如果發布了涉及以上內容的話題或跟帖,您在考研網的注冊賬戶可能被禁用。

    網站介紹 | 關于我們 | 聯系方式 | 廣告業務 | 幫助信息
    ©1998-2015 ChinaKaoyan.com Network Studio. All Rights Reserved.

    中國考研網-聯系地址:上海市郵政信箱088-014號 郵編:200092 Tel & Fax:021 - 5589 1949 滬ICP備12018245號

    亚洲av中文无码| 中文字幕国产精品| 久别的草原在线影院电影观看中文| 日韩精品无码一区二区三区四区| 无码人妻AⅤ一区二区三区水密桃 无码欧精品亚洲日韩一区夜夜嗨 无码免费又爽又高潮喷水的视频 无码毛片一区二区三区中文字幕 无码毛片一区二区三区视频免费播放 | 中文成人无码精品久久久不卡 | 我的小后妈中文翻译| 久久人妻少妇嫩草AV无码蜜桃| 亚洲乱亚洲乱妇无码麻豆| 最近2019在线观看中文视频| 日韩精选无码| 蜜桃臀无码内射一区二区三区| 中文字幕永久一区二区三区在线观看 | 熟妇人妻中文a∨无码| 色欲狠狠躁天天躁无码中文字幕| 精品久久久久久无码专区不卡| 一夲道DVD高清无码| 精品人妻va出轨中文字幕| 人妻少妇看A偷人无码精品视频| 无码h黄动漫在线播放网站| 中文无码制服丝袜人妻av| 日韩精品一区二三区中文| 久久精品天天中文字幕人妻| 亚洲Av无码乱码在线播放| 精品三级AV无码一区| 无码日韩精品一区二区三区免费| 一本精品中文字幕在线| 中文无码不卡的岛国片| 中文成人久久久久影院免费观看| 中文字幕在线观看亚洲日韩| 亚洲中文久久精品无码ww16| 中文在线最新版天堂bt| 亚洲国产综合无码一区二区二三区| 狠狠躁狠狠躁东京热无码专区 | 国产成人精品无码片区在线观看 | 本道天堂成在人线av无码免费| 亚洲va中文字幕无码久久 | 少妇无码一区二区二三区| 无码精品日韩中文字幕| 无码精品国产VA在线观看DVD| 无码午夜人妻一区二区三区不卡视频|