2013-08-08 3 views
2

У меня есть 4 дня обучения на C++, так что несите меня.Создайте массив с внешним файлом в C++

Для оценки экспертизы с множественным выбором требуется два файла данных. В первом файле (booklet.dat) содержатся правильные ответы. Общее количество вопросов 50. Образец файла приведен ниже:

ACBAADDBCBDDAACDBACCABDCABCCBDDABCACABABABCBDBAABD 

второй файл (answer.dat) содержит ответы студентов. В каждой строке есть одна студентка запись, содержащая следующую информацию:

Ответы ученика (всего 50 ответов) в том же формате, что и выше (* указывает на отсутствие ответа). Затем следуют идентификатор студента и имя студента. Пример:

AACCBDBC*DBCBDAAABDBCBDBAA*BCBDD*BABDBCDAABDCBDBDA 6555 MAHMUT 
CBBDBC*BDBDBDBABABABBBBBABBABBBBD*BBBCBBDBABBBDC** 6448 SINAN 
ACB*ADDBCBDDAACDBACCABDCABCCBDDABCACABABABCBDBAABD 6559 CAGIL 

У меня есть домашнее задание написать программу на C++, которая подсчитывает общее количество правильных ответов по каждому студенту и выводит эту информацию в другой файл под названием report.dat. В этом файле должны быть указаны идентификаторы, имена и баллы ученика. Каждый правильный ответ стоит 1 балл. Для файлов примеров, приведенных выше, вывод должен быть следующим:

6555 MAHMUT 10 
6448 SINAN 12 
6550 CAGIL 49 

Вот что я до сих пор:

include <iostream> 
include <fstream> 

using namespace std; 

int main() 
{ 
    char booklet[50] answers[50] 
    int counter 

    // Link answers with booklet.dat 
    booklet = ifstream 
    input_file("booklet.dat"); 
    return 0; 

    // Link answers with answers.dat 
    answers = ifstream 
    input_file("answer.dat"); 
    return 0; 


    while (booklet==answers) 
    { 
     counter++ 
     cout << "The student had">>counter>> "answers right"; 
    } 
} 

Я даже не уверен, что я нахожусь в правильном направлении. Я знаю, что мне нужно создать массив из файла booklet.dat и еще один из файла answer.dat. Затем должно быть сделано сравнение, и нужно совместить совпадения между ними.

Я не ожидаю, что кто-нибудь выполнит задание для меня, мне просто нужно подтолкнуть в правильном направлении.

+0

'буклет == ответы' всегда будут ложными. Включите свои предупреждения (хотя это в первую очередь несовместимо). – chris

+0

Вы уже перечисляете шаги, которые необходимо предпринять для решения ваших проблем, поэтому я думаю, что вы уже находитесь в правильном направлении. Просто будьте осторожны с общим знанием C++ (не возвращайте 'в середине функции без уважительной причины, как сравнивать массивы ...) – Nbr44

+0

После четырех дней можно было бы ожидать, что вы положите точки с запятой в конце строк. –

ответ

1

1.) На вашем Синтаксис:

а) Каждая строка в C++ должен заканчиваться строкой ";". В вашем примере есть несколько строк, которые нет. (Обычно ваша компиляция должна указывать на эту или следующую строку с ошибкой)

b) Множественные определения переменных должны иметь значение «,» между двумя разными переменными.

2.) Я бы порекомендовал вам использовать что-то вроде этого: (взгляните на C++ Reference fstream) EDIT: просто немного контур, который не является полным в этой форме, просто чтобы дать вам и идея ;-)

#include <iostream> 
#include <string> 
#include <fstream> 

using namespace std; 

int main() 
{ 

int nr_of_students = 1000; /* Or any number you'd like to analyze */ 

int stud_nr[nr_of_students]; 
string stud_name[nr_of_students]; 
int stud_count[nr_of_students]; 

fstream in_out; 
in_out.open("filename.dat",fstream::in); // fstream::in for reading from file 
             // fstream::out for writing to this file 
if(in_out.is_open()) 
{ 
    for(lines=0;(in_out>>answers && lines<nr_of_students);lines++) 
    { 
     in_out >> stud_nr[lines]; /* EDIT: sorry hat some index confusions here... */ 
     in_out >> stud_name[lines]; 
     stud_count[lines]=0; 
     for(int i=0;i<50;i++) 
     { 
       /* comparison between the booklet_array and the answers_array */ 
       /* Count up the stud_count[lines] for each right comparison */ 
     } 
    } 

    /* some simmilar code for the output-file */ 
} 
else cout << "Error reading " << "filename.dat" << endl; 

return 1; 
} 

3.) Ваш код также будет иметь большую производительность с векторами. Хороший учебник будет: Tutorial part I и вы часть 2 в комментариях там

4.) вы можете достичь более динамический код с ARGC и ARGV **, просто Google для этого

Я надеюсь, что эти комментарии помогут вам немного продолжить;)

+0

Спасибо, что много для всех. Ввод, я смогу продолжить. Точки с запятой я все время забываю, но компилятор напоминает мне об этом! – Vaaljan

+0

Если бы мой ответ помог вам, можете ли вы так любезно отметить свой ответ и ваш вопрос, который нужно решить? :) – Martin

1

Вы уже находитесь в правильном направлении. В основном вы хотите загрузить ключ ответа в массив для быстрого сравнения, а затем вам нужно проверить ответы каждого учащегося, и каждый раз, когда они получат правильный ответ, вы увеличиваете счетчик и записываете идентификатор, имя и оценку для каждого учащегося.Есть проблемы с кодом, например, с запятой. Также обратите внимание, что возврат завершает функцию и что никакие инструкции после безусловного возврата не выполняются, возврат из основного завершает вашу программу.

нормальный подход, чтобы открыть файл для чтения является:

#include<fstream> 
#include<string> 
int main() 
{ 
    std::ifstream input_file("inputfilename"); 
    // since the answer key is one line 
    // and each students answer , id and name are also one line 
    // getting that line using std::getline() would be sufficient 
    std::string line; 
    std::getline(input_file, line); 
    // line would now contain the entire first line except the newline character 

    std::getline(input_file, line); 
    //now line would now contain the second line in the file 
    return 0; 
} 

Запись в файл похож мы используем ofstream, чтобы открыть файл для записи.

Как так:

#include<fstream> 

int main() 
{ 
    std::ofstream output_file("outputfilename"); 
    // lets say we have a string and an int that we want to write 
    std::string line_to_write("Hello File"); 
    int number = 42; 
    output_file << line_to_write << number; // writes the string and then 42 on the same line 
    output_file << '\n'; // writes the newline character so that next writes would appear on another line 
    return 0; 
} 

Для ссылки на стандартную библиотеку и C++ в общем, когда вы должны знать, доступные функции, чтобы сделать что-то я рекомендую cppreference здесь конкретные страницы на ifstream и ofstream.

Смежные вопросы