Программа для тестирования, с возможностью добавления новых вопросов, страница 2

fscanf(stream,"%c",&vald);

FileCont[i][j]=vald;

++j;

if (vald=='\n')  {FileCont[i][j-1]='\0'; ++i; j=0;}

}

FileCont[i][j-1]='\0';

fclose(stream);

return i;

}

Этот модуль аналогичен предыдущему, только он возвращает количество строк в файле

И не записывает характеристики вопросов

Модуль WRITE

/*

Данная функция предназнацена для ввода 1 - го вопроса в файл с вопросами ввод данных(вопроса) осуществляется по средством самой функции

*/

#include <iostream.h>

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include "grani.h"

int read (conteinf);

void write ()

{

//описание переменных

int  N, i, j, h;

conteinf FCont;

identq SQ;

FILE *fp;

strw str;

//прочтение файла в массив FCont и чтение количества строк в нем в массив N

N = read (FCont);

cout<<"Введите вопрос:"<<endl;

i=0;//порядковый номер вводимой пользователем строки

str[0]='1';//сначала установим нчальный симвал не 0 чтобы завелся цикл

while (str[0]!='0')//делаем пока пользователь не введът строку с нулем

{

++i;

str[0]=' ';

str[1]='\0';//эти две строки создают нейтральную строку, что позволяет избежать ошибок

gets(str);//принимаем введенную пользователем строку

if (str[0]==0) str[0]=' ';//если пользователь переходит на новую строку

if (str[0]!=0) //если пользовотель ввел строку

{

for (j=0; j<=strlen(str); j++)//делаем пока не достигнем конца введенной строки

FCont[N+i][j]=str[j];//в массив, содержащий содержание файла дописываем новую строку

}

}

//когда пользователь ввел ноль и решил что пора закончить ввод вопроса

N=N+i-1;//изменяем в опер памяти размер файла + строки

clrscr();

cout<<"Запись..."<<endl;

j=1;

fp=fopen("vopros.dat","w");// открываем файл для записи

for (i=0; i<=N; i++) //запись в файл

{

if (i==0)

fprintf(fp,"%s", FCont[i]);

else

fprintf(fp,"\n%s", FCont[i]);

}

clrscr();

cout<<endl<<"Записано"<<endl;

fclose(fp);

}

Этот модуль осуществляет запись нового вопроса в файл. Вызывает функцию READ.

Ввод данных осуществляется при помощи функции READ и есть построчный ввод вопросов для записи (переменная strw str)

Модуль TESTING

/*

void testing ()

______________________________________________________________

Данная функци осуществляет тестирование, а именно:                         

1-просчет какие вопросы следует выводить                   

2-вывод вопросов по одному                                  

3-ввод ответов на каждый вопрос                            

4-подсчет и вывод результатов                                  

______________________________________________________________

*/

#include <iostream.h>

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <stdlib.h>

#include "grani.h"

int readall (conteinf, identq );

void testing ()

{

//описание переменных

int bal=0, i, j, k, N, n, vopr,bl,key=0;

char otv[2];

conteinf FCont;

identq SQ;

//чтение файла и ввод количества выводимых вопросов

N = readall(FCont, SQ);

i=1;

while (i)

{

clrscr();

cout<<endl<<"Вопросов в вайле: "<<N;

cout<<endl<<"Вывести вопросов: "; cin>>n;

if ((n<=0)||(n>N))

{

cout<<endl<<"Введено некорректрое количество вопросов";

getch();

}

else

i=0;

}

randomize();

bl=N/n;//размер блока

if (N%n) key=1; //если блоков не целое число? то 1 блок будет рассматриваться

if (bl==0) bl=1;//блок должен иметь длину

cout<<endl;

vopr=0; //номер выводимого вопроса

for (i=1; i<=n; i++) //выполняем столько раз скока нада вывести вопросов

{

clrscr();

//проверяем что нада сделать

if (key==0) bl=N/n;//если перыый раз меняли длину блока то на исходную длину

if (bl==0) bl=1;   //блок всегда имеет длину

if (key==1)//если нада считаем макс. длину первого блока

{

if (bl==1) bl=N-bl*n;//если блок состоит из 1 вопроса

else

bl=N-bl*(n-1); //если блок состоит из более 1 вопроса

key=0;

}

k=0;//порядковый номер в текущем блоке

while (!k) k=random(bl+1); //номер вопроса в блоке не может быть равен 0

//прибавляем к выведеным вопросам сгенерированое количество каторое случайно из размера блока

vopr=vopr+k;

//выводим вопрос номер vopr

for (j=SQ[vopr][1]+1; j<=SQ[vopr][1]+1+SQ[vopr][2]-2; j++)//выводим текущий вопрос

cout<<FCont[j];

//вводим ответ

cout<<endl<<"Ответ: ";

gets(otv);

//если ответ правильный, то добавляем балл

if (otv[0]==FCont[SQ[vopr][1]][0])  ++bal;

//ставим настройки для следующего повтора цикла

otv[0]=0;

vopr=vopr+bl-k;

}

clrscr();

cout<<"Вы ответили на "<<bal<<" вопросов из "<<n;

}

Этот модуль принимает только количество вопросов (int n) и ответы на вопросы

(char otv[2])

Заголовочный файл GRANI.h

/*

conteinf[максимум строк в файле][максимальная длина строки]

strw[максимальная длина строки]

identq[максимум вопросов в файле][3]

заметьте что между conteinf и strw должно быть соответствие

*/

typedef char conteinf[100][100];

typedef int  identq[100][3];

typedef char  strw[100];

Содержание этого файла хорошо описывает его суть

Как именно работают модули хорошо описано в пояснительных строках. Поэтому блок схемы модулей не представлены

Общая блок схема программы: