JavaRush /Java блогы /Random-KK /Гарвард CS50: 1-аптаның тапсырмалары (3 және 4-дәрістер)
Masha
Деңгей

Гарвард CS50: 1-аптаның тапсырмалары (3 және 4-дәрістер)

Топта жарияланған
Гарвард CS50: 1-апта тапсырмалары (3 және 4 дәрістер) - 1Достар, сіз семинар жазбаларынан негізгі теориялық ақпаратты ала аласыз . Онда Си тілінің негіздерінен басқа, ол арнайы IDE CS50 бұлтына қосылу жолын сипаттайды (бұл тапсырмаларды орындау және тексеру үшін жасалуы керек) және негізгі қажетті Linux командалары мен тіл құрылымдарын сипаттайды. Дәріс пен жазбаларда С туралы жеткілікті материал таппасаңыз, басқа көздерге жүгініңіз. Мысалы, осы мақаланың соңында тізімделгендер. « Қосымша материалдар » тақырыбында
  • Бірінші аптаның мақсаттары
  • IDE CS50
  • Пәрмен жолы мен жұмыс үстелін жаңарту
  • IDE-де жұмыс істеу
  • Сәлем, C!
  • Қателер?
  • Валидацияны тексеру: check50 сынағы
  • C Негіздері: Scratch көмегімен салыстыру
  • Си тіліндегі негізгі деректер түрлері
  • Кітапханалар C
  • Тағы да Hello C: қарапайым бағдарламалардың синтаксисін талдау
  • Си тілінде енгізу/шығару туралы аздап
Осы тақырыптағы материалдар:
  • Тексерілген деректерді енгізу: cs50.h кітапханасының арнайы функциялары
  • Тапсырма 1. Суды тұтынуды ақылды есептеу
  • 2-тапсырма. Марио бізбен бірге!
  • Тапсырма 3. Өзгеріс алу уақыты
  • Кодты қалай тексеруге және белгілерді алуға болады
  • Код ресурсы
  • қосымша әдебиеттер

Тексерілген деректерді енгізу: cs50.h кітапханасының арнайы функциялары

Бұл курсты ыңғайлы ету үшін біз арнайы CS50 кітапханасын жасадық, ол, атап айтқанда, пайдаланушы енгізген деректерді өңдеу үшін өте пайдалы функциялары бар.
  • GetString()пайдаланушы енгізген жолды оқиды;

  • GetInt()пайдаланушы енгізген жолды оқиды және оның құрамында бүтін сан бар-жоғын тексереді;

  • GetFloat()пайдаланушы енгізген жолды оқиды және оның құрамында өзгермелі нүкте нөмірі бар-жоғын тексереді;

  • GetLongLong()пайдаланушы енгізген жолды оқиды және оның ұзын нақты санның бар-жоғын тексереді.

Тапсырма 1. Суды тұтынуды ақылды есептеу

Гарвард CS50: 1-аптаның тапсырмалары (3 және 4-дәрістер) - 2Бұл қисынды: душ қабылдаған сайын, бұл процеске соғұрлым көп су жұмсалады. Қанша екенін анықтайық? Сіздің душыңыз әрең ашылған болса да, одан minutesына шамамен 6 литр су ағып кетеді. Ал мынау ішу үшін өзіңізбен бірге алып жүретін 12 бөтелке су. Әдетте адам шамамен 10 minutes душ қабылдайды.Жалпы, жуу үшін сізге жарты литрлік 120 бөтелке қажет. Біршама! water.cішінде файл жасаңыз ~/workspace/pset1. Бағдарлама уақытқа байланысты душқа қанша бөтелке су жұмсалатынын санауы керек. Яғни:
  1. Бағдарлама пайдаланушыдан душта қанша minutes болғанын сұрайды
  2. Пайдаланушы оң бүтін санды енгізеді
  3. Бағдарлама пайдаланушы пайдаланатын бөтелкелер санын көрсетеді.
username:~/workspace/pset1 $ ./water
minutes: 10
bottles: 120
Қарапайымдылық үшін бұл жолы пайдаланушы әрқашан minutesтар санын дұрыс енгізеді деп есептейміз, яғни енгізілген санның оң және бүтін екенін тексермейміз. Кейінірек чектерді жазуды үйренеміз, бірақ әзірге бұл жеткілікті. Бағдарламаның дұрыс жұмыс істеп тұрғанын тексеру үшін check50,терминалға келесі жолды енгізу керек:
check50 2015.fall.pset1.water water.c
Курс қызметкерлері жазған бағдарлама қалай жұмыс істейтінін көргіңіз келсе water, келесі пәрменді орындаңыз:
~cs50/pset1/water

2-тапсырма. Марио бізбен бірге!

Гарвард CS50: 1-апта тапсырмалары (3 және 4 дәрістер) - 3Сіз әлемдегі ең танымал сантехникті білесіз бе? Nintendo көмегімен қызыл қалпақ киген ойдан шығарылған мұртты және сәл толық жігіт ойыншылардың бірнеше ұрпағы үшін кейіпкерге айналды. Егер сіз кім туралы айтып жатқанымызды білмесеңіз, мұнда 1985 жылғы классикалық ойынға сілтеме берілген : маған сеніңіз, ол әлі де жақсы және тексеруге тұрарлық! Сондай-ақ смартфондарға немесе офлайн эмуляторларға арналған классикалық Super 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
Курс көмекшілерінің марио нұсқасымен ойнағыңыз келсе, келесі жолды теріңіз:
~cs50/pset1/mario

Тапсырма 3. Өзгеріс алу уақыты

Гарвард CS50: 1-апта тапсырмалары (3 және 4 дәрістер) - 4Біздің ендіктерде біз мұны көрмедік, бірақ АҚШ-та фотода көрсетілген ойыншық бар сияқты: цorндрлер әртүрлі диаметрдегі (және номиналдағы) монеталар үшін жасалған, олар серіппелі механизммен шығарылады. , ал блоктың өзін бала кассирінің белдігіне бекітуге болады. Алайда, егер біреу кассирге үлкен шотпен төлесе не болады? Өзгеріс үшін тиындарды санау қаншалықты қиын болатынын елестетіп көріңіз. Шығарылған монеталардың санын азайту үшін сіз «ашкөз» деп аталатын алгоритмдерді пайдалана аласыз. Олар, Ұлттық стандарттар және технологиялар институты (NIST) анықтағандай, соңғы шешім (осындай қадамдардың жиынтығынан алынған) да оңтайлы болады деп есептей отырып, мәселені шешудің әрбір қадамында әрқашан оңтайлы шешімді табады. Бұл нені білдіреді? Елестетіп көрейікші, кассир клиентке айырбастау үшін 41 цент берешегі бар және оның белдігінде 25, 10, 5 және 1 цент номиналындағы монеталардың цorндрлері бар. «Ашкөз» алгоритмді басшылыққа алатын кассир бірінші қадамда бірден максималды бергісі келеді. Бұл кезде оңтайлы немесе ең жақсы шешім 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 немесе 975 емес, 9,75 енгізуі керек. Пайдаланушының мағынасы бар санды енгізуіне көз жеткізу керек. Теріс емес делік; функцияның өзі бұған GetFloatкөмектеспейді . Егер пайдаланушы қате енгізсе, оны қайталауды және бағдарламаны тек дұрыс деректермен іске қосуды сұрау керек. Жылжымалы нүкте сандарына тән дәлсіздіктерден сақ болыңыз. Мысалы, 0,01 мәнін тікелей ретінде көрсету мүмкін емес float. Төмендегі codeты пайдаланып, пішімделген шығысты пайдаланып көріңіз, мысалы, 50 ондық таңбамен:
float f = 0.01;
printf("%.50f\n", f);
Айтпақшы, кез келген нәрсені санамас бұрын, барлық соманы центке түрлендіру (және сонымен бірге оны -дан түрлендіру float) қисынды болар еді int, бұл көптеген қателер мен қиындықтарды болдырмауға көмектеседі. Біздің автоматты code анализаторымыз мәселеңізді дұрыс тексере алатынына көз жеткізу үшін бағдарламаңыздың шығыс жолында монеталардың ең аз санынан басқа ақпарат жоқ екеніне көз жеткізіңіз: одан кейін \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
Осы талаптарға және жоғарыда көрген мысалға сүйене отырып, сіздің codeыңызда қандай да бір цикл болуы мүмкін. Қолданбаны тестілеу кезінде цикл тоқтамайтынын түсінсеңіз, ctrl-c комбинациясы арқылы бағдарламаның орындалуын үзуге болады (кейде бірнеше рет). Сіз бағдарламаны қалай құрастыру және іске қосу керектігін білесіз. Егер сіз утorтаны пайдаланып бағдарламаңыздың дұрыс жұмыс істеп тұрғанын тексергіңіз келсе check50, терминалға келесі жолды енгізіңіз:
check50 2015.fall.pset1.greedy greedy.c
Егер сіз курс ассистенттері жасаған осы бағдарламамен ойнағыңыз келсе, келесі пәрменді жазыңыз:
~cs50/pset1/greedy

Кодты қалай тексеруге және белгілерді алуға болады

  1. 1 нұсқа

    Егер сіз үшін қорытынды баға алу емес, codeтың дұрыстығын тексеру маңызды болса, оны пәрмен арқылы тексеріп, түзетуге болады.

    check50 2015.fall.pset1.name name.c

    CS50 IDE терминалдық жолына енгізілген? nameтапсырма файлыңыздың аты қайда .

  2. 2-нұсқа

    Егер сіз бағаларды алғыңыз келсе (негізі check50 іске қосылғанмен бірдей, бірақ нәтижені есте сақтау және кейбір формаларды ағылшын тілінде толтыру арқылы), келесі қадамдарды орындаңыз:

    • 1/2 қадам

      1. Қолданбалар дайын болғанда, CS50 IDE жүйесіне кіріңіз.
      2. CS50 IDE жоғарғы сол жақ бұрышында, оның файл шолғышында, терминал терезесінде емес, hello.c файлын (pset1 каталогында орналасқан) тінтуірдің сол жақ түймешігімен немесе оң жақ түймешігімен басып, Жүктеп алу түймесін басыңыз. Браузер hello.c жүктегенін білуіңіз керек.
      3. Су үшін қайталаңыз.c.
      4. mario.c үшін қайталаңыз.
      5. Ашкөздік үшін қайталаңыз.c.
      6. Бөлек қойындыда немесе терезеде CS50 Submit жүйесіне кіріңіз .
      7. Терезенің төменгі сол жақ бұрышындағы Жіберу түймесін басыңыз.
      8. Пайда болған терезеде 1-мәселелер жинағы астында Жаңа жіберуді жүктеп салу түймесін басыңыз.
      9. Пайда болған терезеде Файлдарды қосу... түймесін басыңыз. Файлдарды ашу деп аталатын терезе пайда болуы керек.
      10. hello.c жүктелетін орынға өтіңіз. Ол әдетте Жүктеулер қалтасында немесе жүктеп алу үшін әдепкі бойынша сізге тағайындалған қалтада орналасады. hello.c табылған соң, оны белгілеу үшін оны бір рет басыңыз, содан кейін Ашу түймесін басыңыз.
      11. Файлдарды қосу... түймесін қайтадан басыңыз, сонда Файлдарды ашу терезесі қайтадан пайда болады.
      12. Енді water.c файлын дәл осылай табыңыз. Оны басыңыз, содан кейін «Ашу» түймесін басыңыз (немесе «Ашу»).
      13. Енді mario.c табыңыз. Сондай-ақ, дәл осылай басып, ашыңыз.
      14. greedy.c файлымен бәрі бірдей.
      15. Файлдарды CS50 serverлеріне жүктеп салуды бастау үшін «Жүктеп салуды бастау» түймесін басыңыз.
      16. Пайда болған экранда Файл таңдалмаған деп белгіленген терезені көресіз. Тінтуір курсорын экранның сол жағына жылжытсаңыз, сіз жүктеп алған файлдардың тізімін көресіз. Әрқайсысының мазмұнын растау үшін әрқайсысын басыңыз. (Басқа түймелерді немесе белгішелерді басу қажет емес). Егер сіз файлды тексеруге жіберуге дайын екеніңізге сенімді болсаңыз, дайын деп есептеңіз! Кодты өзіңіз қайта тексергіңіз келсе немесе бірдеңені түзеткіңіз келсе, CS50 Submit бөліміне оралыңыз және осы қадамдарды қайталаңыз. Қалағаныңызша қайта жіберуге болады; Ең соңғы жіберілген материал ғана бағаланады.
  3. 2/2 қадам (бағалау үшін қажет емес, егер бұл =))

    Енді https://www.edx.org/course/cs50s-introduction-computer-science-harvardx-cs50x сайтына өтіңіз , онда арнайы пішіндерді табасыз. Оларда бірнеше теориялық сұрақтарға жауап беру керек, содан кейін олардың астындағы Жіберу түймесін басыңыз.

Жұлдызшасы бар сұрақтар қажет:
  • Жарайды, мұның келе жатқанын көру керек еді! Бірнеше сөйлеммен кітапхана дегеніміз не? * (Кітапхана деген не екенін қысқаша сипаттаңыз)
  • Бірнеше сөйлемде #include <cs50.h> оны қандай да бір бағдарламаның үстіне жазғанда қандай рөл атқарады? *(кейбір бағдарламалардың жоғарғы жағында пайда болатын #include <cs50.h> жолының рөлі қандай?)
  • 0-проблемалар жинағы: Scratch-ке қанша сағат жұмсадым деп айтар едіңіз?
  • 1-мәселелер жинағы: C-ге қанша сағат жұмсадым деп айтар едіңіз?
  • Осы уақытқа дейін CS50x туралы пікіріңіз қандай? *(Қазіргі уақытта CS50 туралы пікіріңіз, ұнату немесе ұнатпау опциясын таңдаңыз)
  • Сіз http://www.facebook.com/groups/cs50 мекенжайындағы CS50s Facebook Group арқылы сыныптастарыңыздан немесе қызметкерлерден көмек сұрадыңыз ба? *(сіз Facebook тобында басқа студенттерден немесе көмекшілерден көмек сұрадыңыз ба)
  • Сіз http://www.reddit.com/r/cs50 мекенжайындағы CS50s Subreddit арқылы сыныптастарыңыздан немесе қызметкерлерден көмек сұрадыңыз ба *(Subreddit арқылы басқа студенттерден немесе көмекшілерден көмек сұрадыңыз ба)
  • @cs50 немесе #cs50 арқылы Twitter арқылы сыныптастарыңыздан немесе қызметкерлерден көмек сұрадыңыз ба? *(Сіз Twitter-де @cs50 немесе #cs50 арқылы басқа студенттерден немесе ТБ-дан көмек сұрадыңыз ба).
Достар, сұрақтарыңыз болса, осы нұсқаулықтың астындағы түсініктемелерде жазыңыз. Ақпаратқа шақыру алу үшін JavaRush 5 деңгейіне жетпеген болсаңыз, мұны істеуді ұсынамыз. Бұл тегін, қызықты және өте қиын емес.

Код ресурсы:

  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 - тіл авторлары Брайан Керниган мен Деннис Ричидің Си бойынша классикалық кітабының орысша нұсқасы. Тар шеңберде K&R ретінде кеңінен танымал. Алайда аударма ең жаңа басылым емес. Алғашқы үш тарауды оқыңыз. Қажетті материалдан сәл көбірек болады, бірақ мәселелерді шешуге жеткілікті. https://computer.howstuffworks.com/c.htm — CS50 авторлары ұсынған ресурс. Ағылшын тілінде. Бет 1-7, 9 және 10.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION