RISOLTO Ordine parole di una stringa al contrario

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
Inverto prima tutta la stringa e dopo inverto parola per parola

Per esempio se S vale "Ciao Bro"
Viene invertita e diventa "orB oaiC"
In seguito viene invertita ogni parola e diventa "Bro Ciao"


Scusa ma non capisco, il problema chiede di invertire l’ordine delle parole, mentre tu inverti poi anche i caratteri di ogni parola.
Mi sta sfuggendo qualcosa?
 
Ho capito quello che fai, ma il testo del problema è scrivere una “funzione che dato un array di char S inverta l'ordine delle parole”.
Per me significa che la stringa “uno due tre” diventa “tre due uno”
 
Esattamente.
Infatti "Ciao Bro" diventa "Bro Ciao" come nell'esempio
Ho capito quello che fai, ma il testo del problema è scrivere una “funzione che dato un array di char S inverta l'ordine delle parole”.
Per me significa che la stringa “uno due tre” diventa “tre due uno”
 
Quindi perché inverti due volte? Che motivo c’è?
Crei una nuova stringa, vuota.
Trovi l’ultima parola nella stringa originale , la appendi nella nuova stringa e la cancelli dalla vecchia, ripeti finché la stringa originale è vuota, lo puoi fare perfino ricorsivamente.
 
Sisi, l'idea generale era di farlo con due array di char perchè lo richiedeva il problema.
Per semplificare giro prima tutta la stringa e dopo giro i singoli caratteri.
In realtà si potrebbe fare con un solo ciclo for che non manipola la stringa ma la stampa soltanto, però volevo farlo io così.
Per quanto riguarda la ricorsione non sono molto ferrato quindi vorrei prima studiarla e poi iniziare con la dp.

Quindi perché inverti due volte? Che motivo c’è?
Crei una nuova stringa, vuota.
Trovi l’ultima parola nella stringa originale , la appendi nella nuova stringa e la cancelli dalla vecchia, ripeti finché la stringa originale è vuota, lo puoi fare perfino ricorsivamente.
 
non avevo altro da fare e l'ho fatta per passare il tempo lol
Se sei curioso di vedere questa è una possibile versione recursiva
C++:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;

void RecursivePrint(string S)
{
    if (S.empty()) { return; }//END RECURSION CONDITION

    auto first = S.end();
    auto last = S.end() - 1;

    while (last != S.begin() && !isspace(*last)) { last--; }

    if (isspace(*last))
        cout << string(last + 1, first) << " ";//move space to the right
    else
        cout << string(last, first);//no space to move (last == begin())

    RecursivePrint(string(S.begin(), last));
}


int main()
{
    string S = "always pass on what you have learned";
    RecursivePrint(S);
}
 
Ultima modifica:
non avevo altro da fare e l'ho fatta per passare il tempo lol
Se sei curioso di vedere questa è una possibile versione recursiva
C++:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;

void RecursivePrint(string S)
{
    if (S.empty()) { return; }//END RECURSION CONDITION

    auto first = S.end();
    auto last = S.end() - 1;

    while (last != S.begin() && !isspace(*last)) { last--; }

    if (isspace(*last))
        cout << string(last + 1, first) << " ";//move space to the right
    else
        cout << string(last, first);//no space to move (last == begin())

    RecursivePrint(string(S.begin(), last));
}


int main()
{
    string S = "always pass on what you have learned";
    RecursivePrint(S);
}

Grazie mille dell'aiuto e della disponibilità!!
Comunque sottoponendo al sistema di auto correzione mi da questo errore per un task --> "Execution killed with signal 9 (could be triggered by violating memory limits)"
Purtroppo non mi è dato sapere quale task!
 
Sono perplesso, io l'ho compilato in Visual Studio con flag /W4 e /WX e non ha trovato nessuno problema...
Qualcuno ha idea del motivo?

Magari perchè manca "return 0;" in main()? Penso che il compiler usato da visual studio lo inserisca in automatico
Non è che stai usando tools datati?
--- i due messaggi sono stati uniti ---
a questo link https://forum.olinfo.it/t/ois-threshold-execution-killed-with-signal-9/4941 qualcuno dice "“Signal 9” significa che stai usando troppa memoria. "
Non so con che programma/compiler...
 
Ultima modifica:
Il compiler è un CMS automatico. Dopo provo con il return 0 ma non penso sia quello il problema
Sono perplesso, io l'ho compilato in Visual Studio con flag /W4 e /WX e non ha trovato nessuno problema...
Qualcuno ha idea del motivo?

Magari perchè manca "return 0;" in main()? Penso che il compiler usato da visual studio lo inserisca in automatico
Non è che stai usando tools datati?
--- i due messaggi sono stati uniti ---
a questo link https://forum.olinfo.it/t/ois-threshold-execution-killed-with-signal-9/4941 qualcuno dice "“Signal 9” significa che stai usando troppa memoria. "
Non so con che programma/compiler...

Inviato da SNE-LX1 tramite App ufficiale di Tom\'s Hardware Italia Forum
 
suggerisco di passare a tools migliori ;)
Quello che ho scritto è valido c++ e non c'è un valido motivo per cui tu non possa scrivere lo stesso codice
(comunque lo puoi provare su qualsiasi compiler c++ online)
 
Il cms che sto usando è quello usato per la correzione delle olimpiadi di informatica italiane.
Al massimo posso provare a postare il codice sul loro forum e vedere cosa mi dicono
suggerisco di passare a tools migliori ;)
Quello che ho scritto è valido c++ e non c'è un valido motivo per cui tu non possa scrivere lo stesso codice
(comunque lo puoi provare su qualsiasi compiler c++ online)

Inviato da SNE-LX1 tramite App ufficiale di Tom\'s Hardware Italia Forum
 
bhe leggendo in quel forum è chiaro che questo signal 9 significa che occupi troppa memoria, il che non stupisce perchè le funzioni recursive non ritornano fino a che non raggiungono il fondo della recursione e son note per poter causare stackoverflow se vanno avanti troppo al lungo, e credo generalmente evitate in favore di un loop, ma ciò non significa che tu non debba studiarne il funzionamento per via delle limitazioni di memoria arbitrarie imposte da quel CMS.
Ti consiglio di scaricare un tool che ti permetta di sperimentare liberamente (Visual Studio è quello che uso io), ripeto il codice è valido e non c'è un buon motivo per non poterlo eseguire per qualcuno che sta imparando a programmare.
 
Ma certo, infatti studierò quel codice.
Vorrei solo capire come mai mi da quell'errore
bhe leggendo in quel forum è chiaro che questo signal 9 significa che occupi troppa memoria, il che non stupisce perchè le funzioni recursive non ritornano fino a che non raggiungono il fondo della recursione e son note per poter causare stackoverflow se vanno avanti troppo al lungo, e credo generalmente evitate in favore di un loop, ma ciò non significa che tu non debba studiarne il funzionamento per via delle limitazioni di memoria arbitrarie imposte da quel CMS.
Ti consiglio di scaricare un tool che ti permetta di sperimentare liberamente (Visual Studio è quello che uso io), ripeto il codice è valido e non c'è un buon motivo per non poterlo eseguire per qualcuno che sta imparando a programmare.

Inviato da SNE-LX1 tramite App ufficiale di Tom\'s Hardware Italia Forum
 
Ti parla uno che ha partecipato alle olimpiadi nazionali.

Semplicemente è necessario passare ad una soluzione iterativa e/o con complessità minore.
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top