[Powered by Google Translate] Розділ проблемі Set 2: Hacker видання Роб Боуден, Гарвардський університет Це CS50. CS50.TV Так от, я Роб. Я старший в Kirkland. Це мій третій рік TFing CS50. Це перший раз, коли ми міняємо від традиційних лекцій стиль розділу, де ми тільки частково відгук, що відбулося в лекцію, а потім ви, хлопці, задавати питання, Тепер, щоб бути набагато більше проблем на основі, де ми використовуємо простору, і - О, так ідея піти на заслання, що Я послав тебе, і тоді ви будете в моєму просторі. Хто-небудь немає ноутбука? Добре. Таким чином, ми будемо використовувати це, і ми збираємося робити проблемами живуть у розділі і обговорювати їх і з'ясувати, що сталося і я міг би підтягнути деякі з вашого коду, і я міг би обговорити ваші ідеї. Так хто-небудь з працею? Ви можете спілкуватися на сторону, я не знаю, якщо ми будемо мати підстави для цього. Тепер, як і в попередньому supersection, якщо ви були в цьому класі, ви знаєте, що це о. На всіх множин P там буде в цих розділах. Таким чином, P-набір 2, специфікації, я думаю, ви бачили це на P-1 вже безліч. Але ми можемо подивитися на P-комплект 2 за те, що ми збираємося йти на сьогодні. І ви побачите розділ питань. Таким чином, це буде у всіх P-множин, там буде розділ питань. До цих пір ми говорили, "Розглянемо цю можливість на практиці". Ви не буде запропоновано представити цю програму. Ідея полягає в тому, що це, як передбачається, вид допомогти вам почати з проблемою набору. Я думаю, на Hacker видання, багато з них повинні бути просто нові, цікаві речі, щоб вчитися. Вони не можуть бути безпосередньо застосовні до проблеми набір. І зараз ми не мають ви уявити їх, але в теорії, для подальшого безлічі проблем, ви можете уявити їх, і таким чином, ви можете прийти до розділу або подивитися розділ, щоб отримати відповіді на питання, чи ви можете просто отримати їх на свій розсуд Якщо ви не відчуваєте, як насолоджуватися своєю присутністю. Так що - я думаю, це перше. Ох. Крім того, в цих розділах питання ми і ви будете задавати питання про шортах. Так що я думаю, в теорії, ви повинні дивитися на цих до приїзду в розділі але це прекрасно, якщо ви цього не зробите, ми підемо на них у будь-якому випадку. Таким чином, ми можемо почати з цим: «Як в той час як цикл відрізняється від зроби той час як цикл? Коли остання особливо корисно? " Таким чином, у кого-небудь - [Студент] зроби той час як цикл буде завжди виконувати принаймні, один раз. Так. Так що є різниця. Час циклу - I'll просто зробити це тут - у той час як петля, маємо умову прямо тут, в той час як зроби той час як, у вас немає умов поки ми не отримаємо тут. І тому, коли ваші програми виконується, і він потрапляє в той час як цикл, він одразу перевіряє, якщо це умова правдиве. Якщо ця умова не виконується, це буде просто пропустити цикл повністю. Зроби той час як цикл, так як програма виконується, він добирається до "робити". Нічого не відбувається в цей момент, просто продовжує виконуватися. Потім, коли вона потрапляє на ", а", якщо умова істинна, це буде цикл повернутися і зробити це знову і знову, і знову, поки умова не виконується, а потім просто провалюється. Таким чином, різниця в тому, що це може пропустити з самого початку. Це обов'язково виконується один раз і потім може виконати більше разів, якщо умова залишається в силі. Таким чином, у той час як цикл буде робити це тільки один раз, або - в той час як петлі - ми не повинні робити це на всіх, оскільки, як тільки ми доберемося до нього, якщо умова помилкова, ми просто відразу перейти на нього. Беручи до уваги, зроби той час як цикл, ми будемо виконувати його один раз, обов'язково. Потім, коли ми дійдемо до стану, ми перевіряємо, якщо це правда чи брехня. Якщо це правда, ми зробимо це знову, якщо воно помилкове, ми просто продовжуємо йти. Так, коли останній особливо корисно? Тому я можу сказати, що в сукупності 4 роки, 3 роки, що завгодно, що я займався програмуванням, я використовував це, як, по 10 разів. І, напевно, 5 з них знаходяться в CS50, коли ми представляємо робити, в той час як петлі. Тому, коли ви використовували робити-то час петлі? Коли - так? [Студент] Коли ви намагаєтеся отримати користувача введення, або те, що ви хочете перевірити - Так. Так що, в той час як петлі, що вводить користувач, великий. Ось чому на перших наборів проблема пари, коли ви хочете запитати в користувача, як, "Дайте мені рядок," ви не можете продовжувати, поки ви не отримаєте цю рядок. І тому ви, обов'язково, необхідно звернутися за рядком принаймні, один раз. Але тоді, якщо вони відповідають щось погане, то ви повинні циклу назад і запитати ще раз. Але крім введення даних користувачем, це дуже рідкісне, що я стикаємося з випадком , Де я хочу, щоб петля "принаймні один раз", але, можливо, більше. Питання або -? Хто-небудь використовував зроби той час як цикл-небудь ще? Добре. Таким чином, наступний: "Що ж неоголошений ідентифікатор зазвичай вказують, якщо видаваних дзвін? " Так який код я можу написати, щоб отримати «неоголошений ідентифікатор? [Студент], що х = 2? Так що ми можемо тільки спробувати його тут, х = 2. Ми будемо працювати це - ой, я не клацніть по ньому. І ось ми отримуємо - все в порядку. "Використання неоголошених х ідентифікатор". Так от неоголошений ідентифікатор, змінна. Це часто називають змінною ідентифікатор. Таким чином, вона може не знати, що це насправді змінна, вона не знає, що це таке. Так що це ідентифікатор. Так чому ж це неоголошена? Так. Таким чином, щоб внести ясність у термінологію, оголошення змінної це коли ви говорите "Int х", або "у рядки," що завгодно. Ініціалізації змінної або призначення змінної, це всякий раз, коли ви говорите "х = 2". Таким чином, ми можемо зробити це в окремих кроків, Int х, х = 2, а поки - ми можемо мати купу речей тут - але до цієї лінії відбувається, х ще не ініціалізований, але вона була оголошена. І тому, очевидно, можна зробити це в 1 лінію, і тепер ми оголошуємо і ініціалізації. Питання? І, нарешті, "Чому шифр Цезаря не дуже безпечно?" Отже, по-перше, хто-небудь хочу сказати, що шифр Цезаря? [Студент] Caesar Cipher тільки те, що Ви карті, ви перекласти кожну букву, певну кількість букв перейти і повернутися за, і це не дуже безпечно, тому що є тільки 26 можливих варіантів, і ви просто повинні спробувати кожне 1 з тих, поки ви не отримаєте його. Ох. Так що, я повинна повторювати? Шифр Цезаря, it's - я маю на увазі, ви будете мати справу з його проблемами, що ви - або я думаю, що і стандартна редакція поставленого завдання це не на хакерської видання. Таким чином, на стандартному виданні поставленого завдання, ви отримаєте повідомлення типу: "Привіт, світ" і у вас також є ряд як 6, і ви приймаєте це повідомлення, і кожен індивідуальний характер, Ви поверніть його на 6 позицій в алфавіті. Таким чином, 'H' в Привіт стане ч-і-т-к-л-м-н. Таким чином, перший лист буде п. Ми робимо те ж саме з електронною. Якщо у нас є, начебто, г або щось, то ми закінчимо назад до '. Але кожен персонаж отримує циклічне 6 символів пізніше в алфавіті, а це не дуже безпечно так як є тільки 26 можливостей для скількома способами можна обернути одну букву. Таким чином, ви можете просто спробувати всі 26 з них, і, мабуть, протягом досить тривалого повідомлення тільки 1 з можливих 26 речей буде розбірливо, і розбірливо, ніхто не збирається бути вихідне повідомлення. Так що це не дуже хороший спосіб шифрування взагалі нічого. Поза всякою зв'язку з тим, шорти, "Що таке функція?" Так що ж таке функція? Так. [Студент] Це як окремий шматок коду, який ви можете подзвонити, щоб пройти, а потім отримати повертається значення завгодно. Так. Так я відповім на нього також відповісти на наступний - чи повтор від також просто відповівши на наступний. Ви можете використовувати функції, а не просто скопіювати і вставити код знову і знову. Просто візьміть цей код, поклав його в Fuction, а потім ви можете просто викликати функцію де б ви не були копіювання і вставки. Таким чином, функції корисні. Так що тепер ми будемо робити актуальних проблем. Перший. Так що ідея першого, ви передаєте його рядки, і незалежно від того, - або ж вона сказати, що всі рядкові? Не сказати, що все в нижньому регістрі. Таким чином, повідомлення може бути що завгодно, і - о, ні. Це робить. "Для простоти можна вважати, що користувач буде тільки вхід малі літери та пробіли". Таким чином, ми передаємо йому повідомлення з тільки малі літери, а потім ми чергувати між капіталом і рядкові - ми змінимо рядок в заголовні і рядкові, чергуючи. Тому, перш ніж дати вам другий навіть зануритися в проблему, що перше, що ми повинні зробити? Ах, який же я просто натисніть на? О, я просто натиснув на електронну тут. Тому перше, що ми повинні зробити, - я дивлюся не той? Чи є це частиною цього? Ні, це все ще там, хоча. Гаразд, все ще тут. Зараз ми не можемо припустити - Так. Тут ми не можемо припустити, що це тільки рядкові та прогалини. Так що тепер ми маємо справу з тим, що листи можуть бути якими ми хочемо їх бачити. І тому перше, що ми хочемо зробити, це просто отримаєте повідомлення. Нам просто потрібно, щоб отримати String, String S = GetString, добре. Тепер ця проблема, є кілька способів зробити це. Але ми збираємося хочете використовувати бітові оператори тут. Є люди, які або не були в supersection, або щось, і не знаю, що побітове операторів? Або, як вони ставляться до ASCII в будь-якому випадку? [Студент] Я не був на supersection, але я знаю, що побітове операторів. Добре. Тоді я не повинен йти з основ з них, але я поясню те, що ми збираємося хочете використовувати тут. Таким чином, 'A': Двійкове подання капітал, число 65. Я просто буду дивитися на - 41 буде 01000001. Так що повинно бути 65 в десятковій, так що це двійкове представлення символу столиці A. Тепер, двійковим поданням символів нижнього регістру 'а' буде те ж саме, майже. Це - 6, да. Це правильно. Таким чином, двійковий капіталу, двійкові рядкова '. Так зауважити, що різниця між А і 'а' це один біт. І це трапляється, 32 біт, біт, що представляє число 32. І це має сенс, оскільки є 65; 'а' 97. Різниця між ними 32. Отже, тепер ми знаємо, що можемо перетворити від А до 'а', беручи і бітові ORing це, з - яка виглядає як 1. Це побітове АБО, з 00100000, і що дасть нам ". І ми можемо отримати від 'А' до логічного множення на Побітового з 11, 0 в тому місці, 11111. Таким чином, це дасть нам саме те, що 'а' було, але скасувати цю окремого біта, так що нам доведеться 01000001, я не знаю, якщо я нарахував права. Але ця техніка Побітового ORing, щоб отримати від столиці в нижній регістр, і бітові операції AND, щоб отримати з нижнього регістра в столицю не тільки для А. Всі листи, K проти K, Z проти г, всі вони тільки збираються відрізняються цьому один біт. І тому ви можете використовувати це, щоб змінити будь малої літери будь літери, і навпаки. Добре. Так простий спосіб отримати з цього - так замість того, щоб написати все, що є 1011111 - легкий спосіб представлення цього числа, а це не один що я пішов в supersection, але тильди (~) є ще одним побітового оператора. Що ~ робить це дивиться на бітове представлення. Давайте візьмемо будь-яке число. Це лише деякі двійкові числа, і те, що робить ~ це просто перевертає всі біти. Так що це було 1, тепер 0, то це 0, Зараз 1, 010100. Так що це все ~ робить. Таким чином, 32 буде номер - позбутися цього - 32 так буде номер 00100000, і так ~ цього буде цей номер тут, що я операція AND'' с. Чи всі бачили? Це досить поширена, як і коли ви хочете, щоб з'ясувати для подальшого речі, які ми могли б бачити, коли ми хочемо побачити, якщо - або ми хочемо, щоб всі, кожен набір біт за винятком 1 Ви схильні робити ~ з небагато, що ми не хочемо встановити. Таким чином, ми не хочемо в 32 біт, тому ми ~ 32. Добре. Так що ми можемо використовувати всі тут. Гаразд, це прекрасно, якщо ви не зробили, ми повинні повільно ходити по сукупності або ходити з цього приводу, так - через це. Пройдіть через це. Таким чином, у нас є рядок, і ми хочемо, щоб цикл по кожному символу в рядку, що й робити щось для цього. Так як же ми цикл по рядку? Що ми повинні використовувати? Я не збираюся робити це тут. Так. Так що у мене є ітератор, і він сказав, що це, але як я можу знати, скільки символів в рядку? STRLEN (и), то я + +. Так що я тут зробив, це не кращий спосіб робити речі. Хто-небудь знає, чому? Тому що ви перевіряєте на мові рядок кожного разу. Таким чином, ми збираємося хочете перемістити StrLen, я міг би сказати тут, внутр довжина = StrLen (и), і тоді я <довжина, а в разі, якщо ви не бачили це раніше, Я міг би також зробити Int = 0, довжина = StrLen (и). І так це дещо краще, так як тепер я обмежила сферу змінної довжини всього цього 'для' цикл, замість того, щоб оголосити його до і що воно завжди існує, і в разі, якщо ви не помітили, чому це погано, або чому оригінальна було погано, it's - почати з циклу. Я перевірив стан. Це я <довжина з? Таким чином, довжина с, давайте попрацюємо з "привіт" весь час. Таким чином, довжина S, Н-е-л-л-о. Довжина 5. Так що я = 0, довжина 5, так що я не <5, так що цикл триває. Тоді ми йдемо знову. Ми перевіряємо стан. Це я <довжина Привіт? Так давайте перевіримо довжину привіт. Н-е-л-л-о. Це 5, я не <5, тому ми продовжуємо знову. Таким чином, ми розраховуємо, ми розраховуємо привіт, для кожної ітерації, навіть не думав, що це ніколи не зміниться, він завжди буде 5. Так що ми просто пам'ятаємо 5 до передньої, і тепер все краще. Таким чином, ітерації по всій рядку. Що ми хочемо зробити для кожного символу рядка? [Студент кажучи, нерозбірливо] Так. Таким чином, якщо персонаж знаходиться неалфавітних, то ми просто хочемо, щоб пропустити його. Тому що ми дбаємо лише про букв алфавіту, ми не можемо скористатися номером. Так як ми можемо це зробити? Таким чином, наші умови, тому якщо ми хочемо щось - перевірити, якщо він алфавітному порядку. Так як же нам перевірити це? [Студент] Ви можете просто використовувати функцію альфа. Це включено в будь-який з цих або будь-яких включають як, char.h, чи що? Давайте не будемо використовувати це альфа функції, і використовувати явне - так у нас з [я], , Що є восьмим характеру з, пам'ятайте, що рядок являє собою масив символів, так восьмому характеру з. Тепер, якщо це буква, ми знаємо, що повинно бути в певному діапазоні. І що це за дії? Так. Таким чином, якщо з [я] становить ≥ 65 років, і з [я] становить ≤ 90, що я повинен робити замість цього? Так. Таким чином, ви повинні бути абсолютно навіть не потрібно знати ASCII значення ні про що ніколи. Ніколи не думайте з чисел 65, 90, 97 і 102, або що це таке. Вам не потрібно - 112 - ви не повинні знати тих, хто взагалі. Це неправильно теж. Використовуйте тільки одинарні лапки символів, одним константи цитати. Таким чином, 'A' і менше 90 є "З." І це значно краще - я не знаю, з верхньої частини моєї голови, що Z = 90. Я знаю, з верхньої частини моєї голови, що 'Z' є столицею Z. Так що, поки це знаходиться в діапазоні капіталу до капіталу Z, або ми можемо перевірити нижньому регістрі, Або, якщо вона знаходиться в діапазоні ≥ 'а' і ≤ р. Так що це наша умова. Стиль, де поставити ці речі міняється. Я зроблю це, як це. Отже, що ж ми хочемо зробити? Ми знаємо, що цей лист характер, алфавіту. Так що ми повинні чергуватися Чи це тепер має бути букви або малої літери. Як ми відстежуємо, один з яких ми хочемо бути? [Студент голосу, нерозбірливо] Так що, так, але дозвольте мені перевірити. Модуль 0-2 було сказано, була пропозиція викинуті, і я з цим згоден. Крім зауважити, що, наприклад, - це випадок? Так. Це кожен другий, але ми не можемо модуль 2 я, або я модулем 2, так як зауважити, що E є столицею і 'а' в нижньому регістрі? Але є простір, що розділяє їх? Таким чином, вони будуть такими ж, по модулю 2, але вони різні випадки. [Студент питання, нерозбірливо] Так. Так що ми просто будемо тримати рахунки. Ми могли б також зробити це тут, якщо ми хотіли, то могли б отримати трохи громіздким в циклі заяви, я покладу його тут. Так соіпЬ = починається з 0. І ось тепер, я буду вважати, скільки літерні символи, які ми мали. Таким чином, ми неминуче будемо розраховувати + +, так як ми знайшли іншого алфавіту. Але, так що тепер ви говорите, якщо кількість модулю 2. Так що, якщо кількість модулю 2? Ох. Я зроблю == 0 на даний момент. Ми також будемо йти з цього приводу. Таким чином, якщо кількість мод 2 == 0, то що? [Студенти відповідь, нерозбірливо] Таким чином, ми хочемо, щоб він в кінцевому підсумку у верхньому регістрі. Є 2 випадках; прописних і рядкових є 2-х випадках. Так що, якщо ми в нижньому регістрі, ми повинні зробити це верхній регістр. Якщо це прописні нам не потрібно нічого робити. Але є спосіб - shouldn't було перевернуто - що ми навіть не потрібно перевірити, чи є це Прописна або рядкова? Що ми можемо зробити, щоб завжди переконатися, що ми завжди в кінцевому підсумку у верхньому регістрі? Так зауважити, що ми зробили в нижньому регістрі ";, що якщо б ми зробили це точно такий же речі у верхній регістр? Чи є верхній регістр зміни, або ж зміна значення? Так. Таким чином, будь-яка буква побітового операції AND з ~ 32 буде той же символ верхнього регістру тому що для будь-якого символу у верхньому регістрі 32-й біт не встановлений. Таким чином, якщо ми хочемо принести характеру з [я], ми хочемо, щоб він став рядкових або прописних букв. Так що, якщо це було в нижньому регістрі, то тепер прописними літерами, якби це був верхній регістр, він як і раніше прописними літерами, ось і все. Я сказав про це в supersection: Ви можете використовувати 32, якщо ви хочете, але я волію робити "а" -, замість того, щоб просто 32, тому що це може бути будь-яка інша трохи. Після того, як 32-розрядні, це може бути будь-який з них, або у нас не буде достатньо Номери для представлення всіх символів. Так що, якщо ви отримуєте 32 біт, це може бути 64 біт, це може бути 128 біт. Будь-який з цих бітів може бути небагато, що відмінність між великими і малими літерами. Я не повинен знати, що це 32 біт. Я можу використовувати цю "а" - щоб отримати трохи відрізняється, що між двома без необхідності покладатися на магічне число, яке дорівнює 32. І ось тепер, інакше розраховувати було дивно, так що я хочу робити? [Відповіді студентів, нерозбірливо] [Студент] Що це? Я зроблю це за 1 секунду. Так що тепер, якщо я хочу - я хочу, щоб переконатися, що персонаж знаходиться зараз в нижньому регістрі, і так я можу або на 32, і "'32 сенс - A. Але зауважте, з тих же міркувань, що і попередній, що якщо Лист було вже нижньому регістрі, а потім на 32 ORing просто тримає його нижній регістр. Він не змінив первісний характер. Але тепер у мене немає, щоб не сказати: "Якщо в нижньому регістрі, просто забути про нього, якщо це прописні, а потім змінити його ». Це набагато зручніше робити це. [Студент] Чи буде ця стратегія віднімання із заголовних рядкових роботу, якби не 32? Якби це було, начебто, 34 або щось? Таким чином, ви повинні знати, що різниця між 2 є -? >> 1 біт. Це може бути більше, ніж 1 біт, поки всі біти нижче цієї позиції збігаються. Так що нам потрібно принаймні 26 символів - або, існує 26 знаків. Так що нам потрібно принаймні 26 номерів являють собою різницю - Різниця між і'' повинен бути не менше 26, інакше ми б не були представлені всі номери капіталу. Це означає, що, якщо ми почнемо з 1, він збирається використовувати всі ці біти, Всі ці перші 5 біт, представляють всі через Z. Ось чому наступний біт, або цей біт, наступний біт є той, який обраний, щоб розрізняти і '.' Це також, чому в ASCII таблиці, існує 5 символів поділу великими літерами від малих літер. З тих пір є символами, що додаткові 5 виховує 32-буття різниця між ними. [Студент] Таким чином, ми можемо це зробити, тому що ASCII розроблена таким чином. Так. Але ASCII - різниця може бути також обидва цих біта. Мовляв, якщо були 10000001 та 'а' був 11100001 - я забув, що завгодно. Але якби це було, то ми все ще можемо використовувати'' - A. Це просто зараз різниця між А і 'а', як і раніше ці 2 біти. Я думаю, що це написано 48. Це 32 + 64? Я думаю, що це? Він все одно буде 2 біти, кожен окремий символ, начебто, Z і Z, K і K, вони досі точно такий же біти, за винятком тих 2 біти. Так що, поки що це завжди так, незалежно від того, якщо ми використовуємо ASCII або інші системи, поки є тільки певна кількість бітів, які різні для кожного персонажа, те, що добре працює. Це просто, що 32 була створена тому, що це перший, який ми могли б використовувати. >> Cool. Я волію, у випадку, якщо ви не бачили, якщо блок є лише одного рядка, Ви можете позбутися від фігурні дужки, так що я волію робити це. Крім того, ви знаєте, як ми можемо робити такі речі з [я] + = 1? Ви також можете зробити з [я] побітове І = 32. І побітове OR = 32. Крім того, розраховувати мод 2 == 0. Тому пам'ятайте, що - я не буду писати це - будь-яке відмінне від нуля значення істинно, і 0 невірно. Таким чином, "якщо кількість модулю 2 == 0" такий же, як кажуть, "якщо не рахувати тієї 2". Я б, напевно, просто скасував ліній і сказав: "якщо кількість модулем 2, у OR 1, ще у AND 1 ", так що мені не потрібно" ні ". Але це працює так само добре. А що ще я можу тут робити? Ви можете поєднувати їх з потрійною, якщо ви хотіли, але потім, що б просто зробити все брудніше і, ймовірно, більш важким для читання, тому ми не будемо цього робити. Будь-який, є які-небудь інші пропозиції? Це все, що проблема просив? Ах так. Так що позбутися від цих порожніх рядків, тепер ми будемо друкувати F,% и бути один для рядка, Ми будемо друкувати F, S. Тепер давайте запустимо його. Я зробив щось не так? Це \ ", я хочу н. Добре. Тепер ми будемо запускати його. Це, напевно, кричати на мене. STRLEN в string.h. Так що це хороша річ про Clang це говорить вам, що він знаходиться в, замість GCC, який просто говорить: "Гей, ти забув щось, я не знаю, що це було". Але це скаже мені: "Ти повинна включати string.h". Так що я не підкажуть ні на що, так що це нічого не кажу. Але ми будемо робити їх, наприклад, "Спасибі 4 Додати". Це виглядає правильно. Ура. Таким чином, повертаючись до вашої основної, я майже ніколи не роблять цього. Це необов'язково. А головне це єдина функція, для яких він не є обов'язковим. Якщо ви нічого не повертають від головного, то передбачається, що ви хотіли повертати 0. Питання? Добре. Так що тепер друга проблема. "Згадайте з другої лекції тиждень 2 про те, що заміна значення 2 змінних, передаючи ці 2 змінні функції (навіть якщо називають своп) точно не працює, принаймні, не без «вказівники». І ігнорувати покажчики, поки ми не отримаємо на них. Ми хочемо, щоб поміняти 2 змінні, ми не використовуємо функцію зробити це. Ми все ще збираємося зробити це в головному, як він говорить. Але використовувати ці 2 змінні, ми не хочемо використовувати тимчасову змінну. Є 2 способи зробити це. Ви можете зробити це за допомогою традиційних бінарних операторів. Так хто-небудь знає швидкий і брудний спосіб зробити це? Це дійсно може зайняти хвилину мислення. Якщо у мене є - Я поставив завдання вгору, як вони просять. Так що, якщо у мене є 2 змінні, A, який знаходиться всього в ціле що вони дають мені, і сумою змінних B, яка є ще одним цілим, що мені дають. Так що, якщо у мене є ці 2 змінні, тепер я хочу, щоб поміняти їх місцями. Традиційно, за допомогою регулярних бінарних операторів, я маю на увазі, наприклад, +, -, ÷. Чи не бітові оператори, які діють на двійковий. Таким чином, використання -, +, ÷, і всіх тих. Ми могли б помінятися, роблячи щось подібне = A + B, і B = A - B, A = A - B. Таким чином, перевірка справності, і тоді ми побачимо, чому це працює. Скажімо = 7, б = 3, то A + B буде 10. Так що ми тепер вважаючи а = 10, а потім ми робимо B = A - B. Таким чином, ми робимо B = A - B, який буде 7, а B = A - B знову, або = A - B. Який буде 10 - 7, яка є 3. Так що тепер, правильно, "а" було 7, б було 3 роки, і в даний час знаходиться в 7 б і 'а' 3. Так що вид має сенс; «а» є поєднання 2-х номерів. На даний момент, 'а' це поєднання, а потім ми вирахування з оригінальних б, а потім ми відніманням, що було первинним ". Але це не працює для всіх номерів. Щоб переконатися в цьому, давайте розглянемо систему, тому ми зазвичай думаємо про цілих чисел у вигляді 32 біт. Давайте працювати на те, що, як тільки 4 біти. Сподіваюся, я придумав хороший приклад прямо зараз. Так от, я знаю, це буде нелегко. Скажімо, наші 2 номери 1111, і 1111, так що ми в двійковій прямо зараз. На самому знаків після коми, якщо ви хочете думати про нього, таким чином, = 15 і B = 15. І тому ми очікуємо, після того як ми обміняти їх - вони навіть не повинні бути однаковими номерами, але я зробив це таким чином. Давайте зробимо їх не однаковими номерами. Давайте зробимо 1111 і 0001. Таким чином, = 15 і B = 1. Після того як ми поміняти їх місцями, ми очікуємо "а" дорівнює 1 і B на 15. Таким чином, наш перший крок = а + б. Наші номери тільки 4 біти, так що "", який є 1111, + Ь, 0001, буде в кінцевому підсумку 10000, але у нас є тільки 4 біти. Так що тепер = 0. А тепер ми хочемо встановити B = A - B - насправді, це все ще працює відмінно. = A - B - давайте подивимося, якщо це працює відмінно. Тоді B = 0 - 1, яке все одно буде 15, а потім = A - B, який був би 1. Може бути, це дійсно працює. Я відчуваю, що є причина, вона не працює з використанням регулярних. Отже, працюючий на припущенні, що вона не працює зі звичайними бінарними операціями, і я буду шукати - я Google, щоб переконатися, що це правда. Таким чином, ми хочемо зробити це за допомогою бітових операторів, і ключ тут XOR. Таким чином, введення XOR (^), якщо ви його ще не бачила. Це, знову ж таки, оператор побітового так він діє по крупицях, і it's - Якщо у вас є біти 0 і 1, то це буде 1. Якщо у вас є біти 1 і 0, то це буде 1, у вас є біти 0 і 0, це буде 0, і якщо у вас є біти 1 і 1 це буде 0. Так що це як OR. Якщо один з бітів правда, це 1, але на відміну від OR, воно не може бути і битами, які є істинними. Або б це бути 1, XOR б це бути 0. Таким чином, ми збираємося хочете використовувати XOR тут. Задумайтеся про це на хвилину, я збираюся Google. Ну, ви не можете прочитати, що, я в даний час перебуваю на алгоритм підкачки сторінок XOR. Сподіваюся, це буде пояснити, чому Я не можу - Це саме алгоритм, який ми тільки що зробили. Я все ще не розумію, чому - я, мабуть, просто вибрав поганий приклад, але це випадок, коли «а» відбулося стати 0, після отримання до 5 біт, так що тепер "а" дорівнює 0, це те, що називається "цілочисельне переповнення". Згідно Вікіпедії, "на відміну від XOR підкачки, цей варіант вимагає, що вона використовує декілька методів щоб гарантувати, що х + у не викликає переповнення цілого ". Так що це дійсно є проблеми, це було цілочисельного переповнення, але я зробив щось не так. Я не впевнений. Я постараюся придумати інший. [Студент] Ну, не цілочисельне переповнення, коли ви намагаєтеся поставити поруч там більше, ніж кількість біт ви виділили? Так. У нас є 4 біти. That's - у нас було 4 біта, тоді спробуйте додати до нього 1, так що ми в кінцевому підсумку з 5 біт. Але п'ята біт просто отримує відрізати, так. Це могло б насправді - [Студент] Чи означає це, кинути вас про помилку, або ж, що - б, що видасть помилку? Номер Тому немає помилки. Коли ви дійдете до рівня зборки, спеціальний біт десь встановлено, що сказав, що переповнення, але в C ви начебто просто не впоратися з цим. Насправді ви не можете впоратися з цим, якщо ви використовуєте спеціальні інструкції по збірці в C. Давайте подумаємо про XOR підкачки. І я думаю, що статті Вікіпедії, можливо, також говорили, що - Так він і виховувався модульної арифметики, так що я думаю, я був, по ідеї, робити модулярної арифметики Коли я сказав, що 0 - 1 в 15 разів. Так що може насправді - на регулярній процесора, що робить 0 - 1 = 15. Так як ми в кінцевому підсумку на 0, ми віднімаємо 1, так то просто обертає назад до 1111. Таким чином, цей алгоритм може насправді працюють, A + B, A - B, B -, то може бути штраф. Але є деякі процесори, які не роблять цього, і тому він не буде добре в ці специфічні. XOR своп буде працювати на будь-якому процесорі. Добре. Ідея полягає в тому, що він повинен бути таким же, все ж. Де ми використовуємо XOR якимось чином отримати інформацію як в 1 змінних, , А потім витягнути інформацію з окремих змінних знову. Так хто-небудь є ідеї / відповідь? [Студент відповідь, нерозбірливо] Так це повинно працювати, а також, XOR є комутативної. Незалежно від того, в якому порядку ці 2 номери трапиться бути в тут, Цей результат буде той же. Так ^ Ь Ь. Ви також можете побачити це у вигляді = B, B =, = б знову. Таким чином, це право, і зрозуміти, чому це працює, думають про бітах. За допомогою невеликого числа, скажімо, 11001, 01100 і. Так що це 'а', це б. Таким чином, ^ = Ь. Ми збираємося бути встановлений в 'а' = до XOR ці 2 речі. Таким чином, 1 ^ 0, 1, 1 ^ 1 = 0, 0 ^ 1 = 1, і 0 ^ 0 = 0, 1 = 0 = 1. Таким чином, ',', якщо ви подивитеся на десяткове число, воно буде - Ви не побачите велику частину відносин між оригіналом "а" і нового "," але, дивлячись на біт "," зараз, як сітка інформації як оригінал "і оригінальні б. Таким чином, якщо ми візьмемо Ь, ми бачимо, що ми в кінцевому підсумку на оригінал ". А якщо взяти оригінал "'^ нові", "ми бачимо, ми в кінцевому підсумку на оригінальні б. Таким чином, (Ь) ^ B = оригінал ". І (Ь) ^ = оригінальні б. Існує - ще один спосіб побачити це нічого XOR сам завжди дорівнює 0. Таким чином, 1101 * 1101, всі біти буде те ж саме. Так що там ніколи не буде випадок, коли 1 є 0, а інший дорівнює 1. Отже, це 0000. Те ж і з цим. (Ь) ^ б, як ^ (Ь б). (Б ^ б) буде 0, а Ф 0 тільки збирається бути "," так як всі біти рівні 0. Таким чином, тільки ті, які збираються бути там, де «а» спочатку був 1 - було з них. І та ж ідея тут, я впевнений, що це також коммутативна. Так. Я ж кажу, до цього вона була комутативною. ^ ',' І це асоціативні, так що тепер (Ь) ^. І ми можемо зробити, Ь (^). І ось знову, ми отримаємо оригінальний б. Таким чином,'' тепер поєднання 'а' і б разом. Використовуючи наш новий комбо "а" ми говоримо, B = комбо'' ^ оригінальних б, отримуємо оригінальний '. А тепер комбо = 'а' ^ новий б, який був оригінальним - і який тепер, що було "а" або б. Ось цей випадок тут. Це = б, стара б. Так що тепер все знову в порядку помінялися місцями. Якби ми подивилися на біти, B = ^ B, буде XOR цих 2, і відповідь буде цього, а потім = ^ виданню XORing ці 2 і відповідь полягає в наступному. Питання? Добре. Таким чином, останній кілька значно більш важким. [Студент] Я думаю, що в нього є сумніви. >> Ой, вибачте. [Студент] Що насправді швидше? Якщо ви використовуєте цей XOR, або це, якщо ви оголосите нову змінну? Так що ж таке насправді швидше, оголосивши нову змінну або за допомогою XOR, щоб поміняти? Відповідь, ймовірно, тимчасової змінної. І це тому, що як тільки він складений вниз - так, на рівні зборки, немає такої речі, як локальні змінні або тимчасові змінні або будь-яке з цього матеріалу. Вони просто хотіли - є пам'ять, і є регістри. Регістри, де всі активно відбувається. Ви не додаєте 2 речі в пам'яті, ви додаєте 2 речі в регістрах. І ви приносите речі з пам'яті в регістри потім додати їх, а потім ви можете покласти їх назад в пам'ять, але вся дія відбувається в регістрах. Отже, коли ви за допомогою тимчасової змінної підхід, як правило, відбувається те, ці 2 номери вже знаходяться в регістрах. А потім з цього моменту, після того як ви їх місцями, це буде просто почати використовувати інший регістр. Де б ви не були використанням виданню, це буде просто використовувати регістр, який був уже зберіганні ". Так що не потрібно нічого робити насправді робити заміни. Так? [Студент] Але це також вимагає більше пам'яті, правильно? Це займе більше пам'яті, якщо це необхідно для зберігання, що тимчасова змінна. Наприклад, якщо ви пізніше використовувати цю тимчасову змінну знову десь, Потім - або ви призначаєте щось, що тимчасова змінна. Так, якщо в будь-який момент часу ',' б у температурі мають різні значення або щось, то це буде мати різні місця в пам'яті, але це правда, що Є багато локальних змінних, які існують тільки в регістрах. У такому випадку, він ніколи не ставив в пам'ять, і тому ви ніколи не витрачаючи пам'яті. Добре. Останнє питання трохи більше. Так от, в цьому CS50 прилад, є словник. І причина цього в тому, що [? B66] є перевірка орфографії, де ви будете писати з використанням хеш-таблиць або спроб або деякі структури даних. Ви збираєтеся писати перевірки орфографії, і ви збираєтеся використовувати цей словник, щоб зробити це. Але для цього завдання, ми просто будемо дивитися вгору, щоб побачити, якщо одне слово є в словнику. Таким чином, замість того щоб зберігати весь словник в деякій структурі даних , А потім, озираючись на весь документ, щоб побачити, якщо нічого це неправильно, Ми просто хочемо, щоб знайти 1 слово. Отже, ми можемо просто сканувати по всій словник і якщо ми ніколи не знайдемо слово у всьому словнику, то він не був там. Якщо ми переглядаємо по всій словник і бачу слово, те, що ми хороші, ми знайшли його. Тут говориться, що ми хочемо, щоб почати дивитися на файл-функції обробки C, в так як ми хочемо, щоб прочитати словник, але я дам підказку тут про те, які функції ви повинні думати. Я напишу їх на просторах. Таким чином, основними з яких ви хочете, щоб дивитися на це відкрита F, а потім, неминуче, F замкнуто, , Які підуть в кінці вашої програми, і е е сканування. Ви також можете використовувати F читати, але ви, ймовірно, не хочуть тому що - ви не в кінцевому підсумку потрібно це. F сканування F є те, що ви збираєтеся використовувати для сканування за словником. І тому вам не потрібно, щоб закодувати до рішення, просто спробуйте і, як псевдо-код свій шлях До розчину, а потім ми обговоримо це. А насправді, оскільки я вже дав вам це, якщо ви йдете в будь-якому терміналі або оболонки приладу, в Я хотів би - я зазвичай - якщо ви ще не бачили, я не знаю, якщо б ви зробили в класі, але людина, тому сторінках чоловік, досить корисно для дивлячись на майже будь-якої функції. Так що я можу зробити, начебто, MAN F, сканування ф. Це вже Інформація про сім'ю сканування F функцій. Я міг би також зробити MAN F, відкритою, і що дасть мені інформацію про це. Так що, якщо ви знаєте, які функції ви використовуєте, або ви читаєте код , І ви побачите деякі функції, і ви кшталт: "Що ж це робити?" Просто людина, що ім'я функції. Є кілька дивних прикладів, де ви могли б сказати, подобається. Людина 2, що ім'я функції, або людини 3, що ім'я функції, але Ви тільки повинні зробити, що якщо людина ім'я функції не буває, щоб працювати в перший раз. [Студент] Так що я читав довідкову сторінку для відкритого, але я до сих пір плутають про те, як його використовувати і програми. Добре. Багато чоловіків сторінок менше, ніж корисним. Вони більш корисні, якщо ви вже знаєте, що вони роблять а потім ви просто повинні пам'ятати, порядок аргументів або щось. Або вони можуть дати вам загальне уявлення, але деякі з них дуже переважною. Як і F сканування F, а також. Це дає вам інформацію для всіх цих функцій, і 1 рядок тут відбувається, сказати: "F F сканування зчитує з точки рядок або потік". Але F відкрити. Отже, як ми використовуємо F відкрито? Ідея програми, які необхідно зробити файл вводу / виводу є те, що Ви спочатку потрібно відкрити файл, який ви хочете зробити щось з, і неминуче, читати речі з цього файлу і робити речі з ними. F відкритих те, що ми використовуємо, щоб відкрити файл. Те, що ми повернемося, так що файл ми хочемо відкрити, вона дає нам - Тут він говорить: "/ користувача / частки / Dict / слова». Це файл, який ми хочемо відкрити, і ми хочемо, щоб відкрити його - ми повинні явно вказати, чи хочемо ми, щоб відкрити його для читання або, якщо ми хочемо, щоб відкрити його писати. Там в пару комбінацій та інше, але ми хочемо, щоб відкрити це для читання. Ми хочемо, щоб читання з файлу. Отже, що ж це повернення? Вона повертає файл зірочкою (*), і я просто покажу все, що в змінної F, так *, знову ж таки, це покажчик, але ми не хочемо мати справу з покажчиками. Ви можете думати, як F, F тепер змінна ви збираєтеся використовувати для представлення файлу. Так що, якщо ви хочете прочитати з файлу, ви читаєте з ф. Якщо ви хочете, щоб закрити файл, ви закриваєте ф. Так, в кінці програми, коли ми неминуче хочуть закрити файл, те, що ми повинні робити? Ми хочемо, щоб закрити ф. Так що тепер остання функція файл, який ми збираємося хочете використовувати сканування F, F сканування ф. І що, що робить це вона сканує на файл шукає шаблоном. Дивлячись на чоловіка сторінці тут, ми бачимо Int F сканування F, ігнорувати повернене значення на даний момент. Першим аргументом є файл потоку *, так що перший аргумент ми збираємося хочете передати IS-F. Ми сканування за ф. Другий аргумент є рядком формату. Я дам вам формат рядка прямо зараз. Я думаю, що ми, трапляється, кажуть, 127s \ п, багато це непотрібним. Ідея про те, що цей формат рядка, що ви можете думати про е сканування як протилежність друку ф. Таким чином, друк F, F друку ми також використовуємо цей тип формату параметра, але в пресі F те, що ми робимо, - давайте подивимося на еквівалента. Таким чином, друк е, і є насправді також F друк F, де перший аргумент буде ф. Коли ви друкуєте F, ми могли б сказати щось на кшталт: "друк 127s \ п", а потім, якщо ми передамо йому деякі рядки, він збирається надрукувати цей рядок, а потім з нового рядка. Які засоби 127, я впевнений, але я ніколи не обмежував себе до нього, Ви навіть не потрібно говорити '127 'в друкованих F, Але що це означає, роздрукуйте перші 127 символів. Так що я впевнений, що це так. Ви можете Google за це. Але в наступний я майже впевнений, це означає, що. Так що це надрукувати перші 127 символів, а потім з нового рядка. F сканування F тепер, замість того, щоб, дивлячись на змінну і друк, це будемо дивитися на деякі рядки і зберегти шаблон в змінну. Давайте реально використовувати сканування е в інший приклад. Так скажімо, у нас були деякі INT, х = 4, і ми хотіли створити рядок зроблений з - хотіли створити рядок , Що було схоже, це прийде набагато пізніше, те, що точно так само як 4.jpg. Таким чином, це може бути програма, де ви будете мати суму лічильника, Підводячи протидії я, і ви хочете заощадити купу фотографій. Отже, ви хочете зберегти i.jpg, де я деякий ітерації циклі. Так як же нам зробити цей рядок, що JPEG? Якщо ви хочете роздрукувати 4.jpg, ми могли б просто сказати, друк F,% d.jpg, , А потім вона буде друкувати для цього JPEG. Але якщо ми хочемо зберегти рядок 4.jpg, ми використовуємо сканування ф. Таким чином, рядок S - насправді ми не можеш - символ, символ S, давай 100. Так що я просто заявили деякі масив з 100 символів, і ось що ми неминуче будемо зберігати, що JPEG дюйма Так що ми збираємося використовувати сканування е, і формат, як ми б сказали,% d.jpg для того, щоб роздрукувати 4.jpg, формат цього буде d.jpg%. Таким чином, формат% d.jpg, що ми хочемо замінити% D, є х, і тепер ми повинні зберігати цю рядок десь. А де ми будемо зберігати цю рядок у масиві с. Таким чином, після цього рядка коду, а, якщо ми друкуємо F,% зі змінною с, він збирається друкувати 4.jpg. Таким чином, F сканування F така ж, як сканування F, тільки тепер вона дивиться на цей файл за те, що зберігати в с. Це те, що останній аргумент буде. Ми хочемо, щоб зберігати - "Scan е сімейство функцій сканування та у відповідності з форматом, як намагався нижче. Якщо зберігається в розташуванні пунктів ви могли б повернутися - " Ні, ми могли б бути хорошими. Дозвольте мені думати ні на секунду. Таким чином, сканування F - ні, якого біса це функція, яка робить це? Таким чином, сканування F не збирається приймати ціле і зробити точку JPG. Це буде [бурмоче]. Зберегти Int змінної в рядок Int C. Що це змінна, або те, що ця функція називається? Так. That's - так. Так що я був визначальним для вас до цього був з друку F, який - що набагато більше сенсу, тому я сказав, що це набагато більше схоже друку ф. Сканування F і раніше ніби як друк F, але з друку F буде перевірити його на і замінити змінні і тепер зберігати його в рядок. Замість друку, воно зберігає його в рядок. Так що ігнорувати повністю. Ви все ще можете думати формату, як такі печатки ф. Так що тепер, якщо ми хотіли зробити 4.jpg річ, ми будемо робити з друку F, X про це. Так що сканування F робить - те, що ваше питання буде? [Студент] Я просто заплутався в те, що ми намагаємося зробити прямо тут з JPEG. Чи можете ви пояснити, що 1 більше часу? Так що це було - це менш relevent для сканування F F тепер, сподіваюся, він буде пов'язувати ще в якийсь шлях. Але те, що я спочатку збирався показати було - це насправді безпосереднє відношення до цих [? F5] Ви збираєтеся використовувати печатку з F, де у нас є 100 зображень, і ви хочете читати 1.jpg зображення, 2.jpg, 3.jpg. Тому для того, щоб зробити це, вам потрібно е відкрите, а потім ви повинні передати в рядок, яку ви хочете відкрити. Таким чином, ми хотіли б відкрити 1.jpg, для того, щоб створити рядок, яка 1.jpg, Ми робимо друк з Р% d.jpg--ми не робили для Int = 0. я <40, я + +. Таким чином, з печатка F% d.jpg введення. Таким чином, після цієї лінії, тепер змінна або масив, а збирається 1.jpg. Або, 0.jpg, 1.jpg, 2.jpg. І таким чином ми можемо відкрити, у свою чергу, кожне зображення для читання. Так що те, що з печатка F робить. Ви бачите, що з печатка F тепер робити? [Студент] Отже, він приймає - він створює рядок, something.jpg, а потім зберігає його. Так. Це створює - це ще один рядок формату, як сканування і друк F F, , Де він вставляє всі змінні у другому аргументі, може бути їй, на відміну від мене. Може бути - я маю на увазі, що це так. Але в будь-якому порядку аргументів. Це буде вставити всі змінні в рядок формату , А потім зберегти в нашому буфері; ми називаємо це буфер, де ми зберігання рядка. Таким чином, ми зберігаємо усередині з правильною рядки у форматі,% D будучи замінені 4. [Студент] Таким чином, якщо б ми зробили це, є змінною F тільки збирається бути перепризначені? Так. Таким чином, ми повинні закрити оригінальну е, перш ніж робити це. Але - і тут же, якби не було F відкривають тут, то ми повинні були б сказати - Так. Але було б відкрити сотні різних файлів. [Студент] Але ми не були б в змозі отримати доступ або - нормально. Добре. Таким чином, сканування F, F сканування F, це свого роду та ж ідея, але замість того, замість того, щоб зберігати його в рядок, це більше схоже ви зараз переходячи жало і зіставлення з цим рядком і зберігання результатів в змінні. Ви можете використовувати сканування F розібрати на щось подібне 4.jpg, і зберігати ціле число 4 в сумі х Int. Це те, що ми можемо використовувати для сканування тобто F F сканування збирається зробити це в командному рядку. Я насправді впевнений, що це те, що бібліотека CS50 робить. Тому, коли ви говорите: "отримати Int", це сканування F-ня більш - сканування F є спосіб отримання користувальницького введення. F сканування F буде робити те ж саме, але з використанням файлів для сканування по. Так от, ми скануванні над цим файлом. Зразок, який ми намагаємося відповідати деяка рядок, яка становить 127 символів пішла нова лінія Так що я впевнений, що ми могли б навіть просто сказати: "відповідає и", так як в словнику Ми, виявляється, є, ми гарантовано немає слів є те, що довга, а також F сканування е, я думаю, буде зупинятися на новій лінії ні на що. Але ми будемо включати нові рядки в матчі, і - [Студент] Якщо ми не будемо включати нові лінії, не було б знайти частини слова? Це - кожному - дивлячись на словник - Так, у словнику, всі ці наші слова. Кожен з них з нового рядка. F сканування збирається забрати це слово. Якщо ми не будемо включати нові лінії, то цілком можливо, що наступний F сканування буде просто прочитати новий рядок. Але у тому числі нові лінії, то буде просто ігнорувати новий рядок. Але ми ніколи не отримаємо частину слова, так як ми завжди читав до нової лінії, незважаючи ні на що. [Студент] Але що, якщо ви шукаєте слово "збочений апетит", як збочений апетит. Чи буде це, що й казати, що це матч? І ось ми - він буде читати - це насправді хороший момент. Ми ніколи з використанням поточного - слово, яке ми шукаємо перший аргумент командного рядка. Таким чином, рядок, слово = ARGV 1. Таким чином, рядок ми шукаємо є ARGV 1. Ми не шукаємо слово взагалі в нашому сканування ф. Те, що ми робили з скануванні F стає кожне слово в словнику, , А потім, коли у нас, що слово, яке ми збираємося використовувати STRCMP щоб порівняти їх. Ми збираємося порівняти наші слова і те, що ми тільки що прочитали дюйма Таким чином, неминуче, ми збираємося в кінцевому підсумку робить купу сканування фс поки не так уже сталося, що сканування F повернеться - він буде повертати один, поки вона відповідає новим словом, і він буде повертати щось інше, як тільки воно не відповідає слово. Ми читаємо по всьому словнику, зберігання рядок за рядком кожне слово в змінну с. Потім ми порівнюємо слово с, а якщо порівняння == 0, STRCMP відбувається довести 0, якщо матч був зроблений. Так що, якщо це був 0, то ми можемо надрукувати F, збігаються, або слово в словнику, або що ви хочете надрукувати ф. І потім - ми не хочемо, щоб F закрити знову і знову. Це така річ, що ми хочемо зробити, і ми не просто шукаєте слово в словнику. Таким чином, ми могли б зробити це, якщо б ми хотіли подивитися на їхні картини, перекручений апетит, як ви казали, якщо ми хочемо, щоб шукати цю схему, то воно не буде в тому випадку, тому що це насправді не слова, а одне зі слів у словнику, трапляється, що в ньому. Так що це буде відповідати цим словом, але це підмножина слово не саме слово. Але це не те, як ми використовуємо її, ми читаємо в кожному слові , А потім порівнюючи слова у нас з цим словом. Таким чином, ми завжди порівнянні повному слів. Я можу відправити завершена рішення пізніше. Це свого роду майже правильну відповідь, я думаю. [Студент коментар, нерозбірливо] О, я позбутися цього раніше? Char с, я думаю, ми сказали 127 - я забув, що найбільший є. Ми просто робимо 128; так що тепер їй достатньо довго. Ми не потрібно нічого друкувати. Ми також збираємося хочете, щоб закрити файл, і що має бути приблизно правильну відповідь. CS50.TV