2017-04-21 4 views
0

Ich bin seit einer Weile darauf festgefahren. Ich versuche eine Zeichenfolge aus einer Datei zu lesen. Die Zeichenfolge enthält Noten (A, G, C, B usw.), auf die bestimmte Werte folgen können. Wenn beispielsweise auf eine Note "~" folgt, hat die Note ihre Dauer um 20 erhöht (A ~~ addiert 40 zur voreingestellten Dauer). Andere mögliche Eingaben: A (4) sollte die Frequenz um +4 ändern. B # sollte die Frequenz um +20 ändern.Lesezeichenkette aus der Datei

Die Eingabe würde wie folgt aussehen: B (4) ~ F # (5) ~~~ Aa

ich, indem Sie folgend begonnen, aber ich kann nicht scheinen, um herauszufinden, wie man mit jeder Frequenz zu erhöhen, zusätzliches '~' nach einer Notiz.

string a; 
for (int i = 0; i < a.length(); a++) 
{ 
    if(a.at(i) == 'C') 
    { 
     frequency = 440; 
     duration = 10; 

     if(a.at(i++) == '~') 
     { 
      frequency += 20; 
     } 
    } 
Values(frequency, duration) 

} 
+0

Bitte erwähnen Sie Ihre Anforderung klar. – sjsam

Antwort

0

Der Punkt in der Schleife, die nur überprüft, für ein '~' erreicht, wenn a.at (i) == C, und nur Tests i ++. fügen Sie innerhalb der Bedingung für == '~' eine Schleife hinzu:

if(a.at(i++) == '~'){ 
    while(a.at(i) == '~'){ 
     frequency += 20; 
     i++; 
    } 
} 
+0

Danke! Das funktioniert großartig. Meine einzige andere Frage ist, wie man die verschiedenen Werte (~, #, (4) usw.) fortlaufend ablaufen lässt, bis eine andere Note erreicht ist. Sobald die nächste Note erreicht ist, wie sollte die Funktion zurückkehren? – borchr

+0

Wenn Sie sicher davon ausgehen können, dass alle "Noten" alphabetisch sind und nur "Noten" alphabetisch sind, können Sie dazu die integrierte Funktion isalpha() verwenden. isalpha (a.at (i)) gibt true zurück, wenn der Parameter ein alphabetisches Zeichen ist. Um das zu verdeutlichen: füge die Bedingung &&! Isalpha (a.at (i)) hinzu, um deine inneren Schleifen zu verlassen, wenn du eine "Note" erreichst – hulud