Brauche dringend HILFE!!!
-
unsigned short liefertermin[3]; // VERTRAG.DAT // D M Y // 13 00 04 00 5B 00 // -> 19.04.91
Y ist zweistellig!
-
fassungsloser schrieb:
Y ist zweistellig!
Vielleicht kommt der Prof aus der Cobol-Ecke?
-
Vielleicht ist es auch ein Format, wie es noobLolo bereits vermutet hat.
Im Grunde reicht ja eintime_t liefertermin;
aus.
-
Hallo Leute. Hab heut erfahren das ich die Aufgabe bis Donnerstag abzugeben hab. Kann mir bitte jemand sagen wie ich Aufgabe 2 und 3 hinbekomme???
Ich bitte euch Jungs und Mädels.....
Bin am verzweifeln.
-
also ich kenns ja nur so das man immer mehr zeit hat und nicht weniger aber jede schule ist da ja ein bischen anders
also wo waren wir
aja beim sortieren wenn du mir die sortier function sagen kannst mit der du nach dem feld ->vertrnr sortieren kannst bekommst die restlichen umsonst, falls du nicht weißt wie das geht du hast 2 beispiele auf den letzten 1-2 seiten
-
- die Namen aller Lieferanten bei denen bis zu einem, vom Nutzer einzugebenden
Termin keine Abweichungen zwischen Vertrags- und Liefermenge auftraten.also die aufgabe bin ich so angegangen...
void getEachEntrySmallerThanDate(struct vertrag dataCache[],int length){ struct vertrag dateData; setSortModeAsc(); sortBy(dataCache,length,compareLieferant); //plotEntrys(dataCache,length); readDate(&dateData); plotFooter(); int i=0; while(i<length){ if(compareDate(&dataCache[i++],&dateData)<0){ if(compareLiefermengeVsVertragsmenge(&dataCache[i-1])){ plotEntryRow(dataCache[i-1],i-1); //skip each entry with the same company name while(i<length-1 && compareLieferant(&dataCache[i-1],&dataCache[i])==0) i++; } } } }
-
also wie auch immer ich poste jetzt mal meine version, kannst sie gerne kopieren, aber nützen wird es dir nicht viel... nunja das mußt du dann selbst entscheiden,
auch kommen da bei der ausgabe immer ne ganze menge � raus aber nunja das eher ein zeichensatzproblem evtl. muß man das decodieren und die printf() sind auch unsauber aber naja#include <stdio.h> #include <stdlib.h> #include <string.h> //#include <curses.h> /** * definitionen */ #define LOLO_HR "-------------------------------------------------------------"\ "-------------------------------------------------------------" /** * super globals */ int global_sortModeAscDesc; /** * structures */ struct vertrag{ char vertrnr[7]; char art[21]; char liiferant[21]; unsigned short vertagsmenge; unsigned short liefertermin[3]; unsigned short liefermenge; }__attribute__((packed))vertrag; void clearStdIn(){ char buffer[1024]; fgets(buffer,1024,stdin); } int getIntFromStdIn(){ int cache; scanf("%ud",&cache); clearStdIn(); return cache; } int getCharFromStdIn(){ int ret = getchar(); clearStdIn(); return ret; } void initTerminalScreen(){ //initscr(); } void clearTerminalScreen(){ //refresh(); #define LINUX #ifdef LINUX system("clear"); #else system("cls"); #endif } void exitTerminalScreen(){ //endwin(); } void plotHeader(char *s){ printf( " .-----------------------------------------------\n" " | %s |\n" LOLO_HR "\n",s ); } void plotFooter(){ printf( LOLO_HR "\n" ); } void plotMenu(){ printf( "\n" "\n .------------------------------------------------------. .---------------." "\n | Menue :: drücken sie die taste in den [ ] klammern | | [a]sc [d]esc |" "\n |" LOLO_HR "\n | [p] plot table" "\n | [b] für alle Hauptlieferanten mit Vertragsmenge > 500" "\n | [x] alle Angaben zu Verträgen mit einem Lieferanten" "\n | [f] die Namen aller Lieferanten bei denen bis zu einem Termin keine" "\n | Abweichungen zwischen Vertrags- und Liefermenge auftraten." "\n | [q] QUIT" "\n |" LOLO_HR "\n | Ihre Auswahl: " ); } void setSortModeAsc(){ global_sortModeAscDesc = 1; } void setSortModeDesc(){ global_sortModeAscDesc = 0; } int extendedStringCmp(char *a,char *b){ int len = strlen(a)-strlen(b); if(len==0){ return strcmp(a,b); } return len; } int compareLiefermengeVsVertragsmenge(void *a){ struct vertrag *ax = a; return ax->liefermenge-ax->vertagsmenge; } int compareLiefermenge(void *a,void *b){ struct vertrag *ax = a; struct vertrag *bx = b; if(global_sortModeAscDesc) return ax->liefermenge-bx->liefermenge; else return -(ax->liefermenge-bx->liefermenge); } int compareVertragsmenge(void *a,void *b){ struct vertrag *ax = a; struct vertrag *bx = b; if(global_sortModeAscDesc) return ax->vertagsmenge-bx->vertagsmenge; else return -(ax->vertagsmenge-bx->vertagsmenge); } int compareVertragsnummer(void *a,void *b){ struct vertrag *ax = a; struct vertrag *bx = b; if(global_sortModeAscDesc) return extendedStringCmp(ax->vertrnr,bx->vertrnr); else return -extendedStringCmp(ax->vertrnr,bx->vertrnr); } int compareLieferant(void *a,void *b){ struct vertrag *ax = a; struct vertrag *bx = b; if(global_sortModeAscDesc) return extendedStringCmp(ax->liiferant,bx->liiferant); else return -extendedStringCmp(ax->liiferant,bx->liiferant); } int compareArtikel(void *a,void *b){ struct vertrag *ax = a; struct vertrag *bx = b; if(global_sortModeAscDesc) return extendedStringCmp(ax->art,bx->art); else return -extendedStringCmp(ax->art,bx->art); } int compareDate(void *a,void *b){ struct vertrag *ax = a; struct vertrag *bx = b; int ret = 0; if(ax->liefertermin[2] > bx->liefertermin[2]) ret = 1; if(ax->liefertermin[2] < bx->liefertermin[2]) ret = -1; if(ax->liefertermin[1] > bx->liefertermin[1]) ret = 1; if(ax->liefertermin[1] < bx->liefertermin[1]) ret = -1; if(ax->liefertermin[0] > bx->liefertermin[0]) ret = 1; if(ax->liefertermin[0] < bx->liefertermin[0]) ret = -1; if(global_sortModeAscDesc) return ret; else return -ret; } void sortBy(struct vertrag dataCache[],int l,int (*cmp)(void *,void *)){ qsort(dataCache,l,sizeof(struct vertrag),(__compar_fn_t)cmp); } int readEntrys(char *fileName,struct vertrag dataCache[],int maxLength){ int i=0; FILE *Dateiptr = fopen(fileName,"rb"); if(Dateiptr == NULL) printf("Beim oeffnen der Datei %s ist ein Fehler aufgetreten.\n", fileName); else while(maxLength-- && fread(&dataCache[i], sizeof(struct vertrag),1, Dateiptr) == 1) i++; return i; } void plotEntryRow(struct vertrag dataCache,int i){ printf( "%12d\t" "%7s\t" "%21s\t" "%21s\t" "%12d\t" "%12d\t" "%2d." "%2d." "%4d" "\n" ,i ,dataCache.vertrnr ,dataCache.art ,dataCache.liiferant ,dataCache.vertagsmenge ,dataCache.liefermenge ,dataCache.liefertermin[0] ,dataCache.liefertermin[1] ,dataCache.liefertermin[2] ); } void plotEntrys(struct vertrag dataCache[],int length){ int i=0; printf( "%12s\t" "%7s\t" "%21s\t" "%21s\t" "%12s\t" "%12s\t" "%10s\t" "\n" LOLO_HR "\n" ,"nr." ,"[v]nr." ,"a[r]tikel" ,"l[i]eferant" ,"v[e]rtragsm." ,"[l]ieferm." ,"l[t]ermin." ); while(i<length){ plotEntryRow(dataCache[i],i); i++; } } void readDate(struct vertrag *dataCache){ int cache; do{ printf("enter day 1-31: "); cache = getIntFromStdIn(); }while(cache<1||cache>31); dataCache->liefertermin[0] = (unsigned short)cache; do{ printf("enter month 1-12: "); cache = getIntFromStdIn(); }while(cache<1||cache>12); dataCache->liefertermin[1] = (unsigned short)cache; do{ printf("enter year 1-99: "); cache = getIntFromStdIn(); }while(cache<1||cache>99); dataCache->liefertermin[2] = (unsigned short)cache; } void getEachEntrySmallerThanDate(struct vertrag dataCache[],int length){ struct vertrag dateData; setSortModeAsc(); sortBy(dataCache,length,compareLieferant); //plotEntrys(dataCache,length); readDate(&dateData); plotFooter(); int i=0; while(i<length){ if(compareDate(&dataCache[i++],&dateData)<0){ if(compareLiefermengeVsVertragsmenge(&dataCache[i-1])){ plotEntryRow(dataCache[i-1],i-1); //skip each entry with the same company name while(i<length-1 && compareLieferant(&dataCache[i-1],&dataCache[i])==0) i++; } } } } void getEachBigOne(struct vertrag dataCache[],int length){ setSortModeAsc(); sortBy(dataCache,length,compareLieferant); int i=0; while(i<length){ if(dataCache[i++].vertagsmenge > 500){ plotEntryRow(dataCache[i-1],i-1); //skip each entry with the same company name while(i<length-1 && compareLieferant(&dataCache[i-1],&dataCache[i])==0) i++; } } } void getListOf(struct vertrag dataCache[],int length){ setSortModeAsc(); sortBy(dataCache,length,compareLieferant); int i=0; int number=0; while(i<length){ //plotEntryRow(&dataCache[i-1]); printf("%7d\t%s\n",i,dataCache[i].liiferant); while(i<length-1 && compareLieferant(&dataCache[i],&dataCache[i+1])==0)i++; i++; } plotFooter(); printf(" enter number: "); number = getIntFromStdIn(); struct vertrag nameData; nameData.liefermenge = 0; nameData.vertagsmenge = 0; memcpy(nameData.liiferant,dataCache[number].liiferant,sizeof(nameData.liiferant)); clearTerminalScreen(); plotHeader(nameData.liiferant); sortBy(dataCache,length,compareArtikel); i=0; int flag=0; while(i<length){ if(compareLieferant(&nameData,&dataCache[i])==0){ while(i<length-1 && compareArtikel(&dataCache[i],&dataCache[i+1])==0){ if(flag==0){ strcpy(nameData.art,dataCache[i].art); strcpy(nameData.liiferant,dataCache[i].liiferant); strcpy(nameData.vertrnr,dataCache[i].vertrnr); nameData.liefertermin[0] = 0; nameData.liefertermin[1] = 0; nameData.liefertermin[2] = 0; } nameData.liefermenge+=dataCache[i].liefermenge; nameData.vertagsmenge+=dataCache[i].vertagsmenge; flag=1; i++; } if(flag){ i--; flag=0; nameData.liefermenge+=dataCache[i].liefermenge; nameData.vertagsmenge+=dataCache[i].vertagsmenge; plotEntryRow(nameData,0); i++; }else plotEntryRow(dataCache[i],i); } i++; } } int getFileSize(char *fileName){ FILE *fp = fopen(fileName,"rb"); if(fp==NULL){ printf("Beim oeffnen der Datei %s ist ein Fehler aufgetreten.\n", fileName); return -1; } return fseek(fp,0,SEEK_END)?-1:ftell(fp); } void *getArrayForFile(char *fileName,int *bufferSize,int typeSize){ int sizeCache = getFileSize(fileName); if(sizeCache==-1) return NULL; *bufferSize = sizeCache/typeSize; return malloc(sizeCache); } int main(int argc, char *argv[]){ initTerminalScreen(); int dataCacheLength; char *fileName = "/home/matthias/Desktop/VERTRAG.DAT"; struct vertrag *dataCache; dataCache = getArrayForFile(fileName,&dataCacheLength,sizeof(struct vertrag)); dataCacheLength = readEntrys(fileName,dataCache,1024); int (*activeSort)(void *,void *) = compareVertragsnummer; while(1){ LABEL_SKIP_PLOT: plotMenu(); switch(getCharFromStdIn()){ case 'p': case 'P': setSortModeAsc(); goto LABEL_SORT_TABLE; case 'a': case 'A': setSortModeAsc(); goto LABEL_SORT_TABLE; case 'd': case 'D': setSortModeDesc(); goto LABEL_SORT_TABLE; case 'r': case 'R': activeSort = compareArtikel; goto LABEL_SORT_TABLE; case 'l': case 'L': activeSort = compareLiefermenge; goto LABEL_SORT_TABLE; case 'e': case 'E': activeSort = compareVertragsmenge; goto LABEL_SORT_TABLE; case 'v': case 'V': activeSort = compareVertragsnummer; goto LABEL_SORT_TABLE; case 'i': case 'I': activeSort = compareLieferant; goto LABEL_SORT_TABLE; case 't': case 'T': activeSort = compareDate; goto LABEL_SORT_TABLE; case 'f': case 'F': clearTerminalScreen(); plotHeader("die Namen aller Lieferanten bei denen bis zu einem Termin keine ..."); getEachEntrySmallerThanDate(dataCache,dataCacheLength); plotFooter(); goto LABEL_SKIP_PLOT; case 'b': case 'B': clearTerminalScreen(); plotHeader("alle Hauptlieferanten mit Vertragsmenge > 500"); getEachBigOne(dataCache,dataCacheLength); plotFooter(); goto LABEL_SKIP_PLOT; case 'x': case 'X': clearTerminalScreen(); plotHeader("alle Angaben zu Verträgen mit einem Lieferanten"); getListOf(dataCache,dataCacheLength); plotFooter(); goto LABEL_SKIP_PLOT; case 'q': case 'Q': goto LABEL_QUIT_APP; } LABEL_SORT_TABLE: clearTerminalScreen(); sortBy(dataCache,dataCacheLength,activeSort); plotEntrys(dataCache,dataCacheLength); } LABEL_QUIT_APP: exitTerminalScreen(); return 0; };
na dann mal viel spaß damit
-
Du verlässt dich ganz schön blind darauf, das die Standardfunktionen fruchten. Die Anzahl der Strukturen ist immer noch hartcodiert, aber das soll wohl nur ne Demo sein, ne
-
Hallo noobLolo.
Danke erstmal dafür. Werd mir das mal kopieren und sehen wie das funktioniert, dann versuch ich es zu verstehen
und dann evtl. etwas davon bei mir einzubauen.
Hoffentlich steige ich da durch......Dank dir nochmal Vielmals!!!!
-
ja denke das war so in der richtung gedacht
int main(void){ ... dataCache = getArrayForFile(fileName,&dataCacheLength,sizeof(struct vertrag)); if(dataCache==NULL) return 1; dataCacheLength = readEntrys(fileName,dataCache,dataCacheLength); ... }
statt
int main(void){ ... dataCache = getArrayForFile(fileName,&dataCacheLength,sizeof(struct vertrag)); dataCacheLength = readEntrys(fileName,dataCache,1024); ... }
und das ist natürlich mist und sollte geändert werden wußte aber nicht wie man es auf windows macht und die linux befehle wollten auch nicht so wie ich, wenn ich das noch auf die reihe bring post ich das noch
void clearTerminalScreen(){ //refresh(); #ifndef LINUX system("cls"); #else system("clear"); #endif }
Big Brother schrieb:
Du verlässt dich ganz schön blind darauf, das die Standardfunktionen fruchten.
welche meinst du? hab eigentlich schon versucht so gut wie möglich zu testen
-
Na, wenn z.B. dataChache NULL ist, machts beim Einlesen *peng* oder sehe ich das falsch. Das fängt man vorteilhafterweise ab, bevor man die Variable an eine Funktion weitergibt.
Was willst du eigentlich hiermit bezwecken:return fseek(fp,0,SEEK_END)?-1:ftell(fp);
Wenn ftell -1 liefert müsste das Programm wohl oder übel abbrechen, weil nix einzulesen geht ... ftell kann auch nen negativen Wert liefern, wenn die Datei zu groß ist ... ftell kann auch 0 liefern, wenn die Datei leer ist, das
Programm gibt dann mit einem dataChache der Größe 0 nicht viel her...
- an der Stelle wäre also noch einiges zu überdenken.Naja, aber ich will mich jetzt auch nicht allzu sehr in deinen Code reinsteigern