純C小練習之模擬循環緩衝區

     爲了鞏固一下C語言基礎,寫了幾個小程序。下面這個小程序實現了一個循環緩衝區,擊鍵盤的“I”鍵,一個鍵盤事件被寫入緩衝區;敲擊“O”鍵,代表一個鍵盤事件從緩衝區被讀出。以下是代碼:

#include <stdio.h>
#include <stdlib.h>

#define BUTTOM_BUFF_SIZE 8
#define KEY_EVENT   'e'

typedef unsigned char u8;

typedef struct{
u8 buff[BUTTOM_BUFF_SIZE];
u8 head,tail;
}buttom_dev_t;

static buttom_dev_t btm_dev;

static void event_in_buff()
{
     btm_dev.buff[btm_dev.head]= KEY_EVENT;   //數據寫進循環緩存區   %BUTTOM_BUFF_SIZE
     btm_dev.head = (++btm_dev.head)%BUTTOM_BUFF_SIZE;        
     if(btm_dev.head == btm_dev.tail){
         btm_dev.tail = (++btm_dev.tail)%BUTTOM_BUFF_SIZE;
     }
}

static u8 event_out_buff()
{
     u8 ret;

     if(btm_dev.head==btm_dev.tail){
         return 0;
     }
     ret = btm_dev.buff[btm_dev.tail];
     btm_dev.buff[btm_dev.tail++]=' '; //模擬數據被取走,打印出來爲空!
     if(btm_dev.tail == BUTTOM_BUFF_SIZE){
         btm_dev.tail &= BUTTOM_BUFF_SIZE-1;
     }
     return ret;
}

void show()
{
     int i;
     int n;
     char flag;
     int head=(int)btm_dev.head;
     int tail=(int)btm_dev.tail;

//line 1 打印緩衝區數據
     for(i=0;i<BUTTOM_BUFF_SIZE;i++){
         printf(" %c ",(char)btm_dev.buff[i]);
     }
     printf("/n");

//line 2 打印讀寫指針的位置
     if(tail>head){
         for(i=0;i<head;i++) //space before 'w'
             printf("    ");
         printf(" w ");

         for(i=0;i<tail-head-1;i++)
             printf("    ");
         printf(" r ");
     }
     else if(tail<head){
         for(i=0;i<tail;i++) //space
             printf("    ");
         printf(" r ");

         for(i=0;i<head-tail-1;i++)
             printf("    ");
         printf(" w ");
     }
     else{
         for(i=0;i<head;i++)
             printf("    ");
         printf(" b ");
     }

     // 打印head,tail的數值
     printf("/n");
     printf("h=%d/tt=%d/n",btm_dev.head,btm_dev.tail);
}


int main()
{
     int i;
     char c;

     btm_dev.head = btm_dev.tail = 0;

     printf("****************************************************/n");
     printf("*                                                   */n");
     printf("*        Hit Key I     --- An event IN buff           */n");
     printf("*        Hit Key O     --- An event OUT buff          */n");
     printf("*        Hit Key Q     --- Quit                       */n");
     printf("*        Any Key Else --- No event                   */n");
     printf("*                                                   */n");
     printf("****************************************************/n");

     while(1){
         c = getch();
         if(c=='i'){
             printf("/n===================An event IN buff!================/n");
             event_in_buff();
             show();
         }
         else if (c=='o'){
             printf("/n===================An event OUT buff!===============/n");
             event_out_buff();
             show();
         }
         else if(c=='q'){
      printf("/n*** exit ***/n");
      break;
}
else
             printf("/n=======================No event!====================/n");
     }

     exit(0);
}


運行結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章