[Powered by Google Translate] [সপ্তাহ 4] [ডেভিড জে Malan] [হার্ভার্ড বিশ্ববিদ্যালয়] [এটি CS50.] [CS50.TV] সমস্ত অধিকার, এই CS50 হয়, এবং এই সপ্তাহে 4 শুরু, এবং এই ধীরতম সম্ভব বাছাই আলগোরিদিম এক. কোনটি ছিল এটা যে ঠিক আছে আমরা দেখেছেন? যে ছিল বুদ্বুদ সাজান, যাতে বড় O (n 2 ^) + সমষ্টি, এবং নিশ্চয় আমরা জানি মনে হয় এই পৃথিবীতে শুধুমাত্র বেশী না বুদ্বুদ সাজানোর কি হয় অথবা তার চলমান সময়. প্রকৃতপক্ষে, এই ছিল Eric Schmidt Google এর সঙ্গে একটি সাক্ষাত্কারে এবং প্রাক্তন সিনেটার বারাক ওবামা মাত্র কয়েক বছর আগে. এখন, সিনেটর, আপনি Google-এ এখানে এসেছি, এবং আমি অধ্যক্ষতা একটি পেশা ইন্টারভিউ হিসাবে চিন্তা করতে চান. এখন, এটা কঠিন প্রেসিডেন্ট হিসাবে চাকরি পেতে, এবং আপনি এখন rigors মাধ্যমে চলুন. এছাড়াও এর Google-এ একটি কাজ পাওয়ার জন্য হার্ড. আমরা প্রশ্ন থাকে, এবং আমরা আমাদের প্রার্থীদের প্রশ্ন জিজ্ঞাসা করতে পারেন, এবং এই এক ল্যারি Schwimmer থেকে হয়. আপনি মনে হয় না আমি নিশ্চয়ই মজা করছি? এটা ঠিক এখানে. সবচেয়ে কার্যকর উপায় লক্ষ 32 বিট ইন্টিজার সাজাতে কি? [হাস্য] সু - আমি দুঃখিত. >> না, না, না, নেই. আমি মনে করি বুদ্বুদ সাজানোর কুপথ যেতে হবে. চলো, যিনি তাকে এই ডটকমকে বলেন? গত সপ্তাহে প্রত্যাহার আমরা গ্রহণ অন্তত একটি দিনের জন্য কোড থেকে একটি বিভাজক,, শুরু এবং কিছু উঁচু মাত্রার ধারনা এবং সমস্যা সমাধানের আরো সাধারণভাবে উপর মনোযোগ নিবদ্ধ করে অনুসন্ধান এবং বাছাই অনুষঙ্গে, এবং আমরা কিছু যে আমরা এই নামের শেষ সপ্তাহে বার চড় না চালু, কিন্তু asymptotic স্বরলিপি, বিগ হে, বিগ ওমেগা, এবং কখনও কখনও বিগ থীটা স্বরলিপি, এবং এই সহজভাবে ছিল উপায় এর আলগোরিদিম চলমান সময় বর্ণনা, কত সময় এটি একটি অ্যালগরিদম চালানোর জন্য সময় লাগে. এবং আপনি আকারের পদ প্রত্যাহার হতে পারে যে আপনি চলমান সময় স্বপ্ন ইনপুট, যা সাধারণভাবে আমরা n, কল যাই হোক না কেন সমস্যা হতে পারে, যেখানে n হল মানুষের নম্বর রুমে, একটি ফোন বই পাতার সংখ্যা, এবং আমরা সেটা লেখা শুরু ভালো O (n ^ 2) অথবা O (n) অথবা O (n log n), এবং এমনকি যখন গণিত আউট কাজ পুরোপুরি না তাই পুরোপুরি এবং এটি ছিল n ² - n / 2 বা ওই জাতীয় কিছু আমরা পরিবর্তে শুধুমাত্র নিম্ন ক্রম পদ কিছু সরিয়ে দিন, প্রেরণা এবং যে সত্যিই আমরা চাই একটি আছে মূল্যায়নের উদ্দেশ্য ভাবে সাজানোর প্রোগ্রাম কর্মক্ষমতা বা আলগোরিদিম কর্মক্ষমতা যে দিন শেষে আছে উদাহরণস্বরূপ না কিছুই,, সঙ্গে আপনার কম্পিউটারের গতি আজ. উদাহরণস্বরূপ, যদি আপনি বুদ্বুদ সাজানোর বাস্তবায়ন, অথবা আপনি আজকের এর কম্পিউটারে সাজান বা নির্বাচন সাজানোর একত্রীকরণ বাস্তবায়ন, 2 GHz একটি কম্পিউটার, এবং আপনি এটি চালানো, এবং এটি যাও কিছু সংখ্যা প্রদর্শিত হয়, পরবর্তী বছরের একটি 3 GHz আছে অথবা পরে একটি 4 GHz কম্পিউটার, এবং আপনি দাবি করতে পারে যে, "বাহ, আমার আলগোরিদিম হয় এখন দ্বিগুণ হিসাবে দ্রুত, "যখন যে বাস্তবে এর ক্ষেত্রে সম্ভবত না. শুধু হার্ডওয়্যার দ্রুত অর্জিত হয়েছে, কিন্তু আপনার কম্পিউটার করেনি এবং তাই, আমরা হইনি জিনিষ ভালো সরিয়ে সত্যিই চান গুণিতকে 2 3 বা এর গুণিতক অত্যন্ত স্পষ্টভাবে তার বিবরণ আসে কিভাবে দ্রুত বা ধীর কিভাবে একটি অ্যালগরিদম এবং এটি সত্যিই শুধু ফোকাস উপর n বা উহার কিছু ফ্যাক্টর, কিছু ক্ষমতা উহার হিসাবে গত সপ্তাহে থেকে প্রকারের ক্ষেত্রে. একত্রীকরণ এবং সাজানোর সাহায্যে যে প্রত্যাহার আমরা এত বুদ্বুদ সাজানোর এবং নির্বাচন সাজানোর তুলনায় ভালো করতে পারবেন এবং এমনকি সন্নিবেশ সাজান. আমরা n log n যাও না নিচে, এবং আবার, পুনরাহ্বান যে লগ n সাধারণত যা বোঝায় বৃদ্ধি তারপর আস্তে আস্তে আরো হবে, তাই n log-n পর্যন্ত ছিল ভাল কারণ এটি ছিল n ² এর তুলনায় কম. কিন্তু n অর্জন একত্রীকরণ সাজানোর সঙ্গে n লগ ইন একটি ধারণা মৌলিক জীবাণু যে আমরা ছিল কি ছিল লিভারেজ যে আমরা সপ্তাহে 0 leveraged ফিরে? আমরা কিভাবে কি বাছাই সমস্যার মোকাবেলা নিপুণতার সঙ্গে একত্রীকরণ সাজান? অন্তর্দৃষ্টি কী কী ছিল, হয়ত? কেউ এ সব. ঠিক আছে, আমি এর পিছনে একটি পদক্ষেপ গ্রহণ করা. আপনার নিজের ভাষায় সাজানোর একত্রীকরণ বর্ণনা করুন. এটা কিভাবে কাজ করে? ঠিক আছে, আমরা সপ্তাহে 0 সারি ফিরে পাবেন. ঠিক আছে, হাঁ. [শ্রবণাতীত-ছাত্র] ঠিক আছে, ভাল, তাই আমরা 2 টুকরা সংখ্যার অ্যারের বিভক্ত. আমরা যারা পোশাক প্রতিটি অনুসারে বাছাই করা, এবং তারপর আমরা তাদের মার্জ, এবং আমরা এই ধারণা পাচ্ছি আগে একটি সমস্যা যে এই বড় গ্রহণ এবং চপিং একটি সমস্যা যে এই বড় বা এই বড় মধ্যে এটি আপ. টেলিফোন বইয়ের উদাহরণ প্রত্যাহার. সপ্তাহ আগে থেকে স্ব - কাউন্টিং আলগোরিদিম প্রত্যাহার, তাই মার্জ সাজানোর এই এখানে pseudocode দ্বারা সংক্ষিপ্ত ছিল. আপনি যখন n উপাদান দেওয়া প্রথম করছি, এটি ছিল বৈধতা পরীক্ষা. যদি n <2 এ সব কিছু করবেন না কারণ যদি n <তারপর 2 n হল স্পষ্টত 0 বা 1, এবং তাই এটি যদি হয় এর 0 বা 1 কিছুই বাছাই আছে. আপনি শেষ করেছেন. আপনার তালিকাটি ইতিমধ্যেই trivially সাজানো হয়. কিন্তু আপনি যদি এগিয়ে অন্যথায় 2 বা আরো উপাদান পেয়েছেন যান এবং তাদের বিভক্ত করা মধ্যে 2 অর্ধেক, বাম এবং ডান. যারা অর্ধ প্রতিটি, বাছাই এবং তারপর সাজানো আংশিক একত্রীকরণ. কিন্তু এখানে সমস্যা হল যে এই প্রথম নজরে মতানুযায়ী আমরা ভালো punting করছি. এটি একটি বিজ্ঞপ্তি যে সংজ্ঞা যদি আমি আপনাকে এইসব n উপাদান বাছাই করেছি জিজ্ঞাসা এবং আপনার সম্পর্কে বলার করছেন "ঠিক আছে, সূক্ষ্ম, আমরা n / 2 এবং যারা n / 2 উপাদান যারা সাজাতে হবে," তারপর আমার পরের প্রশ্ন হতে যাচ্ছে "ফাইন, তা আপনি কীভাবে n / 2 উপাদান বাছাই?" হয় কিন্তু কারণ এই প্রোগ্রামের গঠন, কারণ এই বেস কেস আছে, তাই কথা বলতে, এই বিশেষ ক্ষেত্রে যে যদি n <2 ফিরে ভালো কিছু নির্দিষ্ট মান অবিলম্বে হয়. কি যে একই বিজ্ঞপ্তি উত্তর প্রতিক্রিয়া না. এই প্রক্রিয়া, ঘটনাক্রমে এই cyclicity শেষ হয়ে যাবে. যদি আমি আপনাকে জিজ্ঞাসা "বাছাই করা এইসব উপাদান," এবং আপনার বলে, "ফাইন, এইসব n / 2, বাছাই" তারপর আপনি বলে, "ফাইন, সাজানোর এই n / 4, n / 8, n/16," অবশেষে আপনি একটি বড় যথেষ্ট সংখ্যা দ্বারা বিভক্ত করা হবে যে আপনি মাত্র 1 বাম উপাদান আছে, যা বিন্দু আপনি বলতে পারেন, "এখানে, এখানে একটি সাজানো একক উপাদান." তারপর আপ এই আলগোরিদিমের প্রতিভা এখানে সত্য থেকে আহরণ করা যাও যে একবার আপনি এইসব পৃথকভাবে অনুসারে সাজানো তালিকা সব আছে, সব মাপ 1, সরকার যা যা অকাজের মনে করা হয়, একবার আপনি শুরু তাদের মার্জ এবং তাদের মার্জ পরিশেষে আপনার বিল্ড আপ হিসাবে Rob ভিডিও পরিশেষে একটি অনুসারে সাজানো তালিকা করেছিল. কিন্তু এই ধারণা বাছাই দূরে বহুদূরে প্রসারিত করে. এই ধারণা এই প্রোগ্রাম recursion হিসাবে পরিচিত এমবেড করা আছে, ধারণা সাহায্যে আপনি একটি প্রোগ্রাম, এবং কিছু সমস্যা আপনি নিজেই কল সমাধান, প্রোগ্রামিং ভাষা আপনি একটি ফাংশন প্রেক্ষিতে বা করা, এবং যাতে একটি সমস্যা সমাধানের জন্য, আপনি নিজেকে ফাংশন কল আবার এবং আবার এবং আবার, কিন্তু আপনি ফাংশন নিজের অসীম অনেকবার কল করতে পারবেন না. অবশেষে আপনি নীচে আউট আছে, তাই কথা বলতে, এবং কিছু হার্ড কোড বেস শর্ত বলা আছে এই সময়ে নিজেকে তাই কলিং থামাতে যে সমগ্র প্রক্রিয়া আসলে পরিশেষে থামবে. কি সত্যিই এই recurse যাও, মানে? এর চলুন দেখা যাক, যদি আমরা একটি সহজ, তুচ্ছ উদাহরণ সাথে, অর্থাৎ কি করতে পারেন, আমার সাথে 3 জনের উপরে পর্যায় এখানে, যদি কেউ আরামদায়ক. আপ, 2 এবং 3 1, আসা. আপনি যদি এখানে আসতে চান 3. আপনি যদি আমার ডান পাশে দাঁড়ানো এখানে একটি লাইন চাই, অনুমান যে হাতে সমস্যা হয় খুব trivially যারা এখানে আছেন সংখ্যা গোণে. কিন্তু সত্যি, আমি সব এই গণনা উদাহরণের ক্লান্ত. এই কিছু সময়, 1, 2, এবং বিন্দু, বিন্দু, বিন্দু নিতে যাচ্ছে. এটা চিরকালের নিতে যাচ্ছে. আমি বরং পান্ট সাহায্য সাথে পুরাপুরি এই সমস্যার-কি আপনার নাম? চাই সারা. >> সারা সমস্ত অধিকার. কেলি. >> কেলি এবং? Willy. >> Willy, সারা, কেলি, এবং Willy. এখন আমি ডান হয়েছে ব্যক্তির দ্বারা জিজ্ঞাসা করা প্রশ্ন কতজন লোক এই পর্যায়ের হয় আপ, এবং আমি মনে করি নহি. সত্যিই এটি একটি দীর্ঘ তালিকা, এবং তাই আমি এই কৌতুক করতে যাচ্ছি. আমি ব্যক্তিকে কাজ না পরের সবচেয়ে যাও সম্পর্কে জিজ্ঞাসা চলেছি, এবং একবার সে কাজ বেশীরভাগ কাজ সম্পন্ন করা হয় আমি কাজের পরিমাণ কমপক্ষে সম্ভব না যাওয়া এবং মাত্র 1 যোগ করছি যাও যাই হোক না কেন তার উত্তরে, যাতে আমরা এখানে. আমি মঞ্চে কিভাবে অনেক করেছি বলা হয়েছে. কত জনের পর্যায় হয় আপনি বাম দিকের? আমার বাম >>? ঠিক আছে, কিন্তু না ঠকাই না. এটা ভাল, যে সঠিক, কিন্তু যদি আমরা এই যুক্তিবিজ্ঞান অবিরত করতে চান এর অনুমান করা যাক যে ঐভাবে চান আপনি বাম দিকের এই সমস্যা পান্ট, তাই বদলে উত্তর সরাসরি এগিয়ে যেতে এবং মাত্র মেষ পাস. ওহ, আমার বাম কতজন লোক আছে? বাম যাও কত মানুষ? 1. [হাস্য] ঠিক আছে, তাই 0, তাই কি এখন Willy কাজ করেনি হয় আপনি এই দিক 0 বলছে ফিরিয়ে আপনার উত্তরে করেছি. এখন তাহলে আপনি কি? >> 1 উচিত. ঠিক আছে, তাই আপনি 1, যাতে আপনি বলে, "ঠিক আছে, আমি 1 যোগ চলেছি যাই হোক না কেন যাও Willy এর গণনা ছিল, তাই "1 + 0. আপনি এখন 1 যাতে অধিকার আপনার উত্তরটি এখন- 1. >> এবং খনি 2 হবে. গুড, তাই আপনি পূর্ববর্তী 1 উত্তর গ্রহণ করছেন, কাজের পরিমাণ ন্যূনতম আপনাকে যোগ করতে চান, যা +1 করুন. আপনি এখন 2 আছে, এবং আপনি পরে সম্পর্কে যা মান হাতে? 3, আমি বলতে চাচ্ছি দুঃখিত, 2,. গুড. ভাল, আমরা বাম যাও 0 ছিল. তারপর আমরা 1 ছিল, এবং তারপর আমরা 2 যোগ করুন, এবং এখন আপনি কি আমার নম্বর 2 হস্তান্তর করছি, এবং তাই আমি বলে ঠিক করছি +1 টি, 3. এর প্রকৃতপক্ষে এখন পর্যন্ত 3 এই মঞ্চে দাঁড়িয়ে পরের যাও সম্পর্কে মানুষ, তাই অবশ্যই আমরা এই কাজ করে থাকতে পারে খুব linearly, সুস্পষ্ট ফ্যাশন অনেক, কিন্তু আমরা কি সত্যিই কি করবেন? আমরা মাপ 3 সমস্যা প্রাথমিকভাবে নেন. আমরা তারপরে ভেঙে আকার 2 সমস্যা এটা ডাউন, তারপর আকার 1 সমস্যা, এবং তারপর অবশেষে বেস মামলা ছিল সত্যিই, ওহ, সেখানে কোন এক আছে, বিন্দু Willy এ কার্যকরভাবে ফিরে একটি হার্ড কোড উত্তর বার কয়েক, এবং তারপর দ্বিতীয় এক bubbled ছিল আপ, bubbled আপ, bubbled আপ, এবং তারপর এই এক অতিরিক্ত 1 দ্বারা যোগ আমরা এই recursion মৌলিক ধারণা প্রয়োগ করেছি. এই ক্ষেত্রে এখন, এটি সত্যিই একটি সমস্যা সমাধান করা না কোনো আরো কার্যকরভাবে তারপর আমরা এইভাবে দেখা করেছি. আলগোরিদিম আমরা মঞ্চে পর্যন্ত করেছেন কিন্তু আমার মনে হয়. আমরা chalkboard অপ্রযুক্ত 8 টুকরা করে, ভিডিও যখন Sean নম্বর 7 জন্য, খুঁজছেন এবং তিনি কি সত্যিই কি কি ছিল? ওয়েল, তিনি এবং কি কি ডিভাইড কোন ধরনের না জেতা. তিনি recursion কোন ধরনের কি না. বরং তিনি এই রৈখিক আলগোরিদিম করেছিল. কিন্তু যখন আমরা মঞ্চে সাজানো সংখ্যার ধারণা প্রবর্তন লাইভ গত সপ্তাহে তারপর আমরা যাচ্ছে মধ্যম যাও এই সহজাত প্রবৃত্তি ছিল, যা সময়ে আমরা একটি আকার বা সাইজ 4 4 আরেকটি তালিকা ছোট তালিকা ছিল, এবং তারপর আমরা সঠিক একই সমস্যা হয়েছে, যাতে আমরা বারংবার, পুনরাবৃত্তি, পুনরাবৃত্তি. অন্য কথায়, আমরা recursed. আপনাকে ধন্যবাদ আমাদের 3 স্বেচ্ছাসেবীকে খুব এখানে আমাদের সঙ্গে recursion প্রদর্শক জন্য. এর যদি আমরা এখন এই না আরো কিছু করতে পারেন কংক্রিট দেখতে দিন একটি সমস্যা যে আবার আমরা চমত্কার সহজে যেত না সমাধান, কিন্তু আমরা এই একটি মৌলিক রূপায়ণকারী যাও পদবিন্যাস পাথর হিসাবে এটা ব্যবহার করব. যদি আমি সংখ্যার একটি গুচ্ছ এর সঙ্কলন গনা করতে চান, উদাহরণস্বরূপ, যদি আপনি 3 নম্বর পাস, আমি আপনাকে সিগমা 3 মূল্য দিতে চান, তাই 3 সমষ্টি + 2 + 1 + 0. আমি উত্তর 6 ফিরে পেতে চাই, তাই আমরা এই সিগমা ফাংশন, এই সঙ্কলন ফাংশন বাস্তবায়ন করব আবার, ইনপুট মধ্যে, নেয়, এবং তারপর সঙ্কলন ফেরত্ যে সব নম্বর উপায় নিচে 0. আমরা কি এই চমত্কার সহজভাবে অধিকার, হতে পারে? আমরা looping গঠন কিছু সঙ্গে এই যেত না, তাই আমাকে এগিয়ে যান এবং এই শুরু. Stdio.h অন্তর্ভুক্ত. আমাকে প্রধান করে নিজেকে এখানে কাজ পেতে. চলুন শুরু করা যাক sigma.c হিসাবে এই সংরক্ষণ করুন. তারপর আমি এখানে ঢুকা যাচ্ছে, এবং করছি আমি কোন int n ডিক্লেয়ার চলেছি, এবং আমি যখন নিম্নলিখিত ব্যবহারকারী সহযোগিতা না করতে যাচ্ছি. যদিও ব্যবহারকারী একটি ধনাত্মক সংখ্যা সম্পর্কে দেওয়া না সম্পর্কে এগিয়ে যান এবং n = GetInt জন্য তাদের অনুরোধ জানানো যাক, এবং আমাকে তাদের কি হিসাবে কিছু নির্দেশাবলী প্রদান করে, তাই printf ("ইতিবাচক পূর্ণসংখ্যা দয়া করে"). শুধু তাই কিছু ভালো তুলনামূলকভাবে সহজ যে সময় আমরা লাইন 14 আঘাত আমরা এখন একটি ইতিবাচক n মধ্যে সম্ভবতঃ পূর্ণসংখ্যা আছে. এখন এর সাথে কিছু করতে দিন. সম্পর্কে এগিয়ে যান এবং সঙ্কলন হিসাব করা যাক, তাই int-যোগফল = সিগমা (ঢ). সিগমা শুধুমাত্র সঙ্কলন, তাই আমি শুধু কল্পনাকারী উপায়ে তা লেখা. আমরা শুধু কল এটা আছে সিগমা করব. এর সমষ্টি, এখন আমি এবং ফলাফল প্রিন্ট আউট চলেছি, printf ("সমষ্টি হল% d \ n", সমষ্টি). এবং তারপর আমি ভাল পরিমাপ জন্য 0 ফিরে আসবেন. আমরা আকর্ষণীয় অংশ ছাড়া করেছি যা এই প্রোগ্রামের প্রয়োজন সম্পন্ন, যা আসলে সিগমা ফাংশন বাস্তবায়ন হয়. আমাকে নীচে যেতে এখানে নিচে, এবং ফাংশন সম্পর্কে সিগমা ঘোষণা করা যাক. এটি একটি পরিবর্তনশীল টাইপ পূর্ণসংখ্যা যে এর নিতে না এর, এবং কি ধরনের তথ্য আমি সম্ভবতঃ সিগমা থেকে প্রত্যাবর্তন করতে চান? Int, কারণ আমি এটা লাইন 15 আমার প্রত্যাশার সাথে মেলাতে চান. এখানে ইন আমাকে এগিয়ে যান এবং এই বাস্তবায়ন একটি চমত্কার সহজবোধ্য উপায়. এর এগিয়ে যান এবং = 0 বলতে int-সমষ্টি করা যাক, এবং এখন আমি লুপ জন্য একটু এখানে আছে যেতে চলেছি যে ভালো কিছু বলতে হচ্ছে, জন্য (int i = 0; আমি <= নম্বর; i + +) সমষ্টি + = তোমার. এবং তারপর আমি সমষ্টি ফিরে যাচ্ছি. আমি উপায় যে কোনো সংখ্যক এই বাস্তবায়িত হতে পারে. আমি যখন একটি লুপ ব্যবহার করা যেতে পারে. আমি এড়ানো সমষ্টি ভেরিয়েবল ব্যবহার করে যদি সত্যিই আমি চেয়েছিলেন যাও থাকতে পারে, কিন্তু সংক্ষিপ্ত, আমরা একটি ফাংশন যে যদি আমি না গুবলেট ঘোষণা যোগফল হয় 0 আছে. তারপর থেকে এটি 0 iterates নম্বর মাধ্যমে তার উপরে, এবং প্রতিটি পুনরাবৃত্তির এটা সমষ্টি যা বর্তমান মান যোগ করে এবং তারপর সমষ্টি ফেরৎ. এখন, এখানে আছে সামান্য অপ্টিমাইজেশান. এটি সম্ভবত একটি নষ্ট পদক্ষেপ, কিন্তু তাই এটি হতে. যে সূক্ষ্ম জন্য এখন. আমরা অন্তত হচ্ছে পুঙ্খানুপুঙ্খ এবং তার উপরে 0 সমস্ত উপায় যাচ্ছে. হার্ড খুব সুন্দর এবং সহজবোধ্য নেই, কিন্তু এটি সক্রিয় যে সিগমা ফাংশন সঙ্গে আমরা একই সুযোগ আছে হিসাবে আমরা মঞ্চে এখানে কি. পর্যায় মাত্র আমরা গণনা কতজন লোক ছিল পরের যাও সম্পর্কে, কিন্তু এর পরিবর্তে যদি আমরা সংখ্যা 3 + 2 + 1 টি গণনা চেয়েছিলেন নিচে 0 আমরা একটি ফাংশন একভাবে পান্ট পারা যে পরিবর্তে আমি হচ্ছে recursive হিসাবে বর্ণনা করব. এখানে আসুন একটি দ্রুত বৈধতা না পরীক্ষা করুন এবং নিশ্চিত আমি গুবলেট না করা. আমি জানি এই প্রোগ্রামের মধ্যে অন্তত এক জিনিস যা আমি ভুল না কি আছে. যখন আমি আঘাত লিখুন আমি আমার এ yelling কোন ধরনের পেতে যাচ্ছি? আমি কি am going to সম্পর্কে এ yelled করা হবে? হাঁ, আমি প্রোটোটাইপ ভুলে গেছি, তাই আমি একটি ফাংশন লাইন 15 নামক সিগমা ব্যবহার করছি, কিন্তু এটি লাইন 22 পর্যন্ত, আর তাই ঘোষণা না আমি ভাল proactively আপ এখানে যান এবং একটি প্রোটোটাইপ, ঘোষণা এবং আমি int-সিগমা (int-নম্বর) বলবো, এবং যে এটি. এটা নীচে বাস্তবায়িত হচ্ছে. অথবা অন্য কোনো উপায় আমি এই সমাধান করতে পারে, আমি সেখানে আপ ফাংশন, সরানো যা খারাপ হয় না পারে, কিন্তু অন্তত যখন আপনার কর্মসূচী দীর্ঘ পেতে শুরু উন্মুক্তভাবে,, আমি মনে করি সর্বদা শীর্ষে প্রধান তার মধ্যে কিছু মূল্যবান হতে পারে পাঠক মধ্যে যাতে আপনি ফাইলটি খুলুন এবং তারপরে সঙ্গে সঙ্গে দেখতে পারেন এটি মাধ্যমে অনুসন্ধান করেও কি প্রোগ্রাম করছে যে প্রধান ফাংশন খুঁজছি. এর আমার টার্মিনাল উইন্ডোতে নিচে এখানে যাওয়া যাক, সিগমা সিগমা তৈরীর চেষ্টা করা, এবং আমি এখানে মাতাল আপ খুব. ফাংশন GetInt এর অন্তর্নিহিত ডিক্ল্যারেশন মানে আমি কি কি করতে বিস্মৃত করেছি? [শ্রবণাতীত-ছাত্র] গুড, যাতে দৃশ্যত: একটি সাধারণ ভুল, তাই আসুন এখানে এই আপ করা, cs50.h, এবং এখন আমি কি আমার টার্মিনাল উইন্ডোতে ফিরে যান. আমি পর্দা পরিষ্কার, এবং আমি সিগমা করা পুন: প্রকাশ করব করব. মনে আছে কম্পাইল যাও. আমাকে এখন সিগমা চালানো. আমি 3 নম্বর, এবং টাইপ 6 আমি পাইনি, তাই করব কঠোর চেক নয়, কিন্তু অন্তত মনে হয় প্রথমে নজরে কাজ করা হবে, কিন্তু এখন এর যাক একান্তে চেরা, এবং প্রকৃতপক্ষে এর যাক recursion ধারণা লিভারেজ, আবার, খুব সহজ কনটেক্সট যাতে মধ্যে কয়েক সপ্তাহের সময় যখন আমরা অ্যারে তুলনায় শুরু কল্পনাকারী ডাটা স্ট্রাকচার অন্বেষণ আমরা টুলকিট অন্য সাথে যা আছে হাতিয়ার যারা ডাটা স্ট্রাকচার হিসাবে আমরা দেখতে পাবেন নিপূণভাবে. এই পদ্ধতির পুনরাবৃত্ত, লুপ-ভিত্তিক ব্যবস্থা. সম্পর্কে পরিবর্তে যাক এখন এই না. সম্পর্কে বলার পরিবর্তে যে সংখ্যক সঙ্কলন রূষ্ট যাও 0 সত্যিই হয় একই জিনিস নম্বর + সিগমা (নম্বর - 1). ঠিক এ পর্যায়ে মত অন্য কথায়, আমি punted জনের পরের যাও সম্পর্কে প্রতিটি, ঘুরে এবং তারা রাখা punting পর্যন্ত পরিশেষে আমরা Willy এ তলানিতে আউট, ছিল যারা 0 ভালো হার্ড কোড উত্তরটি ফেরত. এখানে এখন আমরা একভাবে সিগমা করছি punting একই ফাংশন মূলত হিসাবে বলা হয়, কিন্তু কী অন্তর্দৃষ্টি এখানে যে অভিন্নরুপে আমরা কলিং সিগমা করছি না. আমরা কথা প্রসঙ্গে n না হন. আমরা সংখ্যায় পরিষ্কারভাবে পার করছি - 1 টি, তাই সামান্য ছোট সমস্যা, সামান্য কম সমস্যা. দুর্ভাগ্যবসত, এই এখনও, পুরোপুরি একটি সমাধান না এবং আগে আমরা স্থির করা সুস্পষ্ট হিসাবে কি আপনি কয়েকটি জাম্পিং হতে পারে আউট আমাকে এগিয়ে যান এবং পুন: প্রকাশ করা. এটি ঠিক আছে কম্পাইল করা হচ্ছে. আমাকে 6 সঙ্গে সিগমা পুন: প্রকাশ. ওহো, আমাকে 6 সঙ্গে সিগমা পুন: প্রকাশ. আমরা এই দেখেছেন এমন অকস্মাৎ শেষ সময় যদিও আগে, হিসাবে ভাল. কেন আমি এই রহস্যপূর্ণ সেগমেন্টেশন ফল্ট পেতে পারি? হাঁ. [শ্রবণাতীত-ছাত্র] কোনো বেস মামলা আছে, এবং আরো নির্দিষ্টভাবে, সম্ভবত কি ঘটেছে? এটা কি আচরণ একটি উপসর্গ? এটা বলুন একটু জোরে. [শ্রবণাতীত-ছাত্র] এটি একটি অসীম কার্যকরভাবে লুপ, এবং অসীম loops সঙ্গে সমস্যা যখন তারা এই ক্ষেত্রে recursion জড়িত করা, একটি ফাংশন নিজেই কলিং, পেনশনের সময় আপনি একটি ফাংশন কল? ওয়েল, কিভাবে আমরা পাড়া একটি কম্পিউটার মেমরি আউট ফিরে মনে. আমরা বলেন যে মেমরি এই তাল নামক স্ট্যাকের নীচে যে আছে, এবং প্রত্যেক সময় আপনি একটি ফাংশন কল একটু বেশি মেমরি করা পরার এই তথাকথিত স্ট্যাকের যে ফাংশন এর স্থানীয় ভেরিয়েবল অথবা পরামিতি ধারণকারী, তাই যদি সিগমা সিগমা কল কল কল সিগমা সিগমা  সিগমা কল যেখানে আছে এই গল্প শেষ হবে? তবে, শেষ পর্যন্ত overruns মোট পরিমাণ স্মৃতি যে আছে তা দেখার জন্য আপনার কম্পিউটারে. আপনি রেখাংশ যে আপনি মধ্যে থাকার অনুমিত করছি পদদলিত করা, এবং আপনি এই সেগমেন্টেশন ফল্ট পেতে, কোর ডাম্প করা, এবং কি কোর ডাম্প করা মানে হল এই যে এখন আমি নামক কোনো ফাইল কোর আছে যা একটি ফাইল zeros এবং বেশী ধারণকারী আসলে ভবিষ্যতে diagnostically উপযোগী হতে হবে. যদি আপনি যেখানে আপনার বাগ সুস্পষ্ট না আপনি আসলে ফরেনসিক বিশ্লেষণ একটি বিট, তাই কথা বলতে না পারেন, এই কোর ডাম্প ফাইল, যা, আবার, শুধু একটি zeros এবং বেশী আভা যে মূলত আপনার প্রোগ্রামের মেমরির মধ্যে রাষ্ট্র প্রতিনিধিত্ব করে মুহূর্ত এটি এই ভাবে ক্র্যাশ করেছে. এখানে ফিক্স হয় যে আমরা অন্ধভাবে সিগমা ফিরে আসতে পারেন না, নম্বর + একটি সামান্য কম সমস্যা সিগমা. আমরা এখানে বেস ক্ষেত্রে কিছু করতে হবে, এবং সম্ভবত বেস ক্ষেত্রে কি করা উচিত? [শ্রবণাতীত-ছাত্র] ঠিক আছে, তাই যতদিন নম্বর ইতিবাচক হয় আমরা আসলে এটা ফেরত দিতে হবে, অথবা অন্য কোনো উপায় রাখা, যদি সংখ্যা হয়, বলে, <= 0 আপনি কি জানেন যে, আমি এবং এগিয়ে যেতে 0 ফিরে আসবেন, অনেক ভালো Willy করেছেন, অন্যথায় এবং, আমি আর দেরী না করে চলেছি এবং এই ফিরে, তাই এটা যে কত খাটো না তুলনায় সংস্করণ পুনরাবৃত্ত যে আমরা বেত্রাঘাত আপ প্রথম লুপ জন্য একটি ব্যবহার, কিন্তু লক্ষ্য করা যে এটি লালিত্য এই সাজান আছে. পরিবর্তে কিছু নম্বর ফিরে এবং এই সব গণিতের করণ যোগ এবং স্থানীয় ভেরিয়েবল সঙ্গে জিনিষ আপ এর পরিবর্তে আপনি করছেন এই বলে "ঠিক আছে, যদি এই একটি সুপার সহজ সমস্যা, ভালো নম্বর হল <0, সম্পর্কে অবিলম্বে 0 ফিরে যাক. " আমরা সমর্থন ঋণাত্মক সংখ্যা বিরক্ত চলুন না, তাই আমি হার্ড কোড 0 মান যাচ্ছি. কিন্তু অন্যথায়, summing এই ধারণা বাস্তবায়ন এই সংখ্যার সব একসাথে কার্যকরভাবে একটি ছোট কামড় নিতে পারেন অনেক ভালো সমস্যা আউট, আমরা কি এখানে মঞ্চে, তারপর পান্ট সমস্যা পরবর্তী ব্যক্তির বিশ্রাম, কিন্তু পরবর্তী ব্যক্তির এই ক্ষেত্রে হয় নিজেকে. এটি একটি অভিন্নরুপে নামে ফাংশন. শুধু এটি পাস প্রতিটি সময় একটি ছোট এবং ছোট ছোট সমস্যা, এবং যদিও আমরা বেশ বিধিবদ্ধ জিনিষ কোড না এখানে আছে এটা ঠিক কি টেলিফোন বইয়ের সঙ্গে সপ্তাহ 0 সালে যাওয়া. এটি ঠিক কি গত ২ সপ্তাহের মধ্যে ছিল যাচ্ছে Sean সঙ্গে এবং সঙ্গে সংখ্যার অনুসন্ধানের জন্য আমাদের বিক্ষোভ. এটি একটি সমস্যা এবং এর গ্রহণ এটা বিভাজক আবার এবং আবার. অন্য কথায়, অনুবাদের মধ্যে আছে এখন একটি উপায় এই বাস্তব জগতে কনস্ট্রাক্ট, এই মাত্রা কনস্ট্রাক্ট এবং বিভক্ত করা জেতা এবং কিছু করছেন আবার এবং আবার কোড হবে, তাই এই কিছু সময় আমরা আবার দেখতে হবে. একটি সরাইয়া হিসাবে এখন, আপনি যদি নতুন হন recursion যাও আপনি বোঝেন এখন অন্তত উচিত কেন এই মজার. আমি google.com এ যাব করছি, এবং আমি কিছু টিপস এবং ট্রিকস recursion জন্য অনুসন্ধান যাচ্ছি, লিখুন. ব্যক্তি পরের আপনাকে যদি তারা ঠিক এখন হাস্যময় ছিল না বলুন. আপনি কি recursion মানে? আপনি কি বোঝাতে চেয়েছেন-অই আছে, আমরা যান. ঠিক আছে, এখন যে সবাই বাকি. একটু ইস্টার ডিম Google-এ এম্বেড কোথাও আছে. হিসাবে একটি সরাইয়া, সংযোগগুলি আমরা অবশ্যই এর ওয়েবসাইটে প্রকাশ করা এক আজকের জন্য শুধু বিভিন্ন বাছাই আলগোরিদিম এই গ্রিড, কিছু যা আমরা গত সপ্তাহে দিকে তাকিয়ে, কিন্তু কি এই কল্পনা প্রায় এর চমৎকার হিসাবে আপনি বিভিন্ন সংক্রান্ত অ্যালগোরিদম জিনিষ আপনার মন চারপাশে মোড়ানো চেষ্টা উত্তরগুলি জানেন যে আপনি বিভিন্ন ধরনের সঙ্গে এখন খুব সহজেই শুরু করতে পারেন. ইনপুট সমস্ত বিপরীত, ইনপুট বেশিরভাগই সাজানো, ইনপুট এবং র্যান্ডম তাই ঘোষণা. হিসাবে আপনি, আবার চেষ্টা করুন, আপনার মনের মধ্যে এই জিনিস পার্থক্য যে বুঝতে লেকচার পৃষ্ঠায় কোর্স এর ওয়েবসাইটে এই URL-এ আপনি তাদের মাধ্যমে কিছু কারণ হয়ত সাহায্য করতে পারবে. আজ আমরা অবশেষে একটি সময় থেকে ফিরে এই সমস্যার সমাধান পেতে, যা ছিল যে ঠিক এই মাপের swap ফাংশন কাজ না করে, এবং কি ছিল এই ফাংশন ও swap 'র সঙ্গে মৌলিক সমস্যা, লক্ষ্য ছিল যা আবার,, একটি মান এখানে এবং এখানে বিনিময় যেমন এই যে কি হবে? আসলে এই কাজ করছে না. কেন? হাঁ. [শ্রবণাতীত-ছাত্র] ঠিক, এই bugginess জন্য ব্যাখ্যা সহজভাবে ছিল কারণ যখন আপনি সি ইন ফাংশান কল এবং যারা ফাংশন নিতে এবং a ও b এখানে ভালো আর্গুমেন্ট,, আপনি যাহা মান আপনি যে ফাংশন প্রদান করছেন কপি মধ্যে ক্ষণস্থায়ী হয়. আপনি নিজেদের মূল মান প্রদান করা হয় না, তাই আমরা buggyc পরিপ্রেক্ষিতে এই দেখেছি, buggy3.c, যা একটি ভালো সামান্য কিছু লাগছিল. প্রত্যাহার করা ছিল যে আমরা এক্স এবং ওয়াই 1 এবং 2 যাও সক্রিয়া যথাক্রমে,. এরপর আমরা প্রিন্ট করে তারা কি ছিল. আমি পরে দাবি করে যে আমি x, y মাপের একটি swap কল করে তাদের ছিল সোয়াপিং. কিন্তু সমস্যা ছিল যে সোয়াপিং কাজ, কিন্তু শুধুমাত্র swap-সুযোগ নিজে কাজ. আমরা যত শীঘ্র লাইন 40 যারা মান আনা আঘাত দূরে নিক্ষিপ্ত হয়েছিল, তাই কিছুই আসল ফাংশন প্রকৃতপক্ষে প্রধান পরিবর্তিত হয়েছিল এ সব, তাই আপনি যদি মনে ফিরে যাও কি আমাদের মত এই মেমরি শর্ত হিসাবে দেখায় তারপর যদি এই বোর্ডের বাম দিকে উপস্থাপন- এবং আমি সবার জন্য আমার ভাল দেখতে চেষ্টা করব এই যদি এই বোর্ডের বাম দিকে প্রতিনিধিত্ব করে, আপনার RAM-র বলে, এবং এই স্ট্যাকের উপায় আপ উপর বাড়া হবে, এবং আমরা প্রধান মত একটি ফাংশন কল, এবং প্রধান 2 স্থানীয় ভেরিয়েবল, এক্স এবং ওয়াই আছে, এর এখানে x হিসাবে যারা বর্ণনা দেওয়া, এবং এর যাক y হিসাবে এখানে এইসব বর্ণনা, এবং এর মান 1 এবং 2 রাখা যাক, তাই এখানে এই মূল, এবং যখন প্রধান ফাংশন কল করা swap অপারেটিং সিস্টেম দেয় স্ট্যাকের উপর মেমরি ও swap 'র নিজস্ব জমিতে সারিবদ্ধভাবে পড়ে - থাকা কাটা ফসল ফাংশন, তার স্ট্যাকের উপর নিজের ফ্রেম, তাই কথা বলতে. এছাড়াও এই ints জন্য 32 বিট বরাদ্দ. এটি তাদের একটি এবং বো কল ঘটবে, কিন্তু এটা সম্পূর্ণই নির্বিচারে. তা যাই হোক না কেন এটি করতে চায় বলা যেতে পারে, কিন্তু কি যখন প্রধান কল করতে swap হল এই 1 লাগে, সেখানে একটি কপি রাখে, সেখানে একটি কপি রাখে. 1 জন swap 'র মধ্যে স্থানীয় পরিবর্তনশীল এখন পর্যন্ত যদিও, বলা কি? >> Tmp. Tmp, তাই আমাকে অন্য নিজেকে এখানে 32 বিট দিতে, এবং কি আমি এই ফাংশন কি? আমি একটি int-tmp পায়, তাই একটা 1 আছে, তাই আমি এই কি শেষ যখন আমরা এই উদাহরণ সঙ্গে খেলেছে. তারপর একটি বো পায়, সুতরাং 2 b হয়, তাই এখন এই পরিণত 2, এবং এখন খ পায় temp, তাই temp 1 টি, তাই এখন বো হয়ে এই. দারুণ. এটা কাজ করে. কিন্তু তারপর যত তাড়াতাড়ি ফাংশন আয় মেমরি ও swap 'র এর কার্যকরভাবে disappears যাতে এটি পুনঃব্যবহৃত করা যায় ভবিষ্যতে অন্যান্য ফাংশন দ্বারা, এবং প্রধান হয় সম্ভবত সম্পূর্ণরূপে অপরিবর্তিত. আমরা মৌলিকভাবে এই সমস্যা সমাধানের একটি উপায় প্রয়োজন, এবং আজকে আমরা পরিশেষে এই করছেন যেখানে একটি উপায় হবে আমরা কিছু নামক একটি পয়েন্টার পরিচয় করিয়ে দিতে পারেন. এটা পরিনত হয় যে আমরা এই সমস্যার সমাধান করতে পারেন দ্বারা ক্ষণস্থায়ী x এবং y কপি না কিন্তু এর পরিবর্তে কি কথা প্রসঙ্গে দ্বারা, আপনি swap-র কার্যকারিতা যাও না, মনে হয়? হাঁ, আমার ঠিকানা কি? আমরা সত্যিই আছে সায়ীদ ঠিকানা সম্বন্ধে অনেক বিষদভাবে না, কিন্তু যদি এই বিদ্যালয়ে লিপির জন্য তক্তা আমার কম্পিউটার এর মেমরি উপস্থাপন আমরা অবশ্যই শুরু আমার RAM-র মধ্যে বাইট সংখ্যায়ন পারে এবং বলা হয় এই বাইট # 1, এই বাইট # 2, বাইট # 3, # 4 বাইট, বাইট # ... 2 বিলিয়ন যদি আমি উপস্থিত RAM-র 2 গিগাবাইট আছে, তাই আমরা অবশ্যই কিছু অবাধ সংখ্যায়ন যোজনা আপ আসতে পারে আমার জন্য সব কম্পিউটার এর মেমরি পৃথক বাইট. যদি পরিবর্তে যখন আমি কল করতে swap x এবং y কপি মধ্যে বদলে পাস কেন x এখানে ঠিকানা পরিবর্তে আমি না পাস, y এখানে ঠিকানা, মূলত পোস্টাল ঠিকানা এক্স এবং ওয়াই তারপর কারণ, swap যদি তিনি অবগত এর এর x এবং y এর মেমরি ঠিকানা, তারপর, swap যদি আমরা প্রশিক্ষণ অল্প তাকে, তিনি সম্ভাব্য যে ঠিকানা যাও, তাই কথা বলতে চালাতে পারে, x, সেখানে নম্বর পরিবর্তন, তাহলে y ঠিকানা চালাতে, সংখ্যা আছে পরিবর্তন, এমনকি যারা মান নিজেকে কপি আসলে না পেয়ে, সুতরাং যদিও এই সম্পর্কে আমরা হচ্ছে এর প্রধান মেমরি হিসাবে সায়ীদ এবং এই হিসাবে হচ্ছে মেমরি ও swap 'র এর শক্তিশালী এবং C-এর বিপজ্জনক অংশ যে কোনো ফাংশন মেমরি স্পর্শ কোথাও কম্পিউটার পারেন, এবং এই শক্তিশালি যে আপনি সি ইন কম্পিউটার প্রোগ্রাম দিয়ে খুব অভিনব জিনিস করতে পারেন এটি বিপজ্জনক কারণ আপনি স্ক্রু আপ খুব সহজেই করতে পারেন. আসলে, প্রোগ্রামের জন্য সবচেয়ে সাধারণ উপায় এই দিন এক শোষণ করা এখনও জন্য একজন প্রোগ্রামার না বুঝতে যাও তিনি একটি তথ্য করার অনুমতি দেয় না মেমরির মধ্যে একটি অবস্থান ছিল না যে উদ্দেশ্যে করা হবে. উদাহরণস্বরূপ, সে আকার 10 শ্রেণীবিন্যাস ঘোষণা কিন্তু ঘটনাক্রমে তখন মেমরি যে অ্যারের মধ্যে 11 বাইট চেষ্টা করা, এবং আপনি শুরু অংশে মেমরি যা আর কার্যকর নেই স্পর্শ. শুধু প্রাসঙ্গিক এই যাও, আপনি কিছু জানতে পারে যে প্রায়ই সফ্টওয়্যার সিরিয়াল নম্বর বা নিবন্ধন নির্দেশক জন্য অনুরোধ জানানো, ফটোশপ এবং শব্দ এবং ভালো প্রোগ্রাম. বিদ্যমান ফাটল আছে, হিসাবে আপনি কিছু জানেন, যেখানে আপনি একটি অনলাইন সামান্য প্রোগ্রাম রান করতে পারেন, এবং voila, কোন একটি সিরিয়াল নম্বর জন্য আরো অনুরোধ. কিভাবে যে কাজ করছে? অনেক ক্ষেত্রে এই জিনিষ শুধু কম্পিউটারের হয় ফাইন্ডিং কম্পিউটার এর প্রকৃত zeros এবং বেশী টেক্সট খন্ডের যেখানে যে ফাংশন যেখানে সিরিয়াল নম্বর অনুরোধ করা হয়, এবং আপনি যে স্থান, মুছে ফেলা বা যখন প্রোগ্রাম চালানো সম্ভব আপনি আউট যেখানে আসলে কী সংরক্ষিত হয় জিনিসটা করতে পারেন কিছু ব্যবহার নামক একটি ডিবাগার, সফ্টওয়্যার এবং আপনি যে উপায় ফাটল পারেন. ফলে আগামী কয়েকদিনের জন্য যে এটা আমাদের উদ্দেশ্য বলতে হয় না, কিন্তু এটা খুবই বাস্তব ramifications আছে. যে একটি সফ্টওয়্যার চুরি জড়িত করা হবে, কিন্তু এর রয়েছে সমগ্র মেশিনে আপস. আসলে, যখন ওয়েবসাইটের এই দিন শোষিত হয় এবং বোঝাপড়া এবং তথ্য ফাঁস হয় এবং পাসওয়ার্ড চুরি হয় এই এক এর মেমরি প্রায়ই খুব দরিদ্র পরিচালনার সাথে সম্পর্কিত, উপাত্ত ক্ষেত্রে বা,, ব্যর্থতা কহা যাও adversarial ইনপুট, যে, তাই আরো সপ্তাহের মধ্যে আসে, কিন্তু জন্য এখন শুধু একটা ক্ষতি ধরণের স্নিক প্রিভিউ যে আপনি কি করতে পারেন দ্বারা অন্তর্দৃষ্টিসম্পন্ন বেশ কিভাবে যে ফণা নীচে কাজ না. চলুন অন্তর্দৃষ্টিসম্পন্ন কেন এই নষ্ট হয়ে যাওয়া সম্পর্কে একটি টুলের সাথে যে আরো এবং আরো কার্যকর হয়ে যাবে আমাদের প্রোগ্রাম হিসাবে পেতে আরো জটিল. এ পর্যন্ত যখন আপনি আপনার প্রোগ্রামের মধ্যে একটি বাগ ছিল করেছি কিভাবে আপনি এটা ডিবাগ সম্পর্কে চলে গেছে? আছে কি আপনার কৌশল হয়েছে পর্যন্ত, আপনার দ্বারা TF কিনা পড়ানো বা শুধুমাত্র স্বশিক্ষিত? [ছাত্র] Printf. Printf, তাই printf সম্ভবত যে হয়েছে আপনার বন্ধু যদি আপনি দেখতে চান আপনার প্রোগ্রাম কি যাচ্ছে ভেতরের এর আপনি ঠিক করা printf এখানে, এখানে printf, printf এখানে. এর পরে আপনি এটি চালানো এবং আপনি একটি কাপড় সমগ্র পর্দায় গুচ্ছ পেতে আপনি যে আসলে কি হয় তারপর আপনার প্রোগ্রামে যাচ্ছে ভুল অনুমান ব্যবহার করতে পারেন. Printf একটি খুব শক্তিশালী জিনিস হতে থাকে, কিন্তু এটি একটি খুব ম্যানুয়াল প্রক্রিয়া. আপনি এখানে একটি printf দিতে হবে, একটি printf এখানে, এবং যদি আপনাকে করা একটি লুপ এর ভিতরে এটি আপনি 100 লাইন পেতে পারে আউটপুট যে আপনি তারপর খুঁজে বার করতে হবে. এটি একটি খুব প্রোগ্রাম ডিবাগ করার জন্য ব্যবহারকারী বান্ধব বা ইন্টারেক্টিভ প্রক্রিয়া না, কিন্তু সৌভাগ্যক্রমে বিদ্যমান বিকল্প আছে. উদাহরণস্বরূপ একটি প্রোগ্রাম,, বলা GDB, গনু ডিবাগার আছে, যা একটি কিভাবে আপনি এটি ব্যবহার করতে একটু রহস্যময়. এটা একটু জটিল, কিন্তু অকপটে, এই এক সেগুলো যেখানে আপনি যদি এই সপ্তাহে রাখা এবং পরবর্তী অতিরিক্ত ঘন্টা GDB ভালো কিছু বুঝতে এটি লং রান আপনাকে ঘন্টার সম্ভবত দশ সংরক্ষণ করা, যাতে সঙ্গে, আমাকে আপনি কিভাবে এই জিনিস কাজ একটি টিজার দিতে. আমি আমার টার্মিনাল উইন্ডোর মধ্যে আছি. আমাকে এগিয়ে যান এবং এই প্রোগ্রাম, buggy3 সঙ্কলন. এটা ইতিমধ্যেই আপ টু ডেট. আমাকে এটা ঠিক আমরা যখন ফিরে করেছিল, এবং প্রকৃতপক্ষে, এটি নষ্ট হয়ে গেছে এর চালানো. কিন্তু কেন এই? হয়তো আমি মাতাল করা swap ফাংশন আপ. হতে পারে এটি একটি এবং খ. আমি তাদের করছি বেশ কাছাকাছি চলন্ত না সঠিকভাবে. আমাকে এগিয়ে যান এবং এই কাজের জন্য. বরং buggy3 ঠিক চালানো সম্পর্কে পরিবর্তে এই প্রোগ্রাম GDB চালানো যাক, এবং আমি তা buggy3 চালানো বলতে যাচ্ছি, এবং আমি একটি কমান্ড লাইন আর্গুমেন্ট,-tui অন্তর্ভুক্ত চলেছি, এবং আমরা বৈশিষ্ট ভবিষ্যতে এ সমস্যার কথা মনে করিয়ে দেয়া এই রেখে দেব. এবং এখন এই কালো এবং সাদা ইন্টারফেস popped যে আবার,, প্রথমে একটি ছোট অপ্রতিরোধ্য কারণ এই সব আছে এখানে নিচে পাটা তথ্য, কিন্তু অন্তত কিছু পরিচিত আছে. উইন্ডোর উপরের হয় আমার আসল কোড, এবং যদি আমি এখানে স্ক্রল আপ দিন সম্পর্কে আমার খুব ফাইলের উপরে স্ক্রল, এবং প্রকৃতপক্ষে, এই উইন্ডোর নিচে আছে buggy3.c, এবং বিজ্ঞপ্তি আমি এই GDB প্রম্পট আছে. এই আমার স্বাভাবিক জন হার্ভার্ড প্রম্পট হিসাবে একই নয়. এটি একটি প্রম্পট যে সম্পর্কে GDB নিয়ন্ত্রণের অনুমতি যাচ্ছে. GDB একটি ডিবাগার. একটি ডিবাগার একটি প্রোগ্রাম যা আপনাকে ভিতর দিয়ে হেটে যেতে পাতিপাতি দ্বারা আপনার লাইন প্রোগ্রাম সঞ্চালনের, বরাবর কিছু উপায় আপনি প্রোগ্রাম চাই করছেন, এমনকি কর্ম কলিং, বা খুঁজছেন, আরো গুরুত্বপূর্ণ, এ বিভিন্ন ভেরিয়েবল এর মান. চলুন এগিয়ে যান এবং এই কাজের জন্য. আমি এগিয়ে যান এবং GDB এর প্রম্পটে টাইপ করুন রান চলেছি, পর্দায় নীচে আমি টাইপ করেছি চালানোর জন্য ফেলে রাখা যাতে এ বিজ্ঞপ্তি, এবং আমি এন্টার, এবং যে কি করেছি কি না? এটা আক্ষরিক আমার প্রোগ্রাম চলে, কিন্তু আমি এখানে অনেক যান নি আসলে দেখতে না কারণ আমি ডিবাগার ডটকমকে বলেন, আসলে না একটি সময় নির্দিষ্ট মুহূর্তে বিরতি. শুধু রান টাইপ প্রোগ্রাম চালায়. আমি কিছু আসলে কি দেখতে পাচ্ছেন না. আমি এটা না নিপূণভাবে পারেন. পরিবর্তে আমাকে এই কাজের জন্য. এই GDB প্রম্পটে আমাকে পরিবর্তে বিরতি, টাইপ লিখুন. আমি যে কি টাইপ অভিপ্রেত নয়. এর পরিবর্তে আসুন বিভাজক প্রধান টাইপ করুন. অন্য কথায়, আমি কিছু নামক একটি ব্রেকপয়েন্ট সেট করতে চান, যা যথাযোগ্যভাবে নামে হয় কারণ এটি বা বিরতি ভঙ্গ করা হবে যে নির্দিষ্ট স্থানে আপনার প্রোগ্রাম সঞ্চালনের. মুখ্য আমার ফাংশনের নাম. উল্লেখ্য, GDB বেশ স্মার্ট. এটা মূর্ত যে প্রধান যাও প্রায় লাইন 18 এ শুরু ঘটবে এর buggy3.c, তারপর উপরের বাম এবং এখানে লক্ষ্য করা B + হয় লাইন 18 পরের অধিকার. যে সম্পর্কে এর স্মারক যে আমি লাইন 18 এ একটি ব্রেকপয়েন্ট সেট আছে. এই সময় যখন আমি রান টাইপ করুন, আমি আমার প্রোগ্রাম চালানো যাচ্ছে না আপ পর্যন্ত এটি যে ব্রেকপয়েন্ট হিট, তাই প্রোগ্রাম লাইন 18 এ সম্পর্কে জন্য বিরতি করবে না. এখানে আমরা, যেতে চালানো. কিছুই প্রদর্শিত করেছে যাও, কিন্তু নীচে বাম বিজ্ঞপ্তি শুরু প্রোগ্রাম, buggy3, প্রধান মধ্যে buggy3.c লাইন 18 এ ব্রেকপয়েন্ট 1. এখন আমি কি করতে পারি? আমি লক্ষ্য মুদ্রণ ভালো জিনিস টাইপ শুরু করতে পারেন, না printf, মুদ্রণ x, এখন যে অদ্ভুত. $ 1 শুধুমাত্র একটি কৌতূহল, হিসাবে আমরা দেখতে পাবেন প্রত্যেক সময় আপনি কিছু প্রিন্ট করার জন্য একটি নতুন মান পেতে $. যাতে যে আপনি শুধু ক্ষেত্রে পূর্ববর্তী মান পড়ুন ফিরে যেতে পারেন, কিন্তু এখন জন্য কি মুদ্রণ আমাকে বলছে যে x গল্প এই সময়ে মূল্য একটি দৃশ্যত: 134514032. কি? যেখানে এমনকি বার থেকে এসেছে? [শ্রবণাতীত-ছাত্র] প্রকৃতপক্ষে, এই কি আমরা একটি গার্বেজ মান ডাকবো, এবং আমরা এই সম্পর্কে এখনো করেছি বলত না, কিন্তু যে কারণে আপনি ভেরিয়েবল আরম্ভ সম্ভবত হয় যাতে তারা কিছু মান যে আপনি তাদের চান আছে. কিন্তু ধরা যে আপনি ভেরিয়েবল ডিক্লেয়ার করতে পারেন প্রত্যাহার করা হয় আমি আমার মত সিগমা উদাহরণে কি একটি মুহূর্ত আগে ছাড়া আসলে একটি মান প্রদান করে তাদের. পুনরাহ্বান কি আমি সিগমা এখানে উপর. আমি ঘোষিত হবে, কিন্তু কি মান আমি তা দিতে হবে কেন? কেউ না, কারণ আমি জানতাম যে পরের কয়েক লাইন GetInt n র অভ্যন্তরে একটি মান বসিয়ে সমস্যা যত্ন নিতে হবে. কিন্তু লাইনে 11 বিবরণ এই বিন্দু লাইন এবং 12 এবং 13 লাইন এবং লাইন 14 সারা যারা কয়েক লাইন কি হবে মান কি? সি ঠিক আপনি জানেন না. সাধারণভাবে এর মান কিছু আবর্জনা, কিছু সম্পূর্ণভাবে র্যান্ডম সংখ্যা যে কিছু আগের ফাংশান থেকে বামে মূলত এর উপর না, তাই চালাতে হিসাবে আপনার প্রোগ্রাম রান করা হয়েছে পুনরাহ্বান যে ফাংশন ফাংশন, ফাংশন, ফাংশন পায়. এই সমস্ত ফ্রেম মেমরিতে রাখতে এবং যারা ফাংশন তারপর ফিরে পেতে, এবং ঠিক মত আমি রবার তাদের মেমরি ঘটনাচক্রে, পুনঃব্যবহৃত সঙ্গে প্রস্তাবিত. ওয়েল, শুধু তাই এই প্রোগ্রামে যে এই পরিবর্তনশীল x ঘটবে মনে হচ্ছে কিছু 134514032 মত গার্বেজ মান অন্তর্ভুক্ত আছে আগের থেকে কিছু ফাংশন, এক না যে আমি লিখেছি. এটা কিছু অপারেটিং সিস্টেমের সাথে কার্যকরীভাবে আসে হতে পারে, ফণা নীচে কিছু ফাংশন. ঠিক আছে, যে সূক্ষ্ম, কিন্তু এর পরের লাইন যাও এখন দিন আগাম. যদি আমি আমার GDB প্রম্পটে "পরবর্তী" টাইপ করুন এবং আমি আঘাত লিখুন, যে বিজ্ঞপ্তি হাইলাইট প্যাচসমূহ লাইন 19 ডাউন, কিন্তু লজিক্যাল সংশ্লেষ হয় যে লাইন 18 এখন সমাপ্ত নির্বাহ করেনি, তাই যদি আমি আবার টাইপ করুন "মুদ্রণ x" আমি এখন 1, দেখতে হবে এবং সত্যিই, আমি না. আবার, $ স্টাফ হয় GDB আপনি স্মারক একটি উপায় কি প্রিন্টগুলিকে ইতিহাস যে আপনি করেছেন. এখন আমার এগিয়ে যান এবং y মুদ্রণ নিকাশ করা, এবং প্রকৃতপক্ষে, y কিছু ছবি হিসাবে মান ভাল, কিন্তু লাইন 19 সালে কোন বড় চুক্তি কারণ সম্পর্কে আমরা এটি ধার্য করছি মান 2, তাই আমাকে আবার "পরবর্তী" টাইপ করুন. এবং এখন আমরা printf লাইন করছি. আমাকে মুদ্রণ x না. আমাকে মুদ্রণ y না. সত্যি, আমি সামান্য এই মুদ্রণ মধ্যে ক্লান্ত পেয়ে করছি. আমাকে পরিবর্তে "এক্স ডিসপ্লে" এবং "প্রদর্শন y, ও" টাইপ করুন এবং এখন প্রত্যেক সময় আমি ভবিষ্যতে একটি কমান্ডটি টাইপ করুন আমি কি এর মধ্যে হবে স্মরণ করিয়ে x এবং y, ও কি x এবং y, ও কি এক্স এবং ওয়াই. আমি এছাড়াও, হিসাবে একটি সরাইয়া মধ্যে, টাইপ "তথ্য অঁচলবাসী." করতে পারেন তথ্য একটি বিশেষ কমান্ড. স্থানীয় মানে এটা দেখায় স্থানীয় ভেরিয়েবল সম্পর্কে. যদি এমন কিছু আমি ভুলে যান বা এই একটি ছবি, জটিল ফাংশন যে আমি বা অন্য কারোর লিখেছেন স্থানীয় তথ্য আপনাকে জানানো হবে এই সব স্থানীয় ফাংশন ভিতরে স্থানীয় ভেরিয়েবল কি যে আপনি যদি আপনার কাছাকাছি অকর্মা চান যত্নশীল হতে পারে. এখন printf, হয় চালানো সম্পর্কে, তাই এগিয়ে সম্পর্কে এবং শুধুমাত্র টাইপ যাওয়া "পরের." কারণ আমরা এই পরিবেশে থাকেন আমরা এটি আসলে এইজন্য করছি না এখানে নিচে চালানো, কিন্তু এটি একটি সামান্য mangled এখানে লক্ষ্য করা হচ্ছে. কিন্তু লক্ষ্য করা এটি এর পর্দায় অগ্রাহ্য করা আছে, তাই, কিন্তু এখানে একটি নির্ভুল প্রোগ্রাম না যে ঠিক কারণ আমি সবসময় অকর্মা কাছাকাছি পারেন মুদ্রণ ব্যবহার যদি আমি করতে চান. সম্পর্কে পরের আবার টাইপ করা যাক, এবং এখন এখানে আকর্ষণীয় অংশ. Y বিবরণ এই পর্যায়ে হল 2, এবং এক্স 1 টি, এখানে প্রস্তাব হিসাবে, এবং আবার, এই কারণে এখন স্বয়ংক্রিয়ভাবে প্রদর্শন করা হয় কারণ আমি কমান্ড ব্যবহার করুন প্রদর্শনের x এবং y প্রদর্শন, যাতে মুহূর্ত আমি টাইপ পরবর্তী তত্ত্ব x এবং y মধ্যে অদলবদল হওয়া উচিত. এখন, ইতিমধ্যে আমরা জানি যে কেস করা যাচ্ছে না, কিন্তু আমরা এক মুহূর্ত কিভাবে আমরা চিন্তা কেন যে সত্য গভীর আকর্ষণীয় করতে পারেন দেখতে পাবেন. এর পরে, এবং দুর্ভাগ্যবশত, y এখনও 2 x এবং এখনও 1, এবং আমি যতটা নিশ্চিত করতে পারেন. প্রিন্ট করুন x, y মুদ্রণ. প্রকৃতপক্ষে, আসলে কোন সোয়াপিং ঘটেছে করেনি, তাই আসুন এই শুরু. স্পষ্টত: swap 'র নষ্ট হয়ে গেছে. যাক এর পরিবর্তে আবার "রান" টাইপ করুন. সম্পর্কে হ্যা বলা যাক, আমি শুরু থেকে এটি পুনরায় আরম্ভ করতে চান, লিখুন. এখন আমি ফিরে আপ লাইনে 18. এখন লক্ষ্য করা x এবং y আবার আবর্জনা মান. এর পরে, পরের, পরের, পরের. যদি আমি পেতে উদাস আমি এছাড়াও পরের জন্য n টাইপ করতে পারেন. আপনি এটা অক্ষরের কম সম্ভব ক্রম যাও সংক্ষিপ্ত করতে পারেন. Swap এখন হয় নষ্ট হয়ে গেছে. ঢুকা ডুব এর, তাই এর পরিবর্তে টাইপ পরের, এখন আমি ধাপে টাইপ যাচ্ছে যাতে আমি এই ফাংশনের ভিতর পদবিন্যাস করছি করছি যাতে আমি এটা ভিতর দিয়ে হেটে যেতে পারে, তাই আমি ধাপে আঘাত এবং তারপর লিখুন. যে হাইলাইট জাম্প নিচে আমার প্রোগ্রামের নিচের লাইন 36 লক্ষ্য. এখন কি হচ্ছে স্থানীয় ভেরিয়েবল? স্থানীয় তথ্য. কিছুই এখনও কারণ আমরা যে লাইনে অর্জিত না করেছি, তাই এর এগিয়ে যান এবং বলে দিতে "পরের." এখন আমরা tmp, মুদ্রণ tmp আছে বলে মনে হচ্ছে. জঞ্জাল মান, ডান? আমি তাই মনে করি. কেমন হয়, মুদ্রণ বো, 1 এবং 2 মুদ্রণ? একটি মুহূর্ত, যত তাড়াতাড়ি সম্ভব আমি আবার পরের টাইপ করুন tmp 1 একটি মান, যাও আশা নিয়ে হয়, কারণ tmp একটি মান নির্ধারিত করা হবে. এখন এর একটি, মুদ্রণ বো না মুদ্রণ যাক, কিন্তু এখন tmp, মুদ্রণ এবং এটা সত্যিই এর 1. আমাকে না পরের. আমাকে না পরের. আমি ও swap 'র ফাংশন সমাপ্ত করেছি. আমি এটা এখনও লাইন 40 সালে ভিতর, তাই সম্পর্কে একটি মুদ্রণ যাক, মুদ্রণ বো, এবং আমি কি tmp হয় না যত্ন. মনে হয় ও swap 'র সঠিক যখন এটি একটি এবং বো সোয়াপিং আসে. কিন্তু এখন যদি আমি পরের টাইপ করুন, আমি লাইন 25 ফিরে তিড়িং লাফ, এবং অবশ্যই, আমি যদি এক্স এবং মুদ্রণ y টাইপ তারা এখনও অপরিবর্তিত, যাতে আমরা সমস্যার সমাধান করেন নি. কিন্তু diagnostically এখন সম্ভবত সঙ্গে এই GDB প্রোগ্রাম আমরা অন্তত করেছি অর্জিত এক ধাপ বোঝার কাছাকাছি কি হচ্ছে এখানে একটি printf নির্বাণ দ্বারা আমাদের কোড শিবিকা যাও ছাড়া যাচ্ছে ভুল, printf printf এখানে, এখানে এবং তারপর এটি পুনরায় চালানো এবং আবার যাও জিনিসটা কি ভুল করার চেষ্টা করে যাচ্ছে. আমি এগিয়ে যান এবং সঙ্গে প্রস্থান করার জন্য এই পুরাপুরি আউট করে প্রস্থান করার যাচ্ছি. এটি তারপর বলে যাচ্ছে, "যাইহোক প্রস্থান?" হ্যাঁ. এখন আমি আমার স্বাভাবিক প্রম্পটে ফিরে না, এবং আমি GDB ব্যবহার করা যাবে না. একটি সরাইয়া হিসাবে, আপনি এই-tui পতাকা ব্যবহার করার প্রয়োজন হবে না. বস্তুত, যদি আপনি এটি উপেক্ষা করা পাবেন মূলত পর্দার নীচে অর্ধেক. যদি আমি বিভাজক প্রধান টাইপ করুন এবং তারপরে চালানোর আমি এখনও আমার প্রোগ্রাম চালাতে পারেন, কিন্তু এটি কি করতে হবে আরো মূল পাঠ্য শুধুমাত্র একটি সময়ে প্রদর্শন বর্তমান এক লাইন সম্পর্কে. -Tui, পাঠগত ইউজার ইন্টারফেস, শুধু দেখায় আপনি একবার, যা সম্ভবত একটি বিট ধারণার সহজ এ প্রোগ্রামের আরো. কিন্তু প্রকৃতপক্ষে, আমি ঠিক পাশেই, পরের, পরের করতে পারেন, এবং আমি একটা সময়ে এক লাইন দেখতে যাওয়া, এবং করছি যদি আমি সত্যিই কি ঘটছে তা দেখতে চান আমি তালিকা টাইপ করুন এবং একটি প্রতিবেশী লাইন আভা দেখতে পারেন. একটি ভিডিও যে আমরা যে আপনার জন্য সমস্যা 3 সেট করে ঘড়ি জিজ্ঞাসা করেছি আছে যা Nate জুড়ে GDB এর intricacies কিছু, এবং এই যে এক জিনিস ভাল,, যেখানে হয়ত অ তুচ্ছ শতাংশ GDB, স্পর্শ না এবং যে কোনো খারাপ জিনিস হবে কারণ আপনি আক্ষরিক আপ আরো সময় কাটানোর পরে এই সেমিস্টারে ভর্তি করা শেষ হয়ে যাবে পশ্চাদ্ধাবন বাগ নিচে তারপর আপনি যে আধা ঘন্টা / ঘন্টার মধ্যে যদি আপনাকে করা হবে এই সপ্তাহে এবং পরবর্তী লার্নিং GDB করতে স্বাচ্ছন্দ্য পেতে. Printf ছিল আপনার বন্ধু. GDB এখন আপনার বন্ধু হতে হবে. GDB উপর কোন প্রশ্ন? এবং এখানে একটি সবচেয়ে শক্তিশালী এবং সহায়ক কমান্ডের কিছু দ্রুত তালিকা. হাঁ. >> একটি পংক্তি আপনি প্রিন্ট করতে পারি? একটি পংক্তি আপনি প্রিন্ট করতে পারেন? একেবারে. এটি শুধুমাত্র পূর্ণসংখ্যা হতে হবে তা নয়. যদি একটি ভেরিয়েবল গুলি একটি স্ট্রিং মুদ্রণ গুলি ঠিক টাইপ. এটা আপনাকে দেখাতে হবে যে কি স্ট্রিং পরিবর্তনশীল হয়. [শ্রবণাতীত-ছাত্র] এটি ঠিকানা এবং স্ট্রিং নিজেই আপনাকে দিয়ে দেবে. এটি আপনার উভয় প্রদর্শন করবে. এবং গত এক জিনিস ঠিক হয়, কারণ এই খুব ভাল জানি. Backtrace এবং ফ্রেম, আমাকে এই এক সময় শেষ মধ্যে আকর্ষণীয়, একই সঙ্গে GDB সঠিক প্রোগ্রাম. সম্পর্কে এগিয়ে যান এবং পাঠগত ইউজার ইন্টারফেস সংস্করণ ইনস্টল করা যাক, প্রধান বিরতি. আমাকে এগিয়ে যান এবং পুনরায় সঞ্চালন করা হয়. এখানে আমি. এখন আমার পরের পরের পরের পরের পরের চলুন, পদক্ষেপ, লিখুন. এবং এখন আমি অনুমান করা swap 'র মধ্যে এখন আমি ইচ্ছাকৃতভাবে, কিন্তু আমি ভালো আছি "অভিশাপ, x এর মান কি ছিল?" আমি আর x না পারেন. আমি y কারণ তারা সুযোগ মধ্যে থাকেন না করতে পারে না. তারা প্রেক্ষাপটে করছি কিন্তু কোন সমস্যা নেই, না. আমি backtrace টাইপ করতে পারেন. যে দেখায় ফাংশন যে সময় এই বিষয়টি কে আছে মৃত্যুদন্ড পর্যন্ত সব সম্পর্কে. যে উল্লেখ্য নীচে এক, প্রধান, প্রধান লাইন আপ হচ্ছে এখানে আমাদের ছবি নীচের অংশে অবস্থিত. যে এটি লাইনের উপরে করতে swap আপ উপরে মাপের swap হচ্ছে এখানে মেমরি সহ, এবং আমি যদি অস্থায়ীভাবে প্রধান ফিরে পেতে চাই আমি "ফ্রেম." বলতে পারেন কি নম্বর? মুখ্য হল ফ্রেম # 1. আমি এগিয়ে যান এবং বলে যাচ্ছে "ফ্রেম 1." করছি এখন আমি প্রধান ফিরে না, এবং আমি এক্স মুদ্রণ করতে পারেন, এবং আমি y মুদ্রণ করতে পারেন, কিন্তু আমি একটি বা বো না মুদ্রণ করতে পারেন. কিন্তু আমি, আমি যদি বলতে পারেন, "ঠিক আছে, এক মিনিট. অপেক্ষা করতে swap কোথায় ছিল?" সম্পর্কে এগিয়ে যান এবং বলা যাক "ফ্রেম 0." এখন আমি যেখানে আমি ফিরে যাও হতে চান, এবং একটি হিসাবে সরাইয়া, খুব আছে অন্যান্য কমান্ডের মত যদি সত্যিই আপনি উদাস টাইপ পরের পরের পরের পরের করছি পেয়ে, আপনি সাধারণত ভালো জিনিস "পরবর্তী 10," বলতে পারেন এবং যে পরবর্তী 10 লাইনের মাধ্যমে পইঠা হবে. আপনি লিখতে পারেন "continue" যখন সত্যিই আপনি এটি দিয়ে পদবিন্যাস সঙ্গে নিয়ে বিরক্ত হতে. আপনার প্রোগ্রাম চালিয়ে বাধা ছাড়াই পর্যন্ত এটি অন্য ব্রেকপয়েন্ট হিট চালানো হবে, কিনা মধ্যে একটি লুপ বা আপনার প্রোগ্রামের নিচে কম. এই ক্ষেত্রে আমরা শেষ করে, এবং সাধারণত প্রোগ্রাম থেকে প্রস্থান করেছে. এটি একটি অভিনব উপায়, নিকৃষ্ট প্রক্রিয়া. শুধু আপনার প্রোগ্রাম সাধারণত প্রস্থান করেছে. ভিডিও এবং সেশান আসতে ডিবাগ যে আরো. যে ছিল অনেক. চলুন শুরু করা যাক এখানে আমাদের 5 মিনিটের বিরতি নিতে, এবং আমরা structs এবং ফাইল সঙ্গে ফিরে আসবেন. যদি আপনি ইতিমধ্যেই এই সপ্তাহে এর pset মধ্যে dived আছে আপনি যে আমরা ডিস্ট্রিবিউশন কোড ব্যবহার করব জানি, সোর্স কোড যে আমরা আপনাকে একটি আদ্যস্থল, কিছু নতুন কৌশল হিসাবে প্রদান. বিশেষ করে, আমরা চালু গঠন জন্য এই নতুন অভিব্যক্তি নামক struct,, যাতে আমরা প্রকারের কাস্টমাইজড ভেরিয়েবল তৈরি করতে পারেন. আমরা ফাইল ইনপুট / আউটপুট, ফাইল ইনপুট এবং আউটপুট এর ধারণা চালু, এবং এই এত যে আমরা রাষ্ট্র সঞ্চয় করতে পারেন আপনার একত্র বোর্ড ডিস্ক একটি ফাইল যাতে শিক্ষণ ফেলোগণ এবং আমি বুঝতে পারেন নিজে খেলতে না করেও কি আপনার প্রোগ্রামের ভিতর করছেন একত্র এর গেম অত্যাধিক. আমরা এই কাজের জন্য আরো automatedly পারেন. একটি struct এই ধারণা একটি মোটামুটি বাধ্যকারী সমস্যা solves. ধরুন যে আমরা কিছু প্রোগ্রাম বাস্তবায়ন করতে চান যে একরকম ছাত্র সংক্রান্ত তথ্য ট্র্যাক রাখে, এবং ছাত্র একটি আইডি, উদাহরণস্বরূপ, আছে, একটি নাম হতে পারে এবং হার্ভার্ড মত একটি জায়গায় একটি ঘর, তাই এই তথ্যের 3 টুকরা আমরা কাছাকাছি রাখতে চান, তাই সম্পর্কে এগিয়ে যান এবং একটি সামান্য প্রোগ্রাম এখানে লেখা শুরু দিন, stdio.h অন্তর্ভুক্ত. আমাকে cs50.h. অন্তর্ভুক্ত না এবং তারপর আমার মূল ক্রিয়া শুরু. আমি কোনো কমান্ড লাইন আর্গুমেন্ট সহ বিরক্ত হবে না, এবং এখানে আমি একজন ছাত্র করাতে চান, যাতে আমি বলতে যাচ্ছি একজন ছাত্র একটি নাম আছে, তাই আমি বলতে যাচ্ছি "স্ট্রিং নাম." তারপর আমি একজন ছাত্র এছাড়াও একটি আইডি আছে, তাই int-আইডি বলতে যাচ্ছি, এবং একজন ছাত্র একটি ঘর আছে, তাই আমি করছি বলে যাচ্ছে "স্ট্রিং ঘর." তারপর আমি ভালো এইসব একটু অর্ডার আরো পরিচ্ছন্নভাবে করব. এখন ঠিক আছে, আমি যা দিয়ে একটি ছাত্র উপস্থাপন 3 ভেরিয়েবল আছে, তাই "একজন ছাত্র." এবং এখন আমি এইসব মান পূরণ করতে চান, তাই আমাকে এগিয়ে যান এবং ভালো কিছু বলুন "Id = 123." নাম ডেভিড পেতে যাচ্ছে. চলুন শুরু করা যাক বলে বাড়িতে মাথের পেতে যাচ্ছে, এবং তারপর আমি ইচ্ছামত printf ভালো কিছু করতে যাচ্ছে ("% s-করছি, যার আইডি% d,% s এ জীবন. এবং এখন কি, আমি এখানে চলা করতে না চান, অন্যান্য পর এক? নাম, আইডি, ঘর; রিটার্ন 0. ঠিক আছে, যদি না আমি মাতাল আপ কোথাও এখানে আমি মনে করি আমরা একটি চমত্কার প্রোগ্রাম ভাল যে একজন ছাত্র সঞ্চয় আছে. অবশ্যই, এই সব যে আকর্ষণীয় নয়. ? আমি যদি 2 ছাত্র চাই এটা কোন বড় চুক্তি. আমি 2 জনের সমর্থন করতে পারে না. সম্পর্কে এগিয়ে যান এবং এই হাইলাইট এবং নিচে এখানে আসুন দেখা যাক, এবং আমি রব মত কেউ কার্কল্যান্ড জীবন বলতে পারে "id = 456". ঠিক আছে, অপেক্ষা করুন, আমি কিন্তু এই একই জিনিস কল করতে পারবেন না, এবং এটা দেখে মনে হচ্ছে আমি এই কপি আছে চলেছি, তাই এই সম্পর্কে বলে যে ডেভিড এর ভেরিয়েবল করা যাক, এবং আমাকে Rob জন্য এইসব কিছু কপি পাবেন. আমরা এই রব এর কল কিন্তু এখন এই কাজ করে যাচ্ছে না করব কারণ আমি অপেক্ষা করেছি, যাক এর id1 যাও সম্পর্কে, পরিবর্তন এবং NAME1 house1. Rob 2, 2 হতে হবে. আমি এই এখানে, এখানে, এখানে, এখানে, এখানে, এখানে পরিবর্তন পেয়েছেন. অপেক্ষা করুন, টমি কি সম্পর্কে? এর আবার এই অনুষ্ঠান করুক না. অবশ্যই যদি এখনও আপনার মনে হয় যে এটা একটি এই কাজ করার একটা ভালো উপায়, এটা না, তাই / খারাপ কপি পেস্ট করুন. কিন্তু আমরা এই মীমাংসিত এক সপ্তাহ আগে. আমাদের সমাধান কি ছিল যখন আমরা একই ধরনের তথ্য একাধিক দৃষ্টান্ত চেয়েছিলেন? [ছাত্রদের] একটি অ্যারে. একটি অ্যারের, তাই আমাকে এই পর্যন্ত পরিষ্কার করার চেষ্টা করুন. আমাকে নিজেকে জন্য কিছু শীর্ষে রুম, না এবং এই সম্পর্কে পরিবর্তে এখানে করতে দেওয়া. আমরা এই ব্যক্তিদের কল, পরিবর্তে করব এবং আমি বলতে যাচ্ছি "int-আইডি," করছি এবং আমি এখন জন্য আমাদের 3 সমর্থন করতে যাচ্ছি. আমি "স্ট্রিং নাম," বলে এবং আমি আমাদের 3 সমর্থন করব চলেছি, এবং তারপর আমি "স্ট্রিং ঘর," বলে এবং আমি আমাদের 3 সমর্থন চলেছি চলেছি. এখন পরিবর্তে ডেভিড তার নিজস্ব স্থানীয় ভেরিয়েবল পেতে এখানে আমরা যারা পরিত্রাণ পেতে পারেন. যে আর ভালো যে আমরা এই পরিষ্কার করছি আপ. তারপর আমি বলতে পারেন ডেভিড যাও [0] এবং নাম সমূহ [0] হবে এবং ঘর [0]. এবং তারপর Rob আমরা একভাবে এই সঞ্চয় করতে পারেন. এর এই ডাউন এখানে রাখুন যাক, তাই তিনি ইচ্ছামত আইডি [1] হতে যাচ্ছে. তিনি নামের হতে যাচ্ছে [1], এবং তারপর সর্বশেষে, ঘর [1]. এখনও একটু ক্লান্তিকর, এবং এখন আমি এই জিনিসটা আছে, তাই এর বলা যাক "নামগুলো [0] আইডি [0], ঘর [0], এবং আসুন এই বহুবচনাত্মক. আইডি, আইডি, আইডি. এবং আবার, আমি এটা করছি করছেন, তাই আবার, আমি ইতিমধ্যেই / কপি ও পেস্ট করছি আবার অবলম্বী, তাই মতভেদ আছে এখানে আছে আর একটি সমাধান. আমি সম্ভবত এই একটি পরিষ্কার যে ভালো লুপ বা কিছু সঙ্গে আরও আপ করতে পারেন, তাই সংক্ষিপ্ত, এটা কিছুটা ভালো লেগেছে কিন্তু এখনও মতানুযায়ী আমি / কপি পেস্ট করুন অবলম্বী, কিন্তু করছি এমনকি এই, আমি দাবী, সঠিক সমাধান সত্যিই মৌলিকভাবে না কারণ একদা কি যদি আমরা সিদ্ধান্ত নিতে আপনি কি জানেন যে? আমরা সত্যিই উচিত হয়েছে ডেভিড ও রব জন্য ইমেল ঠিকানা সংরক্ষণ এবং এই প্রোগ্রাম অন্য সবাই. আমরা ফোন নম্বর সংরক্ষণ করা উচিত. আমরা জরুরী পরিচিতি নম্বর সংরক্ষণ করা উচিত. আমরা সমস্ত তথ্য এই টুকরা যে আমরা সংরক্ষণ করতে চান আছে, তাই কিভাবে আপনি যে কাজ সম্পর্কে কি যান? আপনি উপরে আরেকটি অ্যারের ঘোষণা করা, এবং তারপর আপনি নিজে যোগ করুন একটি ইমেল ঠিকানা [0], ইমেল [1] ঠিকানা জন্য ডেভিড ও রব এবং তাই ঘোষণা. কিন্তু আসলে সেখানে শুধু অনুমান এই নকশা নিম্নাবস্থিত যে আমি সম্মান সিস্টেমের জানা am ব্যবহার [I] বিভিন্ন অ্যারে প্রতিটি ঠিক একই ব্যক্তির জন্য ঘটবে, আইডি যাতে [0] নম্বর হল 123, এবং আমি যে নামগুলি অনুমান চলেছি [0] একই ব্যক্তির নাম এবং ঘর [0] একই ব্যক্তির বিভিন্ন অ্যারে নির্মাণ আমি যে সব জন্য ঘর এবং তাই ঘোষণা. কিন্তু লক্ষ্য করা যে কোন মৌলিক সংযুক্তকরণ আছে মধ্যে যারা তথ্য, আইডি, নাম এবং ঘরের 3 টুকরা, যদিও আমরা সত্তা মডেল এই প্রোগ্রামে চেষ্টা করছেন অ্যারে হয় না. অ্যারেগুলির শুধু এই এই করছেন প্রোগ্রাম্যাটিক উপায়. আমরা কি সত্যিই আমাদের প্রোগ্রামে মডেল করতে চান সেই ব্যক্তির ভালো ডেভিড, রব মত যার ভিতরে ব্যক্তি অথবা encapsulating একটি নাম এবং আইডি এবং একটি ঘর. একরকম আমরা encapsulation এই ধারণা প্রকাশ করতে পারি যেখানে এক ব্যক্তি একটি আইডি, একটি নাম এবং একটি ঘর আছে এবং সত্যিই এই হ্যাক যাও রিসোর্ট না যেখানে আমরা শুধু যে বন্ধনী কিছু বিশ্বাস একই প্রসঙ্গে এই অসম অ্যারে প্রতিটি মানব সত্তা যাও? আমরা আসলে এটা করতে পারেন. আমাকে এখন জন্য উপরে যান প্রধান, এবং আমার নিজের সম্পর্কে তথ্য টাইপ তৈরি দিন জন্য সত্যিই প্রথম সময়. আমরা একত্র এই কৌশল ব্যবহার করা হয়, কিন্তু এখানে আমি এগিয়ে যান এবং একটি ডাটা টাইপ তৈরি করতে চাই, এবং আপনি কি জানেন যে, আমি ছাত্র বা ব্যক্তির কল চলেছি, এবং আমি ব্যবহার typedef জন্য একটি টাইপ সংজ্ঞায়িত যাচ্ছি. আমি যে এই একটি কাঠামো বলতে যাচ্ছি, এবং তারপর এই টাইপ ছাত্র গঠন করা, আমরা বলবো যাচ্ছে, যদিও এটা একটু সম্পর্কে জন্য এখন অপ্রচলিত. আমরা "int-আইডি." বলবো আমরা "স্ট্রিং নাম." বলবো তারপর আমরা "স্ট্রিং ঘর," বলবো তাই এখন আর এই কোড কয়েক লাইনের শেষ আমি ঠিক আছে ঝনঝন শব্দ শেখানো যে অস্তিত্বও আছে একটি ints ছাড়াও ডাটা টাইপ, স্ট্রিং ছাড়াও, তদ্ব্যতীত floats ছাড়াও দ্বিগুণ,. সময় লাইন 11 সালে এই মুহূর্তে হিসাবে, হয় এখন সেখানে একটি নতুন ডাটা টাইপ বলা ছাত্র, এবং এখন আমি একজন ছাত্র ভেরিয়েবল ডিক্লেয়ার কোথাও আমি করতে চান করতে পারেন, তাই আমাকে স্ক্রল ব্যক্তিদের এখানে নিচে. এখন আমি এই পরিত্রাণ পেতে এবং আমি ডেভিড ফিরে যেতে এখানে ডাউন করতে পারে, এবং ডেভিড জন্য আসলে আমি বলতে যে ডেভিড করতে পারেন, আমরা আক্ষরিক নিজেকে পরে ভেরিয়েবল নাম দিতে পারেন, টাইপ ছাত্র হতে যাচ্ছে. এই একটু অদ্ভুত চেহারা, কিন্তু এই সব বিভিন্ন হয় না থেকে কোন int অথবা একটি স্ট্রিং বা float হিসাবে কিছু প্রকাশক. এটা ঠিক এরকম যাও এখন ছাত্র নামক করা হবে, এবং আমি যদি এই কাঠামোর ভিতরে কিছু করা চাই আমি এখন একটা সিনট্যাক্স নতুন টুকরা ব্যবহার আছে, তবে বেশ সহজবোধ্য, david.id = 123, david.name = "ডেভিড" মূলধন D এর, এবং david.house = "মাথের," এবং এখন আমি এখানে এই স্টাফ পরিত্রাণ পেতে পারেন. আমরা এখন একটি বিজ্ঞপ্তি করেছি সত্যিই অনেক ভালো ভাবে আমাদের প্রোগ্রাম পুনরায় নকশা এখন আমাদের মধ্যে যে প্রোগ্রাম বাস্তব জগতে প্রতিফলিত করে. একজন ব্যক্তি বা একটি ছাত্র বাস্তব বিশ্বের ধারণা আছে. এখানে আমরা এখন একটি একটি ব্যক্তি বা আরো নির্দিষ্টভাবে একটি ছাত্র বা ছাত্রী সি সংস্করণ. যে ব্যক্তির ভিতর এই প্রাসঙ্গিক বৈশিষ্ট্য, আইডি, নাম এবং ঘর যাতে, রব মূলত একই জিনিস ডাউন হয়ে এখানে, তাই ছাত্র অপহরণ করা, এবং এখন = 456 rob.id, rob.name = "রব." যে পরিবর্তনশীল Rob বলা হয় অর্থহীন ধরণের. আমরা এটা বলা x বা y অথবা z থাকতে পারে. আমরা শুধু নামে এটি যাও শব্দার্থগতভাবে সামঞ্জস্যপূর্ণ হবে Rob, কিন্তু সত্যিই নামের যে ক্ষেত্র নিজেই ভিতরে হয়, তাই এখন আমি এই আছে. এটি খুব ভাল নকশা যে হার্ড আমি ডেভিড করেছি কোডেড মত মনে হয় না. আমি এটাকে Rob কোডেড. এবং আমি এখনও কিছু কপি এবং রিসোর্ট প্রত্যেক সময় আমি নতুন ভেরিয়েবলের চান আটকান আছে. তাছাড়া, আমি দৃশ্যত একটি নাম দিন এই ভেরিয়েবলগুলি প্রতিটি আছে, যদিও আমি এই ভেরিয়েবলগুলি বরং বর্ণনা চাই  আরো জেনেরিক হিসাবে ছাত্র. এখন আমরা ধারনা যা আমাদের জন্য ভাল কাজ হয়েছে মার্জ করতে পারবেন এবং এর পরিবর্তে, বলে, "আপনি জানেন কি, সম্পর্কে একটি পরিবর্তনশীল তথাকথিত ছাত্র দিতে, এবং এর তা মাপ 3 হস্তক্ষেপ না করা, যাতে "এখন আমি এই বিষয়ে আরও পরিমার্জন করতে পারেন, ম্যানুয়ালি ঘোষিত ডেভিড কাটাতে, এবং আমি পরিবর্তে ছাত্র ভালো কিছু [0] এখানে বলতে পারেন. তারপর আমি ছাত্র [0] এখানে বলতে পারেন, ছাত্র [0] এখানে, তাই এদিক ওদিক, এবং আমি কাছাকাছি যেতে পারেন এবং যে পরিষ্কার Rob জন্য সাইন আপ করুন. আমি এখন হয়তো একটি লুপ যোগ করা যেতে পারে এবং GetString এবং GetInt প্রকৃতপক্ষে ব্যবহারকারী থেকে এই মান ব্যবহার করে পাওয়া. আমি একটি ধ্রুবক যোগ করার কারণ সম্পর্কে এই সাধারণত কুক্রিয়া যেতে পারে হার্ড কোড কিছু ভালো 3 নম্বর অবাধ অধিকার এখানে এবং তখনই মনে রাখবেন যে আপনি এটি কোন অধিক 3 ছাত্র করা উচিত. এটা সম্ভবত হতে ভাল আমার ফাইল শীর্ষে # ব্যবহার সংজ্ঞায়িত করবে এবং ফ্যাক্টর যে আউট, তাই প্রকৃতপক্ষে, সম্পর্কে এগিয়ে যান এবং এই বিশ্বজনীন করা যাক. আমাকে একটি উদাহরণ এর মধ্যে আজ যে খুলতে আপ উদাহরণ অগ্রিম, structs1. এটি একটি সম্পূর্ণ আরো প্রোগ্রাম ব্যবহার করে এমন # আপ এখানে সংজ্ঞায়িত এবং বলে আমরা ডিফল্টরূপে 3 ছাত্র আছে চলুন. এখানে আমি একটি ছাত্র বর্গ মূল্য ঘোষণা করছি, তাই ছাত্র একটি শ্রেণীকক্ষ, এবং এখন আমি একটি লুপ ব্যবহার করা শুধু কোড সামান্য আরো মার্জিত না, বর্গ পূরণ ব্যবহারকারীর ইনপুট দিয়ে, তাই থেকে আমি = 0 আপ বারবার ছাত্র, যা 3. এবং তারপর আমি এই সংস্করণ ব্যবহারকারী চটপট  ছাত্র এর আইডি কি, এবং আমি GetInt সঙ্গে এটি পেতে. ছাত্র এর নাম কি, এবং তারপর আমি এটা দিয়ে GetString পেতে. ছাত্র এর ঘর কি? আমি GetString সঙ্গে এটি পেতে. এখানে নীচে এবং তারপর আমি পরিবর্তন ঠিক করার সিদ্ধান্ত নিয়েছে কিভাবে আমি এই মুদ্রণ করছি আউট এবং প্রকৃতপক্ষে একটি লুপ ব্যবহার, আমি কে এবং মুদ্রণ am? মন্তব্য অনুযায়ী আমি মাথের সকলের মুদ্রণ করছি, এবং যে তাই রব এবং টমি এবং তাই ঘোষণা-আসলে মাথের টমি এর মধ্যে. Tommy এবং ডেভিড এই ক্ষেত্রে, প্রিন্ট করা যাবে কিন্তু কিভাবে এই কাজ করছে? আমরা আগে দেখা এই ফাংশন নি, কিন্তু কি আছে এই হিসাবে একটি অনুমান নিতে. স্ট্রিং সাথে তুলনা করে. এটা একটা সামান্য অ সুস্পষ্ট কিভাবে এটি স্ট্রিং তুলনা করা হয় না কারণ এটি সক্রিয় আউট এটি যদি 0 ফেরৎ মানে স্ট্রিং হয় সমান. যদি এটি একটি -1 ফেরৎ মানে এক অন্য আগে বর্ণানুক্রমে আসে, এবং এটি যদি +1- ফেরৎ যে অন্যান্য শব্দ মানে বর্ণানুক্রমে আসে আগে অন্যান্য, এবং আপনি অনলাইন এ অথবা man পৃষ্ঠা দেখুন পারেন যা হুবহু উপায় যা দেখতে, কিন্তু এখন এই সব করছে এটা বলছে এর যদি [i]. ঘর সমান "মাথের" যাও তারপর এগিয়ে যান এবং যাতে মুদ্রণ এবং মাথের তাই হয়. কিন্তু এখানে এর আগে আমরা কিছু আছে দেখা যায় না, এবং আমরা ফিরে পাবেন. আমি কখনও আমার এই প্রোগ্রাম কোনো কাজ হচ্ছে না প্রত্যাহার. মেমরি মুক্ত করা হয় দৃশ্যত নির্দেশকারী, মেমরি freeing, কি মেমরি কিন্তু আমি এই লুপ দৃশ্যত am এই প্রোগ্রাম নীচে freeing? দেখে মনে হচ্ছে আমি একজন ব্যক্তির নাম freeing করছি এবং একজন ব্যক্তির বাড়িতে, কিন্তু কেন হল? তা সব এই সপ্তাহের আউট সক্রিয় যে আপনি হয়েছি GetString ব্যবহার আমরা ধরনের প্রোগ্রাম করেছি আপনার প্রতি এক মধ্যে একটি বাগ সংশোধন করা হয়েছে পরিচায়ক. GetString নকশা মেমরি বরাদ্দ দ্বারা যাতে এটি আপনাকে একটি স্ট্রিং ফিরে যেতে পারেন, ভালো ডেভিড, বা রব, এবং তারপর আপনি করতে পারেন যাহা চান সঙ্গে প্রোগ্রামে আপনার স্ট্রিং কারণ আমরা আপনার জন্য সংরক্ষিত মেমরি করেছি. সমস্যা হল এই সব সময় প্রত্যেক সময় আপনি কল GetString আমরা, GetString এর লেখক, হয়েছে অপারেটিং সিস্টেম জিজ্ঞাসা এই পংক্তিটি দিতে উপস্থিত RAM-র একটি বিট আমাদের. পরের দিন এই পংক্তিটি উপস্থিত RAM-র একটি বিট আমাদের. আমাদের এই পরের পংক্তি জন্য কিছু অধিক RAM দিন. আপনি কি, প্রোগ্রামার, কাজ হয়েছে না আমাদের যে মেমরি ফেরত প্রদান করা হয়, সুতরাং এই কয়েক সপ্তাহের জন্য প্রোগ্রামের সমস্ত আপনি লিখিত করেছি কি ছিল একটি মেমরি লীপ নামক এর সাহায্যে তারা ব্যবহার করে রাখা আরো এবং আরো মেমরি প্রতি সময় আপনি কল GetString, এবং যে সূক্ষ্ম. আমরা ইচ্ছাকৃতভাবে প্রথম সপ্তাহের মধ্যে যে না, কারণ এটা যে আকর্ষণীয় না যাও যেখানে স্ট্রিং থেকে আসছে চিন্তা আছে. সমস্ত চান শব্দ হল ফিরে আসা যখন ব্যবহারকারী এটি ধরনের ইন Rob কিন্তু গতির আমরা এখন যাও পেয়ে এই সম্পর্কে আরো পরিশীলিত শুরু আছে. কোন সময় আমরা মেমরি বরাদ্দ আমরা আরও ভালোভাবে শেষ পর্যন্ত ফিরে হাতে. অন্যথায় আপনার পিসিতে Mac বা বাস্তব জগতে আপনি মাঝে মাঝে অভিজ্ঞ থাকতে পারে উপসর্গ যেখানে আপনার কম্পিউটার অবশেষে একটি স্থগিত যাও হয়রান হয় অথবা কেবল মূঢ় স্পিনিং সৈকত বল কম্পিউটার এর অধিষ্ঠিত হয় সম্পূর্ণ মনোযোগ এবং জিনিষ আপনি করতে পারবেন না. যে বাগ কোনো সংখ্যা দ্বারা ব্যাখ্যা করা সম্ভব হয়, কিন্তু মধ্যে যারা সম্ভব বাগ বলা হয় জিনিষ মেমরি তথ্য ফাঁসের যদ্দ্বারা কেউ সফ্টওয়্যারের যে টুকরা লিখেছেন আপনি কি মেমরি মুক্ত মনে না ব্যবহার করছেন যে সে জন্য অপারেটিং সিস্টেম বলা, ব্যবহার করে, GetString না, কারণ যে একটি CS50 জিনিস, কিন্তু অনুরূপ ফাংশান ব্যবহার করে যে অপারেটিং সিস্টেম মেমরির জন্য জিজ্ঞাসা করুন. যদি আপনি বা তারা আপ স্ক্রু এবং প্রকৃতপক্ষে যে মেমরি ফেরত না একটি লক্ষণ যে একটি প্রোগ্রাম এবং গতি গতি গতি এবং ডাউন হতে পারেন যদি না আপনি বিনামূল্যে কল মনে রাখবেন. আমরা যখন ফিরে আসবে এবং কেন আপনি বিনামূল্যে ডাকবেন করব, কিন্তু আসুন এগিয়ে শুধু ভাল পরিমাপ জন্য যান এবং এই প্রোগ্রাম চালানোর চেষ্টা. এই structs1 বলা ছিল, লিখুন. সম্পর্কে এগিয়ে যান এবং structs1 চালানো যাক 123,, ডেভিড মাথের, 456, রব কার্কল্যান্ড, 789, টমি মাথের, এবং আমরা মাথের ডেভিড এর দেখতে, মাথের টমি এর মধ্যে. এটি অল্পমাত্র সদ্বিবেচনা চেক যে প্রোগ্রাম কাজ করছে. এখন দুর্ভাগ্যবশত,, এই প্রোগ্রামটি যে একটু হতাশাজনক আমি যে সব কাজ করে থাকেন, আমি বিভিন্ন 9 স্ট্রিং টাইপ করা, আঘাত লিখুন, মাথের যারা ছিল ডটকমকে বলেন, এখনো ছিল স্পষ্টত আমি জানতাম মাথের যারা ইতিমধ্যে ছিল কারণ আমি এটা টাইপ. এটা অন্ততঃ চমৎকার যদি এই প্রোগ্রামটি একটি ডাটাবেসের মত হবে এবং এটা আসলে মনে কি আমি টাইপ করা আছে তাই আমি এইসব ছাত্র রেকর্ড ইনপুট আবার কখনও. হতে পারে এটি একটি registrarial সিস্টেমের মত. আমরা এই কাজের জন্য এই কৌশল ফাইল ইনপুট / আউটপুট, ফাইল ইনপুট এবং আউটপুট হিসাবে পরিচিত ব্যবহার করতে পারেন, যে কোনো সময় আপনি বা ফাইল পড়া ফাইল লিখতে চান বলছে খুব জেনেরিক পন্থা আপনি একটি নির্দিষ্ট ফাংশন সেট দিয়ে এটা করতে পারেন. সম্পর্কে এগিয়ে যান এবং এই উদাহরণ structs2.c খুলুন যাক, যা প্রায় অনুরূপ, কিন্তু এর যাক কি এখন এটা দেখতে. ফাইলের উপরে আমি ছাত্র একটি বর্গ ডিক্লেয়ার. আমি তারপর ব্যবহারকারী ইনপুট এর সঙ্গে বর্গ পূরণ, তাই ঠিক কোড যারা লাইন আগে মতই. তারপর যদি আমি নিচে স্ক্রোল করুন এখানে মুদ্রণ আমি প্রত্যেকের মাথের মধ্যে যারা ইচ্ছামত আগের মতই, কিন্তু এই একটি নতুন আকর্ষণীয় বৈশিষ্ট্য. কোড এই লাইনে নতুন, এবং তারা কিছু এখানে পরিচয় করিয়ে, ফাইল, সব বড় হাতের অক্ষর, এবং এটা এখানে * হিসাবে ভাল হয়েছে. আমাকে এখানে উপর এই সরানোর জন্য এখানে একটি * হিসাবে ভাল. এই ফাংশন আমরা আগে দেখা যায় না, fopen, কিন্তু এটা মানে ফাইল খোলা, তাই এইসব এর মাধ্যমে সর পড়া যাক, এবং এই হল কিছু আমরা আসতে ভবিষ্যতে psets ফিরে যাব, কিন্তু এখানে মূলত এই লাইন নামক একটি ফাইল খোলেন ডাটাবেস, এবং বিশেষভাবে এটি এমনভাবে তৈরি হয়েছে যে এটি কি কিছু করতে পারি তা প্রর্দশিত হবে? [শ্রবণাতীত-ছাত্র] রাইট, তাই "W" ঠিক মানে এটি অপারেটিং সিস্টেম এর কহন এমনভাবে যে আমি এটা লিখতে পারেন এই ফাইলটি খুলুন. আমি সেটা পড়তে চাই না. আমি শুধু এটা তাকান না চান. আমি এবং পরিবর্তন স্টাফ যুক্ত সম্ভাব্য এটি করতে চান, এবং ফাইল করা হবে নামক ডাটাবেস যাচ্ছে. এই কিছু বলা হতে পারে. এই database.txt হতে পারে. এই. Db হতে পারে. এই foo এর মত একটি শব্দ হতে পারে, কিন্তু আমি ইচ্ছামত ফাইল ডাটাবেসের নাম করতে পারে. এটি একটি সামান্য সদ্বিবেচনা চেক যে আমরা ফিরে সময়ের মহান বিষদভাবে করব, যদি ফাইল পয়েন্টার জন্য fp,, আছে সমান শূন্য না মানে সব ঠিক থাকে. লং সংক্ষিপ্ত বিবরণ, কখনও কখনও fopen ভালো কর্ম বিফল হয় না. হয়তো ফাইল বিদ্যমান নেই. হতে পারে আপনি ডিস্ক স্থান ফুরিয়েছে. হতে পারে আপনি যে ফোল্ডারে অনুমতি না থাকে, তাই যদি fopen নাল ফেরৎ খারাপ কিছু ঘটেছে. বিপরীতভাবে, যদি fopen নাল না রিটার্ন করে সব ঠিক থাকে এবং আমি লেখার এই ফাইলটি যাও শুরু করতে পারেন. এখানে একটি নতুন কৌতুক. এটি একটি লুপ জন্য যে আমার ছাত্র প্রতিটি iterating এর উপর, এবং এই দেখায় কি আমরা আগে সম্পন্ন করেছি যাতে একই, কিন্তু এই ফাংশন হল একটি পিসতুত ভাই printf ফাইল printf জন্য fprintf বলা হয়, এবং লক্ষ্য করা এটা শুধুমাত্র 2 উপায়ে বিভিন্ন. এক, এটি পরিবর্তে পি চ সঙ্গে শুরু হয়, কিন্তু তারপর তার প্রথম যুক্তি হল, দৃশ্যত: কি? [ছাত্রদের] ফাইল. >> এটা একটা ফাইল. এই জিনিস বলা fp, যা অবশেষে আমরা জ্বালাতন করা সরাইয়া কি একটি ফাইল পয়েন্টার হয় করব, কিন্তু এখন জন্য simply fp উপস্থাপন করে যে ফাইলটি আমি খোলা আছে, তাই fprintf এখানে ফাইল এই ব্যবহারকারীর আইডি প্রিন্ট বলছে, না পর্দা না. ফাইলটি ব্যবহারকারীর নাম, না পর্দা মুদ্রণ করুন, ফাইল, না পর্দায়, এবং তারপর নিচে, এখানে সম্ভবত ঘর, ফাইল বন্ধ করে তারপর নিচে এবং এখানে মেমরি মুক্ত. এই সংস্করণ 2 এবং সংস্করণ 1 মধ্যে একমাত্র পার্থক্য হয় fopen প্রবর্তনের এবং * সঙ্গে এই ফাইল এবং fprintf এই ধারণা, তাই এর দেখতে দিন কি শেষ ফলাফল হল. আমাকে আমার টার্মিনাল উইন্ডোর মধ্যে যান. সম্পর্কে structs2 চালানো যাক, লিখুন. মনে হচ্ছে সব ঠিক থাকে. চলুন structs2 পুন: প্রকাশ. 123, ডেভিড মাথের, 456, রব কার্কল্যান্ড, 789, টমি মাথের, লিখুন. দেখে মনে হচ্ছে এটি একই ভদ্র, কিন্তু এখন যদি আমি ls না এখানে কি সব ফাইল আমার কোড মধ্যে বিজ্ঞপ্তি, ডাটাবেস, তাই আসুন যে, যে সময়ে gedit, এবং ডাটাবেসের বর্ণন খুলুন. এই ফাইল ফরম্যাটের sexiest না. এটা সত্যিই প্রতি লাইনে প্রতি লাইনে তথ্য লাইনের এক টুকরা, কিন্তু আপনাদের মধ্যে যারা এক্সেল বা CSV ফাইল ব্যবহার, কমা দিয়ে পৃথক করা মান, আমি fprintf অবশ্যই ব্যবহার করেছেন পরিবর্তে হয়তো ভালো কিছু করতে পারে যাতে আমি আসলে একটি এক্সেল ফাইল সমতুল্য তৈরি করতে পারি কমা দ্বারা শুধুমাত্র নতুন লাইন না দিয়ে আলাদা জিনিষ. এই ক্ষেত্রে আমি যদি পরিবর্তে কমা পরিবর্তে নতুন লাইন ব্যবহার করে আমি আক্ষরিক Excel এ এই ডাটাবেস ফাইল যদি পরিবর্তে আমি এটি ভালো চেহারা খোলা যায়নি. সংক্ষেপে এখন, আমরা যে ফাইল লিখতে ক্ষমতা আছে আমরা এখন অক্লান্ত তথ্য, শুরু পালন ডিস্ক এটি প্রায় পারেন যাতে আমরা চারপাশে তথ্য আবার এবং আবার রাখতে পারেন. অন্য যে এখন একটি বিট আরো পরিচিত কয়েক লক্ষ্য করুন. এই সি ফাইল শীর্ষে আমরা একটি typedef আছে কারণ আমরা একটি তথ্য টাইপ যে একটি শব্দ উপস্থাপন তৈরী করতে চান, তাই এই ধরনের শব্দ বলা হয়, এবং ভিতর এই গঠন এটা এখন একটি সামান্য কল্পনাকারী. কেন একটি শব্দ হয় দৃশ্যত একটি অ্যারের গঠিত? একটি শব্দ মাত্র intuitively কি? এটা অক্ষরের একটি অ্যারে. এটা ফিরে অক্ষরের একটি ক্রম যাও যাও ব্যাক ব্যাক. সব ক্যাপ অক্ষরগুলি যাও আমরা ইচ্ছামত বলতে হবে এরকম সর্বাধিক দৈর্ঘ্য এর অভিধান যে আমরা একত্র জন্য ব্যবহার করছেন কোন শব্দ. কেন আমি +1 টি আছে? নাল অক্ষর. পুনরাহ্বান যখন আমরা Bananagrams উদাহরণ কি আমরা একটি বিশেষ মান প্রয়োজন এ শব্দের শেষে আদেশ ট্র্যাক রাখা যেখানে আসলে শব্দের শেষ, এবং সমস্যা হিসাবে সেট স্পেসিফিকেশন বলছেন এখানে আমরা একটি প্রদত্ত শব্দটির সঙ্গে একটি বুলিয়ান মান সংযুক্ত করছি, একটি পতাকা, তাই, কথা সত্য বা মিথ্যা. আপনি কি এই শব্দ ইতিমধ্যে পাওয়া গেছে, কারণ আমরা বুঝতে পারছি আমরা সত্যিই মনে রাখার একটি উপায় প্রয়োজন শুধু কি একত্র একটা শব্দ হয় কিন্তু আছে কিনা বা আপনি না, মানব, এটি পাওয়া যাতে আপনি যদি না খুঁজে শব্দ "" আপনি টাইপ করতে পারেন না, লিখুন, লিখুন, লিখুন এবং 3 পয়েন্ট, 3 পয়েন্ট, 3 পয়েন্ট, 3 পয়েন্ট পেতে. আমরা একটি bool সেটিং দ্বারা যে শব্দ বছর সক্ষম হতে চান সত্য যদি আপনি ইতিমধ্যে এটি খুঁজে পেয়েছি, তাই এবং সে জন্যই আমরা এই কাঠামো এটি encapsulated. এখন, নিচে একত্র এখানে এই অন্যান্য struct নামক অভিধান আছে. এখানে অনুপস্থিত শব্দ typedef কারণ এই ক্ষেত্রে আমরা একটি অভিধান ধারণা encapsulate প্রয়োজন, এবং একটি অভিধান একটি শব্দ আভা রয়েছে, এই অ্যারে দ্বারা হিসাবে উহ্য, এবং কিভাবে ঐ শব্দের অনেক আছে? ওয়েল, যাই হোক না কেন এই পরিবর্তনশীল নামক আকার বলছেন. তবে আমরা একটি অভিধান দরকার. আমরা একটি ডাটা টাইপ বলা অভিধান প্রয়োজন হয় না. আমরা শুধু তাদের একজন প্রয়োজন, যাতে সি সক্রিয় আউট আপনি যদি typedef না বলে, আপনি struct বলে, তারপর ভিতরে কোঁকড়া ধনুর্বন্ধনী আপনি আপনার ভেরিয়েবল করা থাকে, তাহলে আপনি নামের করা. এই এক পরিবর্তনশীল অভিধান বলা হয় প্রকাশক যে ভালো দেখায়. বিপরীতে, এই লাইন একটি পুনর্ব্যবহারযোগ্য তথ্য গঠন নামক শব্দ তৈরি হয় যে আপনি একাধিক কপি তৈরি করা, ঠিক মত আমরা তৈরি করতে পারেন ছাত্র একাধিক কপি. এই কি শেষ পর্যন্ত আমাদের কি দেয়? সম্পর্কে ফিরে যেতে মধ্যে, এর কথা বলা যাক সহজ বার থেকে একটি সহজ উদাহরণ, যাক, এবং সম্পর্কে পূর্ণপ্রকাশিত করা যাক, এর কথা বলা যাক, compare1.c. হাতের এখানে সমস্যা হল ফিরে আসলে ছুলা একটি স্ট্রিং এর স্তর এবং এই প্রশিক্ষণ গ্রহণ কায়দা করে চলতে শুরু করা কারণ এটি সক্রিয় যে একটি স্ট্রিং সব সময় এই আউট এটা সত্যিই হিসাবে সপ্তাহ 1 সালে আমরা শুধু একটি ডাক নাম প্রতিশ্রুতি, একটি প্রতিশব্দ থেকে কিছু যে দেখায় একটু আরো রহস্যপূর্ণ জন্য CS50 লাইব্রেরি, * গৃহস্থালির কাজ, এবং আমরা এই তারকা দেখা করেছি আগে. আমরা ফাইল প্রেক্ষাপটে এটা দেখেছি. চলুন এখন আমরা কেন করছি কিছু সময় এই জন্য এখন গোপন বিস্তারিত দেখুন. এখানে একটি ফাইল নামক compare1.c, এবং দৃশ্যত: এটি 2 স্ট্রিং জন্য ব্যবহারকারী জিজ্ঞেস করে, গুলি এবং টন, এবং তারপর এটি যাও লাইন 26 মধ্যে সমতা জন্য যারা স্ট্রিং তুলনা করার চেষ্টা করে, এবং যদি তারা সমান এটা বলে, "আপনি একই জিনিস করে টাইপ করেছেন," এবং যদি তারা সমান পারব না এটা বলে, "আপনি বিভিন্ন জিনিষ টাইপ করা." আমাকে এগিয়ে যান এবং এই প্রোগ্রামটি চালানোর জন্য. আমার সম্পর্কে সোর্স ডিরেক্টরিতে যাওয়া যাক, একটি compare1 করা. এটা ঠিক আছে কম্পাইল. আমাকে compare1 চালানো. আমি ইন, জুম প্রবেশ করব. কিছু বলুন. হ্যালো. আমি আবার কিছু বলবো. হ্যালো. আমি স্পষ্টভাবে বিভিন্ন জিনিষ টাইপ না. আমাকে আবার এই চেষ্টা. Bye Bye. বিভিন্ন কখনোই না, তাই এখানে কি করছেন? হ্যাঁ, সত্যিই কি লাইন 26 মধ্যে তুলনা করা হচ্ছে? [শ্রবণাতীত-ছাত্র] হ্যাঁ, তাই এটি সক্রিয় করে একটি স্ট্রিং ডাটা টাইপ, একটি সাদা মিথ্যা ধরনের. একটি স্ট্রিং একটি গৃহস্থালি *, কিন্তু কি একটি গৃহস্থালি *? একটি গৃহস্থালি *, তারা যা বলে, একটি পয়েন্টার, এবং একটি পয়েন্টার কার্যকরভাবে একটি ঠিকানা, মেমরির সমষ্টি অবস্থান, এবং যদি আপনি এরকম একটি শব্দ হ্যালো মত টাইপ করা আছে, স্ট্রিং বিগত আলোচনা থেকে প্রত্যাহার এই শব্দ ভালো হয় হ্যালো. মনে রাখবেন যে, হ্যালো মত একটি শব্দ প্রতিনিধিত্ব করা যাবে হিসাবে অক্ষরের একটি ভালো অ্যারে একটি শেষে বিশেষ অক্ষর দিয়ে তারপর নাল এবং চরিত্র বলা হয়, হিসাবে \ উল্লেখ করে. আসলে কি একটি স্ট্রিং? উল্লেখ্য, এই মেমরি একাধিক অংশ, এবং আসলে, এটি শুধুমাত্র শেষে বলা হয় একবার আপনি পুরো স্ট্রিং দেখেত্ত বিশেষ অক্ষর নাল খুঁজছি. কিন্তু এই যদি হয় আমার কম্পিউটার এর মেমরি থেকে মেমরি একটি খণ্ড, আসুন ইচ্ছামত যে ঠিক এই পংক্তি না ভাগ্যবান, এবং এটি আমার কম্পিউটারের RAM-র খুব প্রারম্ভে স্থাপন করা হবে. এটি বাইট 0, 1, 2, 3, 4, 5, 6 ... যখন আমি GetString ভালো কিছু বলুন এবং আমি স্ট্রিং গুলি = GetString না এর কি ফিরে হচ্ছে? এই গত কয়েক সপ্তাহ, সত্যিই কি s এ সঞ্চিত হচ্ছে হয়, কিন্তু কোনটাই এই পংক্তি না এই ক্ষেত্রে কি সঞ্চিত করা হচ্ছে হল কি আসলে GetString আছে কারণ 0 নম্বর এটি শারীরিকভাবে একটি স্ট্রিং রিটার্ন করে না. যে সত্যিই আছে এমনকি ধারণাগত ইন্দ্রিয় না. এটি কী জন্য ফেরত একটি সংখ্যা. যে সংখ্যা হল হ্যালো মেমরির মধ্যে ঠিকানা, এবং তারপর স্ট্রিং গুলি, ফিরে ছুলা যদি আমরা এই স্তর, সত্যিই স্ট্রিং বিদ্যমান না. এটা মাত্র CS50 লাইব্রেরি একটি সরলীকরণ. এই আসলেই কিছু বলা গৃহস্থালি *. চর বিষয়টি যুক্তিযুক্ত কারণ কি হ্যালো মত একটি শব্দ,? ওয়েল, এটা একটা সিরিজ অক্ষর, অক্ষর একটি সিরিজ. চর * একটি চরিত্র ঠিকানা মানে, তাই এটি একটি স্ট্রিং ফিরে মানে? একটি সুন্দর, একটি স্ট্রিং ফেরত সহজ উপায় হয় বরং জিনিসটা কিভাবে আমি 5 বা 6 বিভিন্ন বাইট ফিরে চেষ্টা আমাকে যা বাইট ঠিকানা যাও ফিরে? প্রথম এক. অন্য কথায়, আমাকে আপনি যা মেমরির মধ্যে একটি চরিত্রের ঠিকানা দিন. এটা কি গৃহস্থালি * প্রতিনিধিত্ব করে, এক মেমরির মধ্যে একক চরিত্রের ঠিকানা. যে পরিবর্তনশীল গুলি কল করুন. S এ যে নির্দিষ্ট দোকান ঠিকানা, যা ইচ্ছামত আমি বলেন 0, জিনিসের সহজ রাখা, কিন্তু এটা বাস্তবতা সাধারণত এর একটি বড় সংখ্যা. একটি মিনিট অপেক্ষা করুন. যদি কেবলমাত্র আপনার প্রদান করছি প্রথম অক্ষরের ঠিকানা সম্পর্কে, কিভাবে আমি কি ঠিকানা হল জানি না দ্বিতীয় অক্ষর, তৃতীয়, চতুর্থ এবং পঞ্চম? [শ্রবণাতীত-ছাত্র] আপনি কেবলমাত্র যেখানে স্ট্রিং শেষ এই কুশলী কৌতুক এইভাবে হয় জানি, তাই যখন আপনি কিছু ভালো ব্যবহার printf, কি যুক্তি হিসাবে printf আক্ষরিক লাগে, যে আমরা এই% s-প্লেসহোল্ডার ব্যবহার প্রত্যাহার, এবং তারপর আপনি মধ্যে পাস পরিবর্তনশীল যে একটি স্ট্রিং এর সংরক্ষণকারী. আপনি কি সত্যিই করছি ক্ষণস্থায়ী হয় স্ট্রিং প্রথম অক্ষরটি ঠিকানা. Printf তারপর লুপ বা লুপ করার জন্য যে ঠিকানা প্রাপ্তির উপর একটি ব্যবহার করে, উদাহরণস্বরূপ, 0, তাই আমাকে এই এখন না, printf ("% s \ n," গুলি); আমি যখন কল printf ("% s \ n," গুলি); কি সত্যিই আমি সঙ্গে প্রদান করছি printf প্রথম অক্ষরের মধ্যে গুলি ঠিকানা, যা এই অবাধ ক্ষেত্রে এইচ কিভাবে printf না জানি কি ঠিক পর্দায় প্রদর্শন যাও? যে ব্যক্তি বাস্তবায়িত printf একটি লুপ করার জন্য একটি লুপ বা বাস্তবায়িত যে জন্য এই বিশেষ অক্ষর নাল অক্ষর সমান? যদি না হয় তাহলে, এটি মুদ্রণ. কিভাবে আমার এই এক? যদি এটা মুদ্রণ না, এটা, মুদ্রণ এটি মুদ্রণ, এটা মুদ্রণ. ওহ, এই একটি বিশেষ. মুদ্রণ এবং থামুন ব্যবহারকারী যাও ফিরে. এবং যে আক্ষরিক সব যে ফণা নীচে এর ঘটছে করা হয়েছে, এবং যে অনেক ক্লাসের প্রথম দিনে হজম যাও, কিন্তু এটি এখন জন্য সত্যিই বোঝার কিছু বিল্ডিং ব্লক যে আমাদের কম্পিউটার এর মেমরি ভেতরের যাচ্ছে করা হয়েছে, এবং অবশেষে আমরা একটু সাহায্য সঙ্গে এই জ্বালাতন করা সরাইয়া করব থেকে আমাদের বন্ধুদের মধ্যে একটি স্ট্যানফোর্ড. অধ্যাপক নিক Parlante স্ট্যানফোর্ড এই বিস্ময়কর ভিডিও ক্রম করেনি সম্পন্ন থেকে বিভিন্ন ভাষায় যে চালু সব বিশৃঙ্খলভাবে এই সামান্য Claymation অক্ষর Binky. ভয়েস আপনার সম্পর্কে করছি মাত্র কয়েক দ্বিতীয় স্নিক প্রিভিউ শুনতে একটি স্ট্যানফোর্ড বিশ্ববিদ্যালয়ের অধ্যাপক যে, এবং আপনি পেয়ে থাকেন এই অধিকার শুধুমাত্র 5 বা 6 যাও এখন, কিন্তু এই নোট আমরা আজ শেষ করা হবে বুধবার এবং শুরু. আমি দিতে Binky, প্রাকদর্শন সঙ্গে পয়েন্টার আপনি মজা. [♪ ♪ সঙ্গীত] [অধ্যাপক Parlante] আরে, Binky. ওয়েক আপ. এটা মজা করার জন্য পয়েন্টার সময়. [Binky] কি যে? পয়েন্টার সম্পর্কে জানুন? ওহ, বুড়ি! আমরা বুধবার আপনাকে দেখতে হবে. [CS50.TV]