環形緩衝區: ringbuf.c

#cat  aa.c
/*ringbuf .c*/
#include<stdio.h>
#include<ctype.h>

#define NMAX 8
int iput = 0; /* 環形緩衝區的當前放入位置 */
int iget = 0; /* 緩衝區的當前取出位置 */
int n = 0; /* 環形緩衝區中的元素總數量 */
double buffer[NMAX];

/* 環形緩衝區的地址編號計算函數,若是到達喚醒緩衝區的尾部,將繞回到頭部。
環形緩衝區的有效地址編號爲:0到(NMAX-1)
*/
int addring (int i)
{
    return (i+1) == NMAX ? 0 : i+1;
}

/* 從環形緩衝區中取一個元素 */
double get(void)
{
    int pos;
    if (n>0){
        pos = iget;
        iget = addring(iget);
        n--;
        return buffer[pos];
    } else {
        printf("Buffer is empty\n");
        return 0.0;
    }
}

/* 向環形緩衝區中放入一個元素*/
void put(double z)
{
    if (n<NMAX) {
        buffer[iput]=z;
        iput = addring(iput);
        n++;
    } else {
        printf("Buffer is full\n");
    }
}

int main(void)
{
    char opera[5];
    double z;
    do {
        printf("Please input p|g|e?");
        scanf("%s", &opera);
            switch(tolower(opera[0])){
                case 'p': /* put */
                    printf("Please input a float number?");
                    scanf("%lf", &z);
                    put(z);
                    break;
                case 'g': /* get */
                    z = get();
                    printf("%8.2f from Buffer\n", z);
                    break;
                case 'e':
                    printf("End\n");
                    break;
                default:
                    printf("%s - Operation command error! \n", opera);
            }/* end switch */
    } while(opera[0] != 'e');

    return 0;
}
相關文章
相關標籤/搜索