Чтение вопросов теста из файла - C (СИ)
Формулировка задачи:
Вот сам код Не хочет работать
// Универсальная программа проверки знаний #include "stdafx.h" #include <iostream> #include <cstddef> #include <cstring> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <string.h> using namespace std; void main(int argc, char* argv[]) { char fname[40]; // имя файла теста FILE* f;// файл теста f = fopen("fname.txt", "rt"); int VsegoVopr = 0; // количество вопросов теста int PravOtv = 0; // количество правильных ответов // для текущего вопроса272 Часть I int nOtv; // количество альтернативных ответов int Prav; // номер правильного ответа int Otv; // номер ответа, выбранного пользователем int p; // процент правильных ответов char st[80]; // строка файла теста int i; // счетчик циклов if (!argc) { puts("\nНе задан файл вопросов теста!"); puts("Командная строка: test ИмяФайлаТеста\n"); return; } strcpy_s(fname, argv[1]); // имя файла из командной строки if (f!=NULL) // Открыть файл в режиме чтения (r) текста (t) { printf("Ошибка открытия файла %s", fname); system("pause"); return; } system("cls"); puts("\nСейчас Вам будет предложен тест."); puts("К каждому вопросу дается несколько вариантов ответа."); puts("Вы должны ввести номер правильного ответа"); puts("и нажать клавишу <Enter>\n"); printf("Для начала тестирования нажмите <Enter>"); system("pause"); //textbackground(BLUE); system("cls"); while (!feof(f)) { VsegoVopr++; fgets(st, 80, f); // читаем из файла вопрос printf("\n%s\n", st); // вопрос на экран fscanf_s(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_s("%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>"); system("pause"); }
Вот убрал все ошибки, пишет что fopen_s: функция не принимает 2 аргументов
Вот код:
// Универсальная программа проверки знаний // имя файла теста задается в инструкции запуска программы #include "stdafx.h" #include <iostream> #include <cstddef> #include <fstream> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <string.h.> #include <cstdlib> 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_s(fname, argv[1]); // имя файла из командной строки // Открыть файл в режиме чтения (r) текста (t) if ((f = fopen_s(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_s(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_s("%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(); }
Решение задачи: «Чтение вопросов теста из файла»
textual
Листинг программы
// Универсальная программа проверки знаний // имя файла теста задается в инструкции запуска программы #include <iostream> #include <cstddef> #include <fstream> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <locale.h> #include <string.h> void main(int argc, char* argv[]) { char fname[40]; // имя файла теста FILE* f = NULL; // файл теста int VsegoVopr = 0; // количество вопросов теста int PravOtv = 0; // количество правильных ответов // для текущего вопроса int nOtv; // количество альтернативных ответов int Prav; // номер правильного ответа int Otv; // номер ответа, выбранного пользователем int p; // процент правильных ответов char st[80]; // строка файла теста int i; // счетчик циклов setlocale(LC_ALL, "Rus"); if (!argc) { puts("\nНе задан файл вопросов теста!"); puts("Командная строка: test ИмяФайлаТеста\n"); return; } strcpy_s(fname, 40, 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_s(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_s("%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(); }
Объяснение кода листинга программы
- В начале кода подключаются необходимые библиотеки: iostream, cstddef, fstream, stdlib.h, printf.h, conio.h, locale.h, string.h.
- Объявлены переменные:
- fname - массив для хранения имени файла теста;
- f - указатель на файл теста;
- VsegoVopr - переменная для хранения общего количества вопросов теста;
- PravOtv - переменная для хранения количества правильных ответов;
- nOtv - переменная для хранения количества альтернативных ответов на текущий вопрос;
- Prav - переменная для хранения номера правильного ответа на текущий вопрос;
- Otv - переменная для хранения номера ответа, выбранного пользователем;
- p - переменная для хранения процента правильных ответов;
- st - массив для хранения строки файла теста;
- i - счетчик циклов.
- При помощи функции strcpy_s() имя файла теста из командной строки копируется в массив fname.
- Если файл теста не удалось открыть, выводится сообщение об ошибке и программа завершается.
- В основной цикл программы while (!feof(f)) происходит чтение вопросов теста из файла и их вывод на экран.
- Функция fscanf_s() используется для чтения из файла количества вариантов ответа и номера правильного ответа.
- Во внутреннем цикле for каждый вариант ответа выводится на экран.
- Пользователь вводит номер выбранного ответа и сохраняет его в переменной Otv.
- Если выбранный ответ совпадает с правильным, переменная PravOtv увеличивается на единицу.
- После окончания внутреннего цикла вычисляется процент правильных ответов и сохраняется в переменной p.
- С помощью условных операторов if-else выводится сообщение с оценкой результата тестирования.
- Для завершения программы пользователю предлагается нажать клавишу
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д