2017-12-11 18 views
1

私のコードをテストしていますが、修正方法が不明な問題がいくつか見つかりました。新しいレコードを追加するたびにレコードが実際に追加されるわけではなく、レコードを追加するたびにテストしました。プログラムはすべてのレコードを表示し、プログラムにハードコードされたレコードを示しています。私はそうするためにリンクされたリストを使用していますが、私はそれを正しく実装しているかどうかはわかりません。新しいレコードの追加とレコードへのアクセスに問題がある

編集:私はいくつかの変更を加えましたが、残りの問題の1つは追加です。私は、メインプログラム

のStruct学生STUDENT1、tempStudentへの変更を行った場合には、 追加が選択され、最初のエントリが入力されたとき、プログラムは無限ループに入りました。

.hファイル:

#ifndef SLIST_H 
#define SLIST_H 
#include <string> 
#include <iostream> 
using namespace std; 

class Student 
{ 
public: 
    int ID; 
    string lastName; 
    string firstName; 
    string phoneNumber; 
    string major; 
    float GPA; 
    int year; 
    int month; 
    int date; 
    string address; 
}; 

class Node 
{ 
public: 
    struct Student data; 
    Node *next; 
    Node(); 
    struct Student GetData(); 
    void SetData(struct Student); 
    friend class LinkedList; 
}; 

class LinkedList 
{ 
public: 
    int length; 
    Node *currentPos; 
    Node *head; 
    Node *tail; 
    LinkedList(); 
    ~LinkedList(); 
    int LengthIs(); 
    void MakeEmpty(); 
    void AddToTail(struct Student); 
    void AddToHead(struct Student); 
    int SearchByID(struct Student); 
    void DeleteFromHead(); 
    void DeleteFromTail(); 
    void Delete(int); 
    Node GetNext(); 
    bool IsLast(); 
    void Reset(); 
    void PrintAll(int, string); 
}; 


void LinkedList::AddToTail(struct Student item) 
{ 
    Node *ptr = new Node(); 
    ptr->SetData(item); 
    if (length == 0) 
    { 
     tail = ptr; 
     head = ptr; 
     length++; 
     return; 
    } 
    tail->next = ptr; 
    tail = ptr; 
    length++; 

} 

void LinkedList::AddToHead(struct Student item) 
{ 
    Node *ptr = new Node; 
    ptr->SetData(item); 
    ptr->next = head; 
    head = ptr; 
    if (length == 0) tail = ptr; 
    length++; 
} 


#endif 

メインプログラム:あなたは間違ってstructキーワードに

cin >> tempStudent.ID;意志を取り除くため

#include "slist.h" 
#include <iostream> 

using namespace std; 

int main() 
{ 
    LinkedList students; 
    int choice = 1; 
    Student student1, tempStudent; 
    Node student1Node; 
    int ret; 
    student1.ID = 12345678; 
    student1.firstName = "Daenerys"; 
    student1.lastName = "Targaryen"; 
    student1.phoneNumber = "111-123-1234"; 
    student1.major = "PScience"; 
    student1.GPA = 3.9; 
    student1.year = 2000; 
    student1.month = 11; 
    student1.date = 30; 
    student1.address = "1234 Harpy Way Mereen, OK 74701"; 

    students.AddToHead(student1); 

    while (choice != 6) 
    { 
     cout << "What would you like to do?" << endl; 
     cout << "1: Add a student record." << endl; 
     cout << "2: Remove a student record." << endl; 
     cout << "3: List all students." << endl; 
     cout << "4: List the student(s) by major or by ID." << endl; 
     cout << "5: Order the list." << endl; 
     cout << "6: Exit!" << endl << endl; 
     cout << "Make your choice: "; 
     cin >> choice; 

     switch (choice) 
     { 
      case 1: 
       cout << "Warning: there's a lot of data entry. Try to keep up with what you're entering." 
        << endl; 
       cout << "Please enter in the student's ID, first name, last name, phone number and major ON SEPARATE LINES"; 
       cout << endl; 
       cin >> tempStudent.ID; 
       cin >> tempStudent.firstName; 
       cin >> tempStudent.lastName; 
       cin >> tempStudent.phoneNumber; 
       cin.ignore(); 
       getline(cin, tempStudent.major); 
       cout << "Almost done! Enter the student's gpa, birth year, birth month (IN DIGITS!!!), birth date, and address ON SEPARATE LINES."; 
       cout << endl; 
       cin >> tempStudent.GPA; 
       cin >> tempStudent.year; 
       cin >> tempStudent.month; 
       cin >> tempStudent.date; 
       cin.ignore(); 
       getline(cin, tempStudent.address); 

       students.AddToHead(tempStudent); 
       cout << "Student entry added!" << endl; 
       students.PrintAll(-1, ""); 
       break; 
+2

'if(current-> data.major!= major);'そのセミコロンは非常に悪い考えです。 – user4581301

+1

正確に1つの問題に焦点を当てるために質問を再作成することをお勧めします。 addで始まることを推奨し、addが機能しないことを示すことと無関係なコードをすべて削除してください。しばしばこの時点であなたは答えがすぐに飛び出すような小さなコードしか持っていませんが、少し残っているコードを残しておけば、誰かがおそらくあなたの答えをもっと早く得るでしょう。すべての入力をコード化して複製します。 – user4581301

+0

'Student'はクラスなので、' struct Student student1; 'を宣言しないでください。 'student student1;'を入れてください。 –

答えて

1

あなたは入力エラーを持っている、そうではありません非整数を入力してinfiniを実行すると失敗するテループ。入力が成功したかどうかを確認し、失敗した場合は入力をクリアする必要があります。

//cin >> tempStudent.ID; <- remove this line 

while(true) //<- replace with this 
{ 
    cout << "id: "; 
    if((cin >> tempStudent.ID)) 
     break; 
    cin.clear(); 
    cin.ignore(0x1000, '\n'); 
} 

他の整数入力に対して同じ入力エラーチェックを行う関数を追加することができます。あなたは、整数入力し、ユーザーを期待している場合

cin.clear(); 
cin.ignore(0x1000, '\n'); 

cin.clear()からcin.ignore()の他の例が推奨され

変更が誤ってテキストを入力します。

+0

ありがとう、これはまさにそれでした。 – iuliko

+0

私はこれに関連する別の質問があります。この構造体のint IDの選択された長さだけが受け入れられるようにするにはどうすればよいですか?たとえば、IDの長さが9桁で、それ以上でないことを確認したいと思います。どうやってやるの? – iuliko

+0

'if(ID> = 100000000 && ID <= 999999999){...}'を確認して、入力サイズが間違っている場合に再度入力を要求することができます。もう1つの注意点は、ユーザーが '1234 5678'(間に空白がある)を入力すると2つの入力としてカウントされ、2つの' >> '演算子が呼び出され、 '5678'が' firstName'に割り当てられるということです。行全体を読み込む 'std :: getline(cin、string_id)'を使うことができます。その後、文字列の長さを確認し、各文字をチェックして入力を検証します。 –

関連する問題