[Powered by Google Translate] [Həftə 4]
[David J. Malan] [Harvard Universiteti]
[Bu CS50 edir.] [CS50.TV]
>> , Bütün sağ, bu CS50, bu həftə 4 başlanğıc
və bu yavaş mümkün çeşidlənməsi alqoritmlərin biridir.
Hansı ki, biz orada izlədim ki, idi?
Bu, (n ^ 2) + məbləğin böyük Ey üçün bubble sırala idi
və həqiqətən biz bilirik görünür bu dünyada yeganə deyildir
nə bubble növ və ya öz çalışan zaman.
Həqiqətən, bu Google Eric Schmidt ilə müsahibə idi
və keçmiş senator Barak Obama yalnız bir neçə il əvvəl.
>> İndi, senator Google burada edirik
və mən bir iş müsahibə kimi prezidentliyə düşünmək istəyirəm.
İndi prezident kimi bir iş əldə etmək çətindir və siz indi rigors ilə olacaq.
Google bir iş üçün də çətindir.
Biz sualınız və biz namizədlərin sual
və bu Larry Schwimmer edir.
Siz uşaqlar I söylüyorum deyiləm mi? Bu sağ burada.
Bir milyon 32-bit integers düzmək üçün ən səmərəli yol nədir?
[Gülüş]
Yaxşı
Üzgünüm. >> Heç, heç, heç, No.
Mən bubble sırala getmək üçün səhv yol olardı.
>> Ona izah edən Hadi,?
Ötən həftə biz ən azı bir gün üçün kod bir fasilə etdi geri
və ümumiyyətlə həlli bəzi yüksək səviyyəli fikir və problem diqqət açılmış
axtarış və çeşidlənməsi kontekstində,
və biz ötən həftə bu adı sillə ki, bir şey təqdim
lakin asimptotik notation, Böyük O, Böyük Omega,
və bəzən Böyük Theta notation, bu sadəcə yolları idi
alqoritmlərin çalışan zaman izah,
çalıştırmak üçün bir alqoritmi üçün edir nə qədər vaxt.
>> Və siz ölçüsü baxımından çalışan zaman danışdı Xatırladaq bilər
biz ümumiyyətlə problem ola bilər nə olursa olsun, n adlandırdığımız giriş, və,
Ü n, oda insanların sayı
bir telefon kitab pages sayı, və biz hər şeyi yazmaq başladı
O kimi (n ^ 2) və ya O (n) və ya O (n log n)
və riyaziyyat çox belə mükəmməl iş vermədi hətta
və n idi ² - n / 2 və ya kimi bir şey
biz yerine, aşağı üçün bəzi terimler tullamaq ki,
və motivasiya biz həqiqətən istəyirik ki, var
qiymətləndirilməsi obyektiv şəkildə sort
proqramlarının icrası və ya alqoritmləri icra
gün sonunda, məsələn, heç bir əlaqəsi yoxdur
kompüter sürəti bu gün.
>> Məsələn, bubble sırala həyata əgər,
və ya, bu gün kompüter sort və ya seçim cür birləşməsi həyata
2 GHz kompüter və siz çalıştırın
və bu 3 GHz var gələn il, saniyə, bəzi sıra edir
və ya 4 GHz kompüter, və sonra ki, "Wow, mənim alqoritm iddia bilər
əslində o halda aydın deyil zaman ", iki dəfə sürətli kimi indi.
Bu, yalnız hardware daha sürətli əldə etmişdir, lakin kompüter
, və biz, həqiqətən, kimi şeylər üz atmaq istəyirəm deyil
2 Multiples və ya 3-Multiples xarakterizə gəldiyi zaman
necə sürətli və ya yavaş necə bir alqoritm və həqiqətən yalnız diqqət
n və ya onların bir amil haqqında
bəzi güc onların keçən həftə gələn növ olduğu kimi.
Və birləşmə cür köməyi ilə geri
biz bubble sort və seleksiya sort çox daha yaxşı edə
və hətta durub sort.
>> Biz yenə n log n aşağı olmuş,
log n adətən artır ki, bir şey deməkdir ki, geri
daha yavaş-yavaş sonra n, belə n log n bu günə qədər yaxşı idi
o n ²-dən az idi.
Amma birləşmə sort ilə n nail olmaq n daxil
biz leverage olduğunu bir fikir əsas bakterioloji nə idi
biz də həftə 0 geri leveraged ki?
Necə birləşmə sort ilə ağılla çeşidlənməsi problem həll etdiniz?
Bəlkə, əsas fikir nə idi?
Hər kəs bütün.
OK, geri addım götürək.
Öz sözləri sort daxil tanımlayın.
Necə iş idi?
OK, biz həftə 0 geri Satırı lazımdır.
Okay, evet.
[Işitilemez-tələbə]
Yaxşı, Okay, biz 2 ədəd nömrələri array bölünür.
Biz bu ədəd hər çeşidlənir, sonra biz onlara birləşdi
bu böyük ki, bir problem alaraq əvvəl və biz bu ideya gördüm
və bu böyük və ya bu böyük ki, bir problem onu ​​Doğrama.
>> Telefon kitab Məsələn xatırlayıram.
Əvvəl həftə özünü hesablanması alqoritmi Xatırladaq
belə daxil sort burada bu pseudocode ilə xülasə edilmişdir.
Siz n elementləri verilmiş olduğunuzda, ilk ağlı başında olma kontrol idi.
N <2 sonra bütün bir şey deyilsə
n <2 sonra n açıq-aydın 0 və ya 1 əgər çünki,
bu da varsa və bu 0 və ya 1 düzmək üçün heç bir şey yoxdur.
Siz tamamlayın.
Sizin siyahısı artıq trivially çeşidlənir.
Amma 2 və ya daha çox elementləri var başqa əgər irəli getmək və onları bölmək
2 yarıya indirir daxil, sol və sağ.
O yarıya indirir hər bir sort, sonra sıralanır yarıya indirir daxil.
Amma burada problem biz punting etdiyiniz kimi ilk baxışda bu hiss edir.
Bu n elementləri düzmək üçün siz xahiş etdik, bu ki, bir dairəvi tərifi
və "Bütün hüququ, gözəl, biz o n / 2 və o n / 2 elementlər düzmək lazımdır" mənə izah edirik
sonra növbəti sual olacaq "necə n / 2 elementlər sort yoxdur, Fine?"
>> Amma bu proqramın strukturunun,
Bu baza halda var, çünki, belə ki, danışmaq
n dərhal 2 qaytarılması kimi bəzi əsas dəyər <əgər deyir ki, bu xüsusi halda.
Həmin dairəvi cavab cavab etməyin.
Bu proses bu cyclicity nəhayət başa çatacaq.
Mən "Sort bu n elementləri," xahiş və siz demək Əgər "Fine, bu n / 2 sort"
sonra "Fine, sort bu n / 4, n / 8, n/16" demək
nəticədə bir böyük kifayət sayda bölmək lazımdır
siz deyə bilərsiniz hansı nöqtədə yalnız 1 element sol lazımdır ki,
"Burada, burada bir sıralaması bir element deyil."
Sonra bu alqoritm və parıltı qədər burada fakt əldə etmək
bir bu fərdi sıralanır siyahıları bütün,
yararsız görünür ölçüsü 1, olan bütün
siz onlara birləşdirilməsi və onların birləşmə başlamaq dəfə
Rob video bir nəhayət sıralanır siyahısı kimi nəhayət qurmaq.
>> Amma bu ideya uzaq çeşidlənməsi kənarda uzanır.
Recursion kimi tanınan bu proqram katıştırılmış bu ideya var
Bir proqramı vasitəsi fikir
və özünüz zəng bir problemi həll etmək,
və ya, bir funksiyası var proqramlaşdırma dilləri kontekstində qoymaq
və problem həll etmək üçün, siz özünüz zəng funksiyası
təkrar və yenidən, ancaq funksiyası
özünüzü sonsuz dəfələrlə zəng edə bilməz.
Nəhayət, siz belə danışmaq, alt həyata var
və deyir ki, bəzi ağır kodlu baza vəziyyət
Bu baxımdan belə özünüz zəng dayandırmaq ki, bütün prosesi
nəhayət əslində dayandırmaq deyil.
Bu, həqiqətən recurse üçün nə deməkdir?
>> Biz demək, bir sadə, əhəmiyyətsiz misal edə bilərsiniz, əgər Bakalým
Qədər burada səhnəyə mənə 3 nəfər, kimsə rahat olsun.
Qədər, 2 və 3 1, gəlir.
Siz 3 Burada gəlmək istəyirsinizsə.
Bir line burada mənə doğru növbəti durmaq istəyirsinizsə, güman ki, əl-da problem
çox trivially burada olan insanların sayını olunur.
Amma səmimi, mən bütün bu sayılması nümunələri yorğun edirəm.
Bu, bəzi vaxt, 1, 2, və nöqtə, nöqtə, nöqtə almaq niyyətindədir.
Bu əbədi etmək olacaq.
Mən yalnız köməyi ilə cəmi ayaqla zərbə bu problemin-nə adı var? Deyil had
Sara. >> Sara, bütün hüququ.
Kelly. >> Kelly və?
>> Willy. >> Willy, Sara, Kelly və Willy.
İndi kimsə tərəfindən sual edilmişdir
necə bir çox insanlar bu mərhələ üzrə və mən heç bir fikrim yoxdur.
Bu, həqiqətən uzun siyahısı və s əvəzinə mən bu oyun etmək üçün gedirəm.
Mən iş çox etmək mənə yanındakı adam xahiş gedirəm
və bir o işin ən etdiklərini edilir
Mən mümkün iş ən az miqdarı nə və yalnız 1 əlavə alıram
, belə ki, burada biz getmək nə olursa olsun öz cavab.
I mərhələdə necə bir çox insanlar xahiş etdik.
Necə bir çox insanlar sizin sol mərhələsindədir?
Bu Okay >>? Mənim sol, amma fırıldaqçı deyil.
Doğru ki, yaxşı, amma biz bu məntiq davam etmək istəyirsinizsə,
siz eyni sizin sol ayaqla zərbə bu problem istəyirəm ki, fərz edək,
belə deyil, cavab çox birbaşa irəli getmək və yalnız buck keçir.
Oh, mənim sol neçə nəfər var?
Sol neçə nəfər var?
1.
[Gülüş]
OK, belə ki, 0, belə nə indi Willy görmüşdür
Siz cavab 0 deyərək bu istiqamətdə geri etdik edir.
İndi nə etməliyəm? >> 1.
OK, belə ki, 1-istəyirik, belə demək, "Bütün sağ, 1 əlavə gedirəm
hər hansı Willy-nin sayı idi "belə 1 + 0.
Sağ cavab belə İndi 1 etdiyiniz indi-
1. >> Və mina 2 olardı.
, Belə ki, 1 Əvvəlki cavab Yaxşı qəbul edirik
Siz istədiyiniz iş minimal məbləği əlavə edən +1 edir.
İndi 2, və sonra mənə olan dəyər əl?
3, I, sorry, 2 deməkdir.
Yaxşı.
>> Yaxşı, biz sola 0 idi.
, Sonra biz 1 idi, və sonra 2 əlavə
və indi, mənə sayı 2 təhvil edirik
və mən, 3 +1, tamam dedi alıram.
Bu mərhələdə məni yanında daimi 3 nəfər, həqiqətən var
biz əlbəttə ki, çox xətti bu edə bilərdi
aşkar moda çox, lakin biz həqiqətən nə idi?
Biz ilkin ölçüsü 3 problem etmişdir.
Biz sonra, ölçüsü 2 problem onu ​​yıxdı
sonra ölçüsü 1 problemi, sonra əsas işi nəhayət
həqiqətən, oh, heç bir var
olan nöqtə Willy, ağır kodlu cavab bir neçə dəfə səmərəli geri
və ikinci, sonra qədər bubbled qədər bubbled qədər bubbled edilib
və sonra bu əlavə 1-ci əlavə
biz recursion bu əsas ideya həyata etdik.
>> İndi, bu halda bu, həqiqətən bir problemi həll etməyib
daha səmərəli sonra biz belə uzaq gördüm.
Amma bu günə qədər səhnəyə etdik alqoritmlər haqqında düşünürəm.
Biz, Kara Tahta barədə kağız 8 ədəd olmuşdur
video Sean sayı 7 axtarır və o, həqiqətən nə zaman?
Yaxşı, o bölgü hər cür etmək və fəth etməmişdir.
O recursion hər cür etmədi.
Əksinə o, yalnız bu xətti alqoritm etdi.
Amma biz səhnədə sıralanır nömrələri fikir təqdim ötən həftə yaşamaq
sonra, orta gedərək bu instinkt var
hansı nöqtədə, ölçüsü 4 və ya ölçüsü 4 bir siyahısını kiçik bir siyahısı var idi
və sonra eyni problem var idi, belə ki, biz təkrar, təkrar, təkrar.
Başqa sözlə, biz recursed.
Bizimlə recursion nümayiş etdirmək üçün burada 3 könüllülər üçün çox təşəkkür edirik.
>> İndi bir az daha konkret bu edə bilməz əgər Bakalým,
yenə biz olduqca asan nə ola bilər ki, problem həlli,
amma bu əsas ideya həyata bir gücləndirməklə daş kimi istifadə edəcəyik.
Mən ədəd bir dəstə olan toplama hesablamaq istəyirsinizsə
Məsələn, siz sayı 3 keçmək əgər,
Mən sizə sigma 3 dəyəri vermək istəyirəm
belə 3 məbləğində + 2 + 1 + 0.
Mən cavab 6 geri almaq istəyirəm
biz bu sigma funksiyası, bu toplama funksiyası həyata olacaq
ki, yenidən daxil edir, və sonra toplama qaytarır
aşağı 0 ki sayı bütün yolu.
Biz, olduqca sadəcə bunu edə bilər?
Biz, loop strukturu bir növ bunu edə bilər
Mənə davam və bu başlamaq bildirin.
>> Stdio.h daxildir.
Burada işləmək üçün mənə əsas daxil özüm almaq edək.
Gəlin sigma.c kimi bu edin.
Sonra burada getmək gedirəm, və mən, bir int n bəyan gedirəm
və mən istifadəçi əməkdaşlıq etmir aşağıdakı gedirəm.
Istifadəçi mənə müsbət sayı verilmir baxmayaraq
Mənə davam və n = GetInt üçün onlara təklif edək,
və mənə nə kimi bir təlimat verək
belə printf ("Müsbət tam edin").
Vaxt biz line 14 hit ki, bu kimi nisbətən sadə yalnız bir şey
indi n ehtimalla bir müsbət tam var.
>> İndi ilə bir şey edək.
Mənə irəli getmək və toplama hesablamaq edək, belə int məbləğ = sigma (n).
Sigma yalnız toplama edir, belə ki, mən yalnız meraklısı şəkildə yazılı edirəm.
Biz yalnız orada sigma zəng edəcəyik.
Bu məbləğ, və indi, nəticə çap gedirəm
printf (məbləğ "edib d, \ n%-dir").
Və sonra mən yaxşı tədbir üçün 0 qayıtmaq lazımdır.
Biz maraqlı hissəsi istisna olmaqla, bu proqram tələb edir ki, hər şey etdik
hansı faktiki sigma funksiyasını həyata keçirilməsidir.
>> Mənə alt burada enmək və mənə funksiyası sigma bəyan qoy edək.
Bu tipli tam var ki, dəyişən etmək var
və nə data type mən sigma dən ehtimalla qayıtmaq istəyirsiniz?
Int, mən line 15-də mənim gözləntiləri uyğun istəyirəm, çünki.
Burada məni irəli getmək və bu həyata bildirin
olduqca sadə şəkildə.
>> Nin davam və int məbləğ = 0 deyək,
və indi burada loop üçün bir az getmək gedirəm
ki, bu kimi bir şey demək olacaq
edib + = i (; I <= nömrə i + + int i = 0).
Və sonra məbləği geri gedirəm.
Mən yolları istənilən sayda bu həyata bilər.
Mən isə loop istifadə edə bilər.
Mən həqiqətən istəyirdi əgər məbləğ dəyişən istifadə atlanır ola bilər
lakin qısa, biz yalnız mən əgər axmaq məbləğ 0 olduğunu bəyan edir ki, bir funksiyası var.
Sonra, sayı ilə qədər 0-dan iterates
və hər iteration bu məbləği cari dəyər verir və sonra məbləğ qaytarılır.
>> İndi burada bir qədər optimallaşdırma var.
Bu yəqin ki, bir boşa addımdır, amma belə olmalıdır. Indi üçün gözəl edir.
Biz ən azı istəyirik, hərtərəfli olan və üzərində 0 bütün yol gedir.
Çox çətin və olduqca sadə deyil,
ancaq sigma funksiyası ilə eyni imkanı çıxır ki,
biz mərhələdə burada olduğu kimi.
Mərhələdə biz yalnız, mənə gələn nə çox insanlar sayılır
əvəzində biz sayı 3 + 2 + 1 saymaq istəyirdi
aşağı 0 biz bir funksiyası eyni ayaqla zərbə ola bilər
Mən əvəzinə recursive kimi təsvir lazımdır ki,.
Burada tez ağlı başında olma kontrol və mən axmaq etmədi əmin edə bilərəm bildirin.
>> Mən zülm etdi ki, bu proqram ən azı bir şey var bilirəm.
Mən daxil hit zaman mənə böyle hər cür almaq üçün gedirəm?
Mən də yelled üçün nə edəcəyəm?
Bəli, mən prototip unuttum, mən line 15 sigma adlı funksiyasından istifadə edirəm belə
lakin bu xətt 22-dək elan, mən yaxşı fəal burada getmək deyil
və bir prototip elan və mən int sigma (int sayı) demək lazımdır ki, bu.
Bu alt həyata var.
>> Və ya bu həll edə bilər başqa bir yol,
Mən hansı pis deyil, var funksiyası hərəkət edə
lakin ən azı sizin proqramları, açıq, Uzunmüddətli almaq üçün başlattığınızda
Mən həmişə üst əsas olan bəzi dəyəri var hesab
Siz oxucu ilə fayl açmaq və sonra dərhal görə bilərsiniz ki,
Proqram vasitəsilə axtarış olmadan nə
əsas funksiyası axtarır.
Nin burada terminal pəncərə aşağı gedək, sigma sigma etmək edilməsi cəhd
və mən də burada berbat.
Funksiyası GetInt və Örtük bəyannamə nə başqa nə unuttuysanız deməkdir?
[Işitilemez-tələbə]
Yaxşı, belə görünür bir ümumi səhv, belə isə burada bu qədər qoymaq bildirin
cs50.h, indi beni terminal pəncərə geri imkan verir.
>> Mən ekran təmizləmək lazımdır və mən sigma etmək təkrar olacaq.
Bu tərtib görünür. Mənə indi sigma run edək.
Mən sayı 3 yazın lazımdır, mən 6 almaq idi, belə bir ciddi çek
lakin ən azı, ilk baxışdan iş görünür, indi edək ki, bu ayrı rip
və Gəlin həqiqətən, təkrar recursion ideyası Leverage
çox sadə kontekstində ki, bir neçə həftə vaxt
biz seriallarda çox meraklı data strukturlarının kəşfiyyatı başlattığınızda
biz hansı ilə Toolbar bir alət
biz görəcəksiniz həmin data strukturları manipulyasiya.
Bu iterativ yanaşma, loop-based yanaşma.
>> Indi bunu əvəzinə mənə edək.
Əvəzinə demək mənə edək ki sayı toplama
həqiqətən eyni şey 0 aşağı deyil
sayı + sigma (sayı - 1).
Başqa sözlə, yalnız səhnədə kimi mən, mənə gələn insanlar hər punted
və onlar öz növbəsində, biz nəhayət Willy həyata bottomed qədər punting saxlanılır
kim 0 kimi ağır kodlu cavab qaytarmaq idi.
Burada indi biz eyni sigma üçün punting edirik
eyni funksiyası ilk adlanır, ancaq əsas fikir burada edilib
biz eyni sigma zəng deyilik ki.
Biz n keçən deyilik.
Biz aydın sayı keçən edirik - 1,
bir az kiçik problem bir qədər kiçik problem.
>> Təəssüf ki, bu hələ kifayət qədər həll deyil və biz düzeltmek əvvəl
Əgər bəzi Aşkar kimi nə jumping bilər
Mənə davam etmək və təkrar edək.
Tamam tərtib görünür.
Mənə 6 sigma təkrar edək.
Whoops, mənə 6 sigma təkrar edək.
Biz təsadüfən son dəfə də olsa, əvvəl bu gördük.
Niyə bu sirli seqmentasiya günah əldə etdiniz? Bəli.
[Işitilemez-tələbə]
Xüsusilə yoxdur baza halda, ve, nə yəqin oldu?
Bu nə davranış simptom var?
Bir az Qaraçuxurlu deyirəm.
[Işitilemez-tələbə]
Bu səmərəli sonsuz loop və sonsuz loops ilə problem
onlar bu halda recursion cəlb zaman, bir funksiyası, özü zəng
nə bir funksiyası zəng hər zaman olur?
Bəli, biz bir kompüter yaddaş müəyyən necə geri edirəm.
Biz altındakı ki yığını adlı yaddaş bu yığın olduğunu bildirib
və bir az daha çox yaddaş funksiyası zəng hər zaman qoymaq olur
ki funksiyası yerli dəyişənlərin və ya parametrləri olan bu qondarma yığını haqqında
sigma sigma zənglər çağırır əgər sigma sigma çağırır
sigma çağırır bu hekayə sonunda edir?
>> Yaxşı, bu son nəticədə taşmaları ümumi məbləği
bilgisayarınıza var ki, yaddaş.
Siz ərzində qalmaq ehtimal etdiyiniz segment, dağıtmaq
və bu seqmentasiya günah olsun, əsas, tullanır
və taþý nə əsas deməkdir İndi əsas adlı bir fayl var ki
olan adet sıfır və olanları olan fayl
əslində gələcəkdə diagnostically faydalı olacaq.
Sizin səhv olduğu sizə aydın deyilsə
həqiqətən, belə ki, danışmaq, məhkəmə təhlil bir az edə bilərsiniz
bu core dump fayl, o, yenə yalnız adet sıfır və olanları bir bütün dəstə edir
ki, mahiyyətcə yaddaş üçün proqram dövlət təmsil
Hazırda bu şəkildə qəzaya uğrayıb.
>> Burada fix biz yalnız kor-koranə, sigma geri bilər
sayı + bir az kiçik problem sigma.
Biz burada əsas işi bir növ lazımdır
və baza halda yəqin ki, nə olmalıdır?
[Işitilemez-tələbə]
OK, belə uzun sayı müsbət kimi biz, həqiqətən, bu qayıtmalıdırlar
və ya başqa sözlə, sayı, əgər ki, <= 0
siz, mən irəli getmək və 0 qayıtmaq lazımdır nə bilirik
Willy idi çox kimi, başqa, mən davam gedirəm
və bu geri, belə ki, çox qısa deyil
biz ilk loop üçün istifadə edərək, çırpılmış ki iterativ versiyası daha
lakin bu zəriflik bu cür olduğunu görürük.
Bunun əvəzinə bir sıra qaytarılması və bütün bu riyaziyyat həyata
və yerli dəyişənlərin şeyi əlavə
yerine deyərək edirik "OK, bu super asan problem varsa,
sayı <0 kimi, mənə dərhal 0 qayıtmaq bildirin. "
>> Biz dəstək mənfi nömrələri narahat fikrində deyilik
Mən ağır kodu 0 dəyəri gedirəm.
Amma başqa cəmlənməsi bu ideya həyata
Bu rəqəmlərin bütün birlikdə səmərəli kiçik bir bite bilər
Problemin həyata, çox kimi ki, səhnədə burada etdi
sonra ayaqla zərbə növbəti şəxsə problem qalan,
bu halda növbəti şəxs özünüzü edir.
Bu eyni adlı funksiyası var.
Sadəcə, bir kiçik və daha kiçik və daha kiçik problem hər zaman keçmək
və biz burada kodu tamamilə rəsmiləşdirilmiş şeylər olsa da
Bu telefon kitab həftə 0 gedən edilib məhz budur.
Bu Sean ilə ötən həftə də davam dəqiq nə
və nömrələr axtarmaq bizim nümayişlərlə.
Bu problem qəbul və təkrar bu ayırıcı edir.
>> Başqa sözlə, tərcümə indi bir yolu yoxdur
bu real dünyada tikinti, bu yüksək səviyyədə tikinti
bölmək və fəth və təkrar bir şey edir
kodu, bu zaman artıq yenidən görəcəksiniz bir şeydir.
Siz recursion yeni əgər İndi, bir kənara kimi, ən azı indi dərk etməlidir
niyə bu gülməli deyil.
Mən, google.com getmək üçün gedirəm
və mən recursion bəzi Məsləhətləri və fəndləri üçün axtarış gedirəm, daxil edin.
Onlar yalnız indi laughing idi əgər yanındakı adam deyin.
Siz recursion mean?
Siz mi demək-ah, orada getmək.
OK, indi ki, hər kəsin istirahət edir.
Bir az Pasxa yumurta Google haradasa orada əlaqədar.
Bir kənara, biz əlbəttə saytında çıxarılan links biri kimi
bu gün müxtəlif çeşidlənməsi alqoritmlərin bu grid edir
Keçən həftə baxdı, lakin nə bu vizual haqqında gözəl olan bəzi
siz alqoritmləri ilə bağlı müxtəlif şeyi ətrafında sizin fikrinizi kesmek üçün cəhd kimi
siz çox asanlıqla artıq vəsait müxtəlif növləri ilə başlaya bilərsiniz ki, bilirik.
Bu giriş bütün giriş təsadüfi və s, bu vəsait əsasən çeşidlənir, bərpa.
Siz yenə cəhd kimi, fikrinizi bu şeylər ayırmaq
həyata ki mühazirələr səhifə kurs saytında bu URL
o bəzi vasitəsilə səbəb kömək edə bilər.
>> Bu gün biz, nəhayət, geri isə bu problemi həll etmək
ki, bu mübadilə funksiyası yalnız iş deyil idi ki,
və bu funksiya mübadilə ilə əsas problem nə idi
burada və burada bir dəyər mübadiləsi, təkrar idi məqsədi olan
bu olur ki, belə?
Bu, həqiqətən iş yox idi. Niyə?
Bəli.
[Işitilemez-tələbə]
Bu bugginess üçün tam izahat
C funksiyaları zəng çünki sadəcə oldu
və bu funksiyaları, bir və b burada kimi, mübahisə etmək
siz ki, fəaliyyət təmin etdiyiniz nə dəyəri nüsxədə keçir.
Siz orijinal dəyərləri özləri təmin olunmur
biz, buggyc kontekstində bu gördüm
bu kimi bir az bir şey baxdı olan buggy3.c.
>> Biz x və y müvafiq olaraq, 1 və 2-başlatılmış ki Xatırladaq.
Biz onlar nə çap.
Mən o mən x, y svop çağıraraq onlara dəyişdirmə iddia edirdi.
Ancaq problem dəyişdirmə çalışmışdır ki,
yalnız mübadilə çərçivəsində özünü göstərir.
Biz line 40 o değiştirilecek dəyərlər hit kimi
atılmalı idi, və heç bir şey
orijinal funksiyası əsas həqiqətən, bütün dəyişdi
Bu bizim yaddaş baxımından kimi görünür nə kimi sonra geri edirəm əgər
heyəti bu sol tərəfi təmsil-if
və mən görmək hər kəs üçün əlimdən gələni edəcəyik bu-əgər heyəti bu sol tərəfində
təmsil, sizin RAM demək və yığını, bu yolu üzərində inkişaf edir
və biz əsas kimi bir funksiyası zəng və əsas 2 yerli dəyişənlər, x və y var
nin burada x həmin təsvir edək və Gəlin burada y kimi təsvir
və ən dəyərlər 1 və 2 qoymaq edək, burada əsas odur
və əsas mübadilə funksiyası əməliyyat sistemi zənglər zaman
, yığını üzrə svop funksiyası yaddaş öz Tarama verir
yığını öz çərçivəsində, belə danışmaq.
O, həmçinin bu ints üçün 32 bit ayırır.
Onlara bir və b zəng etmək olur, lakin tamamilə əsassız deyil.
Bu istəyir nə onlara deyilən ola bilər, lakin əsas nə olur
zənglər svop, bu 1 alır bir surəti qoyur, bir surəti qoyur edir.
>> Svop 1 digər yerli dəyişən var, baxmayaraq ki, nə deyilir? >> Tmp.
Tmp, belə ki, mənim özüm burada başqa 32 bit verək
və bu funksiyası nə idi?
Mən int tmp a, bir 1 var alır bildirib, belə ki, biz keçən bu misal ilə oynadığı zaman bu idi.
Sonra b olur, belə ki, b 2, belə ki, indi bu 2 olur,
və indi, b temp olur, belə ki, temp 1
İndi b bu olur.
Bu harika. Bu çalışmışdır.
Amma sonra tezliklə funksiyası yekunları kimi
svop xatirəsinə səmərəli təkrar istifadə edilə bilər ki, yox
gələcəkdə bir sıra digər fəaliyyət və əsas açıq-aydın tamamilə dəyişməzdir.
Biz əsaslı bu problem həll yolu lazımdır
və bu gün biz nəhayət elə bunu bir yol olacaq
biz bir pointer deyilən bir şey təqdim edə bilər.
Biz bu problemi həll edə bilər çıxır ki,
x və y surətləri keçən deyil
əvəzində nə keçən edərək, mübadilə funksiyası, düşünürsünüz?
Bəli, ünvanı haqqında nə?
Biz, həqiqətən, çox ətraflı URL danışdı deyil
amma bu yazı taxtası mənim kompüter yaddaş təmsil əgər
əlbəttə mənim RAM ildə bytes sayı başlaya
və bu byte # 1 deyə, bu byte # 3, # 2 byte edir
byte # 4, byte # ... 2 milyard mən RAM 2 gigabaytlık varsa,
biz əlbəttə bəzi ixtiyari nömrələmə sxemi ilə gəlmək bilər
mənim kompüter yaddaş bütün fərdi bytes üçün.
>> Mən svop nə əgər əvəzinə zəng zaman
x və y nüsxədə çox keçid
niyə əvəzinə, burada x ünvanı keçmək yoxdur
burada y ünvanı, mahiyyətcə poçt ünvanı
o məlumat Əgər x və y çünki, sonra dəyişdirmək
x və y yaddaşında ünvanı,
Biz onu bir az təlim əgər, dəyişdirmək
o potensial, belə ki, danışmaq,, bu URL idarə edə bilər
x, və sayı dəyişdirmək, sonra y ünvan üçün sürücü
həqiqətən o dəyərləri özü surətlərini əldə deyil baxmayaraq, orada sayı dəyişdirmək,
biz əsas yaddaşında olan kimi bu barədə söhbət belə olsa
və bu kimi olan svop xatirəsinə güclü və C təhlükəli hissəsi
heç bir funksiyası, yerdə kompüter yaddaş toxunmaq bilər
və bu C. kompüter proqramları ilə çox xülya şeyi edə bilər ki, güclü
Siz də çox asanlıqla qıymaq bilər, çünki bu təhlükəli deyil.
Əslində, proqramları üçün ən ümumi yolları bu gün bir istismar etmək
bir proqramçı həyata üçün hələ də
o bir data icazə verir ki,
nəzərdə deyil ki xatirəsinə yeri yazılır.
>> Məsələn, o, ölçüsü 10 bir sıra bəyan
lakin sonra təsadüfən, yaddaşlı ki massivinə 11 bytes qoymaq çalışır
və artıq qüvvədə olduğu yaddaş hissələri toxunan başlamaq.
Just içeriksel bu, siz bəzi bilirik bilər ki,
proqram tez-tez, serial nömrələri və ya qeydiyyatdan düymələri üçün siz tələb
Photoshop və Word və bu kimi proqramları.
, Bir az proqramı çalıştırabilirsiniz online yerləşir, siz bəzi bildiyiniz kimi, çatlar mövcuddur
və voiture bir serial sayı artıq sorğu.
Necə işləyir?
Bir çox hallarda bu işlər, sadəcə, kompüter tapmaq olunur
kompüter faktiki adet sıfır və olanları mətn seqmentləri
seriya nömrəsi tələb yerləşir ki, funksiyası, harada
proqram çalışırken və bu yer üzerine, və ya
əsas həqiqətən saxlanılır harada həyata rəqəm bilər
bir şey istifadə ayıklama adlanır və proqram ki, yol çat edə bilərsiniz.
Bu gün növbəti bir neçə bu bizim obyektiv olduğunu demək deyil
lakin bu, çox real-dünya ramifications var.
Bir, proqram oğurluq cəlb etmək olur ki,
lakin bütün maşın kompromis də var.
>> Əslində, zaman saytları bu gün istismar olunur
və güzəşt və məlumat sızdırdığı və parol oğurlanmış olunur
Bu tez-tez bir yaddaş zəif idarə aiddir,
və ya, verilənlər bazası halda, uğursuzluq nəzərdə tutur
gələcək həftə ki, belə daha çəkişmə giriş,
indi üçün nə edə bilər ki, zərər növ yalnız bir sneak preview
çox şeyi başlıq altında necə dərk deyil.
Bu sınıq nə anlaşma haqqında gedək
bir alət ilə daha çox faydalı olacaq
proqramlar daha mürəkkəb almaq kimi.
Siz proqram bir səhv etdik Beləliklə uzaq zaman
necə bu hata haqqında getdi?
Sizin texnika sizin TF tərəfindən tədris olub, belə qədər olmuşdur
və ya yalnız özünü öyrətdi?
[Tələbə] Printf.
Siz görmək istəyirsinizsə Printf, belə printf yəqin ki, sizin dost olmuşdur
Proqram daxilində neler
yalnız printf burada printf burada printf burada qoydu.
Sonra siz run, və ekranda heyəti bütün dəstə almaq
Əgər həqiqətən proqram yanlış gedir nə anlamak üçün istifadə edə bilərsiniz.
>> Printf, çox güclü şey olmağa çalışır
lakin bir çox dərslik prosesi var.
Siz printf burada, burada printf qoymaq üçün
və bir loop daxilində qoymaq əgər 100 xətləri almaq bilər
Əgər vasitəsilə elemek ki çıxdı.
Bu hata proqramları üçün çox istifadəçi dostu və ya interaktiv mexanizm deyil
lakin təşəkkürlə alternativlər mövcuddur.
Gdb adlı məsələn bir proqramın, GNU Debugger var
siz onu istifadə necə bir az gizli deyil.
O, səmimi bir az mürəkkəb, lakin
Bu bu həftə qoymaq əgər həmin şeyi bir və növbəti
gdb kimi bir şey anlamaq üçün əlavə saat
ki, uzunmüddətli perspektivdə saat yəqin ki, onlarla xilas edəcək
belə ki, mənə bu şey necə bir iltifat verək.
>> Mən terminal pəncərə edirəm.
Mənə davam və bu proqram, buggy3 tərtib edək.
Bu günə qədər artıq var.
Biz bir müddət geri idi, və həqiqətən, sınıq var kimi mənə run edək.
Amma nə bu? Bəlkə mübadilə funksiyası qıfıllar.
Bəlkə bir və b var. Mən çox düzgün hərəkət deyiləm.
Mənə irəli getmək və bunu edək.
Daha çox yalnız mənə əvəzinə bu proqram gdb run imkan buggy3 run
və mən buggy3 çalıştırmak üçün demək gedirəm
və mən bir command line dəlil-TUI daxil gedirəm
və biz xatırlatmaq spec gələcək problemləri bu qoymaq lazımdır.
İndi bu qara və ağ interface, təkrar qədər atdı
bütün bu var, çünki ilk bir az böyük deyil
burada zəmanət informasiya, lakin ən azı tanış bir şey var.
Pəncərənin üst mənim faktiki kodu edir
və mən burada diyirləyin, əgər mənim fayl çox üst gedin qoy
və həqiqətən, bu pəncərə altında buggy3.c və xəbərdarlıq var
Mən bu gdb tez var.
>> Bu mənim normal John Harvard tez eyni deyil.
Bu mənə gdb nəzarət imkan olacaq ki, tez deyil.
Gdb bir ayıklama edir.
A ayıklama vasitəsilə gəzmək imkan verir ki, bir proqram
xətti ilə line proqram line icrası,
yolu proqram istədiyiniz bir şey etməklə yanaşı,
hətta, daha əhəmiyyətlisi, funksiyaları zəng, və ya axtarır
müxtəlif dəyişən dəyərləri ilə.
Nin irəli getmək və bunu edək.
Mən irəli getmək və gdb nin sətirinə run yazın gedirəm
Mən çap run sonra ekranın sol alt bildiriş
və mən Enter etdik ki, nə idi?
Bu sözün mənim proqram qaçdı, amma həqiqətən çox burada getmək görmədim
Mən, həqiqətən, ayıklama bildirib, çünki
zaman, müəyyən bir anda dayandırmaq.
Just run yazaraq proqramı çalışır.
Mən, həqiqətən, bir şey görmürəm. Mən bunu manipulyasiya bilməz.
>> Bunun əvəzinə mənə bunu bildirin.
Bu gdb tez mənə yerine daxil break yazın edək.
Yəni yazın nəzərdə nə deyil.
Break əsas yazın əvəzinə edək.
Başqa sözlə, mən bir breakpoint deyilən bir şey qurmaq istəyirəm
pozmaq və ya fasilə çünki tutarlı adına olan
xüsusi yer proqram icra.
Əsas mənim funksiyası adı.
Gdb olduqca ağıllı edək ki.
Bu əsas line 18 təxminən başlamaq olur ki, fiqurlu
buggy3.c, və sonra sol üst burada qeyd
b + line 18 sağ yanında.
Mən line 18 bir breakpoint qoymuşuq ki, mənə xatırladan edir.
Bu dəfə run yazın zaman, mən proqram run gedirəm
qədər qədər ki, breakpoint edib
belə proqram line 18 mənim üçün fasilə olacaq.
Burada getmək axır.
Heç bir şey baş görünür, lakin alt sol bildiriş
başlayan proqram, buggy3, buggy3.c line 18 əsas breakpoint 1.
Mən indi nə etməliyəm?
>> Qeyd edək mən, çap kimi şeylər yazmağa başlaya bilərsiniz
deyil printf, çap x, indi ki, qəribə deyil.
Biz görəcəksiniz kimi 1 $, yalnız bir maraq deyil
Əgər bir şey çap hər dəfə yeni bir $ dəyər almaq.
Bu, yalnız halda əvvəlki dəyərlərə geri müraciət edə bilərsiniz ki, var
lakin indi nə çap mənə izah edir ki, hekayə bu nöqtədə x dəyəri
yəqin 134514032 edir.
Nə? Hətta haradan gəldi?
[Işitilemez-tələbə]
Həqiqətən, bu, bir zibil dəyər zəng edəcəyik, nə, biz, hələ bu barədə söhbət etdik deyil
ancaq dəyişənlərin başlamaq səbəbi
açıq-aydın onlar siz onlara olsun ki, bəzi dəyəri var.
Amma tutmaq siz dəyişənlərin elan edə bilər ki, geri olunur
Mən sigma Məsələn bir an əvvəl olduğu kimi
həqiqətən, onlara bir dəyər vermədən.
Mən sigma burada artıq nə xatırlayıram.
Mən n elan, ancaq nə dəyər vermək idi?
Yox, mən bilirdim ki, növbəti bir neçə xətləri
GetInt n daxilində dəyər verilməsi problem qayğı olacaq.
>> Amma line 11 hekayə bu nöqtədə
və line 12 və line 13 və line 14
o bir neçə xətləri boyunca n dəyəri nədir?
C Siz yalnız bilmirəm.
Bu, ümumiyyətlə, bəzi zibil dəyər, bəzi tamamilə təsadüfi sıra
bir əvvəlki funksiya mahiyyətcə qalmış ki,
proqram çalışan kimi, axır edilmiş
funksiyası funksiyası, funksiyası, funksiyası olur ki, xatırlayıram.
Bütün bu çərçivələr, həmin funksiyaları geri yaddaş qoymaq və almaq
və yalnız kimi mən onların yaddaş nəticədə təkrar istifadə edilir pozan ilə təklif edir.
Bəli, yalnız bu proqram ki, bu dəyişən x olur
134514032 kimi zibil dəyər olan görünür
bir əvvəlki funksiya, bir mən yazdı.
Bu əməliyyat sistemi ilə səmərəli gəlir ki, bir şey ola bilər
başlıq altında bəzi fəaliyyət göstərir.
>> Okay ki, gözəl, lakin növbəti line əvvəlcədən indi edək.
Mən gdb sətirinə "next" yazın və əgər mən daxil edib
Qeyd ki, line 19 hamle aşağı işıqlandırılması
ancaq məntiqi dolayısı ki line 18
indi başa çatdı mən yenidən yazın əgər, yerinə "çap x"
İndi 1 bax ki, həqiqətən, mən bunu.
Yenə $ məhsulları gdb siz xatırladan bir yoldur
baskı tarixi siz etdik ki, nə var.
İndi mənə irəli getmək və y çap bildirin, və həqiqətən, y həmçinin bəzi crazy dəyəri
lakin heç bir böyük line 19 ildə biz bu barədə təyin etmək istəyirik, çünki
dəyəri 2, mənə yenə "gələcək" yazın edək.
İndi biz printf line istəyirik.
Mənə çap x edək.
Mənə çap y edək. Açığı, mən bu çap bir az yorğun alıram.
Mənə əvəzinə "ekran x" və "ekran y" yazın edək
və indi hər dəfə mən gələcəkdə bir funksiyanı yazın
Mən nə xatırlatdı olacaq nə x və y, x və y, x və y budur.
>> Mən də, bir kənara, növü kimi "info yerli".
Məlumat xüsusi əmr edir.
Yerli mənə yerli dəyişənlərin göstərir deməkdir.
Mən unutmaq və ya bu crazy, mürəkkəb funksiyası yalnız halda
mən və ya bir başqası info yerli sizə yazdı
Bu yerli funksiyası daxilində bütün yerli dəyişənlər nə
siz ətrafında soxmaq istəyirsinizsə qayğı bilər.
İndi printf Mənə qabaqda və yazın gedək, icra etmək haqqında "Növbəti".
Biz bu mühitdə istəyirik Çünki biz həqiqətən görən deyilik
burada icra, lakin burada bir az mangled əldə bildiriş.
Lakin, orada ekran əsas bildiriş
belə ki, burada bir mükəmməl proqram deyil, lakin mən həmişə ətrafında soxmaq bilər ki, OK
Mən istəyirsinizsə çap istifadə edərək.
>> Məni yenidən yazın edək, indi burada maraqlı hissəsi.
Hekayə Bu nöqtədə, y 2 və x 1
burada təklif və təkrar kimi
Mən komanda istifadə çünki bu avtomatik indi görünür səbəbi
ekran x və ekran y, mən növbəti yazın belə an
nəzəriyyə x və y ilə dəyişdirildikdə olmalıdır.
İndi biz artıq işi olacaq deyil bilirik ki,
lakin biz doğru nə anlamaq üçün dərin dive necə bir anda görəcəksiniz.
Təəssüf ki, Next, və y hələ 2 və x hələ 1 və mən qədər təsdiq edə bilər.
Çap x, çap y.
Həqiqətən, dəyişdirmə heç həqiqətən baş verib, belə ki, bu artıq başlamaq edək.
Aydındır svop pozuldu.
Nin yerinə yenə "run" yazın edək.
Mənə bəli demək ki, mən əvvəldən yenidən başladın istəyirik, daxil edin.
>> İndi geri line 18 oldum.
İndi x və y yenidən zibil dəyərlər bilərsiniz.
, Sonrakı, növbəti gələn.
Mən cansıxıcı almaq, mən də yalnız növbəti n edəbilərsiniz.
Siz simvol qısa ardıcıllıqla onu qısaltmaq bilər.
Swap indi pozuldu.
Yerinə gələn yazaraq belə ki, in dive edək,
Mən bu funksiya daxilində gücləndirməklə edirəm ki, indi addım yazın gedirəm
Mən onun vasitəsilə gəzmək edə bilərsiniz, belə ki, mən addım basın və sonra daxil edin belə.
Qeyd edək line 36 mənim proqramı vurğulayaraq atlamalar aşağı aşağı edir.
İndi yerli dəyişənlər nə var?
Məlumat yerli.
Biz line kazanılmış heç etdik çünki yalnız hələ heç bir şey,
belə-nin irəli getmək və deyək "növbəti".
İndi tmp, çap tmp var görünür.
Zibil dəyəri, sağ? Mən belə hesab edirəm.
Necə haqqında, çap b, 1 və 2 çap?
Bir anda, tezliklə mən növbəti yenidən yazın kimi
tmp, inşallah, 1 dəyəri götürmək niyyətindədir
tmp bir dəyəri təyin edir, çünki.
>> İndi bir, çap b çap edək,
lakin indi tmp çap və bu, həqiqətən 1 var.
Məni nə edək. Məni nə edək.
Mən svop funksiyası başa etdik.
Mən line 40 ildə daxilində hələ edirəm, mənə bir çap edək,
çap b, mən tmp nə qayğı yoxdur.
Bir və b dəyişdirmə gəldikdə svop doğru kimi görünür.
Amma indi növbəti yazın, mən, line 25 geri jump
və əlbəttə, x və çap y I növü əgər
onlar hələ də dəyişməz istəyirik, biz problem müəyyən deyil.
Amma diagnostically indi bəlkə bu gdb proqramı ilə
biz ən azı anlaşma üçün bir addım daha kazanılmış etdik
nə burada bir printf qoyaraq zibil üçün kod olmadan yanlış gedir,
printf burada printf burada və sonra təkrar o çalışan
yanlış nə həyata rəqəm çalışır.
>> Mən çıxmaq ilə birlikdə irəli getmək və bu həyata çıxmaq üçün gedirəm.
O demək olacaq ", hər halda çıxın?" Bəli.
İndi mən normal tez geri oldum və gdb istifadə bitirdim.
Bir kənara kimi, bu-TUI bayraq istifadə etmək lazım deyil.
Siz onu buraxmaq əgər Əslində, mahiyyətcə ekranın alt yarısı almaq.
Mən sonra run sonra fasilə əsas yazın və əgər
Mən hələ mənim proqram run, lakin bunu daha textually ola bilər
yalnız bir zamanda mənə cari line bir göstərir.
The-TUI, tekstoloji istifadəçi interfeysi,
yalnız bir dəfə, yəqin ki, bir az konseptual asan olan proqram daha göstərir.
Lakin, həqiqətən, Mən, sonrakı, növbəti edə bilərsiniz
və mən bir-bir xətt görmək gedirəm, və mən, həqiqətən neler görmək istəyirsinizsə
Mən siyahısını yazın və qonşu xətləri bütün dəstə bilərsiniz.
>> Biz problem 3 qoyur üçün siz baxmaq xahiş etdik ki, bir video var
olan Nate, gdb və intricacies bəzi əhatə edir
və bu, vicdanla, həmin şeyi biridir burada bəzi qeyri-cüzi faiz
gdb toxunmaq heç vaxt ki, pis bir şey olacaq
sanki bu dövr sonra daha çox vaxt sərf başa çünki
hataları aşağı chasing sonra siz ki, yarım saat / saat qoymaq əgər
bu həftə və gələcək təlim gdb rahat almaq üçün.
Printf dost idi.
Gdb İndi dost olmalıdır.
>> Gdb hər hansı suallar?
Və burada ən güclü və faydalı əmrləri bəzi tez siyahısı.
Bəli. >> Bir string çap edə bilərəmmi?
Bir string çap edə bilərəmmi? Tamamilə.
Bu yalnız integers olmaq deyil.
Dəyişən s çap s yazın simli olur.
Bu string dəyişən nə sizə göstərəcək.
[Işitilemez-tələbə]
Bu ünvan və simli özü verəcək.
Bu həm göstərəcək.
Və son bir şey, yalnız bu çox bilmək yaxşıdır, çünki.
Backtrace və çərçivə, mənə bu son bir dəfə daxil dive edək
gdb ilə eyni dəqiq proqramı.
Mənə irəli getmək və mətn user interface versiyası run edək,
əsas pozub.
Mənə davam və yenidən run edək. Burada mən.
İndi mənə, sonrakı, növbəti gələn növbəti gedək, step, daxil edin.
>> İndi qəsdən svop artıq Ben güman, lakin mən kimi Ben "Lanet olsun, x dəyəri nə idi?"
Mən artıq x edə bilməz.
Onlar daxilində deyilik, çünki y edə bilməz.
Onlar kontekstində deyilik, amma heç bir problem.
Mən backtrace edəbilərsiniz.
Ki, mənə vaxt bu nöqtəyə qədər icra edən funksiyaları bütün göstərir.
Qeyd edək ki, əsas ilə əsas altındakı bir, xətləri qədər
Burada şəkil altında olan.
Swap mübadilə burada yaddaş yuxarıda olmaqla onu xətləri yuxarıda olması,
və mən müvəqqəti əsas geri almaq istəyirsinizsə I "çərçivəsində". deyə bilərsiniz
Nə sayı? Ana çərçivəsində # 1-dir.
Mən irəli getmək və demək gedirəm "çərçivəsində 1".
>> İndi əsas geri oldum və x çap edə bilərsiniz, mən, y çap edə bilərsiniz
amma bir və ya b çap bilməz.
Demək Amma əgər mən, "Okay, bir dəqiqə gözləyin. Harada svop idi?" Bilərsiniz
Mənə davam və deyək "çərçivəsində 0".
İndi mən olmaq istədiyiniz geri oldum və bir kənara kimi
həqiqətən cansıxıcı yazaraq növbəti, sonrakı, növbəti gələn alıyorsanız kimi digər əmrləri, çox var
genellikle ", növbəti 10" kimi şeylər demək olar ki, növbəti 10 xətləri vasitəsilə addım olacaq.
Ayrıca, həqiqətən, onun vasitəsilə gücləndirməklə ilə qidalanır almaq zaman "davam" yaza bilərsiniz.
Başqa breakpoint xit qədər davam fasiləsiz proqram davam edəcək
bir loop və ya proqram aşağı aşağı.
>> Bu halda biz sonuna davam və proqram normal çıxış edib.
Bu xülya yolu, aşağı prosesdir.
Sadəcə proqram normal çıxış edib.
Video və gələcək iclaslarında ayıklama ki, daha çox.
Bu çox idi.
Gəlin burada 5 dəqiqə fasilə etmək, və biz structs və faylları ilə qayıtmaq lazımdır.
>> Əgər siz artıq bu həftə pset daxil dived varsa
, sizi bölüşdürülməsi kodu istifadə bilirsiniz
biz bir başlanğıc nöqtəsi, bəzi yeni texnika kimi sizə təmin edən mənbə kodu.
Xüsusilə, biz, strukturu, struct adlanan bu yeni söz təqdim
belə ki, biz növ xüsusi dəyişənlər yaratmaq bilər.
Biz, həmçinin, fayl I / O, fayl giriş və çıxış anlayışı daxil
və bu biz dövlət saxlaya bilərsiniz ki,
Sizin Scramble heyəti disk bir fayl üçün
tədris yoldaşları və mən başa düşə bilər ki,
nə əl oynamaq olmadan proqram daxilində gedən
Scramble oyunları onlarla.
Biz daha automatedly bunu edə bilərsiniz.
>> Bir struct Bu fikir kifayət qədər çekici problem həll edir.
Biz bir proqram həyata keçirmək istədiyiniz düşünək
ki, elə-belə, tələbələr haqqında məlumat tutar
və tələbələri, məsələn, adı ID bilər
və Harvard kimi bir yerdə ev, belə bu məlumatlar 3 ədəd var
biz ətrafında saxlamaq istəyirsinizsə, mənə irəli getmək və burada bir az proqram yazmağa başlayın edək,
stdio.h daxildir.
Mənə cs50.h. daxil edək
Və sonra mənim əsas funksiyası başlamaq.
Mən, heç bir command line dəlilləri ilə narahat deyil
və burada mən bir tələbə olsun, mən demək gedirəm
bir tələbə bir adı var, mən demək gedirəm "string adı."
Sonra, tələbə də, belə int id şəxsiyyət var demək gedirəm
və tələbə bir ev var, mən də demək gedirəm "string evi."
Mən bu kimi daha çox pakizə, bu bir az sifariş lazımdır.
OK, indi mən, "bir tələbə." Olan bir tələbə təmsil 3 dəyişənlər var
>> İndi bu dəyərləri yaşayır istəyirəm, belə ki, mənim kimi bir şey davam və deyək
"Id = 123".
Adı David almaq üçün gedir.
Gəlin evi, Mather olacaq deyə
və sonra I ("% s, özbaşına printf kimi bir şey gedirəm
kimin ID% d% s yaşayır.
İndi mən burada plug-birinin ardınca nə istəyirsiniz?
Ad, id, ev; qaytarılması 0.
OK, əgər mən haradasa burada qıfıllar
Mən bir tələbə saxlayan olduqca yaxşı proqram var.
Əlbəttə ki, bu bütün maraqlı deyil. Mən 2 tələbələri etmək istəyirsinizsə?
Heç böyük var. Mən 2 nəfər dəstəkləyir.
Mənə davam və bu qeyd və burada aşağı gedək,
və mən Kirkland yaşayan Rob kimi kimsə üçün "id = 456" demək olar.
>> Okay, gözləyin, amma bu eyni şey adlandırmaq olmaz
və bu surəti üçün gedirəm kimi görünür,
Mənə bu Davudun dəyişənlərin olacaq ki, qoy,
və mənə Rob bu bəzi surətlərini almaq imkan verir.
Biz bu Rob-nin zəng edəcəyik, lakin bu artıq işləmək niyyətində deyil
I-gözləmək çünki, in name1 və house1, id1 mənə dəyişdirmək imkan verir.
Rob, 2 2 olacaq.
Mən burada, buraya, burada burada burada, burada bu dəyişdirmək üçün var.
Doğrusu, nə Tommy haqqında? Yenə bunu edək.
Siz hələ bu bunu yaxşı yol hesab Aydındır ki, bu, deyil
belə surəti / pis yapışdırıb.
Amma bir həftə əvvəl bu həll.
>> Biz eyni data type çox hallarda etmək istəyirdi zaman bizim həll nə idi?
[Tələbələr] Bir sıra.
Bir dizi, mənə bu qədər təmiz edək.
Mənə üst özüm üçün bir otaq etmək və mənə əvəzinə burada bunu qoy edək.
Biz bu insanların zəng edəcəyik, əvəzinə mən ", int kimlikleri" demək gedirəm
və mən indi üçün bizə 3 dəstək gedirəm.
Mən, "simli adları" demək və bizə 3 dəstək olacaq gedirəm
və sonra mən ", simli ev" demək və bizə 3 dəstək gedirəm gedirəm.
İndi burada əvəzinə David öz yerli dəyişənlərin əldə ildə
biz o xilas edə bilər.
Yəni biz bu təmizlənməsi etdiyiniz yaxşı hiss edir.
Mən David [0] və adlarını [0] olacaq deyə bilərsiniz
və evlərin [0].
Və sonra biz eynilə bu saxlaya bilərsiniz Rob.
Bu aşağı burada qoyaq, o, özbaşına kimlikleri [1] olacaq.
O, adları olacaq [1]
və sonra nəhayət, evlər [1].
>> , Hələ bir az yorucu və indi bu rəqəm var
belə deyək "adı [0], id [0], evləri [0]
və bu çoğul bildirin.
Noları, kimlikleri, kimlikleri.
Və yenə, mən bunu edirəm, belə yenə, mən artıq bir daha yapışdırıb / surəti müraciət edirəm
belə odds başqa həll burada var var.
Mən yəqin ki, belə bir loop və ya bir şey ilə bu təmiz bilər
belə qısa, bir az daha yaxşı lakin hələ kimi hiss
, Mən yapışdırıb / surəti müraciət edirəm, lakin bu, hətta mən iddia
həqiqətən əsaslı düzgün həll deyil, çünki
zaman biz qərar, əgər nə bilirik?
Biz, həqiqətən, David və Rob üçün e-poçt ünvanlarını saxlanılması olmalıdır
və bu proqram başqa hər kəs.
Biz həmçinin telefon nömrələri saxlamaq lazımdır.
Biz, həmçinin, təcili əlaqə nömrələri saxlamaq lazımdır.
Biz saxlamaq istədiyiniz məlumatın bütün bu ədəd var
belə necə bunu barədə giderim?
>> Siz üst bir sıra bəyan, sonra özünüz əlavə
e-mail [0], e-mail [1]
David və Rob və s.
Amma bu dizayn əsasını yalnız bir ehtimal həqiqətən var
Mən bilmək şərəfinə sistemi istifadə edirəm ki,
[I] bir neçə serialların hər
yalnız, belə ki, həmin şəxsə aid olur
belə [0] kimlikleri sayı 123-dir
və mən adları güman gedirəm [0]
eyni şəxsin adı və evlərin [0]
Mən yaratmaq ki, müxtəlif seriallarda bütün eyni şəxsin evi və s-dir.
Amma heç bir fundamental əlaqələrin olduğunu qeyd
məlumat, id, adı və evin həmin 3 ədəd arasında,
biz bu proqram model çalışdığınız şəxs seriallarda deyil, baxmayaraq.
Diziler bunu yalnız bu proqram yoludur.
Biz, həqiqətən, bizim proqram simulyasiya etmək istəyirəm nə adam
David, bunun içərisində Rob kimi bir şəxs kimi
və ya encapsulating adı və kodu bir ev.
>> Biz birtəhər encapsulation bu fikir ifadə edə bilər
bir şəxs ID, adı və bir ev var qovuşdurmağımız
və həqiqətən bu hack müraciət deyil elə biz yalnız
ki bracket bir şey etibar
Bu disparate serialların hər eyni insan şəxs deməkdir?
Biz həqiqətən bunu edə bilərsiniz.
Mənə indi üçün yuxarıda əsas getmək və mənə öz data type yaratmaq imkan edək
ilk dəfə həqiqətən üçün.
Biz Scramble bu texnika istifadə
lakin burada, davam və bir veri növü yaratmaq gedirəm
və nə mən, bu, tələbə və ya şəxs zəng etmək üçün gedirəm bilir
və bir növü müəyyən üçün typedef istifadə gedirəm.
Mən bu bir quruluş ki gedirəm
və sonra bu quruluş, növü tələbə olmaq, biz demək lazımdır gedir
bu mənim üçün artıq tarixli bir az belə olsa.
Biz "int id." Demək lazımdır
Biz "string adı." Demək lazımdır
Sonra "simli ev" demək lazımdır
İndi kodu bu neçə satır sonuna
Mən yalnız var ki, cingilti öyrətdin
strings əlavə ints başqa bir veri növü, başqa üzüb gedirdi yanaşı, iki dəfə.
>> Vaxt line 11 Bu an kimi, tələbələr adlı yeni data növü, artıq
və indi yerdə istəyirəm tələbə dəyişən elan edə bilər
Mənə insanlar burada aşağı diyirləyin bildirin.
İndi mən bu xilas edə bilər və mən burada David geri enmək bilər
Davud üçün mən həqiqətən ki, David, demək olar
biz sanki özümü sonra dəyişən olar
növü tələbə olacaq.
Bu bir az qəribə görünə bilər, lakin bu, bütün fərqli deyil
bir int və ya simli və ya bir float kimi bir şey elan edir.
Bu, sadəcə, belə ki, indi tələbə adlandırmaq olur
və bu quruluş içərisində bir şey qoymaq istəyirsinizsə
Indi sintaksis yeni parça istifadə, lakin bu, olduqca sadə var
david.id = 123, kapital D david.name = "David"
və david.house = "Mather"
və indi burada bu məhsulları xilas edə bilər.
Biz həqiqətən çox daha yaxşı bir şəkildə proqram yeniden tasarladık bildiriş
ki, indi bizim proqram real dünya yansımasıdır.
>> Bir şəxs və ya bir şagird bir real-dünya anlayışı var.
Burada artıq bir şəxs və ya daha çox xüsusi bir tələbə C versiyası var.
Həmin şəxsin daxilində müvafiq xüsusiyyətləri var,
ID, adı, ev, belə ki, Rob mahiyyətcə aşağı burada eyni şey olur,
, tələbə rob belə, indi = 456 rob.id
rob.name = "Rob".
Dəyişən Rob adlanır ki, mənasız növ edir.
Biz x və ya y ya z adlı bilərdi.
Biz yalnız, o, semantically ardıcıl olmaq Rob adına
amma həqiqətən adı, bu sahədə özünü daxili
İndi mən bu var.
Bu da mən ağır David kodlu etdik ki, yaxşı dizayn kimi hiss etmir.
Mən ağır Rob kodlu etdik.
Mən hələ də bəzi surəti müraciət edirəm və yeni dəyişənlərin istədiyiniz hər zaman yapışdırıb var.
Bundan başqa, mən, yəqin bu dəyişənlərin hər bir ad vermək
Mən çox deyil, bu dəyişənlər təsvir istədiyiniz baxmayaraq
daha ümumi olaraq kimi tələbələr.
>> İndi bizim üçün yaxşı iş ki, fikir daxil edə bilərsiniz
əvəzinə, Siz mənə bir dəyişən adlandırılan tələbələr vermək nə bilirik ", deyə
və indi bu daha rafine edə bilərsiniz, belə ki, "İT ölçüsü 3 ola var imkan,
, elle elan David canini qurtar
və mən əvəzinə [0] burada tələbə kimi bir şey demək olar.
Mən, [0] burada tələbələr demək olar
tələbələr burada və s [0], və ətrafında bilərsiniz
və Rob ki təmizlənməsi.
Mən də indi bəlkə bir loop etdi getmək bilər
və həqiqətən, istifadəçi bu dəyərlər almaq üçün GetString və GetInt istifadə edərək.
Bu, ümumiyyətlə, pis təcrübə, çünki daimi əlavə edə bilər
Burada 3 kimi ağır kodu bəzi ixtiyari sayı
və sonra yalnız siz artıq 3 tələbələri qoymaq lazımdır ki, unutmayın.
Bu yəqin ki, mənim fayl üst müəyyənləşdirmək # istifadə etmək daha yaxşı olardı
və, belə ki, həqiqətən, mənə irəli getmək və bu ümumiləşdirmək edək ki, amil.
>> Mənə bu gün arasında olan bir misal açmaq edək
əvvəlcədən nümunələri structs1.
Bu # burada müəyyən istifadə edir ki, daha tam proqram
və biz ismarıcları 3 tələbələri malik olacaq deyir.
Burada, şagirdlərin sinif dəyər bəyan edirəm
tələbələr bir sinif belə, indi mən bir loop kullanıyorum
yalnız kodu bir az daha zərif etmək, sinif yaşayır
istifadəçi girişi ilə, belə ki, 3 olan tələbələr, i = 0 üzrə təkrarlamaq.
Və sonra mən bu versiyası istifadəçi təklif
nə tələbə ID var və mən GetInt ilə almaq.
Nə tələbə adı, ve sonra o GetString ilə almaq.
Şagirdin ev nədir? Mən GetString ilə almaq.
Və sonra burada alt Mən dəyişmək qərara
Mən bu həyata çap alıram və həqiqətən bir loop necə istifadə,
və mən kim çap edirəm?
Yorum görə mən Mather hər çap alıram
və Rob və Tommy belə və s-həqiqətən Tommy nin Mather bu var.
Tommy və David bu halda çap olunacaq, lakin bu necə işləyir?
Biz əvvəl bu funksiya görünür, lakin bu nə kimi bir tahmin etmək deyil.
Strings müqayisə edir.
>> Bu çıxır, çünki strings müqayisə necə bir az qeyri-aşkar var
o deməkdir ki 0 qayıtdıqda əgər strings bərabərdir.
Bir -1 döndürürse bir, digər əvvəl əlifba sırası gəlir deməkdir
bu başqa söz deməkdir +1 qaytarır əgər və əlifba sırası ilə gəlir
Digər əvvəl, siz online və ya man səhifə baxa bilərsiniz
məhz hansı yolla olan görmək, lakin indi bunu deyirdik edir
Bu [i]. evi "Mather" bərabər olduqda
sonra irəli getmək və s çap və s Mather edir.
Lakin burada biz əvvəl görməmişik bir şey var və biz bu qayıda bilərsiniz.
Mən heç mənim proqramları hər hansı bunu olan xatırlayıram yoxdur.
Pulsuz yəqin, yaddaş istinad yaddaş azad edilir
amma yəqin bu proqram altında bu loop nə yaddaş azad edirəm?
Mən bir şəxsin adı azad alıram kimi görünür
və bir şəxsin evi, amma niyə ki?
>> Bu GetString istifadə etdik ki, bütün bu həftə çıxır
biz cür proqramları hər biri bir səhv tətbiq etdik.
Bu bir string geri ki, dizayn ayırır yaddaş ilə GetString,
kimi David, ya Rob, və sonra istədiyiniz hər hansı edə bilərsiniz
Biz sizin üçün yaddaş qorunur etdik çünki proqram ki, simli ilə.
Bu problem GetString zəng hər zaman bütün bu vaxt
biz GetString müəllifləri, əməliyyat sistemi tələb olunub
Bu simli üçün bizə RAM bir az vermək.
Bu növbəti simli üçün bizə RAM bir qədər verin.
Bu növbəti simli üçün bir daha RAM verin.
Nə, proqramçı, bunu heç vaxt
, bizə yaddaş geri verir
Belə ki, bu bir neçə həftə proqramları bütün yazdıq
onlar istifadə saxlamaq vasitəsi yaddaş sıçrayış deyirlər nə idi
daha çox yaddaş siz GetString zəng və Gözəl hər zaman.
Ki, maraqlı deyil, çünki Biz qəsdən ilk həftə bunu
simli gələn yerləşir narahat var.
Istədiyiniz bütün söz zaman istifadəçi bu da qayıda Rob deyil
>> Amma irəliləyir biz bu barədə daha mürəkkəb almaq başlamaq üçün.
Biz yaddaş ayırmaq hər zaman daha yaxşı nəticədə geri əl.
Əks halda sizin Mac və ya PC-də real dünyada zaman zaman təcrübəli ola bilər
kompüter nəhayət dayanma nöqtəsinə daşları yerləşir simptomları
və ya axmaq spinning çimərlik top yalnız kompüter işğal edilir
bütün diqqət və şeyi edə bilməz.
Hatalar hər hansı bir sayı izah, lakin bu mümkün bugs arasında edilə bilər
şeyi yaddaş sızıntıları deyilir vasitəsi proqram ki, parça yazan kimsə
pulsuz yaddaş unutmayın etməyib istifadə etdiyiniz
o üçün əməliyyat sistemi xahiş etdi ki,
bir CS50 şey, çünki GetString istifadə edərək, lakin oxşar funksiyaları istifadə
yaddaş üçün əməliyyat sistemi xahiş edir.
Siz və ya onlar qıymaq və əgər həqiqətən ki, yaddaş qayıtmaq heç
bir proqram yavaşlatır və yavaşlatır və aşağı yavaşlatır ki, ola bilər ki, bir simptom
pulsuz zəng unutmayın halda.
>> Zaman niyə pulsuz zəng ki, Biz qayıda bilərsiniz
amma yalnız yaxşı tədbir üçün irəli getmək və bu proqram çalışan edək.
Bu structs1 adlanırdı daxil edin.
David Mather, mənə irəli getmək və structs1 run 123 edək
456, Rob Kirkland, 789,
Tommy Mather, biz Mather ildə David görmək, Tommy nin Mather edir.
Bu proqram iş ki, bir az ağlı başında olma çek edir.
İndi təəssüf ki, bu proqram ki, bir az sinir bozucu deyil
Mən 9 müxtəlif strings bütün iş tipli idi, daxil edib
Mather olmuş bildirib ki, hələ aydın Mən bu tipli çünki artıq Mather olmuş bilirdi edilmişdir.
Bu proqram daha bir verilənlər bazası kimi, əgər ən azı gözəl olardı
və həqiqətən mən yazdığınız nə xatırlayır
Mən yenidən daxil bu tələbə qeydlər heç vaxt.
Bəlkə bir registrarial sistem kimi.
>> Biz, fayl I / O, fayl giriş və çıxış kimi tanınan bu texnika istifadə edərək, yapabilirsiniz
faylları oxumaq və ya faylları yazmaq üçün istənilən vaxt deyərək bir çox ümumi şəkildə
siz funksiyaları müəyyən bir dəsti ilə bunu edə bilərsiniz.
Mənə davam və bu misal structs2.c açıq etsin,
olan demək olar ki, eynidir, lakin indi nə görmək edək.
Fayl üst Mən tələbə sinif bəyan edir.
Mən sonra, istifadəçi girişi ilə sinif yaşayır
belə kodu həmin xətləri dəqiq əvvəl istərdik olunur.
Mather olan hər kəs özbaşına əvvəl istəyirəm ki, burada aşağı diyirləyin əgər Sonra çap
lakin bu maraqlı yeni xüsusiyyət.
Kod Bu xətlər yeni, onlar burada bir şey təqdim
Resim, bütün caps, və həmçinin burada * malikdir.
Mənə həm burada, buraya bir * Bu hərəkət edək.
>> Bu funksiya biz əvvəl görməmişəm, fopen,
lakin açıq fayl deməkdir, belə ki, bu yolu nin üzsüz edək,
və bu, gələcəkdə psets ilə qayıtmaq lazımdır şey
amma burada bu xətt mahiyyətcə, verilənlər bazası adlı fayl açılır
və xüsusi o nə edə bilər ki, belə bir şəkildə açılır?
[Işitilemez-tələbə]
Sağ, belə ki, "w" yalnız əməliyyat sistemi izah edir deməkdir
Mən bunu yazmaq olar ki, belə bir şəkildə bu faylı açın.
Mən oxumaq istəmirəm. Mən yalnız baxmaq istəmirəm.
Bunu dəyişdirmək və potensial stuff əlavə etmək istədiyiniz
və fayl bazası deyilən olacaq.
Bu bir şey adlandırmaq olar.
Bu database.txt ola bilər. Bu. Db ola bilər.
Bu foo kimi bir söz ola bilər, amma özbaşına fayl bazasında adını seçdi.
Bu, biz artıq böyük ətraflı qayıda bilərsiniz ki, bir az ağlı başında olma çek edir
fp, fayl göstərici üçün bərabər NULL deyil ki, əgər bütün yaxşı deməkdir.
>> Uzun hekayə qısa, fopen kimi funksiyaları bəzən uğursuz.
Bəlkə fayl mövcud deyil. Bəlkə disk yer bitti.
Bəlkə, o qovluğa icazə yoxdur
fopen null bir şey qayıtdıqda əgər pis oldu.
Fopen null qayıtmaq deyil əgər Əksinə, bütün yaxşı
və bu fayl yazılı başlaya bilərsiniz.
Burada yeni oyun var.
Bu, mənim tələbə hər üzərində iterating olan bir loop üçün deyil
və bu, biz əvvəl etdiyiniz nə qədər benzer
lakin bu funksiya, printf printf fayl üçün fprintf adlı bir cousin edir
və yalnız 2 yolla fərqli görürük.
Biri, o, yerinə p e ilə başlayır
lakin sonra ilk mübahisə yəqin nədir?
[Tələbələr] Faylın. >> Bu fayl var.
Biz nəhayət bir fayl göstərici nə ayrı tease bilərsiniz fp adlanan bu şey,
lakin indi fp sadəcə, mən açılmışdır ki, fayl təmsil
belə fprintf burada, fayl bu istifadəçi ID çap deyil ekran deyib.
Fayl üçün istifadəçi adı deyil, ekran, çap
fayl deyil, təbii ki, aşağı burada sonra ekrana və ev
fayl bağlayın və sonra aşağı burada yaddaş pulsuz.
>> Bu versiya 2 və version 1 arasında yeganə fərq
fopen tətbiqi və * Bu fayl
və fprintf bu anlayış, belə ki, son nəticə nə nın görmək bildirin.
Mənim terminal pəncərə daxil edək.
Daxil edin, mənə structs2 run edək.
Bütün yaxşı kimi görünür. Nin structs2 təkrar edək.
123, David Mather, 456, Rob Kirkland,
789, Tommy Mather daxil edin.
Eyni hərəkət kimi görünür, amma indi ls əgər
bütün kodu arasında burada nə fayl qeyd, verilənlər bazası,
belə ki, o, verilənlər bazası gedit, və göz açmağa imkan verir.
Bu fayl formatları və sexiest deyil.
Bu, həqiqətən, satır başına satıra data xəttinin bir parça
lakin Excel və ya CSV faylları istifadə edən sizin, vergül, dəyərlər ayrılmış
Mən əlbəttə əvəzinə bəlkə bu kimi bir şey fprintf istifadə edə
Mən, həqiqətən, bir Excel fayl ekvivalent yarada bilər ki,
vergülləri, yalnız yeni xətləri ilə şeyi ayıraraq.
>> Bu halda mən əvəzinə vergülləri yerinə yeni xətlər istifadə əgər
Mən əvəzinə bu kimi baxmaq etdi, mən sözün Excel Bu verilənlər bazası faylı aça bilər.
Bir sözlə, indi biz faylları yazmaq üçün güc var ki,
İndi disk haqqında ətrafında saxlanılması, davam data başlaya bilərsiniz
biz təkrar ətrafında məlumat saxlaya bilərsiniz ki.
İndi bir az daha çox tanış olan digər şeyi bir neçə edək.
Bu C fayl üst bir typedef var
biz bir söz təmsil bir veri növü yaratmaq istəyirdi, çünki
bu cür söz deyilir ki, və daxilində bu quruluşu
İndi bir az meraklısı var.
Niyə söz yəqin bir sıra ibarətdir?
Yalnız daxilən bir söz nədir?
>> Bu simvol bir sıra var.
Bu geri geri geri simvol bir ardıcıllıqla deyil.
Bütün caps ildə MƏKTUBLARI biz özbaşına demək olur maksimum uzunluğu
biz dırmaşma üçün istifadə etdiyiniz lüğət hər hansı bir sözü.
Neden +1 var?
Bu null character.
Biz Bananagrams misal idi, biz xüsusi bir dəyər lazım Xatırladaq
izlemek üçün sözün sonunda üçün
problem set dəqiqləşdirilməsi deyir sözlər həqiqətən sona çatdı yerləşir, və kimi
burada biz bir sözü ilə boolean dəyər şərik edirik
bir bayraq ki, doğru və ya yalan danışmaq.
Biz həyata çünki siz artıq bu söz gördük
biz həqiqətən xatırlayaraq yolu lazım deyil yalnız dırmaşma söz nə
lakin siz və ya, insan, onu aşkar
tapa əgər sözü "və" yalnız yazın deyil ki, daxil edin,, daxil edin, daxil
və 3 xal, 3 xal, 3 xal, 3 xal almaq.
Biz bool yaradılması söz kara etmək istəyirəm
siz artıq gördük əgər niyə doğru və ki, biz var
bu quruluş bu encapsulated.
>> İndi aşağı burada Scramble lüğət adlı digər struct var.
Burada yoxdur typedef sözü, çünki bu halda
biz bir lüğət ideyası içine üçün lazım
və lüğət sözləri bütün dəstə şey
Bu array nəzərdə tutulmuş və necə bu sözləri çox var?
Bəli, bu dəyişən adlı ölçüsü deyir nə.
Amma biz yalnız bir lüğət lazımdır.
Biz lüğət adlı data type ehtiyac yoxdur.
Biz yalnız onlardan biri lazımdır, belə ki, C çıxır
siz typedef demək deyil əgər, yalnız struct deyirlər ki, sonra qıvrım aşırma daxili
Siz ad qoymaq, sonra dəyişənlər qoydu.
Bu dəyişən adlı lüğət elan edir
Bu kimi görünür.
Əksinə, bu sətirləri söz adlı reusable data strukturu yaradır
biz yaratdığı kimi, siz birdən çox kopyasını yaratmaq bilər ki,
tələbələrin çox surətləri.
>> Bu, son nəticədə bizə nə imkan vermir?
Mənə asan dəfə isə demək asan Məsələn, qoy geri gedək,
və compare1.c, deyək, mənə açmaq bildirin.
Əl Burada problem həqiqətən geri peel edir
bir simli qat və bu təlim təkərlər off alaraq başlamaq
bir string bütün bu dəfə çıxır, çünki
biz həqiqətən həftə 1-ci bir ləqəb söz kimi deyil,
sinonimi bir az daha sirli görünür ki, bir şey üçün CS50 kitabxana,
char *, və biz əvvəl bu ulduz gördüm.
Biz faylları kontekstində o gördüm.
>> İndi bir müddət bu detal gizlətmək olduğunuz niyə indi bax edək.
Burada compare1.c adlı fayl edir
və yəqin, s t, 2 strings üçün istifadəçi soruşur
sonra, line 26 bərabərlik həmin strings müqayisə etməyə çalışır
onlar deyir bərabər edirsinizsə və "Siz, eyni şey tipli"
və onlar bərabər deyilik əgər "Siz müxtəlif şeyləri yazılmış." deyir
Mənə davam və bu proqram run edək.
Mənim mənbə qovluğuna girin ki, bir compare1 edir. Tamam tərtib.
Mənə compare1 run edək.
Mən zoom daxil olacaq.
Bir şey söyləyin. HELLO.
Mən bir şey demək lazımdır. HELLO.
Mən mütləq fərqli şeylər yazın vermədi.
>> Sizi bir daha bu cəhd edək. Bye Bye.
Əlbəttə müxtəlif deyil, burada neler belə?
Yaxşı, həqiqətən line 26-nə nisbətən olunur?
[Işitilemez-tələbə]
Bəli, belə bir simli, data növü, ağ yalan cür olduğunu çıxır.
Simli a char * deyil, char * nədir?
A char *, necə deyərlər, bir göstəricisidir
və bir pointer, səmərəli bir ünvan
məbləğində yaddaş yeri, və HELLO kimi bir sözlə yazdığınız nə varsa,
strings keçmiş müzakirələr geri
bu sözü kimi HELLO edir.
HELLO kimi bir söz təmsil unutmayın
bu kimi simvol bir sıra kimi
və sonra sonunda xüsusi xarakter ilə null xarakter adlı
olan \ işarə kimi.
Simli əslində nədir?
Bu yaddaş çox chunks Qeyd edək ki,
Siz bütün simli baxmaq dəfə və əslində, bu, sonunda yalnız məlumdur
xüsusi null xarakter axtarır.
Amma bu mənim kompüter yaddaş yaddaş yığın olduqda,
Gəlin özbaşına bu simli yalnız uğurlu var, deyirlər ki,
və mənim kompüter RAM əvvəldən yerləşdirilmiş olmuşlar.
Bu byte 0, 1, 2, 3, 4, 5, 6 ...
>> Mən GetString kimi bir şey demək və mən simli s = GetString nə zaman
həqiqətən nə geri var?
Bu son bir neçə həftə üçün nə həqiqətən s saxlanılır alındığını
özlüyündə bu simli deyil, bu halda nə saxlanılır alındığını edir
GetString həqiqətən nə çünki sayı 0
fiziki bir string geri deyil olunur.
Bu da həqiqətən konseptual mənada etmir.
O geri bir sayı nə.
Bu sayı, yaddaş HELLO və ünvanı
və simli s, sonra biz geri peel bu qat, simli həqiqətən mövcud deyil əgər.
Yalnız CS50 kitabxana bir sadələşdirmə var.
>> Bu, həqiqətən, char * adlı bir şeydir.
Nə HELLO kimi, bir sözlə, çünki Char mənada edir?
Bəli, bu chars bir sıra simvol bir sıra var.
Char *, bir xarakterli ünvanı mə'nasını
belə nə bir string qayıtmaq deməkdir?
Simli qaytarılması gözəl, sadə yol
deyil deyil, mən 5 və ya 6 müxtəlif bytes qayıtmaq necə anlamaq üçün cəhd
mənə olan byte üçün ünvan geri edək?
İlk.
Başqa sözlə, mənə xatirəsinə xarakterli ünvan verək.
Yəni, char * təmsil nə yaddaşında bir xarakterli ünvan var.
Dəyişən s zəng.
Mən özbaşına etdiyi xüsusi ünvanı, 0 olduğunu s Store,
yalnız şeyə sadə saxlamaq üçün, lakin əslində ümumiyyətlə böyük bir sıra.
>> Bir dəqiqə gözləyin.
Yalnız mənə ilk xarakterli ünvan verilməsi istəyirsinizsə, necə ünvan nə bilirik
İkinci xarakteri, üçüncü, dördüncü və beşinci?
[Işitilemez-tələbə]
Simli sonunda bu lazımlı oyun yolu ilə olduğu Siz yalnız bilirəm
siz kimi printf bir şey istifadə edərkən, nə printf sözün, onun dəlil kimi görür
biz bu% s tutucu istifadə Xatırladaq ki, sonra keçmək
simli saxlanılması olan dəyişən.
Ne həqiqətən keçən etdiyiniz simli ilk xarakterli ünvan.
Printf sonra ki, ünvan aldıqdan sonra loop və ya bir müddət loop üçün istifadə
Misal üçün, 0, belə ki, mənə indi bunu bildirin
printf ("% s \ n" s);
Mən zəng zaman printf ("% s \ n" s); nə mən, həqiqətən, ilə printf təmin alıram
bu ixtiyari halda H. olan s ilk xarakterli ünvan olduğunu,
>> Necə printf ekranda göstərmək üçün dəqiq nə bilir?
Həyata keçirən şəxs printf loop üçün bir müddət loop və ya həyata
bu xarakterli xüsusi null xarakter bərabər olduğunu deyir?
Əgər, o, çap. Bu necə biri?
Çap deyilsə, yazdırın, çap, çap.
Oh, bu bir xüsusi edir. Çap Stop və istifadəçi qayıt.
Və ki, sanki başlıq altında baş edilmişdir ki, bütün
və ki, bir sinif ilk günündə həzm çox çox
lakin indi həqiqətən anlaşma hər şey binasında blok var
ki, bizim kompüter yaddaş daxilində davam edir
və nəhayət bir az köməyi ilə bu ayrı dolaşmaq lazımdır
Stanford dostlarımızın biri.
>> Stanford professor Nick Parlante bu gözəl video ardıcıllıqla həyata
təqdim edən müxtəlif dillərdə bütün növ olan
Bu kiçik Claymation xarakter Binky.
Bir neçə ikinci sneak preview ilə eşitmək üzeresiniz Səs
Stanford professor ki, siz əldə etdiyiniz
Bu hüquq yalnız 5 və ya 6 seconds indi,
lakin bu gün biz bağlamaq lazımdır hansı qeyd
və Çərşənbə günü başlayacaq.
Mən sizə Binky, önizleme ilə Pointer Fun verir.
[♪ ♪ Musiqi] [Professor Parlante] Hey, Binky.
Uyan. Bu göstərici əyləncə üçün vaxt var.
[Binky] Nə olub? Göstəricilər haqqında məlumat əldə edin?
Oh, goody!
>> Biz Çərşənbə günü görəcəksiniz.
[CS50.TV]