JavaRush /وبلاگ جاوا /Random-FA /هاروارد CS50: تکالیف هفته 1 (سخنرانی 3 و 4)
Masha
مرحله

هاروارد CS50: تکالیف هفته 1 (سخنرانی 3 و 4)

در گروه منتشر شد
هاروارد CS50: تکالیف هفته 1 (سخنرانی 3 و 4) - 1دوستان، شما می توانید اطلاعات اولیه نظری را از یادداشت های سمینار جمع آوری کنید . در آنجا، علاوه بر اصول اولیه C، نحوه اتصال به یک ابر IDE ویژه CS50 را می گوید (این کار باید برای اجرا و بررسی وظایف انجام شود)، و دستورات اساسی لینوکس و ساختارهای زبان را شرح می دهد. اگر مطالب ارائه شده در سخنرانی و نکات مربوط به C برای شما کافی نیست، به منابع دیگر مراجعه کنید. به عنوان مثال، مواردی که در انتهای این مقاله ذکر شده است. در موضوع " مواد تکمیلی "
  • اهداف هفته اول
  • IDE CS50
  • به روز رسانی خط فرمان و میز کار
  • کار در IDE
  • سلام سی!
  • اشکالات؟
  • بررسی اعتبار: تست check50
  • C مبانی: مقایسه با Scratch
  • انواع داده های پایه در C
  • کتابخانه ها ج
  • سلام مجدد C: تجزیه و تحلیل نحو ساده ترین برنامه ها
  • کمی بیشتر در مورد I/O در C
مطالب این موضوع:
  • ورود داده های معتبر: توابع ویژه کتابخانه cs50.h
  • وظیفه 1. محاسبه هوشمند مصرف آب
  • وظیفه 2. ماریو با ما است!
  • وظیفه 3. زمان تغییر است
  • چگونه کد خود را تأیید کنید و امتیاز بگیرید
  • منبع کد
  • ادبیات اضافی

ورود داده های معتبر: توابع ویژه کتابخانه cs50.h

برای راحت‌تر کردن این دوره، ما یک کتابخانه ویژه CS50 ایجاد کرده‌ایم که به ویژه عملکردهای بسیار مفیدی برای پردازش داده‌های وارد شده توسط کاربر دارد.
  • GetString()رشته وارد شده توسط کاربر را می خواند.

  • GetInt()رشته وارد شده توسط کاربر را می خواند و بررسی می کند که آیا دارای یک عدد صحیح است یا خیر.

  • GetFloat()رشته وارد شده توسط کاربر را می خواند و بررسی می کند که آیا دارای یک عدد ممیز شناور است یا خیر.

  • GetLongLong()رشته وارد شده توسط کاربر را می خواند و بررسی می کند که آیا دارای یک عدد واقعی طولانی است یا خیر.

وظیفه 1. محاسبه هوشمند مصرف آب

هاروارد CS50: تکالیف هفته 1 (سخنرانی 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: تکالیف هفته 1 (سخنرانی 3 و 4) - 3آیا معروف ترین لوله کش دنیا را می شناسید؟ با کمک نینتندو، مرد خیالی سبیلی و کمی چاق با کلاه قرمز به قهرمان چندین نسل از گیمرها تبدیل شده است. اگر نمی دانید در مورد چه کسی صحبت می کنیم، در اینجا پیوندی به بازی کلاسیک 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در عرض های جغرافیایی ما این را ندیده ایم، اما در ایالات متحده، به نظر می رسد، چنین اسباب بازی وجود دارد، که در عکس نشان داده شده است: استوانه ها برای سکه هایی با قطرهای مختلف (و ارزش های مختلف) طراحی شده اند، آنها با مکانیزم فنری آزاد می شوند. و خود دستگاه را می توان به کمربند صندوقدار کودک وصل کرد. با این حال، اگر شخصی با قبض زیادی به صندوقدار پرداخت کند، چه اتفاقی می افتد؟ تصور کنید که شمردن سکه ها برای تغییر چقدر دردسر خواهد داشت. برای به حداقل رساندن تعداد سکه های صادر شده، می توانید از الگوریتم های به اصطلاح "طمع" استفاده کنید. آنها، همانطور که توسط موسسه ملی استاندارد و فناوری (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از کتابخانه استاندارد I/O برای خروجی استفاده خواهیم کرد. علاوه بر این، برنامه باید صحت ورودی را بررسی کند. ما از شما خواستیم که از استفاده کنید 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
با توجه به ماهیت اعداد ممیز شناور، می توانید صفر را نادیده بگیرید و چنین عددی را به شکل 0.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، در مرورگر فایل آن، نه در پنجره ترمینال، روی فایل hello.c خود (که در پوشه pset1 قرار دارد) چپ یا راست کلیک کرده و روی Download کلیک کنید. باید متوجه شوید که مرورگر hello.c را بارگذاری کرده است.
      3. برای آب تکرار کنید.c.
      4. برای mario.c تکرار کنید.
      5. برای greedy.c تکرار کنید.
      6. در یک برگه یا پنجره جداگانه، وارد CS50 Submit شوید .
      7. روی Submit در گوشه سمت چپ پایین پنجره کلیک کنید.
      8. در قسمت Problem Set 1 در پنجره ظاهر شده، روی آپلود ارسال جدید کلیک کنید.
      9. در پنجره ای که ظاهر می شود، روی افزودن فایل ها کلیک کنید…. باید پنجره ای به نام Open Files ظاهر شود.
      10. به مکانی که hello.c دانلود شده است بروید. معمولاً در پوشه Downloads یا در پوشه ای قرار دارد که به طور پیش فرض برای دانلود به شما اختصاص داده شده است. هنگامی که hello.c را پیدا کردید، یک بار روی آن کلیک کنید تا علامت گذاری شود، سپس روی Open کلیک کنید.
      11. دوباره روی Add files... کلیک کنید و دوباره پنجره Open Files ظاهر می شود.
      12. حالا به همین ترتیب فایل water.c را پیدا کنید. روی آن کلیک کنید، سپس روی Open (یا "Open") کلیک کنید.
      13. حالا mario.c را پیدا کنید. و همینطور کلیک کنید و باز کنید.
      14. همه چیز با فایل greedy.c یکسان است.
      15. برای شروع آپلود فایل های خود در سرورهای CS50 روی Start upload کلیک کنید.
      16. در صفحه ای که ظاهر می شود، پنجره ای با عنوان No File Selected مشاهده می کنید. اگر نشانگر ماوس خود را به سمت چپ صفحه حرکت دهید، لیستی از فایل هایی را که دانلود کرده اید مشاهده خواهید کرد. برای تایید محتویات هر کدام روی هر کدام کلیک کنید. (نیازی به کلیک بر روی دکمه ها یا آیکون های دیگر نیست). اگر مطمئن هستید که آماده ارسال فایل برای تایید هستید، در نظر بگیرید که کارتان تمام شده است! اگر می‌خواهید خودتان دوباره کدتان را بررسی کنید یا چیزی را اصلاح کنید، به CS50 Submit برگردید و این مراحل را تکرار کنید. می توانید هر چند بار که بخواهید دوباره ارسال کنید. فقط آخرین ارسالی ارزیابی خواهد شد.
  3. مرحله 2 از 2 (برای ارزیابی لازم نیست، اگر =))

    اکنون به پیوند https://www.edx.org/course/cs50s-introduction-computer-science-harvardx-cs50x بروید که در آن فرم های ویژه را خواهید یافت. در آنها باید به چندین سؤال نظری پاسخ دهید و سپس روی ارسال زیر آنها کلیک کنید.

سوالات با ستاره الزامی است:
  • خوب، باید می دیدم که این یکی می آید! فقط در چند جمله، کتابخانه چیست؟ * (به طور خلاصه توضیح دهید که کتابخانه چیست)
  • فقط در چند جمله، #include <cs50.h> وقتی آن را در بالای برنامه می نویسید چه نقشی دارد؟ *(نقش #include <cs50.h> که در بالای برخی از برنامه ها ظاهر می شود چیست؟)
  • می‌گویید حدود چند ساعت روی مجموعه مشکل 0: خراش صرف کرده‌اید؟
  • می‌گویید حدوداً چند ساعت را روی مسئله 1: C صرف کرده‌اید؟
  • نظر شما در مورد CS50x تاکنون چیست؟ *(نظر شما در مورد CS50 در حال حاضر، گزینه لایک یا نپسندیدن را انتخاب کنید)
  • آیا از همکلاسی ها یا کارکنان از طریق گروه فیس بوک CS50s در http://www.facebook.com/groups/cs50 کمک خواسته اید؟ *(آیا از سایر دانش آموزان یا دستیاران در گروه فیس بوک کمک خواسته اید)
  • آیا از همکلاسی ها یا کارکنان از طریق CS50s Subreddit در http://www.reddit.com/r/cs50 کمک خواسته اید (آیا از سایر دانش آموزان یا دستیاران از طریق Subreddit کمک خواسته اید)
  • آیا از همکلاسی ها یا کارکنان از طریق توییتر با استفاده از cs50@ یا #cs50 کمک خواسته اید؟ *(آیا با استفاده از cs50@ یا #cs50 در توییتر از سایر دانش آموزان یا TA کمک خواسته اید).
دوستان اگر سوالی دارید در نظرات زیر همین راهنما بنویسید. اگر برای دریافت دعوت به اطلاعات به سطح 5 JavaRush نرسیده اید، توصیه می کنیم این کار را انجام دهید. این رایگان، جالب و نه چندان دشوار است.

منبع کد:

  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.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION