Термінова допомога студентам
Дипломи, курсові, реферати, контрольні...

Мова С

РефератДопомога в написанніДізнатися вартістьмоєї роботи

Справжня книга перестав бути вступним курсом в програмування; вона не передбачає певне ознайомлення з основними поняттями програмування такі як перемінні, оператори присвоювання, цикли, функції. Проте і не новачок у програмуванні має бути може читати поспіль і освоїтися із мовою, хоча заодно було б корисною допомогу більш досвідченого колеги. На нашу досвіду, «З» проявив себе приємним, виразним і… Читати ще >

Мова С (реферат, курсова, диплом, контрольна)

Аннотация.

Мова «C"(произносится «сі») — це універсальну мистецьку мову програмування, котрому притаманні економічність висловлювання, сучасний потік управління і структури даних, багатий набір операторів. Мова «З» ні мовою «дуже високого рівня», ні «великим» мовою, і призначається для деякою спеціальної області застосування. але відсутність обмежень і спільність мови роблять його зручним і ефективнішим багатьом завдань, ніж мови, може бути більш мощные.

Мова «З», що призначався для написання ОС «UNIX» на ЕОМ DEC PDP-11, було розроблено й реалізований в цій системі Деннисом Ричи. Операційна система, компілятор з мови «З» по суті все прикладні програми системи «UNIX» (зокрема всі програмне забезпечення, використане для підготовки цієї книжки) написані на «З». Комерційні компілятори з мови «З» є й деяких інших ЕОМ, включаючи IBM SYSTEM/370, HONEYWELL 6000, INTERDATA 8/32. Мова «З», проте, не пов’язані з певними певними апаратними засобами чи системами, і ним легко писати програми, які можна пропускати не змінювалась про всяк ЕОМ, має «C"-компилятор.

Ця книга варта здобуття права допомогти читачеві навчитися програмувати мовою «З». Вона стримає навчальний запровадження, мета якого — дозволити новим користувачам розпочати програмувати якнайшвидше, окремі розділи за всіма основними особливостям мови та довідкове керівництво. Навчання побудовано у основному для читанні, написанні і розборі прикладів, а чи не голою формулюванні правил. Приклади, наведені у книзі, по більшу частину є завершеними реальними програмами, а чи не окремі фрагменти. Усі приклади перевіряли безпосередньо з тексту книжки, де їх видруковано у вигляді, придатному для входження у машину. Крім вказівок у тому, як зробити так використання мови ефективнішим, ми також намагалися, де може бути, проілюструвати корисні алгоритми та організаційні принципи хорошого стилю, і розумної разработки.

Справжня книга перестав бути вступним курсом в програмування; вона не передбачає певне ознайомлення з основними поняттями програмування такі як перемінні, оператори присвоювання, цикли, функції. Проте і не новачок у програмуванні має бути може читати поспіль і освоїтися із мовою, хоча заодно було б корисною допомогу більш досвідченого колеги.

На нашу досвіду, «З» проявив себе приємним, виразним і різнобічним мовою широкому безлічі різноманітних програм. Його легко вивчити, і не втрачає своїх якостей зі зростанням досвіду програміста. Ми сподіваємося, що цю книжку допоможе вам добре його використовувати.

Вдумлива критика і товарної пропозиції багатьох наших на друзів і колег дуже багато додали як самої книжки, так нашого задоволення у її написанні. Зокрема, Майк Биапси, Джим Блю, Стью Фельдман, Доуг Мак-Илрой, Білл Рум, Боб Розин і Ларрі Рослер старанно прочитали безліч варіантів. Ми також Елю Ахо, Стиву Борну, Дэву Двораку, Чаку Хэлею, Дебби Хэлей, Мариону Харрису, Рику Холту, Стиву Джонсону, Джону Машею, Бобу Митцу, Ральфу Мьюа, Пітеру Нельсону, Эллиоту Пинсону, Біллу Плагеру, Джеррі Співаку, Кену Томпсону і Пітеру Вейнбергеру за корисні зауваження в різних етапах і Майку Лискові і Джо Осанна за неоціненну допомогу в друкуванні книжки. Брайен У. Керниган Денніс М. Ричи.

Аннотация.

0.1.

Введение

.

1. Навчальне введение.

1.1. Начинаем.

1.2. Змінні і арифметика.

1.3. Оператор FOR.

1.4. Символічні константы.

1.5. Набір корисних программ.

1.5.1. Введення та виведення символов.

1.5.2. Копіювання файла.

1.5.3. Підрахунок символов.

1.5.4. Підрахунок строк.

1.5.5. Підрахунок слов.

1.6. Массивы.

1.7. Функции.

1.8. Аргументи — виклик по значению.

1.9. Масиви символов.

1.10. Область дії: зовнішні переменные.

1.11. Резюме.

2. Типи, операції, і выражения.

2.1. Імена переменных.

2.2. Типи й розміри данных.

2.3. Константы.

2.3.1. Символьна константа.

2.3.2. Константне выражение.

2.3.3. Рядкова константа.

2.4. Описания.

2.5. Арифметичні операции.

2.6. Операції стосунки держави й логічні операции.

2.7. Перетворення типов.

2.8. Операції збільшення і уменьшения.

2.9. Побітові логічні операции.

2.10. Операції й вислови присваивания.

2.11. Умовні выражения.

2.12. Старшинство і Порядок вычисления.

3. Потік управления.

3.1. Оператори і блоки.

3.2. IF — ELSE.

3.3. ELSE — IF.

3.4. Переключатель.

3.5. Цикли — WHILE і FOR.

3.6. Цикл DO — WHILE.

3.7. Оператор BREAK.

3.8. Оператор CONTINUE.

3.9. Оператор GOTO і метки.

4. Функції і структура программ.

4.1. Основні сведения.

4.2. Функції, повертають нецілі значения.

4.3. Ще про аргументах функций.

4.4. Зовнішні переменные.

4.5. Правила, що визначають область действия.

4.5.1. Область действия.

4.6. Статичні переменные.

4.7. Реєстрові переменные.

4.8. Блокова структура.

4.9. Инициализация.

4.10. Рекурсия.

4.11. Препроцесор мови «C».

4.11.1. Включення файлов.

4.11.2. Mакроподстановка.

5. Покажчики і массивы.

5.1. Покажчики і адреса.

5.2. Покажчики і аргументи функций.

5.3. покажчики і массивы.

5.4. Адресна арифметика.

5.5. покажчики символів і функции.

5.6. Покажчики — не целые.

5.7. Багатовимірні массивы.

5.8. Масиви покажчиків; покажчики указателей.

5.9. Ініціалізація масивів указателей.

5.10. Покажчики і багатовимірні массивы.

5.11. Командна рядок аргументов.

5.12. Покажчики на функции.

6. Структуры.

6.1. Основні сведения.

6.2. Структури і функции.

6.3. Масиви структур

6.4. Покажчики на структуры.

6.5. Структури, посилаються на себя.

6.6. Пошук в таблице.

6.7. Поля.

6.8. Объединения.

6.9. Визначення типа.

7. Введення і вывод.

7.1. Звернення до стандартної библиотеке.

7.2. Стандартний введення та виведення — функції GETCHAR і PUTCHAR.

7.3. Форматний висновок — функція PRINTF.

7.4. Форматний введення — функція SCANF.

7.5. Форматне перетворення на памяти.

7.6. Доступ до файлам.

7.7. Обробка помилок — STDERR і EXIT.

7.8. Введення та виведення строк.

7.9. Кілька різноманітних функций.

7.9.1. Перевірка виду символів і преобразования.

7.9.2. Функція UNGETC.

7.9.3. Звернення до системе.

7.9.4. Управління памятью.

8. Інтерфейс системи UNIX.

8.1. Дескриптори файлов.

8.2. Низкоуровневый ввод/вывод — оператори READ і WRITE.

8.3. Відкриття, створення, закриття і розщеплення (UNLINK).

8.4. Довільний доступ — SEEK і LSEEK.

8.5. Приклад — реалізація функцій FOPEN і GETC.

8.6. Приклад — роздруківка справочников.

8.7. Приклад — розподільник памяти.

9. Додаток а: довідкове посібник з мови «З » .

9.1.

Введение

.

10. Лексичні соглашения.

10.1. Комментарии.

10.2. Ідентифікатори (имена).

10.3. Ключові слова.

10.4. Константы.

10.4.1. Цілі константы.

10.4.2. Явні довгі константы.

10.4.3. Символьні константы.

10.4.4. Плаваючі константы.

10.5. Строки.

10.6. Характеристики апаратних средств.

11. Синтаксична нотация.

12. Що у імені тобі моем?

13. Об'єкти і L-значения.

14. Преобразования.

14.1. Символи і целые.

14.2. Типи FLOAT і DOUBLE.

14.3. Плаваючі і целочисленные величины.

14.4. Покажчики і целые.

14.5. Ціле без знака.

14.6. Арифметичні преобразования.

15. Выражения.

15.1. Первинні выражения.

15.2. Унарные операции.

15.3. Мультиплікативні операции.

15.4. Аддитивные операции.

15.5. Операції сдвига.

15.6. Операції отношения.

15.7. Операції равенства.

15.8. Побітова операція «і «.

15.9. Побітова операція виключає «чи «.

15.10. Побітова операція що включає «чи «.

15.11. Логічний операція «і «.

15.12. Операція логічного «чи «.

15.13. Умовна операция.

15.14. Операція присваивания.

15.15. Операція запятая.

16. Описания.

16.1. Специфікатори класу памяти.

16.2. Специфікатори типа.

16.3. Описатели.

16.4. Сенс описателей.

16.5. Опис структур і объединений.

16.6. Инициализация.

16.7. Імена типов.

16.8. TYPEDEF.

17. Операторы.

17.1. Операторное выражение.

17.2. Складовою оператор (чи блок).

17.3. Умовні операторы.

17.4. Оператор WHILE.

17.5. Оператор DO.

17.6. Оператор FOR.

17.7. Оператор SWITCH.

17.8. Оператор BREAK.

17.9. Оператор CONTINUE.

17.10. Оператор возврата.

17.11. Оператор GOTO.

17.12. Позначений оператор

17.13. Порожній оператор

18. Зовнішні определения.

18.1. Зовнішнє визначення функции.

18.2. Зовнішні визначення данных.

19. Правила, що визначають область действия.

19.1. Лексична область действия.

19.2. Область дії зовнішніх идентификаторов.

20. Рядки управління компилятором.

20.1. Заміна лексем.

20.2. Включення файлов.

20.3. Умовна компиляция.

21. Неявні описания.

22. Знову про типах.

22.1. Структури і объединения.

22.2. Функции.

22.3. Масиви, покажчики і индексация.

22.4. Явні перетворення указателей.

23. Константні выражения.

24. Міркування про переносимости.

25. Анахронизмы.

26. Зведення синтаксичних правил.

26.1. Выражения.

26.2. Описания.

26.3. Операторы.

26.4. Зовнішні определения.

26.5. Препроцессор

27. Присвоювання структуры.

28. Тип перечисления.

29. Таблиця зображень недрукованих символів мови «C».

0.1.

Введение

.

Мова «З» універсальний мовою програмування. Він тісно пов’язані з операційній системою «UNIX», оскільки було розвинено в цій системи та оскільки «UNIX» і його програмне забезпечення написано на «З». Сама мова, проте, не.

пов’язані з якоюсь однією операційній системою чи машиной;

і було її називають мовою системного програмування, так.

як і зручний написання операційними системами, разом з равным.

успіхом використовувався під час написання великих вычислительных.

програм, програм в обробці текстів і баз данных.

Мова «З» — це мову щодо «низького рівня». В.

такий характеристиці нічого немає образливого; це просто.

означає, що «З» оперує об'єктами тієї самої виду, що и.

більшість ЕОМ, саме, з символами, числами і адресами.

Вони можуть об'єднуватися і пересилатися у вигляді обычных.

арифметичних і логічних операцій, здійснюваних реаль;

ными ЭВМ.

У мові «З» відсутні операції, мають справа непос;

редственно зі складаними об'єктами, такі як рядки симво;

вилов, безлічі, списки чи з масивами, розглянутими как.

ціле. Тут, наприклад, немає ніякої аналога операціям PL/1,.

які оперують з цілими масивами і рядками. Мова не предос;

тавляет ніяких можливостей розподілу памяти,.

крім статичного ухвали і механізму стеков, обеспечи;

ваемого локальними змінних функцій; але немає ни.

«куч"(HEAP), ні «складання сміття», як це передбачається в.

АЛГОЛЕ-68. Нарешті, сам собою «З» не забезпечує никаких.

можливостей вводу-виводу: але немає операторів READ или.

WRITE і жодних вбудованих методів доступу до файлам. Усі эти.

механізми високого рівня мають забезпечувати явно вызыва;

емыми функциями.

Аналогічно, мову «З» пропонує лише, после;

довательные конструкції потоків управління: перевірки, циклы,.

групування і підпрограми, але з мультипрограммирование,.

паралельні операції, синхронізацію чи сопрограммы.

Хоча відсутність деяких із цих коштів може выгля;

подіти як гнітюча неповноцінність («виходить, що должен.

звертатися до функції, щоб порівняти два рядки символов.

?!"), але утримання мови в скромних розмірах дає реальные.

переваги. Оскільки «З» щодо малий, не требует.

велике місце для свого описи і то, можливо швидко выучен.

Компілятор з «З» то, можливо простою й компактним. Крім то;

го, компілятори легко пишуться; під час використання современной.

технології очікується написання компілятора для нової ЭВМ.

за місяців, і у своїй виявиться, що 80 відсотків прог;

раммы нового компілятора буде спільної з програмою для уже.

існуючих компіляторів. Це забезпечує високу степень.

мобільності мови. Оскільки типи даних, і стуктуры управле;

ния, що у «З», безпосередньо підтримуються боль;

шинством існуючих ЕОМ, бібліотека, необхідна у время.

прогону ізольованих програм, виявляється дуже маленькой.

На PDP -11, наприклад, вони містять лише програми для.

32-битового множення і ділення клітин і до виконання программ.

введення та виведення послідовностей. Звісно, кожна реализа;

ция забезпечує вичерпну, сумісну бібліотеку функ;

ций до виконання операцій вводу-виводу, обробки рядків и.

розподілу пам’яті, але оскільки звернення до них осуществля;

ется лише явно, можна, якщо потрібно, запобігти їм вызо;

ва; цих функцій може бути компактно написані на «C».

* 8 ;

Знову ж через того, що мова «З» відбиває возможности.

сучасних комп’ютерів, програми на «З» виявляються доста;

точно ефективними, отже немає спонукання писать.

натомість програми мовою ассемблера. Найбільш убеди;

тельным прикладом є сама операційна система.

«UNIX», що майже повністю написана на «З». З 13 000.

рядків програми системи лише 800 рядків самого низко;

го рівня написані на ассемблері. З іншого боку, по существу.

все прикладне програмне забезпечення системи «UNIX» напи;

сано на «З»; переважна більшість користувачів системы.

«UNIX"(включая однієї з авторів цієї книжки) навіть знает.

мови ассемблера PDP-11.

Хоча «З» відповідає можливостям багатьох ЕОМ, він не.

залежить від певною конкретною архітектури машини та в силу.

цього без особливих зусиль дозволяє писати «стерпні» прог;

раммы, тобто. програми, які можна пропускати без измене;

ний в різних апаратних засобах. У наших колах стал.

вже традицією перенесення програмного забезпечення, разработан;

ного на системі «UNIX», на системи ЕОМ: HONEYWELL, IBM и.

INTERDATA. Фактично компілятори з «З» і встановлюють програмне обес;

печение під час прогону програм цих чотирьох системах,.

очевидно, значно більше сумісні, ніж стандартні вер;

ці фортрану американського національного інституту стандар;

тов (ANSI). Сама операційна система «UNIX» тепер работает.

як у PDP-11, і на INTERDATA 8/32. За винятком прог;

рамм, що неминуче опиняються у певної міри ма;

шинно-зависимыми, як-от компілятор, асемблер і отлад;

чик. Написане мовою «З» програмне забезпечення иден;

тично обох машинах. Всередині найбільшої операційній системы.

7000 рядків програми, виключаючи математичне обеспечение.

мови ассемблера ЕОМ та управління операціями ввода-вывода,.

збігаються на 95 процентов.

Програмістам, знайомим коїться з іншими мовами, для сравне;

ния і протиставлення стати у пригоді упоминание.

кількох історичних, технічних і філософських аспектов.

«C».

Чимало понять з найважливіших ідей «З» походить від гораз;

до старого, але ще цілком життєвого мови BCPL ,.

розробленого Мартіном Ричардсом. Побічно мову BCPL оказал.

впливом геть «З» через мову «B», написаний Кеном Томпсоном в.

1970 року перша ОС «UNIX» на ЭВМ.

PDP-7.

Хоча мову «З» має низку спільних із BCPL характерных.

особливостей, він у разі перестав бути діалектом пос;

леднего. І BCPL і «B» — «безтипные» мови; єдиним ви;

будинок даних їм є машинне слово, а доступом до дру;

гим об'єктах реалізується спеціальними операторами чи обра;

щением функцій. У мові «З» об'єктами основних типів дан;

ных є символи, цілі числа кількох ж розмірів та чис;

ла з плаваючою точкою. З іншого боку, є ієрархія произ;

водних типів даних, створюваних покажчиками, массивами,.

структурами, об'єднаннями і функциями.

* 9 ;

Мова «З» включає основні конструкції потоку управле;

ния, необхідні для добре структуированных програм: группи;

рование операторів, прийняття рішень (IF), цикли з проверкой.

закінчення початку (WHILE, FOR) або наприкінці (DO) і выбор

однієї з безлічі можливих варіантів (SWITCH). (Усі эти.

можливості забезпечувалися й у BCPL, хоча й за несколько.

відмінному синтаксисі; цю мову передчував наступившую.

кілька років моду на структурне программирование).

У мові «З» є покажчики і можливість адресной.

арифметики. Аргументи передаються функцій у вигляді копи;

рования значення аргументу, і викликана функція не может.

змінити фактичний на викликає програмі. Если.

бажано домогтися «виклику по засланні», можна неявно пере;

дати покажчик, й третя функція зможе змінити об'єкт, на который.

цей покажчик вказує. Імена масивів передаються указани;

їм початку масивів, отже аргументи типу масивів эффек;

тивно викликаються по ссылке.

До всякої функції можна звертатися рекурсивно, і його ло;

кальные перемінні зазвичай «автоматичні», тобто. Создаются.

наново при кожному зверненні. Опис однієї функції не может.

утримуватися всередині інший, але перемінні можуть описуватися в.

відповідність до звичайній блокової структурою. Функції в «З» ;

програмі можуть транслюватися окремо. перемінні по от;

носіння до функції може бути внутрішніми, зовнішніми, але из;

вестными в межах одного вихідного файла, чи пол;

ностью глобальними. Внутрішні перемінні може бути автома;

тическими чи статичними. Автоматичні перемінні для.

більшої ефективності можна поміщати в регістри, але объявле;

ние регістру є лише зазначенням для компілятора і ни;

як і пов’язані з конкретними машинними регистрами.

Мова «З» перестав бути мовою із суворими типами в смысле.

паскаля чи алгола 68. Він порівняно поблажливий до пре;

освіті даних, хоча й буде автоматично преобразо;

вывать типи даних із буйної невимушеністю мови PL/1.

Існуючі компілятори не передбачають ніякої проверки.

під час виконання програми індексів масивів, типів аргу;

ментів і т.д.

За тих ситуацій, коли бажана сувора перевірка ти;

заговорили українською у, використовується спеціальна версія компілятора. Ця прог;

рамма називається LINT очевидно тому, вона вибирає кусочки.

пуху з вашої програми. Програма LINT не генерує машин;

ного коду, а робить дуже сувору перевірку всіх сторон.

програми, які можна проконтролювати під час компиля;

ции і завантаження. Вона визначає невідповідність типів, несов;

местимость аргументів, невикористані чи очевидним обра;

зом неинициализированные перемінні, потенційні трудности.

переносимості тощо. Для программ, которые благополучно про;

ходять через LINT, гарантується відсутність помилок типу при;

розмірено з тією ж повнотою, як й у програм, написанных,.

наприклад, на АЛГОЛЕ-68. Інші можливості програми LINT.

будуть відзначені, коли випаде відповідний случай.

* 10 ;

Нарешті, мову «З», подібно будь-якої іншої мови, имеет.

свої недоліки. Деякі операції мають невдалий старшин;

ство; деякі розділи синтаксису можуть бути краще; су;

крокує кілька мови, відмінних невеликими де;

талями. Проте мову «З» зарекомендував себе як исклю;

чительно ефективний і виразний мову для широкого раз;

нообразия застосувань программирования.

Зміст книжки організовано так. Глава.

1 є навчальним введенням у центральну частина мови «C».

Мета — дозволити читачеві стартувати так быстро, как только.

можливо, адже ми твердо переконані, що єдиний спо;

соб вивчити новий мову — писати у ньому програми. У цьому ,.

проте, передбачається робоче володіння основними элементами.

програмування; не пояснюється, що таке ЕОМ или.

компілятор, не пояснюється сенс висловів типу N=N+1. Хотя.

ми намагалися, де може бути, продемонструвати полезную.

техніку програмування. Ця книга не призначається быть.

довідковим посібником з структурам даних, і алгоритмам;

там, куди ми змушені були зробити вибір, ми концентрирова;

лисій на языке.

У розділах зі 2-ї по 6-ту різні аспекти «З» излагаются.

детальніше і трохи більше формально, ніж у главі 1,.

хоча наголос як і робиться на розборі прикладів за;

конченных, корисних програм, а чи не на окремих фрагментах.

У розділі 2 обговорюються основні типи даних, оператори и.

висловлювання. У розділі 3 розглядаються управляючі операторы:

IF-ELSE, WHILE, FOR тощо. Глава 4 охоплює функції и.

структуру програми — зовнішні перемінні, правила определен;

ных областей дії описи тощо. У розділі 5 обсуждаются.

покажчики і адресна арифметика. Глава 6 містить подробное.

опис структур і объединений.

У розділі 7 описується стандартна бібліотека ввода-вы;

вода мови «З», що забезпечує стандартний інтерфейс с.

операційній системою. Ця бібліотека виводу-введення-висновку поддержи;

вается усім машинах, у яких реалізований «З», так что.

програми, використовують її для введення, виведення та інших сис;

темних функцій, можуть переноситися з одного системи на другую.

сутнісно без изменений.

У розділі 8 описується інтерфейс між «З» — программами.

і операційній системою «UNIX». Наголос робиться на ввод-вывод,.

систему файлів і перенесення. Хоча вік деяких частин этой.

глави специфічні для ОС «UNIX», програм;

мисты, не використовують «UNIX», мають знайти тут по;

лезный матеріал, зокрема певне уявлення про том,.

як реалізована одна версія стандартної бібліотеки й предло;

жения задля досягнення переносимості программы.

Додаток A містить довідкове посібник з языку.

«З». Воно є «офіційним» викладом синтаксису і се;

мантики «З» і (виключаючи або власний компилятор).

остаточним арбітром всім двозначностей і упущений.

у роки главах.

* 11 ;

Оскільки «З» є мерехтливим мовою, реализован;

ным на безлічі систем, частина матеріалу справжньої книжки мо;

жет не відповідати поточному стану розробки на ка;

яке-те конкретної системі. Ми намагалися уникати таких проб;

лем і застерігати про можливі труднощі. У сомнительных.

випадках, проте, ми звичайно воліли описувати ситуацию.

системі «UNIX» PDP-11, оскільки він є середовищем для.

більшості програмуючих мовою «З». У додатку а.

також описані розбіжність у реалізаціях мови «З» на основ;

ных системах.

1. Навчальне введение.

Давайте розпочнемо з швидкого запровадження мову «З». Наша.

мета — продемонструвати суттєві елементи мови на ре;

альных програмах, не грузнучи причому у деталях, формальных.

правила і винятки. У цьому главі ми намагаємося изложить.

мову в цілому або хоча б суворо (зрозуміло, приводимые.

приклади будуть коректними). Ми ще хочемо якомога швидше довес;

ти вас рівня, у якому були б в состоянии.

писати корисні програми, і аби домогтися цього, ми сосре;

дотачиваемся на основному: змінних і константи, арифмети;

ке, операторах передачі управління, функціях і элементарных.

відомостях про введення і виведення. Ми свідомо оставля;

їм поза цієї глави багато елементів мови «З», кото;

рые мають першочергового значення під час написання больших.

програм, зокрема покажчики, сртуктуры, більшу частину из.

багатого набору операторів мови «З», кілька операторов.

передачі управління і незліченна кількість деталей.

Такий їхній підхід має, звісно, свої недоліки. Найбільш су;

щественным і те, що повне опис будь-якого конкрет;

ного елемента мови не викладається щодо одного місці, а поясне;

ния, з стислості, можуть призвести до неправильного истол;

кованию. З іншого боку, через неможливість використовувати всю.

міць мови, приклади виявляються менш короткими і элегант;

ными, як вони б бути. І хоча ми намагалися звести эти.

недоліки до мінімуму, все-таки майте їх ввиду.

Іншою вадою у тому, що наступні главы.

будуть неминуче повторювати вік деяких частин цієї глави. Ми на;

деемся, що таке повторення буде швидше допомагати, ніж раз;

дражать.

Принаймні, досвідчені програмісти повинні оказаться.

може проэкстраполировать матеріал даної глави на.

свої власні програмістські потреби. Початківці ж должны.

на додачу писати аналогічні маленькі самостоятельные.

програми. І всі, та інші може використати цей розділ как.

каркас, який будуть навішуватися докладніші описа;

ния, які з глави 2.

1.1. Hачинаем. Єдиний спосіб освоїти новий язык.

програмування — писати у ньому програми. Перша програм;

мало, що має бути написана, — одна всім языков:

надрукувати слова: HELLO, WORLD.

Це — найсуттєвіший бар'єр; аби здолати кривду его,.

ви повинні зуміти завести десь текст програми, успішно его.

скомпілювати, завантажити, прогнати і знайти, де оказалась.

ваша видача. Якщо ви і навчилися справлятися з тими техничес;

кими деталями, решта порівняно просто.

* 12 ;

Програма друку «HELLO, WORLD» мовою «З» має вид:

MAIN ().

{.

PRINTF («HELLO, WORLDN»);

}.

Як пропустити цю програму — залежить від используемой.

вами системи. Зокрема, на операційній системі «UNIX» вы.

повинні завести вихідну програму файлі, ім'я которого.

закінчується на «.З», наприклад, HELLO. C, і далі скомпили;

ровать її за команде.

CC HELLO.C.

Якщо ви і не допустили будь-якої недбалості, такий как.

перепустку символу чи неправильне написання, компіляція прой;

дет без повідомлень і буде створено виконуваний файл з именем.

а.OUT. Прогін його за команде.

A.OUT.

призведе до выводу.

HELLO, WORLD.

На інших системах цих правил будуть іншими; проконсуль-тируйтесь із місцевим авторитетом.

Вправа 1−1.

Пропустіть цю програму за вашої системі. Попробуйте.

не включати різні частини програми розвитку й подивіться які со;

спілкування помилки ви у своїй получите.

Тепер деякі пояснення до саму програму. Любая.

«C"-программа, який був розмір, складається з одной.

чи більше «функцій», вказують фактичні операции.

комп’ютера, що їх виконані. Функції в языке.

«З» подібні функцій і підпрограмам фортрану і процедурам.

PL/1, паскаля тощо. У прикладі такий функцією является.

MAIN. Зазвичай ви можете давати функцій будь-які імена по вашему.

розсуду, але MAIN — це особливе ім'я; виконання вашої прог;

раммы починається спочатку з функції MAIN. Це означає, что.

кожна програма повинна у якомусь місці утримувати функцію с.

ім'ям MAIN. На виконання певних дій функция.

MAIN зазвичай звертається решти функцій, частина з которых.

перебуває у тієї ж саму програму, а частина — в библиотеках,.

містять раніше написані функции.

* 13 ;

Одним способом обміну даними між функціями является.

передача у вигляді аргументів. Круглі дужки, следующие.

за ім'ям функції, укладають у собі список аргументів; здесь.

маIN — функція без аргументів, що вказується як (). Опе;

раторы, складові функцію, полягають у фігурні скобки.

{ і }, які аналогічні DO-END в PL/1 чи BEGIN-END в ал;

голі, паскале тощо. Звернення до функції здійснюється ука;

занием її імені, котрого супроводжує укладений у круглые.

дужки список аргументів. але немає жодних операторів CALL,.

як і фортрані чи PL/1. Круглі дужки повинні присутство;

вать у тому разі, коли функція немає аргументов.

Строка.

PRINTF («HELLO, WORLDN»);

є зверненням до функції, що викликає функцию.

безпосередньо з ім'ям PRINTF і аргуметом «HELLO, WORLDN». Функція PRINTF.

є бібліотечної функцією, яка видає вихідні дан;

ные до терміналу (за умови що немає інше мес;

то призначення). У разі друкується рядок символов,.

що є аргументом функции.

Послідовність із будь-якої кількості символів, зак;

люченных в подвоєні лапки «…», називається «символьной.

рядком «чи «малої константою ». Зараз ми будемо использо;

вать символьні рядки лише як аргументів для.

PRINTF та інших функций.

Послідовність N в наведеної рядку является.

позначенням мовою «З» для «символу нової рядки », кото;

рый служить зазначенням до переходу на терміналі до лівого краю.

наступній рядки. Якщо ви хоч не включіть N (корисний экспери;

мент), то знайдете, що ваша видача не закінчиться перехо;

будинок термінала нові рядок. Використання последователь;

ности N — єдиний спосіб запровадження символу нової строки.

в аргумент функції PRINTF; коли ви спробуєте что-нибудь.

вроде.

PRINTF («HELLO, WORLD.

");

то «C"-компилятор буде друкувати зловтішні диагностические.

повідомлення про саме ті кавычках.

Функція PRINTF не забезпечує автоматичного перехода.

нові рядок, отже багаторазове звернення до неї можно.

використовуватиме поетапної складання вихідний рядки. Наша пер;

вая програма, друкуюча ідентичну видачу, точнісінько таким.

самим успіхом міг би бути написана в виде.

MAIN ().

{.

PRINTF («HELLO, «);

PRINTF («WORLD»);

PRINTF («N»);

}.

* 14 ;

Підкреслимо, що N представляє лише одне символ. Ус;

ловные «послідовності «, подібні N, дають загальний рівень і до;

який запускає розширення механізм до подання важких для.

друку чи невидимих символів. Серед інших символів в языке.

«З» передбачені такі: т — для табуляції, B — для.

повернення однією позицію, «- для подвійний лапки і для.

самої зворотної косою черты.

Вправа 1−2.

Проведіть експерименти у тому, щоб отримати що прои;

зойдет, тоді як рядку, що є аргументом функції PRINTF.

міститиметься X, де X — певний символ, не входящий.

в вищенаведений список.

1.2. Змінні і арифметика.

Наступна програма друкує наведену нижче таблицу.

температур за Фаренгейтом та його еквівалентів по стоградусной.

шкалою Цельсія, використовуючи для перекладу формулу.

З = (5/9)*(F-32).

0 -17.8.

20 -6.7.

40 4.4.

60 15.6.

… …

260 126.7.

280 137.8.

300 140.9.

Тепер сама программа:

/* PRINT FAHRENHEIT-CELSIUS TABLE.

FOR F = 0, 20, …, 300 */.

MAIN ().

{.

INT LOWER, UPPER, STEP;

FLOAT FAHR, CELSIUS;

LOWER = 0; /* LOWER LIMIT OF TEMPERATURE.

TABLE */.

UPPER =300; /* UPPER LIMIT */.

STEP = 20; /* STEP SIZE */.

FAHR = LOWER;

WHILE (FAHR.

CELSIUS = (5.0/9.0) * (FAHR -32.0);

PRINTF («%4.0 °F %6.1FN», FAHR, CELSIUS);

FAHR = FAHR + STEP;

}.

}.

* 15 ;

Перші дві строки.

/* PRINT FAHRENHEIT-CELSIUS TABLE.

FOR F = 0, 20, …, 300 */.

є коментарем, який у цьому разі коротко пояс;

няет, що робить програма. Будь-які символи між /* і */ иг;

норируются компілятором; можна вільно користуватися коммен;

тариями для полегшення розуміння програми. Коментарі мо;

гут з’являтися будь-де, де може бути прогалину чи пере;

на певний нову строку.

У мові «З» все перемінні мають бути описані до їх ис;

користування, зазвичай робиться у початку функції до первого.

виконуваного оператора. Якщо ви хоч забудете вставити описание,.

одержите діагностичне повідомлення від компілятора. Описа;

ние складається з типу, і списку змінних, мають цей тип,.

як в.

INT LOWER, UPPER, STEP;

FLOAT FAHR, CELSIUS;

Тип INT означає, що це перемінні списку цілі; тип.

FLOAT призначений для чисел з плаваючою точкою, тобто. для.

чисел, що мати дробову частина. Точність як INT ,.

TAK і FLOAT залежить від конкретної машини, де ви ра;

ботаете. На PDP-11, наприклад, тип INT відповідає 16-бито;

вому числу зі знаком, тобто. числу, лежачому між -32 768 и.

+32 767. Кількість типу FLOAT — це 32-битовое число, имеющее.

майже сім значущих цифр пояснення, що буде в діапазоні від 10е-38 до.

10е+38. У розділі 2 наводиться список розмірів й інших ма;

шин.

У мові «З» передбачено трохи інших основних ти;

заговорили українською у даних, крім INT і FLOAT:

CHAR символ — один байт.

SHORT короткий целое.

LONG довше целое.

DOUBLE плавающее з подвійним точностью.

Розміри цих об'єктів теж машинно-независимы; детали.

наведені у главі 2. Є також масиви, структури та об;

ъединения цих основних типів, покажчики ними і функ;

ции, которые їх повертають; з усіма ними ми зустрінемося в.

своє время.

Фактично обчислення у програмі перекладу температур

розпочинаються з операторів присваивания.

LOWER = 0;

UPPER =300;

STEP = 20;

FAHR =LOWER;

які дають змінним їх початкові значення. кожен от;

слушну оператор закінчується точкою з запятой.

Кожний рядок таблиці обчислюється однаковим образом,.

отже, ми використовуємо цикл, який повторювався одного разу на стро;

ку. У цьому вся призначення оператора WHILE:

WHILE (FAHR.

}.

* 16 ;

перевіряється умова в круглі дужки. Якщо він истинно.

(FAHR менше, або одно UPPER), то виконується тіло цикла.

(всі оператори, укладені фігурні дужки { і }). Затем.

знову перевіряється ця умова і, коли вона істинно, знову вы;

полняется тіло циклу. Якщо ж умова не виконується (FAHR.

перевершує UPPER), цикл завершується і відбувається переход.

до виконання оператора, наступного за оператором циклу. Так.

як і справжньої програмі ніяких наступних операто;

рів, то виконання програми завершается.

Тіло оператора WHILE може складатися зі однієї чи более.

операторів, ув’язнених у фігурні дужки, як і программе.

перекладу температур, або з одного оператора без скобок,.

як, наприклад, в.

WHILE (I < J)>

I = 2 * I;

У обох випадках оператори, керовані оператором WHILE,.

зсунуто однією табуляцію, щоб з першого взгляда.

бачити, які оператори перебувають всередині циклу. Такий сдвиг.

підкреслює логічний структуру програми. Хоча у языке.

«З» допускається цілком довільне розташування опера;

торів в рядку, підходящий зрушення і пробелов.

значно полегшують читання програм. Ми рекомендуємо писать.

лише одне оператор на рядку і (зазвичай) залишати пробелы.

навколо операторів. Розташування фігурних скобок менш сущес;

твенно; ми вибрали одне із кількох популярних стилів. Вы;

беріть придатний вас стиль і далі використовуйте його пос;

ледовательно.

Більшість роботи виконується у тілі циклу. Темпера;

туру за Цельсієм обчислюється і присвоюється переменной.

CELAIUS оператором.

CELSIUS = (5.0/9.0) * (FAHR-32.0);

причина використання висловлювання 5.0/9.0 замість выглядящего.

простіше 5/9 у тому, що у мові «З», як й у мно;

гих іншими мовами, під час ділення цілих відбувається усечение,.

яке у відкиданні дробової частини результату. Таким об;

разом, результат операції 5/9 нульовий, й, звісно, в этом.

цьому випадку всі температури були б рівними нулю. Десятичная.

точка в константі вказує, що вона не має тип з плавающей.

точкою, отже, як ми й хотіли, 5.0/9.0 одно 0.5555… .

Ми також писали 32.0 замість 32, як і раніше, що так.

як змінна FAHR має тип FLOAT, ціле 32 автоматически.

б перетворилося до типу FLOAT (в 32.0) перед вычитанием.

З погляду стилю розумно писати плаваючі константи с.

явною десяткової точкою навіть, коли вони мають целые.

значення; це підкреслює їх плаваючу природу для просмат;

ривающего програму і відданість забезпечує те, що компілятор будет.

оцінювати речі як і, як і Вы.

* 17 ;

Докладні правила у тому, у випадку цілі преобразу;

ются до типу з плаваюшей точкою, наведені у главі 2. Сейчас.

ж таки відзначимо, що присваивание.

FAHR = LOWER;

проверка.

WHILE (FAHR.

працюють, як очікується, — перед виконанням операцій целые.

перетворюються на плаваючу форму.

Той самий приклад повідомляє трохи більше у тому, як работает.

PRINTF. Функція PRINTF фактично є универсальной.

функцією форматних перетворень, яка полностью.

описано на главі 7. Її першим аргументом є рядок сим;

волів, що має бути надрукована, причому кожен знак %.

вказує, куди повинен підставлятися кожен із інших ар;

гументов /другий, третій, …/ у якій формі він має пе;

чататься. Наприклад, в операторе.

PRINTF («%4.0 °F %6.1FN», FAHR, CELSIUS);

специфікація перетворення %4.0 °F каже, що кількість з пла;

вающей точкою має бути надрукований полі шириною по край;

ній мері вчетверо символу без цифр після десяткової точки.

специфікація %6.1 °F описує інше число, яке должно.

займати по крайнього заходу шість позицій з одного цифрою после.

десяткової точки, аналогічно специфікаціям F6.1 в фортране.

чи F (6,1) в PL/1. Різні частини специфікації можуть быть.

опущені: специфікація %6 °F каже, що кількість буде шириной.

по крайнього заходу о шостій символів; специфікація %2 требует.

двох позицій після десяткової точки, але ширина у своїй не.

обмежується; специфікація %F говорить про тому, что.

потрібно надрукувати число з плаваючою точкою. Функція PRINTF.

також розпізнає такі специфікації: %D — для десятично;

го цілого, %про — для восьмеричного числа, %x — для шестнадца;

тиричного, %з — для символу, %P.S — для символьній рядки — і %%.

* самих символу %.

Кожна конструкція з символом % у першому аргументі функ;

ции PRINTF узгоджується з відповідним другим, третім, и.

т.д. Аргументами; вони мають узгоджуватися за кількістю і ти;

пу; інакше ви отримаєте безглузді результаты.

Між іншим, функція PRINTF перестав бути частиною языка.

«З»; у самому мові «З» не визначено операції ввода-вывода.

Немає нічого таємничого й у функції PRINTF; це — просто.

корисна функція, що є частиною стандартної библиотеки.

підпрограм, що зазвичай доступна «C"-программам. Чтобы.

зосередитися на мові, не будемо докладно оста;

навливаться на операціях виводу-введення-висновку до глави 7. У частнос;

ти, до того часу відкладемо форматний введення. Якщо до вас надо.

запровадити числа — прочитайте опис функції SCANF у розділі 7,.

розділ 7.4. Функція SCANF багато в чому подібна до PRINTF, але она.

зчитує вхідні дані, а чи не друкує выходные.

* 18 ;

Вправа 1−3.

Перетворіть програму перекладу температур таким обра;

зом, щоб він друкувала заголовок до таблице.

Вправа 1−4.

Напишіть програми друку відповідної таблиці пере;

ходу від градусів цельсія до градусів фаренгейта.

1.3. Оператор FOR.

САМІ Як і можна було б очікувати, є чимало различных.

способів написання кожної програми. Давайте розглянемо та;

дідька лисого варіант програми перекладу температур:

MAIN () /* FAHRENHEIT-CELSIUS TABLE */.

{.

INT FAHR;

FOR (FAHR = 0; FAHR.

PRINTF («%4D %6.1FN», FAHR, (5.0/9.0)*(FAHR-32.0));

}.

Ця програма видає ті ж результати, але выглядит.

безумовно інакше. Головне зміна — виняток боль;

шинства змінних; залишилася лише змінна FAHR, причем.

типу INT (це у тому, щоб продемонстрировать.

перетворення %D до функцій PRINTF). Нижня і верхня грани;

цы і величину щага виходять лише один як константи в операторе.

FOR, яка сама є новою конструкцією, а выражение,.

вичислювальне температуру по цельсію, входить нині у виде.

третього аргументу функції PRINTF, а чи не як отдельного.

оператора присваивания.

Останнє зміна є взірцем цілком загального пра;

вила мови «З» — у кожному контексті, у якому допускается.

використання значення перемінної деякого типу, ви можете.

вжити вислів цього. Оскільки третій аргумент.

функції PRINTF повинен мати значення з плаваючою точкой,.

аби відповідати специфікації %6.1 °F, то цьому месте.

може зустрітися будь-яке вираз плаваючого типа.

Сам оператор FOR — це оператор циклу, узагальнюючий опера;

тор WHILE. Його функціонування має стати ясним, якщо вы.

порівняйте його з раніше описаним оператором WHILE. Оператор

FOR містить частини, розділяються точкою з коми. Первая.

часть.

FAHR = 0.

виконується одного разу перед входом в сам цикл. Друга частина ;

перевірка, чи умова, яке управляє циклом:

FAHR.

ця умова перевіряється і, коли вона істинно, то выполняется.

тіло циклу (у разі лише функція PRINTF). Затем.

виконується крок реинициализации.

* 19 ;

FAHR =FAHR + 20.

і умова перевіряється знову. цикл завершується, коли це ус;

ловие стає хибним. Також, як у разі оператора.

WHILE, тіло циклу може складатися зі однієї чи из.

групи операторів, ув’язнених у фігурні дужки. Инициали;

зирующая і реинициализирующая частини може бути будь-якими от;

діловими выражениями.

Вибір операторів WHILE і FOR довільний і основы;

вается у тому, що ясніше. Оператор FOR зазвичай удо;

бен для циклів, у яких ініціалізація і реинициализация.

логічно пов’язані Шекспір і кожна задається одним оператором, так.

як цього разі запис більш компактна, аніж за использо;

вании оператора WHILE, а оператори управління циклом сосре;

дотачиваются разом у одному месте.

Вправа 1−5.

Модифікуйте програму перекладу температур таким обра;

зом, щоб він друкувала таблицю у порядку, тобто. От.

300 градусів до 0.

1.4. Символічні константы.

Останнє зауваження, як ми назавжди оставим.

програму перекладу температур. Ховати «магічні числа»,.

такі як 300 і 20, всередину програми — це невдала практи;

ка; вони дають мало інформації тим, хто, можливо, повинен бу;

дет розумітися на програмі пізніше, та його важко изме;

нять систематичним чином. На щастя у мові «З» предус;

мотрен спосіб, дозволяє уникнути таких «магічних чи;

сіл". Використовуючи конструкцію #DEFINE, ви можете в начале.

програми визначити символічне ім'я чи символическую.

константу, яка конкретної рядком символів. Впос;

ледствии компілятор замінить не все укладені лапки по;

явища це ім'я на відповідну рядок. Фактически.

це може бути замінене абсолютно довільним текстом,.

необов’язково цифрами.

#DEFINE LOWER 0/* LOWER LIMIT OF TABLE */.

#DEFINE UPPER 300 /* UPPER LIMIT */.

#DEFINE STEP 20 /* STEP SIZE */.

MAIN () /* FAHRENHEIT-CELSIUS TABLE */.

{.

INT FAHR;

FOR (FAHR =LOWER; FAHR.

PRINTF («%4D %6.1FN», FAHR, (5.0/9.0)*(FAHR-32));

}.

величини LOWER, UPPER і STEP є константами і поэ;

тому де вони вказуються в описах. Символічні имена.

зазвичай пишуть прописними літерами, щоб їх було легко отли;

чить від написаних рядковими літерами імен змінних. отме;

тім, що наприкінці визначення не ставиться точка з запятой.

Оскільки підставляється вся рядок, наступна за определенным.

ім'ям, це призвело б до занадто великого числу точок с.

коми в операторі FOR .

* 20 ;

1.5. Набір корисних программ.

Нині ми збираємося розглянути сімейство родственных.

програм, виділені на виконання простих операций.

над символьними даними. Надалі ви знайдете, что.

багато програм є просто розширеними версіями тех.

прототипів, які ми тут обсуждаем.

1.5.1. Введення та виведення символов.

Стандартна бібліотека включає функції для читання і за;

писи за одним символу воднораз. функція GETCHAR () извле;

кает наступний запроваджуваний символ щоразу, як до неї обраща;

ются, і повертає цей символ як «своє значения.

Це означає, що после.

З = GETCHAR ().

змінна «З «містить наступний символ з вхідних данных.

Символи зазвичай надходять із термінала, але ці на повинен нас.

стосуватися до глави 7.

Функція PUTCHAR© є доповненням до GETCHAR: в.

результаті обращения.

PUTCHAR ©.

вміст перемінної «З «видається певний вихідний но;

ситель, зазвичай знову до терміналу. Звернення до функциям.

PUTCHAR і PRINTF можуть перемежовуватися; видача буде появляться.

у порядку, у якому відбуваються обращения.

САМІ Як і функція PRINTF, функції GETCHAR і PUTCHAR не со;

тримають нічого екстраординарного. Не входять до складу язы;

ка «З», але до них можна обратиться.

1.5.2. Копіювання файла.

Маючи у своєму розпорядженні лише функції GETCHAR и.

PUTCHAR ви можете, не знаючи нічого більше про операції вво;

та-висновку, написати дивовижне кількість корисних прог;

рамм. Найпростішим прикладом може бути програма посимволь;

ного копіювання вступного файла в вивідний. Загальна схема име;

ет вид:

запровадити символ.

WHILE (символ перестав бути ознакою кінця файла).

вивести хіба що прочитаний символ.

запровадити нову символ.

програма, написана мовою «З», виглядає наступним обра;

зом:

MAIN () /* COPY INPUT TO OUTPUT; 1ST VERSION */.

{.

INT C;

З = GETCHAR ();

WHILE (З ≠ EOF) {.

PUTCHAR (c);

З = GETCHAR ();

}.

}.

* 21 ;

оператор відносини ≠ означає «не равно».

Основна проблема у тому, щоб зафиксиро;

вать кінець файла введення. Зазвичай, коли функція GETCHAR натал;

кивается наприкінці файла введення, вона повертає значення, не.

що є дійсним символом; в такий спосіб, программа.

може встановити, що файл введення вичерпаний. Єдине ос;

ложнение, що є значним незручністю, полягає в.

існування двох загальновживаних угод у тому, ка;

де значення фактично є ознакою кінця файла. Мы.

відсунемо рішення цього питання, використавши символическое.

ім'я EOF при цьому значення, хоч би яким воно не було. На практи;

ке EOF або -1, або 0, отож у правильної работы.

перед програмою має стояти власне либо.

#DEFINE EOF -1.

либо.

#DEFINE EOF 0.

Використавши символічну константу EOF для представле;

ния значення, возвращаемого функцією GETCHAR коли на.

кінець файла, ми забезпечили, що тільки одна величина в прог;

рамме залежить від конкретного чисельного значения.

Ми також описали зміну «З «як INT, а чи не CHAR, с.

тим аби воно могло зберігати значення, яке GETCHAR .

як побачимо у розділі 2, їх кількість справді INT, так.

як має мати змогу на додачу всім возмож;

ным символів бути і EOF.

Програмістом, має досвід роботи з «З», программа.

копіювання було б написана стисліше. У мові «З» любое.

присвоювання, таке как.

З = GETCHAR ().

можна використовувати у натуральному вираженні; його значення — просто.

значення, присваиваемое лівої частини. Якщо присвоювання сим;

вола перемінної «З «помістити всередину перевірочною частини опе;

ратора WHILE, то програма копіювання файла запишеться в.

виде:

MAIN () /* COPY INPUT TO OUTPUT; 2ND VERSION */.

{.

INT C;

WHILE ((З = GETCHAR ()) ≠ EOF).

PUTCHAR (c);

}.

Програма дістає символ, привласнює його переменной.

" З «і далі перевіряє, чи цей символ признаком.

кінця файла. Якщо ні - виконується тіло оператора WHILE,.

выводящее цей символ. Потім цикл WHILE повторюється. когда,.

нарешті, дійдуть кінець файла введення, оператор WHILE.

завершується, а разом із закінчується виконання і функ;

ции MAIN .

* 22 ;

У цьому версії централізується введення — у програмі только.

звернення до функції GETCHAR — і ужимается программа.

Вкладення присвоювання в проверяемое умова — це одне из.

тих місць мови «З», який призводить до значному сокра;

щению програм. Проте, цьому шляху можна захопитися і начать.

писати недоступні розуміння програми. Цю тенденцію мы.

намагатимемося сдерживать.

Важливо зрозуміти, що круглі дужки навколо присвоювання в.

умовному вираженні справді необхідні. Старшинство.

операції ≠ вище, ніж операції присвоювання =, але це означа;

ет, що за відсутності круглих скобок перевірка умови ≠ бу;

дет виконано до присвоювання =. Отже, оператор

З = GETCHAR () ≠ EOF.

еквівалентний оператору.

З = (GETCHAR () ≠ EOF).

Це, всупереч нашому бажанню, призведе до того що, що «З «.

прийматиме значення 0 чи 1 залежно від цього, на;

штовхнеться чи ні GETCHAR на ознака кінця файла. Подробнее.

звідси буде вказано у розділі 2/.

1.5.3. Підрахунок символов.

Наступна програма підраховує число символів; она.

є невеличке розвиток програми копирования.

MAIN () /* COUNT CHARACTERS IN INPUT */.

{.

LONG NC;

NC = 0;

WHILE (GETCHAR () ≠ EOF).

++NC;

PRINTF («%1DN», NC);

}.

Оператор

++NC;

демонструє нову операцію, ++, що означає увеличе;

ние на одиницю. Ви міг би написати NC = NC + 1, але ++NC.

лаконічніше і часто ефективніше. Є соответст;

вующая операция—уменьшение на одиницю. Операції ++ и—.

можуть бути або префиксными (++NC), або постфиксными.

(NC++); ці дві форми, як буде показано у розділі 2, мають в.

висловлюваннях різні значення, але, як ++NC, і NC++ уве;

личивают NC. Зараз ми дотримуватимемося префиксных опера;

ций.

* 23 ;

Програма підрахунку символів накопичує їх кількість в.

перемінної типу LONG, а чи не INT. На PDP-11 максимальне зна;

чение одно 32 767, і якщо описати лічильник як INT, то он.

буде переповнятися навіть за порівняно малому файлі ввода;

мовою «З» для HONEYWELL і IBM типи LONG і INT являются.

синонімами і мають значно більша розмір. Спецификация.

перетворення %1D вказує PRINTF, що соответствующий.

аргумент є цілим типу LONG .

Щоб справитися з ще більшими числами, ви можете ис;

користувати тип DOUBLE / FLOAT подвійний довжини/. ми також ис;

пользуем оператор FOR замість WHILE про те, щоб проиллюстри;

ровать інший шлях записи цикла.

MAIN () /* COUNT CHARACTERS IN INPUT */.

{.

DOUBLE NC;

FOR (NC = 0; GETCHAR () ≠ EOF; ++NC).

;

PRINTF («%.0FN», NC);

}.

Функція PRINTF використовує специфікацію %F як FLOAT.

так DOUBLE; специфікація %.0 °F придушує печатку не;

існуючої дробової части.

Тіло оператора циклу FOR тут порожньо, оскільки все рабо;

та виконується в перевірочною і реинициализационной частях.

Але граматичні правила мови «З» вимагають, щоб оператор

FOR мав тіло. Ізольована точка з коми, соответствую;

шая порожньому оператору, з’являється тут, щоб удовлетворить.

цієї вимоги. Ми від'єднали в окремий рядок, чтобы.

зробити більш заметной.

Перш чому ми распростимся з програмою підрахунку симво;

вилов, відзначимо, що й файл введення зовсім позбавлений ніяких симво;

вилов, то умова в WHILE чи FOR не виконане буде при самому пер;

вом зверненні до GETCHAR, і, отже, програма вы;

дасть нуль, тобто. Справився. ця важлива зауваження. од;

них із приємних властивостей операторів WHILE і FOR є то,.

що вони перевіряють умова на початку циклу, тобто. До выполнения.

тіла. Якщо не треба, то щось буде сдела;

але, навіть якщо це, що тіло циклу будь-коли будет.

виконуватися. програми має діяти розумно, коли они.

звертаються з файлами типу «ніяких символів». Операторы.

WHILE і FOR допомагають забезпечити правильна поведінка прог;

рамм при граничних значеннях перевірених условий.

1.5.4. Підрахунок строк.

Наступна програма підраховує кількість рядків в.

файлі введення. Передбачається, що рядки введення заканчиваются.

символом нової рядки N, скрупульозно доданим до каждой.

виписаної строке.

* 24 ;

MAIN () /* COUNT LINES IN INPUT */.

{.

INT C, NL;

NL = 0;

WHILE ((З = GETCHAR ()) ≠ EOF).

IF (З == «N »).

++NL;

PRINTF («%DN», NL);

}.

Тіло WHILE тепер містить оператор IF, що у свою.

чергу управляє оператором збільшення ++NL. Оператор IF.

перевіряє укладене круглі дужки умова і, якщо оно.

істинно, виконує наступний його оператор /чи группу.

операторів, ув’язнених у фігурні дужки/. Ми знову исполь;

зовали зрушення вправо, щоб показати, що замість управляет.

Подвоєний знак рівності == є позначенням в.

мові «З» для «одно» /аналогічно .EQ. У фортрані/. Этот.

символ запроваджено у тому, щоб відрізняти перевірку на равенство.

від одиночного =, використовуваного при привласненні. Оскільки в.

типових «З» — програмах знак присвоювання зустрічається при;

розмірено вдвічі частіше, ніж перевірка на рівність, то естест;

венно, щоб знак оператора був наполовину короче.

Будь-який окремий символ то, можливо записано всередині оди;

нічних лапок, і навіть цьому відповідає значення, рав;

ное чисельному значенням цього символу на машинному наборі сим;

волів; це й називається символьній константою. Так, например,.

" A «- символьна константа; його значення у традиційному наборі символов.

ASCII /американський стандартний код обмінюватись информацией/.

одно 65, внутрішньому уявленню символу а. Звісно, «A «.

краще, ніж 65: його зміст очевидна й не зависит.

від конкретного машинного набору символов.

Умовні послідовності, використовувані в символьных.

рядках, також займають законне місце серед символьних кон;

стант. Так було в перевірках і арифметичних висловлюваннях «N «.

представляє значення символу нової рядки. Ви повинні твердо.

усвідомити, що «N «- окремий символ, що у выражениях.

еквівалентний одиночному цілому; з іншого боку «N» — это.

символьна рядок, що містить лише одне символ. Воп;

ріс про зіставленні рядків і символів обговорюється у розділі 2.

Вправа 1−6.

Напишіть програму для підрахунку прогалин, табуляцій и.

нових строк.

Вправа 1−7.

Напишіть програму, яка копіює введення виведення, за;

змінюючи заодно кожну послідовністю однієї чи более.

прогалин однією пробел.

1.5.5. Підрахунок слов.

Четверта програма з нашого серії корисних программ.

підраховує кількість рядків, слів і символів, используя.

у своїй дуже широка визначення, що словом є лю;

баючи послідовність символів, яка містить прогалин, та;

буляций чи нових рядків. /Це — спрощена версія утилиты.

" WC «системи «UNIX «/.

* 25 ;

#DEFINE YES 1.

#DEFINE NO 0.

MAIN () /* COUNT LINES, WORDS, CHARS IN INPUT */.

{.

INT З, NL, NW, INWORD;

INWORD = NO;

NL = NW = NC = 0;

WHILE ((C = GETCHAR ()) ≠ EOF) {.

++NC;

IF (З == «N »).

++NL;

IF (З== «» !! З== «N » !! З== «T »).

INWORD = NO;

ELSE IF (INWORD == NO) {.

INWORD = YES;

++NW;

}.

}.

PRINTF («%D %D %DN», NL, NW, NC);

}.

Щоразу, коли програма зустрічає перший символ.

слова, вона збільшує лічильник числа слів на одиницю. Пере;

менная INWORD стежить те, перебуває чи програма в насто;

ящий момент всередині слова чи ні; спочатку цієї переменной.

присвоюється «над слові», чому відповідає значення NO.

Ми воліємо символічні константи YES і NO литерным.

значенням 1 і 0, оскільки роблять програму більш удоб;

іншої для читання. Звісно, у такому крихітної програмі, как.

ця, це призводить до помітної різниці, але у більших прог;

раммах збільшення ясності цілком стоїть тих скромних дополни;

тільних зусиль, яких вимагає і проходження цьому принципу с.

початку. Ви також знайдете, що суттєві измене;

ния набагато легше вносити у ті програми, де числа фигури;

руют лише як символьних констант.

Строка.

NL = NW = NC = 0;

вважає все три перемінні рівними нулю. Це не.

особливий випадок, а слідство тієї обставини, що операто;

ру присвоювання відповідає деяке значення і присваи;

вания проводяться послідовно справа-наліво. Таким обра;

зом, справи такі, коли б ми написали.

NC = (NL = (NW = 0));

операція !! Означає OR, отже строка.

IF (З== «» !! З== «N » !! З== «T »).

каже «якщо з — прогалину, чи з — символ нової рядки, чи с.

* табуляція …"./умовна послідовність T является.

зображенням символу табуляции/.

*.

26 ;

Є відповідна операція && для AND. Выражения,.

пов’язані операціями && чи !!, Розглядаються зліва на.

право, і навіть гарантується, що оцінювання выражений.

припиниться, коли стане ясно, чи є все.

вираз істинним чи хибним. Тож якщо «З «оказывается.

прогалиною, то немає потреби перевіряти, является.

чи «З «символом нової рядки чи табуляції, і ті проверки.

справді не робляться. У разі це имеет.

принципового значення, але, як незабаром побачимо, в более.

складних ситуаціях ця особливість мови дуже существенна.

Цей приклад також демонструє оператор ELSE мови «C»,.

що вказує то дію, які мають выполняться,.

якщо умова, що міститься в операторі IF, виявиться ложным.

Загальна форма такова:

IF (выражение).

оператор-1.

ELSE оператор-2.

Виконується сам і лише з двох операторів, свя;

занных з конструкцією IF-ELSE. Якщо вираз істинно, вы;

полняется оператор-1; якщо ні - виконується оператор-2.

Фактично кожен оператор можна досить складним. В.

програмі підрахунку слів оператор, наступний за ELSE, явля;

ется опертором IF, який управляє двома операторами в.

фігурних скобках.

Вправа 1−9.

Як ви стали перевіряти програму підрахунку слів ?

Kакие є обмеження ?

Вправа 1−10.

Напишіть програму, яка друкувати слова з фай;

ла введення, причому за одним на строку.

Вправа 1−11.

Переробіть програму підрахунку слів, використовуючи лучшее.

прерозподіл «слова»; вважайте, наприклад словом последователь;

ность літер, цифр і апострофів, рачинающуюся з буквы.

1.6. Массивы.

Давайте напишемо програму підрахунку числа появ каж;

дой цифри, символів порожніх промежутков/пробел, табуляции,.

новий рядок/ й інших символів. Звісно, така за;

дача кілька штучна, але він нам проиллюст;

рировать лише у програмі відразу кількох аспектів языка.

«C».

Ми розбили запроваджувані символи на дванадцять категорій, и.

нам зручніше використовувати масив для зберігання числа появлений.

кожної цифри, а чи не десять окремих змінних. Ось одне из.

варіантів программы:

* 27 ;

MAIN () /* COUNT DIGITS, WHITE SPACE, OTHERS */.

{.

INT З, I, NWHITE, NOTHER;

INT NDIGIT[10];

NWHITE = NOTHER = 0;

FOR (I = 0; I < 10; ++I)>

NDIGIT[I] = 0;

WHILE ((З = GETCHAR ()) ≠ EOF).

IF (З >= «0 «&& З.

++NDIGIT[C- «0 «];

ELSE IF (C== «» !! З== «N » !! З== «T »).

++NWHITE;

ELSE.

++NOTHER;

PRINTF («DIGITS =»);

FOR (I = 0; I < 10; ++I)>

PRINTF («%D», NDIGIT[I]);

PRINTF («NWHITE SPACE = %D, OTHER = %DN»,.

NWHITE, NOTHER);

}.

Описание.

INT NDIGIT[10];

оголошує, що NDIGIT є масивом на десяток цілих. в.

мові «З» індекси масиву завжди розпочинаються з нуля /а чи не с.

1, як і фортрані чи PL/1/, отже елементами масиву яв;

ляются NDIGIT[0], NDIGIT[1],…, NDIGIT[9]. ця особенность.

відбито у циклах FOR, які инициализируют і печатают.

массив.

Індекс може бути будь-якою цілим вираженням, яке, ко;

нечно, може охоплювати цілі перемінні, такі як I, і це;

лые константы.

Ця затвердив програму сильно спирається на свойства.

символьного уявлення цифр. Приміром, в программе.

проверка.

IF (З >= «0 «&& З.

визначає, чи є символ в «З «цифрою, і якщо це так,.

то чисельна значення цієї цифри визначається за такою формулою / C.

* «0 «/. Такий спосіб працює в тому разі, якщо зна;

чения символьних констант «0 », «1 «тощо. Позитивні, рас;

покладено гаразд зростання і немає нічого, крім цифр,.

між константами «0 «і «9 ». На щастя, це правильно для всех.

загальноприйнятих наборів символов.

* 28 ;

За визначенням перед проведенням арифметичних опера;

ций, вовлекающих перемінні типу CHAR і INT, усі вони преоб;

роззуються до типу INT, TAK що у арифметичних висловлюваннях пе;

ремінні типу CHAR сутнісно ідентичні змінним типа.

INT. Це дуже природно, і зручно; наприклад, З — «0 «- это.

ціле вираз багатозначно між 0 і 9-те згідно с.

тим, який символ від «0 «до «9 «зберігається в «З », і, следова;

тельно, є підхожим індексом для масиву NDIGIT.

З’ясування питання, чи є даний символ цифрой,.

символом порожнього проміжку чи чимось іще, осуществляется.

послідовністю операторов.

IF (З >= «0 «&& З.

++NDIGIT[C- «0 «];

ELSE IF (C == «» !! З == «N » !! З == «T »).

++NWHITE;

ELSE.

++NOTHER;

Конструкция.

IF (условие).

оператор

ELSE IF (условие).

оператор

ELSE.

оператор

часто зустрічаються програми як висловлювання ситуа;

ций, у яких здійснюється вибір однієї з нескольких.

можливих решений.

Програма просто рухається згори донизу до того часу, пока.

не задовольниться якесь умова; тоді выполняется.

відповідний «оператор », і весь конструкція завершается.

/Звісно, «оператор «може складатися зі кількох операто;

рів, ув’язнених у фігурні дужки/. Якщо жоден з условий.

не задовольняється, то виконується «оператор », стоїть после.

заключного ELSE, коли вона присутній. Якщо последнеE.

ELSE і відповідні «оператор «опущені (як і программе.

підрахунку слів), те дій немає. Между.

початковим IF і кінцевим ELSE може поміщатися произвольное.

кількість групп.

ELSE IF (условие).

оператор

З погляду стилю доцільно записувати цю конст-рукцию адже ми показали, аби довгі висловлювання не залазили за правий край страницы.

Оператор SWITCH (перемикач), який рассматривается.

у розділі 3, представляє іншу змога записи раз;

розгалуження сталася на кілька варіантів. цей оператор особенно.

зручний, коли проверяемое вираз є або не;

яким цілим, або символьним вираженням, співпадаючим з од;

іншої з деякого набору констант. Версія цієї программы,.

яка використовує оператор SWITCH, для порівняння приведена.

у розділі 3.

* 29 ;

Вправа 1−12.

Напишіть програму, друкуючу гистограмму довжин слів из.

файла введення. Найстрашніше легке — накреслити гистограмму горизон;

тально; вертикальна орієнтація потребує великих усилий.

1.7. Функции.

У мові «З» функції еквівалентні підпрограмам чи функ;

циям в фортрані чи процедур у PL/1, паскале тощо. Функ;

ции дають зручний спосіб укладання певної частини вычисле;

ний в чорну скриньку, який надалі можна использовать,.

не цікавлячись його внутрішнім змістом. Использование.

функцій є фактично єдиний засіб справиться.

з потенційної складністю великих програм. Якщо функции.

організовані належним чином, можна ігнорувати то, как.

робиться робота; досить знання те, що робиться. Язык.

«З» розроблений в такий спосіб, щоб зробити использование.

функцій легким, зручним і ефективнішим. Вам будуть часто вст;

речаться функції завдовжки лише на кілька рядків, вызывае;

мые лише одне разів, і їх використовують лише тому, что.

це проясняє певну частину программы.

До цього часу ми використовували лише надані нам.

функції типу PRINTF, GETCHAR і PUTCHAR; нині на часі написать.

кілька наших власних. позаяк у «З» немає операції воз;

ведення до рівня, такої операції ** в фортрані чи PL/1,.

давайте проілюструємо механіку визначення функції на при;

мері функції POWER (M, N), возводящей ціле метрів за цілу положи;

тельную ступінь N. Так значення POWER (2,5) одно 32. Конеч;

але, цю функцію не виконує всієї хірургічної роботи операції **, пос;

кольку вона діють лише з позитивними ступенями не;

великих чисел, але ні додаткових затруд;

нений, змішуючи кілька різних вопросов.

Нижче наводиться функція POWER і яка використовує її основная.

програма, отже ви можете бачити повністю всю структуру.

MAIN () /* TEST POWER FUNCTION */.

{.

INT I;

FOR (I = 0; I < 10; ++I)>

PRINTF («%D %D %DN», I, POWER (2,I), POWER (-3,I));

}.

POWER (X, N) /* RAISE X N-TH POWER; N > 0 */.

INT X, N;

{.

INT I, P;

P = 1;

FOR (I =1; I.

P = P * X;

RETURN (P);

}.

* 30 ;

Усі функції мають однакову вид:

ім'я (список аргументів, якщо вони имеются).

опис аргументів, якщо вони имеются.

{.

описания.

операторы.

}.

Ці функції можуть бути записані у кожному порядку і нахо;

диться щодо одного чи двох вихідних файлах. Звісно, якщо ис;

ходная програма розміщається у двох файлах, вам придется.

дати більше вказівок при компіляції і завантаженні, тоді як конфлікт бы.

вона щодо одного, але це справа ОС, а.

не атрибут мови. Зараз, щоб все полу;

ченные інформацію про прогоні «З" — програм, залишилися незмінними в.

подальшому, ми припускати, що обидві функції находятся.

щодо одного й тому самому файле.

Функція POWER викликається двічі на строке.

PRINTF («%D %D %DN», I, POWER (2,I), POWER (-3,I));

при кожному зверненні функція POWER, отримавши два аргумента,.

вазвращает ціле значення, яке друкується в заданном.

форматі. У висловлюваннях POWER (2,I) є точно настільки ж це;

лым, як 2 і I. /Не всі функції видають ціле значення; мы.

займемося це питання у розділі 4/.

Аргументи функції POWER мають бути описані соответству;

ющим чином, бо їх типи відомі. Це на строке.

INT X, N;

яка слід за ім'ям функции.

Описание аргументів поміщаються між списком аргументов.

і новій лівої фігурного дужкою; кожне опис за;

канчивается точкою з коми. Імена, використані для ар;

гументов функції POWER, є суто локальними і недос;

тупны жодним іншим функцій: інші процедури можуть ис;

користувати ті ж імена без виникнення конфликта.

Це правда й у змінних I і P; I до функцій POWER ніяк не.

пов’язані з I до функцій MAIN.

Значення, розрахований функцією POWER, передаються в MAIN.

з допомогою оператора RETURN, точно такої ж, як і PL/1.

всередині круглих скобок написати будь-яке вираз. Функ;

ция зобов’язана повертати якесь значення; оператор

RETURN, він ніякого висловлювання, призводить до такой.

ж передачі управління, як «звалювання наприкінці» функции.

під час досягнення кінцевої правої фігурного дужки, але за этом.

в що викликає функцію не повертається ніякого корисного зна;

чения.

Вправа 1−13.

Апишите програму перетворення прописних літер з айла.

входження у рядкові, використовуючи у своїй функцію OWER©, кото;

раю повертає значення «З », якщо З «- не літера, і значение.

відповідної малої уквы, якщо «З «-буква.

* 31 ;

1.8. Аргументи — виклик по значению.

Один аспект в «З» може бути незвичним для прог;

раммистов, використані інші, в частности,.

фортран і PL/1. у мові «З» всі можливі аргументи функцій передаются.

«за значенням». це, що функція получает.

значення своїх аргументів з допомогою тимчасових переменных.

/фактично через стік/, а чи не їх адреси. Це спричиняє не;

яким особливостям, відмінними від тих, з якими ми сталки;

валися в мовами типу фортрану і PL/1, використовують «виклик по.

засланні «, де викликана процедура працює із адресою аргу;

мента, а чи не з його значением.

Головна відмінність у тому, що у «З» викликана функ;

ция неспроможна змінити зміну з викликає функції; она.

може змінювати тільки своє власну тимчасову копию.

Виклик за значенням, проте, не перешкода, а дуже ценное.

якість. Воно зазвичай призводить до більш компактним программам,.

що містить менше не які стосуються справі змінних, потому.

що з аргументами можна звертатися і з зручно инициализи;

рованными локальними перемнными викликаної процедури. Вот,.

наприклад, варіант функції POWER використовує це обстоятель;

ство.

POWER (X, N) /* RAISE X N-TH POWER; N > 0;

VERSION 2 */.

INT X, N;

{.

INT P;

FOR (P = 1; N > 0; —N).

P = P * X;

RETURN (P);

}.

Аргумент N використовують як тимчасова змінна; з не;

го віднімається одиниця до того часу, що він стане нулем.

Змінна I тут большє нє потрібна. щоб сталося з N.

всередині POWER це зовсім важить на аргумент, з яким пер;

воначально звернулися до функції POWER.

За необхідності таки можна знайти домогтися, щоб функция.

змінила зміну з викликає програми. Ця программа.

має забезпечити встановлення адреси перемінної /техничес;

кі, через покажчик на зміну/, а спричиненої функции.

треба описати відповідний аргумент як покажчик і ссы;

латься до фактичної перемінної побічно нього. Ми рас;

дивимося це докладно главі 5.

Коли ролі аргументу виступає ім'я масиву, то.

фактичним значенням, переданих функції, є адрес.

початку масиву. /Тут немає ніякої копіювання элементов.

масиву/. З допомогою індексації і адреси початку функція может.

знайти й змінити будь-який елемент масиву. Це — тема следующе;

го раздела.

* 32 ;

1.9. Масиви символов.

Очевидно найбільш загальним типом масиву в «З» является.

масив символів. Щоб проілюструвати використання мас;

сивов символів і обробних своїх функцій, давайте напишем.

програму, який читає набір рядків та друкує саму длин;

ную їх. Основна схема програми досить проста:

WHILE (є ще строка).

IF (ця рядок довші найдовшої из.

предыдущих).

запам’ятати цю рядок і його длину.

надрукувати найдовший строку.

За цією схемою ясно, що ваша програма природним образом.

розпадається сталася на кілька частин. Одна частина читає новую.

рядок, інша перевіряє її, третя запам’ятовує, а остальные.

частини програми управляють цим процессом.

Оскільки всі так чудово ділиться, було було б гаразд и.

написати програму соответсвующим чином. Давайте сначала.

напишемо окрему функцію GETLINE, яка извлекать.

наступний рядок з файла введення; це — узагальнення функции.

GETCHAR. спробуємо зробити це функцію по возможности.

гнучкішою, щоб у неї корисної й за іншими ситуациях.

Принаймні GETLINE повинна передавати сигнал можливий по;

явище кінця файла; більш загальний корисний варіант міг би пе;

редавать довжину рядки чи нуль, якщо зустрінеться кінець файла.

нуль може бути довжиною рядки, оскільки кожна рядок со;

тримає по крайнього заходу один символ; навіть рядок, содержащая.

лише символ нової рядки, має довжину 1.

Коли ми бачимо рядок, яка довші самої длинной.

з попередніх, що його треба десь запам’ятати. Це на.

думка про інший функції, COPY, яка копіювати но;

вую рядок на місце хранения.

Нарешті, потрібна нам основна програма для управления.

функціями GETLINE і COPY. Ось результат :

#DEFINE MAXLINE 1000 /* MAXIMUM INPUT.

LINE SIZE */.

MAIN () /* FIND LONGEST LINE */.

{.

INT LEN; /* CURRENT LINE LENGTH */.

INT MAX; /* MAXIMUM LENGTH SEEN SO FAR */.

CHAR LINE[MAXLINE]; /* CURRENT INPUT LINE */.

CHAR SAVE[MAXLINE]; /* LONGEST LINE, SAVED */.

MAX = 0;

WHILE ((LEN = GETLINE (LINE, MAXLINE)) > 0).

IF (LEN > MAX) {.

MAX = LEN;

COPY (LINE, SAVE);

}.

IF (MAX > 0) /* THERE WAS A LINE */.

PRINTF («%S», SAVE);

}.

* 33 ;

GETLINE (S, LIM) /* GET LINE INTO S, RETURN LENGTH */.

CHAR S[];

INT LIM;

{.

INT З, I;

FOR (I=0;I.

S[I] = C;

IF (З == «N ») {.

S[I] = C;

++I;

}.

S[I] = «.

Показати весь текст
Заповнити форму поточною роботою