[This is CS50 2024] After Week3 - 알고리즘 #Snackbar

moonstrnck·2024년 1월 30일

CS50

목록 보기
10/13


[CS50 Practice - #Snackbar]

Snackbar

Learning Goals

  • 구조체(structs) 사용 연습
  • 선형 검색 알고리즘 작성

Background

당신이 해변에 있고 스낵바에서 여러 가지 품목을 주문하고 싶다고 상상해 보십시오. 보유하고 있는 현금 금액이 제한되어 있고 주문하기 전에 품목에 대한 총 비용을 확인하고 싶습니다. Snackbar.c에서는 두 가지 기능을 완료합니다. 첫 번째는 Beach Burger Shack 메뉴에 최소한 처음 4개 항목을 추가하는 add_items입니다. 그런 다음 선형 검색 알고리즘을 구현하여 선택한 각 항목을 검색하고 해당 가격을 반환하는 get_cost를 완료합니다.

Hints

  • add_items 함수에서 메뉴 항목과 가격을 하드 코딩할 수 있습니다.
  • strings.h에는 여기서 유용할 수 있는 함수가 있습니다.

Demo

Demo 보기

Getting Started

  1. GitHub 계정을 사용하여 cs50.dev에 로그인합니다.
  2. 터미널 창 내부를 클릭하고 cd를 실행합니다.
  3. 코드 공간에 snackbar.zip이라는 zip을 다운로드하려면
    wget https://cdn.cs50.net/2022/fall/labs/3/snackbar.zip을 실행한 다음 Enter 키를 누르세요. wget과 다음 URL 또는 해당 문제에 대한 다른 문자 사이의 공백을 간과하지 않도록 주의하세요!
  4. 이제 unzip Snackbar.zip을 실행하여 Snackbar라는 폴더를 만듭니다.
  5. 더 이상 ZIP 파일이 필요하지 않으므로 rm Snackbar.zip을 실행하고 프롬프트에서 “y”와 Enter를 차례로 입력하면 됩니다.

Implementation Details

주요 기능은 이미 완료되었습니다. 메뉴 배열을 초기화하기 위해 add_items를 호출한 후, 메뉴 항목과 가격이 인쇄되어 아무 것도 입력하지 않고 Enter 키를 누를 때까지 항목을 계속 선택하라는 메시지가 표시됩니다. 처음 4개 이상의 메뉴 항목을 추가하는 add_items 함수와 각 항목의 비용을 반환하는 get_cost라는 두 가지 함수를 완료해야 합니다. get_cost에서 선형 검색 알고리즘을 생성할 때 대소문자를 구분하지 않는지 확인하세요.

생각해보기

여기서 다중 배열보다 구조체 배열이 더 나은 솔루션인 이유는 무엇입니까?

나의 풀이

// Practice using structs
// Practice writing a linear search function

/**
 * Beach Burger Shack has the following 10 items on their menu
 * Burger: $9.5
 * Vegan Burger: $11
 * Hot Dog: $5
 * Cheese Dog: $7
 * Fries: $5
 * Cheese Fries: $6
 * Cold Pressed Juice: $7
 * Cold Brew: $3
 * Water: $2
 * Soda: $2
 */

#include <cs50.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>

// Number of menu items
// Adjust this value (10) to number of items input below
#define NUM_ITEMS 10

// Menu itmes have item name and price
typedef struct
{
    string item;
    float price;
} menu_item;

// Array of menu items
menu_item menu[NUM_ITEMS];

// Add items to menu
void add_items(void);

// Calculate total cost
float get_cost(string item);

int main(void)
{
    add_items();

    printf("\nWelcome to Beach Burger Shack!\n");
    printf("Choose from the following menu to order. Press enter when done.\n\n");

    for (int i = 0; i < NUM_ITEMS; i++)
    {
        printf("%s: $%.2f\n", menu[i].item, menu[i].price);
    }
    printf("\n");

    float total = 0;
    while (true)
    {
        string item = get_string("Enter a food item: ");
        if (strlen(item) == 0)
        {
            printf("\n");
            break;
        }

        total += get_cost(item);
    }

    printf("Your total cost is: $%.2f\n", total);
}

// Add at least the first four items to the menu array
// structs 작성
void add_items(void)	
{
    menu[0].item = "Burger";
    menu[0].price = 9.5;

    menu[1].item = "Vegan Burger";
    menu[1].price = 11;

    menu[2].item = "Hot Dog";
    menu[2].price = 5;

    menu[3].item = "Cheese Dog";
    menu[3].price = 7;

    menu[4].item = "Fries";
    menu[4].price = 5;

    menu[5].item = "Cheese Fries";
    menu[5].price = 6;

    menu[6].item = "Cold Pressed Juice";
    menu[6].price = 7;

    menu[7].item = "Cold Brew";
    menu[7].price = 3;

    menu[8].item = "Water";
    menu[8].price = 2;

    menu[9].item = "Soda";
    menu[9].price = 2;

    return;
}

// Search through the menu array to find an item's cost
// 선형 검색
float get_cost(string item)
{
    float price = 0;                    // 가격 0으로 초기화
    for (int i = 0; i < NUM_ITEMS; i++) // 반복문으로 선형 검색
    {
        if (strcasecmp(menu[i].item, item) == 0) // strcasecmp 대소문자를 구분하지 않고 스트링 비교
        {
            price = menu[i].price;
        }
    }

    return price;
}

메뉴와 다른 문자를 입력하면 금액 합산에 적용 안됨.

++ 추가
price 변수를 할당할 필요가 없다. for문에서 바로 menu[i].price를 return 하면,
조건문이 참일땐 해당 값을 return하고 거짓일 시, 반복문이 종료된 후 0.0을 return한다.
내가 굳이 price변수에 값을 초기화 해주었던 건 조건문에 return을 걸면 반드시 그 값을 return한다고 무의식 중에 생각한 것 같은데, 조건문의 조건이 참이 아니라면 그 값을 return할 일도 없으며 그 조건은 무의미하다. 따라서 기존의 return값을 반환한다.
그래서 중복으로 return값을 설정해도 조건만 잘 짜여진다면 괜찮다.

float get_cost(string item)
{
     for (int i = 0; i < NUM_ITEMS; i++) // 반복문으로 선형 검색
    {
        if (strcasecmp(menu[i].item, item) == 0) // strcasecmp 대소문자를 구분하지 않고 스트링 비교
        {
            return (menu[i].price);
        }
    }

    return 0.0;
}

0개의 댓글