寫了這麼多年的C了,還真的不知道有Unions 這個東西

查了一下MSDN,差別在下面

Access Control and Constraints of Structures, Classes and Unions
Structures Classes Unions
No usage constraints No usage constraints Use only one member at a time

所以你的程式問題在於, 你同時用到兩次 Union 之中的 member 了!!!

我想你應該回頭再仔細看看書或課本,應該就能了解箇中奧妙了~~~

至於怎麼改~~~
還是留給你自己想囉寫程式最大的樂趣~~就是在創作了
手癢, 改了一下程式:
UNION 是共用記憶體空間的結構,
在原來的程式中
union mydata
{
char name[15];
char number[7];;
}
teacher;
連續輸入2次資料, 原本的name 會被下面輸入的number 蓋掉,
所以永遠不會顯示name的資料(run 一下 debug 就知道了),
原po應是無法顯示姓名而認為姓名的地方出錯吧.
由程式的寫法可知, 這是原po自己寫的,難得....

我想老師的意思是要你知道, union 可以節省記憶體空間,
跟 struct 不一樣的是, struct 是每個變數會佔有位址空間, 定義多少就佔用多少.

但現在記憶體那麼大,
其實是省不了多少....
所以我改了一下定義:
union mydata
{
char space[15];
struct
{
char name[8];
char number[7];
}data;
}teacher;

這樣這個結構的總共大小為15 bytes,其中;前8個bytes 給 name, 後7個byte 給number.

union 還有更好的用法:
union {
int intValue;
unsigned long longValue;
double doubleValue;
}data ;
定義一個4byte 的數, 但可以自由使用變數型態:
data.intValue 是整數
data.longValue 是unsigned long.
data.doubleValue 是double.
可是都在同一個位址空間, 但卻有不同名稱, 而值都一樣.
struct 就無法做到這一點.

改完後的完整程式如下:
#include<iostream>
#include<cstdlib>
using namespace std;
union mydata
{
char space[15];
struct
{
char name[8];
char number[7];
}data;
}teacher;

int main(void)
{
char k;

cout<<"請輸入姓名:";
cin.getline(teacher.data.name,15);
cout<<"請輸入代號:";
cin.getline(teacher.data.number,7);
do {
cout<<"請問您的性別 (1)男性 (2)女性: ";
cin>>k;
} while((k>50)||(k<49));
switch(k)
{
char m;
case '1':
cout<<"是否役畢? (1)YES (2)NO ";
cin>>m;
if(m==49)
{
cout<<"姓名:"<<teacher.data.name<<endl;
cout<<"代號:"<<teacher.data.number<<endl;
cout<<"男性:"<<endl;
cout<<"役畢:"<<endl;
}
if(m==50)
{
cout<<"姓名:"<<teacher.data.name<<endl;
cout<<"代號:"<<teacher.data.number<<endl;
cout<<"男性:"<<endl;
cout<<"未役:"<<endl;
}
break;
case '2':
int h;
cout<<"打字速度?";
cin>>h;
cout<<"姓名:"<<teacher.data.name<<endl;
cout<<"代號:"<<teacher.data.number<<endl;
cout<<"女性:"<<endl;
cout<<"打字速度:"<<h<<"字"<<endl;
break;
}

system("pause");
return 0;
}
試了一下, getline 會自動補'\x0'
libraleu wrote:
手癢, 改了一下程式...(恕刪)


我也是往這個方向想的
不過我不會改union mydata
我會用一個char* 去指向她
之後就當成是malloc回來的用
libraleu wrote:
手癢, 改了一下程式...(恕刪)



真是感謝大大
讓我從書中跳脫
學習到了
很抱歉麻煩各位了
因為書中的一段我沒看仔細
引言:雖然union內部定義了許多資料型態
但這些資料型態卻不是同時存在的
使用時它們只能有一個欄位存在於union變數
也就是說,若是使用了欄位A,就無法在使用其他的欄位,同樣的,如果使用欄位B
,其他的欄位也是無法在利用。如果使用者執意要存放資料,就會造成資料被覆蓋的情況。

當初沒對這幾句話徹底了解,只是覺得寫法根本就是"struct"碼,但是了解欄位後
才知道是這樣子的!!感謝你們幫我回答喔!!
嘿. 我從16歲開始接觸電腦, (286 AT) 學的是 GW BASIC.

那時覺滿好玩的, 但那時(17年前)電腦是很貴的東西, 所以家裡是沒有的,

18歲那年, 家中有了第一台386, 是我三哥讀研究所要用的, 剛好有學資訊科的姐姐,

就自己邊看書自學C/BASIC(因為我姐學的也不怎麼樣),也立志要成為軟體工程師,

一路走來到今天,書也看了不少, 但現在的工作卻是寫PLC 做自動化設備(主要是半導體用的)

C/C++/BASIC 反而放下了, 只有用來寫一些介面程式, 不太複雜的,像RS232通訊用的.

寫程式是愉快的.....對我而言.

hi, roosalsa,

小弟淺見, 老師出題應該是讓你在 男生女生屬性作 union, 而不是 name 上面作 union.
所以應該類似以下的宣告.

struct {
char name[15]; // assume name size is 14 bytes
bool sex; // male: true; female: false
union {
bool is_ascuage; // when sex is true
int typing_speed; // when sex is false.
};
}
鈴70 wrote:
hi, roosal...(恕刪)



我還是把原題PO上來好了
引自:C++教學手冊 洪維恩

請試利用共同空間型態,於程式中宣告下列的人事結構型態
姓名: 15個字元
人事代號 7個數字字元 ←應該是我沒注意到"數字"還去想到以前學號都是"s"開頭
此外,還依照填寫者的性別而有不同的欄位:女性填入中文打字速度,男性則填是否役畢。
refactoring ..... refactoring ..... refactoring ..... refactoring .....
嗯.....
重工.....

我想應該是在相同的資料型態上去做UNION...

可以用 UNION 定義出固定長度的結構,

再去分姓名, 代號各佔多少位置, 再來是

不同的變數, 但定義在相同的位址上, 可以達成一個欄位,

但是因男人及女人而異而會有不同的意義..

但... STRUCT 其實也可以做到, UNION 的應用實在不多......

用CLASS 就更符合C++ 的精神....

了解就好, 不用深究....

但我想, STRUCT/ UNION 等都是 CLASS 的變種....

是切掉一部份功能的 CLASS.


關閉廣告
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!