Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 19.12.2011, 13:59   #1 (permalink)
U3L3I3Y3A3
Новичок
 
Регистрация: 19.12.2011
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Игра быки коровы

Здравствуйте,помогите ,пожалуйста, с задачей. Вот её код,но она почему-то не работает. Не могли бы вы подсказать в чем причина и исправить мне её. Суть задачи: Компьютер загадывает четырехзначное число, а вы должны угадать его . Вы вводите свой вариант числа, компьютер сравнивает его с загаданным числом и выдает результат в виде “Быков” и Коров”: “корова” - цифра присутствует в загаданном числе и стоит на своем месте. “Бык” - цифра присутствует в загаданном числе, но стоит не на своем месте.
Код:
var
s,s1:string[4]; {s - число, задуманное компьютером, s1 - наше предположение}
m,n:byte; {m - кол-во угаданных чисел; n - кол-во цифр, стоящих на своих позициях}
a:set of char;
procedure answer (s1:string ); var k,p:byte; {k - кол-во угаданных чисел; p - кол-во цифр, стоящих на своих позициях}
var
j,i: integer;
l:string;
begin
l:=s;
  for i:=1 to 4 do if s1[i] in a then
    begin
    inc(k);
    j:=0;
    repeat
     inc(j)
    until l[j]=s1[i];
    l[j]:='X'; {Убираем число, т.к. мы его угадали}
    a:=[l[1],l[2],l[3],l[4]];
    end;
  for i:=1 to 4 do if s1[i] = s[i] then inc(p);
end;

begin
randomize; {инициализируем генератор случайных чисел}
str(1000 + random(9000),s);  {Случайное число из диапазона 1000..9999 }
repeat
a:=[s[1],s[2],s[3],s[4]]; {множество цифр, задуманных компьютером}
m:=0;n:=0;
writeln('Отгадай число');
readln(s1);
answer(s1);m:=n;
if s = s1 then writeln ('Поздравляю, вы отгадали число!') else
  writeln('Вы отгадали ',m,' цифр и ',n,' из них стоят на своей позиции.');
until s = s1;
end.
U3L3I3Y3A3 вне форума   Ответить с цитированием

Старый 19.12.2011, 13:59
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Участники нашего форума ранее создавали подобные топики, отсылаю вам ссылки

Игра - ЦЕПОЧКА
Столик - игра
Игра Pro Street
Игра :)
Игра не сохраняется
Игра ДаНеточка

Старый 19.12.2011, 14:28   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Даже прежде, чем разбираться, я увидел неправильно написанный заголовок процедуры. У Вас:
Цитата:
procedure answer (s1:string ); var k,p:byte;
Надо:
Код:
procedure answer (s1:string; var k:byte; var p:byte);
Начните с того, что исправьте эту ошибку, а дальше - посмотрим.
Vladimir_S вне форума   Ответить с цитированием
Старый 19.12.2011, 18:03   #3 (permalink)
U3L3I3Y3A3
Новичок
 
Регистрация: 19.12.2011
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

спасибо огромное,а что дальше делать??
U3L3I3Y3A3 вне форума   Ответить с цитированием
Старый 19.12.2011, 19:39   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от U3L3I3Y3A3 Посмотреть сообщение
спасибо огромное,а что дальше делать??
А дальше вот что:
Код:
var
 s,s1:string[4]; {s - число, задуманное компьютером, s1 - наше предположение}
 m,n:byte; {m - кол-во угаданных чисел; n - кол-во цифр, стоящих на своих позициях}
 a:set of char;

procedure answer (sa:string; var k:byte; var p:byte); {k - кол-во угаданных чисел; p - кол-во цифр, стоящих на своих позициях}
var
 j,i: integer;
 l:string;
begin
 l:=s;
 k:=0;
 p:=0;
 for i:=1 to 4 do
  if sa[i] in a then
   begin
    inc(k);
    j:=0;
    repeat
     inc(j)
    until l[j]=sa[i];
    l[j]:='X'; {Убираем число, т.к. мы его угадали}
    a:=[l[1],l[2],l[3],l[4]];
   end;
 for i:=1 to 4 do
  if sa[i] = s[i] then inc(p);
end;

begin
 randomize; {инициализируем генератор случайных чисел}
 str(1000 + random(9000),s);  {Случайное число из диапазона 1000..9999 }
 {Writeln(s); Readln;} {Это вывод задуманного числа для отладки}
 repeat
  a:=[s[1],s[2],s[3],s[4]]; {множество цифр, задуманных компьютером}
  Repeat
   writeln('Введите четырехзначное число (0000 - выход)');
   readln(s1);
   If s1='0000' then Halt;
  Until Length(s1)=4;
  answer(s1,m,n);
  if s = s1 then
   begin
    writeln ('Поздравляю, вы отгадали число!');
    readln;
   end
   else
    writeln('Вы отгадали ',m,' цифр и ',n,' из них стоят на своей позиции.');
 until s = s1;
end.
Vladimir_S вне форума   Ответить с цитированием
Старый 20.12.2011, 04:37   #5 (permalink)
U3L3I3Y3A3
Новичок
 
Регистрация: 19.12.2011
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

она всё равно не работает( какая то ошибка с процедурой STR..(
U3L3I3Y3A3 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 20.12.2011, 05:26   #6 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

В начале программы подключите модуль crt командой uses crt;
AlexZir вне форума   Ответить с цитированием
Старый 20.12.2011, 09:41   #7 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от U3L3I3Y3A3 Посмотреть сообщение
она всё равно не работает( какая то ошибка с процедурой STR..(
Ох, чую... пахнет чем-то типа АВС... Но если так, то
Цитата:
Сообщение от AlexZir Посмотреть сообщение
В начале программы подключите модуль crt командой uses crt;
бессмысленно. Там свой неудобопонятный CRT, и подключение его вряд ли поможет... А если всё же речь о нормальном Паскале (Tubo либо Free), то:
1. Ни единой CRT-шной команды в программе нет.
2. Еще, еще и еще раз и тысячу раз: я НЕ ВЫКЛАДЫВАЮ неоттестированных программ. А этих быков-коров гонял вчера "в хвост и в гриву". Никаких ошибок. На всякий случай: у меня DOS версия Free Паскаля.
3. Единственное, что могу предположить и предложить - замените размерную строку обычной, то есть в описании переменных вместо
s,s1:string[4];
поставьте
s,s1:string;
Возможно, дело в этом.
Vladimir_S вне форума   Ответить с цитированием
Старый 20.12.2011, 12:22   #8 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

Сейчас проверил на PascalABC, действительно, ругается на перегрузку STR. Убрал размер строки - все заработало.
AlexZir вне форума   Ответить с цитированием
Старый 20.12.2011, 12:32   #9 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от AlexZir Посмотреть сообщение
Убрал размер строки - все заработало.
Да, тем более, что размер там и не нужен.
- это я про Паскаль АВС. Вообще.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 01:58.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.