niaou.com Δημοσ. 3 Μαΐου 2010 Δημοσ. 3 Μαΐου 2010 Καλησπερα σας, Εχω μια εργασια σε c++ της οποιας η εκφωνηση ειναι η εξης:πρεπει να δημιουργησουμε ενα προγγραμμα σε c++ στο οποιο θα οριζεται μια συμβολοσειρα και θα εκχωρειται μια προταση της αρεσκειας μας .Στην συνεχεια θα πρεπει να εκτελεσετε μια διαδικασια η οποια θα εχει ως αποτελεσμα η συμβολοσειρα αυτη να εμφανιζεται αναποδα.Η διαχειρηση της συμβολοσειρας να γινεται με τη χρηση των δεικτων. Μηπως θα μπορουσε να με βοηθησει καποιος σχετικα με το το πως θα υλοποιησω το κομματι που λεει οτι πρεπει η συμβολοσειρα να εμφανιζεται αναποδα?Ευχαριστω
Evgenios1 Δημοσ. 3 Μαΐου 2010 Δημοσ. 3 Μαΐου 2010 Πες μου πως θα τη κανεις να εμφανιζετε κανονικα και εγω θα σου πω αυτο που θες .
niaou.com Δημοσ. 3 Μαΐου 2010 Μέλος Δημοσ. 3 Μαΐου 2010 κανονικα θέλω να την κάνω έτσι τη άσκηση #include <iostream> using namespace std ; int main() { char *p; char c ; int counter =0 ; p="Good morning from samos" ; c=getch() ; while(*p!='\0') { if(*p==c) counter++ ; p++ ; } cout<<counter ; return 0 ; }
Evgenios1 Δημοσ. 3 Μαΐου 2010 Δημοσ. 3 Μαΐου 2010 Χμμ... Δεν καταλαβα την ασκηση. Τεσπα εσυ θες να εμφανισεις αναποδα ενα char array. >void print(const char* str) { char* cur =(char*) (strlen(str)+str); while(cur!=str) { cur--; printf("%c",*cur); } }
niaou.com Δημοσ. 3 Μαΐου 2010 Μέλος Δημοσ. 3 Μαΐου 2010 Ναι βασικα μια συμβολοσειρα αναποδα.Αλλα μπορεις να μου εξηγησεις τι ακριβως εχεις κανει γιατι το καταλαβαινω μεν αλλα ελαχιστα?
javavall Δημοσ. 3 Μαΐου 2010 Δημοσ. 3 Μαΐου 2010 Δεν έχεις καταλάβει pointers απ'οτι φαίνεται... Αυτή είναι κλασική άσκηση στην C πρώτου έτους πληροφορικής. Υπάρχουν αρκετά sites στο internet με tutorials( πχ αυτό) Εάν κάπου δεν κατανοήσεις κάτι δείξε μας τον κώδικά σου και σε ποιο σημείο κολλάς και σε βοηθάμε.
thanos713 Δημοσ. 3 Μαΐου 2010 Δημοσ. 3 Μαΐου 2010 Δες εδώ μια λύση σε C: >#include <stdio.h> #include <string.h> int main() { char leksi[10]; //string int len,i;//megethos symboloseiras kai metritis printf("Dose onoma: "); gets(leksi);//pairnei leksi len = strlen(leksi); //megethos symboloseiras for (i=len-1;i>=0;i--) //painrei o metritis teleytaia timi toy pinaka, ginetai o brogxos mexri na paei iso me miden { printf("%c", leksi[i]); //emfanizei ton xaraktira toy metriti } fflush(stdin); //adeiazei pliktrologio gia ypoleimmata getchar();//enter }
C6WGMN Δημοσ. 3 Μαΐου 2010 Δημοσ. 3 Μαΐου 2010 Εγώ λέω να γίνεις μάγειρας, έχει σχέση με τους αλγόριθμους και θα είσαι πιό πολυ στο στοιχείο σου... Ρίξε το λάδι, βάλε τις πατάτες, ξέρεις, τέτοια πράγματα... (σπεσιαλιτέ κρύος πατσάς, δεν πιστεύω να αξιωθείς για κάτι παραπάνω). > void reverse(char *x) { size_t i, j; int c; for(i = 0, j = strlen(x); i != j/2 ; i++) { c = x[i]; x[i] = x[j - i - 1]; x[j - i - 1] = c; } }
javavall Δημοσ. 3 Μαΐου 2010 Δημοσ. 3 Μαΐου 2010 Δεν βοηθάτε καθόλου έτσι... Τον διάβασες τον κώδικά μου? Κατάλαβες τι εννοώ?
thanos713 Δημοσ. 3 Μαΐου 2010 Δημοσ. 3 Μαΐου 2010 Ρε παίδες γιατί έγινε banned? ---------- Προσθήκη στις 20:50 ---------- Προηγούμενο μήνυμα στις 20:49 ---------- Τον διάβασες τον κώδικά μου?
V.I.Smirnov Δημοσ. 3 Μαΐου 2010 Δημοσ. 3 Μαΐου 2010 Η συνάρτηση strrev το κάνει αυτόματα. Π.χ. #include<string.h> main() { char buf[80]; printf("Enter a string : "); gets(buf); strrev(buf); printf("Reversed string is : \n%s\n", buf); return 0; } αλλά μάλλον αυτό δεν θα αρέσει στον εξεταστή της άσκησης. Το πρόβλημα αυτό μπορεί να λυθεί πολύ κομψά χρησιμοποιώντας αναδρομικές συναρτήσεις (recursive functions), δηλ. συναρτήσεις που καλούν τον εαυτό τους. Οι αναδρομικές συναρτήσεις σχετίζονται στενά με την μαθηματική επαγωγή - όσοι ξέρουν μαθηματικά θα καταλάβουν γιατί. 1ο στάδιο λύσης : Kαθορισμός της βασικής υπόθεσης (base case) που τερματίζει την αναδρομική σχέση. Η βασική υπόθεση είναι ουσιωδώς ένα υποπρόβλημα του αρχικού για το οποίο η λύση είναι γνωστή. Στο πρόβλημα "να γραφεί ανάποδα ένα string n χαρακτήρων" μπορεί να δοθεί μια λύση μέσω του προβλήματος "να γραφεί ανάποδα ένα string n-1 χαρακτήρων". Αυτό είναι το αναδρομικό βήμα της λύσης που μειώνει κατά 1 το μήκος του string. To γεγονός ότι αναδρομικά το μήκος του string μειώνεται υποδεικνύει ότι ως βασική υπόθεση (base case) στην αναδρομική σχέση μπορεί να ληφθεί το να γραφεί ανάποδα ένα πολύ μικρό string. To μικρότερο string για το οποιο μπορεί να γίνει εύκολα αντιστροφή είναι προφανώς αυτό με μήκος 0 και συνεπώς η βασική υπόθεση είναι "να γραφεί ανάποδα ένα κενό string" για το οποίο η γνωστή λύση είναι ότι δεν απαιτείται να γίνει τίποτε. 2ο στάδιο λύσης : Υλοποίηση της αναδρομικής σχέσης του προβλήματος η οποία είναι "να γραφεί ανάποδα ένα string n-1 χαρακτήρων". Το string με μήκος n-1 είναι ένα τμήμα του αρχικού. Έστω ότι από το αρχικό απομακρύνεται ένας χαρακτήρας και απομένει το string n-1. Για να λειτουργήσει η αναδρομική λύση, πρέπει να γίνεται κάποια επεξεργασία στον χαρακτήρα που λαμβάνεται και στο string που απομένει αλλά κατά τρόπο που σε κάθε βήμα (κλήση της αναδρομικής σχέσης) να λύνεται μερικώς το πρόβλημα, έτσι ώστε να τείνει στη λύση. Συνεπώς πρέπει να επιλεγεί ποιός χαρακτήρας θα απομακρυνθεί και τι επεξεργασία θα γίνει. Επειδή γράφουμε χαρακτήρες, μια πιθανή επεξεργασία είναι η γραφή ενός χαρακτήρα. Σε ότι αφορά ποιός χαρακτήρας θα απομακρύνεται, υπάρχουν διάφορες επιλογές με προφανέστερες τον πρώτο ή τον τελευταίο. Έστω ότι επιλέγεται να απομακρύνεται ο τελευταίος. Τότε ο τελευταίος χαρακτήρας θα πρέπει να γράφεται πρώτος. Συνεπώς, ο τελευταίος χαρακτήρας του τρέχοντος πρέπει να γράφεται πριν από το υπόλοιπο string που απομένει. Σε ψευδοκώδικα : writeBackward (string s) { if (string is empty) { do nothing } // this is the base case else { write the last character of s writeBackward(s minus its last character) } } και πιο αναλυτικά void writeBackward(string s, int size) { if (size>0) { cout<<s.substring(size-1,1); // write the last character of current string writeBackward(s, size-1) // write the rest of the string backward } //end if // else size=0, it is the base case, do nothing } // end writeBackward function Κάντο με το χέρι και θα δεις ότι δουλεύει !!! Μένει να βρεις μόνον κάποιες λεπτομέρειες (πώς θα συμβολίσεις το string κλπ) . s είναι το string και size είναι το τρέχον μήκος του. Η συνάρτηση substring είναι φανταστική και επιστρέφει το επιθυμητό τμήμα ενός string. Φαντάζομαι ότι μπορεί να υποκατασταθεί με κάποια π.χ. όπως η strok ή strcpy. Ο ψευδοκώδικας όπως δίνεται δεν αντιστρέφει πραγματικά το string. Απλώς το γράφει ανάποδα. Αυτό εξάλλου δεν το διευκρινίζει η εκφώνηση. Σε αντίθεση, η strrev αλλάζει το string πραγματικά. Όποιος φτιάξει τον κώδικα ας τον βάλει να τον δούμε. Ενδιαφέρουσα παραλλαγή είναι και αυτή όπου απομακρύνεται ο πρώτος χαρακτήρας αντί ο τελευταίος. Καλή επιτυχία !!
Directx Δημοσ. 3 Μαΐου 2010 Δημοσ. 3 Μαΐου 2010 Υπόψιν, ότι η strrev δεν υπόκεινται στην ANSI-C οπότε η ύπαρξη της εξαρτάται καθαρά από τις βοηθητικές βιβλιοθήκες που παρέχει ο compiler που χρησιμοποιείς (αν είναι Borland/CodeGear ή Microsoft μπορεί να την παρέχει διαφορετικά συνήθως όχι).
bokarinho Δημοσ. 4 Μαΐου 2010 Δημοσ. 4 Μαΐου 2010 Η συνάρτηση strrev το κάνει αυτόματα.Π.χ. #include<string.h> main() { char buf[80]; printf("Enter a string : "); gets(buf); strrev(buf); printf("Reversed string is : \n%s\n", buf); return 0; } αλλά μάλλον αυτό δεν θα αρέσει στον εξεταστή της άσκησης. Το πρόβλημα αυτό μπορεί να λυθεί πολύ κομψά χρησιμοποιώντας αναδρομικές συναρτήσεις (recursive functions), δηλ. συναρτήσεις που καλούν τον εαυτό τους. Οι αναδρομικές συναρτήσεις σχετίζονται στενά με την μαθηματική επαγωγή - όσοι ξέρουν μαθηματικά θα καταλάβουν γιατί. 1ο στάδιο λύσης : Kαθορισμός της βασικής υπόθεσης (base case) που τερματίζει την αναδρομική σχέση. Η βασική υπόθεση είναι ουσιωδώς ένα υποπρόβλημα του αρχικού για το οποίο η λύση είναι γνωστή. Στο πρόβλημα "να γραφεί ανάποδα ένα string n χαρακτήρων" μπορεί να δοθεί μια λύση μέσω του προβλήματος "να γραφεί ανάποδα ένα string n-1 χαρακτήρων". Αυτό είναι το αναδρομικό βήμα της λύσης που μειώνει κατά 1 το μήκος του string. To γεγονός ότι αναδρομικά το μήκος του string μειώνεται υποδεικνύει ότι ως βασική υπόθεση (base case) στην αναδρομική σχέση μπορεί να ληφθεί το να γραφεί ανάποδα ένα πολύ μικρό string. To μικρότερο string για το οποιο μπορεί να γίνει εύκολα αντιστροφή είναι προφανώς αυτό με μήκος 0 και συνεπώς η βασική υπόθεση είναι "να γραφεί ανάποδα ένα κενό string" για το οποίο η γνωστή λύση είναι ότι δεν απαιτείται να γίνει τίποτε. 2ο στάδιο λύσης : Υλοποίηση της αναδρομικής σχέσης του προβλήματος η οποία είναι "να γραφεί ανάποδα ένα string n-1 χαρακτήρων". Το string με μήκος n-1 είναι ένα τμήμα του αρχικού. Έστω ότι από το αρχικό απομακρύνεται ένας χαρακτήρας και απομένει το string n-1. Για να λειτουργήσει η αναδρομική λύση, πρέπει να γίνεται κάποια επεξεργασία στον χαρακτήρα που λαμβάνεται και στο string που απομένει αλλά κατά τρόπο που σε κάθε βήμα (κλήση της αναδρομικής σχέσης) να λύνεται μερικώς το πρόβλημα, έτσι ώστε να τείνει στη λύση. Συνεπώς πρέπει να επιλεγεί ποιός χαρακτήρας θα απομακρυνθεί και τι επεξεργασία θα γίνει. Επειδή γράφουμε χαρακτήρες, μια πιθανή επεξεργασία είναι η γραφή ενός χαρακτήρα. Σε ότι αφορά ποιός χαρακτήρας θα απομακρύνεται, υπάρχουν διάφορες επιλογές με προφανέστερες τον πρώτο ή τον τελευταίο. Έστω ότι επιλέγεται να απομακρύνεται ο τελευταίος. Τότε ο τελευταίος χαρακτήρας θα πρέπει να γράφεται πρώτος. Συνεπώς, ο τελευταίος χαρακτήρας του τρέχοντος πρέπει να γράφεται πριν από το υπόλοιπο string που απομένει. Σε ψευδοκώδικα : writeBackward (string s) { if (string is empty) { do nothing } // this is the base case else { write the last character of s writeBackward(s minus its last character) } } και πιο αναλυτικά void writeBackward(string s, int size) { if (size>0) { cout<<s.substring(size-1,1); // write the last character of current string writeBackward(s, size-1) // write the rest of the string backward } //end if // else size=0, it is the base case, do nothing } // end writeBackward function Κάντο με το χέρι και θα δεις ότι δουλεύει !!! Μένει να βρεις μόνον κάποιες λεπτομέρειες (πώς θα συμβολίσεις το string κλπ) . s είναι το string και size είναι το τρέχον μήκος του. Η συνάρτηση substring είναι φανταστική και επιστρέφει το επιθυμητό τμήμα ενός string. Φαντάζομαι ότι μπορεί να υποκατασταθεί με κάποια π.χ. όπως η strok ή strcpy. Ο ψευδοκώδικας όπως δίνεται δεν αντιστρέφει πραγματικά το string. Απλώς το γράφει ανάποδα. Αυτό εξάλλου δεν το διευκρινίζει η εκφώνηση. Σε αντίθεση, η strrev αλλάζει το string πραγματικά. Όποιος φτιάξει τον κώδικα ας τον βάλει να τον δούμε. Ενδιαφέρουσα παραλλαγή είναι και αυτή όπου απομακρύνεται ο πρώτος χαρακτήρας αντί ο τελευταίος. Καλή επιτυχία !! Το λακωνίζειν εστί φιλοσοφείν > #include <iostream> #include <string> #include <algorithm> #include <vector> using namespace std; // Reverse an input string with STL. string mystrRev(const char *Input) { string szVec = Input; reverse(szVec.begin(), szVec.end()); return szVec; } int main (int argc, char *argv[]) { static char input[] = "Hello"; cout << mystrRev(input) << endl; cout << "Hit enter to continue..." << endl; cin.get(); }
V.I.Smirnov Δημοσ. 4 Μαΐου 2010 Δημοσ. 4 Μαΐου 2010 @bokarinho Μην νομίζεις ότι δεν μπορώ να γράψω με σαφήνεια, λιτότητα και ακριβολογία. Σκοπός δεν είναι να δώσουμε μόνον μια έτοιμη λύση αλλά και ερεθίσματα για περαιτέρω σκέψη και προβληματισμό, ότι ξέρει ο καθένας. Και σε αυτό αποσκοπούσε η φλυαρία μου για τις αναδρομικές συναρτήσεις. Η δική σου λύση τι περισσότερο προσφέρει ως ιδέα από τις υπόλοιπες ώστε να έχει νόημα να μας την δείξεις ? (ανευ παρεξηγήσεως) Εξάλλου στην αρχή έδωσα λύση με την strrev που είναι η συντομότερη όλων και είναι η προτιμητέα σε πραγματική εφαρμογή.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.