数据结构课程设计-学生搭配问题

摘  要

本次课程设计是利用数据结构的知识编写一个能够实现学生配对的问题的软件,以达到在每一首歌曲中能够有学生配对来进行舞蹈表演。为了实现这一个功能我们用利用己学的知识进行编写程序。

通过学习数据结构课程和C语言的知识,主要利用数据结构的队列和C语言的循环语句知识,把男女生分别放在两个队列中,要涉及到队列的判断和循环等算法。判断队列的满和空的知识来完成。

主要是把男女生分别用字符串表示,然后利用C语言中的for循环if语句等算法,实现学生配对功能。

章  方案设计

1.1 问题描述

一班有m个女生,有n个男生,m不等于n,现要开一个舞会.男女姓分别编号坐在舞池的两边的椅子上。

每曲开始时,依次从男生和女生中各出一人配对跳舞,本曲没成功配对者坐着等待下一曲找舞伴。

请设计一系统模拟动态地显示出,上述过程,要求如下:

1输出每曲配对情况

2计算出任何一个男生编号为X和任意女生编号为Y,在第K曲配对跳舞的情况.至少求出K的两个值。

1.2 需求分析

核心问题:循环队列的应用

数据模型(逻辑结构) :循环队列(两个),将男生、女生两组人分别存放,

以后实现循环配对输出

存储结构:循环链表

核心算法:for循环,if语句

输入数据:男生人数、女姓人数

输出数据:每一首歌曲播放时,男生和女生搭配情况(输出编号)

当要查找的男女搭配时输出歌曲编号,和他们搭配的总次数

通过以上分析,该程序具有可行性。

1.3 运行环境

硬件开发环境:PC机

软件开发环境:VC++ 6.0

操作系统环境:Window XP

1.4 课程设计的目的

(1)熟练使用C语言编写程序,解决实际问题;

(2)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;

(3)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;

(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力。

第二章  算法设计

2.1 算法设计思想

队列(Queue) 是只允许在一端进行插入, 而在另一端进行删除的运算限制的线性表。

循环队列是在队列的顺序存储结构中,除了用乙组地址连续的存储单元一次存放从队列头到队列尾的元素外,尚需附设两个指针front 和rear分别指示队列头和队列尾元素的位置。

循环队列(两个),将男生、女生两组人分别存放,以实现循环配对输出。循环队列的入队,出队,判队满,判队空。

(1)要模拟动态地显示出现题目中所要求的循环,我们要先建立两个循环队列SqQueue和SqQueue2。

(2)将男生、女生两组人分别存入这两个队列。以实现他们的配对输出,这是循环队列固有的特性。

(3)利用循环队列的特性,将男女姓分别进行入队列和出队列操作,且实现搭配输出。

(4)循环队列的长度分别设为男女生的个数即可。在计算机终端输出的结果是根据要求输出男生女生搭配情况。

2.2 算法设计的应对方式

主函数:main()

学生跳舞搭配:dance()

假如有3个男生2个女生的配对方式

2.3 算法设计流程图

  详细设计

3.1 设计思想

建立链式循环队列来分别存储男生和女生,然后调用入队出队函数实现循环

队列的配对输出。为了充分利用向量空间,克服上述存储结构上溢现象的方法是

将向量空间想象为一个首尾相接的圆环,存储在其中成为循环队列。再循环队列

中进行入队、出队操作时,头指针仍要加1,向前移动。只不过当头指针指向上

界时其加1操作变为指向下界,这样就可以通过出队再入队来实现男生女生的循

环搭配了。

3.2 设计关键算法

(1)关键算法之一:

void main() {

    while (1) {

        printf("Input n m(1<=n<m<=%d):",MAX);

        fflush(stdout);

        rewind(stdin);

        if (2==scanf("%d%d",&n,&m)) {

            if (1<=n && n<m && m<=MAX) break;

        }

    }

(2)关键算法之二:

while (1) {

        printf("Input t x(1<=t<=%d 1<=x<=%d):",MAX,n);

        fflush(stdout);

        rewind(stdin);

        if (2==scanf("%d%d",&t,&x)) {

            if (1<=t && t<=MAX && 1<=x && x<=n) break;

        }

    }

(3)关键算法之三:

for (i=0;i<m;i++) md[i]='A'+i;

    for (i=0;i<n;i++) nd[i]='a'+i;

    k=0;

    for (i=0;i<t;i++) {

        printf("%2d: ",i+1);

        for (j=0;j<n;j++) {

            c='  ';

            if (i==t-1 && j==x-1) {c='*';y=k+1;}

            printf("%c%c%c",md[k],nd[j],c);

            k=(k+1)%m;

        }

程序代码

#include <stdio.h>
#include <string.h>
#define MAX 26
int m,n,t,x,y,i,j,k;
char md[MAX];
char nd[MAX];
char c;
void main() {
    while (1) {
        printf("Input n m(1<=n<m<=%d):",MAX);
        fflush(stdout);
        rewind(stdin);
        if (2==scanf("%d%d",&n,&m)) {
            if (1<=n && n<m && m<=MAX) break;
        }
    }
    while (1) {
        printf("Input t x(1<=t<=%d 1<=x<=%d):",MAX,n);
        fflush(stdout);
        rewind(stdin);
        if (2==scanf("%d%d",&t,&x)) {
            if (1<=t && t<=MAX && 1<=x && x<=n) break;
        }
    }
    for (i=0;i<m;i++) md[i]='A'+i;
    for (i=0;i<n;i++) nd[i]='a'+i;
    k=0;
    for (i=0;i<t;i++) {
        printf("%2d: ",i+1);
        for (j=0;j<n;j++) {
            c=' ';
            if (i==t-1 && j==x-1) {c='*';y=k+1;}
            printf("%c%c%c",md[k],nd[j],c);
            k=(k+1)%m;
        }
        printf("\n");
    }
    printf("%d\n",y);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X-MTing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值