PDA

Visualizza la versione completa : [C++]Problema programma vettori...


s1m0k96
03-02-2010, 18:45
Ciao a tutti.
Voorei chiedervi una cosa...
io devo fare un programma che calcola la tonalità di una scala dato il numero di diesis in chiave...
il codice fino ad ora è questo:


#include <stdio.h>
#include <iostream.h>

int main()
{
int risposta,ndc;
char scala[7] = {'Do', 'Re','Mi', 'Fa', 'Sol', 'La', 'Si'};
char tonal;



cout << "=======================================" << endl;
cout << " !!!Creato da S1M0K!!! " << endl;
cout << "=======================================" << endl;
cout << "1)Calcola la tonalità" << endl;
cout << "2)Calcola i diesis in chiave" << endl;
cout << "3)Calcola relativa minore" << endl;
cout << "4)Esecuzione scale completa" << endl;
cout << "5)Uscita" << endl;

switch (risposta){

case 1:
goto tonalita;
break;
case 2:

break;
case 3:

break;
case 4:

break;
case 5:
cout << "Ciao Ciao!!!" << endl;
system("PAUSE");
break;
default:
cout << "Ciao Ciao!!!" << endl;
system("PAUSE");
break; }

tonalita:
cout << "Inserisci il numero dei diesis in chiave: ";
cin >> ndc;
tonal = scala[ndc + 1];
cout << "la tonalità è " << tonal << endl;

system("PAUSE");
return 0;
}


Il problema è che se eseguo il programma il risultato al posto di essere una nota dichiarata nel vettore scala è una lettera soltanto...
sapete dirmi dov'è l'errore???
grazie in anticipo...

YuYevon
03-02-2010, 19:03
Mi meraviglio che il compilatore non ti segnali errori... questa inizializzazione



char scala[7] = {'Do', 'Re','Mi', 'Fa', 'Sol', 'La', 'Si'};


non è corretta perché gli apici singoli individuano caratteri singoli... devi utilizzare delle stringhe oppure se hai bisogno dei caratteri singoli ricorri alla notazione anglosassone per le note.

gianvituzzi
03-02-2010, 19:04
prova a fare:



char scala[] = {"Do", "Re","Mi", "Fa", "Sol", "La", "Si"};

MItaly
03-02-2010, 19:04
Hai dichiarato scala come vettore di caratteri e tonal come singolo carattere, difficilmente potrai ottenere più di un carattere per volta...

P.S.: c'è gente che quando vede dei goto stacca la testa dell'autore del codice a morsi. Io non sono a questi livelli, ma ci vado vicino; per cui, fai sparire quel goto e separa il codice delle varie funzionalità del programma in funzioni separate.

YuYevon
03-02-2010, 19:07
Originariamente inviato da gianvituzzi
prova a fare:



char scala[] = {"Do", "Re","Mi", "Fa", "Sol", "La", "Si"};


Direi



const char *scala[] = {"Do", "Re","Mi", "Fa", "Sol", "La", "Si"};




P.S.: c'è gente che quando vede dei goto stacca la testa dell'autore del codice a morsi. Io non sono a questi livelli, ma ci vado vicino; per cui, fai sparire quel goto e separa il codice delle varie funzionalità del programma in funzioni separate.


Neanche io sono a quei livelli ma concordo, tra l'altro in quel caso è pure inutile... anche i vecchi header file con estensione .h sarebbero da eliminare :)

MItaly
03-02-2010, 19:15
Azz, mi erano sfuggiti...

@s1m0k96: sostituisci anche iostream.h con iostream e aggiungi subito dopo


using namespace std;

Inoltre non c'è motivo per includere stdio.h. Parlando di good pratices, poi, sarebbe meglio evitare quella chiamata a system (che peraltro necessiterebbe dell'inclusione di <cstdlib>), rimpiazzandola con


cout<<"Premi Invio per continuare... ";
cin.sync();
cin.ignore();
.

s1m0k96
03-02-2010, 21:46
Grazie mille a tutti...
scusate per gli errori ma sono alle prime armi...
comunque volevo chiedervi una cosa,come si possono sostituire i goto???
potete postarmi tipo un codice di esempio???
grazie mille a tutti

P.S. mi segnala un errore a questa riga di codice:


tonal = scala[ndc] + 1;


invalid conversion from 'cons char*' to 'char'
como mai?

YuYevon
03-02-2010, 22:07
La modifica che ti suggerivamo era soltanto per utilizzare un vettore con "do", "re", "mi"... per il resto non è affatto detto che il programma funzioni, devi rivedere il resto. Io sinceramente non ho ben capito cosa tu voglia fare, ma a leggere il codice credo ti basti sostituire



cout << "Inserisci il numero dei diesis in chiave: ";
cin >> ndc;
tonal = scala[ndc + 1];
cout << "la tonalità è " << tonal << endl;


semplicemente con



cout << "Inserisci il numero dei diesis in chiave: ";
cin >> ndc;
cout << "la tonalità è " << scala[ndc + 1] << endl;


Per quanto riguarda goto, in quel caso puoi semplicemente non usarlo, visto che è inutile. In generale non c'è una maniera standard per rimpiazzarli, dipende dai casi, basta conoscere bene come funzionano i cicli iterativi e i costrutti condizionali.

Tra l'altro, dopo quel menù iniziale ci va un'istruzione di input su risposta, altrimenti non ha molto senso.

s1m0k96
03-02-2010, 22:57
Cavolo il prog si avvia ma nn mi da il giusto risultato...
in pratica io volevo fare un prog che dati i diesis in chiave (es. 2[fa,do]) lui calcola la tonalità aumentando di uno ma nn nella scala dei # ma nella scala delle note normali (do,re,mi,fa,...)
e quindi dovrebbe venire re ma nn viene!!!

Loading