2011-04-25 4 views
1

C++ 클래스에서이 프로그램에 문제가 있습니다 : 교사가 성, 이름 및 테스트 점수를 가진 학생의 병렬 배열을 만들었습니다 . 배열은 각 배열의 n 번째 요소가 관련 정보를 포함하도록 배열됩니다. 각 배열의 n 번째 항에 올바른 사람과 관련된 데이터가 여전히 포함되도록 학생의성에 의해 배열을 정렬 (선택 정렬 사용)하는 프로그램을 작성하십시오.텍스트 파일의 정보를 텍스트 파일에서 3 개의 다른 배열로 읽어들입니다. (C++)

Ratte Ismella 66
갈색 톰 88
Dyrt 필 94
덴트 스투 100

정렬 후 :

다음과 같이 예를 들면 원래의 배열 데이터는 브라운 톰 88
덴트 스투 100
Dyrt 필 (94)
Ratte Ismella 66

이 프로그램은 최대 30 명을 위해 일해야합니다. 데이터는 데이터 파일에서 읽어야합니다. 데이터 파일의 각 행에는 성, 공백, 이름, 공백 및 정수 점수가 포함됩니다. 프로그램은 정렬 전과 후에 데이터를 표시해야합니다.

나는 선택 정렬 및 스왑 기능을 포함해야한다고 알고 있지만, 어떻게해야할지 모르겠다. 여기에 내가 무엇을 가지고 지금까지의 내가 단어하지 선으로 파일을 읽을 생각 해요 알고

#include "stdafx.h" 
#include <iomanip> 
#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

void selsort(int a[], int size) 
void swap(string, &s1,string &s2) 
void swap (int &i1, int &i2) 

int main() 
{ 
    int counter=0; 
    ifstream inputFile; 
    string inputFileName; 
    cout<<"Enter the path and filename."; 
    getline(cin, inputFileName); 
    inputFile.open (inputFileName.c_str()); 
    string LINE; 
    while (!inputFile.eof()) 
    { 
     getline (inputFile, LINE) 
     cout<<LINE<<endl; 
    } 

, 나는 성 이름에 따라 배열에 넣어하는 방법을 모른다 매우 좋지 않다 , score, 그리고 내 selsort 및 swap 선언에 사용 된 변수는 모두 잘못되었습니다. 마지막으로 1 차원 배열 만 사용해야합니다. 같은

답변

0

뭔가 : 당신이 실제로 무엇을하는지 이해할 때까지 어떠한 경우

vector <string> firstname, lastname; 
vector <int> score; 
string fn, ln; 
int n; 

while(inputfile >> fn >> ln >> n) { 
    firstname.push_back(fn); 
    lastname.push_back(ln); 
    score.push_back(n); 
} 

는 EOF() 멤버 함수를 사용 - 힌트 : 다음의 read가 파일의 끝을 발생할 경우 예측하지 않습니다.

+0

OP가 3 대신 1 개의 배열을 사용하는 경우 구현이 더 쉬울 수도 있다고 생각합니다. – Pepe

+0

@ P.R. 질문 제목을 읽으십시오. –

+0

흠, 그래, 불행히도 그것은 3 병렬 배열을 요구하지 않습니다 : / – Pepe

0

이 코드는 작성하지 않지만 여전히 C++로 작성하는 일반적인 아이디어를 제공합니다.

1) 각 학생의 데이터 구조. 당신이 공간을 얻을 또는 unappersson 제안 것처럼 할 줄 토큰 화

 
struct stud{ 
std::string last; 
std::string first; 
int number 
}; 

2.

당신의 컨테이너는 :: vector & stud * & gt students;

3 포인터를 삭제 잊지 말고]. last names as :: students [iterator] -> last에 액세스하고 Selection Selection을 문자열에 정렬하십시오.

 
vector < stud * > ::iterator it; 
for(it = students.begin() ; it != students.end() ; it++){ 
// This is the way to iterate through your students container 
} 

2

숙제 지정과 관련하여 여러 질문이있는 것 같습니다.

1 : 데이터를 어떻게 저장합니까?

먼저 배열을 선언해야합니다. C++에서 배열은 동질적인 데이터 집합을 나타내는 고정 크기의 기본 데이터 구조입니다. 어레이는 그 유형과 크기로 특징 지어집니다. T이 임의의 유형을 나타내고 N이 임의의 상수 표현식을 나타내는 경우 myArray 배열을 선언 할 수 있습니다. T myArray[N]. 이 배열의 요소에 액세스 할 때 특히,이 세 배열

std::string LastNames[30]; 
std::string FirstNames[30]; 
int Scores[30]; 

를 선언 할 수있다, 우리는 [] 예를 들어,

LastName[7] = "Johnson"; 
std::cout << Scores[23]; 

Q2를 첨자 연산자를 사용 : 어떻게 내 데이터를 읽을 수 있습니까?

이러한 배열을 채우려면 std::istream : >>의 삽입 연산자를 사용합니다. 이 연산자는 입력 스트림에서 공백으로 구분 된 단어를 읽고 적절하게 해석 한 다음 해당 값을 명명 된 변수에 할당합니다. 예를 들어, 단일의 int에 읽고, 우리가 작성할 수 있습니다

int i; 
std::cin >> i; 

읽기 값에 값 후, 파일의 끝에 도달 할 때까지, 일반적인 C++ 관용구이다. 반복하여 하나 개의 데이터 유형에서 판독하는 경우, 우리는이 같은 형태로 사용이 특정한 경우

std::string name; 
while(std::cin >> name) { 
    // do something with "name" 
} 

을, 우리는 각각의 루프 반복에 대한 세 가지 값을 읽어 "연산자 체인"라는 기능을 사용

std::string lastName; 
std::string firstName; 
int score; 
while(std::cin >> lastName >> firstName >> score) { 
} 

이 루프는 파일 끝에 도달 할 때까지 여러 번 실행됩니다. 루프를 반복 할 때마다 다음 값 세트가 이러한 명명 된 변수에 할당됩니다. 이 루프는 바보입니다. 왜냐하면 값으로 아무 것도하지 않기 때문입니다. 즉시 다음 반복으로 덮어 씁니다.

읽기 입력 관용구로 배열 개념을 결합, 우리는이 :

std::string LastNames[30]; 
std::string FirstNames[30]; 
int Scores[30]; 
std::string lastName; 
std::string firstName; 
int score; 
int i = 0; 
while(std::cin >> lastName >> firstName >> score) { 
    LastNames[i] = lastName; 
    FirstNames[i] = firstName; 
    Scores[i] = score; 
    ++i; 
} 
int NumberOfStudents = i; 

Q3 : 어떻게 내 데이터를 정렬 할을? 것이다 라인 "일부 데이터를 교환"는이 일반적인 분류

for(int i = 0; i < NumberOfStudents; i++) { 
    for(j = i; j < NumberOfStudents; j++) { 
     // do some compares 
     // swap some data 
    } 
} 

"어떤을 비교하여"과 :

나는 당신을 위해 selsort 알고리즘을 쓰지 않습니다,하지만 당신은 아마 뭔가를해야합니다 동일한 데이터 구조에서 작동합니다. 따라서 비교 라인이 if (data[i] < data[j]) 인 경우 스왑 라인은 std::swap(data[i], data[j])입니다.

그러나 데이터 구조는 일반적인 것이 아닙니다. 세 개의 병렬 배열이 있습니다. 세 개의 별개 집합이 아닌 단일 집합으로 정렬해야합니다.귀하의 경우에는, 당신의 라인 if (LastNames[i] < LastNames[j]) 수 있습니다 "일부는 비교 할"하지만 스왑 라인이 세 가지 배열에서 동일한 스왑을해야 할 것 :

std::swap(LastNames[i], LastNames[j]) 
std::swap(FirstNames[i], FirstNames[j]) 
std::swap(Scores[i], Scores[j])  

을 그건 그렇고,이 여분의 합병증은 하나의 훌륭한 이유가 왜 당신을 병렬 배열을 절대 사용해서는 안됩니다. 반복하여 스스로 오류를 만들 수 있습니다.

이 답변을 통해 나에게 너무 많은 것을 보여주지 않고 숙제를 완료 할 수 있기를 바랍니다. 도움이된다고 생각되는 답변을 모두 upvote하고 문제를 해결 한 답을 수락하는 것을 잊지 마십시오.

관련 문제