JavaRush /Blog Java /Random-PL /Harvard CS50: Zadania z pierwszego tygodnia (wykłady 3 i ...
Masha
Poziom 41

Harvard CS50: Zadania z pierwszego tygodnia (wykłady 3 i 4)

Opublikowano w grupie Random-PL
Harvard CS50: Zadania w tygodniu 1 (wykłady 3 i 4) – 1Przyjaciele, podstawowe informacje teoretyczne można uzyskać z notatek z seminariów . Tam oprócz podstaw języka C podpowiada jak połączyć się ze specjalną chmurą IDE CS50 (należy to zrobić, aby uruchomić i sprawdzić zadania) oraz opisuje podstawowe niezbędne komendy Linuksa i struktury językowe. Jeżeli materiał przedstawiony na wykładzie oraz notatki dotyczące C nie są dla Ciebie wystarczające, sięgnij po inne źródła. Na przykład te wymienione na końcu tego artykułu. W temacie " Materiały dodatkowe "
  • Cele na pierwszy tydzień
  • IDECS50
  • Aktualizacja wiersza poleceń i środowiska roboczego
  • Praca w IDE
  • Cześć, c!
  • Błędy?
  • Kontrola walidacyjna: test check50
  • Podstawy C: porównanie ze Scratchem
  • Podstawowe typy danych w C
  • Biblioteki C
  • Witam ponownie C: analiza składni najprostszych programów
  • Trochę więcej o wejściach/wyjściach w C
Materiały w tym temacie:
  • Walidowane wprowadzanie danych: specjalne funkcje biblioteki cs50.h
  • Zadanie 1. Inteligentne obliczanie zużycia wody
  • Zadanie 2. Mario jest z nami!
  • Zadanie 3. Czas na zmianę
  • Jak zweryfikować kod i zdobyć oceny
  • Zasób kodu
  • dodatkowa literatura

Walidowane wprowadzanie danych: specjalne funkcje biblioteki cs50.h

Aby uczynić ten kurs wygodniejszym, opracowaliśmy specjalną bibliotekę CS50, która w szczególności posiada bardzo przydatne funkcje przetwarzania danych wprowadzanych przez użytkownika.
  • GetString()odczytuje ciąg znaków wprowadzony przez użytkownika;

  • GetInt()odczytuje wprowadzony przez użytkownika ciąg znaków i sprawdza, czy zawiera on liczbę całkowitą;

  • GetFloat()odczytuje wprowadzony przez użytkownika ciąg znaków i sprawdza, czy zawiera on liczbę zmiennoprzecinkową;

  • GetLongLong()odczytuje wprowadzony przez użytkownika ciąg znaków i sprawdza, czy zawiera on długą liczbę rzeczywistą.

Zadanie 1. Inteligentne obliczanie zużycia wody

Harvard CS50: Zadania w tygodniu 1 (wykłady 3 i 4) – 2To logiczne: im dłużej bierzesz prysznic, tym więcej wody zużywa się na ten proces. Zastanówmy się, ile? Nawet jeśli prysznic jest ledwo otwarty, wypływa z niego około 6 litrów wody na minutę. A to jest 12 butelek wody, które nosisz ze sobą do picia. Zwykle osoba bierze prysznic przez około 10 minut, w sumie do umycia potrzeba 120 półlitrowych butelek. Sporo! Utwórz plik water.cw swoim ~/workspace/pset1. Program powinien zliczać, ile butelek wody zużyto na prysznic w zależności od czasu. To jest:
  1. Program pyta użytkownika o liczbę minut spędzonych pod prysznicem
  2. Użytkownik wprowadza dodatnią liczbę całkowitą
  3. Program wyświetla ilość zużytych butelek przez użytkownika.
username:~/workspace/pset1 $ ./water
minutes: 10
bottles: 120
Dla uproszczenia tym razem założymy, że użytkownik zawsze wprowadza liczbę minut poprawnie, czyli nie sprawdzamy, czy wpisana liczba jest dodatnia i całkowita. Później nauczymy się wystawiać czeki, ale na razie to wystarczy. Aby sprawdzić czy program działa poprawnie za pomocą check50,należy wpisać w terminalu poniższą linię:
check50 2015.fall.pset1.water water.c
A jeśli chcesz zobaczyć jak waterdziała program napisany przez obsługę kursu, uruchom komendę:
~cs50/pset1/water

Zadanie 2. Mario jest z nami!

Harvard CS50: Zadania w tygodniu 1 (wykłady 3 i 4) - 3Czy znasz najsłynniejszego hydraulika na świecie? Z pomocą Nintendo fikcyjny wąsaty i lekko pulchny facet w czerwonej czapce stał się bohaterem kilku pokoleń graczy. Jeśli nie wiesz, o kim mówimy, oto link do klasycznej gry z 1985 roku : zaufaj mi, jest nadal dobra i warta sprawdzenia! Można znaleźć także wersję klasycznego Super Mario na smartfony lub emulatory offline. Potrzebujemy tego wszystkiego do ogólnego rozwoju, to niestety nie jest jeszcze zadanie ;). A zadanie jest takie. Pod koniec pierwszego poziomu Mario każdy gracz widział tę półpiramidę: Utwórz plik mario.cw swoim pliku ~/workspace/pset1. Nasz program narysuje półpiramidę podobną do tej, którą widzisz, ale bezpośrednio w konsoli, bez grafiki: każdy z bloków będzie składał się z ikony hasha (#). Nawet jeśli jeszcze nie wiesz, jak to zrobić, uwierz mi: to proste. Żeby było jeszcze ciekawiej, dodajmy do tego możliwość ustalenia wysokości półpiramidy za pomocą nieujemnej liczby całkowitej z zakresu od 0 do 23. Za wysokość piramidy na zdjęciu przyjmuje się najwyższe miejsce, czyli równa 8. Jeśli użytkownik wprowadzi liczbę niepoprawnie, należy poprosić go o ponowne zrobienie tego jeszcze raz. Następnie wygeneruj (używając printf piramidy). Pamiętaj, aby wyrównać lewy dolny róg półpiramidy z lewą krawędzią okna terminala, jak w przykładzie poniżej. Podkreślony tekst jest tym, co użytkownik wpisuje samodzielnie.
username:~/workspace/pset1 $ ./mario

height: 8
       ##
      ###
     ####
    #####
   ######
  #######
 ########
#########
Zauważ, że dwie skrajne na prawo kolumny mają tę samą wysokość. Nie warto jeszcze generować rur, chmur i samego Mario =). Przynajmniej w przypadku tego zadania. Jeżeli użytkownik wprowadził błędne dane (nie wpisał liczby lub wpisał liczbę mniejszą od jedności lub większą od 23), program powinien poprosić go o ponowne wprowadzenie danych, jak w poniższym przykładzie, gdzie podkreślony tekst jest tym, co użytkownik wprowadził z klawiatury. Aby odczytać wprowadzony ciąg, użyj GetInt. Może pomóc w sprawdzeniu, czy wprowadzone dane są nieprawidłowe, ale nie we wszystkich przypadkach.
username:~/workspace/pset1 $ ./mario
Height: -2
Height: -1
Height: foo
Retry: bar
Retry: 1
##
Aby skompilować program, wpisz w terminalu linię:
make mario
lub bardziej przejrzysta, ale dłuższa wersja:
clang -o mario mario.c -lcs50
Następnie uruchom program w celu wykonania:
./mario
Jeśli chcesz sprawdzić czy program działa poprawnie, uruchom check50:
check50 2015.fall.pset1.mario mario.c
A jeśli chcesz pobawić się wersją Mario dla asystentów kursu, wpisz następujący wiersz:
~cs50/pset1/mario

Zadanie 3. Czas na zmianę

Harvard CS50: Zadania w tygodniu 1 (wykłady 3 i 4) – 4Na naszych szerokościach geograficznych tego nie widzieliśmy, ale wydaje się, że w USA jest taka zabawka pokazana na zdjęciu: cylindry są przeznaczone na monety o różnych średnicach (i nominałach), są zwalniane za pomocą mechanizmu sprężynowego , a samo urządzenie można przypiąć do paska dziecięcej kasjery. Co się jednak stanie, jeśli ktoś zapłaci kasjerowi duży rachunek? Wyobraź sobie, ile kłopotów będzie sprawiało liczenie monet na resztę. Aby zminimalizować liczbę emitowanych monet, można zastosować tzw. algorytmy „zachłanne”. Zgodnie z definicją Narodowego Instytutu Standardów i Technologii (NIST) zawsze znajdują optymalne rozwiązanie na każdym etapie rozwiązywania problemu, zakładając, że ostateczne rozwiązanie (otrzymane z ogółu takich kroków) również będzie optymalne. Co to znaczy? Wyobraźmy sobie, że kasjer jest winien klientowi 41 centów reszty i ma przy pasku cylindry z monetami o nominałach 25, 10, 5 i 1 cent. Kasjer kierujący się „chciwym” algorytmem od razu będzie chciał wydać maksimum już w pierwszym kroku. W tym momencie optymalnym lub najlepszym rozwiązaniem byłoby przekazanie 25 pensów. 41-25 = 16. Pozostało 16 pensów do wypłaty. Oczywiście 25 pensów to za dużo, więc zostaje 10. 16-10 = 6. Teraz na tej samej zasadzie rozdajemy 5 pensów, a potem 1. Zatem kupujący otrzyma tylko cztery monety o nominałach 25, 10 , 5 i 1 pens. Okazuje się, że „chciwe” instrukcje krok po kroku dotyczące wydawania pieniędzy są optymalne nie tylko w tym przypadku, ale także w przypadku nominałów walut amerykańskich (a także Unii Europejskiej). Oznacza to, że jeśli kasjer ma wystarczającą liczbę monet dowolnego nominału, algorytm będzie działał najlepiej, czyli wyemituje minimalną liczbę monet ze wszystkich możliwych przypadków. Jaka jest zatem minimalna liczba monet, które potrzebujemy do wydania reszty? To nasze trzecie zadanie. Utwórz plik greedy.cw swoim katalogu ~/workspace/pset1. Biorąc pod uwagę: monety o nominałach 25, 10, 5, 1 cent Program powinien:
  1. Zapytaj użytkownika, ile reszty ma rozdać
  2. Oblicz minimalną liczbę monet, za pomocą których możesz to zrobić
Notatka:Do wejścia użyjemy funkcji GetFloatz biblioteki CS50, a printfdo wyjścia ze standardowej biblioteki I/O. Dodatkowo program musi sprawdzić poprawność wprowadzonych danych. Poprosiliśmy Cię o użycie GetFloat, aby umożliwić użytkownikowi wprowadzenie wartości w dolarach i centach oddzielonych kropką. Na przykład, jeśli jesteśmy winni 9,75 USD, użytkownik powinien wpisać 9,75, a nie 9,75 USD lub 975. Musisz upewnić się, że użytkownik wprowadził liczbę, która ma sens. Powiedzmy, że nieujemna; sama funkcja w tym GetFloatnie pomoże . Jeśli użytkownik wprowadzi nieprawidłowe dane, należy poprosić go o powtórzenie tego i uruchomienie programu tylko z poprawnymi danymi. Uważaj na niedokładności nieodłącznie związane z liczbami zmiennoprzecinkowymi. Na przykład 0,01 nie można bezpośrednio przedstawić jako float. Spróbuj użyć sformatowanego wyniku, na przykład z 50 miejscami po przecinku, używając poniższego kodu:
float f = 0.01;
printf("%.50f\n", f);
Nawiasem mówiąc, przed obliczeniem czegokolwiek logiczne byłoby przeliczenie całej kwoty na centy (i jednocześnie przeliczenie jej z floatna int), co pomoże uniknąć wielu błędów i trudności. Aby nasz automatyczny analizator kodu mógł poprawnie sprawdzić Twój problem, upewnij się, że ostatnia linia wyniku programu nie zawiera żadnych innych informacji poza minimalną liczbą monet: liczbą całkowitą z \n po niej (osoby uczące się JavaRush doskonale wiedzą, o czym tu mówimy =)). Poniżej znajduje się przykład tego, jak powinien wyglądać wynik Twojego programu.
username:~/workspace/pset1 $ ./greedy
O hai! How much change is owed?
0.41
4
Ze względu na charakter liczb zmiennoprzecinkowych można zignorować zero i wpisać taką liczbę w postaci .41. Oczywiście użytkownicy chcący sprawdzić program pod kątem możliwości wprowadzenia błędnych danych w całości powinni zobaczyć coś takiego:
username:~/workspace/pset1 $ ./greedy
O hai! How much change is owed?
-0.41
How much change is owed?
-0.41
How much change is owed?
foo
Retry: 0.41
4
Bazując na tych wymaganiach i przykładzie, który widziałeś powyżej, Twój kod powinien najprawdopodobniej zawierać jakąś pętlę. Jeśli podczas testowania aplikacji zorientujesz się, że pętla się nie zatrzymuje, możesz przerwać wykonywanie programu kombinacją ctrl-c (czasami wielokrotnie). Wiesz już, jak skompilować i uruchomić program. Jeżeli chcesz sprawdzić czy Twój program działa poprawnie za pomocą narzędzia check50wpisz w terminalu poniższą linijkę:
check50 2015.fall.pset1.greedy greedy.c
A jeśli chcesz pobawić się tym programem stworzonym przez asystentów kursu, napisz następującą komendę:
~cs50/pset1/greedy

Jak zweryfikować kod i zdobyć oceny

  1. opcja 1

    Jeśli zależy Ci na sprawdzeniu poprawności kodu, a nie na uzyskaniu oceny końcowej, możesz to sprawdzić i poprawić za pomocą polecenia.

    check50 2015.fall.pset1.name name.c

    wpisane w linii terminala CS50 IDE? gdzie namejest nazwa pliku zadania.

  2. Opcja 2

    Jeśli chcesz otrzymywać oceny (w zasadzie tak samo, jak sprawdzanie 50, ale z zapamiętywaniem wyniku i wypełnianiem niektórych formularzy po angielsku, wykonaj następujące kroki:

    • Krok 1 z 2

      1. Gdy aplikacje będą gotowe, zaloguj się do CS50 IDE.
      2. W lewym górnym rogu CS50 IDE, w przeglądarce plików, a nie w oknie terminala, kliknij lewym lub prawym przyciskiem myszy plik hello.c (ten, który znajduje się w katalogu pset1) i kliknij Pobierz. Powinieneś odkryć, że przeglądarka załadowała hello.c.
      3. Powtórz dla wody.c.
      4. Powtórz dla mario.c.
      5. Powtórz dla greed.c.
      6. W osobnej karcie lub oknie zaloguj się do CS50 Submit .
      7. Kliknij opcję Prześlij w lewym dolnym rogu okna.
      8. W wyświetlonym oknie w obszarze Problem Set 1 kliknij opcję Prześlij nowe zgłoszenie.
      9. W wyświetlonym oknie kliknij Dodaj pliki…. Powinno pojawić się okno o nazwie Otwórz pliki.
      10. Przejdź do lokalizacji, w której pobrano plik hello.c. Zwykle znajduje się on w folderze Pobrane lub w folderze domyślnie przypisanym do plików do pobrania. Gdy znajdziesz plik hello.c, kliknij go raz, aby zaznaczyć, a następnie kliknij Otwórz.
      11. Kliknij ponownie opcję Dodaj pliki..., a okno Otwórz pliki pojawi się ponownie.
      12. Teraz w ten sam sposób znajdź plik water.c. Kliknij na niego, a następnie kliknij Otwórz (lub „Otwórz”).
      13. Teraz znajdź mario.c. A także kliknij i otwórz w ten sam sposób.
      14. Wszystko jest takie samo z plikiem greedy.c.
      15. Kliknij Rozpocznij przesyłanie, aby rozpocząć przesyłanie plików na serwery CS50.
      16. Na wyświetlonym ekranie zobaczysz okno oznaczone Nie wybrano pliku. Jeśli przesuniesz kursor myszy na lewą stronę ekranu, zobaczysz listę pobranych plików. Kliknij każdy z nich, aby potwierdzić zawartość każdego z nich. (Nie ma potrzeby klikania innych przycisków ani ikon). Jeśli jesteś pewien, że możesz wysłać plik do weryfikacji, uznaj, że to koniec! Jeśli chcesz ponownie samodzielnie sprawdzić swój kod lub coś naprawić, wróć do CS50 Submit i powtórz te kroki. Możesz wysłać ponownie tyle razy, ile chcesz; Oceniane będzie tylko najnowsze zgłoszenie.
  3. Krok 2 z 2 (nie jest wymagany do oceny, jeśli tak =))

    Teraz przejdź do https://www.edx.org/course/cs50s-introduction-computer-science-harvardx-cs50x , gdzie znajdziesz specjalne formularze. W nich musisz odpowiedzieć na kilka pytań teoretycznych, a następnie kliknąć pod nimi Prześlij.

Pytania oznaczone gwiazdkami są wymagane:
  • Dobra, powinienem był to przewidzieć! W kilku zdaniach, czym jest biblioteka? * (Opisz krótko, czym jest biblioteka)
  • W kilku zdaniach, jaką rolę odgrywa, #include <cs50.h> gdy piszesz to na jakimś programie? *(jaka jest rola linii #include <cs50.h> pojawiającej się na górze niektórych programów?)
  • Ile mniej więcej godzin spędziłeś nad zestawem zadań 0: Scratch?
  • Jak myślisz, ile godzin spędziłeś nad zestawem problemów 1: C?
  • Jaka jest Twoja dotychczasowa opinia na temat CS50x? *(Twoja opinia na temat CS50 w tej chwili, wybierz opcję lubię lub nie)
  • Czy poprosiłeś o pomoc kolegów z klasy lub personel za pośrednictwem grupy CS50s na Facebooku pod adresem http://www.facebook.com/groups/cs50? *(czy prosiłeś o pomoc innych uczniów lub asystentów na grupie na Facebooku)
  • Czy prosiłeś o pomoc kolegów z klasy lub pracowników za pośrednictwem Subreddita CS50s na http://www.reddit.com/r/cs50 *(czy prosiłeś o pomoc innych uczniów lub asystentów za pośrednictwem Subreddit)
  • Czy poprosiłeś o pomoc kolegów z klasy lub personel za pośrednictwem Twittera, używając @cs50 lub #cs50? *(czy prosiłeś innych uczniów lub asystentów technicznych o pomoc na Twitterze, używając @cs50 lub #cs50).
Przyjaciele, jeśli macie jakieś pytania, napiszcie je w komentarzach pod tym poradnikiem. Jeśli nie osiągnąłeś jeszcze poziomu JavaRush 5, aby otrzymać zaproszenie do informacji, zalecamy to zrobić. To nic nie kosztuje, jest ciekawe i niezbyt trudne.

Zasób kodu:

  1. Wykład trzeci

    http://cdn.cs50.net/2015/fall/lectures/1/w/src1w.zip

  2. Wykład czwarty

    http://cdn.cs50.net/2015/fall/lectures/1/f/src1f.zip

    http://cdn.cs50.net/2015/fall/lectures/1/f/src1f/

dodatkowa literatura

http://cpp.com.ru/kr_cbook - rosyjska wersja klasycznej książki o C autorstwa autorów języka - Briana Kernighana i Dennisa Ritchiego. Szeroko znany w wąskich kręgach jako K&R. Tłumaczenie nie jest jednak wydaniem najnowszym. Przeczytaj pierwsze trzy rozdziały. Będzie trochę więcej materiału, niż potrzebujesz, ale wystarczy, aby rozwiązać problemy. https://computer.howstuffworks.com/c.htm to zasób polecany przez autorów CS50. Po angielsku. Strona 1-7, 9 i 10.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION