Word wrapping method

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Kappa4
Δημοσιεύσεις: 9
Εγγραφή: 03 Δεκ 2014 23:56

Word wrapping method

Δημοσίευση από Kappa4 » 13 Δεκ 2014 00:21

Καλησπέρα.Θα ήθελα την βοήθεια σας στο εξής πρόβλημα που αντιμετωπίζω.Κάνω μια εργασία η οποία αφορά την άπληστη μέθοδο μορφοποίησης κειμένου.Η μέθοδος αυτή ουσιαστικά λέει ότι για δεδομένο μήκος γραμμής γίνεται μια όμορφη στοίχιση του κειμένου.Για παράδειγμα,αν το κείμενο είναι : "Το κείμενο αυτό χρησιμοποιείται ως παράδειγμα" και το δεδομένο μήκος γραμμής είναι 17 τότε το αποτέλεσμα με βάση την άπληστη μέθοδο είναι :
Το κείμενο αυτό
χρησιμοποιείται
ως παράδειγμα

Παραθέτω το κομμάτι κώδικα που έχω υλοποιήσει το οποίο δεν είναι στην τελική μορφή και ελπίζω να με βοηθήσετε στην επίλυση του προβλήματος αυτού.

Κώδικας: Επιλογή όλων

#include<stdio.h>
#define width 80
int main&#40;void&#41;
&#123;
	int ch,m;
	ch=getchar&#40;&#41;;
	while&#40;ch!=EOF&#41;
	&#123;
		while &#40; ch!= ' ' &#41;
		&#123;
				putchar&#40;ch&#41;;
				m=m+1;
				ch=getchar&#40;&#41;;
		&#125;
			if&#40;m>width&#41;
		&#123;
			printf&#40;"\n"&#41;;
			m=0;
		&#125;
		ch=getchar&#40;&#41;;
		
			
	&#125;
	return 0;
&#125;

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Word wrapping method

Δημοσίευση από gvre » 13 Δεκ 2014 14:57

Θα χρειαστεί να σπάσεις το κείμενο σε λέξεις, αντί σε χαρακτήρες. Δες τις fgets και strtok_r. Αν η λέξη που βρίσκεσαι χωράει στην τρέχουσα γραμμή, θα την τυπώνεις, μαζί με ένα κενό πριν από αυτή. Αν όχι, τυπώνεις μια νέα γραμμή και στη συνέχεια τη λέξη.

ps. Τις σταθερές γράφε τις με κεφαλαία.

Kappa4
Δημοσιεύσεις: 9
Εγγραφή: 03 Δεκ 2014 23:56

Word wrapping method

Δημοσίευση από Kappa4 » 13 Δεκ 2014 18:22

Το θέμα είναι ότι δεν γνωρίζουμε το δεδομένο μήκος γραμμής.Το παράδειγμα που έδωσα παραπάνω είναι απλά για να εξηγήσω τι είναι η άπληστη μέθοδος....

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Word wrapping method

Δημοσίευση από gvre » 13 Δεκ 2014 20:18

Δε γίνεται να μη γνωρίζεις το μήκος τής γραμμής. Τι ακριβώς ζητάει η εργασία;

Kappa4
Δημοσιεύσεις: 9
Εγγραφή: 03 Δεκ 2014 23:56

Word wrapping method

Δημοσίευση από Kappa4 » 14 Δεκ 2014 13:44

Η εργασία είναι στο παρακάτω link :
http://cgi.di.uoa.gr/~ip/iphw1415_3.pdf

Βέβαια ζητάει και άλλα πράγματα αλλά ας δούμε πρώτα την άπληστη μέθοδο.Ευχαριστώ πολύ για το ενδιαφέρον

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Word wrapping method

Δημοσίευση από gvre » 14 Δεκ 2014 14:26

Στην προτελευταία πρόταση της 1ης παραγράφου αναφέρει
"Επίσης, στο μορφοποιημένο κείμενο, καμία γραμμή δε μπορεί να εκτείνεται πέρα από ένα ορισμένο μήκος, έστω W, το οποίο είναι δεδομένο και θα δίνεται ως όρισμα στο πρόγραμμα που θα γράψετε."
Οπότε, το W θα το περνάς ως όρισμα στη γραμμή εντολών (δες τις ενδεικτικές εκτελέσεις).
πχ. για
./wrap_gre 33 < small.txt
το W είναι 33. Αν δε δοθεί όρισμα, η προεπιλεγμένη τιμή είναι 80.

Kappa4
Δημοσιεύσεις: 9
Εγγραφή: 03 Δεκ 2014 23:56

Word wrapping method

Δημοσίευση από Kappa4 » 14 Δεκ 2014 17:14

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

Κώδικας: Επιλογή όλων

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main &#40;int argc , char **argv&#41;
&#123;
	int i=0,capacity,ch,size=0,temp=0,metr=0;
	for&#40;i=0;i<argc;i++&#41;
	&#123;
		atoi&#40;argv&#91;i&#93;&#41;; 
		if&#40;i==1&#41;
		capacity=atoi&#40;argv&#91;i&#93;&#41;;
	&#125;
	printf&#40;"%d" , capacity&#41;;
	if&#40;capacity <=0&#41;
	&#123;
		printf&#40;"ERROR wrong input"&#41;;
		return 1;
	&#125;
	
	char *data_tmp = NULL;
	char *p = malloc&#40;capacity * sizeof&#40;char&#41;&#41;;
	if &#40;p == NULL&#41; 
	&#123; 
		printf&#40;"ERROR"&#41;;
		return 1;
	&#125;
		ch=getchar&#40;&#41;;
		while &#40;ch!= EOF&#41; 
		&#123;
    		if &#40;ch == '\0'&#41;
				printf&#40;"Encoding problem"&#41;;
				p&#91;size++&#93; = ch;
				metr=metr+1;
			if &#40;size == capacity&#41; 
			&#123;
        	capacity += capacity;
        	data_tmp = realloc&#40;p, capacity * sizeof&#40;char&#41;&#41;;
        	if &#40;data_tmp == NULL&#41;
				printf&#40;"Malloc problem"&#41;;
			&#125;
			 
			if &#40;metr==capacity&#41;
			printf&#40;" \n"&#41;;
			metr=0;
				
			
			
		&#125;
		
		return 0;
&#125;

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Word wrapping method

Δημοσίευση από gvre » 14 Δεκ 2014 18:11

Ξαναδιάβασε την εκφώνηση της άσκησης και κάνε βήμα-βήμα αυτά που ζητάει.

Kappa4
Δημοσιεύσεις: 9
Εγγραφή: 03 Δεκ 2014 23:56

Word wrapping method

Δημοσίευση από Kappa4 » 14 Δεκ 2014 18:38

Σίγουρα στο πρόγραμμα που έχω φτιάξει μέχρι τώρα δεν έχω υπολογίσει το κόστος αλλά δεν ξέρω,έχω παραλείψει κάτι?Η δυναμική δέσμευση μνήμης είναι σωστή έτσι δεν είναι?Θα το εκτιμούσα ιδιαιτέρως αν μου έδινες κάποιο tip για να προχωρήσω στην επίλυση της άσκησης.Ευχαριστώ

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Word wrapping method

Δημοσίευση από gvre » 15 Δεκ 2014 10:23

Γράφω αυτά που αναφέρει η άσκηση και δεν υπάρχουν στο πρόγραμμά σου:

1. Ανάγνωση πλάτους γραμμής από όρισμα στη γραμμή εντολών (αυτό που έχεις γράψει δουλεύει κατά τύχη, αλλά δε θέλεις να το δει ο καθηγητής σου).
2. Προεπιλεγμένο πλάτος γραμμής (80 χαρακτήρες)
3. Διαχωρισμός τού κειμένου σε λέξεις (χωρίζονται με κενό, tab ή νέα γραμμή).
4. Έλεγχος για μήκος λέξης μεγαλύτερο από W

Όταν τελειώσεις με όλα αυτά, φτιάχνεις και τον υπολογισμό τού κόστους.
Τη realloc δεν τη χρησιμοποιείς σωστά. Γενικά, πρέπει να καταλάβεις πώς λειτουργεί ό,τι χρησιμοποιείς. πχ. Τί ακριβώς κάνει η εντολή τής 9ης γραμμής;

Κώδικας: Επιλογή όλων

atoi&#40;argv&#91;i&#93;&#41;;
ps. Στοίχισε σωστά τον κώδικά σου.

Kappa4
Δημοσιεύσεις: 9
Εγγραφή: 03 Δεκ 2014 23:56

Word wrapping method

Δημοσίευση από Kappa4 » 15 Δεκ 2014 17:18

Ευχαριστώ για τις παρατηρήσεις και εγώ με τη σειρά μου θα απαντήσω σε κάθε μια από αυτές.Όσον αφορά το 1,όντως ίσως να είναι περιττή η όλη διαδικασία.Το σκεπτικό με το οποίο εργάστηκα είναι ότι η argc δέχεται από την γραμμή εντολών ένα όρισμα και με την συνάρτηση atoi μετατρέπει το string σε integer.Σχετικά με το 2,απλά θα υπάρχει ένα define και δεν το έχω προσαρμόσει ακόμα διότι σκέφτομαι τον βασικό κώδικα για την άπληστη μέθοδο.Για το 3,είναι ένα από τα πρβλήματα που αντιμετωπίζω,τί ακριβώς σημαίνει χωρισμός του κειμένου σε λέξεις?Να χρησιμοποιήσω όπως μου είπες και παραπάνω την fgets?Νομίζω πως δεν είναι ενδεδειγμένη λύση διότι δεν ξέρουμε πόσο μεγάλη είναι η αρχική γραμμή.Στο 4 απλά θα υπάρχει μια συνθήκη που θα ελέγχει αυτή την περίπτωση..Όμως πρέπει να λύσω το πρόβλημα με τον διαχωρισμό των λέξεων.Ευχαριστώ εκ των προτέρων.

ps. Δείξε λίγη κατανόηση διότι είμαι καινούργιος στο χώρο του προγραμματισμού και σιγά σιγά μαθαίνω την γλώσσα προγραμματισμού C.

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Word wrapping method

Δημοσίευση από gvre » 15 Δεκ 2014 19:40

Για το 1 δε χρειάζεσαι loop για να διαβάσεις το 1ο όρισμα. Δες παρακάτω πώς μπορείς να αποθηκεύσεις το input σε δυναμικά δεσμευμένη μνήμη και προσάρμοσέ το στις ανάγκες σου. Μετά, με την strtok_r μπορείς να το τυπώσεις όπως θέλεις. Το capacity το έχω πολύ μικρό για να δεις και την περίπτωση που δεν αρκεί ένας 2πλασιασμός του. Αυτό, όπως και το BUF_LEN είναι προτιμότερο να έχουν μεγαλύτερες τιμές.
ps. Κάνε καμία δοκιμή μήπως μου έχει διαφύγει κάτι.

Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_LEN 16

int main&#40;void&#41;
&#123;
    char buf&#91;BUF_LEN&#93;;
    size_t capacity = 2;
    size_t textLen = 0;
    char *text;
    char *oldText;

    text = &#40;char *&#41;calloc&#40;capacity, sizeof&#40;char&#41;&#41;;
    if &#40;text == NULL&#41;
        exit&#40;EXIT_FAILURE&#41;;

    while &#40;fgets&#40;buf, BUF_LEN, stdin&#41; != NULL&#41;
    &#123;
        textLen += strlen&#40;buf&#41;;
        if &#40;textLen > capacity&#41;
        &#123;
            while &#40;textLen > capacity&#41;
                capacity *= 2;

            oldText = text;
            text = &#40;char *&#41;realloc&#40;text, capacity * sizeof&#40;char&#41;&#41;;
            if &#40;text == NULL&#41;
            &#123;
                free&#40;oldText&#41;;
                exit&#40;EXIT_FAILURE&#41;;
            &#125;
        &#125;
        strcat&#40;text, buf&#41;;
    &#125;
    printf&#40;"text&#58; '%s', capacity&#58; %zu, length&#58; %zu\n", text, capacity, strlen&#40;text&#41;&#41;;

    free&#40;text&#41;;
    return EXIT_SUCCESS;
&#125;

mariosal
Honorary Member
Δημοσιεύσεις: 1473
Εγγραφή: 09 Νοέμ 2007 23:55

Word wrapping method

Δημοσίευση από mariosal » 15 Δεκ 2014 20:19

@gvre: Υπάρχει guideline να μην βοηθάμε σε threads του τύπου "Έχω αυτή την άσκηση, λύστε τη μου". http://www.freestuff.gr/forums/viewtopic.php?t=32671

@Kappa4: Θα σου φέρω τον Τάκη να σε μαλώσει. Ό,τι απορία έχεις για την άσκηση θα στη λύσουμε στο Lists (είναι το επίσημο forum του μαθήματος), δεν είναι ανάγκη να γράφεις σε άλλα forums. :P

Φαντάζομαι ότι αν πραγματικά ήθελες βοήθεια στην άσκηση και όχι λυσάρι, θα ρωτούσες κατευθείαν στο Lists. Η άσκηση δεν είναι μόνο για να παραδοθεί, είναι και για να μάθεις να γράφεις C, να κάνεις δυναμική δέσμευση μνήμης και να παίζεις με strings. ;)

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Word wrapping method

Δημοσίευση από gvre » 15 Δεκ 2014 22:42

@mariosal Το ξέρω και συμφωνώ, αλλά έχει κάνει κάποια προσπάθεια και έχει ακόμα αρκετό δρόμο για να ολοκληρωθούν όλα τα μέρη τής άσκησης.

Kappa4
Δημοσιεύσεις: 9
Εγγραφή: 03 Δεκ 2014 23:56

Word wrapping method

Δημοσίευση από Kappa4 » 15 Δεκ 2014 23:18

@gvre Ευχαριστώ πολύ για την βοήθεια,θα δοκιμάσω τον κώδικα και θα προχωρήσω στην επόμενη μέθοδο.

@mariosal Όπως βλέπεις έχω κάνει μια προσπάθεια,δεν απαιτώ την λύση της άσκησης από τα μέλη του forum.Μπορείς να διαπιστώσεις και εσύ ο ίδιος ότι έχω επιχειρήματα και μπορώ να φέρω μια άποψη για τις ιδέες που μου δίνει ο gvre.Αν είδες την παραπάνω συζήτηση τότε πιστεύω ότι φαίνεται η προσπάθεια που έχω κάνει και σε ποιο σημείο έχω κολλήσει.Σίγουρα προγραμματισμό μαθαίνεις με την πράξη,με τα συνεχή λάθη και την διόρθωση τους απλά θεώρησα ότι χρειαζόμουν ένα tip για να προχωρήσω.

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες