學習C語言、寫程式的好幫手『Dev-C++ 』

很多人可能想學C語言來寫程式,

雖然網路上有很多資源,不過都不知如何開始?

寫程式的第一步要找到一套適合的軟體,

如果您是初學者,而且學校都沒敎,單純想學的人,

在此向您推薦一套免費且有正體中文介面的『Dev C++

雖然,我也是9月份才開始學習寫C語言(學校課程),

老師都是要我們用微軟的『Microsoft Visual C++ 6.0

如果您堅持要用微軟產品,這一套應該適合您『Visual C++ 2005 Express Edition

(消息來源: 如何取得C(C++)設計開發軟體(編譯器整合介面))

不過您若是初學者,那套系統可能很不親切,因為它好像沒有中文介面

而『Dev C++』卻剛好相反,

它有正體中文介面,讓您學習時更多了幾分親切感~

(『Dev C++』這套程式是針對學習寫C或是C++的程式。)

DevC++安裝教學-15

【軟體名稱】:Dev-C++
【官方網站】:http://www.bloodshed.net/dev/
【下載頁面】:官方下載(英文) | 中央大學下載(中文)
【軟體介紹】:
這是一套免費並且開放原始碼的C++程式設計軟體,附上GNU GCC編譯器,體積小功能強大!! 。它包括多頁面視窗、工程編輯器,在工程編輯器中集合了編輯器、編譯器、連接程式和執行程式。也提供高亮度語法顯示的,以減少編輯錯誤。
【備註說明】:這是一套非常好用的C++物件導向式程式編輯器,C++是程序語言C的擴充,C/C++語言已經是一套古老語言,成為了很多作業系統與應用軟體的編輯大宗,環境適用於WIN95~WINXP。

(引用自:免費資源網路社群)

其實安裝不難,不過閒閒沒事,就順手寫了篇教學,參考看看吧!!

1.首先,先下載安裝檔

(在此我以 Dev-C++ 4.9.9.2版為範例)

2.點擊安裝擋,開始安裝,操作如圖!

DevC++安裝教學-1

3.等待載入

DevC++安裝教學-2

4.選擇安裝時的語言,請選『English
(註:如果選擇其他語言,在安裝過程中可能會出現亂碼)

DevC++安裝教學-3

5.點選『I Agree

DevC++安裝教學-4

6.選擇您要安裝的東西(基本上不要做任何動作),直接操作如下圖

DevC++安裝教學-5

7.選擇安裝路徑(基本上不要做任何動作),直接操作如下圖

DevC++安裝教學-6

8.是否要給全部的使用者都可以用,請點選『Yes

DevC++安裝教學-7

9.操作如圖

DevC++安裝教學-8

10.如果您有出現下圖,請操作如圖 (如果沒有遇到,請跳過此步驟)

DevC++安裝教學-未知

11.選擇『Dev-C++ 』的語系(操作如圖,選正體中文)

DevC++安裝教學-9

12.操作如圖

DevC++安裝教學-10

13.操作如圖

DevC++安裝教學-11

14.等待安裝完畢

DevC++安裝教學-12

15.完成安裝

DevC++安裝教學-13

16.它會自動啟動

DevC++安裝教學-14

17.大功告成!!

DevC++安裝教學-15

安裝方法大致如上所敘,版本的更迭,安裝方法應該不會差異多大^^

安裝好後,可能你還不知該如何使用,

請參考以下網站,相信應該對初學者有幫助^^

  1. Dev-C++ 操作指南 (繁體)
  2. Dev-C++ / Getting started (繁體)
  3. Dev-C++ 安裝&使用敎程 (簡體)

除了有了學習的工具之外,當然『教材』也是很重要的

(雖然我有紀錄上課所敎的課程,不過資源不是很齊全啦^^)

網路上的資源是十分豐富,

我就Google了一下,查到了以下幾個不錯的網站~

香腸

喜歡在網路上透過文字與圖片分文章教學,默默地用鍵盤烤了9年的香腸。另外還身兼阿腸接案餬口飯吃。對了,別叫我阿腸,請叫我香腸,這樣我才知道你看我部落格長大的。
| 個人介紹 | 更多文章 »

分類: 免費軟體
  • 吳 晁宇

    沒有中文版ㄋㄟ= =

    • 吳 晁宇

      阿等等他跑出來了= =

  • 楊博安

    #include

    #include

    int main(){

    printf(“Hello World!n");

    system(“pause");

    return 0;

    }

    這是我學校學的,執行後會跑出"Hello World!"等字樣
    但在家裡試做卻顯示"原始碼檔案無法編譯"(我已經編譯過也存在桌面了
    請問是哪裡出錯了ㄇ?

  • fireXfairy

    流程控制
    流程控制語法是程式設計的基本,藉由各種條件判斷與迴圈重覆執行語法,您可以令您的程式因應不同的狀況而作出不同的回應。
    if 條件判斷
    switch 條件判斷
    for 迴圈
    while 迴圈
    break、 continue、goto <=這三個的意思??

  • fireXfairy

    進去以後選 C專案 和 C++專案 有啥差?? 還有大大可交一下語法ㄇ??

  • 問: 我已經做上面做了,可是也無法編譯,無法執行任何檔案
    按編譯一直顯示出 c++已停止運作

    根本無法動作 …

    (範例)

    程式碼如下:

    #include

    #include

    using namespace std;

    int main(int argc, char *argv[])

    {

    system(“PAUSE");

    return EXIT_SUCCESS;

    }

    • 我的系統是 win 8 ..

    • C++ 對我來說太久遠了….無法協助orz…

    • 路過

      你後面沒事加這兩條做什麼

    • 路過
    • 路過

      ‘ ‘

    • 路過

      “"

    • 路過

      &#039&#039

    • 路過

      </iostream></cstdlib&gt

    • Oscar

      後面有錯

  • 456

    請問為啥最後成功出現的那個視窗我只按了一下,之後他閃了一下就消失了,可以讓它持續久一點嗎?要怎麼用?

  • 123

    Enter n: 1
    1
    Enter n: 2
    1
    121
    1
    Enter n: 3
    1
    2
    12321
    121
    1
    Enter n: 4
    1
    2
    3
    1234321
    12321
    121
    1

    可以教一下嗎

  • J

    少了前置處理器
    include
    include
    include

  • Henry

    請問一下:
    關於system(“pause"),我編譯後他顯示錯誤,如下
    #include

    int main(void)
    {
    float u,x,y,z,t;
    printf(“Enter x: “);
    scanf(“%f",&x);
    printf(“Enter y: “);
    scanf(“%f",&y);
    printf(“Enter z: “);
    scanf(“%f",&z);
    printf(“x= %f; y= %f; z=%f\n",x,y,z);
    t=x*y;
    t=z+t;
    u=t/3;
    printf(“u= %f. \n “,u);
    system(“pause")
    }
    也試過了cin.get();
    請問是哪裡出了問題?感謝抽空回答!!!

    香腸回應:
    我已經好幾年沒碰C了

    • 彥凱

      file name is .c

      no allow file name .cpp

    • DA

      怎麼覺的你沒有include標頭檔…….

      另外檔案可以用.cpp的~~

    • niauwu

      應該是你儲存的副檔名的關係.c才可以用system(“pause"),而.cpp用system(“pause")會出現錯誤,由於存檔時其軟體會自動幫你存為.cpp的副檔名,因此存檔時請在檔名後輸入.c

      香腸回應:
      是唷~ 因為學校老師都教C,可是要我們存成.cpp

    • 恩恩恩

      #include

      system(“PAUSE");

    • 少了以下2個標頭檔
      #include
      #include

    • 錯在第一行
      #include

      及最後一行
      system(“pause");
      少了一個";"………….

  • fbi航

    請問可以幫我用DEV C++寫開JPEG圖檔嗎= =""
    拜託~

    香腸回應:
    我C已經忘了差不多了~

  • joe

    #include
    main()
    {
    int a;
    printf(“Hi! How old are you?\n");
    scanf(“%d",&a);
    printf(“Wow! Just %d years old!\n",a);
    printf(“How young you are\n");
    scanf(“");
    }

    我在學校寫時,輸入年齡後會跑出回答
    但在家再寫一次,輸入年齡後卻跑不出回答
    而且
    若只是最簡單的
    #include
    main()
    {
    printf(“Hi! How old are you?\n");
    scanf(“");
    }
    寫出來讓它編譯時 ,雖我有寫上 scanf(“");
    ,卻還是和沒寫時一樣,一下子就消失,看不到要出來的東西

    香腸回應:
    用這套最後面好像要加上 system(“PAUSE"); 讓他暫停~避免直接終止程式

  • 煌爺

    下載完成之後你給的圖示是幹嘛的? 那樣就可以編寫哩嗎?
    我才小6 有點難 有心想學的

    香腸回應:
    建議是遇書店找找看C語言的書…買回來一步步照著做@@
    網路上雖有資源,但是散亂~

  • 風子

    你好~我是自修者,剛開始學習Dev-C++軟體,已照你寫的方式下載了,可是為什麼不管怎麼開啟新檔(不論選擇哪一種),總是出現不可編譯丫~你是否可以解說怎麼開新檔及輸入執行呢~因為看到解譯程式時總會想要輸入一遍看看跑出來的結果是不是一樣的~所以麻煩你~~教教我吧~

    香腸回應:
    開檔案應該很直覺吧@@?
    目前沒在用C了…..XD

  • Dream Sol

    有粗體為C語言重要的保留字
    例如:int、float、switch等等…

    香腸回應:
    沒錯~

  • choon choon

    谢啦大哥….
    我也来试试
    这个程式可以弄到unlock code 吗?

    香腸回應:
    unlock code?

  • 迷糊蛋

    這是用C語言寫的
    我再進行燒入時有出些問題
    我不懂這一大段程式
    老師說要分開
    那請問該如何分開呢

    ● Main.c

    #include
    #include “tick.h"
    #include “sensorin.h"

    #define WHEEL_FORWARD 1 //車輪向前
    #define WHEEL_BACK 0 //車輪向後
    #define MOTOR_ON 0 //馬達起動
    #define MOTOR_OFF 1 //馬達停止
    #define MOVING_STRAIGHT 0 //直走狀態
    #define MOVING_LEFT 1 //左轉狀態
    #define MOVING_RIGHT 2 //右轉狀態

    #define BLINKONTIME 2 //閃燈亮的時間
    #define BLINKOFFTIME 50 //閃燈滅的時間

    sbit LeftMotorDir = P3^4; //控制左馬達方向
    sbit RightMotorDir = P3^2; //控制右馬達方向
    sbit MotorSwCtrl = P3^3; //控制左右馬達電源

    sbit MotorSwLed = P3^5; //馬達起動顯示LED
    sbit RunLeftLed = P1^6; //左轉顯示LED
    sbit RunRightLed = P1^5; //右轉顯示LED
    sbit RunBackLed = P3^7; //倒轉顯示LED
    sbit BlinkLed = P1^7; //閃燈LED

    void BlinkLight(void);

    bit fBlinkOn;
    unsigned int BlinkDelay;
    unsigned int BlinkTimeRec;

    main()
    {
    unsigned int SensorStatus,LastStatus;
    unsigned char MovingDir;
    bit fMovingForward;

    //系統初始設定
    LeftMotorDir = WHEEL_FORWARD; //左馬達初始向前
    RightMotorDir = WHEEL_FORWARD; //右馬達初始向前
    MotorSwCtrl = MOTOR_OFF; //馬達關閉
    MotorSwLed = 1; //馬達起動燈號關閉

    InitSensorIn(); //起始感應輸入狀態
    InitTick(); //起始計時器
    LastStatus = SEN_None; //上一狀態設為無狀態
    fMovingForward = 1; //預設車向前走旗標
    MovingDir = MOVING_STRAIGHT; //車初始狀態設為向前狀態

    //閃燈初始設定
    fBlinkOn = 0;
    BlinkDelay = BLINKOFFTIME;
    BlinkTimeRec = GetSystemTick();

    while (1)
    {
    BlinkLight(); //閃爍燈號處理
    SensorStatus = GetSensorStatus(); //讀取按鈕感應輸入狀態
    if (SensorStatus != LastStatus) //檢查按鈕感應輸入狀態是否有改變
    {
    // 按鈕感應輸入狀態有改變, 執行相對應的功能
    switch (SensorStatus)
    {
    case SEN_Start: //馬達起動與關閉按鈕
    if (MotorSwCtrl == MOTOR_ON)
    {
    MotorSwCtrl = MOTOR_OFF;
    MotorSwLed = 1;
    }
    else
    {
    MotorSwCtrl = MOTOR_ON;
    MotorSwLed = 0;
    }
    break;

    case SEN_Forward: //向前按鈕
    // 設定車向前
    LeftMotorDir = WHEEL_FORWARD; //設定左馬達向前
    RightMotorDir = WHEEL_FORWARD; //設定右馬達向前
    RunBackLed = 1; //關閉倒車LED
    fMovingForward = 1; //設定向前旗號
    break;

    case SEN_Back: //向後按鈕
    // 設定車向後
    LeftMotorDir = WHEEL_BACK; //設定左馬達向後
    RightMotorDir = WHEEL_BACK; //設定右馬達向後
    RunBackLed = 0; //打開倒車LED
    fMovingForward = 0; //清除向前旗號
    break;

    case SEN_Left: //左轉按鈕
    if (fMovingForward)
    { //前進狀態下向左轉
    LeftMotorDir = WHEEL_BACK; //設定左馬達向後
    RightMotorDir = WHEEL_FORWARD; //設定右馬達向前
    }
    else
    { //倒車狀態下向左轉
    LeftMotorDir = WHEEL_FORWARD; //設定左馬達向前
    RightMotorDir = WHEEL_BACK; //設定右馬達向後
    }
    RunLeftLed = 0; //打開左轉LED
    MovingDir = MOVING_LEFT; //設定左轉旗號
    break;

    case SEN_Right: //右轉按鈕
    if (fMovingForward)
    { //前進狀態下向右轉
    LeftMotorDir = WHEEL_FORWARD; //設定右馬達向前
    RightMotorDir = WHEEL_BACK; //設定左馬達向後
    }
    else
    { //倒車狀態下向右轉
    LeftMotorDir = WHEEL_BACK; //設定左馬達向後
    RightMotorDir = WHEEL_FORWARD; //設定右馬達向前
    }
    RunRightLed = 0; //打開右轉LED
    MovingDir = MOVING_RIGHT; //設定右轉旗號
    break;

    case SEN_None: //其他狀態
    // 無按鈕感應
    if (MovingDir != MOVING_STRAIGHT)
    { // 在左轉或右轉中放開按鈕
    if (fMovingForward)
    { //車為向前狀態,所以讓車繼續向前
    LeftMotorDir = WHEEL_FORWARD;
    RightMotorDir = WHEEL_FORWARD;
    }
    else
    { //車為倒車狀態,所以讓車繼續向後
    LeftMotorDir = WHEEL_BACK;
    RightMotorDir = WHEEL_BACK;
    }
    RunLeftLed = 1; //關閉左轉LED
    RunRightLed = 1; //關閉右轉LED
    MovingDir = MOVING_STRAIGHT; //回到直行狀態 (前進或倒車)
    }
    break;
    default:
    break;
    }
    LastStatus = SensorStatus; //儲存此次按鈕感應狀態
    }
    }
    }

    /*—————————————————–
    閃爍燈號處理
    —————————————————–*/
    void BlinkLight(void)
    {
    if ((GetSystemTick() – BlinkTimeRec) >= BlinkDelay) //檢查閃燈亮滅時間到
    {
    BlinkTimeRec = GetSystemTick(); //記錄目前鐘控時間
    if (fBlinkOn) //是否要亮
    {
    BlinkLed = 0; //閃燈亮
    BlinkDelay = BLINKONTIME; //保持亮的時間
    fBlinkOn = 0; //亮的時間到後,處理閃燈滅
    }
    else //閃燈滅直處理
    {
    BlinkLed = 1; //閃燈滅
    BlinkDelay = BLINKOFFTIME; //保持滅的時間
    fBlinkOn = 1; //滅的時間到後,處理閃燈亮
    }
    }
    }

    ● SensorIn.h

    #define KeyPort P1 //按鈕讀取埠

    typedef enum KeyStatusEnum {
    SEN_None = 0x000,
    SEN_Start = 0x001,
    SEN_Forward = 0x002,
    SEN_Back = 0x004,
    SEN_Left = 0x008,
    SEN_Right = 0x010
    } KeyStatusType;

    #define KP_MASK (SEN_Forward | SEN_Start | SEN_Back | SEN_Left | SEN_Right)

    //#define AnyKey() ((KeyPort & KP_MASK) != KP_MASK) //檢查有無任何按鈕被按下
    #define AnyKey() ((KeyPort & KP_MASK) != 0) //檢查有無任何按鈕被按下
    //#define GetKey() ((KeyPort & KP_MASK) ^ KP_MASK) //讀取按鈕狀態
    #define GetKey() (KeyPort & KP_MASK) //讀取按鈕狀態

    unsigned char GetSensorStatus(void);

    #ifndef SENSORIN_C
    extern unsigned char KeyStatus;
    #endif

    extern void InitSensorIn(void);
    extern void ScanSensorIn(void);

    ● SensorIn.c

    #define SENSORIN_C

    #include
    #include “sensorin.h"

    #define BOUNCE_CNT 3

    typedef enum KeyPhaseEnum {
    KB_Idle,
    KB_Debounce,
    KB_Pressed
    } KeyPhaseType;

    unsigned char KeyPhase;
    unsigned char KeyStatus;
    unsigned char KeyRecord;
    unsigned char BounceTime;

    /*————————–
    掃瞄參數設定
    ————————–*/
    void InitSensorIn(void)
    {
    KeyPort |= KP_MASK; //將按鈕輸入腳設為輸入狀態
    KeyPhase = KB_Idle;
    KeyStatus = SEN_None;
    KeyRecord = SEN_None;
    BounceTime = 0;
    }

    /*————————–
    讀取按鈕掃瞄狀態
    ————————–*/
    unsigned char GetSensorStatus(void)
    {
    return KeyStatus;
    }

    /*————————–
    按鈕掃瞄階段處理
    ————————–*/
    void ScanSensorIn(void)
    {
    switch ( KeyPhase )
    {
    case KB_Idle: //閒置階段
    if (AnyKey()) //檢查有無按鈕被按下
    { //發現按鈕被按下
    BounceTime = BOUNCE_CNT; //設定彈跳過濾時間
    KeyPhase = KB_Debounce; //設定下個階段為過濾彈跳階段
    }
    break;

    case KB_Debounce: //過濾彈跳階段
    if (–BounceTime == 0) //彈跳過濾計數減1,並檢查是否為0
    { //彈跳過濾計數到時,表示按鈕狀態已穩定
    if ( AnyKey() )
    { //有按鈕被按下
    KeyStatus = GetKey();
    KeyRecord = KeyStatus;
    KeyPhase = KB_Pressed; //設定下個階段為按鈕按下階段
    }
    else
    { //沒有按鈕被按下
    KeyPhase = KB_Idle; //設定下個階段為閒置階段
    KeyStatus = SEN_None;
    }
    }
    break;

    case KB_Pressed: //按鈕按下階段
    if ( KeyRecord != GetKey() )
    {
    /* 按鈕狀態有改變, 需回到過濾彈跳階段來辨別新的按鈕狀態 */
    BounceTime = BOUNCE_CNT;
    KeyPhase = KB_Debounce;
    }
    break;

    default:
    break;
    }
    }

    ● Tick.h

    void InitTick(void);
    unsigned int GetSystemTick(void);

    ● Tick.c

    /*————————————————–
    timer#0 interrupt use number 1
    ORG 000BH
    ————————————————–*/
    #include
    #include “tick.h"
    #include “sensorin.h"

    #define TIMER_PERIOD (65536-10000) //計時器 每10ms 中斷週期

    unsigned int SystemTick;

    /*========================================================
    讀取系統計時時間
    ========================================================*/
    unsigned int GetSystemTick(void)
    {
    unsigned int time;
    time = SystemTick;
    return (time);
    }

    /*——————————————*/
    /*——————————————*/
    void InitTick(void)
    {
    SystemTick = 0;
    TMOD &= 0xf0;
    TMOD |= 0x1; /* 設定 16 位元計時 */
    TR0 = 0;
    TF0 = 0;
    TH0 = TIMER_PERIOD >> 8;
    TL0 = (unsigned char)TIMER_PERIOD;
    TR0 = 1; /* 開始計時 */
    ET0 = 1; /* 致能計時器0中斷 */
    EA = 1; /* 致能中斷開關 */
    }

    /*——————————————*/
    /*——————————————*/
    void timer0 (void) interrupt 1 using 1
    {
    TR0 = 0; //停止計時
    TH0 = TIMER_PERIOD >> 8; //重載高位元組
    TL0 = (unsigned char)TIMER_PERIOD; //重載低位元組
    TR0 = 1; //開始計時

    SystemTick++; //遞增系統計時時間
    ScanSensorIn(); //掃瞄按鈕狀態
    }

    香腸回應:
    抱歉,這個我不清楚哩….

  • 路過

    to 路過的同學
    把system(”pause”);
    改成 cin.get();

  • DENNIS

    我是高一生,老師出了一個題目
    請寫出後續運算式,而輸出其計算結果的pursudo-code
    可是我根本就不會,幫幫我 :cry:

    版主回應:
    這個你要上…「知識+」~

  • 路過的同學的同學

    既然沒辦法 我們老師居然出這種題目= =

    謝謝喔!!

    版主回應:
    可能我表達讓你不懂,以後你就會懂了 :P
    不過現在高一就要學,會不會太早了?是讀高職嗎?

  • 路過的同學的同學

    恩~ 所以若要將按請按任意鍵繼續刪掉

    又能將檔案打開 不會直接跑完

    有辦法達成嗎?

    p.s. 我是高一新生 剛開始碰dev c 一節課而已 所以不便之處 請多見諒

    版主回應:
    在DEV C++沒辦法,在visual C++才有辦法,
    因為Visual C++本身編譯後,不加system("PAUSE");
    他會有自動停止功能,他的停止是顯示英文,
    如果在visual C++加了system("PAUSE");後,
    會變成兩次停止,
    一次是顯是中文(我們自己加入的),一次顯示英文(系統的)。
    為什麼現在高一就要學阿?話說我大一才學的…Orz

  • 路過的同學的同學

    不好意思 我不太懂您的意思

    我是這麼打的

    #include
    #include
    int main()
    {
    printf(“哈囉");
    system(“pause");
    return 0;
    }

    如此 我編譯後 在執行 顯示的是 哈囉請按任意鍵繼續...

    但是把system(“pause"); 刪掉後

    按編譯 雖然這是成功的 但是按執行時檔案卻跑不出來

    這應該要如何解決呢?

    版主回應:
    這很正常阿…
    system("PAUSE");是會讓程式停住,你按任意鍵就會結束。
    如果沒放system("PAUSE");那程式就直接跑完,他不會停在你下system("PAUSE");指令上。
    我想你可能還沒考清楚system("PAUSE");的用途吧?

  • 路過的同學的同學

    不好意思 我是樓上上的同學

    我們是用DEV C++

    但是我照您所教的

    將system(”PAUSE”);刪除

    檔案就開不起來了 可以請您幫我們解答嗎?

    版主回應:
    你是說編譯之後,他沒顯是對吧?
    因為DEVC++不像visual C++一樣,系統會自動暫停在結束部分喔!
    反正你先加system("PAUSE");,當編譯可以成功後,再把他刪除,這樣程式依然是正確的。

  • dennis

    不好意思 我也是剛學c++的同學,
    老師叫我們自己在網路上自學,
    可是網路上教的都好難!
    有什麼網站是適合向高一新生的我呢?

    版主回應:
    我覺得這網站不錯,你參考看看:
    http://caterpillar.onlyfun.net/Gossip/CppGossip/CppGossip.html
    不過C++好像有兩種輸出模式,所以….你要注意一下。

  • 路過的同學

    不好意思 我是剛學c++的同學…我們老師交了一個功課給我們 就是把{請按任意鑑繼續…}這行消除 可否請大大幫我解題依下^^

    版主回應:
    你是用microsoft visual c++ 還是?
    如果是dev c++
    把 system(“PAUSE"); 刪除即可。
    哈…你應該是大一生吧^^

  • NoComment

    ㄜ….想不到還有人回覆,再次感謝。 Orz

    1.
    謝謝提醒,那些都是書上的作者寫的(像是用delete),看他執行似乎蠻順利的,
    其實我也不太清楚,自己也分不出來,但謝謝瞜!!

    2.
    ㄜ….是初學阿,
    但是多少還是會往後面的章節看,
    也會往前複習舊的章節。
    我用的原文書前半部分是C,
    C++則是後半部,
    可能因為這樣很多東西在前半部份就會出現了。0rz

  • 關於Nocommend大遇到的問題:

    1.delete是C++裡的保留字(有關動態記憶體配置),不可拿來作為變數名稱(Dev會把它變成粗體來提醒),改個名字吧。

    2.newPtr是LISTNODE型態的指標(前面已定義為LISTNODEPTR),而malloc傳回的是void指標,所以那行應該改成:

    newPtr = (LISTNODEPTR)malloc(sizeof(LISTNODE));

    還有,這不是鏈結串列嗎?為什麼初學者會看到這個0.0

  • @ c:

    感謝分享,至於留言沒出現,是防垃圾留言誤判,已經處理完了,不過我只留下你第一篇留言嚕 :)

  • c

    XD

    微軟的Visual C++ Express對我來說夠用了

    台灣中文/安裝簡易/免費….

    還附上影片教學(VB,C#,C++,J++,J#) 但影片是是英文的

    我是到MSDN那裏學的

    最近才開始玩
    http://msdn.microsoft.com/en-us/beginner/bb308891…

  • @ Nocommend:

    抱歉,我也是C++初學,而且你說的那邊我們還沒教到,我們只學到指標~~

  • Nocommend

    Gosh!!!!!那我找找好了。

    謝謝香腸。

    Sight~~~~感覺我遇到的問題都很………..。

    —–畢竟還是很嫩阿。

  • Nocommend

    To香腸版主:

    剛發現直接從Dev c++複製再貼上這邊的Blog後,

    程式碼中的字型、標點符號顯示會不一樣。 >"<

    像最開頭的header file顯示不完全,

    應該是

    #include

    #include

    我都沒發現到。

    抱歉,雖然我不清楚原因,感謝您的指正。

    DevC++可開啟的單一原始檔FIG12_3.C放在badongo的上傳空間(4kb)。
    http://dev1.badongo.com/file/9339391
    (一個備用)
    http://dev1.badongo.com/file/9339509
    希望能改善這問題,再次感謝各位的幫忙。 Orz

  • 根據我使用Visual c++ 6.0版測試,程式完全正常,如下:
    =======================================
    ——————–Configuration: FIG12_3 – Win32 Debug——————–
    Compiling…
    FIG12_3.C

    FIG12_3.OBJ – 0 error(s), 0 warning(s)
    =======================================
    既然visual沒問題,那可能是dev先天設計問題吧?或許您可能要改用一下visual喔~(記得書本有附光碟!!)

  • @ nocommand:

    根據你前面給我的程式碼,我改用visuall編譯,編譯後出現十分多錯誤(102個錯誤,3個警告),詳細情形在下面這檔案中!

    http://s9011514.googlepages.com/cppq.txt

  • nocommand

    順便補一下Complie Log

    Compiler: Default compiler

    Executing gcc.exe…

    gcc.exe "C:FIG12_3.C" -o "C:FIG12_3.exe" -I"C:Dev-Cppinclude" -L"C:Dev-Cpplib"

    C:FIG12_3.C:14: error: expected unqualified-id before "delete"

    C:FIG12_3.C:14: error: expected `,' or `;' before "delete"

    C:FIG12_3.C: In function `int main()':

    C:FIG12_3.C:43: error: type `char' argument given to `delete', expected pointer

    C:FIG12_3.C: In function `void insert(LISTNODE**, char)':

    C:FIG12_3.C:82: error: invalid conversion from `void*' to `LISTNODE*'

    C:FIG12_3.C: At global scope:

    C:FIG12_3.C:110: error: expected unqualified-id before "delete"

    C:CH12FIG12_3.C:110: error: expected `,' or `;' before "delete"

    Execution terminated

  • nocomand

    先謝謝二位的回答。

    To 香腸,

    該書作者的網站都有提供書中範例的程式碼。

    To +6,

    編譯(Compile按下C+F9)時,

    隨即視窗下方的Compiler標籤會出現一些訊息(message),

    我抓了一張圖像,附上2個不同的網址。

    http://img293.imageshack.us/my.php?image=31445651…

    http://img2.freeimagehosting.net/image.php?ef8bfb…

    再次感激,畢竟自己摸索C語言有時遇到小細節耽誤都會沒法處理。

  • +6

    編譯(complie)時卻不順利

    請問不順利是說?

    error? waring?

    還是會跑出來當機呢?

  • @ nocomand:

    雖然我推薦這套,但是學校使用的都是微軟產品,因此我都是使用VISUAL,如果不能使用,你可以安裝你書本後面光碟片中應該有程式。

    你的書和我的一樣,不過指標這部分我不熟,至於詳細情形我無法回答你,抱歉!

    換個軟體試試看,或是到微風、知識家協尋^^||

  • nocomand

    不好意思,因為最近在學C語言,

    用的是DEV c++ 4.9.9.2 編譯器,

    但編譯(complie)時卻不順利,

    我是自修的,書本是C : How to program./Deitel

    是有注意到程式中其中一個函數(function)的名稱會顯示成粗體字,

    char delete(LISTNODEPTR *, char);

    delete會顯示成粗體字,

    另外

    newPtr = malloc(sizeof(LISTNODE));

    也顯示有誤

    想請問這該如何處理?

    以下附上課文中的範例,

    謝謝。

    /* Operating and maintaining a list */

    #include

    #include

    struct listNode { /* self-referential structure */

    char data;

    struct listNode *nextPtr;

    };

    typedef struct listNode LISTNODE;

    typedef LISTNODE *LISTNODEPTR;

    void insert(LISTNODEPTR *, char);

    char delete(LISTNODEPTR *, char);

    int isEmpty(LISTNODEPTR);

    void printList(LISTNODEPTR);

    void instructions(void);

    main()

    {

    LISTNODEPTR startPtr = NULL;

    int choice;

    char item;

    instructions(); /* display the menu */

    printf("? ");

    scanf("%d", &choice);

    while (choice != 3) {

    switch (choice) {

    case 1:

    printf("Enter a character: ");

    scanf("n%c", &item);

    insert(&startPtr, item);

    printList(startPtr);

    break;

    case 2:

    if (!isEmpty(startPtr)) {

    printf("Enter character to be deleted: ");

    scanf("n%c", &item);

    if (delete(&startPtr, item)) {

    printf("%c deleted.n", item);

    printList(startPtr);

    }

    else

    printf("%c not found.nn", item);

    }

    else

    printf("List is empty.nn");

    break;

    default:

    printf("Invalid choice.nn");

    instructions();

    break;

    }

    printf("? ");

    scanf("%d", &choice);

    }

    printf("End of run.n");

    return 0;

    }

    /* Print the instructions */

    void instructions(void)

    {

    printf("Enter your choice:n"

    " 1 to insert an element into the list.n"

    " 2 to delete an element from the list.n"

    " 3 to end.n");

    }

    /* Insert a new value into the list in sorted order */

    void insert(LISTNODEPTR *sPtr, char value)

    {

    LISTNODEPTR newPtr, previousPtr, currentPtr;

    newPtr = malloc(sizeof(LISTNODE));

    if (newPtr != NULL) { /* is space available */

    newPtr->data = value;

    newPtr->nextPtr = NULL;

    previousPtr = NULL;

    currentPtr = *sPtr;

    while (currentPtr != NULL && value > currentPtr->data) {

    previousPtr = currentPtr; /* walk to … */

    currentPtr = currentPtr->nextPtr; /* … next node */

    }

    if (previousPtr == NULL) {

    newPtr->nextPtr = *sPtr;

    *sPtr = newPtr;

    }

    else {

    previousPtr->nextPtr = newPtr;

    newPtr->nextPtr = currentPtr;

    }

    }

    else

    printf("%c not inserted. No memory available.n", value);

    }

    /* Delete a list element */

    char delete(LISTNODEPTR *sPtr, char value)

    {

    LISTNODEPTR previousPtr, currentPtr, tempPtr;

    if (value == (*sPtr)->data) {

    tempPtr = *sPtr;

    *sPtr = (*sPtr)->nextPtr; /* de-thread the node */

    free(tempPtr); /* free the de-threaded node */

    return value;

    }

    else {

    previousPtr = *sPtr;

    currentPtr = (*sPtr)->nextPtr;

    while (currentPtr != NULL && currentPtr->data != value) {

    previousPtr = currentPtr; /* walk to … */

    currentPtr = currentPtr->nextPtr; /* … next node */

    }

    if (currentPtr != NULL) {

    tempPtr = currentPtr;

    previousPtr->nextPtr = currentPtr->nextPtr;

    free(tempPtr);

    return value;

    }

    }

    return '';

    }

    /* Return 1 if the list is empty, 0 otherwise */

    int isEmpty(LISTNODEPTR sPtr)

    {

    return sPtr == NULL;

    }

    /* Print the list */

    void printList(LISTNODEPTR currentPtr)

    {

    if (currentPtr == NULL)

    printf("List is empty.nn");

    else {

    printf("The list is:n");

    while (currentPtr != NULL) {

    printf("%c –> ", currentPtr->data);

    currentPtr = currentPtr->nextPtr;

    }

    printf("NULLnn");

    }

    }

  • @ 老新手:

    OK,他有支援VISTA喔!

  • 老新手

    不好意思想請問一下.這一套軟體有支援VISTA嗎……

  • @ 初學著:

    其實我也只是初學者,和你一樣,我也是為大一新生~

    要我推薦我真的事不知如何回答你?

    趁寒假有空時,去重慶南路逛逛,去那邊找找看吧~

    自己找會比別人推薦來的好^^

  • 初學著

    我想請問一下,我是大一生,如果下學期老師要用

    DEV C++ 教我們寫程式,在市面上有哪些書是我是用的呢?(最好是中文版)~~感謝各位大大

  • to SAM:

    參考書籍?

    你是說C++嘛?

    市面上有很多呀^^

  • SAM

    那邊有參考書籍呢哪邊可以買到參考書籍呢

  • to Mr. Saturday:

    這的確是個好東西,對於新手真的算是很棒的工具!

    感謝你的光臨,您的Mr./Ms. Days也分享了很多好文章~

    這是大家有目共睹的^^

  • 我也非常喜歡這套軟體,小巧好用,容易上手,很少有 IDE 這麼適合初學者了.謝謝分享 :D

  • to 好手:

    這套軟體的確不錯用,因為Microsoft Visual C++老是掛掉、系統錯誤,

    真的很不好用,也沒親切的中文介面,和Dev-c++的安裝檔相比,簡直是天壤之別因為Dev-c++好像10MB以內而已~

  • Wow~~四年前大一的時候C++就用這套的,想不到現在還有繼續在更新~呵呵…

    Dev C++ 真的是初學者的一個不錯的幫手^^"