Чтение вопросов теста из файла - 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();
}

Объяснение кода листинга программы

  1. В начале кода подключаются необходимые библиотеки: iostream, cstddef, fstream, stdlib.h, printf.h, conio.h, locale.h, string.h.
  2. Объявлены переменные:
    • fname - массив для хранения имени файла теста;
    • f - указатель на файл теста;
    • VsegoVopr - переменная для хранения общего количества вопросов теста;
    • PravOtv - переменная для хранения количества правильных ответов;
    • nOtv - переменная для хранения количества альтернативных ответов на текущий вопрос;
    • Prav - переменная для хранения номера правильного ответа на текущий вопрос;
    • Otv - переменная для хранения номера ответа, выбранного пользователем;
    • p - переменная для хранения процента правильных ответов;
    • st - массив для хранения строки файла теста;
    • i - счетчик циклов.
  3. При помощи функции strcpy_s() имя файла теста из командной строки копируется в массив fname.
  4. Если файл теста не удалось открыть, выводится сообщение об ошибке и программа завершается.
  5. В основной цикл программы while (!feof(f)) происходит чтение вопросов теста из файла и их вывод на экран.
  6. Функция fscanf_s() используется для чтения из файла количества вариантов ответа и номера правильного ответа.
  7. Во внутреннем цикле for каждый вариант ответа выводится на экран.
  8. Пользователь вводит номер выбранного ответа и сохраняет его в переменной Otv.
  9. Если выбранный ответ совпадает с правильным, переменная PravOtv увеличивается на единицу.
  10. После окончания внутреннего цикла вычисляется процент правильных ответов и сохраняется в переменной p.
  11. С помощью условных операторов if-else выводится сообщение с оценкой результата тестирования.
  12. Для завершения программы пользователю предлагается нажать клавишу .

Оцени полезность:

15   голосов , оценка 4.067 из 5