Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
28 / 23 / 13
Регистрация: 08.12.2012
Сообщений: 611
1

Считать последовательность игральных карт и занести их в массив множеств

17.07.2014, 15:38. Показов 1678. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
вопрос такой:
напишите процедуру которая бы считывала последовательность
игральных карт и заносила их в массив множеств - по одному
множеству на каждую масть. Один перечислимый тип используйте для
карты,а второй - для масти.Данные каждой карты будут представлены символом,
соответствующим масти и символом, соответствующим карте
('6' .. '10','B','Д','K','T')
вот чего пришло пока в голову
Pascal
1
2
3
4
5
 type 
    longstring = string[3]; // один символ на масть и два на карту (число 10 имеется ввиду)
    mast = (wini, kresti, bubi, hervi);
    karts = (six, seven, eight, nine, ten, valet, dama, corol, tuz);
    koloda = array [ mast, karts ] of longstring;
дальше думается либо контроль ввода организовать
посимвольно например для масти
Pascal
1
2
3
     repeat 
      readln(c); //c: char
     until c in['w','k','b','h'];
либо голова уже отказывает
может у кого какие соображения есть
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.07.2014, 15:38
Ответы с готовыми решениями:

Мастям игральных карт присвоены порядковые номера. Вывести название соответствующих карт
Помогите решить задачу!!! Мастями игральных карт присвоены порядковые...

Задачка на кодировку игральных карт
Закодируем игральные карты с помощью натуральных чисел следующим образом: 1-двойка треф, 2 -...

Раздача игральных карт на 3 человека
Всем добрый вечер. Существует такая чешская игра Марьяж, 1 игроку раздается 12 карт, и двум другим...

Из 52 игральных карт случайным образом выбраны 4
Добрый день. Есть такая задачка, вроде решил но немного сомневаюсь в правильности решения. Из...

7
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
17.07.2014, 15:56 2
Лучший ответ Сообщение было отмечено ujif как решение

Решение

Цитата Сообщение от ujif Посмотреть сообщение
которая бы считывала последовательность
игральных карт
Откуда считывала?

Добавлено через 4 минуты
Типы
Pascal
1
2
longstring = string[3]; // один символ на масть и два на карту (число 10 имеется ввиду)
koloda = array [ mast, karts ] of longstring;
сами придумали или даны по условию? А то в задании говорится о множествах, а не о строках.
1
28 / 23 / 13
Регистрация: 08.12.2012
Сообщений: 611
17.07.2014, 20:15  [ТС] 3
задание взято из книги "Turbo Pascal" 5 издание Эллиот Коффман
стр 711...я так думаю,наверно в слове "откуда" в задании имеется ввиду
полная свобода выбора для программиста...

Добавлено через 2 минуты
да про строки сам придумал., а со множествами как раз и проблема
на ум ничего не идет

Добавлено через 41 минуту
вот еще вариант
Pascal
1
2
3
4
5
6
7
8
9
10
 type 
      long = string[3];
      mast = (W, K, B, H);
      karts = (six, seven, eight, nine, ten, valet, dama, corol, tuz);
      kart = set of karts;
  const 
      kar : array [ karts ] of long = ('6','7','8','9','10','V','D','C','T');
   type 
       koloda = array [ mast ] of kart;
    var ko: koloda;
как заполнять , голова кипит

Добавлено через 1 час 12 минут
вот так ,значит пока получилось
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
  type
    mast = (W, K, B, H);
    karts = (six, seven, eight, nine, ten, valet, dama, corol, tuz);
    kart = set of karts;
    koloda = array [mast] of kart;
   var ko: koloda; i : mast; j: karts;
procedure zapolnenie( var ko: koloda);
  begin
   for i:= w to h do
    for j:= six to tuz do
     ko [ i ]:= ko [ i ] + [ j ];
   end;
4 множества в массиве ,НО заполняет конечно только
каждое множество перечислимым типом kart
а надо по условию
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7771 / 4600 / 2824
Регистрация: 22.11.2013
Сообщений: 13,080
Записей в блоге: 1
18.07.2014, 11:44 4
Лучший ответ Сообщение было отмечено ujif как решение

Решение

Можно как-то так:
Pascal
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
type
  TSuit = (ErrSuit,
    Hearts {черви}, Diamonds {бубны}, Clubs {трефи}, Spades {пики});
  TRank = (ErrRank,
    Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten,
    Jack, Queen, King);
  TDeck = array [Hearts..Spades] of set of Ace..King;
 
const
  SuitStrings: array [TSuit] of string[5] = ('?',
    #3'ЧчHh', #4'БбDd', #5'ТтCc', #6'ПпSs');
  RankStrings: array [TRank] of string[4] = ('?',
    'ТтAa', '2', '3', '4', '5', '6', '7', '8', '9', '10',
    'ВвJj', 'ДдQq', 'КкKk');
 
function SuitToStr(s: TSuit): string;
begin
  SuitToStr:=SuitStrings[s][1];
end;
 
function RankToStr(r: TRank): string;
begin
  if r=Ten then RankToStr:=RankStrings[r] else RankToStr:=RankStrings[r][1];
end;
 
function StrToSuit(s: string): TSuit;
var i: TSuit;
begin
  StrToSuit:=ErrSuit;
  if s='' then Exit;
  for i:=Hearts to Spades do
    if Pos(s[1],SuitStrings[i])<>0 then begin
      StrToSuit:=i; Break;
    end;
end;
 
function StrToRank(s: string): TRank;
var i: TRank;
begin
  StrToRank:=ErrRank;
  if s='' then Exit;
  for i:=Ace to King do
    if Pos(s[1],RankStrings[i])<>0 then begin
      StrToRank:=i; Break;
    end;
end;
 
var
  Deck: TDeck;
  rank: TRank;
  suit: TSuit;
  s, c: string;
begin
  for suit:=Hearts to Spades do Deck[suit]:=[];
  Write('Допустимые обозначения рангов:');
  for rank:=Ace to King do Write(' ',RankStrings[rank]); WriteLn;
  Write('Допустимые обозначения мастей:');
  for suit:=Hearts to Spades do Write(' ',SuitStrings[suit]); WriteLn;
  WriteLn('Вводите через пробел последовательность карт в виде РангМасть,');
  WriteLn('для завершения ввода нажмите Enter:');
  repeat
    Write('> '); ReadLn(s);
    if s='' then Break;
    s:=s+' ';
    while Copy(s,1,1)=' ' do Delete(s,1,1);
    repeat
      c:=Copy(s,1,Pos(' ',s)-1);
      suit:=ErrSuit; rank:=StrToRank(s);
      if rank<>ErrRank then begin
        Delete(s,1,1+Integer(rank=Ten));
        suit:=StrToSuit(s);
      end;
      if (rank=ErrRank) or (suit=ErrSuit) then
        WriteLn('*** Не опознана карта: "', c, '"')
      else
        Include(Deck[suit],rank);
      Delete(s,1,Pos(' ',s));
      while Copy(s,1,1)=' ' do Delete(s,1,1);
    until s=''
  until false;
  Write('Содержимое колоды:');
  for suit:=Hearts to Spades do
    for rank:=Ace to King do
      if rank in Deck[suit] then
        Write(RankToStr(rank):3,SuitToStr(suit));
end.
Тестовый прогон:
Допустимые обозначения рангов: ТтAa 2 3 4 5 6 7 8 9 10 ВвJj ДдQq КкKk
Допустимые обозначения мастей: ♥ЧчHh ♦БбDd ♣ТтCc ♠ПпSs
Вводите через пробел последовательность карт в виде РангМасть,
для завершения ввода нажмите Enter:
> ss Ah 2D 10c ks
*** Не опознана карта: "ss"
> 3п 7п Тп
>
Содержимое колоды: Т♥ 2♦ 10♣ Т♠ 3♠ 7♠ К♠


PS. Тег code в тестовом прогоне испортит значки мастей.

Добавлено через 8 минут
Если хочется видеть туза после короля, в типе TRank переставьте Ace после King:
Pascal
1
2
3
 TRank = (ErrRank,
    Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten,
    Jack, Queen, King, Ace);
1
28 / 23 / 13
Регистрация: 08.12.2012
Сообщений: 611
18.07.2014, 11:51  [ТС] 5
Спасибо Уважаемый bormant за поддержку,
очень красиво написано
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7771 / 4600 / 2824
Регистрация: 22.11.2013
Сообщений: 13,080
Записей в блоге: 1
18.07.2014, 12:04 6
Лучший ответ Сообщение было отмечено ujif как решение

Решение

Можно довольно "дёшево" раскрасить вывод:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
uses crt;
const
  SuitColors: array [TSuit] of Byte = (Yellow, Red, Red, DarkGray, DarkGray);
...
  for suit:=Hearts to Spades do
    for rank:=Ace to King do
      if rank in Deck[suit] then begin
        TextColor(SuitColors[suit]);
        Write(RankToStr(rank):3,SuitToStr(suit));
      end;
  NormVideo;
end.
1
28 / 23 / 13
Регистрация: 08.12.2012
Сообщений: 611
18.07.2014, 12:31  [ТС] 7
думаю в конце проги добавить приглашение в казино
и нарисовать пару бутылок шампанского
0
28 / 23 / 13
Регистрация: 08.12.2012
Сообщений: 611
19.07.2014, 18:57  [ТС] 8
вот как-то так получилось

Pascal
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 Uses Crt; 
 type
   mast = (W,K,B,H);//перечислимый тип масти(вини,крести..)
   long = string[3];
     karts = (six,seven,eight,nine,ten,valet,dama,corol,tuz);
      kart = set of karts;  
    kol = array [mast] of kart; //в массиве 4 множества по числу мастей
 const    // для вывода на экран достоинства карты 
      kar : array [karts] of long = ('6','7','8','9','10','v','d','c','t');
  var  ko: kol; //ko переменная массива kol
        i: mast; // переменная перечислимого типа mast
        j: karts; // переменная перечислимого типа karts
        m: byte; // количество вводимых карт
function limit:byte;  // определяет количество вводимых карт 
 begin
writeln('введите кол-во карт кот.надо занести в колоду не более 36');
writeln('eсли введете 36,то массив карт заполнится автоматически');
 repeat
   readln(m);
 until(0 < m)and(m < 37);
   ClrScr; // очищаем экран от того строк и введенной цифры m
   limit:= m;
 end;
{ zap заполняем колоду в зависимости от количества 
 если m ввели = 36 ,то колода заполняется автоматом,
 если m ввели меньше 36 ,то вводим все вручную }
procedure zap(var ko: kol;const k:byte);
  begin
  if k = 36 then
    for i:= w to h do
     for j:= six to tuz do
       include(ko[i],j)
     { for i:= w to h do //или так - тоже вся колода
     for j:= six to tuz do
    ko[i]:= ko[i] + [j]; }
       else
  if k < 36 then  begin
writeln('введите масть W,K,B,H и через пробел достоинство карты(six,seven..) и нажмите  Enter');
    for m:= 1 to k do begin
      read(i,j);//i- W,K,B,H масть,j-карты перечисл.тип
      include(ko[i],j) //вставляем в массив множеств ко
    end;// для for m:= 1
      ClrScr; //очищаем экран от того что вводили здесь
  end; // для  if k < 36
  end; // конец процедуры zap
procedure output(ko: kol);
 begin
  for i:= w to h do begin
     for j:= six to tuz do
    if j in ko[i] then write ( i, kar [j], ' ');//выводим в строку все карты одной масти
      writeln; // переход на другую строку 
     end;
 end;
begin  ClrScr;
 zap(ko,limit);//limit кол-во карт кот.надо занести в колоду не более 36
 output(ko);
   readln; // прога ждет нажатия enter
end.
Огромное спасибо за поддержку Уважаемому модератору Puporevu
и bormant
0
19.07.2014, 18:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2014, 18:57
Помогаю со студенческими работами здесь

Считать из файла числа и занести в массив
Доброго времени суток. Подскажите, как занести только числа, не учитывая пробелы (предполагаю, что...

Из колоды в 36 игральных карт случайным образом выбирают 5
Помогите, пожалуйста решить задачу. Желательно с пояснениями. Из колоды в 36 игральных карт...

Мастям игральных карт присвоены следующие номера
Мастям игральных карт присвоены следующие номера: &quot;пики&quot; - а, &quot;трефы&quot; - b, бубны - c, червы - d. По...

Считать из файла слова и занести их в массив string-ов
Как считать слова из файла и занести их в массив типа string?

Считать данные с файла и занести их последовательно в двумерный массив
Здравствуйте. Возник следующий вопрос: мне нужно считать данные с файла и занести их...

Во второй массив занести обратную последовательность элементов первого массива
Здравствуйте. Делаю задание Дан одномepный массив. Массив запoлнить случайными числами. -...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru