Мова З
Ділиться, було було б гаразд инаписать програму соответсвующим чином. Давайте сначаланапишем. Більш загальний корисний варіант міг би пе-редавать довжину рядки чи нуль, якщо зустрінеться. Числами і адресами. Они можуть об'єднуватися і пересилатися у вигляді обычныхарифметических. Стандартної бібліотеки й предло-жения задля досягнення переносимості программы.Приложение. Висловлювання більш… Читати ще >
Мова З (реферат, курсова, диплом, контрольна)
Аннотация.
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».
Анотація. Мова «C"(произносится «сі») — це універсальну мистецьку мову програмування,.
котрому притаманні економічність висловлювання, сучасний потік управління.
і структури даних, багатий набір операторів. Мова «З» ні мовою «дуже.
високого рівня", ні «великим» мовою, і призначається для деякою.
спеціальної області застосування. але відсутність обмежень і спільність мови роблять.
його зручним і ефективнішим багатьом завдань, ніж мови, може бути.
потужніші. Мова «З», що призначався для написання операційній.
системи «UNIX» на ЕОМ DEC PDP-11, було розроблено й реалізований в цій системі.
Деннисом Ричи. Операційна система, компілятор з мови «З» по суті.
все прикладні програми системи «UNIX» (зокрема всі програмне забезпечення, використане.
для підготовки цієї книжки) написані на «З». Комерційні компілятори.
з мови «З» є й деяких інших 0.1. Запровадження. Мова «З» є.
універсальним мовою програмування. Він тісно пов’язані з операційній системою.
«UNIX», оскільки було розвинено в цій системи та оскільки «UNIX» і його програмне.
забезпечення написано на «З». Сама мова, проте, несвязан з якоюсь однієї.
операційній системою чи машиной;и хоча її називають мовою системного програмування,.
таккак він зручний написання операційними системами, разом з равнымуспехом.
використовувався під час написання великих вычислительныхпрограмм, програм для.
обробки текстів і баз данных. Язык «З» — це мову щодо «низького рівня».
Втакой характеристиці нічого немає образливого; це простоозначает, що «З».
оперує об'єктами тієї самої виду, що ибольшинство ЕОМ, саме, з символами,.
числами і адресами. Они можуть об'єднуватися і пересилатися у вигляді обычныхарифметических.
і логічних операцій, здійснюваних реаль-ными ЭВМ. В мові «З».
відсутні операції, мають справа непос-редственно зі складаними об'єктами,.
такі як рядки симво-лов, безлічі, списки чи з масивами, розглянутими.
какцелое. Тут, наприклад, немає ніякої аналога операціям PL/1,оперирующим з.
цілими масивами і рядками. Мова не предос-тавляет ніяких можливостей.
розподілу памяти, кроме статичного ухвали і механізму стеков, обеспечи-ваемого.
локальними змінних функцій; але немає ни"куч"(HEAP), ні «складання сміття»,.
як це передбачається вАЛГОЛЕ-68. Нарешті, сам собою «З» не забезпечує.
никакихвозможностей вводу-виводу: але немає операторів READ илиWRITE і.
ніяких вбудованих методів доступу до файлам. Усі этимеханизмы високого рівня повинні.
забезпечуватися явно вызыва-емыми функциями. Аналогично, мову «З» пропонує.
лише, после-довательные конструкції потоків управління: перевірки, циклы, группирование.
і підпрограми, але з мультипрограммирование, параллельные операції,.
синхронізацію чи сопрограммы. Хотя відсутність деяких із цих коштів.
може выгля-деть як гнітюча неповноцінність («виходить, що долженобращаться.
до функції, щоб порівняти два простих рядки символів?!"), але утримання мови в скромних.
розмірах дає реальныепреимущества. Оскільки «З» щодо малий, не требуетмного.
місця для свого описи і то, можливо швидко выучен. Компилятор з «З».
то, можливо простою й компактним. Крім то-го, компілятори легко пишуться; при.
використанні современнойтехнологии очікується написання компілятора для нової.
ЭВМза кілька місяців і навіть виявиться, що 80 відсотків прог-раммы нового.
компілятора буде спільної з програмою для ужесуществующих компіляторів. Це забезпечує.
високу степеньмобильности мови. Оскільки типи даних, і стуктуры управле-ния,.
що у «З», безпосередньо підтримуються боль-шинством існуючих.
ЕОМ, бібліотека, необхідна у времяпрогона ізольованих програм, виявляється.
дуже маленькой. На PDP -11, наприклад, вони містять лише програми для32-битового.
множення і ділення клітин і до виконання программввода та виведення послідовностей.
Звісно, кожна реализа-ция забезпечує вичерпну, сумісну.
бібліотеку функ-ций до виконання операцій виводу-введення-висновку, обробки рядків ираспределения.
пам’яті, але оскільки звернення до них осуществля-ется лише явно, можна.
якщо потрібно, запобігти їм вызо-ва; цих функцій може бути компактно написані.
на «З». * 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 містить довідкове посібник з языку"C". Воно є «офіційним».
викладом синтаксису і се-мантики «З» і (виключаючи або власний.
компилятор)окончательным арбітром всім двозначностей і упущенийв попередніх.
розділах. * 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"-программа, який був розмір, складається з.
однойили більш «функцій», вказують фактичні операциикомпьютера, які.
потрібно виконати. Функції в языке"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, дають спільний бізнес і до-пускающий розширення механізм.
до подання важких дляпечати чи невидимих символів. Серед інших символів.
в языке"C" передбачені такі: т — для табуляції, 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 TABLEFOR F = 0, 20, …,.
300 */MAIN () {INT LOWER, UPPER, STEP;FLOAT FAHR, CELSIUS;LOWER = 0; /* LOWER.
LIMIT OF TEMPERATURETABLE */UPPER =300; /* UPPER LIMIT */STEP = 20; /* STEP SIZE.
*/FAHR = LOWER;WHILE (FAHR = «0 «&З = «0 «&З = «0 «&З 0 */INT X, N; {INT I,.
P;P = 1;FOR (I =1; I 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 INPUTLINE 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 0) IF (LEN > MAX) {MAX = LEN;COPY (); }IF (MAX > 0) /* THERE.
WAS A LINE */PRINTF («%P.S», SAVE); } GETLINE () /* SPECIALIZED VERSION */ {INT.
З, I;EXTERN CHAR LINE[]; FOR (I = 0; I > == «0 «&S[I]= «A «&З J, илогические висловлювання,.
пов’язані операціями &і !!, по оп-ределению мають значення 1, якщо.
вони істинними, і 0, якщо ониложны. Отже, присвоювання ISDIGIT = З >= «0 «.
&З > зрушення вправо ^ доповнення (унарная операція) «» иммитирует вертикальну.
черту.Побитовая операція AND часто використовується для маскированиянекоторого безлічі.
бітов; наприклад, оператор З = N 0177 * 52 — передає в «з «сім молодших.
бітов N, вважаючи інші рав-ными нулю. Операція «е «побітового OR використовується.
для вклю-чения бітов: З = X е MASKустанавливает на одиницю ті біти в x, які.
рівні единицев MASK. Следует бути уважним і відрізняти побітові операциии.
" е «від логічних зв’язок &і !!, Які подразуме-вают обчислення значення.
істинності зліва-направо. Например, если х=1, а Y=2, ті значення хYравно нулю.
тоді какзначение X&Yравно единице./почему?/Операции зсуву > здійснюють.
соответственносдвиг вліво і вправо свого лівого операнда на число битовыхпозиций,.
поставлених правим операндом. Отже, x> (P+1-N)) ^(^0 > (P+1-N).
зрушує бажане полі правий конецслова. Опис аргументу X як UNSIGNED.
гарантує, чтопри зсуві вправо вивільнювані біти майже негайно заповнюватимуться ну-лями,.
а чи не вмістом знакового біта, незалежно від цього, накакой машині пропускається.
програма. Усі біти константноговыражения0 рівні 1; зрушення його за N позицій.
вліво з по-міццю операції ^0> ^ ! Якщо е1 і е2 — висловлювання, то * 54 ;
е1 вп= е2эквивалентное1 = (е1) вп (е2)за винятком те, що вираз е1 обчислюється.
толькоодин раз. Зверніть увагу до круглі дужки навколо е2: X *= Y +.
1тоX = X * (Y + 1) неX = X * Y + 1 В як приклад наведемо функцію BITCOUNT,.
яка підраховує число рівних 1 бітов у цілого аргументу. BITCOUNT (N) /* COUNT.
1 BITS IN N */UNSIGNED N; (INT B;FOR (B = 0; N ≠ 0; N >>= 1) IF (N 01) B++;RETURN (B);
) А про стислості, такі оператори приваиванияимеют ту перевагу,.
що вони краще відповідають образучеловеческого мислення. Ми говоримо:
«додати 2 до I» или"увеличить I на 2″, але з «взяти I, додати 2 і поместитьрезультат.
знову на I". Отже, I += 2. З іншого боку, в громоздкихвыражениях, подібних.
YYVAL[YYPV[P3+P4] + YYPV[P1+P2]] += 2Tакая операція присвоювання полегшує.
розуміння программы, так як читач ні скрупульозно перевіряти, являютсяли.
два довгих висловлювання справді однаковими, чи за-думываться, чого вони.
не збігаються. Така операція присваи-вания навіть допомогти компілятору отримати.
більш эффектив-ную программу. Мы вже використовували те що, що така операція присваиванияимеет.
деяке значення і може укладати висловлювання; самыйтипичный.
приклад * 55 — WHILE ((З = GETCHAR ()) ≠ EOF) присваивания, використовують інші операції.
присвоювання (+=,-= тощо.) також можуть укладати висловлювання, це случа-ется.
реже.Типом висловлювання присвоювання є тип його левогооперанда.Упражнение.
2−9.В двоичной системі числення операція X (X-1)обнуляетсамый правий рівний.
1 біт перемінної X.(почему?) используйтеэто зауваження для написання більш.
швидкої версії функцииBITCOUNT. 2.11. Умовні висловлювання. ОператорыIF (A > B) Z.
= A;ELSEZ = B;конечно обчислюють в Z максимум з й у. Умовне выражение, записанное.
з допомогою тернарной операції «?:», предоставляетдругую змога записи.
цієї й аналогічних конструк-ций. У вираженні е1? Е2: е3сначала обчислюється.
вираз е1. Якщо він відмінно від нуля (истинно), то обчислюється вираз е2,.
що й становитсязначением умовного висловлювання. Інакше вычисляет-ся.
е3, і це стає значенням умовного висловлювання. Каж-дый раз обчислюється.
лише з висловлювання е2 і е3. Такимобразом, щоб покласти Z рівним максимуму.
з й у, можнонаписать Z = (A > B)? A: B; /* Z = MAX (A, B) */Слід сказати,.
що умовне вираз действитель-но є вираженням і можна використовувати.
точно так же, как будь-який інший вираз. Якщо е2 і е3 мають різні.
типы, то тип результату визначається за правилами преобразования, рассмотренным раніше.
у цій главі. наприклад, якщо F має типFLOAT, а N — тип INT, то вираз.
(N > 0)? F: NИмеет тип DOUBLE незалежно від цього, позитивно чи N илинет.
* 56 — Оскільки рівень старшості операції ?: дуже низок, прямо над присвоюванням,.
то перше вираження у умовному вы-ражении годі й укладати в круглі дужки.
Проте, ми усеже рекомендуємо це робити, оскільки дужки роблять условнуючасть.
висловлювання більш заметной. Использование умовних висловів часто призводить до корот-ким.
програмам. Наприклад, наступний нижче оператор циклу пе-чатает N елементів.
масиву, по 10 в рядку, поділяючи каждыйстолбец одним прогалиною і до.
кожен рядок (включаяпоследнюю) одним символом перекладу рядки. OR (I = 0; I.
. LEFT TO RIGHT ! ^ ++ — - (TYPE) * SIZEOF RIGHT TO LEFT * / % LEFT TO RIGHT.
+ - LEFT TO RIGHT > LEFT TO RIGHT >= LEFT TO RIGHT * 57 — == ≠ LEFT TO RIGHT.
LEFT TO RIGHT ^ LEFT TO RIGHT ! LEFT TO RIGHT & LEFT TO RIGHT !! LEFT TO RIGHT.
?: RIGHT TO LEFT = += -= ETC. RIGHT TO LEFT, (CHAPTER 3) LEFT TO RIGHT Операції.
-> і. Використовуються для доступу до елементам струк-тур; вони описані у.
главі 6 разом із SIZEOF (размеробъекта). У розділі 5 обговорюються операції * (непряма.
адре-сация) і (адрес).Отметим, що справжній рівень старшості побітових логічних.
опера-ций ,^ і е нижчий рівня операцій == і ≠. Це призводить ктому, що здійснюють.
побітову перевірку висловлювання, по-добные IF ((X MASK) == 0) …Для отримання.
правильних результатів мають укладатися вкруглые скобки. Как зазначалось.
раніше, висловлювання, у яких входитодна з асоціативних і коммутативных операцій.
(*, +, ,^, е), можуть перегруповуватися, навіть якщо вони укладено вкруглые.
дужки. Найчастіше це призводить до ка-ким би там не було розходженням;
у ситуаціях, у яких такі рас-хождения все-таки можливі, задля забезпечення потрібного.
порядкавычислений можна використовувати явні проміжні перемен-ные.В мові.
«З», як в більшості мов, не фиксируетсяпорядок обчислення операндов.
в операторі. Наприклад в опера-торе виду X = F () + G ();сначала то, можливо обчислено.
F, і потім G, і навпаки; поэ-тому, якщо або F, або G змінюють зовнішню зміну,.
откоторой залежить інший операнд, ті значення X може зависетьот порядку.
обчислень. Задля більшої потрібної последователь-ности проміжні результати.
можна знову запам’ятовувати вовременных переменных. Подобным самим чином не фіксується.
порядок вычисленияаргументов функції, отже операторPRINTF («%D %DN»,++N, POWER (2,N));*.
58 — здатна родити (і вони справді дає) різними машинах разныерезультаты.
залежно від цього, збільшується чи N до илипосле звернення до.
функції POWER. Знову ж правильним рішенням, конеч-но, є запис ++N;PRINTF («%D %DN», N, POWER (2,N));Обращения.
функцій, вкладені операції присваивания, операции.
збільшення і зменшення призводять до так называемым"побочным ефектів" - деякі.
перемінні змінюються какпобочный результат обчислення висловів. У кожному.
выражении, в якому виникають побічні ефекти, можуть существоватьочень тонкі.
залежність від порядку, у якому определяютсявходящие до нього перемінні. прикладом.
типовою невдалої си-туации є оператор A[I] = I++;Возникает питання,.
старе чи нового значення I служить в ка-честве індексу. Компілятор може надходити.
різними способамии залежно від міста своєї інтерпретації видавати різні ре-зультаты.
Той випадок, коли відбуваються побічні эффекты (присваивание фактичним.
змінним), — залишається на ус-мотрение компілятора, оскільки найкращий порядок.
сильно зави-сит від архітектури машины. Из цих міркувань випливає така мораль:
написаниепрограмм, залежать від порядку обчислень, є плохимметодом.
програмування якою мовою. Звісно, необходимознать, чого слід уникати,.
але коли ви невідомо, як не-которые речі реалізовані різними машинах,.
це неведениеможет уберегти вас від неприємностей. (Отладочная прог-рамма LINT.
вкаже більшість місць, залежать від порядку вы-числений. * 59 — 3. Потік.
управління Управляючі оператори мови визначають порядок вычисле-ний. У наведених.
раніше прикладах ми можемо вже зустрічалися із наи-более уживаними управляючими.
конструкціями мови «C»;здесь ми опишемо інші оператори управління і уточнимдействия.
операторів, яке обговорювали раніше. 3.1. Оператори і блоки Такі висловлювання,.
як X=0, чи I++, чи PRINTF (…), становятся операторами, якщо на ними слід.
точка з запя-той, як, наприклад, X = 0;I++;PRINTF (…);В мові «З» точка.
з коми є ознакою кінця опера-тора, а чи не роздільником операторів, як.
в мовами типу алго-ла.Фигурные дужки /(і /) йдуть на объединенияописаний.
і операторів в складовою оператор чи блок, так чтоони виявляються синтаксично.
еквівалентні одному оператору. Один явний приклад такої типу дають фігурні.
дужки, в кото-рые полягають оператори, складові функцію, іншийфігурні.
дужки навколо групи операторів в конструкціях IF, ELSE, WHILE і FOR.(на самому.
справі перемінні може бути опи-саны всередині будь-якого блоку; ми ще поговоримо звідси.
у розділі 4).Точка з коми будь-коли ставиться після першої фигурнойскобки,.
яка завершує блок. 3.2. IF — ELSE Оператор IF — ELSE використовується за необхідності.
сде-лать вибір. Формально синтаксис має видIF (выражение)оператор-1ELSEоператор-2,Где.
частина ELSE є необов’язковою. Спочатку вычисля-ется вираз;
коли вона «істинно» /тобто. значення выраженияотлично від нуля/, то виконується.
оператор-1. Якщо він ложно/значение висловлювання одно нулю/, і є частина.
з ELSE, то замість оператора-1 виконується оператор-2. * 60 — Оскільки IF просто.
перевіряє чисельна значення выраже-ния, то можливо деяке скорочення записи.
Самій очевид-ной можливістю є запис IF (выражение)вместоIF (вираз.
≠0)иногда така запис є ясною та природною, але време-нами вона.
стає загадочной. То, що коли частина ELSE в конструкції IF — ELSE є нео-бязательной,.
призводить до двозначності у разі, коли ELSEопускается у вкладеною.
послідовності операторів IF. Эта неоднозначність дозволяється звичайним чином.
— ELSE свя-зывается з найближчим попереднім IF, не що містить ELSE. Например,.
в IF (N > 0) IF (A > B) Z = A;ELSEZ = B;конструкция ELSE належить до внутрішнього.
IF, як ми бачимо пока-зали, зрушивши ELSE під відповідний IF. Якщо це.
то, что ви мені хочете, то тут для отримання потрібного відповідності необхо-димо використовувати.
фігурні дужки: IF (N > 0) {IF (A > B) Z = A; }ELSEZ = B; Tакая двозначність.
особливо згубна у ситуаціях типаIF (N > 0) FOR (I = 0; I 0) {PRINTF («…»);RETURN (I);
}ELSE /* WRONG */PRINTF («ERROR — N IS ZERON»);* 61 — Запис ELSE під.
IF унаочнює, чого ви бажаєте, але ком-пилятор не отримає відповідного.
вказівки і зв’яже ELSE свнутренним IF. Помилки що така дуже важко обнаруживают-ся.Между.
іншим, зверніть увагу, що вIF (A > B) Z = A;ELSEZ = B;после.
Z=A стоїть точка з коми. Річ у тім, що согласнограмматическим правилам за.
IF повинен слідувати оператор, авыражение типу Z=A, що є оператором, завжди.
заканчива-ется точкою з коми. 3.3. ELSE — IF КонструкцияIF (выражение)оператор
ELSE IF (вираз) оператор ELSE IF (вираз) операторELSEоператорвстречается.
настільки часто, що заслуговує отдельногократкого розгляду. Така.
послідовність операторовIF є найпоширенішим способом программиро-вания.
вибрати з кількох можливих варіантів. выраженияпросматриваются.
послідовно; якщо якесь выражениеоказывается истинным, то виконується.
належить до нього опе-ратор, і вже цим весь ланцюжок закінчується. Кожен оператор
мо-же бути чи окремим оператором, або групою операторовв фігурних скобках.Последняя.
частину з ELSE має справу зі випадком, коли ниодно з перевірених умов.
не виконується. Іноді при этомне слід вживати ніяких явних дій;
у тому случаехвост ELSEоператорможет бути опущений, або його можна використовувати.
для контроля, чтобы засікти «неможливе» умова. * 62 — Для ілюстрації вибору.
із трьох можливих варіантів при-ведем програму функції, яка методом половинного.
деленияопределяет, перебуває чи дане значення x в отсортированноммассиве.
V. Елементи масиву V мають бути розташованими в по-рядку зростання. Функція.
повертає номер позиції (числомежду 0 і N-1), у якій значення x перебуває.
в V, і -1,если x немає в V. BINARY (X, V, N) /* FIND X IN V[0]. .V[N-1].
*/INT X, V[], N; {INT LOW, HIGH, MID;LOW = 0;HIGH = N — 1;WHILE (LOW V[MID])LOW.
= MID + 1;ELSE /* FOUND MATCH */RETURN (MID); }RETURN (-1); } Основний частиною.
кожного кроку алгоритму є провер-ка, було б x менше, більше або дорівнює.
середньому элементуV[MID]; використання конструкції ELSE — IF тут цілком ес-тественно.
3.4. Перемикач Оператор SWITCH дає спеціальний спосіб вибору одного.
измногих варіантів, який залежить від перевірці совпадениязначения даного.
висловлювання з однією з заданих констант исоответствующем розгалуженні. У розділі 1.
ми привели программуподсчета числа входжень кожної цифри, символів порожніх про-межутков.
й інших символів, яка використовує последова-тельность IF… ELSE.
IF…ELSE. Ось сама програма спереключателем. * 63 — MAIN () /* COUNT DIGITS, WHITE.
SPACE, OTHERS */ {INT З, I, NWHITE, NOTHER, NDIGIT[10]; NWHITE = NOTHER.
= 0;FOR (I = 0; I = «0 «&S[I] 0; GAP /= 2) FOR (I = GAP; I =0 &V[J]>V[J+GAP];
J-=GAP) {TEMP = V[J]; V[J] = V[J+GAP]; V[J+GAP] = TEMP; } } Тут є три вкладених.
циклу. Найбільш зовнішній цикл управ-ляет інтервалом між сравниваемыми елементами,.
зменшуючи егоот N/2 вдвічі при кожному проході, що він стане равнымнулю.
Середній цикл порівнює кожну пару елементів, разде-ленных на величину інтервалу;
самий внутрішній цикл перес-тавляет будь-яку невпорядковану пару. Оскільки.
інтервал в концеконцов зводиться до одиниці, все елементи внаслідок упоря-дочиваются.
правильно. Зазначимо, що внаслідок спільності конструк-ции FOR зовнішній цикл.
входить у те саме форму, що иостальные, хоч і перестав бути арифметичній.
прогрессией.Последней операцією мови «З» є кома «,», ко-торая.
найчастіше використовують у операторі FOR. Два выраже-ния, розділені коми,.
обчислюються зліва-направо, причемтипом і значенням результату є тип і значення.
правогооперанда. Отже, у різні частини оператора FORможно включити.
кілька висловів, наприклад, для параллель-ного зміни двох індексів.
Це ілюструється функциейREVERSE (S), яка має рядок P. S у протилежному.
порядкена тому місці. REVERSE (S) /* REVERSE STRING P. S IN PLACE */CHAR P. S[];
{INT З, I, J;FOR (I = 0, J = STRLEN (S) — 1; I 0); /* DELETE IT */ IF (SIGN 0) {WHILE.
(—N >= 0) IF (LINE[N] ≠ «» &LINE[N] ≠ «T «&LINE[N] ≠ «N »)BREAK;LINE[N+1].
= «.