Projekt - program wspomagający naukę zapisu nutowego

0

Witam,
Dostałem zadanie na projekt, aby napisać program wspomagający naukę zapisu nutowego.
Programowanie mam od początku października, więc jestem w tym stosunkowo zielony.
Nie chcę tutaj gotowego rozwiązania, bo nie chodzi mi głównie o to, żeby zaliczyć projekt, ale żeby się czegoś nauczyć.
Adres do zadania zamieściłem w załączniku.

W zadaniu jest wzmianka, żeby wyświetlać nuty o wylosowanej wysokości, czyli trzeba losować od 1 do 7 (nuty c, d, e, f, g, a, h). Nie wiem, czy wylosowana ma być tylko wysokość pierwszej nuty, czy każdej nuty. Po każdej odpowiedzi nuty się przesuwają w lewo. Ogólnie trzeba wylosować 10 nut, gdzie każdą użytkownik musi odgadnąć.

Nie wiem jak to zrobić z plikiem tekstowym. Czy to ma być jeden plik z 10 nutami, ale raczej nie. Może to ma być aż 7 plików tekstowych, każdy z inną nutką? I wtedy po wylosowaniu określonego numerka ładowany jest określony plik tekstowy? Czy da się wczytać do C++ powiedzmy 3 takie pliki w jeden z dwóch następujących sposobów?:

    • najpierw wczytywana jest pierwsza linijka, każdego z trzech plików,
  • potem druga linijka itd. aż do linii ostatniej
    • najpierw wczytywany jest pierwszy plik,
  • następnie wczytywany jest drugi plik, pierwsza linijka zapisywana jest od miejsca, gdzie zakończyło się wczytywanie pierwszej linijki z poprzedniego pliku, itd.
  • z trzecim plikiem podobnie.

Za wszelkie rady i wskazówki będę bardzo wdzięczny.
Pozdrawiam.

0

A po co się męczyć z jakimś tam wczytywaniem z plików, ogarnij sobie bibliotekę pdcurses i rysuj na żywca.

0

Absolutnie nie rozumiem po kiego ci te pliki, może wyjaśnij.
Nuty możesz wyświetlać tekstowo, np tak:

 O
---O----------------------------------------------
     O
-------O------------------------------------------
         O
-----------O--------------------------------------
             O
---------------O----------------------------------
                 O
-------------------O------------------------------
                     O
0

No fakt, rozświetliliście mi, bez plików tekstowych faktycznie o wiele łatwiej. Źle przeczytałem zdanie: Przykładowy rysunek pięciolinii z 3 nutami. Przeczytałem to jako: Przykładowy plik tekstowy z 3 nutami. Od piątku się zabiorę do roboty z tym i w razie problemów będę pytał ;)

0

nutki wygeneruj dowolnym programem do tego służącym, nie rysuj w paincie.

0

No dobra.
Prawie wszystko mam zrobione. Nutki wyskakują po 3 i po każdej odpowiedzi przesuwają się o 1 w lewo.
Ale jest problem. Jeśli ilość elementów w tablicy zmniejszy się z 10 do 2 albo 1 to po prostu za nimi pokazuje cały czas tą ostatnią nutkę.
W pętli, która rysuje i sprawdza czy liczba elementów jest większa od 3 mam wszystko ok zrobione, za nią mam IFa, który dla 2 elementów rysuje 2 nutki i kolejnego, który dla 1 nutki rysuje 1 nutkę, ale rysuje ją cały czas. Nie wiem co wpisać, aby opuścić tą funkcję. Chciałbym, aby program po wykonaniu tej instrukcji warunkowej przeszedł w określone miejsce w mainie, ale nie wiem jak się do tego zabrać. Próbowałem przez goto to zrobić, ale z funkcji nie czyta chyba etykiety w mainie.
Da się to jakoś zrobić? Może wpisać goto main etykieta albo coś podobnego?

0

"... i sprawdza czy liczba elementów jest większa od 3 ..." - Jak sprawdzasz?

0

Mam funkcję quiz i w niej mam tak:

if (MAX>0) { // MAX - liczba elementów tablicy
while(MAX>=3)
{
...
}
if (MAX==2)
{
...
}
if (MAX==1)
{
...
return -1;
}
}
return -1;

 

Dobra z tym już sobie poradziłem ;) drobna korekta, przeanalizowanie kodu na spokojnie pomogły. Wszystko jest prawie ok. Póki co jeśli zostają 2 nutki to są tylko 2 wyświetlone, jeśli jedna do jedna jest wyświetlona, ale jak są 2 nutki i dam błędną odpowiedź to od razu mi wszystko znika ;/ podobnie przy 1 nutce, nie pyta ponownie o te nutki, ale postaram się z tym uporać ;)

0

Mam jeszcze jedno pytanko dotyczące programu.
Wszystko działa jak należy. Pierwsza wersja programu zajęła 350linijek kodu, zająłem się optymalizacją (rysowanie nutek w pętli, sprawdzanie poprawności w pętli) i liczba linijek zmniejszyła się do 200.
Dziś na wykładzie znowu myślałem o programie i stwierdziłem, że nie mam zabezpieczeń dotyczących wpisywania tylko małych literek nut.
Jeśli użytkownik wpisze dużą literkę to odpowiedź zostanie zaliczona jako błędna, a tego chciałbym uniknąć. Wczytywanie będę miał w pętli, jeśli użytkownik wpisze coś poza literami c,d,e,f,g,a,h to zapyta powtórnie, ale jak zamienić wczytaną duża literę na małą?
Próbowałem zastosować instrukcję tolower(), ale dalej program działa niepoprawnie.
Mam coś takiego w programie:

 
char nuta;
cout << "Podaj nazwe nuty: ";
cin >> nuta;
nuta=tolower(nuta);
sprawdz(parametry funkcji);

Da się to zrobić w jakiś inny sposób? Mógłbym w sumie rozwinąć funkcję sprawdzania, bo póki co mam sprawdzanie dla małych liter i mam tam zadeklarowaną tablicę znaków i jest sprawdzane w pętli, mógłbym dodać kolejny warunek jeśli jest równe c lub równe C i też będzie dobrze, ale zastanawiam się czy da się bez tego ;)

1
if(strchr("cdefgah",nuta)) cout<<"poprawna nuta"<<endl;
0

Nie bardzo rozumiem sens tej instrukcji. Chyba nie bardzo mi się ona przyda, bo dla sprawdzenia mam osobną funkcję i potem ona odwołuje się do kolejnych instrukcji. Chyba jednak zrobię za pomocą 2 tablic znaków z dużymi i małymi literami.
Nie bardzo działa mi pętla, która powoduje, żeby program wczytywał tylko litery c,d,e,f,g,a,h.

while (nuta=='c' && nuta=='d' && nuta=='e' && nuta=='f' && nuta=='g' && nuta=='a' && nuta=='h')
     {
     cin >> nuta;
     }
while (nuta!='c' && nuta!='d' && nuta!='e' && nuta!='f' && nuta!='g' && nuta!='a' && nuta!='h') 
     {
     cin >> nuta;
     }

Obydwie nie działają.

1
while((cin>>nuta)&&(!strchr("cdefgah",nuta=tolower(nuta)))) {}
0

Ale do tego musiałbym dla zmiennej nuta dać typ string?

1

Za 50 minut które czekałeś na odpowiedź dał byś rady sprawdzić wszystkie możliwe typy JUŻ istniejące w C++.

0

Dzięki Ci bardzo dobry, człowieku, nie wiem czemu spytałem czy ma być tak, czy inaczej, zamiast najpierw wypróbować to w programie ;) Wystarczyło wkleić to zamiast mojego cin>>nuta i wszystko działa jak należy ;) Dziękuję raz jeszcze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1