作者在 2008-11-19 15:21:18 发布以下内容
#define maxsize 1000
#define MAX 30000
#define true 1
#define false 0
#include <stdio.h>
#include <conio.h>
#include<string.h>
struct sqnode //定义一循环对列
{
char date[maxsize];
int front,rear; //定义队首指针和队尾指针
};
void initq(struct sqnode *q) //队列初始化
{
q->front=q->rear=0;
}
int fullq(struct sqnode *q) //判断队列是否已满
{
if((q->rear+1)%maxsize==q->front)
return true;
else
return false;
}
#define MAX 30000
#define true 1
#define false 0
#include <stdio.h>
#include <conio.h>
#include<string.h>
struct sqnode //定义一循环对列
{
char date[maxsize];
int front,rear; //定义队首指针和队尾指针
};
void initq(struct sqnode *q) //队列初始化
{
q->front=q->rear=0;
}
int fullq(struct sqnode *q) //判断队列是否已满
{
if((q->rear+1)%maxsize==q->front)
return true;
else
return false;
}
int insertq(sqnode *Q, char x) //元素入队,先判断队列是否已满,在进行入队操作
{
if(fullq(Q))
return(false);
Q->date[Q->rear]=x;
Q->rear=(Q->rear+1)%maxsize; /* 重新设置队尾指针 */
return(true); /*操作成功*/
}
char deleteq(struct sqnode *q) //元素出队,先判断队列是否为空,再进行其它操作
{
char temp; //中间变量,用来存放出队元素的值,用temp返回其值
if(q->front!=q->rear) //若队列不为空则返回出队元素的值,否则返回字符'&'
{
temp=q->date[q->front];
q->front=(q->front+1)%maxsize; //重新设置队首指针
return temp;
{
if(fullq(Q))
return(false);
Q->date[Q->rear]=x;
Q->rear=(Q->rear+1)%maxsize; /* 重新设置队尾指针 */
return(true); /*操作成功*/
}
char deleteq(struct sqnode *q) //元素出队,先判断队列是否为空,再进行其它操作
{
char temp; //中间变量,用来存放出队元素的值,用temp返回其值
if(q->front!=q->rear) //若队列不为空则返回出队元素的值,否则返回字符'&'
{
temp=q->date[q->front];
q->front=(q->front+1)%maxsize; //重新设置队首指针
return temp;
}
else
{
printf("队列中无元素!");
return '&';
}
}
void count(char str1[maxsize],int k)//统计字符函数
{
int date=0,word=0,other=0,kongge=0,i;
else
{
printf("队列中无元素!");
return '&';
}
}
void count(char str1[maxsize],int k)//统计字符函数
{
int date=0,word=0,other=0,kongge=0,i;
for(i=0;i<k;i++)
{
if(str1[i]>='0'&&str1[i]<='9') date++;
else if((str1[i]>='a'&&str1[i]<='z')||(str1[i]>='A'&&str1[i]<='Z')) word++;
else if(str1[i]==' ') kongge++;
else other++;
}
printf("\n数字个数为%5d\n",date);
printf("字母个数为%5d\n",word);
printf("空格个数为%5d\n",kongge);
printf("其他字符个数为%5d\n",other);
{
if(str1[i]>='0'&&str1[i]<='9') date++;
else if((str1[i]>='a'&&str1[i]<='z')||(str1[i]>='A'&&str1[i]<='Z')) word++;
else if(str1[i]==' ') kongge++;
else other++;
}
printf("\n数字个数为%5d\n",date);
printf("字母个数为%5d\n",word);
printf("空格个数为%5d\n",kongge);
printf("其他字符个数为%5d\n",other);
}
void checkq()
{
char ch1;
sqnode p;
initq(&p);
int i=-1;
char str1[maxsize];
while(1)
{
while(1) //第一个进程是输出字符串"I am a student!"
{
printf("I am a student!\t");
if(kbhit())//检查键盘状态,如果检测到用户键入了一个新的字符,就入队
{
int f;
ch1=getch();
if(ch1=='#'||ch1=='$')
break; //当键入的字符是'#'或'$',第一个进程结束,否则将键入的字符存到循环队列中,以便第二个进程使用;
f= insertq(&p,ch1);
if(f==false)
{
printf("队列已满,无法存储!");
break;
}
}
}
printf("\n第一个进程被强制中断,进行第二个进程!\n");
do//第二个进程是输出键入的字符并统计字符个数;
{
i++;
str1[i]=deleteq(&p);
if(str1[i]!='&')
printf("%c\t",str1[i]);
}while(str1[i]!='&'&&p.rear!=p.front);
if(str1[0]!='&')
count(str1,i+1);//第二个进程的代码结束!
i=-1;
printf("\n第二个进程结束,键入一个字符('@'除外,否则结束所有进程)接着进行第一个进程!\n");
ch1=getch();
if(ch1=='@') break;
}
}
void main()
{
checkq();
}
{
char ch1;
sqnode p;
initq(&p);
int i=-1;
char str1[maxsize];
while(1)
{
while(1) //第一个进程是输出字符串"I am a student!"
{
printf("I am a student!\t");
if(kbhit())//检查键盘状态,如果检测到用户键入了一个新的字符,就入队
{
int f;
ch1=getch();
if(ch1=='#'||ch1=='$')
break; //当键入的字符是'#'或'$',第一个进程结束,否则将键入的字符存到循环队列中,以便第二个进程使用;
f= insertq(&p,ch1);
if(f==false)
{
printf("队列已满,无法存储!");
break;
}
}
}
printf("\n第一个进程被强制中断,进行第二个进程!\n");
do//第二个进程是输出键入的字符并统计字符个数;
{
i++;
str1[i]=deleteq(&p);
if(str1[i]!='&')
printf("%c\t",str1[i]);
}while(str1[i]!='&'&&p.rear!=p.front);
if(str1[0]!='&')
count(str1,i+1);//第二个进程的代码结束!
i=-1;
printf("\n第二个进程结束,键入一个字符('@'除外,否则结束所有进程)接着进行第一个进程!\n");
ch1=getch();
if(ch1=='@') break;
}
}
void main()
{
checkq();
}