Форум программистов, компьютерный форум CyberForum.ru

Задача: Отгадать цифру, проверить на честность - C++

Восстановить пароль Регистрация
 
arreke
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 13
09.09.2012, 12:58     Задача: Отгадать цифру, проверить на честность #1
Описание

Tom и Jerry играют в игру на отгадку чисел, Tom загадывает число, а Jerry отгадывает.
Область цифр в пределах от 1 до 10.
Jerry называет число, а Tom отвечает too high или too low или right on, на right on игра заканчивается.
Чтобы не допустить чтобы Tom обманывал, Jerry записывает цифры и ответы Tom-а.
Определите, обманывал Tom, или играл по правилам.

Input

Игра может повторятся несколько раз, игра заканчивается как только Jerry называет цифру 0.
Вводимая строка состоит из целого числа или строки ответа.

Output

Для каждой игры если в ответах Tom-а есть несоответствие, напечатать Tom is dishonest, в противном случае напечатать Tom may be honest.


Например, Input:

5
too low
7
too high
6
right on
10
too high
3
too low
4
too high
2
right on
0

Output:

Tom may be honest
Tom is dishonest


Мой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main() {  
 
  int n, i, memLow[10], memHigh[10], sumLow=0, sumHigh=0, max, min;
  char number[256], huida[256], daAn[256];
  
  do {
    fgets( number, 256, stdin ); n = atoi(number);
    if (n==0) {
      if ((sumLow==0) && (sumHigh==0)) continue;
      sprintf( daAn, "Tom may be honest");
      min = memLow[0]; for (i=1; i<sumLow; i++) { if (memLow[i] > min) { min = memLow[i]; } }
      max = memHigh[0]; for (i=1; i<sumHigh; i++) { if (memHigh[i] < max) { max = memHigh[i]; } }
      //printf("%d %d\n", min, max);
      if ((min+1 >= max) && (sumLow>0) && (sumHigh>0)) { sprintf( daAn, "Tom is dishonest"); }
      if ((min>=10) && (sumLow>0)) { sprintf( daAn, "Tom is dishonest"); }
      if ((max<=1) && (sumHigh>0)) { sprintf( daAn, "Tom is dishonest"); }
      printf("%s\n", daAn);
      continue;
    }
    //printf ("Insert huida: "); 
    fgets( huida, 256, stdin ); huida[strlen(huida) - 1] = '\0';
 
//Right on
 
    if (strcmp ("right on", huida) == 0) {
      sprintf( daAn, "Tom may be honest");
      for (i=0; i<sumLow; i++) { if (memLow[i]>=n) { sprintf( daAn, "Tom is dishonest"); } }
      for (i=0; i<sumHigh; i++) { if (memHigh[i]<=n) { sprintf( daAn, "Tom is dishonest"); } }
      sumLow=0; sumHigh=0;
      printf("%s\n", daAn);
    }
    if (strcmp ("too low", huida) == 0) { memLow[sumLow]=n;  sumLow++; }
    if (strcmp ("too high", huida) == 0) { memHigh[sumHigh]=n;  sumHigh++; }
 
  } while (n!=0);
 
  return 0;
}
код работает, но не со всеми вариантами теста, на некоторых вариантах выдает не правильный результат.
подскажите, пожалуйста, что не так, или хотябы основные моменты этой задачи на которые надо особо обратить внимание...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
09.09.2012, 14:11     Задача: Отгадать цифру, проверить на честность #2
Ради интереса:
а Tom отвечает too high или too low или right on,
С точки зрения кода ответы Тома - это рандом что ли? Или пользователь как бы сам должен вводить ответы и Джерри, и Тома?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
09.09.2012, 14:56     Задача: Отгадать цифру, проверить на честность #3
arreke, ссылку на задачу дать можете?
arreke
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 13
09.09.2012, 15:55  [ТС]     Задача: Отгадать цифру, проверить на честность #4
Цитата Сообщение от BumerangSP Посмотреть сообщение
Ради интереса:

С точки зрения кода ответы Тома - это рандом что ли? Или пользователь как бы сам должен вводить ответы и Джерри, и Тома?
Не рандом, пользователь сам вводит ответы и Тома, и Джерри.

Добавлено через 7 минут
Цитата Сообщение от valeriikozlov Посмотреть сообщение
arreke, ссылку на задачу дать можете?
Могу, только врядли это что даст, задание на китайском, я в Пекине учусь.
http://www.bianchengla.com/team/bit/...roblem?id=1796
Кстати, по этой ссылке внизу есть окошко куда код вписать можно для проверки (только для зарегистрированных), сайт сразу выдаёт решена задача или нет.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
09.09.2012, 17:40     Задача: Отгадать цифру, проверить на честность #5
Цитата Сообщение от arreke Посмотреть сообщение
Могу, только врядли это что даст, задание на китайском, я в Пекине учусь.
я не смог зарегистрироваться, поэтому просто напишу свои замечания.
У Вас в коде предусмотрено что входные данные могут оканчиваться 0, перед которым нет строки: right on.
И в этой части есть ошибка. Вот тест для выявления этой ошибки:
3
too high
2
right on
8
too low
7
too low
0
Сама ошибка здесь (см комментарии):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    fgets( number, 256, stdin ); n = atoi(number);
    if (n==0) {
      if ((sumLow==0) && (sumHigh==0)) continue;
      sprintf( daAn, "Tom may be honest");
      min = memLow[0]; for (i=1; i<sumLow; i++) { if (memLow[i] > min) { min = memLow[i]; } }// в этой строке min = memLow[0]; , но ведь может быть что sumLow равно 0, а значение memLow[0] Вы берете с предыдущей игры
      max = memHigh[0]; for (i=1; i<sumHigh; i++) { if (memHigh[i] < max) { max = memHigh[i]; } }// тоже самое для max = memHigh[0];
      //printf("%d %d\n", min, max);
      if ((min+1 >= max) && (sumLow>0) && (sumHigh>0)) { sprintf( daAn, "Tom is dishonest"); }
      if ((min>=10) && (sumLow>0)) { sprintf( daAn, "Tom is dishonest"); }
      if ((max<=1) && (sumHigh>0)) { sprintf( daAn, "Tom is dishonest"); }
      printf("%s\n", daAn);
      continue;
    }
Если исправление этой ошибки не поможет, то может быть (я не увидел таких ограничений во входных данных), что за одну игру Jerry называет более 10 чисел (некоторые несколько раз). А массивы для хранения этих чисел всего на 10 элементов:

Цитата Сообщение от arreke Посмотреть сообщение
C++
1
memLow[10], memHigh[10],
arreke
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 13
09.09.2012, 19:07  [ТС]     Задача: Отгадать цифру, проверить на честность #6
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Если исправление этой ошибки не поможет, то может быть (я не увидел таких ограничений во входных данных), что за одну игру Jerry называет более 10 чисел (некоторые несколько раз). А массивы для хранения этих чисел всего на 10 элементов:
Спасибо, исправил, теперь всё правильно.

Цитата Сообщение от valeriikozlov Посмотреть сообщение
У Вас в коде предусмотрено что входные данные могут оканчиваться 0, перед которым нет строки: right on.
Тут я переборщил, программа заканчивается на right on. Думал в этом может быть ошибка, а все оказалось в массивах, за одну игру Jerry может называет более 10 чисел.
Yandex
Объявления
09.09.2012, 19:07     Задача: Отгадать цифру, проверить на честность
Ответ Создать тему
Опции темы

Текущее время: 00:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru