網域名稱俱樂部


返回   網域名稱俱樂部 > 電腦與網路技術 > 電腦網路相關技術 > 一般軟體與網路使用討論
論壇幫助 社區 日曆事件 今日新文章 搜尋

回覆
 
主題工具
  #1  
舊 2014-02-23, 11:04 PM
哈啦 的頭像
哈啦 哈啦 目前離線
論壇管理員
 
註冊日期: 2002-05-28
文章: 23,011
預設 C語言在一堆數字中求眾數的問題

書上的例題,輸入二十個任意數字,然後求出現最多的那個數字。看書上用mode來代表那個數的名稱,本來還不懂為啥用mode(模式?),後來查一下才知道mode也叫「眾數」,就是一組數字中最常出現的那個數字就叫mode(眾數 Mode 指一組數據中出現次數最多的變數值)。真長了知識。

但這題真的是有看沒有懂,從oldcount=0;以下,看了一頭霧水。

代碼:
#include <stdio.h>

int main(void)
{
        int stats[20],x,y;
        int mode,count,oldcount,oldmode;
        
        printf("enter 20 numbers: \n");
        for(x=0;x<20;x++) scanf("%d",&stats[x]);
        
        oldcount = 0;

        //find the mode
        
        for(x=0;x<20;x++){
                mode=stats[1];
                count =1;
                
                //count the occurrences of this value.
                
                for(y=x+1;y<20;y++)
                if(mode==stats[y]) count++;
                
                //if count is greater than old count,use new mode.
                if(count>oldcount){
                        oldmode=mode;
                        oldcount=count;
                }
        }
        printf("the mode is %d\n",oldmode);
        return 0;
}
__________________
咖啡走路
微博


您是網站站長嗎?歡迎到站長俱樂部 一起討論吧。
按我看版規
code.club
回覆時引用此篇文章
  #2  
舊 2014-02-23, 11:27 PM
a40136 a40136 目前離線
進階會員
 
註冊日期: 2007-07-01
文章: 261
預設

想法是先假定定一個數字是眾數 mode=stats[0]; (還疑這裡寫錯)
然後去計算第一個數字在這20個數字中出現過幾次,然後去看是否會比
之前眾數次數還多(第一次一定會因為oldcount = 0),假若比之前還多
就把當下的count存入oldcount,然後把現在的數字存入oldmode,
大致上想法是這樣。
回覆時引用此篇文章
  #3  
舊 2014-02-23, 11:35 PM
哈啦 的頭像
哈啦 哈啦 目前離線
論壇管理員
 
註冊日期: 2002-05-28
文章: 23,011
預設

引用:
作者: a40136 查看文章
想法是先假定定一個數字是眾數 mode=stats[0]; (還疑這裡寫錯)
然後去計算第一個數字在這20個數字中出現過幾次,然後去看是否會比
之前眾數次數還多(第一次一定會因為oldcount = 0),假若比之前還多
就把當下的count存入oldcount,然後把現在的數字存入oldmode,
大致上想法是這樣。
thanks,我會好好去理解一下

對於mode=stats[1]這裡,確實是我第一個不解之處,後來你說應是mode=stats[0]也覺得這樣才合理。

後來實際跑了一下,好像原本的寫法答案會出錯。 所以應是state[0]才對。
__________________
咖啡走路
微博


您是網站站長嗎?歡迎到站長俱樂部 一起討論吧。
按我看版規
code.club
回覆時引用此篇文章
  #4  
舊 2014-02-24, 12:17 AM
a40136 a40136 目前離線
進階會員
 
註冊日期: 2007-07-01
文章: 261
預設

另外 mode=stats[0]; 的未置可能也放錯
回覆時引用此篇文章
  #5  
舊 2014-02-24, 12:30 AM
哈啦 的頭像
哈啦 哈啦 目前離線
論壇管理員
 
註冊日期: 2002-05-28
文章: 23,011
預設

引用:
作者: a40136 查看文章
另外 mode=stats[0]; 的未置可能也放錯
哦?

那本題應該如何寫才正確?

我剛才是有跑一次,得的答案是ok的。
__________________
咖啡走路
微博


您是網站站長嗎?歡迎到站長俱樂部 一起討論吧。
按我看版規
code.club
回覆時引用此篇文章
  #6  
舊 2014-02-24, 01:26 AM
a40136 a40136 目前離線
進階會員
 
註冊日期: 2007-07-01
文章: 261
預設

引用:
作者: 哈啦 查看文章
哦?

那本題應該如何寫才正確?

我剛才是有跑一次,得的答案是ok的。
請拿2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 (第一個2 後續皆 1)
就會發現書上的out put是2 但是正確答案應為 1

附上我的Code
(其實效率不好XD)
代碼:
#include <stdio.h>
#include <iostream>
using namespace std;
int main(void)
{
  int num[20];
  for(int i=0; i<20; i++)
  {
    cin >> num[i]; //讀入數字
  }
  int mode, max_count=0;
  for(int i=0; i<20; i++)
  {
    int count = 0;
    for(int j=0; j<20; j++)
    {
      if(num[i]==num[j])
      {
        count++; //計算每個數字出現的次數
      }
    }
    if(count>max_count) //假若出現大於之前的則替換
    {
      max_count = count;
      mode = num[i];
    }
  }
  cout << "The mode is " << mode << endl;
}
回覆時引用此篇文章
  #7  
舊 2014-02-24, 01:36 AM
哈啦 的頭像
哈啦 哈啦 目前離線
論壇管理員
 
註冊日期: 2002-05-28
文章: 23,011
預設

thanks.

我剛才再次拿mode=stats[1];和mode=stats[0];二個都去跑一次,這次果然二個全都是錯誤的結果,剛才我不知怎麼跑的?
謝謝你的code。

那如果是要修改原本的code,該如何改呢?

真奇怪,如果發生這麼多的錯誤,因為錯誤之處至少二個地方,這本書是如何通過校對的?我目前看的是這本 C語言自學手冊 第三版 ,但我買的比較早,封面不一樣。

跑了一下你的code,在include<iostream>那裡卡住,說沒有這個檔或目錄,後來我改成<iostream.h>也一樣。
另外 using namespace std; 已經超出我目前看過的東西了。

補充,當我看到cin cout時我才想到您寫的是 c++,所以就存成.cpp再去跑,就ok了。
__________________
咖啡走路
微博


您是網站站長嗎?歡迎到站長俱樂部 一起討論吧。
按我看版規
code.club
回覆時引用此篇文章
  #8  
舊 2014-02-24, 01:57 AM
a40136 a40136 目前離線
進階會員
 
註冊日期: 2007-07-01
文章: 261
預設

引用:
作者: 哈啦 查看文章
thanks.

我剛才再次拿mode=stats[1];和mode=stats[0];二個都去跑一次,這次果然二個全都是錯誤的結果,剛才我不知怎麼跑的?
謝謝你的code。

那如果是要修改原本的code,該如何改呢?

真奇怪,如果發生這麼多的錯誤,因為錯誤之處至少二個地方,這本書是如何通過校對的?我目前看的是這本 C語言自學手冊 第三版 ,但我買的比較早,封面不一樣。

跑了一下你的code,在include<iostream>那裡卡住,說沒有這個檔或目錄,後來我改成<iostream.h>也一樣。
另外 using namespace std; 已經超出我目前看過的東西了。

補充,當我看到cin cout時我才想到您寫的是 c++,所以就存成.cpp再去跑,就ok了。
稍微改過,應該正確,請參考
代碼:
#include <stdio.h>

int main(void)
{
        int stats[20],x,y;
        int mode,count,oldcount,oldmode;

        printf("enter 20 numbers: \n");
        for(x=0;x<20;x++) scanf("%d",&stats[x]);

        oldcount = 0;

        //find the mode

        for(x=0;x<20;x++){
                 mode=stats[x]; //這裡應該是要針對每個input去計算應該是每次循環
                 count = 0; //還沒開始算應該是0不是1,但大家起點相同期實不影響,只是邏輯問題

                //count the occurrences of this value.

                for(y=0;y<20;y++) //y=x+1會導致前面的沒有算到,count值會錯誤
                if(mode==stats[y]) count++;

                //if count is greater than old count,use new mode.
                if(count>oldcount){
                        oldmode=mode;
                        oldcount=count;
                }
        }
        printf("the mode is %d\n",oldmode);
        return 0;
}
回覆時引用此篇文章
  #9  
舊 2014-02-24, 02:01 AM
哈啦 的頭像
哈啦 哈啦 目前離線
論壇管理員
 
註冊日期: 2002-05-28
文章: 23,011
預設

yes, it works!! many thanks.

明天再來好好研究推敲一下。
__________________
咖啡走路
微博


您是網站站長嗎?歡迎到站長俱樂部 一起討論吧。
按我看版規
code.club
回覆時引用此篇文章
  #10  
舊 2014-02-24, 02:17 AM
a40136 a40136 目前離線
進階會員
 
註冊日期: 2007-07-01
文章: 261
預設

如果要學C、C++ 我會建議螞蟻書
http://www.books.com.tw/products/0010596321
基本上國內大專院校大多都採用這本
從基本到資料結構都有
回覆時引用此篇文章
回覆


發文規則
不可以發表新主題
不可以發表回覆
不可以上傳附件
不可以編輯自己的文章

啟用 BB 代碼
論壇啟用 表情符號
論壇啟用 [IMG] 代碼
論壇禁用 HTML 代碼



所有時間均為 +8。現在的時間是 01:28 AM


本站主機由網易虛擬主機代管
Powered by vBulletin® 版本 3.8.4
版權所有 ©2000 - 2024,Jelsoft Enterprises Ltd.