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

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

Δημοσ.

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

Για την άσκηση αυτή, ονομάζουμε λέξη μια ακολουθία χαρακτήρων που δεν περιέχει το κενό. Θεωρήστε ότι κάθε λέξη δεν υπερβαίνει τους 20 χαρακτήρες και ότι δεν μπορεί να κόβεται σε δύο γραμμές.

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

Συγκεκριμένα, στο τελικό κείμενο:

  1. Το μήκος κάθε γραμμής (εκτός ίσως της τελευταίας) πρέπει να είναι 60 χαρακτήρες.
  2. Κάθε γραμμή (εκτός ίσως της τελευταίας) πρέπει να στοιχίζεται και στο αριστερό και στο δεξιό περιθώριο.
  3. Τα κενά μεταξύ των λέξεων πρέπει να ισοκατανέμονται (κατά το δυνατόν). Αν ονομάσουμε διάκενο το πλήθος των κενών διαστημάτων μεταξύ δύο διαδοχικών λέξεων, τότε πρέπει σε κάθε γραμμή:
    • το μεγαλύτερο διάκενο να διαφέρει από το μικρότερο το πολύ κατά ένα κενό διάστημα, και
    • αν ένα διάκενο είναι μεγαλύτερο από κάποιο άλλο, τότε πρέπει να βρίσκεται δεξιότερα.

post-420517-0-43835600-1482510512_thumb.png

Δημοσ.

Ξεκίνα μετατρέποντας το πρόβλημα που σου δίνεται στην πιο απλή του μορφή από την οποία μπορείς να παράγεις τη λύση.

 

Πρώτα απ' όλα πρέπει να αποφανθείς ποιό μέρος από την είσοδο (δηλαδή οι πόσες πρώτες λέξεις) θα μπουν στην πρώτη γραμμή. Πώς θα το κάνεις αυτό; Αν είσαι σχολαστικός στην περιγραφή σου θα δεις ότι είναι στη συνέχεια πολύ εύκολο να μετατρέψεις αυτό που είπες σε πρόγραμμα, and we're here to help.

 

Αφού λύσουμε το παραπάνω ερώτημα, το επόμενο βήμα είναι: έστω ότι ξέρουμε ποιές λέξεις θα μπουν στην πρώτη γραμμή. Πόσα κενά θα χρειαστεί να προσθέσεις και σε ποιά σημεία;

 

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

  • Like 2
Δημοσ. (επεξεργασμένο)

Καλό είναι πρώτα να πάρεις σε μια δομή (πίνακα) τις λέξεις

εάν δεν έχει έτοιμη μέθοδο η c (πιστέυω θα έχει) μπορείς να κάνεις μία συνάρτηση

(διαβάζεις χαρακτήρες μέχρι να βρεις κενό και όταν βρεις κενό αποθηκευεις)

 

Στη συνέχεια σε μια κενή γραμμή προσθέτεις λέξεις από τον πίνακα εάν το μήκος της γραμμής και της λέξης που πρόκειτε να προσθέσεις  δεν υπερβαίνει το 60

εάν το υπερβαίνει τότε προσθέτεις τη γραμμή σε ένα text την μηδενίζεις και συνεχίζεις

Προσθέτεις τέλος το υπόλοιπο κομμάτι που τελειώνει το αρχείο

 

Ο κώδικάς σε python αν βοηθάει είναι 

def justify_text(a):
  words=a.split()
  line=''
  text=''
  for word in words:
    if (len (line)+len(word)+1)<=60:
      if len(line)==0:
        line=line+word
      else:
        line=line+' '+word
    else:
      text+=justified(line)+'\n'
      line=word
  text+=line
  return text

To justify των γραμμών για να έχεις μήκος 60

μπορείς να το κάνεις ως εξής

ελέγχεις το μήκος της γραμμής και έστω είναι 50 ελέγχεις μετά τις λέξεις και έστω είναι 4

έχεις 10 space να κατανείμεις σε 3 κενά 

βάζεις 10//3 σε κάθε κενό και το 10%3 στα τελευταία

Επεξ/σία από k33theod
  • Like 1
Δημοσ.

ευχαριστώ πολυ ολους για τις ιδεες , θα προσπαθησω να το υλοποιησω μεσα στις γιορτες και θα ενημερωσω αν εχω καποιια προοδο

Δημοσ.

Καλησπέρα χρόνια πολλα και για οσους το δειτε αργότερα καλη χρονια . Μετα απο αρκετή προσπάθεια καταφερα να φτιαξω το προγραμμα ωστε να κοβει τις γραμμες στους 60 χαρακτηρες χωρις να κοβει καποια λεξη στη μεση στο τελος. Αυτο που μένει ειναι να προσθέτει καταλλήλως τα κενά ανάμεσα στις λέξεις της κάθε γραμμής ώστε να επιτυγχάνεται η στοίχιση. Έχει κανείς καμία καλή ιδέα; 

Ο κωδικάς μου: 
 

}PROGRAM ask151(){

  int place=-1;

  int i=0,storel=0;

  char lexi[21];

 //  char store[21];

  char grammi[61];

  int length=0;

  int flag='a';

 

  while (flag != EOF){

    i=0;

    flag=scanf("%s",lexi);

    length=strlen(lexi);

 

    if (place+length+(storel+1)>60 OR flag==EOF)

    {

      FOR (i,0  TO place-1){

        WRITE(grammi);

      }

      WRITELN();

      if (flag != EOF) {

      WRITE(lexi);

      WRITE(" "); }

      FOR (i,0 TO length)

      {

        lexi=' ';

      }

 

      FOR (i, 0 TO place)

      {

        grammi=' ';

      }

      place=-1;

      storel=length;

    }

    else {

        FOR (i,place+1 TO place+length)  grammi=lexi[i-(place+1)];

        grammi[place+length+1]=' ';

        place=place+length+1;

    }

  }

}

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

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

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

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

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

Σύνδεση

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

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