Так как программа должна хранить вопросы в файле, то первым делом я разработал структуру файла, содержащего вопросы.
Структура файла:
Файл может начинаться как угодно и иметь сколько угодно строк в начале, (ограничено максимальной длиной файла и размерами стека. Этот вопрос решает пользователь с помощью файла GRANI.h когда программа еще не откомпелирована). Рабочая часть файла начинается с первой строки, содержащей цифру(и ни чего более). Итак, после цифры следует какой угодно текстовый вопрос, пока не будет стоять следующая цифра, или не будет достигнут конец файла.
………….
Строки цифра строки вопроса цифра следующий вопрос строки следующего вопроса
…………
и т. д.
Программа имеет возможность дополнить файл и прочитать вопросы из файла.
Для записи и чтения файла используется стандартная система ввода/вывода.
Еще до того как я начал писать программный код, я понял, что разрабатывать программу не стоит в одном файле, так как это не совсем удобно. А модульная структура более совершенна и один модуль легче исправить чем всю программу.
ФАЙЛЫ:
В программе имеются следующие модули:
1) MAIN – управляющая программа, которая запускает другие модули.
2) READALL – этот модуль считывает в массив содержимое всего файла в массив, номера строк, с которых начинается каждый вопрос (включительно ответ) и на которых заканчивается и возвращает количество вопросов в файле.
3) READ – этот модуль читает файл в массив и возвращает количество строк в нём.
4) TESTING – этот модуль и есть сам процесс теста. Вызывает функцию READALL.
5) WRITE – процесс записи нового файла. Вызывает функцию READ
Прочие файлы:
6) GRANI.H – это заголовочный файл, описывающий размеры массивов (используется при отладке программы)
7) RGZ.bat – это файл, запускающий сначала RKEGA.COM а потом потом сам RGZ.EXE
(через него следует запускать программу, для возможности написания русских символов)
8) RKEGA.COM – русификатор
9) vopros.dat – файл, содержащий все вопросы.
10) RGZ.EXE – готовая программа
Код:
/*
Функция мэйн, название говорит само за себя, код этой функции предельно прост, что дает возможность более продуктивной отладки программы
*/
#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include "grani.h"
void write();
void testing ();
void main()
{
int deist;
while (1==1)
{
clrscr();
cout<<"Выберите действие:"<<endl;
cout<<"1 - Проведение теста"<<endl;
cout<<"2 - Записать новый вопрос"<<endl;
cout<<"3 - Выход"<<endl;
cin>>deist;
switch(deist)
{
case(1): clrscr(); testing(); break;//Вывод вопросов
case(2): clrscr(); write (); break;//Запись вопроса
case(3): abort();
}
getch();
}
}
Этот модуль, как говорилось раньше главный и запускает другие модули в зависимости от того, что выберет пользователь.
Код:
/*
int readall ()
данная функция предназначина для чтения файла и записи его содержимого в текстовый массив а также записывает в инт массив характеристики каждого вопроса:
SQ[номер вопроса][1]=строка с каторой начинается вопрос, включительно отв.
SQ[номер вопроса][2]=количество строк, включительно ответ на вопрос
readall=количество вопросов в файле
*/
#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "grani.h"
int readall (conteinf FileCont, identq SQ)
{
//описание переменных
char vald;
int prald,i,j,k,Svopr;
FILE *stream;
//устанавливаем связь с файлом
stream=fopen("vopros.dat","r");
//чтение файла
i=0;j=0;
while (feof(stream)==0)
{
fscanf(stream,"%c",&vald);
FileCont[i][j]=vald;
++j;
if (vald=='\n') {FileCont[i][j]='\0'; ++i; j=0;}
}
FileCont[i][j-1]='\0';
//определение количества вопросов и запись в массив строки с которых начинается каждый вопрос
Svopr=0;
j=0;
for (k=0;k<=i+1;k++)
{
if (strlen(FileCont [k])==2)
if ((FileCont [k][0]>=48)&&(FileCont [k][0]<=57))
{
++Svopr;
SQ[Svopr][1]=k;
SQ[Svopr-1][2]=j;
j=0;
}
++j;
}
//идем до конца
SQ[Svopr][2]=i+1-SQ[Svopr][1];
fclose(stream);
return Svopr;
} Переменные по ссылке:
Conteinf FileCont – массив, в который следует записать содержание файла
Identq SQ – массив, в который записывается начало вопроса, включительно ответ (SQ[№][1]) и длина строк вопроса включительно (SQ[№][2])
Возвращаемое значение:
Int число вопросов в файле
/*
int readall ()
данная функция предназначина для чтения файла в массив
FileCont - массив в каторый надо записать полное содержание файла с вопросами
read=количество строк в файте
*/
#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "grani.h"
int read (conteinf FileCont)
{
//описание переменных
char vald;
int i,j;
FILE *stream;
//устанавливаем связь с файлом
stream=fopen("vopros.dat","r");
//чтение файла
i=0;j=0;
while (feof(stream)==0)
{
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.