ringbuffer programm brauche hilfe
-
Hallo,
mein cueue ringpuffer ha in der ausgabe() funktion einen fehler. mal werden zahlen ausgegebn die gar nicht in den puffer reingeschrieben wurden oder es werden zu wenig zahlen ausgegeben. und bei den case anweisungen sind die if afragen fehlerhaft, denn siegeben nicht immer asu wann der puffer voll oder leer ist.
#include <stdio.h> # define rp 11 char menue(void); int einlesen(int i, int vekt[]); int *entfernen(int i, int vekt[], int *zeig); void ausgeben(int i, int vekt[], int *zeig, int b); int main(){ int i=0, j=0, i1, n=0, b=0; int ivekt[rp], *izeig; char ch; izeig=&ivekt[rp]; while(ch!='d'){ ch=menue(); switch(ch){ case'a': if (izeig==&ivekt[0]||izeig-1==&ivekt[i]){ printf("Der Ringpuffer ist voll!\n"); } else{ i=einlesen(i,ivekt); } break; case'b': if (0-30>=n){ printf("Der Ringpuffer ist leer!\n"); } else{ izeig=entfernen(i,ivekt,izeig); } b++; break; case'c': if (-30>=n){ printf("Ringpuffer ist leer!\n"); } else{ ausgeben(i,ivekt,izeig,b); } break; case'd': break; default: printf("Bitte eine gueltige Eingabe tippen!\n\n"); break; } fflush(stdin); } } char menue(void){ char ch1; int i1; printf("\nWas moechten Sie tun?\n"); printf("a. Zahl einlesen.\n"); printf("b. Zahl entfernen und ausgeben.\n"); printf("c. Ringpuffer ausgeben.\n"); printf("d. Ende\n"); i1=scanf("%c", &ch1); return ch1; } int einlesen(int i, int vekt[]){ int i1; int zahl; do{ printf("Bitte eine reele Zahl eingeben!\n"); i1=scanf("%d",&zahl); if (0==i1){ i1=0; printf("Es duerfen nur reele Zahlen eingegeben werden!\n"); } fflush(stdin); } while(0==i1); vekt[i]=zahl; if (rp==i){ i=0; } i++; return i; } int *entfernen(int i, int vekt[], int *zeig){ if (zeig==&vekt[rp]){ printf("\n%d.\n", vekt[0]); zeig=vekt; } else{ zeig++; printf("\n%d\n",*zeig); } return zeig; } void ausgeben(int i, int vekt[], int *zeig, int b){ int j=0,z; if (zeig==&vekt[rp]){ for (j=0; j<=i-1; j++) printf("Puffer %d. : %d. \n", j+1, vekt[j]); } else { z=(b%rp); if (z<=i){ for (z; (z<=i-1); z++, j++){ printf("Puffer %d. : %d. \n", j+1, vekt[z]); } } else for (z; (z<=rp); z++, j++){ printf("Puffer %d. : %d. \n", j+1, vekt[z]); } if (z==rp&&rp!=i){ for (z=0; (z<i); z++){ printf("Puffer %d. : %d. \n", j+1, vekt[j]); } } } }
-
ich habe jetzt die fehler selber rausbekommen
. falls es jemanden interessiert hier noch mal das fertig programm, ist zwar nicht am schönsten programmiert, kann bestimmt kürzer gemacht werden, aber es funktioniert.
Ein Ringpuffer wo max. 10 werte eingegeben werden (werte eingabe variabel da als praeposition festgelegt), wenn der puffer voll ist wird entsprechend eine fehlermeldung ausgegeben und genau so wenn er leer ist. Man kann selber die werte hinzufügen, entfernen und ausgeben.
#include <stdio.h> /*Ein- / Ausgabe-Bibliothek*/ # define rp 10 /*Praeposition fuer Ringpuffergroesse festlegen*/ /*Programm zur Realisierung eines Ringpufers*/ /*Programmautor: Fichtner Vitali, Erstellungsdatum: 16.05.07*/ char menue(void); /*Prototyp fuer Menueausgabe und Menue einlesen*/ int einlesen(int i, int vekt[]); /*Prototyp fuer Werte einlesen Funktion*/ int *entfernen(int i, int vekt[], int *zeig); /*Prototyp fuer Werte entfernen*/ void ausgeben(int i, int vekt[], int *zeig, int b); /*Prototyp fuer Ringpuffer ausgeben*/ int main(){ int i=0, j=0, i1, n=0, b=0; /* */ int ivekt[rp], *izeig; /*Deklarationsteil*/ char ch; /* */ izeig=&ivekt[rp]; /*Verbindung zwischen Zeiger ud Vektor*/ while(ch!='d'){ /*Menue Schleife fuer Case-Anweisung*/ ch=menue(); switch(ch){ case'a': /*Menue naechste Zahl einlesen*/ if (izeig==&ivekt[i]){ /*Puffer voll Fehlermeldung*/ printf("Der Ringpuffer ist voll!\n"); } else{ i=einlesen(i,ivekt); /*Werte einlesen Funktionsaufruf*/ } break; case'b': /*Menue erste zu entnehmende Zahl entfernen*/ if (izeig+1==&ivekt[i]){ printf("Der Ringpuffer ist leer!\n"); } else{ izeig=entfernen(i,ivekt,izeig); /*Wert entfernen und diesen ausgeben Funktion*/ } b++; /*Zeiger Zähler*/ break; case'c': /*Menue Ringpuffer ausgebn*/ if (izeig+1==&ivekt[i]||(izeig==&ivekt[rp])&&(&ivekt[0]==&ivekt[i])){ printf("Ringpuffer ist leer!\n"); } else{ ausgeben(i,ivekt,izeig,b); /*Ringpuffer ausgebn Funktion*/ } break; case'd': /* */ /*Menuepunkt Ende */ /*Beenden der Case Anweisung;*/ break; /* */ default: /*Menuepunkt falls Falsche Eingabe*/ /*Eingabe beim Menue Punkt;*/ printf("Bitte eine gueltige Eingabe tippen!\n\n"); break; } fflush(stdin); } } char menue(void){ /*Menue Ausgabe-*/ char ch1; /*und Auswahl einlesen*/ int i1; printf("\nWas moechten Sie tun?\n"); printf("a. Zahl einlesen.\n"); printf("b. Zahl entfernen und ausgeben.\n"); printf("c. Stack ausgeben.\n"); printf("d. Ende\n"); i1=scanf("%c", &ch1); return ch1; } int einlesen(int i, int vekt[]){ /*Funktion zum einlesen*/ int i1; /*der Ringpufferwerte*/ int zahl; do{ printf("Bitte eine reele Zahl eingeben!\n"); i1=scanf("%d",&zahl); if (0==i1){ i1=0; printf("Es duerfen nur reele Zahlen eingegeben werden!\n"); } fflush(stdin); } while(0==i1); /*Schleife bei Fehleingabe*/ vekt[i]=zahl; /*Ringpuffer mit jeweiligen Zahl befuellen*/ if (rp==i){ /*Wenn Ringpuffergroesse "rp"erreicht ist*/ i=0; /*dann Puffer auf anfang setzten*/ } else{ i++; } return i; } int *entfernen(int i, int vekt[], int *zeig){ /*Funktion zum entfernen der Ringpufferwere*/ if (zeig==&vekt[rp]){ printf("\n%d.\n", vekt[0]); zeig=vekt; } else{ zeig++; printf("\n%d\n",*zeig); } return zeig; } void ausgeben(int i, int vekt[], int *zeig, int b){ /*Funktion zum-*/ int j=0,z; /*Ausgeben des Ringpufers*/ if (zeig==&vekt[rp]){ for (j=0; j<=i-1; j++) printf("Puffer %d. : %d. \n", j+1, vekt[j]); } else { z=(b%rp); if (z<=i){ for (z; (z<=i-1); z++, j++){ printf("Puffer %d. : %d. \n", j+1, vekt[z]); } } else{ for (z; (z<=rp); z++, j++){ printf("Puffer %d. : %d. \n", j+1, vekt[z]); } for (z=0; (z<i); z++){ printf("Puffer %d. : %d. \n", j+1, vekt[z]); } } } }