JavaRush/Java блог/Random UA/Гарвард CS50: завдання першого тижня (лекції 3 та 4)
Masha
41 рівень

Гарвард CS50: завдання першого тижня (лекції 3 та 4)

Стаття з групи Random UA
учасників
Гарвард CS50: завдання першого тижня (лекції 3 та 4) - 1Друзі, основні теоретичні відомості ви можете отримати з конспекту семінарів . Там, крім основ С розказано, як підключитися до спеціальної хмарної IDE CS50 (це потрібно зробити для виконання та перевірки завдань), описані основні потрібні команди Linux та структури мови. Якщо вам буде недостатньо матеріалу про C, викладеного в лекції та конспекті, зверніться до інших джерел. Наприклад, до тих, що вказані наприкінці цієї статті. У топіці " Додаткові матеріали "
  • Цілі першого тижня
  • IDE CS50
  • Командний рядок та оновлення робочого середовища
  • Робота в IDE
  • Hello, C!
  • Баги?
  • Перевірка на правильність: тест check50
  • Основи С: порівняння зі Scratch
  • Основні типи даних у C
  • Бібліотеки С
  • І знову Hello C: розбір синтаксису найпростіших програм
  • Ще трохи про введення/виведення в C
Матеріали в цьому топіці:
  • Введення даних із перевіркою: спеціальні функції бібліотеки cs50.h
  • Завдання 1. Розумний підрахунок витрати води
  • Завдання 2. З нами Маріо!
  • Завдання 3. Час отримувати здачу
  • Як підтвердити правильність коду та отримати оцінки
  • Ресурс коду
  • додаткова література

Введення даних із перевіркою: спеціальні функції бібліотеки cs50.h

Для зручнішого проходження цього курсу ми розробабо спеціальну бібліотеку CS50, в якій, зокрема, є дуже корисні функції обробки даних, введених користувачем.
  • GetString()зчитує введений користувачем рядок;

  • GetInt()зчитує введений користувачем рядок та перевіряє, чи не записано в ньому ціле число;

  • GetFloat()зчитує введений користувачем рядок і перевіряє, чи не записано в ньому число з точкою, що плаває;

  • GetLongLong()зчитує введений користувачем рядок і перевіряє, чи не записано в ньому довге речове число.

Завдання 1. Розумний підрахунок витрати води

Гарвард CS50: завдання першого тижня (лекції 3 та 4) - 2Логічно: чим довше ви приймаєте душ, тим більше води йде на цей процес. Давайте прикинемо, скільки? Навіть якщо ваш душ ледь відкритий, за хвабону з нього витікає приблизно 6 літрів води. А це 12 пляшечок води, які ви носите із собою для пиття. Зазвичай людина приймає душ хвабон 10. Усього, щоб помитися, потрібно 120 півлітрових пляшок. Чимало! Створіть файл water.cу вашій директорії ~/workspace/pset1. Програма повинна підраховувати, скільки пляшок води йде на душ залежно від часу. Тобто:
  1. Програма запитує у користувача кількість хвабон, проведених у душі
  2. Користувач вводить позитивне ціле число
  3. Програма виводить на екран кількість пляшечок, витрачених користувачем.
username:~/workspace/pset1 $ ./water
minutes: 10
bottles: 120
Для простоти цього разу ми будемо вважати, що користувач завжди вводить число хвабон правильно, тобто ми не перевіряємо, чи було введено позитивне і ціле число. Пізніше ми навчимося писати перевірки, але поки що достатньо і цього. Щоб перевірити правильність виконання програми, за допомогою check50,потрібно ввести наступний рядок у терміналі:
check50 2015.fall.pset1.water water.c
А якщо ви хочете подивитися, як працює програма water, написана співробітниками курсу, виконайте наступну команду:
~cs50/pset1/water

Завдання 2. З нами Маріо!

Гарвард CS50: завдання першого тижня (лекції 3 та 4) - 3Чи знаєте ви найзнаменитішого водопровідника у світі? З легкої руки компанії Nintendo вигаданий вусатий і трохи повненький дядечко в червоній кепці став героєм для кількох поколінь геймерів. Якщо ви не знаєте, про кого мова, ось вам посилання на класичну гру 1985 року : повірте, вона все ще хороша і заслуговує на увагу! Також можна знайти варіант класичного Super Mario для смартфонів чи оффлайнових емуляторів. Все це нам потрібне для загального розвитку, це ще, на жаль, не завдання;). А завдання полягає ось у чому. Наприкінці першого рівня Mario кожен гравець бачив таку напівпірамідку: Створіть файл mario.cу вашій директорії~/workspace/pset1. Наша рограмка малюватиме напівпіраміду, подібну до тієї, що ви бачите, але прямо в консолі, без графіки: кожен з блоків складатиметься із значка хеша (#). Навіть якщо ви ще не зрозуміли, як це зробити, повірте: це просто. Щоб зробити завдання цікавішим, додамо в неї можливість задавати висоту напівпірамідки за допомогою невід'ємного цілого числа від 0 до 23. Висота пірамідки на картинці вважається у найвищому місці, тобто дорівнює 8. Якщо користувач неправильно вводить число, потрібно попросити його зробити це ще разів. Потім згенерувати (за допомогою printf пірамідку). Подбайте про те, щоб вирівняти нижній лівий кут вашої напівпіраміди по лівому краю вікна терміналу, як у прикладі нижче. Підкреслений текст — це те, що користувач самостійно вводить.
username:~/workspace/pset1 $ ./mario

height: 8
       ##
      ###
     ####
    #####
   ######
  #######
 ########
#########
Зверніть увагу, що два крайні праві стовпці мають однакову висоту. Генерувати труби, хмари і самого Маріо поки не варто. Принаймні для цього завдання. Якщо користувач ввів неправильні дані (ввів не число, чи число, яке менше одиниці чи більше, ніж 23), програма має знову попросити його ввести дані, як у прикладі внизу, де підкреслений текст — те, що вводив користувач із клавіатури. Для зчитування введеного рядка використовуйте GetInt. Вона може допомогти перевірити неправильне введення, але не для всіх випадків.
username:~/workspace/pset1 $ ./mario
Height: -2
Height: -1
Height: foo
Retry: bar
Retry: 1
##
Щоб скомпілювати програму, введіть рядок у терміналі:
make mario
або більш прозорий, але довгий варіант:
clang -o mario mario.c -lcs50
після цього запустіть програму на виконання:
./mario
Якщо ви бажаєте перевірити правильність виконання програми, запускайте check50:
check50 2015.fall.pset1.mario mario.c
А якщо ви хочете погратися з версією mario, створеною помічниками курсу, mario набирайте наступний рядок:
~cs50/pset1/mario

Завдання 3. Час отримувати здачу

Гарвард CS50: завдання першого тижня (лекції 3 та 4) - 4У наших широтах ми такого не зустрічали, а в США, схоже, є така ось іграшка, зображена на фото: циліндри призначені для монет різного діаметра (і номіналів), видає пружинний механізм, а сам агрегат можна закріпити на поясі дитини-касира. Однак, що буде, якщо хтось розрахується з касиром великою купюрою? Уявіть, скільки мороки буде для того, щоб порахувати монетки на здачу. Для мінімізації кількості видаваних монет можна використовувати звані «жадібні» алгоритми. Вони, згідно з визначенням Національного Інституту Стандартів і Технології (NIST), завжди знаходять оптимальне рішення на кожному кроці рішення задачі, припускаючи, що кінцеве рішення (отримане із сукупності таких кроків) також буде оптимальним. Що це означає? Уявимо, що касир повинен покупцю здачу в 41 цент, а у нього на поясі є циліндри з монетками для здачі номіналом 25, 10, 5 і 1 цент. Керуючий «жадібним» алгоритмом касир відразу ж захоче видати максимум, на першому кроці. На цьому кроці оптимальним чи найкращим рішенням видатиме 25 пенсів. 41-25 = 16. Залишилося видати 16 пенсів. Очевидно, 25 пенсів занадто багато, отже, залишається 10. 16-10 = 6. Тепер видаємо за тим же принципом 5 пенсів, а потім — 1. Таким чином, покупець отримає лише чотири монети номіналом 25, 10, 5 та 1 пенс. Виявляється, «жадібна» покрокова інструкція видачі грошей оптимальна не тільки для цього випадку, а й для номіналів валюти США (і Євросоюзу також). Тобто, якщо у касира достатньо монет будь-якого номіналу, алгоритм працюватиме найкращим чином, тобто видасть мінімальну кількість монет із усіх можливих випадків. Отже, яка мінімальна кількість монеток нам потрібна, щоб дати здачу? Це і є наше третє завдання. Створіть файлgreedy.cу своїй директорії ~/workspace/pset1. Дано: монетки номіналом 25, 10, 5, 1 цент .
  1. Запитати користувача, скільки здачі потрібно видати
  2. Порахувати мінімальну кількість монет, за допомогою яких можна це зробити
Примітка:для введення будемо користуватися функцією GetFloatз бібліотеки CS50 та printfзі стандартної бібліотеки вводу/виводу для виведення. Крім того, програма має перевіряти коректність уведення. Ми попросабо вас використати GetFloat, щоб користувач міг вводити значення в доларах та центах через точку. Наприклад, якщо ми повинні $9.75, користувач повинен ввести 9.75, але не $9.75 або 975. Ви повинні простежити, щоб користувач ввів число, яке має сенс. Скажімо, невід'ємна, у цьому функція GetFloatсама по собі не допоможе. Якщо користувач зробив неправильне введення, потрібно просити його повторити його і виконувати програму лише з коректними даними. Остерігайтеся неточностей, властивих числам із плаваючою точкою. Наприклад, 0.01 не може бути представлено безпосередньо якfloat. Спробуйте використати форматований висновок, наприклад, із 50 знаками після коми, використовуючи наведений нижче код:
float f = 0.01;
printf("%.50f\n", f);
До речі, перед тим, як що-небудь вважати, буде логічно перевести всю суму в центи, (і заодно перетворити її на float) int, що допоможе уникнути маси помилок і складнощів. Щоб наш автоматичний аналізатор коду міг правильно перевірити ваше завдання, переконайтеся, що останній рядок виведення вашої програми не містить жодної іншої інформації, крім мінімальної кількості монет: ціле число з символом \n після нього (ті, хто навчається на JavaRush, чудово знають, про що ми тут говоримо =)). Нижче приклад, як має виглядати результат роботи вашої програми.
username:~/workspace/pset1 $ ./greedy
O hai! How much change is owed?
0.41
4
З огляду на особливість чисел з плаваючою точкою можна ігнорувати нуль і вводити таке число у формі .41. Звичайно, користувачі, які захочуть перевірити програму на можливість введення некоректних даних на повну, повинні побачити щось на кшталт:
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
Виходячи з цих вимог та прикладу, який ви побачабо вище, ваш код, швидше за все, має містити якийсь цикл. Якщо під час тестування програми ви зрозумієте, що цикл не зупиняється, ви можете перервати виконання програми комбінацією ctrl-c (іноді багаторазової). Як компілювати та виконувати програму ви вже знаєте. Якщо ви хочете перевірити правильність роботи вашої програми, за допомогою утиліти check50в терміналі введіть наступний рядок:
check50 2015.fall.pset1.greedy greedy.c
А якщо вам захочеться пограти з цією програмою, виконаною помічниками курсу, пропишіть наступну команду:
~cs50/pset1/greedy

Як підтвердити правильність коду та отримати оцінки

  1. Варіант 1

    Якщо вам важливо перевірити саме правильність коду, а не отримати підсумкову оцінку, ви можете його перевіряти та виправляти за допомогою команди.

    check50 2015.fall.pset1.name name.c

    введений у термінальному рядку CS50 IDE? де name- Назва файлу вашого завдання.

  2. Варіант 2

    Якщо ж ви хочете отримати оцінки (по суті, той же запуск check50, але із запам'ятовуванням результату та заповненням деяких форм англійською, тоді зробіть наступні кроки:

    • Крок 1 із 2

      1. Коли програми готові, завантажтеся в CS50 IDE.
      2. У лівому верхньому куті CS50 IDE в межах його файлового браузера, а не термінального вікна, клацніть лівою клавішею миші з утриманням ctrl або правою клавішею миші за файлом hello.c (тому, що лежить в директорії pset1 ) і натисніть Download. Ви повинні знайти, що браузер завантажив hello.c.
      3. Повторіть water.c.
      4. Повторіть mario.c.
      5. Повторіть greedy.c.
      6. В окремій вкладці або вікні вставте CS50 Submit .
      7. Натисніть Submit у нижньому лівому куті вікна.
      8. Під Problem Set 1 на вікні, натисніть на Upload New Submission.
      9. На вікні, натисніть Add files…. З'явиться вікно з ім'ям Open Files.
      10. Пройдіть шлях до місця, куди завантажено hello.c. Зазвичай він знаходиться в папці Downloads або в тій папці, яка призначена для завантаження за промовчанням. Знайшовши hello.c, натисніть на нього один раз, щоб відзначити, потім натисніть Open.
      11. Натисніть Add files… знову, і вікно Open Files знову з'явиться.
      12. Тепер знайдіть так само файл water.c. Клацніть по ньому, потім клацніть Open (або «Відкрити»).
      13. Тепер знаходьте mario.c. І теж клацайте і відкривайте так само.
      14. Все те саме з файлом greedy.c.
      15. Натисніть Start upload, щоб розпочати завантаження ваших файлів на сервери CS50.
      16. На екрані ви побачите вікно з написом No File Selected. Якщо ви перемістите курсор миші в ліву частину окра, ви побачите список файлів, які ви завантажабо. Натисніть на кожен, щоб підтвердити зміст кожного з них. (Не потрібно натискати на інші кнопки або іконки). Якщо впевнені, що готові надіслати файл на перевірку, вважайте, що ви все зробабо! Якщо хочете перевірити свій код самостійно ще раз або виправити щось, повертайтеся до CS50 Submit і повторіть ці кроки. Ви можете повторно відправити стільки разів, скільки хочете; оцінюватиметься лише останнє уявлення.
  3. Крок 2 з 2 (він не обов'язковий для оцінки, якщо що =))

    Тепер перейдіть за посиланням https://www.edx.org/course/cs50s-introduction-computer-science-harvardx-cs50x , де ви виявите спеціальні форми. Вони повинні відповісти на кілька теоретичних питань, а потім натиснути Submit під ними.

Питання із зірочками обов'язкові:
  • Правильно, should've seen this 1 coming! In just a few sentences, what's a library? * (Коротко опишіть, що таке бібліотека)
  • In just a few sentences, what role does #include <cs50.h> play when you write it atop some program? *(яка роль рядка #include <cs50.h>, яка фігурує у верхній частині коду деяких програм?)
  • Проблема Set 0: Scratch?(скільки часу у вас зайняли завдання нульового тижня (Scratch)
  • About how many hours would you say you spent on Problem Set 1: C?
  • What's your opinion CS50x thus far? *(Ваша думка про CS50 в даний момент, вибрати варіант подобається-не подобається)
  • Чи маєте ви, щоб допомогти з classmates or staff via CS50s Facebook Group на http://www.facebook.com/groups/cs50? *(чи зверталися ви за допомогою до інших студентів чи асистентів у групі facebook)
  • Будь ласка, скористайтеся методом з класистів або статей за допомогою CS50s Subreddit at http://www.reddit.com/r/cs50 *(зверталися ви за допомогою до інших студентів або асистентів через Subreddit)
  • Чи маєте ви на це, щоб допомогти з classmates or staff via Twitter using @cs50 or #cs50? *(Чи ви просабо допомоги у інших студентів або асистентів у Twitter використовуючи @cs50 або #cs50).
Друзі, якщо виникають питання, пишіть їх у коментарях під цим керівництвом. Якщо ви не досягли п'ятого рівня JavaRush, щоб отримати запрошення на info, радимо це зробити. Це безкоштовно, цікаво та не дуже складно.

Ресурс коду:

  1. Лекція три

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

  2. Лекція чотири

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

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

додаткова література

http://cpp.com.ru/kr_cbook - російська версія класичної книги по C від авторів мови - Брайана Кернігана і Денніса Рітчі. Широко відома у вузьких колах як K&R. Переклад, щоправда, не найновішого видання. Почитайте перші три розділи. Там буде трохи більше матеріалу, ніж вам потрібно, але достатньо для вирішення завдань. https://computer.howstuffworks.com/c.htm - ресурс, рекомендований авторами CS50. Англійською мовою. Стор. 1-7, 9 та 10.
Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.