2017-05-12 12 views
-6

プログラムは正常に動作し、すべてのオプションを実行しますが、3番目と4番目のオプションでは、3番目に生徒を検索するとプログラムはデータ入力部分を超えません。 4回目にデータを検索して印刷すると、intデータ型の変数にガベージ値が与えられ、string型またはchar型の変数は表示されません。どんな助けでも大変に感謝します。編集:不便をおかけして申し訳ありません、私は今メインコードから関数を分離しました。今、もっと理解できることを願っています。構造体配列からデータを抽出できないC++

#include<iostream> 
#include<string> 
using namespace std; 
int ncr; 
int me,n=0,u,y,l; 
char opt1,opt2,opt3,opt4; 
struct student 
{ 
string Name; 
int DoB; 
int Age; 
string Address; 
string Course[5]; 
char grade[5]; 
}; 

void add(); 
void remove(); 
void update(); 
void search(); 

int main() 
{ int opt; 
student s[n]; 

while(1) 
{ 
cout<<" select what you want to do \n\n 1. Add new record \n2. Remove record\n3. Update Record\n4. Search for particular student\n" ; 
cin>>opt; 
if(opt==1) 
{add();} 

else if(opt==2) 
{remove();} 


else if(opt==3) 
{update();} 

else if(opt==4) 
{search();} 

} 
} 

void add(){ 
n++; 
student s[n]; 
do 
{ cout<<"enter name of student "; 
cin>>s[n-1].Name; 
cout<<"enter DoB of student "; 
cin>>s[n-1].DoB; 
cout<<"enter age of student "; 
cin>>s[n-1].Age; 
cout<<"enter address of student "; 
cin>>s[n-1].Address; 
cout<<"enter courses and grades (max 5) \n"; 
for(int x=0;x<5;x++){ 
    cout<<"course:"; 
    cin>>s[n-1].Course[x]; 
    cout<<"grade:"; 
    cin>> s[n-1].grade[x];} 
    cout<<"Roll No. : "<<n<<"\nName :"<<s[n-1].Name<<"\nDoB :"<<s[n-1].DoB<<"\nAge :"<<s[n-1].Age<<"\nAddress :"<<s[n-1].Address; 
for(int x=0;x<5;x++){ 
    cout<<"\n"<<s[n-1].Course[x]; 
    cout<<" grade : "<< s[n-1].grade[x]<<"\n";} 
cout<<"repeat for another student 'y' or 'n' ?"; 
cin>>opt1; 
} 
    while(opt1=='y'|| opt1=='Y'); 
} 

void remove(){student s[n]; 
    do 
{ 
    cout<<"enter student roll no to remove data";cin>>l; 
for(int i=l;i<n;i++) 
{ s[l-1].Name=s[l].Name; 
s[l-1].DoB= s[l].DoB; 
s[l-1].Age=s[l].Age; 
s[l-1].Address=s[l].Address; 
for(int j=0;j<5;j++){ 
s[l-1].Course[j]=s[l].Course[j]; 
s[l-1].grade[j]=s[l].grade[j];} 
} 
cout<<"Record Removed\n"; 
n--; 

cout<<"repeat ? 'y' or 'n' "; 
cin>>opt2; 
} 
while(opt2 == 'y' || opt2 == 'Y');} 

void update(){ 
    student s[n]; 
     do 
      { 
      cout<<"enter the roll no of student you want to update data"; 
      cin>>u; 

      cout<<"Roll No. : "<<u; 
      cout<<"\nName : "; 
      cout<<s[u-1].Name; 
      cout<<"\nDoB : "; 
      cout<<s[u-1].DoB; 
      cout<<"\nAge : "; 
      cout<<s[u-1].Age; 
      cout<<"\nAddress :"; 
      cout<<s[u-1].Address; 
      cout<<"\nCourses and Grades\n"; 
       for(int r=0;r<5;r++) 
      { 
        cout<<s[u-1].Course[r]; 
        cout<<"\t"<< s[u-1].grade[r]<<endl; 
      } 
       cout<<"enter name of student "; 
       cin>>s[u-1].Name; 
       cout<<"enter DoB of student "; 
       cin>>s[u-1].DoB; 
       cout<<"enter age of student "; 
       cin>>s[u-1].Age; 
       cout<<"enter address of student "; 
       cin>>s[u-1].Address; 
       cout<<"enter courses and grades (max 5) \n"; 
       for(int x=0;x<5;x++){ 
        cout<<"course:"; 
        cin>>s[u-1].Course[x]; 
        cout<<"grade:"; 
        cin>> s[u-1].grade[x];} 
      cout<<"Roll No. : "<<u; 
      cout<<"\nName : "; 
      cout<<s[u-1].Name; 
      cout<<"\nDoB : "; 
      cout<<s[u-1].DoB; 
      cout<<"\nAge : "; 
      cout<<s[u-1].Age; 
      cout<<"\nAddress :"; 
      cout<<s[u-1].Address; 
      cout<<"\nCourses and Grades\n"; 
       for(int r=0;r<5;r++) 
      {  cout<<s[u-1].Course[r]; 
        cout<<"\t"<< s[u-1].grade[r]<<endl; } 
        cout<<"repeat ? 'y' or 'n' "; 
     cin>>opt3; 
     } 
     while(opt3 == 'y' || opt3 == 'Y'); 
      } 

    void search(){ 
         student s[n]; 
           do 
        { 

        cout<<"enter the roll no of student you want to search data of"; 
        cin>>y; 

       cout<<"Roll No. : "<<n<<"\nName :"<<s[y-1].Name<<"\nDoB :"<<s[y-1].DoB<<"\nAge :"<<s[y-1].Age<<"\nAddress :"<<s[y-1].Address<<"\nCourses and Grades\n"; 
       for(int r=0;r<5;r++) 
      { 
        cout<<s[y-1].Course[r]; 
        cout<<"\t"<< s[y-1].grade[r]<<endl; 
      } 
         cout<<"repeat ? 'y' or 'n' "; 
            cin>>opt4; 
        } 
     while(opt4 == 'y' || opt4 == 'Y');} 
+1

あなたのコードは、それを読むのが非常に難しいです。正しくフォーマットしてください。 –

答えて

1

これは、より多くの人間が読むことを意図したコードのようなビットになります:)

#include<iostream> 
#include<string> 

using namespace std; 

int ncr; 
int me,n=0,u,y,l; 
char opt1,opt2,opt3,opt4; 

struct student 
{ 
    string Name; 
    int DoB; 
    int Age; 
    string Address; 
    string Course[5]; 
    char grade[5]; 
}; 

void add(); 
void remove(); 
void update(); 
void search(); 

int main() 
{ 
    int opt; 
    student s[n]; 

    while(1) 
    { 
    cout << " select what you want to do \n\n 1. Add new record \n2. Remove record\n3. Update Record\n4. Search for particular student\n" ; 
    cin >> opt; 
    if(opt==1) 
    { 
     add(); 
    } 
    else if(opt==2) 
    { 
     remove(); 
    } 
    else if(opt==3) 
    { 
     update(); 
    } 
    else if(opt==4) 
    { 
     search(); 
    } 
    } 
} 

void add() 
{ 
    n++; 
    student s[n]; 
    do 
    { 
    cout << "enter name of student "; 
    cin >> s[n-1].Name; 
    cout << "enter DoB of student "; 
    cin >> s[n-1].DoB; 
    cout << "enter age of student "; 
    cin >> s[n-1].Age; 
    cout << "enter address of student "; 
    cin >> s[n-1].Address; 
    cout << "enter courses and grades (max 5) \n"; 

    for(int x=0;x<5;x++) 
    { 
     cout<<"course:"; 
     cin>>s[n-1].Course[x]; 
     cout<<"grade:"; 
     cin>> s[n-1].grade[x]; 
    } 
    cout << "Roll No. : " << n << "\nName :" << s[n-1].Name << "\nDoB :" << s[n-1].DoB << "\nAge :" << s[n-1].Age << "\nAddress :" << s[n-1].Address; 
    for(int x = 0; x < 5; x++) 
    { 
     cout << "\n"<<s[n-1].Course[x]; 
     cout << " grade : "<< s[n-1].grade[x]<<"\n";} 
     cout << "repeat for another student 'y' or 'n' ?"; 
     cin >> opt1; 
    } 
    while(opt1=='y'|| opt1=='Y'); 
} 

void remove() 
{ 
    student s[n]; 
    do 
    { 
    cout << "enter student roll no to remove data"; 
    cin >> l; 
    for(int i=l; i < n; i++) 
    {  
     s[l-1].Name=s[l].Name; 
     s[l-1].DoB= s[l].DoB; 
     s[l-1].Age=s[l].Age; 
     s[l-1].Address=s[l].Address; 

     for(int j=0;j<5;j++) 
     { 
     s[l-1].Course[j]=s[l].Course[j]; 
     s[l-1].grade[j]=s[l].grade[j]; 
     } 
    } 
    cout<<"Record Removed\n"; 
    n--; 

    cout << "repeat ? 'y' or 'n' "; 
    cin >> opt2; 
    } 
    while(opt2 == 'y' || opt2 == 'Y'); 
} 


void update() 
{ 
    student s[n]; 
    do 
    { 
    cout << "enter the roll no of student you want to update data"; 
    cin >> u; 

    cout << "Roll No. : " << u; 
    cout << "\nName : "; 
    cout << s[u-1].Name; 
    cout << "\nDoB : "; 
    cout << s[u-1].DoB; 
    cout << "\nAge : "; 
    cout << s[u-1].Age; 
    cout << "\nAddress :"; 
    cout << s[u-1].Address; 
    cout << "\nCourses and Grades\n"; 
    for(int r=0; r < 5; r++) 
    { 
     cout << s[u-1].Course[r]; 
     cout << "\t"<< s[u-1].grade[r] << endl; 
    } 
    cout << "enter name of student "; 
    cin >> s[u-1].Name; 
    cout << "enter DoB of student "; 
    cin >> s[u-1].DoB; 
    cout << "enter age of student "; 
    cin >> s[u-1].Age; 
    cout << "enter address of student "; 
    cin >> s[u-1].Address; 
    cout << "enter courses and grades (max 5) \n"; 
    for(int x=0; x < 5; x++) 
    { 
     cout<<"course:"; 
     cin>>s[u-1].Course[x]; 
     cout<<"grade:"; 
     cin>> s[u-1].grade[x]; 
    } 
    cout << "Roll No. : " << u; 
    cout << "\nName : "; 
    cout << s[u-1].Name; 
    cout << "\nDoB : "; 
    cout << s[u-1].DoB; 
    cout << "\nAge : "; 
    cout << s[u-1].Age; 
    cout << "\nAddress :"; 
    cout << s[u-1].Address; 
    cout << "\nCourses and Grades\n"; 
    for(int r = 0; r < 5; r++) 
    { 
     cout << s[u-1].Course[r]; 
     cout << "\t"<< s[u-1].grade[r]<<endl; 
    } 
    cout << "repeat ? 'y' or 'n' "; 
    cin >> opt3; 
    } 
    while(opt3 == 'y' || opt3 == 'Y'); 
} 

void search() 
{ 
    student s[n]; 
    do 
    { 
    cout << "enter the roll no of student you want to search data of"; 
    cin >> y; 

    cout << "Roll No. : " << n << "\nName :" << s[y-1].Name << "\nDoB :" << s[y-1].DoB << "\nAge :" << s[y-1].Age << "\nAddress :" << s[y-1].Address << "\nCourses and Grades\n"; 
    for(int r=0; r < 5; r++) 
    { 
     cout << s[y-1].Course[r]; 
     cout << "\t" << s[y-1].grade[r]<<endl; 
    } 
    cout << "repeat ? 'y' or 'n' "; 
    cin >> opt4; 
    } 
    while(opt4 == 'y' || opt4 == 'Y'); 
} 

あなたが抱えている問題は、あなたのプログラムの範囲です。 main()関数では、おそらくすべてのレコードを保持しているはずの配列を宣言します。しかし、すべてのオプション(関数の追加/削除/更新/検索)では、新しいオプションを宣言します。これらの配列はローカルであり、関数が終了すると "忘れ去られています"。 これを修正するには、元の配列(main()からのもの)をそれらの関数に渡す必要があります。

さらに深刻な問題は、は実行時に配列のサイズを変更できないということです。 3番目のオプションでアクセスしていた要素は、メモリ内のいくつかのランダムなバイトであり、これは多くの問題を引き起こす可能性があります。 例: 100フィールド(student s[100];)、さらにはstd::vectorを試してみてください。サイズはレコード数に応じて調整できます。

3番目のことは、書式設定コードが非常に重要であることです。うまくいけば、あなたのコードを読むことができないようにするのはコピー貼り付けの問題でしたが、そうでない場合は変更を試みてください。書式の整ったコードは理解しやすく、デバッグが容易になります。

+0

固定サイズの構造体配列をグローバル変数として定義していただきありがとうございます。 –

関連する問題