- 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
- 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
To 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 plikwater.c
w swoim ~/workspace/pset1
. Program powinien zliczać, ile butelek wody zużyto na prysznic w zależności od czasu. To jest:
- Program pyta użytkownika o liczbę minut spędzonych pod prysznicem
- Użytkownik wprowadza dodatnią liczbę całkowitą
- 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 water
działa program napisany przez obsługę kursu, uruchom komendę:
~cs50/pset1/water
Zadanie 2. Mario jest z nami!
Czy 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 plikmario.c
w 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ę
Na 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 plikgreedy.c
w swoim katalogu ~/workspace/pset1
. Biorąc pod uwagę: monety o nominałach 25, 10, 5, 1 cent Program powinien:
- Zapytaj użytkownika, ile reszty ma rozdać
- Oblicz minimalną liczbę monet, za pomocą których możesz to zrobić
GetFloat
z biblioteki CS50, a printf
do 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 GetFloat
nie 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 float
na 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 check50
wpisz 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
-
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
name
jest nazwa pliku zadania. -
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
- Gdy aplikacje będą gotowe, zaloguj się do CS50 IDE.
- 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.
- Powtórz dla wody.c.
- Powtórz dla mario.c.
- Powtórz dla greed.c.
- W osobnej karcie lub oknie zaloguj się do CS50 Submit .
- Kliknij opcję Prześlij w lewym dolnym rogu okna.
- W wyświetlonym oknie w obszarze Problem Set 1 kliknij opcję Prześlij nowe zgłoszenie.
- W wyświetlonym oknie kliknij Dodaj pliki…. Powinno pojawić się okno o nazwie Otwórz pliki.
- 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.
- Kliknij ponownie opcję Dodaj pliki..., a okno Otwórz pliki pojawi się ponownie.
- Teraz w ten sam sposób znajdź plik water.c. Kliknij na niego, a następnie kliknij Otwórz (lub „Otwórz”).
- Teraz znajdź mario.c. A także kliknij i otwórz w ten sam sposób.
- Wszystko jest takie samo z plikiem greedy.c.
- Kliknij Rozpocznij przesyłanie, aby rozpocząć przesyłanie plików na serwery CS50.
- 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.
-
-
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.
- 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).
Zasób kodu:
-
Wykład trzeci
-
Wykład czwarty
GO TO FULL VERSION