顾客排队购买蛋挞问题(算法与数据结构设计)

课题内容和要求

顾客排队买蛋挞问题。有N个顾客排队,每人最多买M个。烘焙员每次烘焙1到K个蛋挞放入盘中,顾客只能购买盘中的蛋挞,未达到M个需重新排队。输出每个顾客购买情况和完成顺序。
例如——
输入:N=9,K=5;M=7
输出的购买情况为:

首次购买数量第二次购买数量第三次购买数量
顾客1151
顾客2214
顾客3322
顾客443
顾客552
顾客616
顾客7223
顾客8322
顾客943

购买到M个蛋挞的顾客的顺序为:4,5,6,9,1,2,3,7,8

数据结构说明

结构体Shop,存放商店营业信息,包括顾客数量N,蛋挞每次生产的上限K,每个顾客最多购买的数量M,以及每位顾客购买信息用结构体数组cu存放。数组result用于存放购买到M个蛋挞的顾客顺序,例如result[0]=i,表示顾客i第一个购买完M个蛋挞。list_col用于记录购买情况表的列数,控制最后输出购买情况的表头。

结构体Customer,存放顾客还需要购买蛋挞的数量(初始时需要购买数量M),顾客购买次数record,以及每次购买的记录以链表的形式按次序存储。

结构体Cal,存放顾客购买记录的链表结点,n表示该次购买的数量,next指向下一次购买记录结点。

算法设计

算法步骤:
(1)根据输入初始化shop当中的所有信息。
(2)初始化控制数组cu元素循环的下标cu_cal为0,初始化控制数组result下标的re_cal为0,标记flag初始化为0,蛋挞每次生产数量i初始化为0。
(3)若flag不为1,执行以下循环,直至flag=1。
a.i+1,若i>K重新置i=1,并将i加入到盘K_当中
b.通过循环判断顾客还需购买的数量mount是否为0,若为0表示购买完毕,数组cu下标cu_cal+1后对顾客数量N取模,遍历完数组cu直至找到一个还没购买完M个蛋挞的顾客,退出b步骤循环。该循环不会死循环,总能找到最后一个顾客未购买完M个蛋挞,并在后续步骤中将flag置为1,在下一轮大循环((3)步骤)中退出,不会再进到该循环。
c.判断盘中K_的数量是否大于顾客还需够买的数量mount,若mount大于K_则将mount的值减去K_的值,并添加该顾客的购买记录,置K_为0,接着判断该顾客的购买记录数record是否大于购买情况结果列数list_col,若大于则将record值赋值给list_col;若mount小于或等于K_,则将K_的值减去mount的值,并添加该顾客的购买记录,接着判断该顾客的购买记录数record是否大于购买情况结果列数list_col,若大于则将record值赋值给list_col,置该顾客的mount为0,此时该顾客已经购买完M个蛋挞,将该顾客的序号cu_cal加1后(加1后才是顾客真正的序号)赋值给购买顺序结果result[re_cal],re_cal加1使数组result下标后移。判断re_cal的值是否等于顾客数量N,若等于,表示所有顾客都已购买完M个蛋挞,置flag为1。
d.cu_cal加1并对N取模,使数组cu下标后移
(4)依据list_col值循环输出购买情况表头“第i+1次购买数量”
(5)依据顾客N值循环输出顾客的序号,并且遍历购买记录链表输出购买数量
(6)最后按顺序循环输出存放在数组result中顾客购买顺序

详细设计

程序包含文件shop_main.c、shop.h、shop.c

shop_main.c

#include <stdio.h>
#include <stdlib.h>
#include "shop.h"
int main()
{
    Shop *sh = (Shop*)malloc(sizeof(Shop));
    int N = 0;  // 顾客数量
    int K = 0;  // 商店生产蛋挞的上限
    int M = 0;  // 顾客需要购买的数量
    printf("蛋挞店\n");
    printf("请输入顾客数量:\n");
    scanf("%d",&N);
    printf("请输入商店生产蛋挞的上限:\n");
    scanf("%d",&K);
    printf("请输入顾客需要购买的数量:\n");
    scanf("%d",&M);
    Init_shop(sh,N,K,M);    // 调用函数初始化商店营业信息
    Shop_work(sh);      // 调用函数生成购买情况并输出
    printf("回车结束程序...\n");
    getchar();  // 将输入顾客需要购买的数量时按下的回车接收
    getchar();  // 等待输入回车结束程序运行
    free(sh);
}

shop.h

#ifndef __SHOP_H__
#define __SHOP_H__
typedef struct cal  // 存放顾客一次购买记录的结构体
{
    int n;  // 存放购买数量
    struct cal *next;   // 指向下一个结点的指针
}Cal;
typedef struct customer // 存放顾客购买信息的指针
{
    int mount;  // 存放还需要购买的数量
    int record; // 存放购买次数
    Cal *first; // 存放购买记录的链表头指针
}Customer;
typedef struct shop // 商店营业信息
{
    Customer *cu;   // 存放顾客信息的数组头指针
    int *result;    // 将已经购买到M个蛋挞顾客按顺序存入数组
    int list_col;   // 记录生成结果表的列数,用于构造结果表
    int N; // 顾客数量
    int K;  // 生产蛋挞的上限
    int K_; // 盘中被购买后剩余的蛋挞数量
    int M;  // 顾客需要购买蛋挞的数量
}Shop;
void Init_shop(Shop *shop,int N, int K, int M); // 商店初始化
void Creat_cal(Customer *cu, int n);    // 购买记录结点创建
void Shop_work(Shop *shop); // 商店程序运行
#endif

shop.c

#include "shop.h"
#include <stdio.h>
#include <stdlib.h>
/**
 * @brief 商店初始化
 * @param shop 指向商店营业信息的指针
 * @param N 顾客数量
 * @param K 商店生产蛋挞的上限
 * @param M 顾客需要购买蛋挞的数量
 * @return void
*/
void Init_shop(Shop *shop,int N, int K, int M)
{
    shop->list_col = 0; // 初始化购买情况结果列数为0
    shop->N = N;
    shop->cu = (Customer*)malloc(N*sizeof(Customer));   // 动态申请存顾客信息的数组空间
    shop->result = (int*)malloc(N*sizeof(int)); // 动态申请存放顾客编号
    if(!shop->cu&&!shop->result)
    {
        printf("申请空间失败————顾客数组,购买顺序\n");
    }
    for(int i = 0;i<N;i++)  // 初始化每个顾客信息
    {
        shop->cu[i].mount = M;
        shop->cu[i].first = NULL;
        shop->cu[i].record = 0;
        shop->result[i] = 0;
    }
    shop->K = K;
    shop->K_ = 0;
    shop->M = M;
}
/**
 * @brief 购买记录结点创建
 * @param cu 指向顾客信息的指针
 * @param n 该次购买蛋挞的数量
 * @return void
*/
void Creat_cal(Customer *cu, int n)
{
    if(cu->first==NULL) // 当没有购买记录时创建第一次购买记录
    {
        cu->first = (Cal*)malloc(sizeof(Cal));
        if(!cu->first)
        {
            printf("申请空间失败————购买记录");
        }
        cu->first->n = n;
        cu->record+=1;
        cu->first->next = NULL;
        return;
    }
    Cal *p = cu->first;
    for(;p->next; p=p->next);  // 将p指向最后一个不为空的结点,链表元素尾插
    p->next = (Cal*)malloc(sizeof(Cal));
    if(!p->next)
    {
        printf("申请空间失败————购买记录");
    }
    p->next->n = n;
    cu->record += 1;
    p->next->next = NULL;
}
/**
 * @brief 商店程序运行
 * @param shop 指向商店营业信息的指针
 * @return void
*/
void Shop_work(Shop *shop)
{
    int cu_cal = 0; // 数组下标,用于循环顾客排队购买蛋挞
    int re_cal = 0; // 数组下标,用于result数组的计数,每当一个顾客购买完所需的蛋挞,+1
    int flag = 0;   // 标记,用于提前退出循环
    int i = 0;  // 蛋挞生产计数1~K
    while(!flag)
    {
        i++;
        if(i>shop->K)   // 当蛋挞生产计数大于K时,重新置为1开始累加
        {
            i=1;
        }
        shop->K_+=i;    // 将该次生产的蛋挞数加入到被购买后剩余的蛋挞数量中
        while(shop->cu[cu_cal].mount==0)    // 判断顾客是否购买完蛋挞,如果购买完,将数组下标向后移
        {
            // 该循环不会死循环,总能找到最后一个顾客未购买完M个蛋塔,
            // 并在后续步骤中将flag置为1,在下一轮大循环中退出,不会再进到该循环
            cu_cal = (cu_cal+1)%shop->N;   // 数组下标后移
        }
        if(shop->cu[cu_cal].mount>shop->K_) // 顾客还需要购买的数量大于盘中剩余数量
        {
            shop->cu[cu_cal].mount-=shop->K_;
            Creat_cal(&(shop->cu[cu_cal]),shop->K_);    // 调用函数创建购买记录结点
            shop->K_ = 0;
            if(shop->list_col<(shop->cu[cu_cal].record))    // 如果顾客的购买记录数大于结果表的列数,更新列数
            {
                shop->list_col = shop->cu[cu_cal].record;
            }
        }
        else    // 顾客还需要购买的数量小于或等于盘中剩余数量
        {
            shop->K_ -= shop->cu[cu_cal].mount;
            Creat_cal(&(shop->cu[cu_cal]),shop->cu[cu_cal].mount);     // 调用函数创建购买记录结点
            if(shop->list_col<(shop->cu[cu_cal].record))
            {
                shop->list_col = shop->cu[cu_cal].record;
            }
            shop->cu[cu_cal].mount = 0;
            shop->result[re_cal] = cu_cal+1;    // 顾客所需数量已足够,将顾客编号记录在数组中
            re_cal +=1; // 数组下标后移
            if(re_cal==shop->N) // 如果re_cal等于顾客数量,则表示所有顾客都购买完蛋挞,置flag标志位为1
            {
                flag = 1;
            }
        }
        cu_cal = (cu_cal+1)%shop->N;    // 数组下标后移
    }
    // 将购买情况输出
    printf("购买情况如下:\n");
    printf("          ");
    for(i = 0;i<shop->list_col;i++) // 输出表头
    {
        printf("第%d次购买数量 ",i+1);
    }
    printf("\n");
    for(i = 0;i<shop->N;i++)
    {
        Cal *p = shop->cu[i].first;
        printf("顾客%2d",i+1);
        for(;p;p = p->next) // 将每个顾客购买信息一行一行的输出
        {
            printf("%13d",p->n);
        }
        printf("\n");
    }
    printf("购买到%d个蛋挞的顾客的顺序为:",shop->M);
    for(i = 0;i<shop->N;i++)
    {
        printf("顾客%d ",shop->result[i]);
    }
    printf("\n");
}

测试数据及其结果分析

运行结果1(题目例子):
在这里插入图片描述
运行结果2:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/784190.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux安装elasticsearch单机版

一、检查内核 uname -a uname -m 二、下载版本 下载版本选择自己服务器相同的内核版本 我这边是aaech64 ES下载地址 Kibana 下载地址 二、上传服务器解压 tar -xvf elasticsearch-8.14.1-linux-aarch64.tar.gz 三、安装ES 因为ES不能用root用户启动先创建用户 #新增 es …

Django QuerySet对象,all()方法

all()方法 在Django中&#xff0c;all()方法是QuerySet对象的一个方法&#xff0c;用于获取模型的所有实例。 当你调用ModelName.objects.all()时&#xff0c;Django会生成一个SQL查询&#xff0c;从数据库中获取该模型的所有记录&#xff0c;并返回一个QuerySet对象&#xf…

【产品运营】Saas的核心六大数据

国内头部软件公司的一季度表现惨不忍睹&#xff0c;为啥美国的还那么赚钱呢&#xff1f;其实核心是&#xff0c;没几个Saas产品经理是看数据的&#xff0c;也不知道看啥数据。 SaaS 行业&#xff0c;天天抛头露面、名头叫的响的 SaaS 产品&#xff0c;真没有几个赚钱的。 那为…

中国计量大学理学院访问赛氪网:共探校企合作新篇章来

2024年7月5日&#xff0c;中国计量大学理学院代表团莅临环球赛乐&#xff08;北京&#xff09;科技有限公司&#xff0c;进行了一场深入的调研交流活动。代表团成员包括中国计量大学理学院副院长王义康教授、数据科学系副主任刘学艺副教授以及金世举老师。此次访问旨在进一步强…

江洲的《家书》,岂止抵万金

题记 今晨6点钟&#xff0c;像往日一样的背上鱼具包&#xff0c;欲驾乘清凉舒适的晨风&#xff0c;前往味江河堤享受钓翁乐趣。孰料开门一看&#xff0c;朦胧的天空竟下着淅淅沥沥的小雨。 今年的天气异常&#xff0c;是笔者寄居“西川第一天”古镇5年来所未见&#xff1a;再…

stm32——外部中断EXTI

上回书说到定时器的级联&#xff0c;今天来谈谈外部中断EXTI。我使用的是STM32F103C8T6的学习板。仅供大家参考。 什么是中断呢&#xff1f;中断是指计算机在执行程序的过程中&#xff0c;当出现某些异常情况或特殊事件&#xff08;例如外部设备请求、定时时间到达、程序错误等…

YOLOV8花朵实例分割实战

原文:YOLOV8花朵实例分割实战 - 知乎 (zhihu.com) 一、代码: https://github.com/ultralytics/ultralytics​github.com/ultralytics/ultralytics 与先前几个版本相比,YOLOv8 模型更快、更准确,同时为训练模型提供统一框架,以执行以下基本任务: 目标检测;实例分割;图…

奇安信20240513笔试

题目一 解题思路 n转为字符串&#xff0c;如果位数为偶数&#xff0c;取前一半设为x&#xff0c;后一段为y&#xff0c;从x最低位开始&#xff0c;9&#xff0c;9*10&#xff0c;9*10*10。。。 到最高位&#xff0c;加x&#xff0c;如果x大于或等于y&#xff0c;加1. 位数为奇数…

武汉免费 【FPGA实战训练】 Vivado入门与设计师资课程

一&#xff0e;背景介绍 当今高度数字化和智能化的工业领域&#xff0c;对高效、灵活且可靠的技术解决方案的需求日益迫切。随着工业 4.0 时代的到来&#xff0c;工业生产过程正经历着前所未有的变革&#xff0c;从传统的机械化、自动化逐步迈向智能化和信息化。在这一背景下&…

全志A527 T527 cat /proc/cupinfo没有Serial问题

1.前言 我们有些客户是使用cpuinfo节点去获取系统的cpuid的,如下: cat /proc/cupinfo processor : 0 BogoMIPS : 48.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp CPU impleme…

代码随想录-Day51

115. 不同的子序列 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 109 7 取模。 示例 1&#xff1a; 输入&#xff1a;s “rabbbit”, t “rabbit” 输出&#xff1a;3 解释&#xff1a; 如下所示, 有 3 种可以从 …

基于 LlamaIndex、Claude-3.5 Sonnet 和 MongoDB,构建具有超级检索能力的智能体

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接如…

Day1--每日一练

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;每日一练-算法篇&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ Java专栏等 &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&…

Java之父James Gosling宣布正式退休 创造无数人的饭碗

编程语言Java的创始人&#xff0c;被誉为“Java之父”的James Gosling&#xff0c;近日在社交媒体上宣布了自己正式退休的消息。Gosling表示&#xff1a;“我终于退休了。做了这么多年的软件工程师&#xff0c;现在是时候享受人生了。”他透露&#xff0c;在亚马逊的过去7年是非…

代码随想录算法训练营第四十七天|1143.最长公共子序列、 1035.不相交的线、53. 最大子序和、392.判断子序列

1143.最长公共子序列 题目链接&#xff1a;1143.最长公共子序列 文档讲解&#xff1a;代码随想录 状态&#xff1a;一开始没想明白为啥要 max(dp[i - 1][j], dp[i][j - 1]) 思路&#xff1a; 如果text1[i - 1] 与 text2[j - 1]相同&#xff0c;那么找到了一个公共元素&#xff…

GitLab介绍,以及add an SSH key

GitLab GitLab 是一个用于仓库管理系统的开源项目&#xff0c;现今并在国内外大中型互联网公司广泛使用。 git,gitlab,github区别 git 是一种基于命令的版本控制系统&#xff0c;全命令操作&#xff0c;没有可视化界面&#xff1b; gitlab 是一个基于git实现的在线代码仓库…

K8s驱逐场景以及规避方案参考 —— 筑梦之路

Pod 驱逐分为两种情况&#xff1a; 较安全驱逐 & 提高稳定性的良性驱逐 API 发起驱逐&#xff0c;典型案例&#xff1a;kubectl drain Node Not Ready 时&#xff0c;Controller Manager 发起的驱逐 有风险的驱逐 节点压力驱逐 节点磁盘空间不足、内存不足 或 Pid 不足&…

简易Qt串口助手

界面显示如下 关于串口类 初始化 设置串口号 设置波特率 打开串口 发送按钮功能实现 接收数据显示在控件中 关闭串口

Vortex GPGPU的硬件设计和代码结构分析

文章目录 前言一、GPGPU是什么&#xff1f;1.1 GPU和GPGPU之间的差异1.2 GPU和CPU之间的集成方式1.3 GPU包含什么&#xff08;列举和VMIPS向量体系结构的差异&#xff09; 二、Vortex GPGPU是什么&#xff1f;2.1 Vortex GPGPU的技术边界和验证环境2.2 Vortex GPGPU的指令集设计…

30万的剧本杀店 被“好色”店长玩死了

文&#xff5c;琥珀食酒社 作者 | 朱珀 对开店搞钱的人来讲 什么才是最苦逼的&#xff1f; 不是一开始生意就不行 而是刚开始好到不行 最后只剩下不行 本期投稿的主人公糊糊 就是这样的 苦逼大BOSS 30万开剧本杀店 短短几个月 从巅峰跌到谷底 被捞钱又好色的猪队友…