『壹』 求編程題(看病要排隊)的代碼,必須用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();
}
病人的姓名等信息就在結構體里加幾個成員就行了!主要功能已經實現了!
我截張圖給你吧!