数据缓冲

作者在 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;
}
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;
 }
 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);
}
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();
}
交流角落 | 阅读 4180 次
文章评论,共6条
crazycoder
2008-11-23 09:55
1
写的真不错,我是学到了很多^_^
crazycoder
2008-11-23 10:11
2
这段还不太明白:<br />
 if(str1[i]!='&amp;')<br />
&nbsp;&nbsp;&nbsp;printf(&quot;%c\t&quot;,str1[i]);<br />
&nbsp;&nbsp;&nbsp; }while(str1[i]!='&amp;'&amp;&amp;p.rear!=p.front);<br />
&nbsp;&nbsp;&nbsp; if(str1[0]!='&amp;')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count(str1,i+1);//第二个进程的代码结束!<br />
<br />
str1[]数组中的某个元素的是'&amp;'意味着什么?<br />
吾愚笨,忘指教。
crazycoder
2008-11-23 10:11
3
str1[]数组中的某个元素的值是'&amp;'意味着什么?
yangdongsen(作者)
2008-11-23 14:44
4
&amp;是取地址的意思
crazycoder
2008-11-23 15:15
5
这我也知道啊,还是不明白
crazycoder
2008-11-23 15:43
6
我差不多明白了,str1[i]=='&amp;'意味着出队列操作返回'&amp;',表示队列以空,但我认为关于用‘&amp;'做队列为空的返回值问题上,应该可以改进。如果你输入中包括‘&amp;’的话,会有一些小问题---我刚试验过。
游客请输入验证码
文章归档