С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

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

5
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
09.09.2012, 14:11 #2
Ради интереса:
а Tom отвечает too high или too low или right on,
С точки зрения кода ответы Тома - это рандом что ли? Или пользователь как бы сам должен вводить ответы и Джерри, и Тома?
0
valeriikozlov
Эксперт С++
4676 / 2502 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
09.09.2012, 14:56 #3
arreke, ссылку на задачу дать можете?
0
arreke
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 13
09.09.2012, 15:55  [ТС] #4
Цитата Сообщение от BumerangSP Посмотреть сообщение
Ради интереса:

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

Добавлено через 7 минут
Цитата Сообщение от valeriikozlov Посмотреть сообщение
arreke, ссылку на задачу дать можете?
Могу, только врядли это что даст, задание на китайском, я в Пекине учусь.
http://www.bianchengla.com/team/bit/practise/problem?id=1796
Кстати, по этой ссылке внизу есть окошко куда код вписать можно для проверки (только для зарегистрированных), сайт сразу выдаёт решена задача или нет.
0
valeriikozlov
Эксперт С++
4676 / 2502 / 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],
1
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 чисел.
0
09.09.2012, 19:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2012, 19:07
Привет! Вот еще темы с ответами:

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

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

Задача на k-тую цифру последовательности, задача на схему Горнера. - Pascal
Ну, собственно опять прошу помощи... Задача 1: Определить k-тую цифру последовательности 1234567891011121314…, в которой выписаны подряд...

Как проверить первую цифру в чисел и заменить на нужную - PHP
Есть число к примеру $x=444; нужно проверить только первую цифру и если оно не равно 5 заменить его на 5; то есть в итоге число...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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