locochris94 Δημοσ. 22 Δεκεμβρίου 2012 Δημοσ. 22 Δεκεμβρίου 2012 Λοιπον εχω την παρακατω ασκηση και εχω γραψει δυο κωδικες αλλα κανενας δεν μου τρεχει οπως πρεπει . Μπορει καποιος να βοηθησει να εντοπισω το λαθος , κατα προτιμηση στον 1ο κωδικα ? Η εκφωνηση : Γράψτε ένα πρόγραμμα που παίρνει 2 παραμέτρους από τον χρηστη: 1. το όνομα ενός αρχείου κειμένου, και 2. τον αριθμό Ν των χαρακτήρων ανά γραμμή. Το πρόγραμμα πρέπει να ανοίγει το δεδομένο αρχείο, να διαβάζει το κείμενο, και να το τυπώ- νει στην κύρια έξοδο στοιχισμένο σε γραμμές μήκους Ν. Η πρώτη λέξη κάθε γραμμής πρέπει να αρχίζει στο πρώτο γράμμα της γραμμής, και η τελευταία λέξη να τελειώνει στο τελευταίο γράμμα της γραμμής, δηλαδή να μην υπάρχουν κενά πριν την πρώτη ή μετά την τελευταία λέξη κάθε γραμμής. Για κάθε λέξη της εισόδου, το πρόγραμμα πρέπει να υπολογίζει αν χωράει η λέξη στην τρέχουσα γραμμή και αν ναι, να την προσθέτει. Αν η επόμενη λέξη δεν χωράει στην τρέχουσα γραμμή πρέπει να μπεί σε νέα γραμμή. Τότε το πρόγραμμα πρέπει να “γεμίσει” την προηγούμενη με όσα κενά χρειάζονται ανάμεσα στις λέξεις για να πάρει ακριβώς Ν χαρα- κτήρες, και θα την τυπώνει στην κύρια έξοδο. Τα κενά κάθε γραμμής πρέπει να είναι όσο το δυνατόν ισοκατανεμημένα μεταξύ των λέξεων. Κατ’ εξαίρεση, η τελευταία σειρά δεν πρέπει να είναι στοιχισμένη. 1ος κωδικας: #include <stdio.h> #include <stdlib.h> int main() { int i,N,kena,metaf,j; int flag=0; int k=0; scanf("%d", &N); char *a; a=(char *)malloc((N+1)*sizeof(char)); FILE *infile; infile=fopen("text.txt","r"); printf("1o vima\n\n\n"); while(flag==0){ printf("2o vima"); i=k; while (i<=N){ a[i]=getc(infile); if (a[i]=='\n'){ a[i]=' '; } i++; } for (i=k; (i<=N && flag!=1); i++){ if (a[i]==-1){ flag=1; } } printf("3o vima\n"); if (flag==0){ if (a[N-1]== ' '){ kena++; printf("4o vima\n"); }else{ printf("5o vima\n"); if (a[N]!=' '){ kena++; for (i=1; i<=N; i++){ if (a[N-1-i]==' '){ kena++; break; }else{ kena++; } } } metaf=kena; for (i=0; i<+(N-1-metaf); i++){ printf("%c", a[i]); if(a[i]==' ' && kena>0){ printf(" "); kena--; } } printf("\n"); } }else{ for (i=0; i<=N; i++){ printf("%c", a[i]); } } j=0; if (a[N-metaf]!= ' '){ a[j]=a[N-metaf]; j++; } for (i=1; i<=metaf; i++){ a[j]=a[N-metaf+i]; j++; } for (i=(j+1); i<=N; i++){ a[i]=' '; } k=j+1; if (k=N+1){ k=0; } } return 0; } 2ος κωδικας : #include <stdio.h> #include <string.h> /* strlen, strcpy */ #include <stdlib.h> /* atoi */ #include <ctype.h> /* isdigit */ void printText( char *, int ); void swap( char *, int, int, int ); void swap( char *str, int position, int spaces, int size ) { int i; if( spaces == 0 ) return; swap( str, position, spaces-1, size ); for(i = size-1; i > position; i--) { str[i] = str[i-1]; } str[position+1] = ' '; /* printf("Line stin swap: %s\n", str); */ } void printText(char *f, int lsize) { int i, j, n, y, wordLen, spaceCounter; FILE *fp; char word[lsize]; char line[lsize]; if( (fp = fopen(f, "r")) == NULL ) /* anoigma arxeiou */ { printf("couldnt open %s file\n", f); return; } i=0; //printf("prin tin while\n"); while( ( n = fscanf(fp, "%s", word) ) != EOF ) /* Diavaze grammes apo to arxeio mexri to EOF */ { if( i >= lsize ) { /* case opou i grammi "line" exei ftasei N xarakthres */ printf("%s\n", line); i=0; } wordLen = strlen(word); /* to megethos tis grammhs, an to wordLen 3epernaei tous N xarakthres, valto stin apo katw grammh, * afksise ta kena metaxu twn lexewn */ if( wordLen > lsize-i ) { spaceCounter=0; for( j=0; j < i; j++ ) { if( line[j] == ' ' ) spaceCounter++; } if(spaceCounter != 0) { n = (lsize-i)/spaceCounter; /* n = o ari8mos twn kenwn pou antistoixoun se ka8e diastima gia na exei to line mhkos N xarakthres */ y = (lsize-i)%spaceCounter; } /* printf("break2 kai n einai %d\n", n); */ for( j = 0; j < i; j++ ) { if( line[j] == ' ' ) { /* printf("Line prin tin swap me n: %s\n", line); */ swap(line, j, n, lsize); // metatopise tous xarakthres tou line apo to j mexri to telos line j += n; i += n; } } j=0; for(; y > 0; ) { if( line[j] == ' ' ) { /* printf("Line prin tin swap me y: %s\n", line); */ swap(line, j, 1, lsize); /* metatopise tous xarakthres tou line apo to j mexri to telos line */ y--; j += 2; } j++; } /* printf("Line Stin printText: %s\n", line); */ printf("%s\n", line); i=0; } for(j = 0; j < wordLen; j++) { line[i++] = word[j]; } line[i++] = ' '; } memset(line+i, '\0', lsize-i); printf(" %s\n", line ); } int main(int argc, char *argv[]) { int i, text_size; char *filename; if (argc < 3) { printf("Parakalw dwste tis swstes parametrous gia to programma\n"); return 0; } for(i=0; i<strlen(argv[2]); i++) { if( !isdigit( argv[2][i] )) { printf("La8os stin parametro N\n"); return 0; } } filename = argv[1]; text_size = atoi( argv[2] ); printText(filename, text_size); return 0; }
defacer Δημοσ. 22 Δεκεμβρίου 2012 Δημοσ. 22 Δεκεμβρίου 2012 Όπως έχεις διαπιστώσει και συ, ο κώδικας που έχεις στα χέρια σου δεν είναι πλέον συντηρήσιμος (βασικά δεν διαβάζεται). Θα σου πρότεινα λοιπόν να ξεκινήσεις γράφοντας σε ένα χαρτί τον αλγόριθμο που θα ακολουθήσεις μέχρι να βρεις κάποιο τρόπο να τον γράψεις που θα μπορείς να το διαβάσεις μετά ως τρίτος και να καταλάβεις τι λέει. Μετά μετέφερέ τον σε κώδικα.
locochris94 Δημοσ. 23 Δεκεμβρίου 2012 Μέλος Δημοσ. 23 Δεκεμβρίου 2012 Λοιπον οκ νομιζω πως εχω εντοπισει το λαθος αλλα δεν ξερω πως θα το διορθωσω . Αυτο που κανω ειναι να διαβαζω εναν εναν τον καθε χαρακτηρα απο το αρχειο και να το αποθηκευω σε ενα πινακα α[Ν] οπου Ν οι χαρακτηρες ανα σειρα που θελει ο χρηστης , απλα δεν ξερω πως θα το τελειωσω δηλαδη ποιος ειναι ο χαρακτηρας τελους αρχειου .
bird Δημοσ. 23 Δεκεμβρίου 2012 Δημοσ. 23 Δεκεμβρίου 2012 Ο Χαρακτήρας για το τέλος αρχείου είναι ο EOF (End Of File o οποίος έχει τιμή -1)
locochris94 Δημοσ. 23 Δεκεμβρίου 2012 Μέλος Δημοσ. 23 Δεκεμβρίου 2012 και δηλαδη μεσα σε αυτον τον πινακα χαρακτηρων που εχω κανει , ο τελευταιος χαρακτηρας του αρχειου πως θα υπαρχει?
bird Δημοσ. 23 Δεκεμβρίου 2012 Δημοσ. 23 Δεκεμβρίου 2012 Όταν διαβάσεις αυτόν τον χαρακτήρα από το αρχείο σημαίνει ότι το αρχείο έχει τελειώσει όπότε απλά τυπώνεις τη γραμμή σου μέχρι εκεί που έχεις φτάσει. Ο χαρακτήρας μπορεί να αποθηκευθεί στον πίνακά σου όπως όλοι οι άλλοι χαρακτήρες. Με μία πρόχειρη ματιά βλέπω ότι κάνεις τον έλεγχο για το EOF εδώ: for (i=k; (i<=N && flag!=1); i++){ if (a[i]==-1){ flag=1; } (το -1 είναι το EOF)
locochris94 Δημοσ. 23 Δεκεμβρίου 2012 Μέλος Δημοσ. 23 Δεκεμβρίου 2012 Όταν διαβάσεις αυτόν τον χαρακτήρα από το αρχείο σημαίνει ότι το αρχείο έχει τελειώσει όπότε απλά τυπώνεις τη γραμμή σου μέχρι εκεί που έχεις φτάσει. Ο χαρακτήρας μπορεί να αποθηκευθεί στον πίνακά σου όπως όλοι οι άλλοι χαρακτήρες. Με μία πρόχειρη ματιά βλέπω ότι κάνεις τον έλεγχο για το EOF εδώ: for (i=k; (i<=N && flag!=1); i++){ if (a[i]==-1){ flag=1; } (το -1 είναι το EOF) Δηλαδη αυτος ο ελεγχος που κανω ειναι σωστος , ? Γιατι ο πινακας α ειναι char
bird Δημοσ. 23 Δεκεμβρίου 2012 Δημοσ. 23 Δεκεμβρίου 2012 Δηλαδη αυτος ο ελεγχος που κανω ειναι σωστος , ? Γιατι ο πινακας α ειναι char Όλοι οι χαρακτήρες στην ουσία είναι integers. Αν σου χτυπάει άσχημα στο μάτι το a == -1 βάλε αντί για -1 EOF a ==EOF edit: Αν και θα μπορούσες να κάνεις τον πίνακα int εφόσον η getc() επιστρέφει int...
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα