2013-12-14 133 views
0

計劃的細節:程序會顯示這將有4個選項結構,功能和數組

  1. 新生入學
  2. 編輯學生詳細
  3. 更新細節
  4. 顯示所有學生
  5. 的列表菜單

如果登記超過45,它應該給出消息。應該使用結構和功能。用於註冊,編輯和更新的單獨功能依然如此。我從我寫的代碼中得到了問題。我對如何使用帶有功能的結構感到困惑。我不知道我是對還是錯。如何在這種情況下使用指針?

我更新的代碼,但仍然給怪異的輸出,當我們在這個代碼中存儲多個數據時如何使用指針函數數據數據[45]。

#include <iostream> 
#include <cctype> 
#include <cstring> 
using namespace std; 


struct Date{ 
int day; 
int month; 
int year; 


}; 

struct Data{ 
int id; 
char firstName[20]; 
char lastName[20]; 
float PrimaryMarks; 
float secondaryMarks; 
Date date; 
}; 



void enrollment(Data *dtai){ 
     static int i=0; 

     if(i<45){ 
     dtai->id=i+1; 


     cout<<"Enter the student's First Name"<<endl; 
     cin>>dtai->firstName; 


     cout<<"Enter the student's Last Name"<<endl; 
     cin>>dtai->lastName; 

     cout<<"Enter the student's Primary School Percentage"<<endl; 
     cin>>dtai->PrimaryMarks; 


     cout<<"Enter the student's Secondary School Percentage"<<endl; 
     cin>>dtai->secondaryMarks; 


     cout<<"Enter the day of enrollment"<<endl; 
     cin>>dtai->date.day; 

     cout<<"Enter the month of enrollment"<<endl; 
     cin>>dtai->date.month; 

     cout<<"Enter the year of enrollment"<<endl; 
     cin>>dtai->date.year; 
     } 

i++; 
} 


int main(){ 
//taking students information menu display 
Data data[45]; 

//int i=0; 
int option; 
char sentinal; 

do{ 

int x=0; 
//display menu 
cout<<"Press 1 for New Enrollment"<<endl; 
cout<<"Press 2 for editing student's detail"<<endl; 
cout<<"Press 3 for updating student's detail"<<endl; 
cout<<"Press 4 to see list of students"<<endl; 

cin>>option;  

    switch(option){ 
     case 1: 

      enrollment(&data[x]); 
      break; 
     case 2: 

     case 4: 


    } 




cout<<"Press m to go to the menu again "; 
cin>>sentinal; 

}while(sentinal=='m'); 



return 0; 
} 
  1. 請告訴我如何使用結構與多個數據的功能。

我剛纔寫我的第一個選項招生其餘代碼剩下的,請回答事先我上面的問題,謝謝

+0

至少你的代碼[compiles fine](http://ideone.com/8UYH9z)。你有什麼具體的問題,你的預期輸入和輸出是什麼,如果他們工作或沒有? –

+0

程序正在運行,但我已經聲明瞭數據數據[45];全球範圍內,這是否正確?我在函數中使用的靜態變量是正確的?如何鏈接2個結構日期和數據?我做錯了 – user3100177

+0

你需要一本更好的教科書或參考書。大多數高質量的書籍討論功能並將參數傳遞給功能並進行修改。 –

回答

2

要使用的結構與功能,稍微改變功能,所以它接收參數:

void enrollment(Data& data_to_fill) 
{ 
    ... 
    cin>>data_to_fill.firstName; 
    ... 
} 

然後,調用函數時發送參數:

enrollment(data[i]); 

鋁ternatively,使用返回值,而不是一個參數:

Data enrollment() 
{ 
    Data data_to_fill; 
    ... 
    cin>>data_to_fill.firstName; 
    ... 
    return data_to_fill; 
} 

... 

data[i] = enrollment(); 

我不知道該選擇哪種方式,它可能難以推薦一個或另一個。第一種方法使用傳遞參考技術,您可能不熟悉 - 所以您可能想要使用第二種方法。

但是,如果出現錯誤(超過45個登記),該函數應該可能返回錯誤代碼。第一種方式可能更符合這一要求。

只是爲了回答您的其他問題:

我已經宣佈它在全球

它認爲是不好的風格。在main()函數中聲明本地。

如何兩種結構,日期和數據

就像你做的鏈接在你的代碼:struct Data {Date date;}

會不會有指針的使用與否?

這裏你不需要指針。

我是否在函數中正確使用了靜態變量?

幾乎正確 - 只需添加++i,這樣就可以統計註冊人數。

+0

非常感謝。你可以指導我一點,但是,我實際上是新的C++,從哪裏可以找到很好的教程?或很好的參考 – user3100177

+0

正如在評論中提到的那樣,閱讀[C++權威圖書列表](http://stackoverflow.com/q/388242/509868) – anatolyg

0

要通過一個單一的數據結構,以您的註冊功能,你需要寫

void enrollment(Data& data) { 
    // ... 
} 

,並從你的主循環調用它

enrollment(data[i]); 

要通過整個struct陣列您可以做到這一點固定大小

void enrollment(Data data[45]) { // ... 

或做動態調整

void enrollment(Data* data, std::size_t maxRecords) { // ... 
+0

如果我們想要傳遞多個數據,如我擁有45學生,在這種情況下如何通過參考傳遞? – user3100177

+0

然後你需要傳遞一個指針和這個內存位置可用的數據量。 –

+0

告訴我怎麼樣?只需要一點點 – user3100177

1

有一個全局聲明的結構,這樣做(data[45])是一種方法去關於它。使用修改全局變量的函數並不是一個好主意(在開發過程中,最終會發生被遺忘的全局變量修改發生在其他函數內部)。如果你必須使用全局變量,可以考慮通過命名約定明顯地使其成爲全局變量 - 例如gdata[45]

爲了避免全局聲明,在main中聲明並將指針傳遞給登記函數。實際上,讓學生計數器在main中遞增並將指針傳遞給數據結構數組的元素是否更有意義?

void enrollment(Data *mydatai){ 
    /* stuff */ 
    cin>>mydatai->firstName; 
    /* more stuff */ 
} 

int main(){ 
    /* stuff */ 
    Data data[45]; 
    int i = 0; 
    do { 
     /* other stuff */ 
     switch(option){ 
     case 1: 
      enrollment(&data[i]); 
     /* other cases */ 
     } // switch end 
    } while (some_condition); 
} 

一個Date結構是Data結構內部的方式是好的 - 但是,這並不意味着它一定是你想要的。

+0

所以你宣佈我在主內,我將如何增加?我也必須使用我的身份證生成 – user3100177

+0

不適用於多個數據僅適用於單一數據 – user3100177

+0

@ user3100177 _'S你ü說我在主內,我將如何增加??'_只是把一個'++我;'語句內'do' /'while'循環。 –