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