과제

Day19 - 큐, 리스트 심화

qltjfeo55555 2024. 12. 17. 15:07

심화 과제 ) 큐 사용

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