Zclub討論區 Z板

 找回密码
 註冊
搜索
楼主: 萬能版zclub

救命啊~~~C++

[复制链接]
发表于 2004-6-20 00:35:34 | 显示全部楼层

輸入六個阿拉伯數字,重複會顯示"TRY AGAIN"

#include<stdio.h>
#include<stdlib.h>
#define time 6

void main(){
 int num[time], i=0, j, sw=1;
 clrscr();

 while( i<time ){
  scanf( "%d", &num[i] );
  if( i==0 ){
   i++;
   continue;
  }
  for( j=i-1; j>=0; j-- ){
   if( num[i]==num[j] ){
    printf( "Try again!\n");
    sw=0;
    break;
   }
   sw=1;
  }
  if(sw)  i++;
 }
}

回复

使用道具 举报

发表于 2004-6-20 00:47:31 | 显示全部楼层
回覆給:陳
好奇怪唷~~~~我放在Dev c++不行執行也^^"~~~怎麼會這樣???
回复

使用道具 举报

发表于 2004-6-20 00:54:55 | 显示全部楼层

我是用TURBO C 2.0 寫的,哪裡有問題把錯誤訊息貼出來看看唄.

回复

使用道具 举报

发表于 2004-6-20 01:04:14 | 显示全部楼层
我剛剛安裝DEV C++ 2.0 版
你把第七行 clrscr(); 刪掉試試
回复

使用道具 举报

发表于 2004-6-20 01:08:36 | 显示全部楼层
回覆給:陳
5 `main' must return `int'
    [Warning] In function `int:
7`clrscr' undeclared
7 (Each undeclared
/Documents and Settings/阿國/My Documents/963.cpp C:\Documents and Settings\阿國\My Documents\C
At global scope:
25stray '\32' in program
看不懂@@
回复

使用道具 举报

发表于 2004-6-20 01:21:12 | 显示全部楼层
訊息5: 是警告,main傳回值可以省略


錯誤訊息7:
7`clrscr' undeclared
把clrscr那行刪掉

7 (Each undeclared
/Documents and Settings/阿國/My Documents/963.cpp C:\Documents and Settings\阿國\My Documents\C
At global scope:
看不太懂,但我想是中文"阿國"導致,你把檔案存到英文路徑下,例如:
c:\963.cpp


訊息25我猜不出來代表什麼意思?
25stray '\32' in program
程式路徑32???
回复

使用道具 举报

发表于 2004-6-20 01:22:15 | 显示全部楼层
包牌是啥?我不玩樂透彩
回复

使用道具 举报

发表于 2004-6-20 01:27:41 | 显示全部楼层
7 (Each undeclared
/Documents and Settings/阿國/My Documents/963.cpp C:\Documents and Settings\阿國\My Documents\C
At global scope:

DEV  C++程式檔案必須儲存在全域範圍之內。
" /Documents and Settings/阿國/My Documents/  "是個私人路徑,
XP系統有使用權之分別,你把檔案963.CPP儲存到別的地方即可。
回复

使用道具 举报

发表于 2004-6-20 03:21:26 | 显示全部楼层

回覆給 萬能版zclub:

/*

那個project所在的電腦現在不在我身邊, 你如果真的要我寄給你source code的話那也是下星期三的事了(星期三我才會用到我那台電腦)

你最好真的想清楚你是否真的要我寄給你, 那你可會失去讓自己成長的一次機會
不管是在軟體方面的技術成長或是思考上面的開竅那對你都很有幫助(如果是你自己想出來的)

寫程式的演算法則可以有很多種, 我現在大概寫給你一個概念如下:

*/

void main()  // This void may be a routine of button class in Visual C++.
{
 int Num[6];  // 6 Numbers of 42 balls.
 int tmp = 0;  // For temp value.
 bool Jud;  // For general judgment.

 for ( int n = 0; n < 6; n++ )
 {
  
   Jud = false;  // Give Jud a initial/routine value;

   while( Jud == false )
   {
     /*
       Seed the random-number generator with current time so that
       the numbers will be different every time we run.
     */
     srand( (unsigned)time( NULL ) );

     /*
       Get the random value. I test rand() in AMD CPU(K7), but
       sometimes it return negative.
     */
     tmp = abs( rand() );

     while ( tmp > 42 )
     {
       tmp = tmp / 3;  // I don't care what value of tmp, just process it to conform to 1 ~ 42.
     }

     Num[n] = tmp;  // Stuff the result into Num array.

     switch( n )
     {
       case 0:
         Jud = true;
         break;

       case 1:
         if ( Num[1] != Num[0] )
         {
           Jud = true;
         }
         break;

       case 2:
         if ( (Num[2] != Num[1]) || (Num[2] != Num[0]))
         {
           Jud = true;
         }
         break;

       case 3:
         if ( (Num[3] != Num[2]) || Num[3] != Num[1] ||
              (Num[3] != Num[0]) )
         {
           Jud = true;
         }
         break;

       case 4:
         if ( (Num[4] != Num[3]) || (Num[4] != Num[2]) ||
              (Num[4] != Num[1]) || (Num[4] != Num[0]) )
         {
           Jud = true;
         }
         break;

       case 5:
         if ( (Num[5] != Num[4]) || (Num[5] != Num[3]) ||
              (Num[5] != Num[2]) || (Num[5] != Num[1]) ||
              (Num[5] != Num[0]) )
         {
           Jud = true;
         }
         break;

       default:
         break;
     }  // switch( n )
    
     /*
       To avoid the result is zero.
     */
     if ( tmp == 0 )
     {
       Jud = false;
     }

   }  // while( Jud == false )

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

}  // End of main()

/*
上面的routine在VC裡應該是放在你須要它執行的地方(如: 某個button裡)
"int Num[6];" 這行如果在此routine裡宣告則為區域變數, 因使其為公共變數則較方便利用(如: 宣告在某一大家都include得到的header file)
當Num[6] 裡的6個數字都已經得到的時候就可以進行show在Dialog上的動作(如: 使用text edit)

你會在VC裡拉畫面嗎?
你會產生button嗎?
你會....嗎!?

如果你完全不會或沒概念, 那我講了也是白講

此routine是我臨時寫的, 演算法與我本來的project並不一樣, 我那project有其他特殊功能及判斷, 會參考下面這個連結
http://www.roclotto.com.tw/lucky_ball/lotto-times.asp
*/

回复

使用道具 举报

发表于 2004-6-20 04:03:01 | 显示全部楼层

提供一個以空間換時間的方法~~
以下的程式是在VC 6.0的環境下撰寫的~~
用其他的C編譯器的話,#include "stdafx.h"拿掉應該就可以了@@~~

1.首先建立一個擁有1-46的陣列~~這個應該很容易吧~~
利用FOR迴圈把數字連續的擺進去

2.產生兩個亂數,將剛剛陣列裡面的某兩個直對調~~
因為陣列裡面的數字一定不會重複~~所以怎麼對調也一定不會重複~~

3.最後因為只取六個樂透直~~所以~~取前面六個~~如此就可以了~~

4.最後的DO和WHILE主要就是可以讓你連續執行~~
任意見繼續產生數字~~ESC跳出~~

5.大部分方法是屬於時間負雜度m*n的,小弟以另外一種方式~~
提供時間負雜度n的解答給您最參考~~

以上是小弟提供的解答~~如果解釋不清楚的地方請各位前輩指教~~
或是有更好的方法也希望指教小弟~~很高興能夠跟各位前輩討論~~

感謝~~


// Lotto.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

//樂透幾個數字
#define lotto_number 6
//樂透最大數
#define max_number 46
//樂透要『洗牌』幾次
#define rand_times 50

int main(int argc, char* argv[])
{
 int lotto[max_number];
 int lotto_1,lotto_2,tmp;
 //設定亂數的SEED,讓假亂數變真亂數。
 srand( (unsigned)time( NULL ) ); 
 do{
  //初始化
  for (int i=0;i<max_number;i++)
   lotto[i]=i+1;
  //不重複亂數
  for (i=0;i<rand_times;i++)
  {
   lotto_1=rand()%max_number;
   lotto_2=rand()%max_number;
   tmp=lotto[lotto_1];
   lotto[lotto_1]=lotto[lotto_2];
   lotto[lotto_2]=tmp;
  }
  //秀出亂數
  for (i=0;i<lotto_number;i++)
   printf("%4d",lotto[i]);
  //提示是否要再來一次
  printf("\ntry again~? \nEsc for EXIT\nAny Key for RUN AGAIN\n");
 }while((getch())!=27);
 return 0;
}

回复

使用道具 举报

发表于 2004-6-20 11:57:25 | 显示全部楼层

>>2.產生兩個亂數,將剛剛陣列裡面的某兩個直對調~~
因為陣列裡面的數字一定不會重複~~所以怎麼對調也一定不會重複~~>>3.最後因為只取六個樂透直~~所以~~取前面六個~~如此就可以了~~
目前看過最不錯的演算法!是你自己想的嗎?


 i 宣告成main範圍內的區域變數,在早期的ANSI C++是不合法的,我用DEV-C++2.0試。
例如:
int i;
 for ( i=0;i<max_number;i++)
   lotto[i]=i+1;

回复

使用道具 举报

发表于 2004-6-20 12:01:08 | 显示全部楼层
回覆當軌道遇到障礙物:
能夠寫視窗程式功力相當不喔 ^^
請問你用什麼framework寫視窗介面? 
MFC?.NET?或者直接呼叫API呢?
回复

使用道具 举报

发表于 2004-6-20 12:11:25 | 显示全部楼层
回覆給 陳:

說出來不怕你笑, windows的視窗程式對我來說是最不需要動腦的(看看一些MSDN的文件, 拉拉視窗, 創造一些會用得到的物件, 接下來就是coding的動作而已)
因為我以前有在玩MFC...^^"

偶爾會玩玩Borland C++

現在都在研究崁入式系統(如: 以linux來實作崁入式系統及裡頭之application or driver 之porting)
回复

使用道具 举报

发表于 2004-6-20 12:58:56 | 显示全部楼层
回覆給:陳

恩~~您說的沒錯~~
這一點我最困惑的是『區域變數宣告』那個,擁有區域變數的語法,
在C++的時候就出現了,也就是說可以每一個迴圈都可以寫成
『for(int i;i<10;i++)』,borland一系列的C++,皆可使用,
但是在VC裡面,他卻會說重複宣告,
這樣就失去了原本C++所增加的『新功能』--『想要用在宣告』,
不知道是不是VC的編譯器預設不是用C++,還是說編譯器可進行微調,

這個方法不就是模擬真正的樂透開獎嗎@@~~全部的數字球,
丟進去『亂攪一通』,然後在取六個~~@_@|||
回复

使用道具 举报

发表于 2004-6-20 13:09:04 | 显示全部楼层
回覆給:陳

忘了說~~其實我這方法~~是因為在某個偶然的機會下,
看到了Matlab求質數的內建函數(不知道哪個變態工程師寫的@@),
他求質數的方法是,先建立全部的數值,在慢慢把不要的刪掉。
我是從這裡出發的去想的,不過我是因為剛好之前需要,
以前就寫過了~~所以~~(^_^)|||
回复

使用道具 举报

发表于 2004-6-20 13:14:45 | 显示全部楼层
回覆給:陳

大大您的之前有一篇,回復輸入六個數字不重複那個程式,
#define time 6根據小弟之前寫作的經驗,因為time是C++的內建函數,
所以在某些情況之下,例如#include <time.h>
會發生call不到time的狀況,或是發生不能編譯的問題。

之前剛開始學的時候就是因為這個,程式不能跑,讓老師親自出馬幫我debug,真是慚愧,所以我印象深刻,這樣寫的話,當需要用到time的時候會有問題。
回复

使用道具 举报

发表于 2004-6-20 13:18:55 | 显示全部楼层
回复

使用道具 举报

发表于 2004-6-20 13:21:22 | 显示全部楼层
>>2.產生兩個亂數,將剛剛陣列裡面的某兩個直對調~~
因為陣列裡面的數字一定不會重複~~所以怎麼對調也一定不會重複~~
我的做法是依序產生1~46個亂數,每次產生的亂數跟之前亂數做比對,重複再rand一次。

我第一次看你的演算法後恍然大悟,事實上根本不需要這麼麻煩,哈哈哈....我是白痴!

簡單的道理我沒想,盡是做一些無意義的迴圈。這跟程式功力、經驗、知識不相干,所以寫程式還是需要天份。
回复

使用道具 举报

发表于 2004-6-20 13:36:59 | 显示全部楼层
回覆給:特洛瓦
你這個方法很不錯
會比較傷腦筋的地方是"洗牌"時兩兩互換的動作要作幾次才"合理"
這種寫法會變成洗的少了怕有牌從頭到尾都沒洗到
洗多了又會覺得效率太差
把洗牌的方式稍微改一下可能會更好些
(我不會寫C....拿你的來改改看)

 for (i=0;i<max_number;i++) //有幾個元素就跑幾次迴圈,在這邊max_number是46
  {
   //只產生一個亂數
   lotto_1=rand()%max_number;

   //"第一個要對調的位置"直接用i值
   //"第二個要對調的位置"用亂數值
   tmp=lotto[i];
   lotto[i]=lotto[lotto_1];
   lotto[lotto_1]=tmp;
  }


回复

使用道具 举报

发表于 2004-6-20 13:39:43 | 显示全部楼层
感謝特洛瓦提供的訊息,下次#include<time.h>時候我會把#define time 改一下.. :-)

謝謝當軌道車遇上障礙物提供微軟對於for重複宣告的訊息 :-)

另外,真想參考 "真夜" 和 其他人的程式碼。
回复

使用道具 举报

Yahoo
您需要登录后才可以回帖 登录 | 註冊

本版积分规则

手機版|Archiver|Z板 Sitetag 訪客統計

GMT+8, 2024-10-12 04:25 , Processed in 0.117342 second(s), 14 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表