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

εργασια σε c++


niaou.com

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

Δημοσ.

Καλησπερα σας,

 

 

Εχω μια εργασια σε c++ της οποιας η εκφωνηση ειναι η εξης:πρεπει να δημιουργησουμε ενα προγγραμμα σε c++ στο οποιο θα οριζεται μια συμβολοσειρα και θα εκχωρειται μια προταση της αρεσκειας μας .Στην συνεχεια θα πρεπει να εκτελεσετε μια διαδικασια η οποια θα εχει ως αποτελεσμα η συμβολοσειρα αυτη να εμφανιζεται αναποδα.Η διαχειρηση της συμβολοσειρας να γινεται με τη χρηση των δεικτων.

Μηπως θα μπορουσε να με βοηθησει καποιος σχετικα με το το πως θα υλοποιησω το κομματι που λεει οτι πρεπει η συμβολοσειρα να εμφανιζεται αναποδα?:-)Ευχαριστω

  • Απαντ. 30
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

κανονικα θέλω να την κάνω έτσι τη άσκηση

 

#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 ;

}

Δημοσ.

Χμμ... Δεν καταλαβα την ασκηση. Τεσπα εσυ θες να εμφανισεις αναποδα ενα char array.

>void print(const char* str)
{
char* cur =(char*) (strlen(str)+str);
while(cur!=str)
{
	cur--;
	printf("%c",*cur);
	
}

}

Δημοσ.

Ναι βασικα μια συμβολοσειρα αναποδα.Αλλα μπορεις να μου εξηγησεις τι ακριβως εχεις κανει γιατι το καταλαβαινω μεν αλλα ελαχιστα?;)

Δημοσ.

Δεν έχεις καταλάβει pointers απ'οτι φαίνεται... Αυτή είναι κλασική άσκηση στην C πρώτου έτους πληροφορικής.

 

Υπάρχουν αρκετά sites στο internet με tutorials( πχ αυτό)

 

Εάν κάπου δεν κατανοήσεις κάτι δείξε μας τον κώδικά σου και σε ποιο σημείο κολλάς και σε βοηθάμε.

Δημοσ.

Δες εδώ μια λύση σε 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
}

Δημοσ.

Εγώ λέω να γίνεις μάγειρας, έχει σχέση με τους αλγόριθμους και θα είσαι πιό πολυ στο στοιχείο σου... Ρίξε το λάδι, βάλε τις πατάτες, ξέρεις, τέτοια πράγματα... (σπεσιαλιτέ κρύος πατσάς, δεν πιστεύω να αξιωθείς για κάτι παραπάνω).

 

>
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;
   }
}

Δημοσ.

Ρε παίδες γιατί έγινε banned?

 

---------- Προσθήκη στις 20:50 ---------- Προηγούμενο μήνυμα στις 20:49 ----------

 

Τον διάβασες τον κώδικά μου?

Δημοσ.

Η συνάρτηση 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 πραγματικά.

 

Όποιος φτιάξει τον κώδικα ας τον βάλει να τον δούμε.

Ενδιαφέρουσα παραλλαγή είναι και αυτή όπου απομακρύνεται ο πρώτος χαρακτήρας αντί ο τελευταίος.

Καλή επιτυχία !!

Δημοσ.

Υπόψιν, ότι η strrev δεν υπόκεινται στην ANSI-C οπότε η ύπαρξη της εξαρτάται καθαρά από τις βοηθητικές βιβλιοθήκες που παρέχει ο compiler που χρησιμοποιείς (αν είναι Borland/CodeGear ή Microsoft μπορεί να την παρέχει διαφορετικά συνήθως όχι).

Δημοσ.
Η συνάρτηση 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();
}

Δημοσ.

@bokarinho

 

Μην νομίζεις ότι δεν μπορώ να γράψω με σαφήνεια, λιτότητα και ακριβολογία.

Σκοπός δεν είναι να δώσουμε μόνον μια έτοιμη λύση αλλά και ερεθίσματα για περαιτέρω σκέψη και προβληματισμό, ότι ξέρει ο καθένας.

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

Η δική σου λύση τι περισσότερο προσφέρει ως ιδέα από τις υπόλοιπες ώστε να έχει νόημα να μας την δείξεις ? (ανευ παρεξηγήσεως)

Εξάλλου στην αρχή έδωσα λύση με την strrev που είναι η συντομότερη όλων και είναι η προτιμητέα σε πραγματική εφαρμογή.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...