PDA

View Full Version : [C++] Switch e la sua "espressione"


stohuman
18-01-2013, 06:46
Premetto che compilo ancora col vecchio Dev.. ormai obsoleto e non piu aggiornato.. col costrutto switch è possibile mettere una stringa nell'espressione?

C'ho provato con string ma allo switch non piace questa variabile.. ho fatto un tentativo da niubbo pure con un vettore di caratteri :stordita: :stordita: :stordita:

Ho provato pure con la cascatina di if else-if, ma non mi attira tanto l'idea...

vendettaaaaa
18-01-2013, 07:10
Non si possono usare string nello Switch. Solo valori integrali o convertibili ad un tale valore (come i char).
Nel C# invece (e spero anche in altri linguaggi) lo Switch prende anche le stringhe, se ti può interessare.

stohuman
18-01-2013, 07:46
Interessante. Mhh no, C# non fa per me.. tutti i linguaggi propensi all'OOP piu del C e del C++ non sono quello che cerco.

In C alla fine "tutto" si puo fare, però bisogna fare giri mooolto larghi :D e bisogna essere molto masochisti :/

vendettaaaaa
18-01-2013, 08:19
Come vuoi tu o_O
Non ti stavo proponendo di passare al C# cmq, era giusto una informazione.

Mettiu_
18-01-2013, 08:54
Nel C# invece (e spero anche in altri linguaggi) lo Switch prende anche le stringhe, se ti può interessare.

Si può fare anche in Java, ma solo dalla versione 1.7 in poi (se non erro).

stohuman
18-01-2013, 08:56
Ora non so come sia strutturato completamente il C#, l'ho visto su un po di tutorial su youtube. E' ottimo per chi vuole fare programmi che prendano piede velocemente, però non sono multi piattaforma e sono piuttosto lentini.. vero peccato.

Ma forse un giorno ci passerò anch'io per questi linguaggi.

stohuman
18-01-2013, 09:00
Si può fare anche in Java, ma solo dalla versione 1.7 in poi (se non erro).

Non proprio, ma java è leggermente avanti..
http://alefranz.net/it/programmers-tips/java-switch-case-su-string/

EDIT: Ok errato io :D
https://gist.github.com/1112538
Sintassi ardua da capire, anche se dopo mesi di C qualcosa riesco a comprendere anche in Java

Mettiu_
18-01-2013, 09:07
Non proprio, ma java è leggermente avanti..
http://alefranz.net/it/programmers-tips/java-switch-case-su-string/

EDIT: Ok errato io :D
https://gist.github.com/1112538
Sintassi ardua da capire, anche se dopo mesi di C qualcosa riesco a comprendere anche in Java

Ricordavo bene. Se parliamo di stringhe (cioè fare qualcosa tipo case "pippo"), puoi farlo solo da Java 7 in poi. Compilare per credere...

http://stackoverflow.com/questions/338206/switch-statement-with-strings-in-java

http://www.theserverside.com/tutorial/The-Switch-to-Java-7-Whats-New-with-Conditional-Switches

stohuman
18-01-2013, 09:14
Beh si, java è un mostro :D.. però controllando su internet (tutta roba inglese ovvio... ) forse hanno trovato una soluzione al problema..

http://stackoverflow.com/questions/4165131/c-c-switch-for-non-integers?lq=1
Tradotto:

Convertire la stringa in numero e quindi mettere i soliti...
case 1:
case 2:
e..
...ove però int equivale a una stringa.

Anche se gli occhi mi bruciano come l'inferno voglio testare sta cosa.

stohuman
18-01-2013, 09:38
Per convertire una stringa in un int ho usato la cascatina :D, però è gia piu carino visto cosi.. in piu devo ritrovare quella funzione che collega i caratteri ascii maiuscoli a quelli minuscoli.

Devo trovare un modo piu carino per convertire le stringhe però, magari con una funzioncina, convertendo e giocando con i cast sui caratteri delle stringhe..

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <ctime>
#include <conio2.h>

using namespace std;

void mainmenu(){

cout << "Uno per Funzione 1\nDue per Funzione 2\nExit per uscire dal programma ora.\n\t";

string g;
int x=0;
cin >> g;

if (g == "Uno")
x = 1;
else
if (g == "Due")
x = 2;
else
if (g == "Exit")
x = 0;
else
x = -1;

switch (x){
case 1:
cout << "Funzione 1!\n";
break;
case 2:
cout << "Funzione 2!\n";
break;
case 0:
cout << "Exit, bye!\n";
getchar();
exit(0);
default:
cout << "Comando non riconosciuto.\n";
clrscr();
mainmenu();
}

}

int main(){

mainmenu();

fflush(stdin);
cout << "Exit, bye!\n";
getchar();
}

[Kendall]
18-01-2013, 09:38
Interessante. Mhh no, C# non fa per me.. tutti i linguaggi propensi all'OOP piu del C e del C++ non sono quello che cerco.

In C alla fine "tutto" si puo fare, però bisogna fare giri mooolto larghi :D e bisogna essere molto masochisti :/

Il C di OOP non ha proprio nulla, a dire il vero.

Il discorso comunque è decisamente diverso, dal mio punto di vista.
Un linguaggio non va scelto in base alla "simpatia" verso la sua sintassi o al fatto che è più o meno performante, quanto al cosa vuoi programmare.
Se programmi su di un iDevice userai l'Objective C, su android il Java, su Windows il C# la fa sempre più da padrona, per i videogame (ma vabbè, qui si comincia ad andare su scenari parecchio avanzati) difficile affidarsi ad altro che non sia il C++ (a parte qualche caso, vedi per esempio i buoni risultati ottenuti con il C# e il framework XNA), e via discorrendo.

idoido
18-01-2013, 09:39
Ricordavo bene. Se parliamo di stringhe (cioè fare qualcosa tipo case "pippo"), puoi farlo solo da Java 7 in poi. Compilare per credere...

http://stackoverflow.com/questions/338206/switch-statement-with-strings-in-java

http://www.theserverside.com/tutorial/The-Switch-to-Java-7-Whats-New-with-Conditional-Switches
bene bene, un buon motivo per sfottere Java alla prossima occasione :fiufiu:

bellissima la risposta del tipo su stackoverlow:

Switch statements with String cases have been implemented in Java SE 7, at least 16 years after they were first requested.

[Kendall]
18-01-2013, 09:45
Per convertire una stringa in un int ho usato la cascatina :D, però è gia piu carino visto cosi.. in piu devo ritrovare quella funzione che collega i caratteri ascii maiuscoli a quelli minuscoli.

Devo trovare un modo piu carino per convertire le stringhe però, magari con una funzioncina, convertendo e giocando con i cast sui caratteri delle stringhe..


Domanda: ma per quale motivo fare tutto questo? Il case è un bel costrutto, ordinato e conciso, ma se nel C e nel C++ non è previsto l'utilizzo di stringhe non vedo perchè forzare la cosa con sistemi simili che tra l'altro aggiungono solo righe di codice.
In questi casi io andrei di if_else if_else if_ecc... , che risulta comunque estremamente leggibile e funzionale.

stohuman
18-01-2013, 09:54
;38878614']Il C di OOP non ha proprio nulla, a dire il vero.

Il discorso comunque è decisamente diverso, dal mio punto di vista.
Un linguaggio non va scelto in base alla "simpatia" verso la sua sintassi o al fatto che è più o meno performante, quanto al cosa vuoi programmare.
Se programmi su di un iDevice userai l'Objective C, su android il Java, su Windows il C# la fa sempre più da padrona, per i videogame (ma vabbè, qui si comincia ad andare su scenari parecchio avanzati) difficile affidarsi ad altro che non sia il C++ (a parte qualche caso, vedi per esempio i buoni risultati ottenuti con il C# e il framework XNA), e via discorrendo.

Lo so. Io programmo in C++ non perche mi sta simpatico... spesso e senza volerlo mi arrabbio col compilatore.
Che non abbia niente di OOP non è proprio vero, certo non mi puo venire in mente di farmi un team di 3 persone e fare photoshop o GIMP completamente in C++... difatti come dici tu, si sceglie il linguaggio in base a quello su cui si vuole programmare.
Io non credo proprio di mettermi a fare le cosi dette "App", o programmini con GUI gia pronte.

La gran parte del codice che scriverò voglio che vada sulla maggior parte dei sistemi, quindi cerco di tenermi lontano dalle chiamate e dai linguaggi troppo attaccati ai sistemi stessi, quindi anche i framework o le directX se riguarda videogameing..

Ho iniziato col C e ci continuo ora :D

stohuman
18-01-2013, 10:00
;38878659']Domanda: ma per quale motivo fare tutto questo? Il case è un bel costrutto, ordinato e conciso, ma se nel C e nel C++ non è previsto l'utilizzo di stringhe non vedo perchè forzare la cosa con sistemi simili che tra l'altro aggiungono solo righe di codice.
In questi casi io andrei di if_else if_else if_ecc... , che risulta comunque estremamente leggibile e funzionale.

L'ho detto, non mi trovo bene con gli if else in cascata, cerco di evitarli se posso.
Personalmente poi anziche scrivere sempre un numero anziche la scelta vera e propria stufa un po', sto solo facendo dei test, non dico che ora tutti devono fare come dico io.

Oltre tutto con i processori di oggi, qualche riga di codice in piu non è cosi pesante. Basta non esagerare nei punti critici, una cascata di if else e un costrutto sicuramente non faranno laggare un semplice menù.

[Kendall]
18-01-2013, 10:11
Lo so. Io programmo in C++ non perche mi sta simpatico... spesso e senza volerlo mi arrabbio col compilatore.
Che non abbia niente di OOP non è proprio vero, certo non mi puo venire in mente di farmi un team di 3 persone e fare photoshop o GIMP completamente in C++... difatti come dici tu, si sceglie il linguaggio in base a quello su cui si vuole programmare.
Io non credo proprio di mettermi a fare le cosi dette "App", o programmini con GUI gia pronte.
Io però mi riferivo al C, non al C++ (che invece implementa il paradigma OOP, seppure con un livello di astrazione inferiore ad altri linguaggi OOP puri).
Riguardo alle interfacce, infine, ormai qualsiasi programma con interfaccia utente si basa su librerie grafiche già fatte (più o meno complete).
Restando in ambito C++, librerie come QT, GTK e similari sono proprio questo.

stohuman
18-01-2013, 10:19
Diciamo che io sono per il 70% C++ e 30% C std, anche se il primo inizio è stato con il C, poi i vari tutorial alla cazzo di cane mi hanno fatto fare confusione e mi sono tirato fuori da solo studiandomi meglio le sintassi e quello che cambia tra i due linguaggi.

L'interfaccia grafica non è il mio obiettivo, per ora sto ai livelli del terminale.
Ma se dovessi scrivere un programma con una GUI lo farei ugualmente in C++, no sacrifice no victory.