Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
c3490375
1 / 1 / 0
Регистрация: 04.06.2016
Сообщений: 78
Завершенные тесты: 2
#1

Как сделать запись данных из файла в массив по условию для программы тестирования? - C++

21.06.2016, 17:56. Просмотров 265. Ответов 8
Метки нет (Все метки)

Здравствуйте, появилась идея создать свой "тестер".
В связи с этим появилось несколько вопросов, ну чтобы было понятнее опишу работу программы.
Содержимое файла test.txt:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Вопрос 1
Ответ 1
*Ответ 2
Ответ 3
Ответ 4
Ответ 5
 
@Вопрос 2
Ответ 1
Ответ 2
Ответ 3
*Ответ 4
Ответ 5
 
....
 
@Вопрос N
Ответ 1
Ответ 2
Ответ 3
Ответ 4
*Ответ 5

Принцип работы:

1) Для начала открываем файл;
2) Далее считаем кол-во вопросов, а именно по такому алгоритму:
-Каждая пустая строка - 1 вопрос с вариантами ответов, то бишь, если встречаем пустую строку - плюсуем счетчик +1
3) Через for записываем файл в массив структур, сама структура
Сама структура
C++
1
2
3
4
5
6
7
8
9
struct
{
    string question; // Вопрос
    string ans1; // Ответ 1
    string ans2; // Ответ 2
    string ans3; // Ответ 3
    string ans4; // Ответ 4
    string ransw; // Правильный ответ
};

Записываем по такому принципу:
если в начале строки встречаем символ "*", то записываем в ransw,
если @, то записываем в question,
если ничего нет, то в обычный string ans1,2,3,4.

4) Проводит тестирование(тут вопросов пока что нет).

Подскажите, будьте добры, как правильно сделать запись данных из файла в массив по условию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <fstream>
#include <conio.h>
#include <Windows.h>
#include <string>
 
using namespace std;
 
struct test
{
    string question; // Вопрос
    string ans1; // Ответ 1
    string ans2; // Ответ 2
    string ans3; // Ответ 3
    string ans4; // Ответ 4
    string ransw; // Правильный ответ
};
 
void main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    //----------------------------------------------------//
    //Считаем кол-во вопросов
    string string1;
    int n = 0;
    ifstream fin("test.txt");
    while (fin)
    {
        getline(fin, string1);
        if (string1.empty())
        {
            n++;
        }
    }
    cout << "Кол-во вопросов в файле: " << n << endl;
    fin.seekg(0, ios::beg); // Устанавливаем указатель в начало файла.
    //----------------------------------------------------//
    test *questions = new test[n]; // Выделяем динамическую память под кол-во вопросов.
    char ch1 = '*',
        ch2 = '@';
    for (int i = 0; i < n; i++) // Не знаю как реализовать запись в массив структур.
    {
        
    }
    delete[] questions;
    system("pause");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2016, 17:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать запись данных из файла в массив по условию для программы тестирования? (C++):

запись данных из файла в массив - C++
Здравствуйте форумчане! помогите пожалуйста с кодом.Нужно считать числа из файла в массив. В файле 6 строк: текст-знаки-числа, далее...

Загрузка данных для тестирования из файла - Delphi
Делаю тестирование знаний по Русскому языку, так вот столкнулся с проблемой: Есть две программы(будет три), первая регистрирует...

Как сделать массив данных из txt-файла? - PHP
Здравствуйте, есть тхт в нём данные мне нужны все индексы и их значения начиная с tiker индекс ticker значение AA и тд нужно создать...

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

Как сделать загрузочный диск для тестирования? - Системный софт
Здравствуйте,уважаемые участники форума. Представьте себе ситуацию: включаете комп,а сис- тема выдает синие экраны,виснет,или не грузится...

Как и где хранить текстовую информацию для программы тестирования? - Visual Basic
Создаю проект по тестированию. Как и где можно хранить информацию по вопросам и ответам, т.е. откуда брать вопросы? И как их извлекать в...

8
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
21.06.2016, 18:11 #2
Правда появилась идея?
или это дали задачу такую?

просто с такими входными данными трудно работать

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <fstream>
#include <conio.h>
#include <Windows.h>
#include <string>
 
using namespace std;
 
struct test
{
    string question; // Вопрос
    string ans1; // Ответ 1
    string ans2; // Ответ 2
    string ans3; // Ответ 3
    string ans4; // Ответ 4
    string ransw; // Правильный ответ
};
 
void main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    //----------------------------------------------------//
    //Считаем кол-во вопросов
    string string1;
    int n = 0;
    ifstream fin("test.txt");
    while (fin)
    {
        getline(fin, string1);
        if (string1.empty())
        {
            n++;
        }
    }
    cout << "Кол-во вопросов в файле: " << n << endl;
    fin.seekg(0, ios::beg); // Устанавливаем указатель в начало файла.
    //----------------------------------------------------//
    test *questions = new test[n]; // Выделяем динамическую память под кол-во вопросов.
    char ch1 = '*',
        ch2 = '@';
    int nowp = 0; // текущая позиция в questions
    int nowans = 1; // текущий ответ
    for (int i = 0; i < n; i++) // Не знаю как реализовать запись в массив структур.
    {
        getline(fin, string1);
        if (string1.empty())
        {
            nowp++;
            nowans = 1
            continue;
        }
        if(string1[0] == ch1) // считали правильный ответ
        {
            questions[nowp].ransw = string1.substr(1,string1.size()-1);
        }
        else if(string1[0] == ch2) // считали вопрос
        {
            questions[nowp].question = string1.substr(1,string1.size()-1);
        }
        else // считали ответ
        {
            if(nowans==1)questions[nowp].ans1 = string1;
            if(nowans==2)questions[nowp].ans2 = string1;
            if(nowans==3)questions[nowp].ans3 = string1;
            if(nowans==4)questions[nowp].ans4 = string1;
            nowans++;
        }
    }
    delete[] questions;
    system("pause");
}
1
c3490375
1 / 1 / 0
Регистрация: 04.06.2016
Сообщений: 78
Завершенные тесты: 2
21.06.2016, 23:25  [ТС] #3
Цитата Сообщение от Krock21rus Посмотреть сообщение
Правда появилась идея?
или это дали задачу такую?
просто с такими входными данными трудно работать
Правда, идея, ибо в университете множество тестов и просто читая - сложновато запомнить.
Другие тесты - нужно забивать самому - это долговато, да и трудоемко.
Есть ли другой вариант по поводу заполнения массива структур?
Кстати - она не хочет показываться, не знаю - почему?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <fstream>
#include <conio.h>
#include <Windows.h>
#include <string>
 
using namespace std;
 
struct test
{
    string question; // Вопрос
    string ans1; // Ответ 1
    string ans2; // Ответ 2
    string ans3; // Ответ 3
    string ans4; // Ответ 4
    string ransw; // Правильный ответ
};
 
void main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    //----------------------------------------------------//
    //Считаем кол-во вопросов
    string string1;
    int n = 0;
    ifstream fin("test.txt");
    while (fin)
    {
        getline(fin, string1);
        if (string1.empty())
        {
            n++;
        }
    }
    cout << "Кол-во вопросов в файле: " << n << endl;
    fin.seekg(0, ios::beg); // Устанавливаем указатель в начало файла.
    //----------------------------------------------------//
    test *questions = new test[n]; // Выделяем динамическую память под кол-во вопросов.
    char ch1 = '*',
        ch2 = '@';
    int nowp = 0; // текущая позиция в questions
    int nowans = 1; // текущий ответ
    for (int i = 0; i < n; i++) // Не знаю как реализовать запись в массив структур.
    {
        getline(fin, string1);
        if (string1.empty())
        {
            nowp++;
            nowans = 1;
            continue;
        }
        if (string1[0] == ch1) // считали правильный ответ
        {
            questions[nowp].ransw = string1.substr(1, string1.size() - 1);
        }
        else if (string1[0] == ch2) // считали вопрос
        {
            questions[nowp].question = string1.substr(1, string1.size() - 1);
        }
        else // считали ответ
        {
            if (nowans == 1)questions[nowp].ans1 = string1;
            if (nowans == 2)questions[nowp].ans2 = string1;
            if (nowans == 3)questions[nowp].ans3 = string1;
            if (nowans == 4)questions[nowp].ans4 = string1;
            nowans++;
        }
    }
    for (int i = 0; i < n; i++)
    {
        cout  << i << "-q:\n" << questions[i].question << endl << questions[i].ans2 << endl << questions[i].ans3 << endl << questions[i].ans4 << endl << questions[i].ransw << endl;
    }
    delete[] questions;
    system("pause");
}
0
Миниатюры
Как сделать запись данных из файла в массив по условию для программы тестирования?  
c3490375
1 / 1 / 0
Регистрация: 04.06.2016
Сообщений: 78
Завершенные тесты: 2
24.06.2016, 13:59  [ТС] #4
Есть у кого какие-нибудь предложения, как лучше считать строки по условию из файла, ибо я бьюсь уже 3 дня с этим - безрезультатно.
0
nstwf
87 / 77 / 32
Регистрация: 19.02.2016
Сообщений: 336
Завершенные тесты: 1
24.06.2016, 14:30 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Переделайте под себя.
Универсальная программа тестирования
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <conio.h>
#include <string>
 
using namespace std;
void main(int argc, char* argv[])
{
    char fname[40];
    FILE* f; 
    int VsegoVopr = 0;
    int PravOtv = 0; 
    int nOtv;
    int Prav;
    int Otv;
    int p;
    char st[80]; 
    int i; 
    if (!argc)
    {
        puts("\nНе задан файл вопросов теста!");
        puts("Командная строка: test ИмяФайлаТеста\n");
        return;
    }
    strcpy(fname, argv[1]); // имя файла из командной строки
                            // Открыть файл в режиме чтения (r) текста (t)
    if ((f = fopen(fname, "rt")) == NULL)
    {
        printf("Ошибка открытия файла %s", fname);
        getch();
        return;
    }
    system("cls");
    puts("\nСейчас Вам будет предложен тест.");
    puts("К каждому вопросу дается несколько вариантов ответа.");
    puts("Вы должны ввести номер правильного ответа");
    puts("и нажать клавишу <Enter>\n");
    printf("Для начала тестирования нажмите <Enter>");
    _getch();
    system("cls");
    while (!feof(f))
    {
        VsegoVopr++;
        fgets(st, 80, f);
        printf("\n%s\n", st);
        fscanf(f, "%i %i", &nOtv, &Prav);
        fgets(st, 80, f); 
        for (i = 1; i <= nOtv; i++)
        {
            fgets(st, 80, f);
            printf("%i. %s", i, st);
        }
        printf("\nВаш выбор ->");
        scanf("%i", &Otv);
        if (Otv == Prav) PravOtv++;
    }
 
 
    p = 100 * PravOtv / VsegoVopr;
    printf("\nВаша оценка - ");
    if (p == 100) puts("ОТЛИЧНО!");
    if (p >= 99 && p <= 80) puts("ХОРОШО.");
    if (p >= 60 && p <= 79) puts("УДОВЛЕТВОРИТЕЛЬНО.");
    if (p < 60) puts("ПЛОХО!\n");
    puts("\nДля завершения нажмите <Enter>");
    getch();
}
1
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
24.06.2016, 23:55 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
считать количество тестов по пустым строчкам как-то не верно

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

сейчас попробую написать

Добавлено через 16 минут
как-то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <bits/stdc++.h>
#include <vector>
#include <pair>
#include <string>
#include <iostream>
using namespace std;
 
struct quest
{
    string question;
    vector<pair<bool, string> > answers;//первый параметр - правда ли, что ответ правильный?
 
    quest() : question("")
    { };
};
 
void run()
{
    vector<quest> mas;
    char cquest = '@';
    char ctrueans = '*';
    while (!cin.eof() && !cin.fail())
    {
        string s;
        if (getline(cin, s)) // если удалось считать
        {
            bool isgood = false;
            for (int i=0; i < s.size(); i++)
            {
                if (isalnum(s[i]))// буква или цифра
                    isgood = true;
            }
            if (isgood) // если не пустая строчка
            {
                if (s[0] == cquest)// вопрос
                {
                    s = s.substr(1, s.size() - 1);
                    mas.push_back(quest());
                    mas[mas.size() - 1].question = s;
                }
                else if (s[0] == ctrueans)// правильный ответ
                {
                    if(mas.empty())continue;
                    s = s.substr(1, s.size() - 1);
                    mas[mas.size() - 1].answers.push_back(make_pair(1, s));
                }
                else// просто ответ
                {
                    if(mas.empty())continue;
                    mas[mas.size() - 1].answers.push_back(make_pair(0, s));
                }
            }
        }
    }
    // вывод всего
    for (int i = 0; i < mas.size(); i++)
    {
        cout << i+1 << ": " << mas[i].question << endl;
        for (int j = 0; j < mas[i].answers.size(); j++)
        {
            cout << setw(5);
            cout << j+1 << ". " << mas[i].answers[j].second << endl;
        }
        cout << endl;
    }
    system("pause");
}
Добавлено через 23 секунды
для окончания ввода в консоли нажать Ctrl + Z
1
c3490375
1 / 1 / 0
Регистрация: 04.06.2016
Сообщений: 78
Завершенные тесты: 2
25.06.2016, 04:22  [ТС] #7
Цитата Сообщение от Krock21rus Посмотреть сообщение
как-то так
Спасибо огромнейшее !!
А как должно все быть в файле расположено?
0
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
25.06.2016, 14:02 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
в файле надо просто перечислять вопросы таким видом:
@Вопрос1
Ответ11
Ответ12
.
Ответ1n
@Вопрос2
Ответ21
Ответ22
.
Ответ2m


все строчки, которые состоят из хотя-бы одной цифры\буквы будут считаться корректными, остальные не будут обрабатываться
после @Вопрос идёт неограниченное количество Ответов на этот вопрос(до следующего @Вопрос), по одному в строчке, а так же некоторые из них могут быть помечены правильными(несколько правильных ответов)
1
c3490375
1 / 1 / 0
Регистрация: 04.06.2016
Сообщений: 78
Завершенные тесты: 2
25.06.2016, 14:17  [ТС] #9
Цитата Сообщение от Krock21rus Посмотреть сообщение
в файле надо просто перечислять вопросы таким видом:
@Вопрос1
Ответ11
Ответ12
.
Ответ1n
@Вопрос2
Ответ21
Ответ22
.
Ответ2m
все строчки, которые состоят из хотя-бы одной цифры\буквы будут считаться корректными, остальные не будут обрабатываться
после @Вопрос идёт неограниченное количество Ответов на этот вопрос(до следующего @Вопрос), по одному в строчке, а так же некоторые из них могут быть помечены правильными(несколько правильных ответов)
Огромнейшее спасибо, остальное попробую доделать сам!
0
25.06.2016, 14:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2016, 14:17
Привет! Вот еще темы с ответами:

Запись данных из файла в массив - Visual C++
Есть файл с данными, например: asd-bsd-csd-dsd d-s-sa-as Вопрос, как считать в вектор данные, игнорируя символ &quot;-&quot; ???

Программа для тестирования. Как сделать переход на следующий вопрос - C#
//Создать программу тестирования: пользователю на форме предлагается вопрос и //4е варианта ответа (RadioButton), пользователь нажимает...

Как сделать программу для нагрузочного тестирования модуля в Delphi7? - Delphi
в программу должны вноситься входные данные для проверки модуля

Запись текстового файла в массив данных - Python
Кто может подсказать как правильно это сделать? Нужно считать ин-фу с текстового файла вида: qwerty/123456/test/.... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru