Projekt - program wspomagający naukę zapisu nutowego

Projekt - program wspomagający naukę zapisu nutowego
MT
  • Rejestracja:około 14 lat
  • Ostatnio:8 miesięcy
  • Postów:25
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.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

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

Kopiuj
 O
---O----------------------------------------------
     O
-------O------------------------------------------
         O
-----------O--------------------------------------
             O
---------------O----------------------------------
                 O
-------------------O------------------------------
                     O

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
MT
  • Rejestracja:około 14 lat
  • Ostatnio:8 miesięcy
  • Postów:25
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ł ;)

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 6 godzin
0

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

MT
  • Rejestracja:około 14 lat
  • Ostatnio:8 miesięcy
  • Postów:25
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?

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
MT
  • Rejestracja:około 14 lat
  • Ostatnio:8 miesięcy
  • Postów:25
0

Mam funkcję quiz i w niej mam tak:

Kopiuj
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ć ;)

edytowany 1x, ostatnio: MartinTcV
MT
  • Rejestracja:około 14 lat
  • Ostatnio:8 miesięcy
  • Postów:25
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:

Kopiuj
 
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 ;)

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1
Kopiuj
if(strchr("cdefgah",nuta)) cout<<"poprawna nuta"<<endl;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
MT
  • Rejestracja:około 14 lat
  • Ostatnio:8 miesięcy
  • Postów:25
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.

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

Obydwie nie działają.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1
Kopiuj
while((cin>>nuta)&&(!strchr("cdefgah",nuta=tolower(nuta)))) {}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
MT
  • Rejestracja:około 14 lat
  • Ostatnio:8 miesięcy
  • Postów:25
0

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

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
MT
  • Rejestracja:około 14 lat
  • Ostatnio:8 miesięcy
  • Postów:25
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.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)