Member 14982907 Ответов: 2

Мой код не работает, есть много ошибок компиляции, и это я знаю, что я испортил включение функций вместе с моим системным кодом заполнения


Для этого кода мне было поручено сделать программу, которая отвечала бы всем этим требованиям:

Часть 1 :
Напишите программу, которая будет тестировать пользователя по крайней мере на 5 вопросов "C++". Вопросы таковы
быть представленным в форме множественного выбора. Помнить:
а) попросить пользователя ввести свое имя (возможно, либо имя, либо полное имя)
б. использовать либо числовые ответы (1), либо Альфа-ответы (а)
c. чтобы сохранить ваши вопросы, соответствующие школе!
d. количество пользователей неизвестно.
e. разработать способ прекращения действия вопросника.
f. хранить ответы пользователей в последовательном файле.

Часть 2:
Создайте файл ответов для своей анкеты-викторины.

Часть 3:
Напишите программу, которая будет обращаться к вашему файлу "data", созданному в части 1, и "забивать" пользователей'
ответы на файл "ответ". Помнить:
а. что количество пользователей считается неизвестным.
б. распечатать дисплей, показывающий имя и счет каждого пользователя.

Любая помощь будет очень признательна, так как я новичок в c++ и пытаюсь изучить все ошибки, которые я сделал, и их происхождение.

Что я уже пробовал:

#include <iostream> //library for input output stream
#include <fstream> //library for reading and writing files
#include <assert.h> //for the assert function
using namespace std;

struct Components //Components variable has all the variables relating to the Component of the Quiz  
{
    string name; 
    int score = 0;
    char ans1,ans2,ans3,ans4,ans5,ans6; 
    ofstream fout;
};

void GetInfo(Components);
void Print(Components);
void PrintAnswer(Components);

int main()
{
    cout<<"Hello user,this code is meant to Quiz you on multiple choice questions and then grade your answers.";
    cout<<"When finished your Quiz enter in the Keyword \"finished\" to finish your quiz and this program";
    char Continue;
    do{
    Components variables;
    GetInfo(variables);
    Print(variables);
    PrintAnswer(variables);
    cout<<"Do you wish to take this quiz again? If so, please enter in y or Y otherwise press n.";
    cin>>Continue;
    }while(Continue == 'y' || Continue == 'Y');
}

void GetInfo(Components)
{
    variables.fout.open("Quiz.txt", ios::out);
    assert(!variables.fout.fail());
    cout<<"Okay user, please enter in your first and last name";
    getline(cin.variables.name);
    
    cout<<"............................................................................"<<endl;
    cout<<"1: When working with multiple files (at the same time), the stream variables"<<endl;
    cout<<"\na. must all be of the same type, such as all ifstream, or all ofstream.";
    cout<<"\nb. must each be named independently, such as fin1, fin2, or fout1, fout2.";
    cout<<"\nc. must all be named the same, such as all fin and/or fout.";
    cout<<"\nd. are not needed since multiple files are present."<<endl;
    cin>>variables.ans1;
    
    cout<<"............................................................................";
    cout<<"\n2: The required header file that allows classes of ofstream and ifstream to become available is"<<endl;
    cout<<"\na. iostream";
    cout<<"\nb. filestream";
    cout<<"\nc. assert.h";
    cout<<"\nand. fstream"<<endl;
    cin>>variables.ans1;
    
    cout<<"............................................................................";
    cout<<"\n3: When creating a new file, if a file of the same name already exists,"<<endl;
    cout<<"\nthe system will inform you that that file name is already in use.";
    cout<<"\na. true";
    cout<<"\nb. false"<<endl;
    cin>>variables.ans1;
    
    cout<<"............................................................................";
    cout<<"\n4: In the statement: fin.open(\"myfile.dat\", ios::in); the ios::in is the"<<endl;
    cout<<"\na. stream variable name";
    cout<<"\nb. name of the file";
    cout<<"\nc. stream operation mode";
    cout<<"\nd. name of the buffer"<<endl;
    cin>>variables.ans1;
    
    cout<<"............................................................................";
    cout<<"\n5: What is the purpose of this line of code? Be specific."<<endl;
    cout<<"\nfout.open(\"name.dat\",ios::app);";
    cout<<"\na. Open a brand new binary file.";
    cout<<"\nb. Append the file";
    cout<<"\nc. ios::app is a new file";
    cout<<"\nd. Delete the file"<<endl;
    cin>>variables.ans1;
    cout<<"............................................................................";
    
        if(ans1 == 'b' || ans1 == 'B'){
        variables.score++;
        }if(ans2 == 'd' || ans2 == 'D'){
        variables.score++;
        }if(ans3 == 'b' || ans3 == 'B'){
        variables.score++;
        }if(ans4 == 'c' || ans4 == 'C'){
        variables.score++;   
        }if(ans5 == 'b' || ans5 == 'B'){        {
        variables.score++;  
        }
        fout<<"Okay, "<<varibales.name<<" your total score is: "<<variables.score;
        
    variables.fout.close();
}

void Print(Components)
{
    ifstream fin;
    fin.open("Quiz.txt", ios::in);
    while(fin>>variables.name)
    {
        fin>>variables.score;
        if(variables.name != ""){
            cout<<"OKay, "<<variables.name<<" your score is "<<variables.score<<endl;
        }
    }
    cout<<"Your Quiz has now officially been completed!";
    fin.close();
}

void PrintAnswer(Components)
{
    variables.fout.open("AnswerSheet.txt", ios::in);
    cout<<"This is the file that has all the answers to your quiz and because you have finished it you can now see the answers."<<endl;
    fout<<"The answer to Question 1 is 'b'";
    fout<<"The answer to Question 2 is 'd'";
    fout<<"The answer to Question 3 is 'b'";
    fout<<"The answer to Question 4 is 'c'";
    fout<<"The answer to Question 5 is 'b'";
    variables.fout.close();
}
<pre lang="c++">

Rick York

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

Кстати - функции toupper и tolower очень удобны.

Member 14982907

Да, я не думал, что многие люди захотят отлаживать это для меня, потому что это очень долго, ну, для меня это так или иначе.

Richard MacCutchan

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

Richard Deeming

"Натыкаясь" на ваш вопрос, вы не заставите нас передумать и сделать вашу работу за вас.

Member 14982907

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

Richard Deeming

"Bumping" означает редактирование вашего вопроса без внесения каких-либо заметных изменений только для того, чтобы вернуть его в начало списка. Это очень грубо, и в конечном итоге ваш вопрос будет удален.

Rick York

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

Member 14982907

Я действительно написал код, но я не понимаю недостатков, потому что я все еще учусь делать файлы и другой код.

Richard MacCutchan

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

Затем добавьте правильные ссылки на параметры и имена для ваших функций:

void GetInfo(Components& variables) // the function needs the name in order to refer to its content
{
   variables.fout.open("Quiz.txt", ios::out);
}


Возможно, есть и другие проблемы, которые я не заметил.

Member 14982907

- Спасибо, сэр, я очень ценю вашу помощь.

2 Ответов

Рейтинг:
2

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали электронное письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

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

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!


Рейтинг:
0

Member 14982907

Теперь все в порядке, я исправил свой код и больше не нуждаюсь в помощи. Спасибо, всем тем, кто хоть это сделал!

#include <iostream> //library for input output stream
#include <fstream> //library for reading and writing files
#include <assert.h> //for the assert function
using namespace std;

struct Components //Components variable has all the variables relating to the Component of the Quiz
{
    string name,done;
    int score;
    int TotalScore = score;
    char ans1,ans2,ans3,ans4,ans5,ans6;
    ofstream fout;
};

void GetInfo(Components &variables);
void PrintScore(Components &variables);
void AnswerSheet(Components &variables);

int main()
{
    cout<<"Hello user,this code is meant to Quiz you on multiple choice questions and then grade your answers."<<endl;
    char Continue;
    do{
    Components variables;
    GetInfo(variables);
    PrintScore(variables);
    AnswerSheet(variables);
    cout<<"............................................................................";
    cout<<"\nDo you wish to take this quiz again? If so, please enter in y or Y otherwise press any other key: ";
    cin>>Continue;
    }while(Continue == 'y' || Continue == 'Y');
}

void GetInfo(Components &variables)
{
    variables.fout.open("Quiz.txt", ios::out);
    assert(!variables.fout.fail());
    cout<<"Okay user, please enter in your first and last name: ";
    cin>>variables.name;

    cout<<"............................................................................"<<endl;
    cout<<"1: When working with multiple files (at the same time), the stream variables"<<endl;
    cout<<"\na. must all be of the same type, such as all ifstream, or all ofstream.";
    cout<<"\nb. must each be named independently, such as fin1, fin2, or fout1, fout2.";
    cout<<"\nc. must all be named the same, such as all fin and/or fout.";
    cout<<"\nd. are not needed since multiple files are present.";
    cout<<"\nANSWER: "<<endl;
    cin>>variables.ans1;

    cout<<"............................................................................";
    cout<<"\n2: The required header file that allows classes of ofstream and ifstream to become available is"<<endl;
    cout<<"\na. iostream";
    cout<<"\nb. filestream";
    cout<<"\nc. assert.h";
    cout<<"\nand. fstream";
    cout<<"\nANSWER: "<<endl;
    cin>>variables.ans2;

    cout<<"............................................................................";
    cout<<"\n3: When creating a new file, if a file of the same name already exists,"<<endl;
    cout<<"\nthe system will inform you that that file name is already in use.";
    cout<<"\na. true";
    cout<<"\nb. false";
    cout<<"\nANSWER: "<<endl;
    cin>>variables.ans3;

    cout<<"............................................................................";
    cout<<"\n4: In the statement: fin.open(\"myfile.dat\", ios::in); the ios::in is the"<<endl;
    cout<<"\na. stream variable name";
    cout<<"\nb. name of the file";
    cout<<"\nc. stream operation mode";
    cout<<"\nd. name of the buffer";
    cout<<"\nANSWER: "<<endl;
    cin>>variables.ans4;

    cout<<"............................................................................";
    cout<<"\n5: What is the purpose of this line of code? Be specific."<<endl;
    cout<<"\nfout.open(\"name.dat\",ios::app);";
    cout<<"\na. Open a brand new binary file.";
    cout<<"\nb. Append the file";
    cout<<"\nc. ios::app is a new file";
    cout<<"\nd. Delete the file";
    cout<<"\nANSWER: "<<endl;
    cin>>variables.ans5;
    cout<<"............................................................................";

        if(variables.ans1 == 'b' || variables.ans1 == 'B'){
        variables.score;
        }if(variables.ans2 == 'd' || variables.ans2 == 'D'){
        variables.score;
        }if(variables.ans3 == 'b' || variables.ans3 == 'B'){
        variables.score;
        }if(variables.ans4 == 'c' || variables.ans4 == 'C'){
        variables.score;
        }if(variables.ans5 == 'b' || variables.ans5 == 'B'){
        variables.score;
        }
        cout<<endl;
        cout<<"Okay, "<<variables.name<<" your total score is: "<<variables.score<<endl;
    variables.fout.close();
}

void PrintScore(Components &variables)
{
    ifstream fin;
    fin.open("Quiz.txt", ios::in);
    if(fin.fail())
    {
        cout<<"Error, please check your code.";
    }
    else
    {
        string read;
        while(fin>>read)
        {
            cout<<read;
            cout<<"\nOkay, "<<variables.name<<", your score is "<<variables.TotalScore<<endl;
        }
    }
    cout<<"Your Quiz has now officially been completed!"<<endl;
    cout<<"............................................................................"<<endl;
    fin.close();
}

void AnswerSheet(Components &variables)
{
    variables.fout.open("AnswerSheet.txt", ios::in);
    cout<<"\nThis is the file that has all the answers to your quiz and because you have finished it you can now see the answers."<<endl;
    cout<<"\nThe answer to Question 1 is 'b'";
    cout<<"\nThe answer to Question 2 is 'd'";
    cout<<"\nThe answer to Question 3 is 'b'";
    cout<<"\nThe answer to Question 4 is 'c'";
    cout<<"\nThe answer to Question 5 is 'b'"<<endl;
    variables.fout.close();
}