用C语言实现[问题描述] 商品货架可以看成一个栈,栈顶商品的生产日期最早,栈底商品的生产日期最近。上货时,需要倒货架,以保证生产日期较近的商品在较下的位置。 [基本要求] 针对一种特定商品,实现上述管理过程。货架信息从文件中读取,上货后在输出至文件和屏幕。 [实现提示] 用栈模拟货架和周转空间。 [测试数据] 注意测试边界数据,如空栈。
时间: 2024-01-24 10:18:15 浏览: 138
以下是用C语言实现商品货架管理的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STACK_SIZE 100 // 栈的最大容量
#define MAX_LINE_LENGTH 100 // 文件行的最大长度
// 商品结构体
typedef struct {
char name[20]; // 商品名称
char date[11]; // 生产日期(格式为 yyyy-mm-dd)
double price; // 商品价格
} Goods;
// 栈结构体
typedef struct {
Goods goods[MAX_STACK_SIZE]; // 商品数组
int top; // 栈顶指针
} Stack;
// 初始化栈
void initStack(Stack *stack) {
stack->top = -1;
}
// 判断栈是否为空
int isStackEmpty(Stack *stack) {
return stack->top == -1;
}
// 判断栈是否已满
int isStackFull(Stack *stack) {
return stack->top == MAX_STACK_SIZE - 1;
}
// 入栈
void push(Stack *stack, Goods goods) {
if (isStackFull(stack)) {
printf("Stack overflow!\n");
return;
}
stack->top++;
stack->goods[stack->top] = goods;
}
// 出栈
Goods pop(Stack *stack) {
if (isStackEmpty(stack)) {
printf("Stack underflow!\n");
exit(1);
}
Goods goods = stack->goods[stack->top];
stack->top--;
return goods;
}
// 读取文件中的商品信息到栈中
void readGoodsFromFile(Stack *stack, const char *filename) {
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("Cannot open file %s!\n", filename);
exit(1);
}
char line[MAX_LINE_LENGTH];
while (fgets(line, MAX_LINE_LENGTH, fp) != NULL) {
Goods goods;
sscanf(line, "%s %s %lf", goods.name, goods.date, &goods.price);
push(stack, goods);
}
fclose(fp);
}
// 将栈中的商品信息输出到文件和屏幕
void printGoods(Stack *stack, const char *filename) {
FILE *fp = fopen(filename, "w");
if (fp == NULL) {
printf("Cannot open file %s for writing!\n", filename);
exit(1);
}
printf("Name\tDate\tPrice\n");
printf("--------------------------\n");
while (!isStackEmpty(stack)) {
Goods goods = pop(stack);
printf("%s\t%s\t%.2f\n", goods.name, goods.date, goods.price);
fprintf(fp, "%s %s %.2f\n", goods.name, goods.date, goods.price);
}
fclose(fp);
}
// 上货(倒货架)
void loadGoods(Stack *stack) {
Stack tmpStack;
initStack(&tmpStack);
while (!isStackEmpty(stack)) {
push(&tmpStack, pop(stack));
}
char name[20], date[11];
double price;
printf("Enter the name, date and price of the new goods: ");
scanf("%s %s %lf", name, date, &price);
Goods goods;
strcpy(goods.name, name);
strcpy(goods.date, date);
goods.price = price;
push(stack, goods);
while (!isStackEmpty(&tmpStack)) {
push(stack, pop(&tmpStack));
}
}
int main() {
Stack stack;
initStack(&stack);
readGoodsFromFile(&stack, "goods.txt");
loadGoods(&stack);
printGoods(&stack, "goods_new.txt");
return 0;
}
```
在这个示例程序中,我们使用了一个栈来模拟货架,上货时需要将货架倒过来,然后再将新的商品放在栈顶,最后再将栈倒回来。我们定义了一个 `Goods` 结构体来表示商品信息,包括名称、生产日期和价格。使用 `initStack` 函数来初始化栈,使用 `push` 和 `pop` 函数来进行入栈和出栈操作。我们还提供了一个 `readGoodsFromFile` 函数来从文件中读取商品信息到栈中,以及一个 `printGoods` 函数来将栈中的商品信息输出到文件和屏幕上。最后,我们在 `main` 函数中调用这些函数来实现商品货架的管理。
阅读全文