메뉴 바로가기 검색 및 카테고리 바로가기

한빛미디어

뇌를 자극하는 C++ 프로그래밍

뇌를 자극하는 C++ 프로그래밍 질의응답 게시판입니다.

19장 GetTail() 코드 입니다

2010-01-11

|

by sonsji07

|

Chapter19.zip

5310

#include "students.h"
#include "student.h"
#include "list.h"
#include
#include
#include
using namespace std;

// 배열 대신에 링크드 리스트를 사용해서 구조체를 보관한다.
List* students = NULL;

float TotalAve = 0.0f;                // 전체 평균
int NumberOfStudent = 0;        // 현재까지 입력된 학생수

// 학생한명을 추가한다
// 반환 값: 더 이상 입력할 수 없는 경우 false 반환
bool AddStudent()
{
        
        // 여기 인원 제한을 검사하던 코드가 없어졌다
        
        // 링크드 리스트에 넣기 위해서 Student 변수를 하나 동적으로 할당한다.
        Student* std = new Student;
        
        // 해당 학생의 학생번호를 자동으로 입력하고 전체 학생수를 증가시킨다.
        std->sNo = ++NumberOfStudent;
        
        // 해당 학생의 이름, 국어, 영어, 수학 점수를 입력 받는다.
        cout << "이름(공백없이) 국어, 영어, 수학 점수를 입력하세요 : \n";
        cin >> std->name >> std->kor >> std->eng >> std->math;
        
        // 개인 평균을 계산한다.
        std->ave = float(std->kor + std->eng + std->math) / 3.0f;
        
        // 기존 값을 사용해서 새로운 전체 평균을 계산한다.
        const int current = NumberOfStudent;        // 현재까지 입력 받은 학생수
        const int prev = NumberOfStudent - 1;        // 조금 전까지 입력받은 학생수
        
        TotalAve = (TotalAve * prev / current) + (std->ave / current);

        // students 리스트에 새 노드를 추가한다.
        //InsertNodeAfter(students->head->prev, std);
        InsertNodeAfter(GetTail(students), std);   <---------------이 부분
        return true;
}

//전체 성적을 보여준다
void ShowAll()
{
        // 실수 출력 시에 소수점 이하 두 자리만 표시되도록 한다.
        cout.precision(2);
        cout << fixed;

        // 타이틀 부분을 출력한다.
        cout << "\n       < 전체 성적 보기 >";
        cout << "\n   학번 이름 국어 영어 수학   평균\n";
        
        /*
        // 입력된 학생 수 만큼 반복한다.
        for(int i = 0; i < NumberOfStudent; i++)
        {
                // 소스 코드를 간결하게 하기 위해서 사용할 변수를 레퍼런스로 가리킨다.
                const Student& std = students[i];
                
                //해당 학생의 정보를 출력한다.
                cout << setw(7) << std.sNo << setw(7) << std.name;
                cout << setw(5) << std.kor << setw(5) << std.eng;
                cout << setw(5) << std.math << setw(7) << std.ave << endl;
        }
        */

        // 리스트에 있는 모든 학생의 정보를 출력한다.
        Node* current = students->head->next;
        while(current != students->head)
        {
                // 현재 노드의 데이터를 꺼내온다.
                //const Student* std = (Student*)current->data;
                const Student* std = (Student*)GetData(current);  <---------------이 부분
                // 해당 학생의 정보를 출력한다.
                cout << setw(7) << std->sNo << setw(7) << std->name;
                cout << setw(5) << std->kor << setw(5) << std->eng;
                cout << setw(5) << std->math << setw(7) << std->ave << endl;

                // 다음 노드를 가리킨다
                //current = current->next;
                current = GetNext(current);   <---------------이 부분
        }

        // 전체 평균을 출력한다.
        cout << "\n전체 평균 = " << TotalAve << endl;        
}

// 초기화 한다
void Setup()
{
        // 리스트를 생성한다.
        students = CreateList();
}

// 사용한 리소스를 정리한다
void Teardown()
{
        // 리스트를 정리한다.
        RemoveList(students, true);
}

위 소스대로 작성한 다음 실행시키면
--------------------Configuration: Chapter19 - Win32 Debug--------------------
Compiling...
students.cpp
E:\C언어\C++\Chapter19\students.cpp(57) : error C2065: GetTail : undeclared identifier
E:\C언어\C++\Chapter19\students.cpp(92) : error C2065: GetData : undeclared identifier
E:\C언어\C++\Chapter19\students.cpp(100) : error C2065: GetNext : undeclared identifier
E:\C언어\C++\Chapter19\students.cpp(100) : error C2440: = : cannot convert from int to struct Node *
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.

Chapter19.exe - 4 error(s), 0 warning(s)

이렇게 오류 뜨면서 안됩니다.
혹시나해서 #include 를 추가해 봐도 안돼요..
첨부한 파일은 제가 작성한 코드 전부입니다.
댓글 입력