Я вот тут все никак доделать не могу, прога но у нее примочка типа шифрование правильных ответов есть и сохранение их в спец файл, правда вариант консольный но вдруг понравится
Код | #include<fstream.h> #include<iostream.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #include<conio.h> #include<stdio.h> #include<dos.h> #include<time.h>
struct date d; time_t t;
fstream mainh;
int digitstr( char numstrb[] ) { int i, j; for( i=0, j=0; numstrb[ i ]!='\0'; ++i ) if( !isdigit(numstrb[ i ]) ) j++; return ( j>0 ) ? (-1) : 0; }
int cipher_up( int key, int &x, int year ) { x+=year; return ( key >=0 ) ? cipher_up( --key, x, year++ ) : x; }
int cipher_down( int key, int &x, int year ) { x-=year; return ( key >=0 ) ? cipher_down( --key, x, year++ ) : x; }
/* || */ void minpassw( int variantov, int voprosov, int otvetov, int year, int key ) { //variant - количество вариантов //voprosov- количество вопросов //otvetov - количество ответов на каждый вопрос //key - ключь int i, j, c; int x=0;
srand( (unsigned)time(&t) );
mainh.seekg( 0, ios::beg );
mainh.write( (char *)&variantov, sizeof(int) ); mainh.write( (char *)&voprosov, sizeof(int) );
for( i=0; i<variantov; i++ ) { for( j=0; j<voprosov; j++ ) { x=rand() % (otvetov); cipher_up( key, x, year ); mainh.write( (char *)&x, sizeof(int) );
}
}
return; }
int minread( int variant, int vopros, int year, int key ) { int *DT, *BT, i, j, x;
DT=new int[ 2 ];
mainh.clear(); mainh.seekg( 0, ios::beg );
for( i=0; i<2; ++i ) mainh.read( (char *)&DT[ i ], sizeof(int) );
if( variant>DT[ 0 ] || variant<=0 ) { cout << "Incorrect number of variant!"; return (-1); } else if( vopros>DT[ 1 ] || vopros<=0 ) { cout << "Incorrect number of question!"; return (-1); }
BT=new int[ DT[ 1 ] ]; --variant; --vopros;
mainh.flush(); mainh.seekg( (variant*(DT[ 1 ]*sizeof(int)))+(vopros*sizeof(int)), ios::cur ); mainh.read( (char *)&x, sizeof(int) );
x=cipher_down( key, x, year );
delete [] DT; delete [] BT; //mainh.flush(); return x; }
void main( int argc, char *argv[] ) { fstream f_inout; char filename[ 20 ], cmdl[ 50 ]; int i, j, c, variantov=0, voprosov=0, otvetov=0, KEY=0, *correct, *msg, ly; getdate( &d );
//cоздать бинарный файл для сохранения параметров mainh.open( "main.$$$", ios::in | ios::out | ios::binary ); if( mainh.fail() ) //Проверка на открытие файла { cout << "Ошибка чтения файла параметров\n"; getch(); // остановка до нажатия любой клавиши exit( 1 ); }
if( argc>1 ) strcpy( cmdl, argv[ 1 ] );
else { for( ly=0; ly!=3 && ly!=2 && ly!=1; ) { clrscr(); cout << "[ 1 ] Создать экзамен" << endl << "[ 2 ] экзаменировать" << endl << "[ 3 ] Выход" << endl << "Введите 1,2,3 : "; cin >> ly; cin.ignore();
switch( ly ) { case 1: strcpy( cmdl, "create" ); argc=2; break; case 2: strcpy( cmdl, "examin" ); argc=2; break; case 3: return; } } }
if( stricmp(cmdl, "create")==0 ) {
if( argc==5 ) { variantov=atoi( argv[ 2 ] ); voprosov=atoi( argv[ 3 ] ); otvetov=atoi( argv[ 4 ] ); } else { cout << "Введите кол-во вариантов, кол-во вопросов, кол-во ответов (через пробел)[ENTYER]"; cin >> variantov >> voprosov >> otvetov; } if( voprosov>0 ) correct=new int[ voprosov ]; else { cout << "Error !" << endl; return; }
// ==-- данные генерируются и вносятся в служебный файл --== minpassw( variantov, voprosov, otvetov, d.da_year, KEY ); for( i=1; i<=variantov; i++ ) // файлов { itoa( i, filename, 10 ); strcat( filename, "_varnt.txt" );
f_inout.open( filename, ios::out ); if( f_inout.fail() ) //Проверка на открытие файла { cout << "Ошибка чтения файла вариынта\n"; getch(); exit( 1 ); } //вносим начальные данные f_inout << "; --+-- \n" << "; --+-- \n" << "; Вариант номер - " << i << " \n" << ";\n";
for( c=1; c<=voprosov; ++c ) //узнаем правильные ответы на этот вариант correct[ c-1 ]=((minread( i, c, d.da_year, KEY ))+1);
for( j=1; j<=voprosov; j++ ) // вопросов { f_inout << "---------------------------------\n" << "Вопрос номер " << j << "\n" << "---------------------------------\n" << " Место для\n" << " вопроса\n" << "\n" << "Ответы: \0"; for( c=1; c<=otvetov; c++ ) // ответов f_inout << c << " \0"; f_inout << "\n";
f_inout << "Правильный: " << correct[ j-1 ] << " ;<-- это удалить!" << endl << "^^ " << j << endl; } f_inout.close(); } } else if( strstr(cmdl, "examin") ) { char c_in[ 10 ]="\x1"; for( ; digitstr(c_in)==(-1); ) { clrscr(); cout << "Enter number of variant [ENTER]: "; cin.get( c_in, 10 ); cin.ignore(); } strcpy( filename, c_in ); strcat( filename, "_varnt.txt" );
f_inout.open( filename, ios::in ); if( f_inout.fail() ) //Проверка на открытие файла { cout << "Error reading file " << filename << endl; getch(); exit( 1 ); } else { char *textLine=new char[ 1000 ]; mainh.clear(); mainh.flush(); mainh.seekg( 0, ios::beg ); for( c=0; c<2; ++c ) //считаем из сл. файла колич-о вопр mainh.read( (char *)&voprosov, sizeof(int) ); msg=new int[ voprosov ]; correct=new int[ voprosov ]; for( c=1; c<=voprosov; ++c ) //узнаем правильные ответы на этот вариант correct[ c-1 ]=((minread( atoi(c_in), c, d.da_year, KEY ))+1);
for( int c=0; !f_inout.eof(); ) { f_inout.getline( textLine, 1000 ); if( textLine[ 0 ]=='^' && textLine[ 1 ]=='^' ) //остановка для диалога { strcpy( c_in, "\x1" ); for( ; digitstr(c_in)==(-1); ) { cout << "Variant of answer (0-to exit)[ENTER]: "; cin.get( c_in, 10 ); cin.ignore(); } if( c_in[ 0 ]=='0' ) return; else if( atoi(c_in)!=correct[ c ] ) { msg[ c ]=0; cout << "Not good!" << endl; } else { msg[ c ]=1; cout << "good!" << endl; } ++c; } else if( textLine[ 0 ]!=';' ) cout << textLine << endl;
}
clrscr(); cout << "\n-== Resultat ==-\n"; for( c=0; c<voprosov; c++ ) { cout << "\nAnswer " << c+1; if( msg[ c ]==1 ) cout << " True"; else cout << " False"; } getch();
delete [] msg; //delete [] correct; delete [] textLine; } }
mainh.close(); delete [] correct; return; }
|
писAл под bcc32
Работает так: При запуске появляется типа меню диалог с предлож-ем 3 вариантов выбираешь создать экзамен, создаются заготовки файлов экзаменов( столько сколько укажешь вариантов) там будет строка с правильным вариантом, пишешь в место где должен быть вопрос свой вопрос так чтоб правильным был указанный ответ, эту строку надо удалить, программа знает правильный ответ главное самому его запомнить, вобщем усе 
|