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

Αντίστροφο Αλφαριθμητικό C++

Ερώτηση

Καλησπέρα.

Παλαιό θέμα στην σχολη μου λέει:

Να γραφτεί συναρτηση atoi() η οποία θα δέχετε ένα αλφαριθμητικό και θα επιστρέφει το αντίθετο του.

Για να την λύσω εγραψα στο pc μαζι με main κτλπ.

Έγραψα αυτό τον κώδικα ο οποίος ξέρω οτι δεν είναι αυτό που ζητάει ακριβώς(η συνάρτηση) αλλα εδώ θέλω την βοήθεια σας

#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::endl;


 void atoi( string &);

int main ()
{
    string t;
    string s="test 123";
    cout<<"Arxiko Alfarithmitiko: \n"<<s<<endl;
    cout<<"Antestrameno Alfarithmitiko: \n";
    
    atoi(s);
 

    //cout<<s;
    return 0;

}

void atoi(string &s)
{
    string t;
    for (int i=0;i<s.length();i++)
        t[i]=s[s.length()-i-1];
    
    
    for (int j=0;j<s.length();j++)
        cout<<t[j];
        cout<<"\n";

}

Το προβλημα ειναι οτι:

Δεν μπορώ να αλλάξω με κάποιον τρόπο την τιμή του s οπότε οταν εκτυπώσω στην main το s να μου βγάζει το αντεστραμένο.

Έτσι οπως ειναι τώρα βγάζει αυτό:

 

Arxiko Alfarithmitiko: 

test 123

Antestrameno Alfarithmitiko: 

321 tset

Ομως δεν θα πρέπει να εκτυπώνετε στην atoi αλλα στην main γιατί ζητάει να επιστρέφει η συνάρτηση.

Θα πρέπει να ειναι τύπου string και οχι void αλλα και return να κάνω δεν μου βγάζει τιποτα ( κάνει compile).

Δεν μπορώ να βρώ την λύση αν και μου φαίνεται σχετικά απλο.

 

Σας ευχαριστώ εκ των προτέρων για τον χρόνο σας.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

  • 0

 

Καλησπέρα.

Παλαιό θέμα στην σχολη μου λέει:

Να γραφτεί συναρτηση atoi() η οποία θα δέχετε ένα αλφαριθμητικό και θα επιστρέφει το αντίθετο του.

Για να την λύσω εγραψα στο pc μαζι με main κτλπ.

Έγραψα αυτό τον κώδικα ο οποίος ξέρω οτι δεν είναι αυτό που ζητάει ακριβώς(η συνάρτηση) αλλα εδώ θέλω την βοήθεια σας

#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::endl;


 void atoi( string &);

int main ()
{
    string t;
    string s="test 123";
    cout<<"Arxiko Alfarithmitiko: \n"<<s<<endl;
    cout<<"Antestrameno Alfarithmitiko: \n";
    
    atoi(s);
 

    //cout<<s;
    return 0;

}

void atoi(string &s)
{
    string t;
    for (int i=0;i<s.length();i++)
        t[i]=s[s.length()-i-1];
    
    
    for (int j=0;j<s.length();j++)
        cout<<t[j];
        cout<<"\n";

}
Το προβλημα ειναι οτι:

Δεν μπορώ να αλλάξω με κάποιον τρόπο την τιμή του s οπότε οταν εκτυπώσω στην main το s να μου βγάζει το αντεστραμένο.

Έτσι οπως ειναι τώρα βγάζει αυτό:

 

Arxiko Alfarithmitiko: 

test 123

Antestrameno Alfarithmitiko: 

321 tset

Ομως δεν θα πρέπει να εκτυπώνετε στην atoi αλλα στην main γιατί ζητάει να επιστρέφει η συνάρτηση.

Θα πρέπει να ειναι τύπου string και οχι void αλλα και return να κάνω δεν μου βγάζει τιποτα ( κάνει compile).

Δεν μπορώ να βρώ την λύση αν και μου φαίνεται σχετικά απλο.

 

Σας ευχαριστώ εκ των προτέρων για τον χρόνο σας.

 

 

[code=js:0]#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::endl;


 string atoi( string &);

int main ()
{
    string t;
    string s="test 123";
    cout<<"Arxiko Alfarithmitiko: \n"<<s<<endl;
    cout<<"Antestrameno Alfarithmitiko: \n";
    
    string result = atoi(s);
 

    cout<<result;
    return 0;

}

string atoi(string &s)
{
    string t;
    for (int i=0;i<s.length();i++)
        t[i]=s[s.length()-i-1];
    
    return t;

}[/code]

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

The C++ way

#include <iostream> 
#include <string>

std::string atoi(const std::string& in) 
{
    return std::string(in.rbegin(), in.rend()); 
}

int main(int argc, char** argv) 
{
    std::string str("Hello World");
    std::cout << atoi(str);

    return 0;
}

Επίσης αν θες να γλιτώσεις ένα copy construction

 

#include <iostream>
#include <string>

std::string& atoi(const std::string& in, std::string& out) 
{
    out.assign(in.rbegin(), in.rend());
    return out;
}

int main(int argc, char** argv) 
{
    std::string str("Hello World"), out;
    std::cout << atoi(str, out);

    return 0;
}

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0
Δημοσ. (επεξεργασμένο)

Καλησπέρα.

παπί κατι παρόμοιο ειχα δοκιμάσει και εγώ.έτρεξα το δικό σου αλλα πάλι δεν μου το εκύπωσε στην main δηλαδή δεν εκτελείτε η εντολή:  string result = atoi(s);

 

Αντιθέτως Erevis δουλεύει μια χαρά το δικό σου.Αλλα δεν πιστεύω στην σχολή να μας εξετάζουν αν ξέρουμε τις συναρτήσεις της c++ πιστεύω οτι θέλουν κάτι να το σκεφτούμε μόνοι μας (έπιανε και 2 μονάδες το θέμα)

με κάτι πρέπει να αντικαταστήσω την εντολή  αυτά εδω return std::string(in.rbegin(), in.rend());
 εχω την εντύπωση.

 

Έχεις ιδέα;

Επεξ/σία από epir21

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

...

Αλλα δεν πιστεύω στην σχολή να μας εξετάζουν αν ξέρουμε τις συναρτήσεις της c++ πιστεύω οτι θέλουν κάτι να το σκεφτούμε μόνοι μας (έπιανε και 2 μονάδες το θέμα)

με κάτι πρέπει να αντικαταστήσω την εντολή αυτά εδω εχω την εντύπωση.

 

Έχεις ιδέα;

The C way...

 

...
char *atoi(char *s)
{
    size_t len = 0;

    if ( !s || !*s || (len=strlen(s)-1) < 2 )
        return s;

    for (int i=0; i <= len/2; i++) {
        char c = s[i]
        s[i] = s[len-i];
        s[len-i] = c;
    }
    
    return s;

}
...
int main( void )
{
    char s[] = "123 test";

    puts( atoi(s) ? s : "<NULL>" );
    return 0;
}

ΥΓ. Δεν το 'χω τσεκάρει, το έγραψα απευθείας εδώ στον editor του φορουμ, οπότε μπορεί να έχει bugs. Δείχνει όμως τη λογική πιστεύω, χωρίς να χρησιμοποιεί καμιά από τις C++ specific συναρτήσεις.

 

EDIT:

 

Είχα ξεχάσει να κάνω swap τους χαρακτήρες μέσα στο loop (επίσης δεν είμαι σίγουρος αν χρειάζεται το ίσον στη σύγκριση... βαριέμαι να το κάνω compile τώρα :P).

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Η λογική είναι

The C way...

 

 

...
char *atoi(char *s)
{
    size_t len = 0;
    if ( !s || !*s || (len=strlen(s)-1) < 2 )
        return s;

    for (int i=0; i <= len/2; i++)
        s[i] = s[len-i];
    
    return s;

}
...
int main( void )
{
    char s[] = "123 test";

    puts( atoi(s) ? s : "<NULL>" );
    return 0;
}

ΥΓ. Δεν το 'χω τσεκάρει, το έγραψα απευθείας εδώ στον editor του φορουμ, οπότε μπορεί να έχει bugs. Δείχνει όμως τη λογική πιστεύω, χωρίς να χρησιμοποιεί καμιά από τις C++ specific συναρτήσεις.

 

 

 

 

Η λογική είναι λάθος. Αναστρέφεις μόνο το 1ο μισό string το εκχωρείς 2ο μισό του. Επίσης η συνάρτησή σου κάνει mutate το string που είναι όρισμα στη συνάρτηση, δε ξέρω κατά πόσο το θέλει αυτό.

 

epir21,

 

#include <iostream> 
#include <string>

std::string atoi(const std::string& in) 
{
    int inputStrLength = in.length();

    std::string out(inputStrLength, ' ');
    
    for(int i = inputStrLength - 1, j = 0; i >= 0; i--, j++) 
    {
        out[j] = in[i]; 
    }

    return out;
}

int main(int argc, char** argv) 
{
    std::string str("Hello World");
    std::cout << atoi(str) << '\n';

    return 0;
}

Αν θες να το ψάξεις λίγο παραπάνω καλό θα ήταν να το κάνεις με τους iterators του std::string. Γενικά προτιμούνται οι iterators από indexed access.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Η λογική είναι λάθος. Αναστρέφεις μόνο το 1ο μισό string το εκχωρείς 2ο μισό του. Επίσης η συνάρτησή σου κάνει mutate το string που είναι όρισμα στη συνάρτηση, δε ξέρω κατά πόσο το θέλει αυτό.

Yeap, το είδα και το έκανα edit (μάλλον την ώρα που έγραφες ακόμα αυτό το ποστ). Για το immutable, δεν νομίζω να έχει νόημα να του το δείξω σε C γιατί θέλει malloc & free.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Yeap, το είδα και το έκανα edit (μάλλον την ώρα που έγραφες ακόμα αυτό το ποστ). Για το immutable, δεν νομίζω να έχει νόημα να του το δείξω σε C γιατί θέλει malloc & free.

Δεν είναι απαραίτητο, μπορείς να περάσεις σαν όρισμα έναν άλλο πίνακα και να γράφεις το output εκεί. Χρειάζεται ένα επιπλέον όρισμα για το μέγεθος του output βέβαια, ώστε να γίνονται οι απαραίτητοι έλεγχοι.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Καλησπέρα.

παπί κατι παρόμοιο ειχα δοκιμάσει και εγώ.έτρεξα το δικό σου αλλα πάλι δεν μου το εκύπωσε στην main δηλαδή δεν εκτελείτε η εντολή:  string result = atoi(s);

Η λύση του παπί είναι ΟΚ απλα στην συνάρτηση atoi  δεν προσθέτει το τελικό NULL στη γραμμή αυτή

t[i]=s[s.length()-i-1];

επίσης καλύτερα ειναι με push_back δηλαδή η atoi να γίνει

string atoi(string &s)
{
    string t;
    for (int i=0;i<s.length();i++)
        t.push_back(s[s.length()-i-1]);
    t.push_back('\0');
    return t;

}

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Δεν είναι απαραίτητο, μπορείς να περάσεις σαν όρισμα έναν άλλο πίνακα και να γράφεις το output εκεί. Χρειάζεται ένα επιπλέον όρισμα για το μέγεθος του output βέβαια, ώστε να γίνονται οι απαραίτητοι έλεγχοι.

Με malloc() όμως είσαι συνεπής με το πλήθος ορισμάτων που έδωσε για την atoi() αλλά χρειάζεται να κάνεις free() το παραγόμενο string όταν τελειώσεις. Όλα αυτά όμως (και τα δικά σου και τα δικά μου) νομίζω ξεφεύγουν από το scope της αρχικής ερώτησης, για αυτό κι απέφυγα να τα αναφέρω.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Έχεις δίκιο σε αυτό, δε διάβασα στο αρχικό ποστ ότι πρέπει να παίρνει μόνο ένα όρισμα η συνάρτηση.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

:lol:

 

"Λαμόγιο", "επικίνδυνος" ... πάντως σίγουρα όχι νορμάλ :lol:

 

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Ειδα όλες τις απαντήσεις σας.

Σας ευχαριστώ και θα τις δώ μετα για να φτιάξω μια ολοκληρομένη λύση.

 

Γιατί λέτε τον καθηγητή λαμόγιο? χαχαχα

Τι ειναι η atoi()  δηλαδή;

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

Εγγραφείτε για έναν νέο λογαριασμό

Σύνδεση

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

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

Χρήσιμες πληροφορίες

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.