Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > ПОМОЩЬ СТУДЕНТАМ > Бьет ли карта 1 карту 2. [Из Паскаля в Си]


Автор: Elaysa 27.05.17, 08:59
Помогите пожалуйста с задачей. Условие:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     struct card
    {
    /* масть карт */
    enum {spades, clubs, diamonds, hearts} suit;
    /* достоинство карт */
    enum {six, seven, eight, nine, ten, jack, queen, king, ace} value;
    } c1, c2;

Описать логическую функцию Kick(с1, с2, сs), проверяющую, бьёт ли карта с1
карту с2, с учётом того, что масть cs является козырной.

Есть программа на Паскале, надо сделать на СИ. ПОМОГИТЕ ПОЖАЛУЙСТАА
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    uses crt;
    const s1:array[1..4] of string[6]=('пики','трефы','бубны','червы');
          s2:array[1..9] of string[6]=('6','7','8','9','10','валет','дама',
                                       'король','туз');
    type mast=(pk,tr,bb,ch);
         dost=(k6,k7,k8,k9,k10,vl,dm,kr,tz);
         karta=record
               m:mast;
               d:dost;
               end;
              
    function Kick(k1,k2:karta;km:mast):boolean;
    var i:mast;
        j:dost;
    begin
    Kick:=((k1.m=km)and(k2.m<>km)){первая козырная, вторая не козырная}
    or((k1.m=k2.m)and(k1.d>k2.d));{или одной масти и первая старше}
    end;
     
    var k1,k2:karta;
        km:mast;
        i,j:byte;
        s:string[6];
        f:boolean;
    begin
    clrscr;
    f:=false;
     
     
    repeat
    writeln('Введите масть первой карты (пики,трефи,бубны,червы)');
    readln(s);
    i:=1;
    while(i<=4)and not f do
    if s=s1[i] then
     begin
      k1.m:=mast(i-1);
      f:=true;
     end
    else i:=i+1;
    if not f then writeln('Такой масти нет, повторите ввод')
    until f;
     
     
     
    f:=false;
    repeat
    writeln('Введите достоинство первой карты (6,7,8,9,10,валет,дама, король,туз)');
    readln(s);
    i:=1;
    while(i<=9)and not f do
    if s=s2[i] then
     begin
      k1.d:=dost(i-1);
      f:=true;
     end
    else i:=i+1;
    if not f then writeln('Такого достоинства нет, повторите ввод')
    until f;
     
     
    f:=false;
    repeat
    writeln('Введите масть второй карты (пики,трефи,бубны,червы)');
    readln(s);
    i:=1;
    while(i<=4) and not f do
    if s=s1[i] then
     begin
      k2.m:=mast(i-1);
      f:=true;
     end
    else i:=i+1;
    if not f then writeln('Такой масти нет, повторите ввод')
    until f;
     
     
    f:=false;
    repeat
    writeln('Введите достоинство второй карты (6,7,8,9,10,валет,дама, король,туз)');
    readln(s);
    i:=1;
    while(i<=9)and not f do
    if s=s2[i] then
     begin
      k2.d:=dost(i-1);
      f:=true;
     end
    else i:=i+1;
    if not f then writeln('Такого достоинства нет, повторите ввод')
    until f;
     
     
    f:=false;
    repeat
    writeln('Введите козырную масть(пики,трефи,бубны,червы)');
    readln(s);
    i:=1;
    while(i<=4)and not f do
    if s=s1[i] then
     begin
      km:=mast(i-1);
      f:=true;
     end
    else i:=i+1;
    if not f then writeln('Такой масти нет, повторите ввод')
    until f;
     
     
    writeln('Бьет ли первая карта вторую?');
    write(Kick(k1,k2,km));
    readln
    end.

Автор: Славян 27.05.17, 18:42
Наверное, как-то так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    bool Kick( karta &k1, karta &k2, char km)
    {
      return ( (k1.m==km) && (k2.m!=km) ) //первая козырная, вторая не козырная
        || ( (k1.m==k2.m) && (k1.d>k2.d) ); // или одной масти и первая старше
    }

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)