当前位置:首页 » 编程语言 » c语言医院顺序排号
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言医院顺序排号

发布时间: 2023-02-03 18:38:59

‘壹’ 求编程题(看病要排队)的代码,必须用c语言解答,越基础越容易看懂越好,不要从别处来

struct BR_ //病人结构体;
{
int id; //病人ID;
int lv;//病人等级;
};

int main()
{
int n,i,j,yisheng,binglv,brnum = 0;
BR_ b2y[3][100] = { };//存放每个医生对应的病人;
int bingnum[3] = {}; //存放每个医生对应的病人个数;
char order[5];

//这里可以把所有输入的字串,存起来,再一一解决; 但是你原来的代码,是输入一个处理一个;
//所以 我也输入一个 处理一个了;
//但是题意是 : 输入完成后,再依次输出;
//所以,只能把要输出的东西,存在一个数组里面(下面的数组);等输入完成后再统一依次输出
char print_[300][8] = {}; //用来存放 最后print的字符串; 每一个out 都要处理一下;

int str_num = 0; //字符串的条数;

scanf("%d",&n);
for(j = 0 ; j < n;++j)
{
scanf("%s",order);
if(strcmp(order,"IN") == 0 ) //字符串比较,如果输入的IN,
{
brnum += 1;
scanf("%d",&yisheng);
scanf("%d",&binglv);
BR_ temp;
temp.id = brnum;
temp.lv = binglv;
b2y[ yisheng ][ bingnum[yisheng] ] = temp;
bingnum[yisheng]++;

//排序; 把等级高的 放在前面; 注意使用 稳定排序 的方式;比如下面的选择排序;
int pos = 0;
while(pos != n - 1)
{
for(i = pos + 1; i< n;++i)
{
if(b2y[yisheng][pos].lv < b2y[yisheng][i].lv)
{
BR_ temp1 = b2y[yisheng][pos];
b2y[yisheng][pos] = b2y[yisheng][i];
b2y[yisheng][i] = temp1;
}
}
pos++;
}
}
else if( strcmp(order,"OUT") == 0) //
{
scanf("%d",&yisheng);
if(bingnum[yisheng] <= 0) //如果这个医生当前病人为0 输出empty;
strcpy(print_[str_num++],"EMPTY");

else //不为0;输出排在最前面(也就是等级最高的病人);
{
char temp;
itoa(b2y[yisheng][0].id,print_[str_num++],10);

//最前面的病人 已经处理了,所以把数组后面的元素依次往前移动;
for(i = 0;i < bingnum[yisheng] - 1;++i)
{
b2y[yisheng][i] = b2y[yisheng][i + 1];
}
bingnum[yisheng]--;//病人数量递减;
}
}
}
for(i = 0 ; i < str_num;++i)
printf("%s\n",print_[i]);
return 0;
}

‘贰’ C语言:有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,

法一(模拟法):


#include<iostream>
usingstd::cin;
usingstd::cout;
intmain()
{
intn;
cout<<"请输入n=";
cin>>n;
if(n<2)
{
cout<<"n必须大于2! 请重新输入n=";
cin>>n;
}
bool*a=newbool[n+1];
a[0]=false;
for(inti=1;i<n+1;i++)
a[i]=true;
intx,k=n;x=i=0;//i为每次循环计数变量,x为人员序号,K为剩余人数
while(k!=0)
{
x++;
if(x>n)x=1;//当人员到达数组尾,序号重设为1
if(a[x])i++;//跳过已退出人员
if(i==3)
{a[x]=false;i=0;k--;}//当数到3时,退出人员设为false,剩余人数减1,i设为0,重新计数
}
cout<<"留下来的人序号为:"<<x<<" ";
delete[]a;
cin.get();
cin.get();//等待下一次键击关闭窗口
return0;
}




法二(递归法):

此题可用数学方法求解。


设有n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数 (用数学方法解的时候需要注意应当从0开始编号,因为取余会取到0解。)


实质是一个递推,n个人中最终留下来的序号与n-1个人中留下来的人的序号有一个递推关系式。


假设除去第k个人,则


0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1 // 原始序列(1)


0, 1, 2, 3, ..., k-2, , k, ..., n-1 // 除去第k人,即除去序号为k-1的人 (2)


k, k+1, ..., n-1, 0, 1, ..., k-2// 以序号k为起始,从k开始报0 (3)


0, 1, ..., n-k-1, n-k, n-k+1, ..., n-2 // 作编号转换,此时队列为n-1人 (4)


变换后就完完全全成为了(n-1)个人报数的子问题,注意(1)式和(4)式,是同一个问题,不同的仅仅是人数。比较(4)和(3),不难看出,0+k=k, 1+k=k+1, ... ,(3)式中'0'后面的数字,

((n-3)+k)%n=k-3,((n-2)+k)%n=k-2, 对于(3)式中'0'前面的数字,由于比n小,也可看作(0+k)%n=k, (1+k)%n=k+1, 故可得出规律:


设(3)中某一数为x' , (4)中对应的数为x,则有:x'=(x+k)%n.


设x为最终留下的人序号时,队列只剩下1人时,显然x=0; 此时可向前回溯至2人时x对应的序号,3人时x对应的序号……直至n人时x的序号,即为所求。



#include<iostream>
usingnamespacestd;
constintm=3;
intmain()
{
intn,f=0;
cin>>n;
for(inti=2;i<=n;i++)
f=(f+m)%i;
cout<<f+1<<endl;
}

‘叁’ 用c语言编写医院排队看病系统,急啊!!!求大神!!

#include <stdio.h>
#include <malloc.h>

typedef int queuetype;
queuetype num=1;
typedef struct qnode
{
queuetype data;
struct qnode *next;
} QNode; //链队结点类型
typedef struct
{
QNode *front,*rear;
} QuType;


void initlqueue(QuType *L)
{
L->front=L->rear=NULL;
}

void pushlqueue(QuType *L,queuetype e)
{
QNode *p=(QNode*)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
if(!L->front)
{
L->front=p;
}
if(L->rear)
L->rear->next=p;
L->rear=p;
num++;
}
void deletlqueue(QuType *L)
{
if(L->front)
{
QNode *p;
p=L->front;
printf("第%d位选手已经就诊! ",p->data);
L->front=p->next;
if(!p)
L->rear=NULL;
else
free(p);
}
else
{

num=0;
printf("所有的病人都已就诊完毕! ");
}
}

void showqueueperson(QuType *L)
{
QNode *p=L->front;
printf("输出所有排队者的序号: ");
while(p)
{
printf(" %d ",p->data);
p=p->next;
}
if(!L->front)
printf("病人都已经看病完成! ");
}

void quikSee(QuType*L,queuetype e)
{
QNode *p=L->front,*q,*t;
while(p&&p->data!=e)
{
t=p;
p=p->next;
}
if(p->data==e)
{
printf("find!%d号即可进行诊疗! ",p->data);
q=t->next;
if(q->next)
t->next=q->next;

if(t->next==L->rear)
t->next=L->rear=NULL; free(q);

}
else
printf("队列中无此人!无需删除操作! ");

}


//链队类型
void SeeDoctor()
{
int sel,flag=1;
QuType *qu=(QuType*)malloc(sizeof(QuType));
queuetype quik=0;
initlqueue(qu);//创建空队
while (flag==1) //循环执行
{
printf("1:排队 2:就诊 3:查看排队 4.不再排队,余下依次就诊 5:下班 请选择:");
scanf("%d",&sel);
switch(sel)
{ //排队,入队
case 1: pushlqueue(qu,num); printf(" 挂号成功! "); break;
case 2: deletlqueue(qu);
printf(" ");break; //就诊,出队
case 3: showqueueperson(qu); break; //显示排队病人
case 4: {
printf("若您需要马上就诊,请输入您的号:");
scanf("%d",&quik);
quikSee(qu,quik);
printf(" ");
} break; //任意顺序就诊
case 5: {
printf("抱歉!已下班,请排队的病人明天再来就诊! ");//下班,明天就医!
flag=0; //退出
break;
}
default : printf("输入错误,请从新输入! "); continue;
}
}
}
void main()
{
SeeDoctor();
}

病人的姓名等信息就在结构体里加几个成员就行了!主要功能已经实现了!

我截张图给你吧!

‘肆’ c语言课程设计题目 医院排队看病系统

#include <stdio.h>
#include <malloc.h>

typedef int queuetype;
queuetype num=1;
typedef struct qnode
{
queuetype data;
struct qnode *next;
} QNode; //链队结点类型
typedef struct
{
QNode *front,*rear;
} QuType;


void initlqueue(QuType *L)
{
L->front=L->rear=NULL;
}

void pushlqueue(QuType *L,queuetype e)
{
QNode *p=(QNode*)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
if(!L->front)
{
L->front=p;
}
if(L->rear)
L->rear->next=p;
L->rear=p;
num++;
}
void deletlqueue(QuType *L)
{
if(L->front)
{
QNode *p;
p=L->front;
printf("第%d位选手已经就诊! ",p->data);
L->front=p->next;
if(!p)
L->rear=NULL;
else
free(p);
}
else
{

num=0;
printf("所有的病人都已就诊完毕! ");
}
}

void showqueueperson(QuType *L)
{
QNode *p=L->front;
printf("输出所有排队者的序号: ");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
if(!L->front)
printf("病人都已经看病完成! ");
}

void quikSee(QuType*L,queuetype e)
{
QNode *p=L->front,*q,*t;
while(p&&p->data!=e)
{
t=p;
p=p->next;
}
if(p->data==e)
{
printf("find!%d号即可进行诊疗! ",p->data);
q=t->next;
if(q->next)
t->next=q->next;

if(t->next==L->rear)
t->next=L->rear=NULL;free(q);

}
else
printf("队列中无此人!无需删除操作! ");

}


//链队类型
void SeeDoctor()
{
int sel,flag=1;
QuType *qu=(QuType*)malloc(sizeof(QuType));
queuetype quik=0;
initlqueue(qu);//创建空队
while (flag==1) //循环执行
{
printf("1:排队 2:就诊 3:查看排队 4.不再排队,余下依次就诊 5:下班 请选择:");
scanf("%d",&sel);
switch(sel)
{//排队,入队
case 1: pushlqueue(qu,num);printf(" 挂号成功! ");break;
case 2: deletlqueue(qu);
printf(" ");break;//就诊,出队
case 3:showqueueperson(qu);break;//显示排队病人
case 4:{
printf("若您需要马上就诊,请输入您的号:");
scanf("%d",&quik);
quikSee(qu,quik);
printf(" ");
}break;//任意顺序就诊
case 5:{
printf("抱歉!已下班,请排队的病人明天再来就诊! ");//下班,明天就医!
flag=0;//退出
break;
}
default :printf("输入错误,请从新输入! "); continue;
}
}
}
void main()
{
SeeDoctor();
}

病人的姓名等信息就在结构体里加几个成员就行了!主要功能已经实现了!

我截张图给你吧!