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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
arreke
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 13
#1

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

09.09.2012, 12:58. Просмотров 781. Ответов 5
Метки нет (Все метки)

Описание

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;
}
код работает, но не со всеми вариантами теста, на некоторых вариантах выдает не правильный результат.
подскажите, пожалуйста, что не так, или хотябы основные моменты этой задачи на которые надо особо обратить внимание...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2012, 12:58     Задача: Отгадать цифру, проверить на честность
Посмотрите здесь:

Найти цифру числа, проверить делимость - C++
Приветствую Вас уважаемые форумчане, прошу вашей помощи в решении данного примерчика, ибо чайник: 1.Дано натуральное число: • найти...

как проверить цифру, на то что она является степенью тройки - C++
как проверить цифру, на то что она является степенью тройки? помогите плиз :)

игра отгадать слово - C++
Есть не много проблем, например: прежде программа работала, но теперь выдает ошибку: syntax error at end of input. Ну этого можно...

Отгадать загаданное число - C++
Вася загадал число от 1 до N. За какое наименьшее количество вопросов (на которые Вася отвечает &quot;да&quot; или &quot;нет&quot;) Петя может угадать Васино...

Отгадать число 1-1000 - C++
Суть программы, такой: пользователь загадывает число с 1 до 1000, а программе нужна отгадать, она мает право задать 10 вопросов в стиле...

Задача на тему функции. Найти наименьшую по значению цифру в каждом числе последовательности - C++
Вводится последовательность из N целых чисел. Найти наименьшую по значению цифру в каждом числе последовательности (функцией оформить...

Пользователь должен отгадать рандомное число - C++
Всем привет:-) Начал изучать c++ самостоятельно и часто посещал ваш форум как гость. Спустя некоторое время понял, что если...

Помогите Кате отгадать задуманные Петей числа - C++
Петя и Катя – брат и сестра. Петя – студент, а Катя – школьница. Петя помогает Кате по математике. Он задумывает два натуральных числа X и...

Проверить правильность кода (задача, 1 курс) - C++
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; int main() { float x = -2.8, b, y = 1; float max = ((1 + (pow(x, 2))...

Проверить ,является ли введённое слово палиндромом (задача на рекурсию) - C++
Проверить ,является ли введённое слово палиндромом( Слово , которое одинаково читается слева направо и справа налево ) с помощью рекурсии


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
09.09.2012, 14:11     Задача: Отгадать цифру, проверить на честность #2
Ради интереса:
а Tom отвечает too high или too low или right on,
С точки зрения кода ответы Тома - это рандом что ли? Или пользователь как бы сам должен вводить ответы и Джерри, и Тома?
valeriikozlov
Эксперт C++
4669 / 2495 / 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++
4669 / 2495 / 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     Задача: Отгадать цифру, проверить на честность
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru