顯示具有 C語言 標籤的文章。 顯示所有文章
顯示具有 C語言 標籤的文章。 顯示所有文章

2012-03-07

模擬對號程式

主要功能說明:
模擬對號的小程式, 此程式採用 1 ~ 45 之內的六個數字.
先輸入得獎號碼, 接著再輸入有幾組要對號, 並陸續一組一組地把六個號碼輸入, 當輸入完畢後會直接顯示每一組對中了幾組號碼.

#include<iostream>
using namespace std;

//檢測錯誤函數 
int chkwrong(int chk[],int k)
{
      int i,j; 

      for (i=0; i<6; i++)  //檢查輸入範圍是否在 1~45,及是否超過六組號碼 

           if (chk[i]>45 || chk[i]<1 || k!=10) return 1;     

        for (i=0; i<5; i++)  //檢查是否輸入重複的號碼

              for (j=i+1; j<6; j++)   

                   if (chk[i]==chk[j]) return 1; //傳回 1 表示錯誤

    return 0; //傳回 0 表示正常無誤      

}


int main()
{

       int i,j,p=0;     //變數 p 用來檢測輸入是否超過 

       int sixnum[6];   //sixnum[6]為測試是否輸入超過六組號碼 

       int buy[255][7]; //買幾組 255 為最大,第二維的第[7]個用來存放中了幾個號碼  

       cout << "輸入此回合得獎的 6 個號碼: " << endl;

       for(i=0;i<6;i++)

            cin >> sixnum[i];

       p=cin.get(); //當 p 的值為 10,表示輸入為正常六個號碼 

       if(chkwrong(sixnum,p)==1) //呼叫 chkwrong() 函數,檢測錯誤 

       {

             cout << endl << "錯誤" << endl;

       system("PAUSE"); return 0;                         

    } 

       cout << endl << "輸入你總共有幾組號碼: ";

    cin >> j;    //此處變數 j 代表有幾組 

       int temp[6]; //暫存陣列,暫時存放每組的號碼,供測試輸入錯誤用 

       for (i=0; i<j; i++)

       {

            cout << endl << "輸入你要對號的 6 個號碼: (第 " << i+1 << " 組)" << endl;             

            for(int m=0;m<6;m++)              

            {  

                 cin >> buy[i][m]; 

                 temp[m]=buy[i][m]; 

            }

            p=cin.get();  

            if(chkwrong(temp,p)==1) //呼叫 chkwrong() 函數,檢測錯誤 

      {

                  cout << endl << "錯誤" << endl;

                  system("PAUSE"); return 0;                         

            } 

            for (int k=0; k<6; k++) //比對六個號碼,中幾號

                 for (int n=0; n<6; n++)

                      if(sixnum[k]==buy[i][n]) 

                           buy[i][6]+=1; //每比對成功一個號碼就累加 1 到 buy[][6] 中 

       }



   //以泡沫排序法由大到小,比對buy[][6]陣列的最後一維(中幾號) 

   for (i=0; i<j-1; i++) 

            for (int k=i+1; k<j; k++)

                 if(buy[i][6]<=buy[k][6]) 

             swap(buy[i][6],buy[k][6]); //swap()函數為交換兩數 

              cout << endl << "結果為: " << endl;    

              for(i=0;i<j;i++) 

                   cout << buy[i][6] << " ";

              cout << endl;

   system("PAUSE"); 

   return 0; 

}


操作說明 :
輸入號碼時可以在一行中以空白隔開每一個數字號碼 , 例如 ;
12 33 03 45 19 20 (接著按 Enter) 可以不必按照順序輸入號碼

程式細部修改 :
你也可以修改 int chkwrong(int chk[],int k) 函式內的 if (chk[i]>45 || chk[i]<1 || k!=10) return 1; 這一行的數值 45, 可以改變號碼的上限.

2012-03-06

函式的呼叫與傳回值 (字串處理)

記得我之前剛接觸 C 語言的時候, 對於函式相互間的呼叫與應用花了不少時間去搞懂它, 而且學會函式間的呼叫與應用, 更是邁向物件導向程式設計的基礎, 當然 ! 在物件導向中主要是以類別 class 為基礎單位, 並非在此所談論的 "函式", 不過兩者的觀念與架構模式是很類似的, 呵呵呵 ~ 很多學程式設計的人都覺得基礎是很乏味的東西, 只想一開始就涉入最新的技術, 最後只會碰得滿頭包 ! 基礎是很重要的啊 !

設計功能如下 :

從主函式連續呼叫 getchar() 三次 (資料由鍵盤輸入), 取得三個字元變數a b c, 再由函式 char findmax(char ch1,char ch2,char ch3) 將最大的字元傳回並輸出

#include<iostream>
#include<conio.h>
using namespace std;

//getchar為保留字,不可直接用來作為函式名稱
//因此函式名稱改為 getchar2()

char *getchar2()
{
   char *gets;
   //一定要配置記憶體位置給gets, 否則執行後果無法預測(或錯誤)!
   gets=new char;
   cout << endl << "請輸入一個字元(不需按Enter)-->";
   *gets=getche();
   return gets;
}

char *findmax(char *ch1,char *ch2,char *ch3)
{
   if(*ch1>*ch2 && *ch1>*ch3) return ch1;
   if(*ch2>*ch3 && *ch2>*ch1) return ch2;
   return ch3;
}

int main()
{
   char *ch1,*ch2,*ch3;
   ch1=new char;ch2=new char;ch3=new char;
   ch1=getchar2();
   ch2=getchar2();
   ch3=getchar2();
   //在 findmax( ) 函式前加上 * 取值
   //這樣輸出的字元尾部才不會出現亂碼
   cout << endl << "傳回最大字元-->" << *(findmax(ch1,ch2,ch3)) << endl;
   system("pause");
   return 0;
}

==================================
下面這個範例與上面的程式有同工異曲之處, 請耐心解析看看其功能為何 ?

 #include<iostream>

using namespace std;

char *getfstring() //函式getfstring()
{
    char *gets;
    //一定要配置記憶體位置給gets,否則執行後果無法預測!
    gets=new char;
    cout << "請輸入一個字串-->";
    //cin >> gets; //如果使用 cin,輸入空白格時將無法讀取空白格後的字元
    // 改用 cin.getline(),這裏設最大長度為255,可自行更改數值
    cin.getline(gets,255);
    return gets;
}

int main()
{
    cout << endl << "傳回字串-->" << getfstring() << endl;
    system("pause");
    return 0;
}

2012-03-05

鍵盤輸入與傳回值輸出的示範 (使用字串)

這篇與我上一篇 po 的示範主要差別在於 "資料型態" 的處理, 處理的資料到底是 "數值" 還是 "字串" 絕對不能搞錯 ! 請一定要特別留意 ! 基本上兩者的程式架構大致相同.


建立一個函式 getfstring() 從鍵盤輸入一個字串並傳回, 不需要代入參數, 傳回值為字元指標形態. 再從主函式 main() 呼叫 getstring(), 並將傳回值輸出

#include<iostream>
using namespace std;

char *getfstring() //函式getfstring()
{
    char *gets;
    gets=new char; //一定要配置記憶體位置給gets,否則執行後果無法預測!
    cout << "請輸入一個字串-->";
    //cin >> gets; //如果使用 cin,輸入空白格時將無法讀取空白格後的字元
    // 改用 cin.getline(),這裏設最大長度為255,可自行更改數值
    cin.getline(gets,255);
    return gets;
}

int main()
{
    cout << endl << "傳回字串-->" << getfstring() << endl;
    system("pause");
    return 0;
}

鍵盤輸入與傳回值輸出的示範(使用數值)

建立一個函式 getfloat() 從鍵盤輸入一個浮點數, getfloat() 函式的傳回值為浮點數型態(float). 再從主函式 main() 呼叫 getfloat(), 並將傳回值輸出, getfloat() 函式不需要代入任何參數. 程式碼如下 :

#include<iostream>

using namespace std;

float getfloat() //函式getfloat()
{
    float getnum;
    cout << "請入一個浮點數";
    cin >> getnum;
    return getnum;
}

int main()
{
    cout << endl << "傳回值-->" << getfloat() << endl;
    system("pause");
    return 0;
}

這個範例主要是在於建立與呼叫函式的基礎練習 !

2012-03-04

陣列元素位置的起算法(二)

我在這篇中針對 [ 陣列 ] 的元素位置與順序做一番強調 ! 關於 [ 陣列 ] 元素位置的算法, 這個觀念非常非常重要 ! 如果在觀念上誤解的話, 那麼在存取陣列裡的資料時, 將會產生難以察覺的人為錯誤. 不可不慎 !

我門以下面這兩個例題來做說明 :

1.有一個二維陣列宣告如下,請問score[3][2]的值是多少?
int score[][3] = { {85,78,65},
{75,85,69},
{63,67,95},
{94,92,88},
{74,65,73} };

2.有一個二維陣列宣告如下,請問score[3][2]的值是多少?
int score[5][3] ={0};

這兩題可以用以下的程式碼來驗證 :

// c++ 程式碼
#include <iostream>
using namespace std;

int main()
{
   int score1[][3] = { {85,78,65}, {75,85,69}, {63,67,95},
                                {94,92,88}, {74,65,73} };
   cout << "score1[3][2] = " << score1[3][2] << endl;

   int score2[5][3] ={0};
   cout << "score2[3][2] = " << score2[3][2] << endl;
   system("pause");
}

題 1 答案 : 88
題 2 答案 : 0

解析 :
再度強調 ! 陣列基底由 0 起算, 不是由 1 起算 !
第 1 題 score[3][2] 的內容, 第一維陣列元素為 [3], 對應到大括號內的大括號, 我用顏色來標明 {  { .... }, { .... }, { ..... }, { .... }, { .... }  } 其元素位置相當於 0, 1, 2, 3, 4   ; 接著, 第二維陣列元素為 [2], 則表示指向上面那個紅色 { ..... } 內容中的 { 94,92,88 }, 其元素位置相當於 0, 1, 2

第 2 題 因為 int score[5][3] ={0}; 整個陣列內容都沒有設定完全, 因此二維陣列score[3][2]的內容也是一樣沒有被指定, 所以預設初值則為 0

2012-03-03

陣列元素位置的起算法(一)

這是我幫一位學生解析其程式的內容, 程式內最後 x 的值為何 ? 

#include <iostream>
using std::cout;
using std::endl;

int mystery2(const char *s);

int main( )
{
   char *string1 = "MingChi University"; //字串
   char string2[] = "Electrical Engineering";
   mystery2(&string1[2]);
   cout<< mystery2(&string2[3]) <<endl;
}

int mystery2(const char *s)
{
   static int x = 0;
   for ( ; *s != '\0' ; s++)
      x += (( *s != 'i' ) ? 1 : 0 );
   return x;
}

解析如下 :

程式中 mystery2(&string1[2]); 字串 "MingChi University" 會由第 3 個(含)算起 , 包括空白 , 於 mystery2 函式中作累計(累計的值放入 x) , 並將 "i" 省略不計 , 累計結果共 13 個字 , 接著 mystery2(&string2[3]); 字串 "Electrical Engineering" 會由第 4 個(含)算起 , 包括空白 , 同樣經過 mystery2 函式將 "i" 省略不計 , 累計共 16 個字 , 在 mystery2 函式中 x 宣告為 static , 因此執行第一次時 x 的值累計為 13 , 再執行第二次時 x 的值就從 13 開始累計 , 執行第二次完(16次) , 共累計了 13 +16 = 29 次 . 所以 x = 29 .
請注意陣列基底由0算起 .

此題目來源在以下網址 :
http://tw.knowledge.yahoo.com/question/question?qid=1607051402495

搜尋此網誌