• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте, чтобы узнать больше. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Игра быки коровы

U3L3I3Y3A3

Ученик
Регистрация
19 Дек 2011
Сообщения
3
Реакции
0
Баллы
0
Игра быки коровы

Здравствуйте,помогите ,пожалуйста, с задачей. Вот её код,но она почему-то не работает. Не могли бы вы подсказать в чем причина и исправить мне её. Суть задачи: Компьютер загадывает четырехзначное число, а вы должны угадать его . Вы вводите свой вариант числа, компьютер сравнивает его с загаданным числом и выдает результат в виде “Быков” и Коров”: “корова” - цифра присутствует в загаданном числе и стоит на своем месте. “Бык” - цифра присутствует в загаданном числе, но стоит не на своем месте.
Код:
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.
 
Даже прежде, чем разбираться, я увидел неправильно написанный заголовок процедуры. У Вас:
procedure answer (s1:string ); var k,p:byte;
Надо:
Код:
procedure answer (s1:string; var k:byte; var p:byte);
Начните с того, что исправьте эту ошибку, а дальше - посмотрим.
 
спасибо огромное,а что дальше делать??:tehnari_ru_325:
 
спасибо огромное,а что дальше делать??
А дальше вот что:
Код:
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.
 
она всё равно не работает( какая то ошибка с процедурой STR..(
 
В начале программы подключите модуль crt командой uses crt;
 
она всё равно не работает( какая то ошибка с процедурой STR..(
Ох, чую... пахнет чем-то типа АВС... Но если так, то
В начале программы подключите модуль crt командой uses crt;
бессмысленно. Там свой неудобопонятный CRT, и подключение его вряд ли поможет... А если всё же речь о нормальном Паскале (Tubo либо Free), то:
1. Ни единой CRT-шной команды в программе нет.
2. Еще, еще и еще раз и тысячу раз: я НЕ ВЫКЛАДЫВАЮ неоттестированных программ. А этих быков-коров гонял вчера "в хвост и в гриву". Никаких ошибок. На всякий случай: у меня DOS версия Free Паскаля.
3. Единственное, что могу предположить и предложить - замените размерную строку обычной, то есть в описании переменных вместо
s,s1:string[4];
поставьте
s,s1:string;
Возможно, дело в этом.
 
Сейчас проверил на PascalABC, действительно, ругается на перегрузку STR. Убрал размер строки - все заработало.
 
Назад
Сверху