Опытный
 
Профиль
Группа: Участник
Сообщений: 264
Регистрация: 19.12.2006
Репутация: нет Всего: 3
|
Есть исходник: Код | #include <locale.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #define size 1000 int print( FILE *file, int sum ); // печать вопроса и ответов с чтением из файла sum - стоимость int position( FILE *file, char *str ); // позиционирование void out(); // печать вопросов и ответов void clear(); // очистка состояния ответов answer[4] void help(); // функция "помощь зала" (незаполнена) void bell(); // функция "звонок другу" (незаполнена) void _50x50( char num ); // функция "50x50" (сделана) char question[size]; // вопрос typedef struct ANSWER{ char an[size]; // ответ // состояние ответа (если невыбраны то все равны нулю): int help; // 1) процент проголосовавших при "помощи зала" int bell; // 2) bell = 1, если ответ выбран "другом" (звонок другу) int _50x50; // 3) _50x50 = 1, если удалён ! }Answer; Answer answer[4]; // всего может быть 4 ответа ... //////////////////// Main //////////////////////////////////////// int main(){ srand((unsigned)time(NULL)); setlocale(LC_CTYPE, "Russian"); // для русских букв FILE *file = fopen("text.txt", "r"); // открываем файл с вопрос-ответами if( !file ){ puts("Error open file !"); getchar(); return 1; } const int count = 3; // 3 стоимости (100, 200, 300) int answer[count] = { 100, 200, 300 }; char num, nom; int i; for( i=0; i<count; i++ ){ // перебираем все "стоимости" printf("Вопрос стоимостью %d\n", answer[i] ); num = print( file, answer[i] ); // читаем какой-нибудь вопрос из текущей стоимости do{ printf("\n\nВведите правильный ответ > "); scanf("%c", &nom ); switch( nom ){ case '1': help(); break; case '2': _50x50(num); break; case '3': bell(); break; case '4': exit(0); break; default: break; } fflush(stdin); }while( nom > '1' && nom < '4' ); if( num != nom ) printf( "Неправильно !!!\n\n" ); else printf( "Правильно !\n\n" ); fflush(stdin); } fflush(stdin); getchar(); return 0; } ////////////////// End main ///////////////////////// int print( FILE *file, int sum ){ fseek( file, 0, 0 ); // позицыонирование в начало файла int pos, count, num, i; char an; char buf[size]; // поиск стоимости while(1){ pos = position( file, "стоимость" ); if( !pos ) return 0; // error if( pos == sum ) break; } // поиск вопроса if( fscanf( file, ":%d", &count ) <=0 ) return 0; num = rand()%count +1; // выбираем вопрос из возможных while( position( file, "вопрос" ) != num ); fscanf( file, ">%[^<]s", question ); // поиск ответов fscanf( file, "%*[^<]" ); fscanf( file, "<ответ %c>\n", &an ); // правильный ответ (a, b, c, d) for( i=0; i<4; i++ ){ fscanf( file, "%[^\n]s", answer[i].an ); fscanf( file, "%*[\n]" ); } clear(); out(); // вывод считанного из файла return an; } ///////////////////////// int position( FILE *file, char *str ){ char buf[100]; int pos; fscanf( file, "%*[^<]" ); fscanf( file, "<%s", buf ); if( strcmp( buf, str ) != 0 ) return -1; if( fscanf( file, "%d", &pos ) <=0 ) return 0; return pos; } //////////////////////////////////// void clear(){ int i; for( i=0; i<4; i++ ) answer[i].help = answer[i]._50x50 = answer[i].bell = 0; } ///////////////////////////// void out(){ puts( question ); // вывод вопроса int i; for( i=0; i<4; i++ ){ if( answer[i]._50x50 ) // если вопрос удалён printf( "((%s)) - вопрос удалён !", answer[i].an ); else printf( "%s", answer[i].an ); // вывод ответа if( answer[i].help ) // если для вопроса "была помощь зала" printf( " > помощь зала: %d %%", answer[i].help ); if( answer[i].bell ) // если вопросу "помог звонок другу" printf( " > помощь друга !" ); puts(""); // перевод строки } } /////////////////////////////////// void _50x50( char num ){ char a, b; do{ a= rand()%4 + 'a'; }while( a == num ); do{ b = rand()%4 + 'a'; }while( b == a || b == num ); answer[ a - 'a' ]._50x50 = 1; answer[ b - 'a' ]._50x50 = 1; out(); // вывод вопроса } /////////////// void help(){;} void bell(){;}
|
ФАЙЛ Код | <стоимость 100:3><!-- на 100 рублей 3 вопроса --> <вопрос 1> Сколько будет два умножить на два ? <ответ c> a) один b) два c) четыре d) десять <вопрос 2>Сколько будет один плюс один ? <ответ b> a) один b) два c) десять ! d) 100 <вопрос 3>Сколько на двух руках пальцев ? <ответ d> a) один b) два c) четыре d) десять <!-- конец вопросов на 100 рублей> <!--______________________________--> <стоимость 200:2><!-- на 200 рублей 2 вопроса--> <вопрос 1>Два плюс два ? <ответ c> a) один b) два c) четыре d) 100 <вопрос 2>Один плюс два ? <ответ d> a) один b) два c) ноль d) три <!-- на 200 руб больше нет--> <!--_________________________--> <стоимость 300:1><!-- на три сотни 1 вопрос --> <вопрос 1>Сколько будет если прибавить один и два, а потом вычесть один, а потом ещё прибавить два ? <ответ b> a) один b) четыре c) три d) 100 <вопросов нет><!-- конец дорумента -->
|
не совсем понимаю: Код | fscanf( file, "%[^\n]s", answer[i].an ); fscanf( file, "%*[\n]" );
|
объясните пожалуйста как работает "%[^\n]s" и "%*[\n]"
--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках. [color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
|