[Powered by Google Translate] [კვირა 3] [დევიდ ჯ Malan - ჰარვარდის უნივერსიტეტი] [ეს არის CS50. - CS50.TV] ნება მომეცით steer us მიმართულებით, სადაც ჩვენ შეჩერდით ბოლო დროს, რომელიც დაწყებული ვიფიქროთ უფრო მეტი, ვიდრე შესახებ სინტაქსი და ცდილობს ვფიქრობ ცოტა ნაკლები შესახებ ყველა minutiae რომ იღებს ცოტა დრო, რომ acclimate რომ ჯერჯერობით თვალსაზრისით semicolons და ბრჭყალების და curly braces, დაიწყოს აღების რამ ცოტა მაღალ დონეზე კონცეპტუალური ასე რომ პრობლემები ჩვენ ახლა დავიწყოთ გადაჭრის მომდევნო რამდენიმე კვირის ვაპირებთ ჩართვას ბევრად უფრო შევიდა უმაღლესი დონის კონცეპტუალური პრობლემები და ცოტა ნაკლები syntactical როგორც თქვენ თქვენი ფეხები სველი და თქვენი ხელები ბინძური ზოგიერთ სინტაქსი ამ ბოლო რამდენიმე კვირის განმავლობაში. ასე რომ გავიხსენოთ, რომ გასულ კვირას ჩვენ გააცნო ამ ცნება მასივი. და array ინგლისურ შეიძლება შეფასდეს, როგორც რა? >> [Inaudible სტუდენტი საპასუხოდ] უკაცრავად? კოლექცია? >> [Inaudible სტუდენტი საპასუხოდ] >> Okay, კარგი. კოლექცია საკითხი. ამიტომ, ჩვენ ვნახეთ კოლექტორები წელს Scratch. თუ მოხდა გამოყენება pset 0 ერთი Scratch სიების რომ თქვენ შეგიძლიათ გადაიტანეთ რამ მოსწონს ფორთოხალი და ბანანი შევიდა, ინვენტარიზაცია ჯიშები, რომ სახის მოსწონს რა არის მასივი. და მაშინ უფრო ტექნიკურად, კონტექსტში ფაქტობრივი კომპიუტერი, array უბრალოდ მომიჯნავე ბლოკი მეხსიერება. სხვა სიტყვებით, თქვენ გაქვთ byte, მაშინ კიდევ ერთი ბაიტი, მაშინ კიდევ ერთი ბაიტი, მაშინ კიდევ ერთი ბაიტი, და თუ იყო გავამახვილო იმ bytes in სურათი, ისინი იქნებოდა თავში დაბრუნება თავში დაბრუნება. რაც ვგულისხმობთ მომიჯნავე. ასე რომ byte ნომერი 1, 2, მაშინ 3. ეს არ ნიშნავს, აქ, აქ, აქ, აქ. Array არის მომიჯნავე ბლოკი 0 ან მეტი bytes. მერე რა არიან ისინი სასარგებლოა? გავიხსენოთ, რომ ჩვენ გვქონდა ასეთი contrived მაგალითად შენახვის ხალხის ინტელექტუალური კლასის წელს პროგრამა გამოთვლაც თქვენი Quiz საშუალო ზოგიერთი რა თქმა უნდა, და გავიხსენოთ, რომ ჩვენ შეგვიძლია დავიწყოთ წერა, რომ პროგრამის მიერ გამოცხადების ცვლადი quiz1. მაშინ ჩვენ შეგვეძლო სხვა ცვლადში quiz2. მაგრამ შემდეგ, თუ იყო 3 ვიქტორინების ამ კლასში, quiz4. ან თუ იყო ყოველკვირეული ვიქტორინა, ეს იქნება quiz5, quiz6, quiz7. ასე, რომ თქვენ მოუწევს ყველა ამ ცვლადების განაცხადა შიგნით ძირითადი ან სადმე სხვაგან თქვენს პროგრამაში, და პრობლემა, რომ მიდგომა, ადვილი თუმცა ეს უბრალოდ დააკოპირეთ და ჩასვით, არის უბრალოდ ძალიან სწრაფად ხდება unwieldy. ღმერთმა ნუ ქნას, რომ თქვენ ნამდვილად აქვს 30 ტესტებში ან 50 ვიქტორინებში. თუ ეს მოსწონს საშუალო სკოლა სტილის ყოველდღიური Pop ვიქტორინა, მაშინ თქვენ უბრალოდ უნდა ridiculously გრძელი სიის ცვლადები ცხადდება, და ეს არის ძალიან სწრაფად კონტროლიდან გამოდის. ეს მახინჯი, ძნელია შენარჩუნება, ასე ბევრად უფრო ადვილია, რათა typo თუ თქვენ გაქვთ 1 ხმების არასწორად აკრეფილი სადღაც თქვენი პროგრამა. ამიტომ, ჩვენ გააცნო ცნება მასივი ნაცვლად. და გავიხსენოთ, რომ ჩვენ განხორციელებული ეს პროგრამა ამით პატარა რაღაც მსგავსი. ნება მომეცით წასვლას დღევანდელი წყარო 3 ორშაბათი დირექტორია და გახსენით მასივი, რომელიც ჩვენ ვნახეთ ბოლო დროს. და მიუხედავად იმისა, იყო რამდენიმე ახალი C ხრიკები აქ, მათ შორის ცნება მუდმივად, გავიხსენოთ, რომ ჩვენ განაცხადა მრავალჯერადი მოძრავი არსებითად გამოყენებით ამ სინტაქსი: float, მაშინ სახელწოდება ცვლადი, მაშინ ჩვენ გამოყენებული კვადრატული braces მართლაც პირველად, და რა გავაკეთეთ შიგნით იმ მოედანზე braces იყო ეფექტურად დააყენა ნომერი. მაგრამ ნაცვლად გამოსული ნომერი, მე ზუსტად ამ მთავრული სიტყვის, ტესტები. და რა იყო მოტივაცია აყენებს მთავრული სიტყვის მოსწონს ტესტები და შემდეგ გამოყენებით ხაზი 17 ს ხრიკი აქ რეალურად მისცეს, რომ ნომერი? რა იყო მოტივაცია არსებობს? Yeah. [Inaudible სტუდენტი საპასუხოდ] >> ზუსტად. თუ გვინდა, რომ შეიცვალოს, რომ ღირებულების 2, ჩვენ მხოლოდ უნდა შეცვალოს იგი 1 ადგილი რადგან მიიჩნევენ - ისიც კი არ მახსოვს რა ამ პროგრამის ზუსტად, მაგრამ თუ უბრალოდ skim მას ხედავთ ტესტები, ტესტები. ხედავთ ტესტები, ქვემოთ აქ მეტი ტესტები. ასე რომ, თუ ჩვენ არ გვყავს ამ მუდმივი, ეს გამოყენება მკვეთრი განსაზღვრა, ჩვენ არ აკრეფილი 2, 2, 2, 2, რომელიც კარგად არის. სამართლიანი იქნებოდა, როგორც სწორი. მაგრამ ვარაუდობენ, რომ მომავალ წელს ჩვენ გვაქვს 3 ვიქტორინების წელს CS50. ასე რომ უნდა წახვიდე და განახლება კოდი, უნდა recompile ის, მაგრამ პრობლემა ის არის, თუ რაღაც სულელური, როგორიც მე შევჩერდეთ 1 ნახსენები 2 და დაგავიწყდეთ plug in 3, მთელი პროგრამა შეიძლება ძალიან კარგად შესვენება. ასე რომ ჩვენ უბრალოდ ითხოვენ უბედურება. ამიტომ ცნება მუდმივად არის ყველაფერი ფაქტორინგული გარკვეული ნაჭერი მონაცემები, თუ არა ეს სტრიქონი ან char ან ათწილადი ან რასაც, და დეკლარირება იგი 1 ადგილი ასე რომ თქვენ შეგიძლიათ უფრო ადვილად შეცვლის მომავალში. და ეს ასევე, გულწრფელად, ცოტა ადვილი წასაკითხი, რადგან თუ თქვენ უბრალოდ ვფიქრობ ეს ახლა, ეს ტესტები, ან ჩვენ შეგვიძლია თუნდაც გადარქმევა ეს რაღაც NUMBER_OF_QUIZZES ან რაიმე უფრო ცხადი. კოდი უბრალოდ ხდება უფრო აშკარა, როგორც რასაც ის აკეთებს, და თქვენ მაინტერესებს ცოტა ნაკლები რა რაოდენობის 2 შეიძლება მოხდეს ნიშნავს. ასე რომ მუდმივი არაფერი ფუნდამენტურად ერთად მასივები. Array დაინერგა გზით ამ მოედანზე braces. ასე რომ შეესაბამება 23 ჩვენ ვთხოვთ მომხმარებელი, "რა იყო თქვენი Quiz ქულით?" მაშინ ჩვენ უბრალოდ ამ loop რომელიც სავარაუდოდ სთხოვს მომხმარებლის მათი კლასის. როგორ? ეს iterates საწყისი 0 დან 2. და მე ვიტყვი, 2 რადგან ტესტები ყველა caps არის გაკეთებული 2. ასე რომ iterates საწყისი 0 მდე 2 და მერე ბეჭდავს out Quiz # რაღაც რაღაც, და მაშინ იგი იყენებს GetFloat მისაღებად მნიშვნელობა მომხმარებლის. ასე რომ შეამჩნია ეს მხოლოდ სხვა ახალი ნაჭერი სინტაქსის გასულ ოთხშაბათს. თუ გსურთ შესანახად რაღაც განსაკუთრებული მდებარეობით, რომ მასივი, თქვენ კვლავ გამოიყენოთ კვადრატულ ფრჩხილებში. ასე რომ იქ ცოტა dichotomy აქ. პირველად თქვენ იყენებთ კვადრატულ ფრჩხილებში თქვენ გამოვიყენოთ რომ დავაზუსტოთ რამდენად დიდი გსურთ მასივი იყოს. მაგრამ ეს შემდეგი კონტექსტში აქ სადაც ჩვენ კვლავ დაასაქმოს ამ კვადრატულ ფრჩხილებში ნიშნავს სადაც რომ მასივი გსურთ დააყენა გარკვეული მნიშვნელობა? და განსხვავება აქ შეიძლება inferred საწყისი კონტექსტში. გაითვალისწინეთ აქ ჩვენ გვაქვს მონაცემები ტიპის, მაშინ ჩვენ გვაქვს სახელით ცვლადი, მაშინ ჩვენ გვაქვს ჩვენი მოედანი braces რიგ შიგნით, მძიმით. ეს არის ის. ასე რომ დეკლარაციას. უბრალოდ თითქოს ჩვენ გავაკეთეთ რაღაც ათწილადი grade1; float grade2; თუმცა ისევ და ისევ, ეს ძალიან სწრაფად devolves შევიდა გზა ძალიან ბევრი ასლი, პასტა, ასე ნაცვლად ჩვენ უბრალოდ გამარტივდა, როგორც ასეთი, რაც იმას ნიშნავს, ამიერიდან ჩვენ გვაქვს Grade რომელიც შეიძლება ინახებოდეს bracket 0, ჩვენ გვაქვს კიდევ ერთი კლასის, რომელიც შეიძლება ინახებოდეს bracket 1, მაგრამ მე ვფიქრობ goof და, მაგალითად, ჩემი loop მიდის ჯერჯერობით - მაგალითად, მე ამ ნაკლებია ან ტოლია, რომელიც გაწვევას იყო წყარო წინა bug - რომელიც ეფექტურად იმას ნიშნავს, რომ ზოგიერთ მესამე შემთხვევითი iteration ამ loop გამოვიყენო bracket 2. ეფექტურად, თუ რა შეიძლება მოხდეს აქ? უკაცრავად? [სტუდენტი] ეს იქნება შეცვალა. >> ხომ აპირებს შეიცვლება? რა უნდა შეიცვალოს? ეს სიტყვასიტყვით ამბობს შეცვლის რა არის საიდან 2 ერთად დაბრუნების ღირებულება GetFloat. მაგრამ პრობლემა იმაშია, რამდენად დიდი არის array ამ დროისთვის ამბავი? [Inaudible სტუდენტი საპასუხოდ] >> მასივი კვლავ მხოლოდ ზომა 2 რადგან მასივი, როგორც ნებისმიერ ცვლადი, გამოცხადდა პირველი, სანამ ჩვენ გამოიყენა, და ჩვენ მითითებული აქ იმიტომ კონსტანტის რომ მაქვს 2 კლასის, რომ მე ვაპირებ დააყენა. მაგრამ გახსოვდეთ, კომპიუტერის მეცნიერები დაიწყება დათვლის საწყისი 0. ამიტომ პირველ ადგილას რომ მასივი არის bracket 0. შემდეგი საიდან არის 1. ეს ის არის, ოდესმე ასე ოდნავ შორს მეტი მხარე. ასე რომ, სხვა სიტყვებით, თუ რეალურად ჰქონდა ამ მასივი - და ნება მომეცით ვხედავთ, თუ რამდენად კარგად ამ თანამშრომლობს აქ ჩვენთვის - თუ მაქვს მასივი, რომ მე უბრალოდ შედგენილი შემდეგნაირად და მე გამოყოფილი ფართი 2 ელემენტები, შეიძლება შევაჩერო ამ მოსწონს ეს მეხსიერებაში სადაც ეს დიდი თეთრი ტილო არის. უბრალოდ RAM მაქვს ჩემი კომპიუტერი, GIG of RAM, 2 gigs of RAM, რასაც, მაგრამ ეს 2 ყუთები არის ინდივიდუალურად წარმოადგენენ float, 32 ბიტი. ასე რომ, თუ მე ზუსტად 1 ხმების აქ მოსწონს 1.0, მაშინ მე ზუსტად მეორე ნომერი აქ მოსწონს 3.2 მაგრამ შემდეგ გავაკეთო bracket 2, ასეთი აყენებს რაღაც აქ. და როგორც სურათზე ვარაუდობს, არაფერია იქ. ეს ერთგვარი მოსწონს არავინ სახმელეთო რადგან მე არ სთხოვა ოპერაციული სისტემა მისცეს ჩემთვის ეს მესამე ვიქტორინა. თუ წავიდოდი გვინდა, რომ მესამე ვიქტორინა, მე უნდა ჰქონოდა forethought ვთხოვო მოქმედი სისტემის მიერ გამოცხადების ტესტები უნდა იყოს არა 2 არამედ ნაცვლად გაუტოლდება 3. ასე რომ, სხვა სიტყვებით, სურათზე რომ ჩვენ ეფექტურად აქვს ხელთ ასე გამოიყურება აქ. ეს კიდევ ერთხელ არის ადამიანის მიწის. ჩვენ უკეთესი არ შეეცდება წერილობით ღირებულებების აქ. თუმცა ისევ და ისევ, რადგან კომპიუტერის მეცნიერები ითვლიან საწყისი 0, როდესაც ვსაუბრობთ ამ მდებარეობით მასივი, რომ უნდა იყოს საიდან 0, ეს უნდა იყოს საიდან 1, და ეს კი არ არსებობს იმიტომ, რომ ჩვენ მხოლოდ სთხოვა ოპერაციული სისტემის 2 ასეთ ადგილებში. ასე რომ იმ თქვენ წინასწარი პროგრამირების გამოცდილება სხვა ენებზე შეიძლება იცით, რომ ეს არ არის ყოველთვის შემთხვევაში კოლექტორები ან რამ მოუწოდა ვექტორები. პირიქით, შეგიძლიათ უბრალოდ შეინახოს დასძინა და დასძინა და დასძინა რამ მასივები, რაც, სიმართლე გითხრათ, ჩვენ გვქონდა, რომ უნარი in Scratch და მიუხედავად ამისა, ჩვენ, როგორც ჩანს, არ ეძლევა ის აქ რადგან ერთად C თქვენ პროგრამირების ბევრად უფრო მკაფიოდ. ეს მხოლოდ თქვენ და კომპიუტერი ახლავე, და კომპიუტერი მხოლოდ აპირებს რაც თქვენ ვუთხრა მას ამის გაკეთება. ასე რომ, თუ თქვენ მხოლოდ ვამბობ, რომ გადმოგცეთ 2 მოძრავი გზით ხაზი 22 აქ, ეს ყველაფერი თქვენ აპირებს მიიღოს უკან ოპერაციული სისტემა: ფართი 2. ამიტომ სულ უფრო არიან თქვენი პროგრამების აპირებს ზოგჯერ იყოს buggy დაკავშირებით მასივები. ეს არის მხოლოდ ერთგვარი ბუნების მხეცი, რომლის დროსაც ყველა ჩვენგანი fallible, და რაღაც მომენტში თქვენ ძალიან სავარაუდოდ ინდექსი მიღმა საზღვრის თქვენი მასივი. და ეს მხოლოდ ლამაზი გზა ამბობდა თქვენ შევიდა bracket რაღაც და რაღაც იყო უბრალოდ ძალიან დიდი რიგი. თქვენ გასცდა ფარგლებში თქვენი მასივი. მაგრამ Upside ახლა არის ეს. დანარჩენი ამ პროგრამის ნამდვილად არაფერი აქვს ფუნდამენტურად არ უკავშირდება მასივები. ეს ყველაფერი მხოლოდ გარკვეული მარტივი არითმეტიკული for Computing საშუალოდ. ამიტომ აქ ამ for loop აქ პირველ ცვლადში თანხა რომ ჩვენ ინიციალიზაცია რომ 0. მაშინ ჩვენ iterate საწყისი 0 მდე 2 ერთხელ და ჩვენ დავამატოთ, რომ summation ცვლადი შ Grade, ასე bracket 0 მაშინ bracket 1. ხოლო შემდეგ თქვენ ამას გავაკეთებთ Grade სკოლა გამოთვლაც საშუალოდ ჩვენ უბრალოდ მიიღოს, რომ თანხა, დაყოფის ის მიერ საერთო რაოდენობის ვიქტორინების, და მაშინ კარგი ღონისძიება მოვუწოდებთ ფუნქცია აქ მოუწოდა რაუნდი. ახლა, როგორც განზე, რა არის გაუმკლავდეთ ამ ჩართული int on line 34? ალბათ, ეს სწორედ ამუშავება უკვე ნაწილში, არ ნამდვილად ისაუბრა, ფორმალურად აქ, მაგრამ რა არის ეს int წელს parens ალბათ აკეთებს? >> [Inaudible სტუდენტი საპასუხოდ] Yeah, ეს შეეხება ჩამოსხმის ან typecasting, რაც იმას ნიშნავს, აღების 1 მონაცემები ტიპისა და კონვერტაცია იგი სხვა. თქვენ არ შეგიძლიათ ამის გაკეთება ყველა მონაცემთა ტიპები, რადგან ზოგჯერ ეს იქნებოდა ცოტა უცნაურია. მაგრამ ამ შემთხვევაში, თუ დაბრუნების ღირებულება მრგვალი არის float რადგან ბოლოს და ბოლოს, მე აღების float და გამყოფი ის მიერ ხმების მოსწონს 2, მე ვაპირებ დაიბრუნებს ათწილადი. მაგრამ Grade სკოლა ხალხს ნამდვილად არ სურს იცოდეს, რომ მათი საშუალო იყო 93,4 რადგან ისინი ყველაფერს აცნობიერებენ, რომ ისინი ოდესმე ისე ახლოს, რომ 95 დამრგვალება წერტილი. ასე რომ ჩვენ გვინდა ნაცვლად გამოიყენოთ int მრგვალ ყველას უახლოეს int, რომელიც ამ შემთხვევაში იქნება 94 ერთად არ პუნქტიანი მას შემდეგ. ასე რომ ეს მხოლოდ პატარა მათემატიკური შეასრულა. და ჩვენ დავბრუნდებით ამ ცნება აძლევენ, რადგან იგი ექნება გამოძახილი, თუ არ აღმოაჩინა უკვე, პრობლემის მითითებული 2. ამიტომ მასივი შემდეგ, შეგიძლიათ წარმოიდგინოთ, რომ - ის აპირებს ჩემთვის ღიმილი მთელი დღის. როგორც ჩანს ეს, თუ თქვენ მიაპყროს სურათს ის, მაგრამ გასაღები იმაში მდგომარეობს, რომ ზომა ასევე შერჩეული თქვენს მიერ როდესაც თქვენ მოითხოვოს ის ოპერაციული სისტემა. ნებისმიერი კითხვები შემდეგ კოლექტორები? Yeah. [Inaudible სტუდენტი კითხვა] Ah, კარგი კითხვაა. კითხვა, რა ხდება null 0 მასივში? ის არ არსებობს ამ კონტექსტში. რომ მხოლოდ არსებობს კონტექსტში სტრიქონები, რომელიც ჩვენ შესახებ მისვლა რაღაც მომენტში. მაგრამ მასივი, როგორც ამ შემთხვევაში, ყველა თქვენ არის ის, რაც თქვენ ჰკითხავთ ოპერაციული სისტემა. და როგორც განზე, მცირეოდენ ეს იყოს გაუგებარია, მე შენარჩუნება ამბობდა თქვენ ჰკითხავთ ოპერაციული სისტემა, სთხოვეთ ოპერაციული სისტემა. ოპერაციული სისტემა, როგორც თქვენ ალბათ იცით, რომ არის Mac OS, Windows, Linux. როდესაც თქვენ მოუწოდებენ ფუნქციების მსგავსად GetFloat ან თქვენ გამოცხადების ცვლადები, როგორიცაა კლასის, დასასრულს დღეში თქვენ ეფექტურად ეკითხება ვინმეს მისცეს, რომ მეხსიერების იმიტომ, რომ ჩვენ, როგორც მიისწრაფვიან პროგრამისტები არ ვიცი როგორ რეალურად მიიღონ ფიზიკური ხელმისაწვდომობის მეხსიერება. მაგრამ ვინმეს: ოპერაციული სისტემა. ასე რომ გარდა წარდგენის ჩვენთვის საკმაოდ ხატები და მენიუები და დასტების და მოსწონს რომ ხედავთ თქვენს სამუშაო მაგიდაზე, თუ არა Mac ან PC, ოპერაციული სისტემები გააკეთოს დაბალი დონე mundane პერსონალის, უაღრესად ტექნიკური პერსონალი მართვის Gigabyte ან 2 გბ მეხსიერების რომ თქვენ გაქვთ, მართვის CPU, რომ თქვენ გაქვთ, და სხვ. ასე რომ, როდესაც თქვენ წერა კოდი, თქვენ ნამდვილად გადაუგდო თქვენს ოპერაციულ სისტემას ამ თვალსაზრისით. მე ვაპირებ უნდა მინიმუმამდე რომ. ყველა უფლება. სხვა კითხვები შესახებ კოლექტორები? არარის? Okay. ასე რომ გარდამავალი ბუნებრივია საწყისი კოლექტორები არის რეალურად რომ თემას რომ ცოტა ნაცნობი. ჩვენ ჩანდა ოდესმე ასე მოკლედ ამ ბოლო დროს ძალიან. ეს იყო სიმებიანი მაგალითი ოთხშაბათს. ეს კონტექსტი მაგალითი იყო საკმაოდ მარტივი პროგრამა, და მე რეალურად გაამარტივა ის მიერ რამდენიმე ხაზები დღევანდელი მიზნებისათვის. ყველა ეს იმას შეესაბამება 19 არის კიდევ string საწყისი მომხმარებელი, ინახავს მას ცვლადში s. შემდეგ ხაზი 22 Onward ეს აშკარად დაბეჭდვის რომ string 1 სიმბოლოს თითო ხაზზე. მაგრამ როგორ არის ეს ამით? ჩვენ ვაცხადებთ ცვლად i, თუ მითითებული ტოლია 0, და ეს ხდება ძველ ჩვევა არის. ჩვენ არ უნახავს ამ სანამ ოთხშაბათს, მაგრამ შეგიძლიათ სახის infer თავისი სახელი strlen მხოლოდ დააბრუნებს რა, როცა მოცემული s? სიგრძეზე სიმებიანი. ასე რომ, თუ მე უნდა გაიაროს ეს ტექსტი, ციტირებით-unquote დავით, ეს იმედია დაბრუნებას აპირებს ჩემთვის ნომერი 5 რადგან დავით. ასე რომ მისი მიზანი ცხოვრებაში არის მიიღოს სიმებიანი, თუ არა რთული კოდირებული თქვენს მიერ ან ამ შემთხვევაში plugged როგორც ცვლადი, როგორც არგუმენტი, და ეს გათვლით, თუ რა სიგრძეზე რომ სტრიქონს. ასე რომ აქ არის ჩვენ სესხების ზოგიერთი ნოტაცია საწყისი წინა ვიქტორინა მაგალითად. ამას არაფერი აქვს საერთო მოძრავი, არაფერი აქვს ერთად ვიქტორინებში, მაგრამ აღმოჩნდება, რომ პატარა თეთრი ტყუილი ჩვენ გეუბნებოდით წლიდან კვირა 1 ის არის, რომ სიმებიანი ნამდვილად არ არსებობს C. სიმებიანი დროს დღის ბოლოს მართლაც მხოლოდ მასივი. ეს მასივი ბაიტი, ამიტომ byte, byte, byte, byte, რომელიც გაწვევას მხოლოდ 8 ბიტი, ასე ბლოკი მეხსიერება, ბლოკი მეხსიერება, ბლოკი მეხსიერება, ბლოკი მეხსიერება. და საშუალება, რომლითაც სიმებიანი ხორციელდება არის გამოსული პირველი ხასიათი აქ, მაშინ აქ, მაშინ აქ, მაშინ აქ, თავში დაბრუნება უკან კომპიუტერის მეხსიერებაში. ასე რომ, თუ თქვენ სურდა სიტყვიერად სიტყვა მოსწონს Hello, თქვენ მისთვის 1 სიმბოლოს H, შემდეგ E, მაშინ L მაშინ L, მაშინ O - 5 სიმბოლოების სულ - სადღაც თქვენი კომპიუტერის RAM. მაგრამ მთავარი დეტალი აქ ის არის, რომ ისინი იქნება თავში დაბრუნება თავში დაბრუნება, უფლება შემდეგი ერთმანეთს. როდესაც როდესაც ვამბობ, რომ s [i], რა ინგლისურ ეს მაძლევს? რას s [i] წარმოადგენენ ამ შემთხვევაში? Yeah. [სტუდენტი] შ პერსონაჟი სიმებიანი. >> ზუსტად. შ ხასიათის სიმებიანი. ახლა, მე აპირებს იწყება 0 როგორც პოსტი ჩემი ამისთვის loop აქ, მაგრამ ეს კარგია, რადგან ყველაფერი იწყება დათვლის საწყისი 0. ასე s [0] აპირებს წარმოადგინოს წერილი H ერთი სიტყვით, როგორიცაა Hello, s [1] აპირებს წარმოადგინოს წერილი მოსწონს E ერთი სიტყვით, როგორიცაა Hello, და სხვ. და ჩვენ როგორც ჩანს აკეთებს თითოეულ iteration ამ loop დროებით შენახვის შ პერსონაჟი ცვლადში გ, რომელიც მხოლოდ char, და მაშინ ჩვენ დაბეჭდვისას გ ასე, რომ დღის ბოლოს რა ამ პროგრამის არ არის შემდეგი. თუ მე წასვლას წყაროს დირექტორიაში და მე string1 და მე წავიდეთ წინ და აწარმოებს string1, და მერე აკრიფოთ სიტყვა მოსწონს Hello, მიუთითოთ, ყველა ის არ არის ბეჭდვის ამ 1 სიმბოლოს დროს. ასე რომ არსებობს შესაძლებლობა დახვეწას აქ. მე სახის აკეთებს უფრო მეტი მუშაობა, მიუხედავად იმისა, რომ ეს უფრო ნათელი იქნებ ამ გზით, ვიდრე საჭიროა. რომელი ხაზი კოდი აქ შემიძლია ალბათ გადაყარეთ საერთოდ? Yeah. ხაზი 24. შეესაბამება 24 მე გამოცხადების ცვლადი გ. მე შენახვის შ ხასიათი s, მაგრამ მაშინ მე გამოყენებით C აქ. ამიტომ მე გამოყენებით C, ისე ვგრძნობ როგორც მე არ შეუძლიათ უბრალოდ გადაყარეთ ხაზი 24 დაშორებით. [Inaudible სტუდენტი კომენტარი] >> ზუსტად. ასე რომ, როდესაც საქმე ეხება ვსაუბრობთ დიზაინის პროგრამების, შეამჩნია ამ უმნიშვნელო გამარტივებას კოდი, რომელიც ისევე, როგორც იკითხება, მაგრამ ვაცნობიერებთ, რომ ჯერ მხოლოდ ცვლადი, მისი მონაცემები ტიპის მასივი, ასე s [i] უბრალოდ აპირებს მყისიერად დაუბრუნდნენ თქვენ შ პერსონაჟი რომ სიმებიანი. და თუ გსურთ დაბეჭდეთ, რომ ჯარიმა. თქვენ უბრალოდ უნდა გამოვიყენოთ% გ იმიტომ, რომ თქვენ არ დაბეჭდვის სიმებიანი, თქვენ დაბეჭდვის პერსონაჟი სიმებიანი, და ეს ძალიან აქვს ეფექტი დაბეჭდვის შ ხასიათი. და გავიხსენოთ მხოლოდ განსხვავება ნამდვილად გასულ კვირას გამოყენებით printf ის არის, რომ მაშინ როცა კვირის წარსულში ჩვენ რაღაც სუპერ მარტივი მოსწონს% s placeholder შემდეგ სახელწოდება სიმებიანი აქ, ახლა ჩვენ diving პატარა ღრმა Underneath hood და ამბობდა, არ ბეჭდვა string; ბეჭდვა ერთჯერადი ხასიათი მასში. ასე რომ ჩვენ შეგვიძლია გავაკეთოთ რაღაც პატარა სხვადასხვა აქ იმიტომ არსებობს 1 სხვა - არ bug რადგან ეს პროგრამა არის სწორი, მაგრამ მე ვაკეთებ რაღაც სულელური რომ ვთქვი მოკლედ ოთხშაბათს. მაგრამ ფიქრი თავში, როგორ შეიძლება ამ პროგრამის დიზაინის გაუმჯობესდება კიდევ უფრო? Yeah. [Inaudible სტუდენტი საპასუხოდ] >> ოჰ, კარგი. ასე რომ გავიხსენოთ, რომ ჩვენ გააცნო მეორე ცვლადში N ბოლო დროს, რომელიც, როგორც ჩანს, ეწინააღმდეგება საკუთარ თავს, რადგან ჩემი მიზანი მეორე წინ იყო მხოლოდ გადაყარეთ ცვლადი როგორც ზედმეტი, მაგრამ გავიხსენოთ, რომ ოთხშაბათს ჩვენ რეალურად ეს. მე შეიცვალა ამისთვის loop რეალურად აქვს მძიმით აქ, მაშინ n = strlen, და მერე აქ მე არ ვამბობ > [Inaudible სტუდენტი საპასუხოდ] >> ზუსტად. მე არ გახსენებით strlen ისევ და ისევ და ისევ იმიტომ, რომ გავიხსენოთ, როგორ ამისთვის loop სამუშაოები. მაშინაც კი, თუ ისინი დაიწყოს უფრო რთული ორიენტირებული, გავიხსენოთ, რომ რამ ადრე პირველი მძიმით არის ინიციალიზაციისას, რომელიც ხდება ერთხელ. მდგომარეობა, თუმცა, არის შუა, და ეს იღებს შემოწმდება ყოველ ჯერზე, რომ თქვენ გავლა loop. ასე რომ სახის სულელური უნდა ეკითხება კომპიუტერი იგივე კითხვა ისევ და ისევ - რა არის სიგრძეზე მიესალმები? რა არის სიგრძეზე მიესალმები? რა არის სიგრძეზე მიესალმები? - რადგან, როგორც ვნახავთ, დღეს და ოთხშაბათს, ეს ნამდვილად აპირებს, დრო სჭირდება, და ეს არ არის ძალიან კარგი გამოყენების დროს, რადგან გაერკვნენ სიგრძეზე სიმებიანი რეალურად იღებს ცოტა ძალისხმევა. ეს არ არის გამდინარე, როგორც ეს ზოგიერთ ენებზე. ასე შეცვლით ამ N, ფასი მე გადამხდელი არის რა? ჩვენ ვხედავთ ვაჭრობის აქ. შემიძლია დაზოგეთ დრო არ გეკითხებით იგივე Damn კითხვას ისევ და ისევ, მაგრამ ეს ხდება ღირებულება ჩემთვის რაღაც, რაც? [სტუდენტი] დაკარგვის გარკვეული თანხის მეხსიერება. >> ზუსტად. იგი აპირებს ეღირება ჩემთვის ზოგიერთი მეხსიერება. ასე რომ ამ შემთხვევაში ღირს რა? კიდევ ერთი 32 ბიტი, რადგან N მხოლოდ int, როგორც ითვალისწინებს სიტყვა int აქ. მაგრამ არის ის, რომ okay? გულწრფელად ვამბობ, რომ ალბათ okay რადგან თუ ფიქრობთ ამის შესახებ, აღარ სტრიქონს, მეტი დრო მე ვაპირებ იყოს გაყვანაა რადგან strlen აპირებს მისაღებად მოუწოდა ისევ და ისევ და ისევ ყველა iteration of loop. და ამ დღეებში, ჩემი Mac აქვს 2 gigs of RAM, ამ დღეებში 4 gigs of RAM ხანდახან. ვფიქრობ, შეგვიძლია 4 იმ bytes რეალურად დაჩქარდეს რამ მდე. მაგრამ ეს იქნება ვაჭრობის საგანი და თემა ნამდვილად პროგრამირებაში და კომპიუტერულ მეცნიერებათა საქართველოს არასოდეს ნამდვილად საზღაურის უფასოდ. თუ გსურთ გააუმჯობესოს რაღაც აქ, თქვენ უნდა გადაიხადოს იგი მეორე მხრივ რაღაცნაირად. ფართი წინააღმდეგ დრო ამ შემთხვევაში. ასე რომ, ეს იყო ყველა წამყვან up მიმართ რაღაც cryptic მოსწონს, რომელიც, როგორც თქვენ ალბათ figured მიერ არის, ფაქტობრივად ამბობს? [Inaudible სტუდენტი საპასუხოდ] >> ჰო, ასე რომ, ეს, დარწმუნდით დალევა თქვენი Ovaltine, რეალურად გამოყენებით ალგორითმი მოუწოდა ROT13, rot 1-3, რომელიც უბრალოდ ნიშნავს როტაცია ყველა წერილებს 13 ადგილებში, რაც იმას ნიშნავს, მიიღოს და შემდეგ დაამატოთ 13 მას და წავიდეთ dot, dot, dot ყველა გზა მე -13 წერილში მოშორებით, იგივე რამ B და C და D და სხვ. და თუ ჩვენ რეალურად გადაიყვანოთ ამ აქ გამოყენებით ცვლის 13 ადგილებში, ჩვენ დავუბრუნდეთ რა პატარა Ralphie ჰქონდა, რომელიც, დარწმუნდით დალევა თქვენი Ovaltine. მაგრამ ახლა პრობლემის მითითებული 2, in სტანდარტული გამოცემა მინიმუმ, თქვენ უნდა სახის ამის გაკეთება enciphering თავს, და ჩვენ როგორმე მიიღოს შეყვანის მოსწონს და გაშიფრავს მას გაშიფვრა ან იგი. ასე რომ რომელიც ამ საფუძვლები სახის მივყავართ, რომ შესაძლებლობა? მოდით შევხედოთ ამ მესამე მაგალითად აქ. უპირველეს ყოვლისა, ეს ე.წ. ASCII. რას ASCII ეხება თავში? ამერიკული სტანდარტული კოდი ინფორმაციის ცვლა, რაც მართლაც ხანგრძლივი გზა ამბობს იმას, რაც? რა არის ASCII? [Inaudible სტუდენტი საპასუხოდ] >> რა არის რომ? >> [სტუდენტი] ხასიათი რუკა. >> ხასიათი რუკა. უბრალოდ რუკები ნომრის წერილებს, რადგან მსოფლიოს სტანდარტიზებული რა ნომრები იქნება რა წერილებს ასე რომ ყველას შეუძლია გამოიყენოს კომპიუტერები და ჩვენი პროგრამების ყველა მხოლოდ თავსებადი როდესაც საქმე დაბეჭდვისას რამ ეკრანზე. ასე რომ გავიხსენოთ, რომ 65 მოსდის წარმოადგენენ, 97 ხდება წარმოადგინოს მხედრულ. და ამიტომ ეს მარტივი პროგრამა აქ ASCII ხდება უპირატესობა, რომ ის ფაქტი - რომ მსოფლიომ იცის, რომ დედაქალაქში არის 65 - და ეს მხოლოდ დაბეჭდვის რუკების. ასე რომ სანამ ჩვენ ჩაყვინთვის შევიდა ამ კოდექსით, ნება მომეცით ნაცვლად გახსენით ტერმინალი ფანჯარა. ნება მომეცით წავიდეთ წინ და მიიღოს ASCII და შემდეგ მოდით უბრალოდ აწარმოებს ამ რამ მხოლოდ გააფუჭებს გამომუშავება. და ეს უბრალოდ აკეთებს ამას: მართლაც დიდი სქემა, რომ მხოლოდ მეუბნება ყველა სხვადასხვა კოდები ყველა სხვადასხვა წერილებს. ასე სუპერ მარტივი პროგრამა, მაგრამ არ უნდა მძიმე კოდი იმ 52 ხაზების გამომავალი: 26 ზედა, 26 ამას. სამაგიეროდ, მე ამ პროგრამულად ერთად რამდენიმე მარყუჟების. გაითვალისწინეთ რა გავაკეთე აქ. მე iterated საწყისი მე არის 65 წლის მდე 65 + 26 რადგან მინდოდა ამობეჭდოთ 26 წერილებით ინგლისურ ანბანი, მე + + თითოეულ iteration და ახლა შეამჩნია ეს კიდევ ერთხელ. ეს არ განმეორდეს ჩვენი მეგობარი typecasting რომლითაც თქვენ კონვერტირება 1 ტიპის მონაცემის სხვა რადგან რა გსურთ ამ კონკრეტულ პროგრამაში? მინდა ითვლიან რიცხობრივი რადგან ასე ვიზრდებოდი დათვლა - 65, 66, 67, და ა.შ. - მაგრამ მე არ მინდა, რომ ბეჭდვა მხოლოდ ციფრები. მინდა ბეჭდვა წერილი მოჰყვა ნომერი. მინდა ბეჭდვა: ნომერი, B: ნომერი, მაგრამ შემიძლია ამ იგივე ზუსტი ცვლადი. ასე რომ ამობეჭდოთ% c როგორც placeholder for ხასიათი, % D როგორც placeholder for ციფრი ან რიცხვი. მაშინ რა შეაერთედ წელს მათთვის, 2 placeholders? მე პირველად plug in ხასიათი ეკვივალენტს მე, და მერე ამობეჭდოთ მე თავად. ასე რომ შეამჩნია ეს ძალიან უბრალოდ მუშაობს. ზუსტად ისე, როგორც მე შემიძლია მიცემული საწყისი float to int რათა გადასვლა რეალური ნომერი რიცხვი, აქ შემიძლია გადასვლა int to char, რომელიც ცოტა უცნაური - არ საკმაოდ განვსაზღვრავთ გადატანა რეალურ ცხოვრებაში - მაგრამ კომპიუტერები char მხოლოდ ხმების ქვეშ hood, ამიტომ ჩვენ მყოფი ოდესმე ასე გამოკვეთილ აქ კომპიუტერი, რომელშიც ნათქვამია, printf, ამობეჭდოთ არ მე, როგორც 65, ამობეჭდოთ როგორც მისი რიცხვითი ექვივალენტი. და აღმოჩნდება, მე ტექნიკურად კი არ გვჭირდება. რა იყო აკეთებს მომენტში წინ არის მკაფიოდ აძლევენ განსაზღვრით რა ტიპის მონაცემის მინდა გადასვლა და. მაგრამ შეამჩნია, რომ მე უკვე მაქვს ეს placeholder% C და ეს სხვა% C placeholder აქ. მიუხედავად იმისა, რომ ეს არ არის int, კომპიუტერის აცნობიერებს, რომ char, უბრალოდ int ქვეშ hood. ასე რომ, თუ მე რეალურად recompile ამ და გამეორება ASCII პროგრამა, შენიშნავს კვლავ მხოლოდ მუშაობს, რადგან კომპიუტერის აცნობიერებს, რომ არ არსებობს ამ კორესპონდენციას. ახლა, ეს უფრო მნიშვნელოვანია გავაკეთოთ გამოკვეთილ ჩამოსხმის სამყაროში მოძრავი to ints რადგან თქვენ რეალურად მიღების გამოითვლება გადაწყვეტილება: გადაყარეთ ყველაფერი შემდეგ ათობითი წერტილი. აქ მართლაც არაფერი გადაყარეთ, რადგან ხასიათი მხოლოდ ნომერი, და სიმებიანი მხოლოდ მასივი სიმბოლო. ასე რომ, როდესაც საქმე დროის შეასრულოს კოდირების ზოგიერთი ან დეშიფრაციის, როგორ არის ეს, რომ ჩვენ შეგვიძლია რეალურად თარგმნოს მსგავსი რამ სისულელეა, დარწმუნდით დალევა თქვენი Ovaltine? რა მოხდება, თუ ჩვენ ვიცით ახლა - ავიღოთ როგორც ვარაუდი - რომ გასაღები, ნომერი, რომელიც ჩვენ მოძრავი ყველა ამ წერილების, არის ხმების 13? ამიტომ წავედით საწყისი წერილში B ყველა გზა O დაწყების წინადადება დარწმუნდით დალევა თქვენი Ovaltine, რადგან თუ B და მაშინ მე C, D, E, F, G, H, I, J, K, L, M, N, O, ამიტომ დაშიფვრისათვის წერილში B ხდება O იმიტომ, რომ მე უბრალოდ დამატებულია 13 მას. ასე რომ, თუ მინდა გაშიფვრა, მე არსებითად უნდა მიიღოს O და მერე სხვაობა 13 მას. ან, გულწრფელად, რადგან იქ 26 ასო ანბანი, ეს შესანიშნავად სიმეტრიული, ჩვენ შეგვიძლია ასევე მხოლოდ დაამატოთ 13 და ჩვენ დავუბრუნდებით წერილში ბ მაგრამ როგორ წავიდეთ შესახებ ახორციელებს მსგავსი რამ წელს კეისარმა ან მართლაც მანიპულირების სიმები კულტურას? თუ წერილში B არის რა ნომერი? რა არის წერილი B? ასე რომ 66, არა? ასე რომ, თუ წერილში არის 65 და წერილში B არის 66, ასე 66, ყველა მე უნდა გააკეთოთ დაამატოთ 13 მას, და ეს მაძლევს 79. და თუ ჩვენ წასვლა ჩვენი პატარა cheat ფურცელი, 79 მართლაც რუკები გადატანა ო მაგრამ არსებობს ცოტა კუთხეში შემთხვევაში აქ. რა არის, ვთქვათ, წერილში Z? თუ ასე 66 + 25 მიიღოთ ყველა გზა ბოლომდე ანბანი, ჩვენ დროს 91. 91 + 13 მაძლევს 104, და გამოიცანით რა? 104 არ გაუტოლდება ზედა წერილში. მოდით დავუბრუნდეთ პატარა cheat ფურცელი აქ. თუ მე გამეორება ამ პროგრამის ელექტრო შეამჩნევთ, რომ 104, თუ დაბრუნდებით ტერმინალის ფანჯარა, 104 აშკარად ამას თ. ამიტომ გვჭირდება გასაღები შეასრულა აქ, რათა დარწმუნდეთ, რომ როდესაც ჩვენ იწყება Z და დავუმატებთ 13 მას ჩვენ არ გვინდა უბრალოდ შეინახოს გაყალბება მანამდე უფრო დიდი და უფრო დიდი ციფრები. რა ჩვენ ნამდვილად გსურთ? გსურთ გადაიტანოთ გარშემო. გამოდის,, როგორც თქვენ ვხედავთ ალბათ ნაწილში არის ან პრობლემა კომპლექტი სპეც თავად მიხვდა, რომ არსებობს ამ სხვა ოპერატორს C რომ ასევე არის პროცენტს ნიშანი, მაგრამ იმის გამო, რომ ჩვენ გამოყენებული% აქ დაზუსტება placeholder, ვიცით, რომ, განსაკუთრებით პრობლემა კომპლექტი 2, არსებობს ასევე მსგავსი რამ: int x = y% z. ნება მომეცით უბრალოდ წარმოადგინოს ეს ძალიან generic ფორმა ამ. პროცენტს ნიშნავს რა პროგრამირების ენა? >> [სტუდენტი] Modulo. Modulo, რომელიც ლამაზი გზა რომ დარჩენილი. მიუხედავად იმისა, რომ არსებობს უმნიშვნელო განსხვავება განსაზღვრებას იქ, ეს იმას ნიშნავს, გაყოფა Y მიერ z მაგრამ არ დაბრუნდებიან შედეგია, რომ სამმართველო; ნაცვლად, დაბრუნდნენ დარჩენილი. ასე რომ, თუ Y ფაქტიურად 3 და z არის რეალურად 2, 3 იყოფა 2 არის 1 ერთად დარჩენილი 1, რას x რეალურად თანაბარი ამ სცენარით? 1. ეს არის ისეთი მარტივი, დაბალი დონის იდეა. იგი იღებს ცოტა დრო თქვენი გონება გახვეული გარშემო იმიტომ, რომ ეს ალბათ იყო, ხოლო მას შემდეგ, რაც თქვენ კი იძულებული გახდა აინტერესებს დარჩენილი და ფაქტობრივად მათ გამოყენებას რაღაც მიზანმიმართული, მაგრამ ამ შემთხვევაში მარტივი ფაქტი, რომ თქვენ შეგიძლიათ გადასვლა დიდი რაოდენობის მოსწონს 3 რათა შედარებით მცირე რაოდენობის მოსწონს 2 და შემდეგ გადაიტანოთ გარშემო ეფექტურად გამოყენებით დარჩენილი, რათა პატარა ღირებულება: 1 იქნება ფასდაუდებელი შეასრულა რომ ჩვენ შეგვიძლია გამოვიყენოთ, როგორც რაღაც კეისრის და ამ სხვა რამ Vigenere პრობლემების მითითებული 2, მაგრამ ეს იქნება განმეორებადი შეასრულა მთელი სემესტრის. ეს მარტივი, მარტივი იდეა მხოლოდ აღების დარჩენილი ზოგადად აპირებს საშუალებას გვაძლევს გადაიტანოთ გარშემო. და როგორც ჩვენ დაუკარით მეტი მასივები, როგორც ჩვენ დაუკარით მეტი მეხსიერების თავად, ამ აპირებს გახდეს უფრო და უფრო ძლიერი შეასრულა. ასე რომ რაიმე კითხვა მერე ASCII ან წარმომადგენლობა სიმები როგორც კოლექტორები? და ჩვენ მას up 1 მაღალი დონის შემდგომი. Yeah. [Inaudible სტუდენტი კითხვა] >> კარგი კითხვაა. რას ნიშნავს, როცა ცვლადი აქვს ვარსკვლავი წინაშე იგი? ნება მომეცით გადადოს პასუხობდა, რომ ნებისმიერ დეტალს, მაგრამ რომ ეხება თემას ცნობილია, როგორც კურსორი. პოინტერები უნდა გავაკეთოთ მეხსიერების, და ჩვენ, ფაქტობრივად, დღეს აღების პირველი ნაბიჯი, რომ დისკუსია, მაგრამ ახლა, მინდა ვიტყვი, რომ ვარსკვლავი არ არსებობს და გავაგრძელებთ მოუწოდებდა სიმები სიმები ნაცვლად გამოყენებით char *, რომელიც თქვენ ალბათ მინახავს ადრე და მე დააყენა ეკრანზე რაღაც მომენტში როგორც Teaser. ამიტომ ჩვენ, დაუბრუნდეს, რომ გზა უფრო დეტალურად, ვიდრე ბევრ თქვენგანს ალბათ მოსწონთ. საბოლოოდ, არ დღეს. Yeah. [Inaudible სტუდენტი კითხვა] რა კონტექსტში გაქვთ უზრუნველყოს ნიშანი ხასიათი? >> [სტუდენტი] Yeah. ასე რომ იყოს, როცა არ დააყენა +, მხოლოდ დადებითი ციფრები აიღო. ასე რომ, თუ მხოლოდ წერენ ნომერი 1, ეს დადებითი 1. თუ თქვენ ნამდვილად გინდათ დააკონკრეტა უარყოფა ღირებულება, თქვენ სიტყვასიტყვით უნდა გავაკეთოთ -1 თქვენს კლავიატურაზე. მაგრამ ეს, ალბათ, არ არის თქვენი შეკითხვა. >> [Inaudible სტუდენტი საპასუხოდ] კარგი კითხვაა. Okay. ასე რომ, ეს უნდა გააკეთოს, მე შევიკრიბოთ, გარკვეული სახის bug თქვენ შეუვარდნენ რადგან თქვენ კონვერტაცია მთელი რიცხვი უნდა ხასიათი, მაგრამ რატომღაც ნეგატიურობის ჩაერთო, და ა.შ. ხასიათი უბრალოდ გამოვიდა munged როგორღაც. ასე რომ ახლა, ნება მომეცით oversimplify bit სანამ ჩვენ დავბრუნდებით ამ სახის თემას. ახლა ვფიქრობ რამ ამ გზით - და ეს არის oversimplification. მაგრამ სამყაროს რიცხვი, თქვენ რამდენი ბიტი თქვენს განკარგულებაშია? თქვენ გაქვთ 32 ბიტი. და ჯერჯერობით ჩვენ ვისაუბრეთ საერთო რაოდენობა რიცხვებით შეგიძლიათ ამიტომ წარმოადგენს დაახლოებით 4 მილიარდი დოლარი, რადგან თქვენ გაქვთ 32 ბიტი, ასე რომ 2 დან 32, ასე რომ უხეშად 4 მილიარდი. მაგრამ ჩვენ ვნახეთ კვირას ან 2 წინ, რომ თქვენ ნამდვილად არ აქვს სპექტრი ნომრები საწყისი 0 on მდე 4 მილიარდი. სპექტრი ნაცვლად მიემართება უხეშად უარყოფითი 2 მილიარდი დადებითი 2 მლრდ. მაგრამ ეს მაშინ სთხოვს კითხვაზე, როგორ წარმოადგენს ცნება უარყოფით 2 მილიარდ რომ აღარაფერი ვთქვათ ნეგატიური 1? ახლა ჩვენ შეგვიძლია oversimplify და უბრალოდ, ვამბობთ, რომ ჩვენ ვაპირებთ გამოვიყენოთ leftmost bit იმ 32 ბიტი, და თუ ის 1 ის უარყოფითი ნომერი, და თუ 0 ის დადებითი რიცხვი. პრობლემა, რომ გამარტივებული წარმომადგენლობა უარყოფითი რიცხვები არის ის, რომ თუ თქვენ შეგნებულად მიმდინარეობს ჭკვიანი და ცდილობს კონვერტირება საწყისი ხასიათის ნომერი ან პირიქით, არ არსებობს ასეთი რამ, როგორც ნეგატიური ხასიათის. სამყაროში ASCII, რომელიც იყენებს მხოლოდ 8 ბიტი, ყველა 8 იმ ბიტი საკითხზე, და leftmost ცოტა აქვს საერთო არაფერი ნეგატიურობის. და უბრალოდ უნდა იყოს მკაფიო, როდესაც ვამბობ, რომ leftmost ბიტი, გავიხსენოთ, რომ როდესაც ჩვენ ჩვენი bit დაკავშირებული მაგალითები პირველ კვირას გავიხსენოთ, რომ ჩვენ გაამახვილა რამ, როგორიცაა 1001101, მსგავსი რამ. როდესაც ვამბობ leftmost bit, უბრალოდ სიტყვასიტყვით ნიშნავს, რომ 1 წერთ ყველა გზა ზე მარცხნივ. ასე რომ, მსოფლიოს პერსონაჟების არ არსებობს ცნება ნეგატიურობის, ასე რომ leftmost ცოტა რეალურად აქვს რაიმე კავშირი არა ASCII, არაფერ შუაშია ნეგატიურობის. ასე რომ ჟღერს - გარეთ კონტექსტში რთულია პასუხის გაცემა ზუსტად - მაგრამ რატომღაც, თქვენი კოდი იყო დამაბნეველი რომ leftmost bit როგორც წარმოადგენენ უარყოფითი ღირებულება როდესაც ეს მართლაც ნაწილი იყო პერსონაჟი კითხვაზე. და ისევ, მე oversimplifying რადგან კომპიუტერები რეალურად რაღაც პატარა fancier ვიდრე უბრალოდ იცვლება რომ leftmost მწირი 1 ამისთვის უარყოფითი ნიშანი წინააღმდეგ 0. მათ ნაცვლად, თუ თქვენ ცნობისმოყვარე to Google, გამოიყენოს რაიმე ჩვეულებრივ მოუწოდა 2 ს შეავსებს, რაც უფრო მეტი დახვეწილი of მიდგომა მაგრამ იდეა არის საბოლოო ჯამში იგივე. ასე რომ, მოკლე, მას არ უკავშირდება იმ ფაქტს, რომ თქვენ massaging ნომერი ხასიათი ან პირიქით, მაგრამ თქვენი კოდი არ იყო cognizant იმისა რომ 1 იმ ბიტი ჰქონდა მნიშვნელობა რიცხვითი მსოფლიოში. ეს არ არის საქმე ხასიათი მსოფლიოში. მაგრამ ეს ჟღერს თქვენ დაფიქსირდა, რომლის დროსაც იმიტირებული არის. სხვა კითხვები. Okay. ასე რომ ჯერჯერობით ყველა პროგრამების ჩვენ წერილობითი აქვთ აღებული შეყვანის იქნებ საწყისი მომხმარებლის სახით ფუნქციები, როგორიცაა GetInt, GetString, ან თუ თქვენ უკვე კითხულობს ადრე სხვადასხვა წიგნების ან ონლაინ ცნობას, თქვენ თქუენგან შესაძლოა გამოყენებული ფუნქციების მსგავსად scanf რომელიც, სიმართლე გითხრათ, ჩვენ გამოიყენონ CS50 ბიბლიოთეკაში. მაგრამ ერთ კვირაში 2, ჩვენ რეალურად ნახოთ თუ როგორ CS50 ბიბლიოთეკა ხორციელდება ასე რომ შეგვიძლია იმ სასწავლო თვლები off საერთოდ. მაგრამ თურმე არსებობს სხვა გზა მიიღოს შეიტანენ მომხმარებლის. ფაქტობრივად, ჩვენ თვითონ არ იყენებს command line არგუმენტები ამისთვის რამდენიმე კვირაა. ყოველ ჯერზე ჩვენ აწარმოებს Clang ან ჩვენ აწარმოებს გააკეთოს, ჩვენ არა მხოლოდ აკრეფილი clang, მიუთითოთ, ჩვენ არ აკრეფილი გააკეთოს, შეიყვანეთ. რა გვაქვს, როგორც წესი, წერილობითი შემდეგ სიტყვა clang ჩვენს ტერმინალში Windows კონსოლი? [სტუდენტი] ფაილის სახელი. >> ფაილის სახელი, არა? Hello.c ან mario.c ან რასაც შესაბამისი ფაილის სახელია. ამ მხრივ რა თქვენ მართლაც გაკეთდეს არის თქვენ გავლენით ქცევის Clang რადგან, რა თქმა უნდა იმ ხალხს, ვინც წერდა Clang წარმოდგენაც კი არ ჰქონდათ, რომ პატარა ძველი თქვენ მიდიოდა წერენ პროგრამას სახელწოდებით mario.c წლის შემდეგ. ასე, რომ თქვენ იძულებული გახდა როგორღაც გავლენა მოახდინოს ქცევის, რომ პროგრამა, და რომ პროგრამა Clang უნდა ჩაიწეროს ისე, რომ მას შეუძლია მიიღოს შეყვანის თქვენგან მიერ დამატებით სიტყვით სწრაფი ადრე მომხმარებლის hits Enter. გამოდის, რომ გარკვეული დროის განმავლობაში ჩვენ ვაცხადებთ, რომ თითქმის ყველა ჩვენი პროგრამების დაიწყოს მოსწონს - int ძირითადი (void) - და შემდეგ ჩვენ წავიდა ადრე და წერა დაიწყო ჩვენი კოდი. ჩვენ შეიძლება გვაქვს მკვეთრი მოიცავს ზედა ფაილი, მაგრამ თითქმის ყველა ჩვენი პროგრამების დღემდე დაიწყეს ამ მიუხედავად იმისა, რომ თქვენ შეიძლება არ მინახავს ნაწილში, წიგნებში, ონლაინ მითითება რომ ეს არ რეალურად უნდა იყოს ბათილად. კიდევ ერთი ლეგიტიმური ფორმით ამ მიიღოს არის int argc და შემდეგ სიმებიანი argv []. ახლა რა არის ეს გულისხმობს? თურმე argc, რომელიც ადამიანის კონვენცია - თქვენ შეიძლება მოუწოდოს ამ foo, მაგრამ ეს მხოლოდ ბევრი ნაკლებად ნათელი მკითხველი - argc უბრალოდ არის არგუმენტი ფუნქცია მოუწოდა ძირითადი რომელიც წარმოადგენს რა? რას argc მხარს მათთვის, ნაცნობი? [Inaudible სტუდენტი საპასუხოდ] >> ჰო, რიგი არგუმენტები ან არგუმენტი რაოდენობა. ეს იმდენად მარტივია, რომ. რამდენი არგუმენტები გადაეცა ამ პროგრამის? რას ნიშნავს ეს? თუ ბრძანების სტრიქონში მე არ აწარმოებს რაღაც მსგავსი - clang mario.c-- argc როცა დააჭიროთ აპირებს მიიღოს ღირებულება, გარკვეულწილად confusingly, 2. გამოდის, რომ argc არის არგუმენტი რაოდენობა, მაგრამ ისტორიული მიზეზების გამო, პროგრამის დასახელება თავისთავად შედის, რომ რაოდენობა. ამიტომ argc არის 2 როდესაც დავწერე clang mario.c. რას argv შეიცავდეს? უპირველეს ყოვლისა, argv ჰგავს string მაგრამ არა საკმაოდ რადგან, როგორც ბოლო ოთხშაბათს და მით უფრო დღეს, ამ კვადრატულ ფრჩხილებში აღინიშნოს, თუ რა? სწორედ მასივი. იქ არ არის ნომერი მასივი, და რომ უნდა აზრი ინტუიციურად რადგან ხალხი, ვინც წერდა Clang წლის წინ ნამდვილად არ ჰქონდა იდეა რამდენი სიტყვა ადამიანს მოსწონს us იქნებოდა ტიპის სწრაფი ადრე hitting შეიყვანეთ. ასე რომ, ამ შემთხვევაში აქ მათ განაცხადეს ფუნქცია მთავარ როგორც აღების მასივი არგუმენტები, 0 ან მეტი არგუმენტი. მათ არ იციან, წინასწარ რამდენი არსებობს, ასე რომ განზრახ არ ხმების შიგნით ამ კვადრატულ ფრჩხილებში. მაგრამ ის ფაქტი, რომ კვადრატულ ფრჩხილებში არსებობს ვეუბნებით კომპიუტერის, ველით მასივი. Argv მხოლოდ სტენოგრამის ნოტაცია ამისთვის არგუმენტი ვექტორი. ვექტორი არის ლამაზი გზა ამბობდა მასივი, და წყობა ლამაზი გზა ამბობდა სიაში ან კოლექცია. ასე რომ, ეს მხოლოდ იმას ნიშნავს, რომ თუ წერთ მთავარ მოსწონს ნაცვლად, როგორიცაა, თუ როგორ ჩვენ ვაკეთებთ მას ბოლო რამდენიმე კვირის განმავლობაში, თქვენი პროგრამა უკვე ძალა მიიღოს ბრძანება ხაზი არგუმენტები ასე რომ აღარ გაქვთ დაწერა mario და შემდეგ დააჭიროთ, მაშინ აკრიფოთ ნომერი რამდენი ბლოკები მაღალი გსურთ პირამიდის იყოს, შემდეგ დააჭიროთ ერთხელ. ჩვენ კი არ უნდა გამოვიყენოთ GetString უქმნით ან GetInt ან GetFloat თუ საქმე. ჩვენ შეგვიძლია მხოლოდ ველოდოთ მომხმარებელს აკრიფოთ ეს სიტყვები ბრძანებათა ზოლზე თავად ისევე, როგორც ავტორები Clang გადაწყვიტა იქნებოდა მართლაც შემაშფოთებელი პროგრამა თუ კომპილაციის თქვენი კოდი პირველად აკრეფილი clang, დააჭიროთ, მაშინ ჩვენ განაცხადა, რომ მომხმარებელი, გთხოვთ აკრიფოთ სახელით ფაილი გსურთ კომპილაციის, მაშინ ჩვენ აკრიფოთ mario.c და დააჭიროთ. მაგრამ ეს ზუსტად ის, რაც ჩვენ ვაკეთებთ ჩვენი მომხმარებლებისთვის ბოლო რამდენიმე კვირის განმავლობაში. ჩვენ ვიყენებთ GetString და ჩვენ დაველოდოთ პროგრამა გაშვებულია უბიძგონ მათ შეყვანის. რომ აღარ უნდა იყოს საქმე. ასე რომ ამ მაგალითში, ჩვენ ახლა აქვს სიმებიანი argv, და ესეც oversimplification, სასწავლო თვლები რომ ძალიან მალე მოვა off. ეს არის უფრო სწორი გზა წერის ამ ალტერნატიული დეკლარაცია მთავარი რადგან გამოდის, რომ ის, რაც ჩვენ შევინარჩუნოთ მოუწოდებდა სიმებიანი რეალურად აქვს ვარსკვლავი, ვარსკვლავი, თავისი განმარტება, მაგრამ ეს მხოლოდ გამოიყურება რთული, ის დამაბნეველი პირველი, ამიტომ ჩვენ გამარტივება მხოლოდ შექმნის სინონიმი ჯიშები წელს CS50 ბიბლიოთეკა, რუკები char * ამ უფრო მოსახერხებელი სიტყვა string. მოდით რეალურად ცდილობენ ამ შემდეგ. ნება მომეცით წავიდეთ წინ და ქმნის gedit აქ. ნება მომეცით წავიდეთ წინ და გახსნა argv 1. ეს პროგრამა აშკარად ბეჭდავს არგუმენტები, მაგრამ ინგლისურ თვალსაზრისით, მიერ ეძებს ამ კოდექსით, რას გააკეთებს უფრო კონკრეტულად? თუ მე ტიპის ბრძანება a.out foo ბარი, რა ხდება დაბეჭდილი ჩემი შავი და თეთრი ფანჯარა? A.out foo ბარი, შეიყვანეთ. წავიდეთ წინ. Yeah. >> [Inaudible სტუდენტი საპასუხოდ] კარგი. ამიტომ a.out, ახალი ხაზი, foo, ახალი ხაზი, ბარი, ახალი ხაზი. რატომ არის ეს? ჩვენ შეგვიძლია, რა თქმა უნდა დაადასტუროს, უბრალოდ მომენტი. ეს არის სახის ფუმფულა ფისუნიაა ხაზი კოდი.  უბრალოდ ბეჭდავს ახალი ხაზი უბრალოდ რათა რამ გალამაზებაში ეკრანზე. ეს არის მარყუჟის რომ iterating საწყისი 0 on მდე argc, და ეს არის დამატება თითოეულ iteration + +. ასე რომ, ეს არის ამბობდა ბეჭდვა სიმებიანი, როგორც ითვალისწინებს ამ% s. Argv [i] ეს არის საკმაოდ ბევრი იგივე იდეას საწყისი წინა მაგალითი. ჩვენ მოვუწოდებთ ცვლადი s, ახლა კი მოუწოდა, თვითნებურად, argv. ეს ნიშნავს, ბეჭდვა შ არგუმენტი, რომ იყო აკრეფილი ბრძანებათა ზოლს, და შემდეგ ამ მთელი რამ კეთდება, მხოლოდ კარგი ღონისძიება ბეჭდვა სხვა ახალი ხაზი. ასე რომ ვნახოთ ამ. ნება მომეცით გახსენით ტერმინალი ფანჯარა. ნება მომეცით კომპილაციის argv 1, და ახლა ნება მომეცით აწარმოებს argv 1, შეიყვანეთ. Hmm. Okay. მოდით აწარმოებს foo ბარი. საინტერესო. Baz. და თუ თქვენ ოდესმე გვაინტერესებდა, რატომ აკრიფოთ ამ, ეს მხოლოდ ასევე სულელური კომპიუტერულ მეცნიერებათა კონვენციას. მსოფლიოს ხშირად სჭირდება მხოლოდ სიტყვიერი placeholders სიტყვებით. ასე რომ, თუ გსურთ ვისაუბროთ ზოგიერთ generic სიმებიანი, კომპიუტერის მეცნიერები უბრალოდ ტენდენცია ვთქვა foo როდესაც მათ სჭირდებათ შემთხვევითი სიტყვა, მაშინ ამბობენ ბარი თუ მათ სჭირდებათ მეორე შემთხვევითი სიტყვა, მაშინ ამბობენ baz თუ მათ სჭირდებათ მესამე სიტყვა, მაშინ ამბობენ qux თუ დასჭირდათ მეოთხე სიტყვას, და შემდეგ იქ უზარმაზარი რელიგიური დებატების ონლაინ, თუ რა უძღოდა qux, ასე რომ თქვენ შეგიძლიათ Google რომ გაერკვნენ, თუ რა სხვა უკანონო სიტყვა უნდა იყოს. მაგრამ ეს არ აქვს მნიშვნელობა განაწილებაზე, თუმცა foo ბარი, თუ Google რომ, რომ ამჯამად არ მნიშვნელობა აქვს, რომელიც ეტიმოლოგია აქ. ასე რომ ყველა ამ აკეთებს მაშინ არის ბეჭდვის 1 ამ სიმები თითო ხაზზე. ასე რომ, თუ მე ნაცვლად, თუმცა, უნდოდა კიდევ პატარა fancier, ვარაუდობენ, რომ მე არ მინდა, რომ ბეჭდვა თითოეული სტრიქონი თითო ხაზზე; მინდოდა ბეჭდვა თითოეული ხასიათი ყოველი სტრიქონი თითო ხაზზე. როგორ შეიძლებოდა მე ნაცვლად ასე? რა არის საჭირო, რომ შეცვალოს ამ პროგრამის შესახებ, თუ მინდა ბეჭდვა არ თითოეულ სიტყვას მაგრამ მინდა ბეჭდვა თითოეულ სიტყვას წერილი წერილი წერილი, მაშინ შემდეგი სიტყვა წერილი წერილი წერილი? როგორ უნდა დააკავშიროთ ამ იდეები დღემდე? Yeah. [სტუდენტი]% გ. >> ყველა უფლება. ამიტომ, ჩვენ გვჭირდება სადღაც% გ. კარგი, რადგან მე არ მინდა ბეჭდვა მთელი სტრიქონები, მინდა ბეჭდვა სიმბოლო. რა? [Inaudible სტუდენტი საპასუხოდ] >> საინტერესო. ამიტომ ჩვენ გვჭირდება სახის მეორე განზომილების აქ არის რადგან ვფიქრობ argv როგორც მასივი, მაგრამ მასივი სტრიქონები. მაგრამ, როგორც, მინდა, 15 წუთის წინ, რა სიმებიანი? ეს მასივი სიმბოლო. ასე რომ, რეალურად, argv არის მასივი მასივი გმირები, მასივი კოლექტორები პერსონაჟების. გამოდის, რომ ჩვენ შეგვიძლია გამოვიყენოთ მხოლოდ მეტი კვადრატული ფრჩხილი notations. ასე რომ მოდით ეს. ზედა ამ loop on line 19, მე ვაპირებ iterate საწყისი მე მდე argc, მაგრამ შემდეგ მე ვაპირებ ამის გაკეთება: ამისთვის - ვერ გამოიყენებს მე ახლა. მჭირდება კიდევ ერთი ცვლადი რადგან მინდა iterate მეტი სიტყვა მაგრამ შემდეგ ასევე მეტი შრიფტით სიტყვა ამიტომ ერთგვარი აქვს ვერტიკალური ღერძი და ჰორიზონტალური ღერძი, სახის კონცეპტუალურად. ასე int j იღებს 0, მაშინ მინდა გავაკეთოთ j რადგან კ ნაკლებია, ვიდრე - მე კი სუფთა ამ წელს bit. როგორ შემიძლია iterate მეტი შრიფტით სიმებიანი? ეს გავაკეთეთ მომენტში წინ. Strlen of argv [i]. კარგი. და ისევ, მე მიღების პატარა არაეფექტურობას აქ არ შექმნის n ან რასაც, მაგრამ ამას დაბრუნებას, რომ. ახლა კ + +. ახლა კი უნდა აბზაცის შემდგომი აქ. რა არის გვინდა ბეჭდვა თითოეულ iteration? [Inaudible სტუდენტი საპასუხოდ] >> So [i] მისცემს ჩემთვის სიტყვა. [I] [j], სახის, როგორიცაა მატრიცა. იმ თქვენ ერთად მათემატიკის-Y ფონზე, ჩვენ ერთგვარი ინდექსირებას კი სიღრმეში ამ მატრიცული ან ამ მასივი მასივები, ამ 2 განზომილებიანი სტრუქტურა. ახლა ვნახოთ რა ხდება აქ. ნება მომეცით გახსენით ჩემი უფრო დიდი ტერმინალი ფანჯარა. ნება მომეცით გამეორება მიიღოს of argv 1. და მე ბრალია აქ, რომელიც კარგი გაკვეთილი რადგან მე ძალიან დაავიწყდა ამის გაკეთება. მინიშნებით გამოცხადების C ბიბლიოთეკის ფუნქცია 'strlen ერთად ტიპის "ხელმოუწერელი - ისიც კი არ ვიცით, რა დანარჩენი რომ საშუალებებით, მაგრამ მე არ მინახავს ეს ადრე, მინიშნებით გამოცხადების. როდესაც ჩვენ ვხედავთ ამ შეცდომა, რას ჩვეულებრივ ნიშნავდეს? [Inaudible სტუდენტი საპასუხოდ] >> დამავიწყდა ბიბლიოთეკა up დაბრუნება. მაგრამ დაველოდოთ წუთში. ჩვეულებრივ მე ბრალია, რადგან დამავიწყდა CS50 ბიბლიოთეკა, მაგრამ ეს იქ. ჩვეულებრივ მე ბრალია, რადგან მე დავიწყებული სტანდარტი I / O. და გულწრფელად ვამბობ, კი არ გვჭირდება. ჩვენ არ იყენებს GetString დღეს. მერე რა მე ვერ გავიგე? არსებობს კიდევ ერთი ბიბლიოთეკა, რომ ახლა ჩვენ უნდა გამოვიყენოთ ზოგჯერ მოუწოდა string.h, და ეს მხოლოდ კიდევ ერთი ბიბლიოთეკა, რომელსაც აქვს მეტი ფუნქციები, რომლებიც არ არიან პირობით I / O. მოდით დავუბრუნდეთ ჩემი დიდი ტერმინალის ფანჯარაში. Okay. ახლა, Damn it, ვფიქრობ მე ვიყავი არასწორი. მე გამოყენებით CS50 ბიბლიოთეკაში. ასე რომ ჩვენ შეგვიძლია დაფიქსირება ამ წელს არც 2 გზა. ჩვენ შეუძლია მიიღოს სასწავლო თვლები off ახლავე და მხოლოდ ამის გაკეთება, ან მოდით სახის შენარჩუნება, რომ გამარტივების მხოლოდ ახლა, ჩასვით ეს უკან, ამ პრობლემის გადაწყვეტა, ახლა დავუბრუნდეთ ტერმინალის ფანჯარაში. ასე უნდა იყოს მკაფიო, წელს CS50 ბიბლიოთეკა არ არის მხოლოდ ფუნქციების ასევე სიტყვით ტექსტი, რის გამოც, რომ შეცდომა მხოლოდ მოხდა. ასე რომ აქ ჩვენ მივდივართ. მე დაფიქსირდა ორივე ბიბლიოთეკა საკითხები. შეიყვანეთ. კარგი. Argv 1, foo ბარი, შეიყვანეთ. შესანიშნავი. ახლა ჩვენ გვაქვს ყოველ წერილში თითოეულ სიტყვას დაბეჭდილი 1 პოსტი ხაზი, რომელიც არ შეეხება ძალიან საინტერესო პროგრამა, მაგრამ გაფრთხილების ახლა გვაქვს შესაძლებლობა არა მხოლოდ iterating მეტი სიტყვა არამედ მეტი ინდივიდუალური შრიფტით სიტყვა, რომელიც ჟღერს awfully ნაცნობი კი მარტივი განაცხადების მოსწონს scrambling შრიფტით სიმებიანი მოსწონს ეს. მოდით წავიდეთ წინ და მიიღოს ჩვენი 5 წუთიანი შესვენება აქ. და როდესაც ჩვენ დავბრუნდებით, ჩვენ დავიწყებთ საუბარს ეფექტურობის რომელთანაც ჩვენ შეგვიძლია გავაკეთოთ ეს ყველაფერი უკეთესი. ყველა უფლება. ჩვენ უკან. მადლობა ერთი ჩვენი TFs რომელიც უკრავს ბევრი bananagrams, ჩვენ რეალურად მთელი bunch of chars ჩვენთან დღეს აქ ფიზიკურად incarnated ამ პატარა პლასტმასის ცალი, და ნება მომეცით შესთავაზოს, რომ ეს ცარიელი თეთრი ფურცლიდან აქ წარმოადგენს RAM ჩემი კომპიუტერი - ლეპტოპი, desktop, რასაც - და იქ ჰგავს ბევრი ეს რადგან თუ ჩვენ ვიწყებთ chopping ამ RAM შევიდა მცირე byte ზომის ნაჭრებად, მოდით თვითნებურად ამბობენ, რომ რაღაც რომ ზომა და რომ blurry წარმოადგენს - იქ წასვლა, და მოდით დააშორებს ცოტა აქ - ვთქვათ, რომ რაღაც ზომით წარმოადგენს ერთი ბაიტი. ასე რომ ჩვენ შეგვიძლია ნამდვილად ჯდება მთელი bunch of bytes ან სიმბოლოების შიგნით ამ მეხსიერების, როგორც მიერ შემოთავაზებული ნათესავი ზომა აქ. ამიტომ ვარაუდობენ, რომ მიზანია გამოყოს მეხსიერების სიმებიანი. როგორ ამჯამად ამ რეალურად მუშაობს? In პროგრამების ჩვენ წერის, ჩვენ ჩვეულებრივ იყენებს GetString, მაგრამ ახლა, აშკარად, არსებობს ამ სხვა არხის მეშვეობით, რომელიც ჩვენ შეიძლება მიიღოს მომხმარებლის შეყვანის წელს argv მეშვეობით ბრძანებათა სტრიქონიდან არგუმენტები. მაგრამ რა მართლაც მიმდინარეობს ქვეშ hood? თურმე, თუ ჩვენ მოვუწოდებთ - მოდით გადახვევა თავში GetString - ფუნქციის GetString წელს CS50 ბიბლიოთეკა, მომხმარებელს მოთხოვნილია სიმებიანი, მომხმარებლის ტიპის ზოგიერთ სიტყვას - მოდით ეძახით Hello. და ჩვენ ვამბობდით, უკანასკნელი რამდენიმე კვირის რომ დაბრუნების ღირებულება GetString ფაქტიურად სიმებიანი, როგორიცაა სიტყვა Hello. მაგრამ რა არის GetString მართლაც აკეთებს? როგორც მომხმარებლის ტიპების Hello, მიუთითოთ, GetString არის მჭიდროდაა out, okay, რამდენი გმირები არის ეს? ეს არის H-E-L-L-O. ამიტომ მას სჭირდება გამოყოფს, მას სჭირდება ვთხოვო ოპერაციული სისტემის - Linux ამ შემთხვევაში - მინიმუმ 5 ბაიტი შესანახად Hello. და რა მერე აგრძელებს გავაკეთოთ ერთხელ იგი იღებს უკან იმ 5 ბაიტი საწყისი ოპერაციული სისტემა არის ჩაუყარა გარეთ HELLO თავში დაბრუნება თავში დაბრუნება. და მერე რა მართლაც დაბრუნდა GetString არის ბლოკი მონაცემები, რომ ასე გამოიყურება. მაგრამ ეს ცოტა არაზუსტი რადგან აღმოჩნდება, რომ ეს არც ისე მარტივი როგორც მხოლოდ შენახვის HELLO წელს კომპიუტერის მეხსიერების რადგან მიაჩნიათ, რომ ჩემი პროგრამა, რომელიც მე წერა C მაშინ მოუწოდებს GetString ერთხელ, და შემდეგი სიტყვა მომხმარებლის ტიპების არის bye, bye. ისე, მე უნდა მოერგოს, რომ სიტყვა Bye სადღაც მეხსიერებაში. მე ვერ clobber Hello. მაგალითად, მე არ მინდა კომპიუტერს დავიწყო overwriting მოსწონს ორიგინალური სიტყვა, რადგან მე შეიძლება კვლავ გამოყენებით სიტყვა HELLO წელს ცვლადი სხვაგან ჩემი პროგრამა. ასე რომ B-Y-E აქვს მოხვდნენ სხვაგან მეხსიერებაში. მაგრამ კონვენციის ჩვეულებრივ ის არის, რომ შემდეგი სიმებიანი თქვენ გამოყოფს ალბათ, მაგრამ არა ყოველთვის, აპირებს დასრულდება მდე მომდევნო შესაძლებელი მეხსიერების საიდან. და თუ მე არ ვთხოვე ოპერაციული სისტემა ნებისმიერი მეხსიერების რადგან ბოლო დროს დავურეკე GetString, შანსი სიტყვა Bye აპირებს დასრულდება მდე შემდეგ სიტყვა HELLO მეხსიერებაში. მაგრამ ამ ეტაპზე შეგიძლიათ ალბათ ვნახოთ, სად პოტენციური პრობლემა ჩნდება. იმის გამო, რომ შემდეგი მოცულობით მეხსიერება, შემდეგი ბაიტი რომ იყო თავისუფალი - სუფთა თეთრი ფურცლიდან - ში კომპიუტერის მეხსიერების იყო სწორი შემდეგ Hello, ეს იგრძნობა პირველი სიმებიანი მოვითხოვე შესაძლოა მოულოდნელად ახლა შეცვლის რადგან მე არსებითად შეიცვალა მას HELLOBYE ნაცვლად რატომღაც demarcing დაწყების Bye და ბოლოს Hello. გამოდის, რომ ის, რაც მართლაც ხდება ქვეშ hood, რომელიც ალბათ glimpsed ონლაინ ცნობას ან სექცია ან წიგნები ან საერთოდ არ გაუკეთებია მხოლოდ ის არის, რომ არსებობს რეალურად მიზანმიმართული დემარკაციის შორის სიტყვების კომპიუტერის მეხსიერებაში. ფაქტია, ამ შემთხვევაში აქ, ვიდრე უბრალოდ დააყენა Bye უფლება მომდევნო Hello, ნაცვლად, კომპიუტერულ აყენებს სპეციალური ხასიათის, სპეციალური null ხასიათი, ასე ვთქვათ, რომელიც წარმოდგენილი მარკერის ერთად backslash 0. ცოტა ხნის ამბავი მოკლედ, გავიხსენოთ, რომ გმირები არიან წარმოდგენილი ASCII. ASCII მხოლოდ რუკების შორის ციფრები და ასოები, და ყველაზე მეტად იმ წერილებს დაიწყოს უხეშად 65 კაპიტალური, მაგრამ აღმოჩნდება, შეგიძლიათ ნამდვილად წარმოადგენს რაოდენობა 0 როგორც მთელი რიცხვი ან ორობითი, და თურმე მსოფლიოს გადაწყვიტა ხანგრძლივი, დიდი ხნის წინ, "თქვენ იცით, რა ხდება?" "მოდით სარეზერვო ნომერი 0 როგორც არ წარმოადგენს რაიმე გმირები კლავიატურა - "არ წერილებს, არ ნომრები, არ პუნქტუაციის. 0 არის განსაკუთრებული." "ეს იქნება განსაკუთრებული null ხასიათი, და ჩვენ ვაპირებთ დავწეროთ, როგორც \ 0." განსხვავებით, თუ ჩვენ უბრალოდ დაწერა 0, 0 არის ხასიათი. შეგახსენებთ, რომ არსებობს ASCII კოდები 0, 1, 2, ამისთვის 3 რადგან ხასიათი 0 განსხვავდება ნომერი 0. და თქვენ ხედავთ, რომ თუკი უკან კვირა 1 როდესაც ჩვენ პირველად ისაუბრა ASCII, 0 და 1 და 2 და 3 ყველა გზა მდე 9 ჰქონდა საკუთარი ASCII კოდები. ისინი არ არიან ერთსა, 0 მეშვეობით 9. ისინი ძალიან განსხვავებული. ასე 0 უბრალოდ ნიშნავს "მე ვარ განსაკუთრებული," და \ 0 საშუალებებით, სიტყვასიტყვით, "მე არ ვარ 0 ხასიათი." "მე ამ სპეციალური ღირებულება, null ხასიათი." ასე რომ რეალურად სჭირდება კიდევ ერთი ამ წლიდან არ შემიძლია იგივე შეცდომას ორჯერ. ასე შემდეგ სიტყვა Bye ჩვენ ასევე ვაპირებთ გვჭირდება კიდევ ერთი ამ null სიმბოლო. ნება მიბოძეთ აითვისებდა ჩემი კალამი აქ და ნება მომეცით სწრაფად დახაზეთ მეორე \ 0 ისე, რომ შემდეგ მე ვთხოვე ოპერაციული სისტემის 2 სტრიქონები მეშვეობით GetString მოჰყვა მეორე ზარი GetString, ეს არის ის, რაც სინამდვილეში მეხსიერებაში. ასე რომ, როდესაც არ დავიბრუნებ სიმებიანი, მე ნამდვილად მისაღებად უკან რომ, და როდესაც მივიღებ შემდეგი სიმებიანი, მე ნამდვილად მისაღებად უკან რომ. ასე რომ, ეს სთხოვს კითხვა, strlen, პირველ რიგში, რა უნდა დაბრუნდეს? როდესაც მოვუწოდებ strlen on სიმებიანი და s იყო სიტყვა HELLO, რომ მომხმარებლის აკრეფილი, რა მივიღეთ აშკარად ამბობენ სიგრძეზე HELLO იყო რამდენიმე წუთის წინ? ეს იყო 5, არა? H-E-L-L-O. და ეს მართლაც როგორ strlen სამუშაოები. ის დააბრუნებს რა ჩვეულებრივი ადამიანი მოელოდა სიგრძეზე სიმებიანი იყოს. მაგრამ სინამდვილეში, რამდენად დიდი არის მასივი გმირები რომ შენახვის მიესალმები? ეს რეალურად 6. ამიტომ strlen არ არის ნახსენები, რომ ფაქტი თქვენ. მაგრამ ქვეშ hood კომპიუტერი მართლაც გამოყენებით 6 bytes შესანახად 5-წერილში სიტყვას, და ეს მართლაც ასეა რაც არ უნდა ხანგრძლივი სიტყვა არის. აქ ყოველთვის იქნება სპეციალური null შეწყვეტის ხასიათი დასასრულს სიმებიანი to demarc მისი საერთო სიგრძით. ასე რომ თუ თქვენ ახლა პირი ახორციელებს strlen 20, 30 წლის წინ, როგორ დადიხართ შესახებ ახორციელებს strlen თავად? ჩვენ თავისთავად, რომ ის არსებობს, ისევე, როგორც ჩვენ, თავისთავად, რომ printf არსებობს, მაგრამ თუ HELLO არის სიტყვის კითხვა და რა მაქვს მეხსიერებაში არის ის, რასაც ასე გამოიყურება, თუ მოუხდა reimplement strlen რადგან თქვენ სთხოვდნენ ან იმიტომ, გულწრფელად, თქვენ არ იცოდა strlen არსებობდა - გქონდათ აქვს გააფართოვოს ამ ერთი საკუთარ - როგორ შეგეძლოთ განახორციელოს strlen როდესაც მოცემული რაღაც რომ ასე გამოიყურება? ახლა, როდესაც ჩვენ ვიცით, string არის მასივი, ჩვენ შეგვიძლია iterate აღემატება თითოეული ინდივიდუალური გმირები გამოყენებით რაღაც - ყველამ ერთად ცდილობენ ამის გაკეთება on the fly. ნება მომეცით წასვლას ელექტრო მოწყობილობების. ნება მომეცით შექმნა ახალი ფაილის, strlen.c. ნება მომეცით წავიდეთ წინ არის და არ შედის stdio.h ისე, რომ ჩვენ გვაქვს წვდომა printf. ნება მომეცით გავაკეთოთ int ძირითადი (void). Oh. მე უბრალოდ ამ ჩემს ახლა მაშინ. [Chuckles] დიდი მადლობა. ეს არის ის რასაც მე ვაკეთებ. ყველა უფლება. ასე რომ სანამ აღმოჩნდა ეკრანზე, მე აკრეფილი ყველა რომ. და ახლა რა მე ვაპირებ გააკეთოთ შემდეგი: printf ("მომეცი string:") ეს მხოლოდ ფუმფულა ფისუნიაა მითითებებს. ახლა ნება მომეცით გავაკეთოთ string s = GetString. მე უკვე მოგიწევთ ენის არის. მე გამოყენებით CS50 ბიბლიოთეკა მოულოდნელად, ნება მომეცით, წავიდეთ წინ და აკრიფოთ cs50.h. და ახლა მოდით ეს: printf ("სიგრძე:% d, strlen [s] - და მე არ გაკეთდეს არავის გაუკეთებია. კიდევ რა უნდა დაამატოთ ამ პროგრამაში? [სტუდენტი] string.h. >> String.h. ასე რომ ახლა, ჩვენ გამოყენებით strlen, მოდით დარწმუნდით შემდგენელი იცის სად არის, რომ, ასე ცოტა საღი აზრის შეამოწმოს. მე მიღების სიმებიანი სტრიქონში 8, ხოლო ხაზის 9 მე დაბეჭდვისას მისი სიგრძე ერთად% d. მოდით წავიდეთ წინ და გახსნა ამ მდე. ჩვენ მიიღოს strlen - ადგენს okay - strlen - ნება მომეცით დიდი ზომით - შეიტანეთ, H-E-L-L-O, შეიყვანეთ. სიგრძე არის 5. Okay, ასე strlen ჩანს მუშაობა, მაგრამ მსოფლიოს იცოდა, რომ. მოდით ახლა განხორციელება strlen საკუთარ თავს შემდეგნაირად. ნება მომეცით მიიღოს ამ ბიბლიოთეკის დაშორებით. ჩვენ უკვე აღარ გვაქვს ხელმისაწვდომობის string.h რადგან მე კი არ ვიცი, არსებობდა. მაგრამ ეს okay, რადგან მე შემიძლია განახორციელოს strlen თავს და აქვს მას მიიღოს სიმებიანი მოუწოდა შეყვანის, და ახლა მე უნდა გაერკვნენ, სიგრძით ეს კონტექსტი. მაშ როგორ შემიძლია ამის გაკეთება? რა, თუ - ვნახოთ, თუ როგორ უნდა გააკეთოს ამ - რა გსურთ? [Inaudible სტუდენტი საპასუხოდ] >> Okay. ასე რომ ჩვენ შეგვიძლია გავაკეთოთ ეს bunch of გზები. ნება მომეცით ცდილობენ მიიღონ ეს მიდგომა. ნება მომეცით მისცეს თავს int ცვლადი მე ვარ, ამიტომ იწყება 0. და მინდა ვთქვა ეს: ხოლო input [i] არ არის ტოლი, თუ რა? \ 0. გამოდის,, როგორც შემთხვევაში ყველა სიმბოლო როდესაც წერილობით მათ სიტყვასიტყვით წელს პროგრამა, თქვენ უნდა გამოიყენოთ ერთჯერადი შეთავაზებები, არ ორმაგი შეთავაზებები. ასე რომ, თუ მე წერდნენ წერილს, მე ყველაფერს გააკეთებს, რომ წერილში ბ, მინდა, რომ. ეს, პირიქით, იქნება ტექსტი, არ ინდივიდუალური ხასიათი. ამიტომ მინდა \ 0 სიტყვასიტყვით. რა გსურთ ამ loop? სინამდვილეში, მე უნდა სხვა ცვლადი, ასე int სიგრძე იღებს 0. მაშინაც კი, თუ თქვენ არ იყვნენ დარწმუნებული, რატომ დავიწყეთ გზა გავაკეთეთ, ახლა, რომ ჩვენ ვაპირებთ ქვემოთ ამ გზაზე, რა გსურთ on line 9? სიგრძე + + და მერე ქვევით აქ on line 10, დაბრუნების სიგრძე. მაშ როგორ არის strlen განხორციელდა? სინამდვილეში განხორციელებული ალბათ მოსწონს ეს. იქნებ პირი გამოიყენება ამისთვის მარყუჟის, იქნებ გავაკეთოთ ხოლო loop - ვინ იცის? მე მინდა ნამდვილად უნდა გამოიყურებოდეს ქვეშ hood at ფაქტობრივი კოდის ზოგიერთ ფაილი სახელად string.c ალბათ. მაგრამ აქ მოდით ვიფიქროთ, რა ვარ აკეთებს. მე გამოცხადების ცვლადში მე, განსაზღვრავს ის ტოლია 0. მე მაშინ გამოცხადების მეორე ცვლადში სიგრძე, განსაზღვრავს ის ტოლია 0. მაშინ მე ვამბობ, ხოლო შ პერსონაჟი შეყვანის არ არის ტოლი სპეციალური null ხასიათი, \ 0, ნამატი სიგრძე. მაგრამ როგორც კი შ ხასიათი არის ამ სპეციალური ხასიათი, თუ რა ხდება მარყუჟის? ეს მოკლე სქემები. იგი აჩერებს, რაც იმას ნიშნავს, რომ ჩვენ მაშინ მყისიერად დაბრუნდეს სიგრძე. ასე რომ თუ არ სასადილო up, მოდით წავიდეთ წინ და დავუბრუნდეთ ჩემი ტერმინალის ფანჯარაში. ნება მომეცით recompile. და მე Screw up. შეუთავსებელი redeclaration ბიბლიოთეკის ფუნქცია strlen. ასე რომ ცდილობდა ძალიან ჭკვიანი, ჩემი საკუთარი კარგი აქ. შემდგენელი რეალურად იცის, რომ არსებობს ფუნქცია მოუწოდა strlen მიუხედავად იმისა, რომ ჩვენ არ შედის ბიბლიოთეკაში. სწორედ ჯარიმა. როგორიც არ უნდა იყოს. ჩვენ უბრალოდ აპირებს ითანამშრომლოს შემდეგ. მოდით გადარქმევა ამ სიგრძე. ნება მომეცით შეცვლის გამოყენება მას სიგრძე აქ, და ამ გახდის Clang ბედნიერნი. როგორც განზე, რადგან ამ ფუნქციების იმდენად darn საერთო - strlen, prinf - სინამდვილეში გააჩნიათ სახის განსაკუთრებული სტატუსი. და ასე Clang უბრალოდ იცის პატარა რაღაც განსაკუთრებული მათ შესახებ. ეს არ არის ყოველთვის შემთხვევაში უმეტესი ფუნქციები, ასე ამიტომაც მივიღეთ yelled დროს. ნება მომეცით კიდევ ცადოთ. საბედნიეროდ, ეს მუშაობდა იმ დროს. ახლა ნება მომეცით აწარმოებს საკუთარი strlen პროგრამა. მომეცი string: H-E-L-L-O, შეიყვანეთ. და მე ბრალია. რატომ? >> [Inaudible სტუდენტი საპასუხოდ] >> ზუსტად. ამიტომ მე თავს აქ ძალიან ლამაზი ორიენტირებული უსასრულო loop რადგან მიუხედავად იმისა, რომ მე დამატება სიგრძე თითოეულ iteration, რა ვარ მე ნამდვილად არ აკეთებს? მე არ დამატება i. Okay. Easy სარემონტო. დიახ? Okay. პოსტები ახლა ჩვენ მიიღებს afoul ზოგიერთი სხვა ჩვეულებრივი შეცდომა, სადაც მე უნდა ფრჩხილებში. და გულწრფელად, ამ კოდექსით იწყება თვალი მახინჯი, ამიტომ ჩვენ მიიღოს stab at დასუფთავების ამ წელს მომენტში. მაგრამ ახლა მე დამატება ორივე სიგრძის და მე. გულწრფელად ვამბობ, უკვე შესაძლებლობა გაუმჯობესებას, მაგრამ ჩვენ დავბრუნდებით, რომ. ახლა მოდით უბრალოდ დარწმუნდით ჩვენ მინიმუმ მიღების პროგრესი. ეს მოხდა რამდენიმე თქვენგანს, და მე უგულვებელყოფილია აღვნიშნო ამ წინასწარ. როდესაც თქვენ ჩვენგან აქვს უბედურება of სცენარი მოსწონს, როგორ დაფიქსირება ამ მოკლე გადატვირთვით ელექტრო მოწყობილობების ან თქვენი კომპიუტერის ან დახურვის ფანჯარა? ეს რეალურად ადვილი. კონტროლის C გამოგიგზავნით ამ პატარა სტაფილოს სიმბოლო C, და რომ უბრალოდ წყვეტს საუკეთესო პროგრამები. თუ თქვენ გაქვთ მართლაც ცუდი უსასრულო loop რომ დაბეჭდვის პერსონალის უსასრულოდ ბევრჯერ, ზოგჯერ თქვენ შეიძლება უნდა დაარტყა კონტროლის C ათასი ჯერ, რათა ის რეალურად მოვისმინოთ იგი. ასე რომ მხოლოდ გააცნობიეროს, რადგან მე არ დაბეჭდვის არაფერი, რომ საკმაოდ მარტივია. და ტექნიკურად, ერთხელ suffices, მაგრამ მე კიდევ მოუთმენელი და მე, როგორც წესი, მოხვდა ის, რომ ბევრჯერ. ამიტომ strlen. მომეცი string: Hello. ხომ იმუშავებს ამ დროს? Okay. კიდევ ერთი ჩვეულებრივი შეცდომა. უნდა recompile. ეს იყო მიზანმიმართული, რომ ერთი. ყველა უფლება. ამიტომ strlen, H-E-L-L-O, შეიყვანეთ. შესანიშნავი. ამიტომ, ჩვენ ახლა აქვს strlen დან 5. ამიტომ ჩვენ სიტყვასიტყვით reimplemented რომ საჭე. ახლა მოდით გაწმენდა ამ up რადგან ეს არ მე შთაბეჭდილება მოახდინა ერთად დიზაინი ჩემი კოდი. რა შეგვიძლია ნათლად აღმოფხვრა ამ პროგრამის გაწმენდა ამ up? [Inaudible სტუდენტი საპასუხოდ] >> Yeah. სიტყვასიტყვით, ჩვენ მკურნალობის I და სიგრძე იდენტურად. მაშ რატომ არ გვაქვს უბრალოდ ჭკვიანი და ამბობენ, ხოლო სიგრძე? პირიქით, მოდით უბრალოდ ეძახით სიგრძე დავიწყოთ, ინიციალიზაცია მას 0 რადგან სტანდარტულად სიმებიანი ვიზიტორების სიგრძე სანამ ჩვენ გაერკვნენ რა არის. ახლა ჩვენ ამის გაკეთება, და ახლა ეს საკმაოდ ელეგანტური პროგრამა. ერთი ცვლადი. მე გაწმენდილი it up, გამკაცრდა it up. ახლა მოდით დავუბრუნდეთ ჩემი ტერმინალის ფანჯარაში. მოდით წავიდეთ წინ და აწარმოებს ამ. ჩადება strlen. გამოიყურება კარგი. Run strlen ერთხელ, შეიყვანეთ. მომეცი string: Hello, შეიყვანეთ. და აშკარად ჩანს, რომ მუშაობს 5. ახლა, უნდა იყოს ნათელი, თუ არ მქონდა დაწერილი, მაგალითად, HELLO წელს 1 სიმებიანი და შემდეგ Bye სხვა, ჩვენ შეგვიძლია ნამდვილად აქვს მრავალი სიტყვა. თუ გამოხატვის მე რეალურად სურდა აკრიფოთ არ იყო HELLO მაგრამ, მაგალითად, Hello World შეამჩნევთ, რომ რასაც ჩვენ არ არის ამ სიტუაციაში აქ, არა? რომ თვლიან, რომ სწორედ 2 სიმები. თქვენ რა თქმა უნდა, შეიძლება ჰქონდეს სივრცეში ბარი გმირები ასე რომ, თუ ჩვენ რეალურად აკრეფილი აღარ ფრაზა მოსწონს Hello World, რასაც ჩვენ ნამდვილად გვაქვს მეხსიერებაში გამოიყურება პატარა რაღაც რომ არსებობს. ყველა უფლება. ნებისმიერი კითხვები მაშინ დაახლოებით წარმომადგენლობა აქ სტრიქონები? არარის? ყველა უფლება. ასე, რომ ცოტა ხნის წინ განაცხადა, რომ მოუწოდებდა strlen ისევ და ისევ განზრახ მოსწონს, რომ ალბათ არ არის საუკეთესო იდეა, რადგან თქვენ უნდა აკეთებს მთელი ბევრი სამუშაოა ისევ და ისევ და ისევ. მართლაც, რა სახის სამუშაო აუცილებელია მჭიდროდაა გარეთ სიგრძეზე სიმებიანი, როგორც ჩანს? თქვენ უნდა დაიწყოს დასაწყისში და შემდეგ შეხედეთ, შეხედეთ, შეხედეთ, შეხედეთ, შეხედეთ სანამ თქვენ საბოლოოდ ვხედავთ, რომ სპეციალური ხასიათის, სადაც წერტილი, ah, ახლა მე ვიცი, სიგრძე. ასე რომ ადრე როცა strlen მიმდინარეობს მოუწოდა ისევ და ისევ და ისევ, მიზეზი მე შევთავაზე, რომ იყო სახის სულელური არის, რადგან ერთხელ, რომ სიმებიანი ჰგავს, რომ. ეს არ შეიცვლება ყველა დროის iterate მეშვეობით მარყუჟის, ასე რომ თქვენ ვაკეთებთ ზედმეტი მუშაობა. ამავე დროს, თქვენ უნდა იცოდეს, როგორც განზე, რომ Compilers მოსწონს Clang ამ დღეებში შემუშავდა, ისინი წლების მანძილზე, შემდგენელი და მწერლები, პროგრამისტები, საკმაოდ ჭკვიანი. და გამოდის, რომ Clang და სხვა compilers შეუძლიათ გაერკვნენ რომ, okay, დიახ, წერდა strlen თქვენს მდგომარეობა, რაც ტექნიკურად ნიშნავს, რომ ჩვენ მოვუწოდებთ ისევ და ისევ და ისევ. მაგრამ ჭკვიანი compilers შეიძლება რეალურად ოპტიმიზაცია იმ სახის ცუდი მომხმარებლის გადაწყვეტილებები თქვენი კოდი, რომ შეცვალოს სიტუაცია რამ. ასე რომ მხოლოდ გააცნობიეროს, რომ ზოგჯერ შემდგენელი არის სასურველი სტუმარი გახდებით ვიდრე ჩვენ და იქნება სახის დამალვა ჩვენი საკუთარი შეცდომები. მაგრამ, რა თქმა უნდა, როდესაც საქმე პრობლემა კომპლექტი და მოსწონს, არ უნდა ფიქრი იმ ფუნდამენტურად არასწორი დიზაინის გადაწყვეტილებები პოტენციურად შეეხება უბრალო მიზეზის გამო, რომ ჩვენ მინდა იყოს აკეთებს გზა უფრო მეტი მუშაობა ვიდრე ჩვენ რეალურად უნდა გავაკეთოთ. თუმცა, რამდენად უფრო მეტი მუშაობა? იმ შემთხვევაში, Hello World, მოდით დავიწყოთ განზოგადება ზომა ამ პრობლემის. რა არის სიგრძეზე პრობლემა ან ზომის პრობლემა როდესაც სიტყვას მომხმარებლის აკრეფილი არის პირველი? ეს აშკარად 5, შესაძლოა 6. Plus ან მინუსის 1. როგორიც არ უნდა იყოს. ასე ახლოს ჩვენ უბრალოდ ვუწოდებთ მას 5. ასე რომ რა ზომის პრობლემა აქ, როდესაც ცდილობს გაერკვნენ სიგრძეზე მიესალმები? ეს 1, 2, 3, 4, 5, და შესაძლოა 6 უკანასკნელი ხასიათი, მაგრამ მოდით განზოგადება, რომ როგორც n. ამიტომ N, უბრალოდ ცვლადი N, არის ის, რაც კომპიუტერის მეცნიერები რომ ჩვეულებრივ გამოყენება აღწერისთვის ზომის პრობლემა და პრობლემა ხელთ არის, რამდენი ხანი არის პირველი? რამდენ ხანში strlen მიიღოს? იგი იღებს ბრძანებით N ნაბიჯები, სადაც ყოველი ნაბიჯი ნიშნავს შევხედოთ ხასიათი, შეხედეთ ხასიათი, შევხედოთ ხასიათი. ჩვენ გვქონდა ამ დისკუსიის ხოლო უკან, რაოდენობის ოპერაციების რაღაც იღებს. პირველივე დღიდან კლასის გვქონდა ყველას უხერხულად აღუდგეს, და მაშინ ყველას დაიწყო pairing off ერთმანეთს რათა რეალურად ითვლიან იდეალურად რამდენი ადამიანი იყო ოთახში. ჩვენ ასევე გააკეთა კიდევ ერთი რამ რის, თუ ნაცვლად ეს ძველი სკოლის გზა მხოლოდ დაწყებული 1, 2, 3, 4, 5, 6 და ა.შ., რომ ძალიან, ზომა, რომ პრობლემა იყო ზომა n. იყო N ადამიანი ოთახში. მაგრამ მე ვერ დაჩქარდეს, რომ, არა? Grade სკოლის სტილის შემეძლო დაიწყება დათვლის წელს 2S. 2, 4, 6, 8, 10, 12. და რომ გრძნობს იმდენად სწრაფად და ეს ნამდვილად. ეს სიტყვასიტყვით ორჯერ სწრაფად, მაგრამ კვლავ, თუ კიდევ 400 ადამიანი დადიოდა შევიდა ამ ოთახში ერთდროულად, იმ ალგორითმები დასჭირდება კიდევ 400 ან იქნებ 200 ნაბიჯები. მაგრამ ამის საპირისპიროდ, თუ ჩვენ მართლაც Get Smart და ჩვენ ნაცვლად აქვს ყველა თქვენგანს ითვლიან თქუენგან, გავიხსენოთ, თუ როგორ, რომ ალგორითმი მუშაობდა. თქვენ ყველა წამოდგა. ნება მომეცით სწრაფად ველით ამ. თქვენ ყველა წამოდგა, თქვენ შეწყვილებულ off, მაშინ ნახევარი თქვენ დაჯდა, ნახევარი თქვენ დაჯდა, ნახევარი თქვენ დაჯდა, და თითოეულ iteration ამ loop საწყისი კვირაში 0, ჩვენ განახევრდა პრობლემის მხრივ და წავიდა N / 2, მაშინ n / 4, მაშინ N / 8. და გავლენა, რომ ის არის, რომ თუ კიდევ 400 ადამიანი ფეხით ოთახში, არ დიდი გარიგება, დასჭირდება us 1 მეტი რაუნდი, არ 400 მეტი რაუნდები, არ 200 მეტი რაუნდები. და ასე ამბავი ვუთხარით ხოლო უკან უნდა გაეკეთებინათ ცოტა რაღაც ამ. ეს წითელი ხაზი აქ არის წრფივი, ეს სწორი და ეს შეაფასა, როგორც N რადგან როგორც ზომის პრობლემა იზრდება, თუ თქვენი ალგორითმი ან პროგრამა რომელიც თქვენ გადაჭრის სჭირდება N ნაბიჯები, ჩვენ შეგვიძლია ნაკვეთი, როგორც სწორი ხაზი, სადაც იგი იღებს უფრო მეტი დრო უფრო დიდი ზომის პრობლემა. და twosies მიდგომა, დათვლა 2, 4, 6, 8, მაინც სწორი ხაზი, უბრალოდ ცოტა უკეთესი. იგი იღებს პატარა ნაკლები დრო, ამიტომ ყვითელი ხაზი ქვემოთ წითელი ხაზი წერტილი წერტილი. მაგრამ კიდევ უფრო უკეთესი იყო ამ წმინდა გრაალი რასაც ჩვენ მოუწოდა ლოგარითმული დრო აქ კი, თუ ისევ ჩვენ რაოდენობის გაორმაგება ადამიანი ოთახი, ჩვენ ორჯერ ზომა, რომ ტელეფონის წიგნი პირველ დღეს კლასის, არ დიდი გარიგება, სჭირდება 1 მეტი გვერდზე ცრემლსადენი, იღებს 1 მეტი სხდომაზე ქვემოთ გადაჭრის მიზნით პრობლემა რომ ორჯერ დიდი. და ასე საუბარი ჩვენ ახლა კიდევ დაიწყოს მქონე არის როგორ უნდა რეალურად პრობლემების ეფექტურად თუ გავითვალისწინებთ იმ მარტივი პრობლემების ასე? დავუშვათ, გვაქვს 8 კარს მიღმა, რომლებიც ზოგიერთი ნომრები, და თითოეულ ამ ნომრებზე არ არის დახარისხებული არანაირად, ისინი უბრალოდ შემთხვევითი რიცხვებით უკან ამ კარს, და ჩვენ ვთხოვთ კითხვაზე, თუ როგორ დადიხართ შესახებ მოძიებაში ნომერი - ვინ იცის - 7 უკან ამ კარს? რას, ადამიანური, გავაკეთოთ, რათა ჩემთვის ნომერი 7 თუ ერთხელ თითოეული ეს კარები და დაინახოს ღირებულება თქვენ უნდა გახსნა კარი? რა თქვენი ალგორითმი იყოს ალბათ? [Inaudible სტუდენტი საპასუხოდ] >> ასე იწყება მარცხენა და გახსნა კარი, გახსნა კარი, გახსნა კარი. ხოლო უარეს შემთხვევაში, რამდენ ხანს იგი აპირებს us მოძიების ნომერი 7? ისევ და ისევ, ისინი არ დახარისხებული, ამიტომ არ მარტივი როგორც, ასევე, მე ვაპირებ გახსნა მე -7 კარი. ეს შეიძლება მიიღოს ჩვენთვის, მაქსიმალურად, 8 ნაბიჯები. ყველაზე ცუდ შემთხვევაში, 7 არის შემთხვევით დროს ძალიან დასასრულს ხაზი კარები, ამიტომ ჩვენ შეიძლება უნდა ვეცადოთ ყველა N კარები. ასე რომ კიდევ ერთხელ, ჩვენ, როგორც ჩანს, აქვს ხაზოვანი ალგორითმი. ფაქტობრივად, ეს გავაკეთეთ მხოლოდ რამდენიმე წლის წინ. ერთი თქვენი წინამორბედები იყო გასაჩივრებული ერთად ზუსტად ამ სადაც ჩვენ არ გვაქვს ციფრული ვერსია, ჩვენ ნაცვლად ჰქონდა დაფაზე ზოგიერთი ცალი ქაღალდის მასზე. და რა ვიფიქრე, რომ გააკეთოთ მიიღოს სწრაფი ვიხსენებთ როგორ წავიდა, ერთ ერთი საუკეთესო და ყველაზე უხერხულ შესაძლებლობები სცენაზე ჰქონდეს მანიფესტაციის უფლება აქ Sanders. ჩვენ გვქონდა 2 რიგები ნომრები. ჩვენ მხოლოდ აპირებს შევხედოთ რა ხდება აქ შონ ამისთვის ძალიან ზევით ეს სტრიქონები. თუ არავის არასოდეს ერთხელ მოხალისეები წელს CS50, ჩვენ გვქონდა შონ ს კურთხევით შენარჩუნება ეს კამერა, ასე იცის, რომ ასობით ადამიანი თვალს ეს ახლა წლების განმავლობაში. მაგრამ შონ გააკეთა საოცარი საქმეს - ან ამბობდა? - ზე რეალურად მოძიებაში us კერძოდ ნომერი. ასე რომ ვნახოთ, თუ როგორ მოგვარდება ეს ალგორითმი ისე, რომ ჩვენ განაახლონ ამ საუბრის ადრე ხანგრძლივი თუ როგორ მოვძებნით რამ ეფექტურად. [Malan on video] მე არ იმალება უკან ამ კარები ნომერი 7, მაგრამ tucked მოშორებით ზოგიერთი კარები ასევე არიან სხვა არასამთავრობო უარყოფითი რიცხვები, და თქვენი მიზანია ვფიქრობ ამ ყველაზე გრაფაში ნომრები მხოლოდ მასივი ან უბრალოდ თანმიმდევრობა ცალი ქაღალდი ნომრები მათ უკან, და თქვენი მიზანია, მხოლოდ გამოყენებით ზემოთ მასივი აქ, იპოვეთ ჩემთვის ნომერი 7. და ჩვენ შემდეგ ვაპირებთ კრიტიკა, თუ როგორ წავიდეთ შესახებ ვაკეთებთ. >> ყველა უფლება. [Malan] მოძებნა us ნომერი 7, გთხოვთ. [სიცილის] [Malan] ჯგუფი [სიცილის] 5, 19, 13, [სიცილის]. ეს არ შეასრულა კითხვაზე. 1. [სიცილის] ამ ეტაპზე თქვენი ანგარიში არ არის ძალიან კარგი, ასე რომ თქვენ შეიძლება ასევე შენარჩუნება აპირებს. [სიცილის] 3. გადასვლა on. გულწრფელად ვამბობ, ვერ დაეხმარება, მაგრამ საინტერესოა, რა თქვენ კი ფიქრი. [სიცილის] მხოლოდ ყველაზე ზედიზედ, ასე რომ თქვენ მოხვდით 3 მარცხენა. ასე პოულობენ ჩემთან 7. [სტუდენტი murmuring] [Malan] 17. [სტუდენტი murmuring] [Malan] 7! [ტაში] ასე რომ, ოთხშაბათს ჩვენ ჩაყვინთვის შევიდა ამ და უფრო დახვეწილი ალგორითმები მოძიების რამ. ახლა ჩვენ დავტოვებთ თქვენ შონ და ვხედავ თქვენ ოთხშაბათს. [CS50.TV]