Beepmachine Problem



  • Guten Tag,

    ich habe ein Problem. Das Programm soll nach Eingabe von maximal 40 Zahlen diese als "Beeps" mit einer Frequenz, die je nach Zahl (1-9) anders ist, ausgeben. Die Fälle sind in einer switch-case Anweisung definiert.

    Das Programm funkioniert noch nicht und ist sicher optimierungsfähig.
    Wie kann ich beispielsweise feststellen, wie viele Zahlen eingegen wurden sind, dass nicht so viele Zahlen "abgespielt" werden, wie das Array groß ist?

    mfG
    Phisherman

    #include <iostream>
    #include <conio.h>
    #include <windows.h>
    
    using namespace std;
    
    int main()
    {
        char eingabe[40], a=0;
        cout << "Geben Sie maximal 40 Zahlen ein (ohne Leerzeichen): " << std::flush;
        std::cin.getline(eingabe, sizeof(eingabe)); 
    
        while ( a <= sizeof(eingabe) )
            {
             switch (eingabe[a])
                     {
                      case 0:
                                {
                                 cout<<"0";
                                 Beep(1000,200);
                                 break;
                                }
                      case 1:
                                {
                                 cout<<"1";
                                 Beep(2000,200);
                                 break;
                                }
                      case 2:
                                {
                                 cout<<"2";
                                 Beep(3000,200);
                                 break;
                                }
                      case 3:
                                {
                                 cout<<"3";
                                 Beep(4000,200);
                                 break;
                                }
                      case 4:
                                {
                                 cout<<"4";
                                 Beep(5000,200);
                                 break;
                                }
                      case 5:
                                {
                                 cout<<"5";
                                 Beep(6000,200);
                                 break;
                                }
                      case 6:
                                {
                                 cout<<"6";
                                 Beep(7000,200);
                                 break;
                                }
                      case 7:
                                {
                                 cout<<"7";
                                 Beep(8000,200);
                                 break;
                                }
                      case 8:
                                {
                                 cout<<"8";
                                 Beep(9000,200);
                                 break;
                                }
                      case 9:
                                {
                                 cout<<"9";
                                 Beep(10000,200);
                                 break;
                                }
                     }
             a++;
            }
        getch();
    }
    


  • std::string
    und op>>:

    #include <iostream>
    #include <string>
    
    int main()
    {
      std::string eingabe;
      std::cin >> eingabe;
    
      std::cout << "Anzahl: " << eingabe.length();
      for(std::string::const_iterator i(eingabe.begin()), e(eingabe.end()); i != e; ++i)
      {
        std::cout << *i << " ";
      }
    
      std::cout << std::endl;
    }
    

    siehe auch:
    http://www.cplusplus.com/reference/

    bb



  • So funktionierts und die Eingabe darf aus mehr als 40 Zeichen bestehen:

    #include <iostream>
    #include <string>
    #include <windows.h>
    #include <conio.h>
    
    int main()
    {
    	std::string eingabe;
    
    	std::getline(std::cin, eingabe);
    
    	for (unsigned int i = 0; i < eingabe.length(); ++i)
    	{
    		switch (eingabe[i])
    		{
    			case '0':
    				Beep(1000,200); 
    				break;
    
    			case '1':
    				Beep(2000,200); 
    				break;
    
    			case '2':
    				Beep(3000,200); 
    				break;
    
    			case '3':
    				Beep(4000,200); 
    				break;
    
    			case '4':
    				Beep(5000,200); 
    				break;
    
    			case '5':
    				Beep(6000,200); 
    				break;
    
    			case '6':
    				Beep(7000,200); 
    				break;
    
    			case '7':
    				Beep(8000,200); 
    				break;
    
    			case '8':
    				Beep(9000,200); 
    				break;
    
    			case '9':
    				Beep(10000,200); 
    				break;
    		}
    
    		std::cout << eingabe[i];
    	}
    
    	getch();
    
    	return 0;
    }
    


  • Beep( (eingabe[i]+1-'0')*1000, 200 );
    

    😛



  • unskilled schrieb:

    Beep( (eingabe[i]+1-'0')*1000, 200 );
    

    😛

    was bringt den das -'0' ????



  • Das - '0' entspricht - 48...
    Siehe ASCII Zeichensatz...
    Das führt einfach dazu dass du eine Zahl zwischen 0 und 9 rauskriegst und nicht zwischen '0' und '9'.



  • Schlag mal in der ASCII-Tabelle nach. Der Wert des ASCII-Zeichens minus dem Wert der 0 entspricht der echten Zahl. Eine einfache Char-Integer-Konvertierung.



  • Wenn ich das Programm ein paar Mal hintereinander laufen lasse (funkioniert einwandfrei, danke euch), überfüllt sich mein Arbeitsspeicher. Wie kann ich den Buffer wieder leeren?



  • Phisherman schrieb:

    Wenn ich das Programm ein paar Mal hintereinander laufen lasse (funkioniert einwandfrei, danke euch), überfüllt sich mein Arbeitsspeicher. Wie kann ich den Buffer wieder leeren?

    häh?
    es gibt keine memory-leaks in dem gezeigten stück...
    vll hast du dich falsch ausgedrückt - versuch noch mal zu beschreiben, was du meinst^^



  • OK.

    Wenn ich die Applikation ein paar Mal nacheinander ausgeführt habe, läuft der RAM voll. Im Ressourcenmanager nutzt "audiodg.exe" fast die gesamte Kapazität des Arbeitsspeichers aus, bis der PC sehr träge wird. Je öfter ich die Applikation ausführe, desto mehr Speicher wird belegt. Das Betriebssystem ist Windows 7. An der Hardware liegts sicherlich nicht. So ein primitives Programm sollte auch mit der lahmsten CPU korrekt ausgeführt werden. :p



  • Phisherman schrieb:

    ...

    Jopp - das sollte nicht passieren - unabhängig von hardware etc.

    Zeig mal deinen kompletten Quelltext, bitte^^

    Bis später ;o)



  • Das Programm auch beenden!!!



  • Natürlich beende ich das Programm, bevor ich es neustarte. 😉

    So sieht das Programm aus. Keine großartigen Änderungen:

    //Beepmachine C-Dur
    
    #include <iostream>
    #include <string>
    #include <windows.h>
    #include <conio.h>
    
    using namespace std;
    
    int main()
    {
        std::string eingabe;
    
        std::cout<<"Gebe maximal "<<UINT_MAX<<" Zahlen ein: ";
    
        std::getline(std::cin, eingabe);
    
        cout<<endl;
    
        for (unsigned int i = 0; i < eingabe.length(); ++i)
           {
    
                               if (eingabe[i] == 1)
             Beep (1200, 200);
    
            switch (eingabe[i])
            {
             case '0': //Pause
                  {
                   Sleep(200);
                   break;
                  }
             case '1': //C6
                  {
                   Beep(1046, 200);
                   break;
                  }
             case '2': //D6
                  {
                   Beep(1174, 200);
                   break;
                  }
             case '3': //E6
                  {
                   Beep(1318, 200);
                   break;
                  }
             case '4': //F6
                  {
                   Beep(1396, 200);
                   break;
                  }
             case '5': //G6
                  {
                   Beep(1567, 200);
                   break;
                  }
             case '6': //A6
                  {
                   Beep(1760, 200);
                   break;
                  }
             case '7': //H6
                  {
                   Beep(1975, 200);
                   break;
                  }
             case '8': //C7
                  {
                   Beep(2093, 200);
                   break;
                  }
             case '9': //D7
                  {
                   Beep(2349, 200);
                   break;
                  }
           }
          }
        cout<<endl<<endl<<"Adios!";
        Sleep(1500);
    }
    


  • dort hast du auf jeden fall keine memory-leaks drin.

    std::cout<<"Gebe maximal "<<UINT_MAX<<" Zahlen ein: ";
        //...
        for (unsigned int i = 0; i < eingabe.length(); ++i)
        {
            /*...*/
        }
    

    du hast nen header vergessen:
    #include <climits>
    (die c++ variante wäre übrigens:
    `#include <limits>

    std::numeric_limits<unsigned int>::max()bzw. (richtiger:)std::numeric_limitsstd::string::size_type::max()` )

    eigtl nimmt man hier:

    std::cout << "gebe max." << eingabe.max_size() << " Zahlen ein:";
    //...
    
    for(std::string::size_type i(0); i != eingabe.size(); ++i)
    {
    /*...*/
    }
    

    und was machst du hier:

    { 
    
                               if (eingabe[i] == 1) 
             Beep (1200, 200);
    

    ?
    (mal davon abgesehen, dass die formatierung hier ekelhaft ist^^)

    das riesige switch würd ich auslagern...
    void gib_ton_aus(char ton) - ich würde statt char auch noch nen enum bzw. ne wrapperklasse zw enum und char nehmen, aber jedenfalls würde ich das switch aus der for-schleife raushaben wollen ;o)

    bb



  • Danke für die Antwort!

    Upps, da hab ich wohl ein Teil Code noch nicht geändert.^^ Das mit dem if sollte dort nicht stehen.
    Stimmt, die Headerdatei limits.h habe ich vergessen. Wieso funktioniert es trotzdem?

    Enumerationen und Klassen kenne ich noch nicht. Void auch nicht.



  • kiddieskripter, lern lieber mal void, als deine zeit mit unnötigen apllikationen zu verschwenden.



  • Wie Lang hast du dafür gebraucht wenn ich mal fragen darf ?



  • Was meinst du? 😉



  • Tim06TR schrieb:

    Wie Lang hast du dafür gebraucht wenn ich mal fragen darf ?

    Sei nicht so arrogant.



  • Ich stehe grad aufm Schlauch. Von was redet ihr?


Anmelden zum Antworten