Бьет ли карта 1 карту 2 - C (СИ)
Формулировка задачи:
Помогите пожалуйста с программой. Что-то не так, не могу понять, что именно.
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 является козырной.
#include "stdafx.h"
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <conio.h>
struct card
{
/*масть карт */
enum { пики, трефы, бубны, червы } mast;
/* достоинство карт */
enum { шесть, семь, восемь, девять, десять, валет, дама, король, туз } dost;
} c1, c2;
int Kick(card c1, card c2, char cs);
/*--------------------------------------------------------------------*/
/*Основная часть программы*/
int main(void)
{
char cs=0;
int k;
setlocale(LC_ALL, "Russian");
printf("Введите масть 1 карты - ");
scanf("%lf\n", &c1.mast);
printf("Введите достоинство 1 карты - ");
scanf("%lf\n", &c1.dost);
printf("Введите масть 2 карты - ");
scanf("%lf\n", &c2.mast);
printf("Введите достоинство 2 карты - ");
scanf("%lf\n", &c2.dost);
printf("Введите масть козырной карты - ");
scanf("%lf\n", &cs);
Kick(c1,c2,cs);
return 0;
}
int Kick(card c1, card c2, char cs)
{
char k;
k = ((c1.mast == cs) && (c2.mast != cs)) || ((c1.mast == c2.mast) && (c1.dost < c2.dost));
if (c1.mast == c2.mast) //если масти одинаковые
if (c1.dost > c2.dost) return 1;
else
{
return 0;
}
else //если масти не одинаковые
{
if (c1.mast == cs) //если козырь
return 1;
else
return 0;
}
}Решение задачи: «Бьет ли карта 1 карту 2»
textual
Листинг программы
#include <stdio.h>
#include <stdbool.h>
struct card
{
enum {spades, clubs, diamonds, hearts} suit;
enum {six, seven, eight, nine, ten, jack, queen, king, ace} value;
} c1, c2;
int enter_card_suite()
{
int suit;
bool wrongSuit;
do
{
char suitSymbol;
printf("Please enter suit symbol for a trump (s, c, d or h): ");
scanf("%c", &suitSymbol);
getchar();
wrongSuit = false;
switch (suitSymbol)
{
case 's': suit = spades; break;
case 'c': suit = clubs; break;
case 'd': suit = diamonds; break;
case 'h': suit = hearts; break;
default:
printf("Wrong suit symbol '%c'.\n", suitSymbol);
wrongSuit = true;
}
}
while (wrongSuit);
return suit;
}
int main()
{
c1.suit = clubs; c1.value = nine;
c2.suit = hearts; c2.value = queen;
int cs = enter_card_suite();
printf("Trump suit (as integer): %d\n", cs);
if (c1.suit == cs) puts("First card is a trump.");
if (c2.suit == cs) puts("Second card is a trump.");
}
Объяснение кода листинга программы
- Структура
cardобъявляет две переменные типаenumдля хранения масти и значения карты. - Функция
enter_card_suiteзапрашивает у пользователя ввод масти и проверяет его с помощью оператораswitch. - Если введенный символ масти соответствует одному из значений в
switch, соответствующее значениеenumприсваивается переменнойsuit. - Если введенный символ масти не соответствует ни одному из значений в
switch, выводится сообщение об ошибке и продолжается циклdo-while. - Ввод масти повторяется до тех пор, пока не будет введено правильное значение.
- После ввода правильного значения масти функция возвращает его в качестве возвращаемого значения.
- В функции
mainобъявляются две переменные типаcardдля хранения карт. - Первая карта устанавливается на масть
clubsи значениеnine. - Вторая карта устанавливается на масть
heartsи значениеqueen. - Функция
enter_card_suiteвызывается для ввода масти. - Выводится введенная масть.
- С помощью условных операторов проверяется, является ли первая или вторая карта мастью, введенной с помощью функции
enter_card_suite. - Если первая или вторая карта является мастью, выводится соответствующее сообщение.