Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2010, 13:57   #1
krwlr
Новичок
Джуниор
 
Аватар для krwlr
 
Регистрация: 04.04.2010
Сообщений: 2
По умолчанию обработка ошибки, scanf(), Си.

Всем доброго дня и Христос Воскрес!
Возникла маленькая проблема, пишу для теста маленькую игру. Смысл которой в том, что, компьютер случайным образом загадывает число от 1 до 100. Задача пользователя - за минимальное количество попыток, но не более шести, угадать это число, предлагая компьютеру свои варианты, в ответ на которые программа указывает номер попытки и сообщение о том, больше загаданное число или меньше введенного с клавиатуры.Игра состоит из пяти партий. После последней партии выводятся результаты. Вот код:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int ROUND = 5, ATTEMPT = 1, YOU, KOMP;

void game(int zdigit);

int main(void)
{
    srand(time(NULL));
    int number_to_guess = rand() % 100 + 1;
    game(number_to_guess);
    return EXIT_SUCCESS;
}

void game(int zdigit) {
    if (ROUND == 0) {
        puts("Счет:");
        if (YOU > KOMP)
            printf("%d:%d в вашу пользу.\n", YOU, KOMP);
        else if (YOU < KOMP)
            printf("%d:%d в пользу компьютера.\n", KOMP, YOU);
        else
            printf("%d:%d\n", YOU, KOMP);
        exit(0);
        }
    if (ATTEMPT != 7) {
        if (ATTEMPT == 1)
            puts("Компьютер загадал число.");
        int c;
        printf("%d Попытка. Введите ваш вариант:", ATTEMPT);
        ATTEMPT += 1;
        scanf("%d", &c);


        if ((c >=0) && (c <=100)) {
            if (zdigit < c) {
                puts("Загаданное число меньше.");
                game(zdigit);
            } else if (zdigit > c) {
                puts("Загаданное число больше.");
                game(zdigit);
            } else {
                puts("Вы угадали.");
                YOU += 1; ATTEMPT = 1; ROUND -= 1;
                main();
            }
        } else {
            puts("Вы должны ввести число.");
            //game(zdigit);
            exit(0);
        }
    } else {
        printf("Вы проиграли. Загаданное число было: %d\n", zdigit);
        ROUND -= 1; KOMP += 1; ATTEMPT = 1;
        main();
    }
}
И именно когда после scanf() я ввела например букву, то рекурсивный вызов game(zdigit) нельзя сделать.. забивается мусором.. Только exit(0); Вопрос: В чем проблема и как можно решить? Нужно рекурсивно вызвать функцию..

Последний раз редактировалось krwlr; 04.04.2010 в 14:25.
krwlr вне форума Ответить с цитированием
Старый 04.04.2010, 15:08   #2
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Воистину воскрес!

А утечка памяти из-за обратных (по-моему, ничего не добавляющих к элегантности неплохо, в общем-то, написанной программки, но сильно ухудшающих читабельность) вызовов main(), из которых Вы не выходите, Вас не смущает?

Added 13:31 CET
Ну и глобальными переменными Вы, конечно, лихо орудуете! Главное - бесстрашно.

Последний раз редактировалось Vago; 04.04.2010 в 15:31.
Vago вне форума Ответить с цитированием
Старый 05.04.2010, 14:05   #3
krwlr
Новичок
Джуниор
 
Аватар для krwlr
 
Регистрация: 04.04.2010
Сообщений: 2
По умолчанию

Пасиб)) Но дело было таки в scanf Заменила на gets, с преобразованием типа в int и все пошло на ура.) Только плиз, чувствую себя блондинкой, объясните кто-нибудь, почему scanf такое вытворял?
Компилятор так же вселяет надежду: warning: the `gets' function is dangerous and should not be used.
krwlr вне форума Ответить с цитированием
Старый 05.04.2010, 16:58   #4
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Я, в общем-то, Вас на другое, более серьёзное, подталкивал обратить внимание, ну да ладно...

Можно, в принципе, и со scanf() ...
Код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const int ROUND = 5, N_ATTEMPTS_MAX = 6;
int number_to_guess, YOU = 0, KOMP = 0;

int game( int attempt );

int main(void) {

   int jRound;

   for ( jRound = 1; jRound <= ROUND; jRound++ ) {
      srand(time(NULL));
      number_to_guess = rand() % 100 + 1;
      if ( game( 1 ) == -1 )
         break;
   }

   puts("Scet:");
   if (YOU > KOMP)
      printf("%d:%d v vashu polzu.\n", YOU, KOMP);
   else if (YOU < KOMP)
      printf("%d:%d в пользу компьютера.\n", KOMP, YOU);
   else
      printf("%d:%d\n", YOU, KOMP);

   return EXIT_SUCCESS;

}

int game( int attempt ) {

/* return:
 * +1 если выиграл компутер;
 * -1 если пользователю надоело играть;
 * 0  если выиграл пользователь
 */
   int c;
   char czC[255];

   if ( attempt > N_ATTEMPTS_MAX ) {
      printf("Вы proigrali. Загаданное число bylo: %d\n", number_to_guess );
      KOMP += 1;
      return 1;
   }

   if ( attempt == 1)
      puts("Компьютер zagadal chislo.");

   printf("%d Popytka. Введите ваш вариант:", attempt );
   scanf( "%s", czC );
   while ( ( c = atoi( czC ) ) == 0 ) {
      puts("Вы должны vvesti chislo [1 - 100] libo -1 dlya dosrochnogo zaversheniya raboty.");   
      scanf( "%s", czC );
   }

   if ((c >=1) && (c <=100)) {
      if ( number_to_guess < c ) {
         puts("Загаданное число menshe.");
         return game( attempt+1 );
      } else if ( number_to_guess > c) {
         puts("Загаданное число bolshe.");
         return game( attempt+1 );
      } else {
         puts("Вы ugadali.");
         YOU += 1;
         return 0;
      }
   } else if ( c == -1 )
      return -1;

}

Последний раз редактировалось Vago; 05.04.2010 в 17:17.
Vago вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Статическое DLL. Обработка ошибки не нахождения. SNUPY Общие вопросы Delphi 4 07.12.2009 18:13
Нужна помощь по C, scanf() Sailorotec Общие вопросы C/C++ 7 02.12.2009 13:04
Обработка ошибки 10061. ClientSocket eks-s Работа с сетью в Delphi 2 05.03.2008 08:06
анало гфункции scanf() в ассемблере Areostar Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 29.01.2008 22:58