PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   疑難雜症區 (https://www.pcdvd.com.tw/forumdisplay.php?f=34)
-   -   可以請問一下這程式的問題在哪嗎? (https://www.pcdvd.com.tw/showthread.php?t=341504)

poenxu 2004-06-02 02:34 PM

可以請問一下這程式的問題在哪嗎?
 
是我的問題太過愚蠢嗎?
下面是我自己寫的一個類別,主要是在宣告一個電梯.
但是經過編譯以後,在宣告"電梯狀態"字串陣列的地方,卻出現了錯誤...
我問過老師,但是他給我的回覆還是太深澳了一一"
也上過網路討論區去求教.But都沒有人願意幫我><"
這三個錯誤已經想4天有了...但就是突破不了...各位板友幫幫忙吧ㄒ^ㄒ
======================================
--------------------Configuration: MyElavator - Win32 Debug--------------------
Compiling...
MyElavator.cpp
E:\課本作業\MyElavator.cpp(14) : error C2059: syntax error : '{'
E:\課本作業\MyElavator.cpp(14) : error C2143: syntax error : missing ';' before '{'
E:\課本作業\MyElavator.cpp(25) : error C2143: syntax error : missing ';' before '}'

======================================
class elevator_sample //建立類別:電梯
{
private:
int elevator_floor; //定義屬性:電梯樓層
int status_number; //電梯狀態編號
char elevator_status[10][20];//定義屬性:電梯狀態字串陣列
public: //建立者:建立電梯屬性的原始內容
elevator_sample()
{
elevator_floor=1; //電梯所在樓層,一開始設定在1f
status_number=9; //電梯狀態預設為:電梯待命中
elevator_status[10][20]=
{
"電梯目前在1f",//0 //預設有10種狀態
"電梯目前在2f",//1
"電梯開門中",//2
"電梯已經開啟",//3
"電梯關門中",//4
"電梯已經關閉",//5
"電梯往1f移動中",//6
"電梯往2f移動中",//7
"超過載重量",//8
"電梯待命中"//9 //電梯的所有預設狀態
}
}
void show_elevator_floor() //定義function:顯示電梯所在樓層
{
cout<<"電梯目前在"<<elevator_floor<<"樓"<<endl;
}
void show_elevator_status() //定義function:顯示電梯目前狀態
{
cout<<"電梯目前狀態是"
<<elevator_status[status_number]<<endl;
}
};
=================================================

harrisonlin 2004-06-02 08:33 PM

最簡單也最直覺的辦法:一一地初始化你的陣列的每個元素:

代碼:
#include "iostream.h"

class elevator_sample //建立類別:電梯
{
private:
	int elevator_floor; //定義屬性:電梯樓層
	int status_number; //電梯狀態編號
	char* pElevator_status[10];//定義屬性:電梯狀態字串陣列


public: //建立者:建立電梯屬性的原始內容
	elevator_sample() {
		elevator_floor=1; //電梯所在樓層,一開始設定在1f

		status_number=9; //電梯狀態預設為:電梯待命中

		pElevator_status[0] = "電梯目前在1f";
		pElevator_status[1] = "電梯開門中";
		pElevator_status[2] = "電梯已經開啟";
		pElevator_status[3] = "電梯關門中";
		pElevator_status[4] = "電梯已經關閉";
		pElevator_status[5] = "電梯往1f移動中";
		pElevator_status[6] = "電梯往2f移動中";
		pElevator_status[7] = "超過載重量";
		pElevator_status[8] = "電梯待命中";
	}

	void show_elevator_floor() {//定義function:顯示電梯所在樓層
		cout<<"電梯目前在"<<elevator_floor<<"樓"<<endl;
	}

	void show_elevator_status() {//定義function:顯示電梯目前狀態
		cout<<"電梯目前狀態是"<<pElevator_status[status_number]<<endl;
	}
};

void main() {
	elevator_sample elevator;
}


或許有更快地初始化一個物件的陣列屬性的方式,但是一時找不到,就先擋著用吧!

oosealoo 2004-06-02 08:57 PM

回覆: 可以請問一下這程式的問題在哪嗎?
 
引用:
Originally posted by poenxu
是我的問題太過愚蠢嗎?
下面是我自己寫的一個類別,主要是在宣告一個電梯.
但是經過編譯以後,在宣告"電梯狀態"字串陣列的地方,卻出現了錯誤...
我問過老師,但是他給我的回覆還是太深澳了一一"
也上過網路討論區去求教.But都沒有人願意幫我><"
這三個錯誤已經想4天有了...但就是突破不了...各位板友幫幫忙吧ㄒ^ㄒ
======================================
--------------------Configuration: MyElavator - Win32 Debug--------------------
Compiling...
MyElavator.cpp
E:\課本作業\MyElavator.cpp(14) : error C2059: syntax error : '{'
E:\課本作業\MyElavator.cpp(14) : error C2143: syntax error : missing ';' before '{'
E:\課本作業\MyElavator.cpp(25) : error C2143: syntax error : missing ';' before '}'

======================================
class elevator_sample //建立類別:電梯
{
private:
int elevator_floor; //定義屬性:電梯樓層
int status_number; //電梯狀態編號
char elevator_status[10][20];//定義屬性:電梯狀態字串陣列
public: //建立者:建立電梯屬性的原始內容
elevator_sample()
{
elevator_floor=1; //電梯所在樓層,一開始設定在1f
status_number=9; //電梯狀態預設為:電梯待命中
elevator_status[10][20]=
{
"電梯目前在1f",//0 //預設有10種狀態
"電梯目前在2f",//1
"電梯開門中",//2
"電梯已經開啟",//3
"電梯關門中",//4
"電梯已經關閉",//5
"電梯往1f移動中",//6
"電梯往2f移動中",//7
"超過載重量",//8
"電梯待命中"//9 //電梯的所有預設狀態
}
}
void show_elevator_floor() //定義function:顯示電梯所在樓層
{
cout<<"電梯目前在"<<elevator_floor<<"樓"<<endl;
}
void show_elevator_status() //定義function:顯示電梯目前狀態
{
cout<<"電梯目前狀態是"
<<elevator_status[status_number]<<endl;
}
};
=====================

============================


E:\課本作業\MyElavator.cpp(14) : error C2059: syntax error : '{'
E:\課本作業\MyElavator.cpp(14) : error C2143: syntax error : missing ';' before '{'
E:\課本作業\MyElavator.cpp(25) : error C2143: syntax error : missing ';' before '}'

少分號?

8:5 2004-06-02 09:25 PM

回覆: 可以請問一下這程式的問題在哪嗎?
 
引用:
Originally posted by poenxu
elevator_status[10][20]=
{
"電梯目前在1f",//0 //預設有10種狀態
"電梯目前在2f",//1
"電梯開門中",//2
"電梯已經開啟",//3
"電梯關門中",//4
"電梯已經關閉",//5
"電梯往1f移動中",//6
"電梯往2f移動中",//7
"超過載重量",//8
"電梯待命中"//9 //電梯的所有預設狀態
}

這一段程式碼有點問題,如果 "=" 意思是宣告 (declaration),並想在宣告的時候同時設定值的話,elevator_status 前面要加 char。
(但前面已經宣告過了,所以會等於重複宣告。)

以語法看來:

在這裡 "=" 的語意應該是指定算符 (assignament),
"=" 的左手項 elevator_status[10][20] 指的是一個 char。
照之前的宣告,elevator_status是一個有 200 個 char 的二維陣列,
elevator_status[10][20] 是第... 嗯... 第 221 個?

至於 "=" 的右邊的意思,它的意思.... 我想想,那根本不該出現在指定算符的右邊。

poenxu 2004-06-03 12:34 PM

回覆: 回覆: 可以請問一下這程式的問題在哪嗎?
 
這一段程式碼有點問題,如果 "=" 意思是宣告 (declaration),並想在宣告的時候同時設定值的話,elevator_status 前面要加 char。
(但前面已經宣告過了,所以會等於重複宣告。)

以語法看來:

在這裡 "=" 的語意應該是指定算符 (assignament),
"=" 的左手項 elevator_status[10][20] 指的是一個 char。
照之前的宣告,elevator_status是一個有 200 個 char 的二維陣列,
elevator_status[10][20] 是第... 嗯... 第 221 個?

至於 "=" 的右邊的意思,它的意思.... 我想想,那根本不該出現在指定算符的右邊。
=====================================================
您的意思是說我的elevator_status總共宣告了兩次,我想應該是這意思囉?
可是宣告class的時候,宣告elevator_status是因為在宣告屬性.而宣告類別屬性的時候是不能設定初值的...所以我才會在後面的constructor宣告初值.
那為什麼這樣會變成重複宣告了.是我的觀念出問題了嗎,可否請您替我說明一下呢?
因為課本沒有這類問題的說明了.

poenxu 2004-06-03 12:39 PM

#include "iostream.h"

class elevator_sample //建立類別:電梯
{
private:
int elevator_floor; //定義屬性:電梯樓層
int status_number; //電梯狀態編號
char* pElevator_status[10];//定義屬性:電梯狀態字串陣列


public: //建立者:建立電梯屬性的原始內容
elevator_sample() {
elevator_floor=1; //電梯所在樓層,一開始設定在1f

status_number=9; //電梯狀態預設為:電梯待命中

pElevator_status[0] = "電梯目前在1f";
pElevator_status[1] = "電梯開門中";
pElevator_status[2] = "電梯已經開啟";
pElevator_status[3] = "電梯關門中";
pElevator_status[4] = "電梯已經關閉";
pElevator_status[5] = "電梯往1f移動中";
pElevator_status[6] = "電梯往2f移動中";
pElevator_status[7] = "超過載重量";
pElevator_status[8] = "電梯待命中";
}
=====================================================
很謝謝你替我想出了代替方法,可以再向您請教一些問題嗎?
您所用的char* pElevator_status[10]
它是同時宣告一個[10]的字串陣列和一個char型態指標嗎?
因為我在課本的指標章節和陣列章節裡面都沒看到這樣的宣告方法.
可否請您敘述一下他的用法呢?
另外,我該怎麼編輯我的文章,才可以像您一樣.
讓程式的縮排呈現出來呢?

harrisonlin 2004-06-03 06:01 PM

char* pElevator_status[10]

1.char* 是 C 風格的字串,所以這表示我宣告了一個"內容為字元指標,長度為10"的陣列。

2.使用 [ CODE ]...[ /CODE ] (注意:[]間的空格要去掉!!)把你的程式碼包起來,可以讓程式碼以原本的方式呈現!但是因為 PCDVD 的"代碼功能"預設是黑色,所以再用[ COLOR=silver ]...[ /COLOR ] 把 [ CODE ]...[ /CODE ] 包起來,看起來像這樣:

[ COLOR=silver ]
[ CODE ]
void main() {
...
}
[ /CODE ]
[ /COLOR ]

這樣瞭了嗎? :)

8:5 2004-06-03 09:40 PM

回覆: 回覆: 回覆: 可以請問一下這程式的問題在哪嗎?
 
引用:
Originally posted by poenxu

您的意思是說我的elevator_status總共宣告了兩次,我想應該是這意思囉?
可是宣告class的時候,宣告elevator_status是因為在宣告屬性.而宣告類別屬性的時候是不能設定初值的...所以我才會在後面的constructor宣告初值.
那為什麼這樣會變成重複宣告了.是我的觀念出問題了嗎,可否請您替我說明一下呢?
因為課本沒有這類問題的說明了.

嗯•••錯誤訊息無關重複宣告。
只是猜想您想用宣告並設定初值的語法來做陣列值的設定,
才會提到宣告的語法•••

先說明 complier 給的訊息是什麼意思。
首先,您同意 elevator_status[5][8] 是一個 char 變數吧?而執行
代碼:
elevator_status[5][8] = 'x';

會將值 'x' 指定給它。同樣的,
代碼:
elevator_status[10][20] = ....; //其實,已經超出陣列的範圍了

也只是要將右邊運算的結果 (其型態應該要是或可以轉成 char),
指定給 elevator_status[10][20] 這個 char 變數而已,
而不是要設定整個 elevator_status 陣列的內容。

不過這也沒關係,如果語法沒錯的話,這樣可能還是可以執行,
只是可能程式會當掉,或產生無法預期的結果。

但現在是連編譯都無法通過,訊息是說語法有錯。
原因就是因為 "=" 的右手邊是
代碼:
{
"電梯目前在1f",//0 //預設有10種狀態
"電梯目前在2f",//1
"電梯開門中",//2
"電梯已經開啟",//3
"電梯關門中",//4
"電梯已經關閉",//5
"電梯往1f移動中",//6
"電梯往2f移動中",//7
"超過載重量",//8
"電梯待命中"//9 //電梯的所有預設狀態
}

根本沒辦法運算,而且最後也少了 ";"



至於您提到的宣告類別屬性不能設定初值的問題,
如果您這個陣列是所有 elevator_sample 物件共用的話,
那應該還是可以設定初值的,試著宣告成靜態成員。
不是很確定•••應該是類似下面這樣:
代碼:
 static char elevator_status[10][20]; 

然後在類別外,另外加一行
代碼:
char elevator_sample::elevator_status[10][20] = {
"電梯目前在1f",//0 //預設有10種狀態
"電梯目前在2f",//1
"電梯開門中",//2
"電梯已經開啟",//3
"電梯關門中",//4
"電梯已經關閉",//5
"電梯往1f移動中",//6
"電梯往2f移動中",//7
"超過載重量",//8
"電梯待命中"//9 //電梯的所有預設狀態
}; // 不要忘了加分號•••

poenxu 2004-06-04 03:32 PM

回覆: 回覆: 回覆: 回覆: 可以請問一下這程式的問題在哪嗎?
 
恕刪...
哈哈~
我知道我哪邊出錯了
=======================
她的宣告字串陣列教學是
char message[4][80]=
{
"xxxxx",
"ooooo",
"oxooxoo",
"xoxxo"
}
=======================
她的習題程式是
char message[4][80]=
{
{"oooo"},
{"xxxxx"},
{"oxoxoxo"},
{"oxoxoxox"}
};
=======================
她的範例教學跟程式示範有出入,結果我也看漏掉.
所以一直被誤認為我在宣告字元陣列XD....
忙到早上4點,終於在鳥叫聲中.發現問題所在了....ㄒ^ㄒ

poenxu 2004-06-04 05:35 PM

回覆: 回覆: 回覆: 回覆: 回覆: 可以請問一下這程式的問題在哪嗎?
 
這篇可能長了一點一一a....
以下是我的程式碼↓
代碼:
#include<iostream.h>
class elevator_class	//類別:電梯
{
	int elevator_floor;	//電梯樓層
	char elevator_status[11][30];//宣告電梯狀態陣列
public:
	elevator_class()//建構
	{
		int elevator_floor=1;//set elevator at 1f
		char elevator_status[11][30]=
		{
			{"電梯目前在1f"},	//0
			{"電梯目前在2f"},	//1
			{"電梯目前在3f"},	//2
			{"電梯往1f移動中"},	//3
			{"電梯往2f移動中"},	//4
			{"電梯往3f移動中"},	//5
			{"電梯開門中"},//6
			{"電梯已經開啟"},	//7
			{"電梯關門中"},//8
			{"電梯已經關閉"},	//9
			{"電梯待命中"}//10
		};
	}//建構結束
	void set_elevator_floor()
	{	
		cout<<"請輸入電梯所在樓層(1~3) :";
		cin>>elevator_floor;
	}
};
class button_class
{
	char button_list[7][20];//
	char button_action[7][20];
public:	
	button_class()//建構
	{
		char button_list[7][20]=
		{			
			{"1F"},	//0
			{"2F"},	//1
			{"3F"},	//2
			{"開門"},	//3
			{"關門"},	//4
			{"往上"},	//5
			{"往下"}	//6
		};
		char button_action[7][20]=
		{			
			{"按下1F按鈕"},	//0
			{"按下2F按鈕"},	//1
			{"按下3F按鈕"},	//2
			{"按下開門按鈕"},	//3
			{"按下關門按鈕"},	//4
			{"按下往上按鈕"},	//5
			{"按下往下按鈕"}	//6			

		};
	}//建構結束
};
class user_class
{
	int user_floor;
	int user_inout;
public:
	user_class()
	{
		int user_floor=1;//預設使用者在1樓
		int user_inout=1;//0是在電梯裡面,1是在電梯外面
	}
	void set_user_floor()
	{
		cout<<"請輸入使用者所在樓層(1~3) :";
		cin>>user_floor;
	}
};
void main()
{
	elevator_class elevator;	//宣告物件:電梯
	button_class button;	//宣告物件:按鈕
	user_class user;		//宣告物件:使用者
	elevator.set_elevator_floor();//設定電梯所在樓層
	user.set_user_floor();	//設定使用者所在樓層
}

=====================================================
我現在在思考另一個問題...
我計畫中的做法是:
我只要輸入電梯,使用者各在哪一樓層.
程式就會自己執行電梯移動到幾樓,電梯開門,電梯關門等等的動作.
所以我得讓電腦判斷:
如果"user_floor(使用者所在樓層)"比"elevator_floor(電梯所在樓層)""高"
它會cout電梯往上移動,電梯開門/關門等等的字串.
反之亦然...
但是user_floor與elevator_floor是分別屬於兩個物件的private.
導致我沒辦法讓她們在main裡面作比較大小耶...
1.不希望把她們設定成public.因為這樣違反information hiding原則...
也不確定設定成public以後,main是否就可以比較了.
2.不能設定成friend或者divice.
2-1.設定成friend int user_floor,friend int elevator_floor的話,
user_floor或者elevator_floor就不是那兩者class的private了.
2-2.設定成divice
user物件跟elevator物件沒辦法繼承彼此耶...
=====================================================
我的解決辦法是將private的elevator_floor與user_floor的值.
設定給main的兩個int變數.待兩者int變數做完比較以後.再告訴程式該cout哪些字串.
但是這樣似乎是繞了一大圈且吃力不討好.
還是說我這樣的做法在information hiding的原則下,是對的呢?
因為老師說過,當我們要求高度information hiding的時候.
程式執行手續會相對複雜化.
想請問兩位板友的看法^_^"


所有的時間均為GMT +8。 現在的時間是02:29 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2026。