Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2009, 18:57   #1
Иван 883
Пользователь
 
Регистрация: 25.12.2008
Сообщений: 39
По умолчанию Записи. Бьет ли карта k1 карту k2

Здравствуйте Господа программисты. Снова прощу Вашей помощи.. Задание следующее:Описать логическую функцию KICK(K1,K2,KM), проверяющую, бьет ли карта K1 карту K2, с учетом того, что масть KM является козырной. Вот наработки:
Код:
type Color=(Spades,Clubs,Diamonds,Hearts);
     Advantage=(Six,Seven,Eigth,Nine,Ten,Jack,Queen,King,Ace);
  Card=record
    m:Color;
    d:Advantage;
  end;

procedure InputData(var K1,K2:Card; var KM:Color; var m1,m2,d1,d2:string);
var Kz:string;
begin
  writeln('Введите козырную масть ');
  readln(kz);
  writeln('Введите первую карту');
  writeln('Введите масть ');
  readln(m1);
  writeln('Введите достоинство ');
  readln(d1);
  writeln('Введите вторую карту');
  writeln('Введите масть ');
  readln(m2);
  writeln('Введите достоинство ');
  readln(d2);
end;

procedure RecognitionTrumpColor(KM:Color);
var Kz:string;
begin
    if Kz='пики' then
      KM:=Spades
  else
    if Kz='трефы' then
      KM:=Clubs
  else
    if Kz='бубны' then
      KM:=Diamonds
  else
    if (Kz='червы') or (Kz='черви') then
      KM:=Hearts
  else
      writeln('Неправильно введена козырная масть!!!');
end;

procedure RecognitionColorFirstCard(m1:string);
var K1:Card;
begin
    if m1='пики' then
      K1.m:=Spades
  else
    if m1='трефы' then
      K1.m:=Clubs
  else
    if m1='бубны' then
      K1.m:=Diamonds
  else
    if (m1='червы') or (m1='черви') then
      K1.m:=Hearts
  else
      writeln('Неправильно введена масть первой карты!!!');
end;

procedure RecognitionColorSecondCard(m2:string);
var K2:Card;
begin
    if m2='пики' then
      K2.m:=Spades
  else
    if m2='трефы' then
      K2.m:=Clubs
  else
    if m2='бубны' then
      K2.m:=Diamonds
  else
    if (m2='червы') or (m2='черви') then
      K2.m:=Hearts
  else
      writeln('Неправильно введена масть второй карты!!!');
end;

procedure RecognitionAdvantageFirstCard(d1:string);
var K1:Card;
begin
    if (d1='шесть') or (d1='6') then
      K1.d:=Six
  else
    if (d1='семь') or (d1='7') then
      K1.d:=Seven
  else
    if (d1='восемь') or (d1='8') then
      K1.d:=Eigth
  else
    if (d1='девять') or (d1='9') then
      K1.d:=Nine
  else
    if (d1='десять') or (d1='10') then
      K1.d:=Ten
  else
    if (d1='валет') then
      K1.d:=Jack
  else
    if (d1='дама') then
      K1.d:=Queen
  else
    if (d1='король') then
      K1.d:=King
  else
    if (d1='туз') then
      K1.d:=Ace
  else
      writeln('Неправильно введено достоинство первой карты!!!');
end;

procedure RecognitionAdvantageSecondCard(d2:string);
var K2:Card;
begin
    if (d2='шесть') or (d2='6') then
      K2.d:=Six
  else
    if (d2='семь') or (d2='7') then
      K2.d:=Seven
  else
    if (d2='восемь') or (d2='8') then
      K2.d:=Eigth
  else
    if (d2='девять') or (d2='9') then
      K2.d:=Nine
  else
    if (d2='десять') or (d2='10') then
      K2.d:=Ten
  else
    if (d2='валет') then
      K2.d:=Jack
  else
    if (d2='дама') then
      K2.d:=Queen
  else
    if (d2='король') then
      K2.d:=King
  else
    if (d2='туз') then
      K2.d:=Ace
  else
      writeln('Неправильно введено достоинство второй карты!!!');
end;

function KICK(k1,k2:card; KM:Color):string;
var Kz,d1,d2,m1,m2:string;
begin
  if ((K1.m=K2.m) and (K1.d>K2.d)) then
    writeln('бьет')
  else
    writeln('не бьет');
end;

var K1,K2:Card;
    KM:Color;
    m1,m2,d1,d2:string;
begin
  clrscr;
  InputData(K1,K2,KM,m1,m2,d1,d2);
  RecognitionTrumpColor(KM);
  RecognitionColorFirstCard(m1);
  RecognitionColorSecondCard(m2);
  RecognitionAdvantageFirstCard(d1);
  RecognitionAdvantageSecondCard(d2);
  KICK(K1,K2,KM);
  readln;
end.
Проблема в том, что всегда выводятся сообщения:козырная масть введена неправильно, и карта k1 не бьет k2.
Иван 883 вне форума Ответить с цитированием
Старый 05.04.2009, 20:52   #2
pif
Пользователь
 
Регистрация: 26.11.2008
Сообщений: 37
По умолчанию

короче
ошибка в процедуре
procedure RecognitionTrumpColor(KM:Color);
var Kz:string;
засунь кз в раздел параметров и все будет работать(или вводи масть прям в этой процедуре)
короче прочитай еще раз про локальные и глобальные параметры у тя во всех процедурах одна ошибка
pif вне форума Ответить с цитированием
Старый 05.04.2009, 21:04   #3
Иван 883
Пользователь
 
Регистрация: 25.12.2008
Сообщений: 39
По умолчанию

Спасибо!!! А про функцию KICK не подскажешь?
Иван 883 вне форума Ответить с цитированием
Старый 05.04.2009, 21:40   #4
pif
Пользователь
 
Регистрация: 26.11.2008
Сообщений: 37
По умолчанию

Код:
function KICK(k1,k2:card;KM:color):boolean;
begin
   if ((K1.m=K2.m) and (K1.d>K2.d)) or ((k1.m=KM) and (k2.m<>KM)) then
       kick:=true 
    else 
       kick:=false
end;
только сделай так чтоб в поле d хранился номер карты а не строка

Последний раз редактировалось pif; 05.04.2009 в 21:49.
pif вне форума Ответить с цитированием
Старый 06.04.2009, 10:26   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А не луче ли хранить последовательность в массиве, и проверять циклом?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.04.2009, 13:18   #6
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

а еще есть хороший оператор:
case of
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 06.04.2009, 13:53   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Stilet и Plague.
а я считаю, что pif абсолютно прав!
Ну зачем в записи хранить НАЗВАНИЕ карты, когда достаточно хранить НОМЕР карты! Тогда функция проверки кто старше, кто кого бьёт сводится к банальной операции сравнения!
А для вывода наименований карт держать массивчик названий карт!!! (и, кстати, для отображения самих карт, номер будет удобнее!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.04.2009, 14:08   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Серж, я вот что имею ввиду:
Код:
const koloda:array[1..9] of string=('6','7','8','9','10','V','M','K','A');
var k1,k2:string;i,j:integer;
begin
 k1:='9';k2:='A';
// Находим  позиции карт в массиве старшинства
 i:=1; while (i<9)and(k1<>koloda[i]) do  inc(i);
 j:=1; while (j<9)and(k2<>koloda[j]) do inc(j);
// Если первая карта старше то...
 if i>j then
  caption:=k1+' бьет '+k2 else
   caption:=k2+' бьет '+k1
end;
Это вместо той кучи IF'ов.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
что делать если комп хочет отформатировать карту памяти с информацией? Александр Катаев Компьютерное железо 1 14.03.2009 14:11
Не могу установить карту fy_snow в counter strike Altera Свободное общение 6 30.04.2008 14:03
Нарисовать географическую карту. Фортран. Helga Помощь студентам 2 24.04.2008 19:47
Звуковая карта SunKnight Win Api 3 23.12.2007 23:44
Карта города 2 Archangel Помощь студентам 3 04.03.2007 05:19