심화 과제 ) 큐 사용
Milk라는 클래스와 VendingMachine 이라는 클래스를 하나 만들겠습니다. Milk의 맴버변수로, 유통기한을 나타내는 int를 작성해주시기 바랍니다.
VendingMachine 클래스에는 Queue를 활용하여 Milk를 담을 수 있는 컨테이너를 필드로 작성하여 주시기 바랍니다.
벤딩머신의 메소드로, 우유를 집어넣는 코드와 우유를 꺼내는 기능을 작성하되, 꺼낼때는 콘솔에 유통기한 및 큐에 남아있는 갯수를 출력하는 기능을 작성해주시기 바랍니다. 갯수가 0일때 우유를 꺼내는 기능을 호출하게 되면 꺼내는 대신 다른 멘트가 나오게끔 작성해주시길 바랍니다..
internal class Milk
{
public int shelfLife;//유통기한
}
internal class VendingMachine
{
//우유를 담는 큐
Queue<Milk> totalmilk = new Queue<Milk>();
//호출되면 큐에 있는 우유를 빼는 과정
public void DequeueMilk( )
{
//밴딩머신에 있는 우유가 없을시 빼는 과정을 안하고 다팔렷다고 출력함
if(totalmilk.Count == 0)
{
Console.WriteLine("다 팔렸음");
}
else
{
//메인에서 우유를 할당하고
//먼저 추가된 우유를 뺌
Milk temp = totalmilk.Dequeue();
Console.WriteLine("우유 유통기한은 : " + temp.shelfLife);
Console.Write("큐에 남아있는 갯수 : ");
Console.WriteLine(totalmilk.Count);
}
}
//큐에 우유를 추가
public void addMilk(Milk milk)
{
totalmilk.Enqueue(milk);
}
}
//메인문
static void Main(string[] args)
{
//밴딩머신 할당하고
VendingMachine vendingMachine = new VendingMachine();
//생성과 동시에 뉴할당을 해서 값을 대입한걸 추가함
//new할당 안하고 하면 똑같은 주소를 가져와 값을 대입하기 때문에
//마지막 값 밖에 안됌
//임의로 각각의 우유를 4개 추가 시킨거임
vendingMachine.addMilk(new Milk() { shelfLife = 12 });
vendingMachine.addMilk(new Milk() { shelfLife = 5 });
vendingMachine.addMilk(new Milk() { shelfLife = 7 });
vendingMachine.addMilk(new Milk() { shelfLife = 8 });
//각각 우유를 하나씩 빼는 과정
vendingMachine.DequeueMilk();
vendingMachine.DequeueMilk();
vendingMachine.DequeueMilk();
vendingMachine.DequeueMilk();
//밴딩머신에 있는 우유가 없어 Console.WriteLine("다 팔렸음");가 호출됌
vendingMachine.DequeueMilk();
}
심화 과제 ) List
Shape라는 Enum을 만들어서 Spade, Heart, Clover, Diamond 네 가지를 요소로 가지게 합니다.
Card라는 클래스를 만듭니다. 위 열거형을 Card클래스 맴버변수로 가지게 해주세요. Card클래스에는 숫자를 나타내는 int형을 넣되, a는 1, J는 11, Q는 12, K는 13이라고 가정하겠습니다.
CardDeck이라는 클래스도 하나 제작하도록 하겠습니다. Card 객체를 52개 담을 수 있는 ???(자료구조) 들을 활용하여 두 개 만드시되, 하나는 unusedCards, 하나는 usedCards 의 이름으로 만들겠습니다.
CardDeck 클래스의 생성자에 unusedCards 속 52개의 Card를 중복없이 뉴할당해서 넣어주는 코드를 작성하여 주시기 바랍니다. 카드를 섞는 메소드를 작성하거나 생성자에서 바로 진행해주시기 바랍니다.
CardDeck 클래스에 아직 쓰지 않은 맨 위 카드를 보기만 하는 ShowTopCard 기능을 제작하여 주시기 바랍니다. 이는 맨 상단의 카드를 보기만 할 뿐 카드를 소모하진 않습니다. DrawCard라는 메소드도 하나 제작하겠습니다. 이 메소드는 아직 쓰지 않은 덱의 맨 위 카드를 반환받고 그와 동시에 usedCard에 쌓는 기능을 수행합니다.
//Spade=1 선언했기 때문에 Heart, Clover, Diamond는 2, 3, 4로 값이 자동으로 지정됌
public enum Shape
{
Spade=1, Heart, Clover, Diamond
}
//Card 클래스
internal class Card
{
//Card클래스 안에 enum을 가져옴
public Shape Shapes;
public int CardNum; //1~13
}
//CardDeck 클래스
internal class CardDeck
{
//리스트로 카드를 담음
//사용한거, 사용안한거 52장 들어가는 구조
public List<Card> usedCards = new List<Card>(52);
public List<Card> unusedCards = new List<Card>(52);
//중복 처리를 위한 일회용 변수
Random Randomshuffle = new Random();
int RandomTemp1;//인덱스에 들어가 바꾸는 일회용
int RandomTemp2;//인덱스에 들어가 바꾸는 일회용
int temp;//교환값 일회용
//52개의 카드 추가
//1~13을 4번 넣음
public CardDeck(Card card,Shape shape)
{
for (int j = 1; j <= 4; j++)
{
for (int i = 1; i <= 13; i++)
{
//함수 출력이 되면 카드를 뉴할당해 값을 넣을수 있음
card = new Card();
card.CardNum = i;//1~13
card.Shapes = (Shape)j;//enum에 수를 쓰기 위해 형 변환
unusedCards.Add(card);
}
}
//리스트 안을 섞음
shuffle();
}
//52개의 카드 랜덤
public void shuffle()
{
//랜덤으로 2개 수를 부여 받고
//인덱스에 2개를 각각 넣고 바꿈
//이걸 500번 돌려 섞음
for (int i = 0; i < 500; i++)
{
RandomTemp1 = Randomshuffle.Next(0, 52);
RandomTemp2 = Randomshuffle.Next(0, 52);
//카드넘버 변경
temp = unusedCards[RandomTemp1].CardNum;
unusedCards[RandomTemp1].CardNum = unusedCards[RandomTemp2].CardNum;
unusedCards[RandomTemp2].CardNum = temp;
//카드문양(Shapes) 변경
temp = (int)unusedCards[RandomTemp1].Shapes;
unusedCards[RandomTemp1].Shapes = unusedCards[RandomTemp2].Shapes;
unusedCards[RandomTemp2].Shapes = (Shape)temp;
}
}
//마지막 카드 출력
public void ShowTopCard()
{
//list 사용시
Console.Write("맨위카드는 : ");
Console.Write(unusedCards[unusedCards.Count - 1].CardNum + " ");
Console.WriteLine(unusedCards[51].Shapes);//unusedCards.Count - 1 ==51
}
//사용된 마지막 카드를 제거하고 그 카드를 사용 안한 카드에 넣음
public void DrawCard()
{
usedCards.Add(unusedCards[51]);
unusedCards.RemoveAt(unusedCards.Count-1);
}
}
static void Main(string[] args)
{
Card card = new Card();
Shape shape = new Shape();
CardDeck carddeck = new CardDeck(card, shape);
carddeck.ShowTopCard();//사용하지 않는 맨위카드
carddeck.DrawCard();//사용한걸 빼서 담아둠
//사용하지 않는거 출력
for (int i = 0; i < carddeck.unusedCards.Count; i++)
{
Console.Write($"count : {i + 1} ");
Console.Write(carddeck.unusedCards[i].CardNum);
Console.WriteLine(carddeck.unusedCards[i].Shapes);
}
Console.WriteLine("===================================");
//사용한거 출력
for (int i = 0; i < carddeck.usedCards.Count; i++)
{
Console.Write($"count : {i + 1} ");
Console.Write(carddeck.usedCards[i].CardNum);
Console.WriteLine(carddeck.usedCards[i].Shapes);
}
'과제' 카테고리의 다른 글
c# 개인 프로젝트 - 싱글 섯다 구현 (0) | 2025.01.04 |
---|---|
Day21 - Linked List(연결 리스트) 과제 (1) | 2024.12.18 |
Day18 - 인터페이스 심화 (0) | 2024.12.17 |
Day18 - 인터페이스 일반 과제 (0) | 2024.12.13 |
Day17 - 상속,추상 class (0) | 2024.12.12 |