Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++$Delphi]Создание теста.


Автор: djeyana 27.6.2007, 23:00
Как правильно сделать пример теста? Т.е. есть несколько вопросов,к каждому из них свои варианты ответов.Варианты ответов отмечаются радио кнопками.Вопросы должны появляться в случайном порядке.Допустип есть 15 вопросов, из них отображать должно только 10 случайных.Человек выбрал ответы, нажал готово , и появляется табличка с результатами.Помогите, пожалуйста.

Модератор: Название темы должно отражать ее суть!

M
MAKCim
При чем здесь С++?

Автор: zkv 27.6.2007, 23:52
djeyana, ОС хоть укажи, компилятор. 
Вообще сам(сама) делать собираешься, или за тебя надо написать? Если последний вариант, то тебе в http://forum.vingrad.ru/forum/Vingrad-help-center.html

Автор: ip127001 28.6.2007, 12:22
тест маленький можешь в массив загнать

Автор: Solomon 28.6.2007, 17:10
Вопросы должны грузится с файла? или это не существенно?
Вариантов ответов должно быть определеное количество? или это не столь существено?

Автор: djeyana 28.6.2007, 18:26
Вариантов должно быть четыре.Вопросы должныбыть в случайном порядке.Варианты ответов- повозможности тоже.Насчет файла- не принципиально.

Автор: Earnest 28.6.2007, 18:32
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: Solomon 28.6.2007, 18:36
Если время не поджимает... могу сегодня впринципе помочь с этим, но только когда домой прийду... это около 9 будет... щас на работе немогу этим занятся.. хотя и работы там не сильно много... если будет интересно напиши на аську она есть в профиле...

Автор: apook 28.6.2007, 18:39
Цитата(djeyana @  28.6.2007,  18:26 Найти цитируемый пост)
Вариантов должно быть четыре

Мне кажетс я что вопросы не надо грузить в память, а непосредственно с файлом работать
иначе вдруг захочется добавить вопросиков и вариантиков, хотя при нынешниих обьемах памяти...  ну не на одной же тачке ее запускать, а в некотрых конторах до сих пор третий пень
и 64 оперативки.

Автор: Solomon 28.6.2007, 18:43
apook, просто иногда бывает просто надо написать для лабы... абы було.. а уж доводить до совершенсво дорого для лабы обойдется... 

Автор: apook 28.6.2007, 19:16
Я вот тут все никак доделать не могу, прога но у нее примочка типа шифрование правильных
ответов есть и сохранение их в спец файл, правда вариант консольный smile но вдруг понравится
Код

#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 вариантов
выбираешь создать экзамен, создаются заготовки файлов экзаменов( столько сколько укажешь вариантов)
там будет строка с правильным вариантом, пишешь в место где должен быть вопрос свой вопрос так
чтоб правильным был указанный ответ, эту строку надо удалить, программа знает правильный ответ
главное самому его запомнить, вобщем усе smile


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)