Thursday, June 25, 2015

თავი 5 (5,8 - 5,10)

5.8 გამართვა

როცა უფრო დიდი პროგრამების წერას დაიწყებ, აღმოაჩენ რომ უფრო მეტ დროს ხარჯავ გამართვაში. მეტი კოდი ნიშნავს შეცდომის დაშვების მეტ შანსს და მეტ ადგილს ნაკლთა დასამალად.
გამართვის დროის შესამცირებელი ერთი გზაა "გამართვა შუაზე გაყოფით"(?) (“debugging by bisection.”). მაგალითად პროგრამაში 100 ხაზი თუა და შეამოწმებ სათითაოდ, ამას მოუნდება 100 ნაბიჯი. ამის მაგივრად ცადე პრობლემა გაყო შუაზე. მონახე პროგრამის შუა ნაწილი შუალედური მნიშვნელობისათვის, რომლის შემოწმებაც შეგიძლია. დაამატე print ბრძანება (ან სხვა რამე, რასაც დამამოწმებელის ეფექტი ექნება) და პროგრამა გაუშვი. შუა წერტილის შემოწმება თუ შეცდომას აჩვენებს, პრობლემა უნდა იყოს კოდის პირველ ნაწილში და  თუ შემოწმება სწორია , მაშინ - მეორე ნაწილში.
ყოველ ჯერზე როცა ამოწმებ ამ მეთოდით, ანახევრებ ხაზებს, საცა უნდა მოძებნო პრობლემა. 6 ნაბიჯის შემდეგ(რაც ბევრად ნაკლებია ვიდრე 100)   იქნები 1-2 ხაზით დაბლა თეორიულად მაინც.
პრაქტიკაში ყოველთვის არ არის ცხადი თუ სადაა "პროგრამის შუა" და შემოწმება ყოველთვის არ არის შესაძლებელი. ხაზების დათვლას და ზუსტად შუა წერტილის პოვნას აზრი არ აქვს. სანაცვლოდ იფიქრე პროგრამაში ადგილებზე, სადაც შეიძლება შეცდომები იყოს და ადგილებზე, სადაც შემოწმება ადვილია.

5.9 ლექსიკონი

accumulator: მარყუჟში გამოყენებული ცვლადი, რომელშიც შეიტან ან ჩაუმატებ შედეგს.
counter: მარყუჟში გამოყენებული ცვლადი ხდომილებათა რაოდენობის დასათვლელად.  მთვლელს ვაყენებთ ნულზე და შემდეგ, როცა გვინდა რამე დათვალოს მთვლელს ყოველ ჯერზე ვზრდით.
decrement: განახლება, რომელიც ცვლადის მნიშვნელობას ამცირებს.
initialize: ტოლობა, რომელიც ცვლადს აძლევს საწყის მნიშვნელობას - რომელიც განახლდება.
increment: განახლება, რომელიც ზრდის ცვლადის მნიშვნელობას (ხშირად ერთით)
infinite loop: მარყუჟი, რომელშიც შეჩერების პირობა არასდროს შესრულდება.
iteration: მიცემული ბრძანებების გამეორებადი განხორციელება რეკურსიული ფუნქციის გამოძახებით ან მარყუჟით.

შენიშვნა: რეკურსიული ფუნქცია ეწოდება ისეთ ფუნქციას რომელიც იძახებს საკუთარ თავს, მისი მთავარი იარაღია ამოცანის მარტივ ნაწილებად დაშლა ანუ დეკომპოზიცია. რეკურსია მოქმედებს პრინციპითდაყავი და იბატონე”. რეკურსიული ფუნქციის დასრულება ხდება ამოცანის საბაზო ანუ ყველაზე მარტივ დონემდე დაყვანით. ამოცანის რეკურსიულად გადაწყვეტა მოითხოვს გაცილებით დიდ რესურსებს კომპიუტერისგან, ვიდრე ამას საჭიროებს ტრადიციული(იტერაციული) მიდგომა, თუმცა უნდა აღინიშნოს რომ ზოგიერთი ამოცანის გადაწყვეტისას რეკურსიული მიდგომა გაცილებით უკეთესია, ვიდრე იტერაციული.

წყარო: 
https://lobjana.wordpress.com/2011/07/29/%E1%83%A0%E1%83%94%E1%83%99%E1%83%A3%E1%83%A0%E1%83%A1%E1%83%98%E1%83%98%E1%83%A1-%E1%83%AB%E1%83%90%E1%83%9A%E1%83%90-%E1%83%B0%E1%83%90%E1%83%9C%E1%83%9D%E1%83%98%E1%83%A1-%E1%83%99%E1%83%9D/#more-243

5.10 სავარჯიშოები

სავარჯიშო 5.1 დაწერე პროგრამა რომელიც გამეორებით კითხულობს ციფრებს, სანამ მომხმარებელი არ შეიყვანს "done” - ს. როცა კი ამას იზამს, ამობეჭდოს ჯამი, ციფრების რაოდენობა  და ციფრების საშუალო რიცხვი. მომხმარებელი ციფრის გარდა სხვა რამეს თუ შეიყვანს, აღმოაჩინოს ეს შეცდომა try და except - ით, ამობეჭდოს შეცდომის მესიჯი და გადახტეს სხვა ციფრზე.

Enter a number: 4
Enter a number: 5
Enter a number: bad data
Invalid input
Enter a number: 7
Enter a number: done
16 3 5.33333333333

სავარჯიშო 5.2 დაწერე სხვა პროგრამა, რომელიც გამოიტანს ციფრების სიას - როგორც ზემოთ და ბოლოს ამობეჭდავს მაქსიმუმ და მინიმალურ ციფრებს საშუალო რიცხვის მაგივრად.