Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Λοιπον εχω την παρακατω ασκηση και εχω γραψει δυο κωδικες αλλα κανενας δεν μου τρεχει οπως πρεπει  . Μπορει καποιος να βοηθησει να εντοπισω το λαθος , κατα προτιμηση στον 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;
}
	
	

 

 

Δημοσ.

Όπως έχεις διαπιστώσει και συ, ο κώδικας που έχεις στα χέρια σου δεν είναι πλέον συντηρήσιμος (βασικά δεν διαβάζεται). Θα σου πρότεινα λοιπόν να ξεκινήσεις γράφοντας σε ένα χαρτί τον αλγόριθμο που θα ακολουθήσεις μέχρι να βρεις κάποιο τρόπο να τον γράψεις που θα μπορείς να το διαβάσεις μετά ως τρίτος και να καταλάβεις τι λέει. Μετά μετέφερέ τον σε κώδικα.

Δημοσ.

Λοιπον οκ νομιζω πως εχω εντοπισει το λαθος αλλα δεν ξερω πως θα το διορθωσω . Αυτο που κανω ειναι να διαβαζω εναν εναν τον καθε χαρακτηρα απο το αρχειο και να το αποθηκευω σε ενα πινακα α[Ν] οπου Ν οι χαρακτηρες ανα σειρα που θελει ο χρηστης , απλα δεν ξερω πως θα το τελειωσω δηλαδη ποιος  ειναι ο χαρακτηρας τελους αρχειου .

Δημοσ.

Ο Χαρακτήρας για το τέλος αρχείου είναι ο EOF (End Of File o οποίος έχει τιμή -1)

Δημοσ.

Όταν διαβάσεις αυτόν τον χαρακτήρα από το αρχείο σημαίνει ότι το αρχείο έχει τελειώσει όπότε απλά τυπώνεις τη γραμμή σου μέχρι εκεί που έχεις φτάσει. Ο χαρακτήρας μπορεί να αποθηκευθεί στον πίνακά σου όπως όλοι οι άλλοι χαρακτήρες.

 

Με μία πρόχειρη ματιά βλέπω ότι κάνεις τον έλεγχο για το EOF εδώ:

for (i=k; (i<=N && flag!=1); i++){
            if (a[i]==-1){
                flag=1;
            }

(το -1 είναι το EOF)

Δημοσ.
Όταν διαβάσεις αυτόν τον χαρακτήρα από το αρχείο σημαίνει ότι το αρχείο έχει τελειώσει όπότε απλά τυπώνεις τη γραμμή σου μέχρι εκεί που έχεις φτάσει. Ο χαρακτήρας μπορεί να αποθηκευθεί στον πίνακά σου όπως όλοι οι άλλοι χαρακτήρες.

 

Με μία πρόχειρη ματιά βλέπω ότι κάνεις τον έλεγχο για το EOF εδώ:

for (i=k; (i<=N && flag!=1); i++){
            if (a[i]==-1){
                flag=1;
            }

(το -1 είναι το EOF)

 

Δηλαδη αυτος ο ελεγχος που κανω ειναι σωστος , ? Γιατι ο πινακας α ειναι char 

Δημοσ.
Δηλαδη αυτος ο ελεγχος που κανω ειναι σωστος , ? Γιατι ο πινακας α ειναι char 

Όλοι οι χαρακτήρες στην ουσία είναι integers. Αν σου χτυπάει άσχημα στο μάτι το a == -1 βάλε αντί για -1 EOF

a ==EOF

 

edit:

Αν και θα μπορούσες να κάνεις τον πίνακα int εφόσον η getc() επιστρέφει int...

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...