Δημοσιεύτηκε: 13 Ιούλ 2011, 20:59
migf1 έγραψε:
[snip]
Βασικά έχω κάνει 2 υλοποιήσεις, μια στην οποία η αντιστροφή γίνεται απευθείας στην main() και οι λέξεις τυπώνονται απευθείας στην οθόνη, και μια όπου η αντιστροφή γίνεται μέσα σε συνάρτηση που δέχεται ως όρισμα την αρχική πρόταση και την επιστρέφει με αντεστραμμένες τις λέξεις της.
Παραθέτω (σε spoiler) την πρώτη υλοποίηση που είναι πιο εύκολη κι όταν μου δώσετε το οκ θα παραθέσω και την υλοποίηση με τη συνάρτηση.
Και οι 2 υλοποιήσεις είναι ανεξάρτητες από το πλήθος των λέξεων στην αρχική πρόταση και χρησιμοποιούν τον ίδιον αλγόριθμο για την αντιστροφή.Spoiler: show
Παραθέτω την (2η) υλοποίηση με αυτόνομη συνάρτηση.
Η βασική της διαφορά από την 1η υλοποίηση είναι πως οι διασπασμένες λέξεις του s δεν τυπώνονται απευθείας στην οθόνη μετά την αντιστροφή τους, αλλά μπαίνουν μέσα σε ένα τοπικά δηλωμένο string t, το οποίο στο τέλος αντιγράφεται στο s, πριν τερματίσει η συνάρτηση.
- Κώδικας: Επιλογή όλων
/* ------------------------------------------------------------
* Από: migf1 Έκδοση με Συνάρτηση
*
* Αντιστροφή λέξεων μιας πρότασης. Π.χ. το "γειά σου κόσμε"
* γίνεται "κόσμε σου γεια"
*
* Αλγόριθμος:
* πρώτα αντιστρέφεται η αρχική πρόταση και κατόπιν διασπάται
* στις λέξεις της, οι οποίες αντιστρέφονται εκ νέου πριν
* τυπωθούν μια προς μια στην οθόνη.
* ------------------------------------------------------------
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// ------------------------------------------------------------------------------------
// Αντιγράφει έως n-1 χαρακτήρες του string src στο string dst, το οποίο κι επιστρέφει
// προσθέτοντας τον μηδενικό χαρακτήρα στο τέλος.
// ΣΗΜΑΝΤΙΚΟ: τα dst και src πρέπει να είναι ήδη δημιουργημένα και να έχουν χώρο για
// τουλάχιστον n χαρακτήρες (συμπεριλαμβανομένου του μηδενικού στο τέλος)
//
char *s_ncopy( char *dst, const char *src, int n )
{
char *save = dst;
while ( (dst-save) < n-1 && (*dst=*src) != '\0' )
dst++, src++;
if ( *dst )
*dst = 0;
return save;
}
// ------------------------------------------------------------------------------------
// Αντιστρέφει το string s. Βάζει από έναν δείκτην στην αρχή και το τέλος του s, κι
// εναλλάσει τους χαρακτήρες τους μέχρι να συναντηθούν οι δυο δείκτες στη μέση του s
// ΣΗΜΑΝΤΙΚΟ: το s πρέπει να είναι ήδη δημιουργημένο.
//
char *s_reverse(char *s)
{
if ( !s ) // early exit
return NULL;
char *cp1, *cp2, dummy;
cp2 = s + strlen(s) - 1; // set cp2 at end of s
for (cp1=s; cp1 < cp2; cp1++, cp2--) {
dummy = *cp1;
*cp1 = *cp2;
*cp2 = dummy;
}
return s;
}
// ------------------------------------------------------------------------------------
// Αντιστρέφει τις λέξεις του string s κι επιστρέφει το αλλαγμένο s (δείτε στην αρχή
// του αρχείου τον αλγόριθμο).
// ΣΗΜΑΝΤΙΚΟ: το s πρέπει να είναι ήδη δημιουργημένο πριν περαστεί στη συνάρτηση
//
char *s_revwords(char *s)
{
size_t slen = strlen(s) + 1; // strlen() excludes '\0', so +1
char t[ slen+1 ]; // t will have an extra space at the end
char *delims=" \t\n", *cp = NULL;
*t = '\0'; // must be done, for strcat() below
s_reverse(s);
cp = strtok(s, delims);
while (cp != NULL)
{
strcat(t, s_reverse(cp) );
strcat(t, " ");
cp = strtok(NULL, delims);
}
s_ncopy(s, t, slen ); // exclude final space char ' '
return s;
}
// ------------------------------------------------------------------------------------
int main( void )
{
char s[256];
printf("Enter a sentence: ");
fgets(s, 256, stdin);
printf("%s\n", s_revwords(s));
exit( EXIT_SUCCESS );
}