чтение информации из текстового файла в 3 разных массива из текстового файла (c )

#c

#c

Вопрос:

У меня возникли проблемы с этой программой из класса c : учитель создал параллельные массивы учащихся с фамилиями, отчествами и результатами тестов. Массивы расположены таким образом, что n-й элемент каждого массива содержит связанную информацию. Напишите программу, которая сортирует (используя сортировку по выбору) массивы по фамилии учащихся, так что n-й член каждого массива по-прежнему содержит данные, относящиеся к нужному человеку. например, исходные данные массива следующие:

Ратте Исмелла66,
Браун Том 88,
Дирт Фил 94,
Дент Стю 100

После сортировки:

Браун Том 88
Дент Стю 100
Дырт Фил 94
Ратте Исмелла 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, amp;s1,string amp;s2)
void swap (int amp;i1, int amp;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;
    }
  

Я знаю, что я должен читать файл в виде слов, а не строк, я не знаю, как поместить их в массивы на основе фамилии first name и score, и переменные, используемые в моих объявлениях selsort и swap, неверны, и, наконец, я должен использовать только одномерные массивы.

Ответ №1:

Похоже, у вас возникло несколько вопросов относительно вашего домашнего задания.

Q1: Как мне сохранить свои данные?

Во-первых, вам нужно объявить массивы. В 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
    }
}
  

При обычной сортировке строки «выполнить некоторое сравнение» и «поменять местами некоторые данные» будут работать с одними и теми же структурами данных. Итак, если ваша строка сравнения похожа на if (data[i] < data[j]) , то ваша строка подкачки будет выглядеть как std::swap(data[i], data[j]) .

Однако ваши структуры данных не являются типичными. У вас есть три параллельных массива, которые должны быть отсортированы как единый набор, а не как три разных набора. В вашем случае ваша строка «do some comparies» может быть if (LastNames[i] < LastNames[j]) , но ваши строки подкачки должны будут выполнять идентичные подкачки во всех трех массивах:

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

Кстати, это дополнительное усложнение является одной из отличных причин, по которой вам никогда не следует использовать параллельные массивы — они заставляют вас повторяться, увеличивая вероятность ошибки.

Я надеюсь, что этот ответ позволит вам самостоятельно выполнить домашнее задание, не показывая вам слишком много того, как это сделать. Не забудьте проголосовать за каждый ответ, который вы сочли полезным, и принять ответ (если таковой имеется), который решил вашу проблему.

Ответ №2:

Что-то вроде:

 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(), пока не поймете, что она на самом деле делает — подсказка: она не предсказывает, приведет ли следующее чтение к завершению файла.

Комментарии:

1. Я думаю, что это может быть проще для реализации, если OP использует один массив вместо 3.

2. @P.R. Прочитайте заголовок вопроса.

3. Хм, да, к сожалению, он запрашивает 3 параллельных массива :/

Ответ №3:

Я не буду писать код для этого (HW que), но все же дам вам общее представление о том, как это сделать на c .

1) Структура данных для каждого учащегося.

struct stud{
std::последняя строка;
std::сначала строка; 
число int 
};

2. обозначьте полученную строку пробелами или сделайте так, как предложил унапперссон.

вашим контейнером будет :: vector < student * > students; [НЕ ЗАБУДЬТЕ УДАЛИТЬ УКАЗАТЕЛИ]

3. Откройте last name как :: students[итератор] -> last и выполните сортировку выборки по строкам.

вектор < stud *> ::итератор it; 
для(it = students.begin() ; it != students.end() ; it  ){
// Это способ выполнить итерацию по вашему контейнеру students
}