现有程序,文件WJ代码内容如下:
main.c文件:
#include "Recipe.h"
void display_menu()
{
printf("\n===== 家庭菜谱管理系统 =====\n");
printf("1. 添加菜谱\n");
printf("2. 删除菜谱\n");
printf("3. 修改菜谱\n");
printf("4. 查找菜谱\n");
printf("5. 随机推荐\n");
printf("6. 退出系统\n");
printf("===========================\n");
printf("请选择操作: ");
}
int main()
{
// 设置控制台支持UTF-8
system("chcp 65001 > nul");
load_recipes(); // 加载现有数据
int running = 1;
while (running)
{
display_menu();
int choice;
scanf("%d", &choice);
getchar(); // 消耗换行符
switch(choice)
{
case 1:
add_recipe();
break;
case 2:
delete_recipe();
break;
case 3:
modify_recipe();
break;
case 4:
search_recipes();
break;
case 5:
random_select();
break;
case 6:
running = 0;
break;
default:
printf("无效选择!\n");
}
}
printf("系统已退出\n");
return 0;
}
Recipe.c文件:
#include "Recipe.h"
// 全局变量初始化
Recipe recipes[MAX_RECIPES];
int recipe_count = 0;
int next_id = 1;
// 从文件加载菜谱数据
void load_recipes()
{
FILE *file = fopen("recipes.dat", "rb");
if (!file) return;
fread(&recipe_count, sizeof(int), 1, file);
fread(&next_id, sizeof(int), 1, file);
fread(recipes, sizeof(Recipe), recipe_count, file);
fclose(file);
}
// 保存菜谱数据到文件
void save_recipes()
{
FILE *file = fopen("recipes.dat", "wb");
if (!file) {
printf("保存失败!\n");
return;
}
fwrite(&recipe_count, sizeof(int), 1, file);
fwrite(&next_id, sizeof(int), 1, file);
fwrite(recipes, sizeof(Recipe), recipe_count, file);
fclose(file);
}
// 添加新菜谱
void add_recipe()
{
if (recipe_count >= MAX_RECIPES)
{
printf("菜谱库已满!\n");
return;
}
Recipe new_recipe;
new_recipe.id = next_id++;
printf("请输入菜名: ");
fgets(new_recipe.name, MAX_NAME_LEN, stdin);
new_recipe.name[strcspn(new_recipe.name, "\n")] = 0;
printf("分类(凉菜/热菜/汤羹等): ");
fgets(new_recipe.category, MAX_CAT_LEN, stdin);
new_recipe.category[strcspn(new_recipe.category, "\n")] = 0;
printf("食材(用逗号分隔): ");
fgets(new_recipe.ingredients, MAX_INGREDIENTS, stdin);
new_recipe.ingredients[strcspn(new_recipe.ingredients, "\n")] = 0;
printf("制作步骤(用分号;分隔): ");
fgets(new_recipe.steps, MAX_STEPS, stdin);
new_recipe.steps[strcspn(new_recipe.steps, "\n")] = 0;
printf("制作时间(分钟): ");
scanf("%d", &new_recipe.prep_time);
getchar(); // 消耗换行符
printf("所需器具: ");
fgets(new_recipe.tools, MAX_TOOLS, stdin);
new_recipe.tools[strcspn(new_recipe.tools, "\n")] = 0;
printf("爱好者: ");
fgets(new_recipe.for_whom, MAX_FOR_WHOM, stdin);
new_recipe.for_whom[strcspn(new_recipe.for_whom, "\n")] = 0;
printf("口味(清淡/麻辣等): ");
fgets(new_recipe.flavor, MAX_FLAVOR, stdin);
new_recipe.flavor[strcspn(new_recipe.flavor, "\n")] = 0;
printf("菜系(川菜/粤菜等): ");
fgets(new_recipe.cuisine, MAX_CUISINE, stdin);
new_recipe.cuisine[strcspn(new_recipe.cuisine, "\n")] = 0;
recipes[recipe_count++] = new_recipe;
save_recipes();
printf("添加成功! ID: %d\n", new_recipe.id);
}
// 通过ID查找菜谱
int find_recipe_by_id(int id) {
for (int i = 0; i < recipe_count; i++)
{
if (recipes[i].id == id) return i;
}
return -1;
}
// 通过名称查找菜谱
int find_recipe_by_name(const char *name)
{
for (int i = 0; i < recipe_count; i++)
{
if (strcmp(recipes[i].name, name) == 0) return i;
}
return -1;
}
// 删除菜谱
void delete_recipe()
{
char input[50];
printf("输入要删除的菜名或ID: ");
fgets(input, 50, stdin);
input[strcspn(input, "\n")] = 0;
int index = -1;
if (isdigit(input[0]))
{
index = find_recipe_by_id(atoi(input));
} else
{
index = find_recipe_by_name(input);
}
if (index == -1)
{
printf("未找到菜谱!\n");
return;
}
printf("确定删除 '%s' (ID: %d)? (y/n): ", recipes[index].name, recipes[index].id);
char confirm = getchar();
getchar(); // 消耗换行符
if (confirm == 'y' || confirm == 'Y')
{
// 移动数组元素
for (int i = index; i < recipe_count - 1; i++)
{
recipes[i] = recipes[i + 1];
}
recipe_count--;
save_recipes();
printf("已删除!\n");
} else
{
printf("取消删除\n");
}
}
// 修改菜谱
void modify_recipe()
{
char input[50];
printf("输入要修改的菜名或ID: ");
fgets(input, 50, stdin);
input[strcspn(input, "\n")] = 0;
int index = -1;
if (isdigit(input[0]))
{
index = find_recipe_by_id(atoi(input));
} else
{
index = find_recipe_by_name(input);
}
if (index == -1)
{
printf("未找到菜谱!\n");
return;
}
printf("当前信息:\n");
print_recipe(recipes[index]);
printf("选择要修改的字段:\n");
printf("1.菜名\n2.分类\n3.食材\n4.步骤\n5.时间\n6.器具\n7.喜好者\n8.口味\n9.菜系\n");
int choice;
scanf("%d", &choice);
getchar(); // 消耗换行符
switch(choice)
{
case 1:
printf("新菜名: ");
fgets(recipes[index].name, MAX_NAME_LEN, stdin);
recipes[index].name[strcspn(recipes[index].name, "\n")] = 0;
break;
case 2:
printf("新分类: ");
fgets(recipes[index].category, MAX_CAT_LEN, stdin);
recipes[index].category[strcspn(recipes[index].category, "\n")] = 0;
break;
case 3:
printf("新食材: ");
fgets(recipes[index].ingredients, MAX_INGREDIENTS, stdin);
recipes[index].ingredients[strcspn(recipes[index].ingredients, "\n")] = 0;
break;
case 4:
printf("新步骤: ");
fgets(recipes[index].steps, MAX_STEPS, stdin);
recipes[index].steps[strcspn(recipes[index].steps, "\n")] = 0;
break;
case 5:
printf("新时间(分钟): ");
scanf("%d", &recipes[index].prep_time);
getchar();
break;
case 6:
printf("新器具: ");
fgets(recipes[index].tools, MAX_TOOLS, stdin);
recipes[index].tools[strcspn(recipes[index].tools, "\n")] = 0;
break;
case 7:
printf("新喜好者: ");
fgets(recipes[index].for_whom, MAX_FOR_WHOM, stdin);
recipes[index].for_whom[strcspn(recipes[index].for_whom, "\n")] = 0;
break;
case 8:
printf("新口味: ");
fgets(recipes[index].flavor, MAX_FLAVOR, stdin);
recipes[index].flavor[strcspn(recipes[index].flavor, "\n")] = 0;
break;
case 9:
printf("新菜系: ");
fgets(recipes[index].cuisine, MAX_CUISINE, stdin);
recipes[index].cuisine[strcspn(recipes[index].cuisine, "\n")] = 0;
break;
default:
printf("无效选择\n");
return;
}
save_recipes();
printf("修改成功!\n");
}
// 打印菜谱详情
void print_recipe(Recipe r)
{
printf("\n===== 菜谱详情 =====\n");
printf("ID: %d\n", r.id);
printf("菜名: %s\n", r.name);
printf("分类: %s\n", r.category);
printf("食材: %s\n", r.ingredients);
printf("步骤: %s\n", r.steps);
printf("时间: %d分钟\n", r.prep_time);
printf("器具: %s\n", r.tools);
printf("适合人群: %s\n", r.for_whom);
printf("口味: %s\n", r.flavor);
printf("菜系: %s\n", r.cuisine);
printf("====================\n");
}
// 搜索菜谱
void search_recipes()
{
printf("\n搜索选项:\n");
printf("1.按菜名\n2.按ID\n3.按分类\n4.按时间\n5.按器具\n6.按喜好者\n7.显示全部\n");
int choice;
scanf("%d", &choice);
getchar(); // 消耗换行符
char query[100];
int found = 0;
switch(choice)
{
case 1:
printf("输入菜名: ");
fgets(query, 100, stdin);
query[strcspn(query, "\n")] = 0;
for (int i = 0; i < recipe_count; i++)
{
if (strstr(recipes[i].name, query))
{
print_recipe(recipes[i]);
found = 1;
}
}
break;
case 2:
printf("输入ID: ");
scanf("%d", &choice);
getchar();
for (int i = 0; i < recipe_count; i++)
{
if (recipes[i].id == choice)
{
print_recipe(recipes[i]);
found = 1;
break;
}
}
break;
case 3:
printf("输入分类: ");
fgets(query, 100, stdin);
query[strcspn(query, "\n")] = 0;
for (int i = 0; i < recipe_count; i++)
{
if (strstr(recipes[i].category, query))
{
print_recipe(recipes[i]);
found = 1;
}
}
break;
case 4:
printf("最大时间(分钟): ");
scanf("%d", &choice);
getchar();
for (int i = 0; i < recipe_count; i++)
{
if (recipes[i].prep_time <= choice)
{
print_recipe(recipes[i]);
found = 1;
}
}
break;
case 5:
printf("输入器具: ");
fgets(query, 100, stdin);
query[strcspn(query, "\n")] = 0;
for (int i = 0; i < recipe_count; i++)
{
if (strstr(recipes[i].tools, query))
{
print_recipe(recipes[i]);
found = 1;
}
}
break;
case 6:
printf("输入喜好者: ");
fgets(query, 100, stdin);
query[strcspn(query, "\n")] = 0;
for (int i = 0; i < recipe_count; i++)
{
if (strstr(recipes[i].for_whom, query))
{
print_recipe(recipes[i]);
found = 1;
}
}
break;
case 7:
for (int i = 0; i < recipe_count; i++)
{
print_recipe(recipes[i]);
found = 1;
}
break;
default:
printf("无效选择\n");
return;
}
if (!found) printf("未找到匹配结果\n");
}
// 生成采购清单
void generate_shopping_list(Recipe *selected, int count)
{
printf("\n===== 采购清单 =====\n");
for (int i = 0; i < count; i++)
{
printf("[%s] 食材: %s\n", selected[i].name, selected[i].ingredients);
}
printf("====================\n");
}
// 随机选择菜谱
void random_select()
{
printf("\n选择类型:\n");
printf("1.单餐\n2.多天计划\n>> ");
int choice, days;
scanf("%d", &choice);
getchar();
if (choice == 2) {
printf("输入天数: ");
scanf("%d", &days);
getchar();
} else {
days = 1;
}
printf("\n筛选条件(回车跳过):\n");
char filter[100];
printf("冷热(冷/热): ");
fgets(filter, 100, stdin);
filter[strcspn(filter, "\n")] = 0;
char temp_filter[100] = {0};
if (strlen(filter) > 0) strcpy(temp_filter, filter);
printf("口味: ");
fgets(filter, 100, stdin);
filter[strcspn(filter, "\n")] = 0;
char flavor_filter[100] = {0};
if (strlen(filter) > 0) strcpy(flavor_filter, filter);
printf("喜好者: ");
fgets(filter, 100, stdin);
filter[strcspn(filter, "\n")] = 0;
char whom_filter[100] = {0};
if (strlen(filter) > 0) strcpy(whom_filter, filter);
// 筛选符合条件的菜谱
Recipe valid_recipes[MAX_RECIPES];
int valid_count = 0;
for (int i = 0; i < recipe_count; i++)
{
int match = 1;
if (strlen(temp_filter) > 0 &&
strstr(recipes[i].category, temp_filter) == NULL)
{
match = 0;
}
if (strlen(flavor_filter) > 0 &&
strstr(recipes[i].flavor, flavor_filter) == NULL)
{
match = 0;
}
if (strlen(whom_filter) > 0 &&
strstr(recipes[i].for_whom, whom_filter) == NULL)
{
match = 0;
}
if (match)
{
valid_recipes[valid_count++] = recipes[i];
}
}
if (valid_count == 0)
{
printf("没有符合条件的菜谱!\n");
return;
}
srand(time(NULL));
Recipe selected[days];
printf("\n===== 推荐菜谱 =====\n");
for (int i = 0; i < days; i++)
{
int idx = rand() % valid_count;
selected[i] = valid_recipes[idx];
printf("第%d天: %s\n", i+1, selected[i].name);
}
generate_shopping_list(selected, days);
}
Recipe.h文件:
#ifndef RECIPE_H
#define RECIPE_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#define MAX_RECIPES 100 // 最大菜谱数量
#define MAX_NAME_LEN 50 // 菜名最大长度
#define MAX_CAT_LEN 30 // 分类最大长度
#define MAX_INGREDIENTS 200 // 食材描述最大长度
#define MAX_STEPS 500 // 步骤描述最大长度
#define MAX_TOOLS 100 // 器具最大长度
#define MAX_FOR_WHOM 100 // 喜好者最大长度
#define MAX_FLAVOR 30 // 口味最大长度
#define MAX_CUISINE 30 // 菜系最大长度
// 菜谱结构体
typedef struct {
int id; // 自动生成的唯一ID
char name[MAX_NAME_LEN]; // 菜名
char category[MAX_CAT_LEN]; // 分类(如:凉菜/热菜)
char ingredients[MAX_INGREDIENTS]; // 食材
char steps[MAX_STEPS]; // 制作步骤
int prep_time; // 准备时间(分钟)
char tools[MAX_TOOLS]; // 所需器具
char for_whom[MAX_FOR_WHOM]; // 适合人群(喜好者)
char flavor[MAX_FLAVOR]; // 口味
char cuisine[MAX_CUISINE]; // 菜系
} Recipe;
// 全局变量
extern Recipe recipes[MAX_RECIPES];
extern int recipe_count;
extern int next_id;
// 函数声明
void load_recipes();
void save_recipes();
void add_recipe();
void delete_recipe();
void modify_recipe();
void search_recipes();
void random_select();
void generate_shopping_list(Recipe *selected, int count);
void print_recipe(Recipe r);
int find_recipe_by_id(int id);
int find_recipe_by_name(const char *name);
#endif
请先理解这些代码,等一下我会提出对功能代码的修改要求,需要你给出修改后的完整代码
最新发布