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

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


epir21

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

Καλησπέρα.

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

Να γραφτεί συναρτηση 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).

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

 

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

Καλησπέρα.

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

Να γραφτεί συναρτηση 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]
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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;
}
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

Καλησπέρα.

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

 

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

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

 

Έχεις ιδέα;

Επεξ/σία από epir21
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

...

Αλλα δεν πιστεύω στην σχολή να μας εξετάζουν αν ξέρουμε τις συναρτήσεις της 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).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλησπέρα.

παπί κατι παρόμοιο ειχα δοκιμάσει και εγώ.έτρεξα το δικό σου αλλα πάλι δεν μου το εκύπωσε στην 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;

}
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

:lol:

 

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

 

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

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