ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Мова С
         

     

    Інформатика, програмування
    МОВА З

    Анотація.

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

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

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

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

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

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

    0.1. Введення.

    Мова "C" є універсальною мовою програмування. Він тісно пов'язаний з операційною системою "UNIX", так як був розвинений на цій системі і тому що "UNIX" та її програмне забезпечення написано на "C". Сам мова, однак, не пов'язаний з якою-небудь однією операційною системою або машиною;

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

    Мова "C" - це мова щодо "низького рівня". У такій характеристиці немає нічого образливого, це просто означає, що "C" має справу з об'єктами того ж виду, що й більшість ЕОМ, а саме, з символами, числами і адресами.

    Вони можуть об'єднуватися і пересилатися за допомогою звичайних арифметичних і логічних операцій, що здійснюються реальними ЕОМ.

    У мові "C" відсутні операції, що мають справу безпосередньо зі складовими об'єктами, такими як рядки символів, множини, списки або з масивами, які розглядаються як ціле. Тут, наприклад, немає ніякого аналога операціях PL/1, які оперують з цілими масивами та рядками. Мова не надає ніяких інших можливостей розподілу пам'яті, окрім статичного визначення і механізму стеків, що забезпечується локальними змінних функцій; тут немає ні "куп" (HEAP), ні "збирання сміття", як це передбачається в Алгол-68. Нарешті, сам по собі "C" не забезпечує ніяких можливостей вводу-виводу: тут немає операторів READ або WRITE і ніяких вбудованих методів доступу до файлів. Всі ці механізми високого рівня повинні забезпечуватися явно викликаються функціями.

    Аналогічно, мова "C" пропонує тільки прості, послідовні конструкції потоків управління: перевірки, цикли, групування і підпрограми, але не мультипрограмування, паралельні операції, синхронізацію або співпрограми.

    Хоча відсутність деяких з цих коштів може виглядати як гнітюча неповноцінність ( "виходить, що я повинен звертатися до функції, щоб порівняти два рядки символів ?!"), але утримання мови в скромних розмірах дає реальні переваги. Так як "C" відносно малий, він не вимагає багато місця для свого опису і може бути швидко вивчений.

    Компілятор з "C" може бути простим і компактним. Крім того, компілятори легко пишуться; при використанні сучасної технології можна очікувати написання компілятора для нової ЕОМ за пару місяців і при цьому виявиться, що 80 відсотків програми нового компілятора буде спільною з програмою для вже існуючих компіляторів. Це забезпечує високий ступінь мобільності мови. Оскільки типи даних і стуктури управління, наявні в "C", безпосередньо підтримуються більшістю існуючих ЕОМ, бібліотека, необхідна під час прогону ізольованих програм, виявляється дуже маленькою.

    На PDP -11, наприклад, вона містить тільки програми для 32-бітового множення і ділення і для виконання програм введення і виведення послідовностей. Звичайно, кожна реалізація забезпечує вичерпну, сумісну бібліотеку функцій для виконання операцій введення-виведення, обробки рядків і розподілу пам'яті, але так як звернення до них здійснюється тільки явно, можна, якщо необхідно, уникнути їх виклику; ці функції можуть бути компактно написані на самому "C".

    Знову ж таки через те, що мова "C" відображає можливості сучасних комп'ютерів, програми на "C" виявляються досить ефективними, тому що не виникає спонукання писати натомість програми на мові асемблера. Найбільш переконливим прикладом цього є сама операційна система "UNIX", яка майже повністю написана на "C". З 13000 рядків програми системи тільки близько 800 рядків найнижчого рівня написані на асемблері. Крім того, по суті все прикладне програмне забезпечення системи "UNIX" написано на "C"; переважна більшість користувачів системи "UNIX" (включаючи одного з авторів цієї книги) навіть не знає мови асемблера PDP-11.

    Хоча "C" відповідає можливостям багатьох ЕОМ, він не залежить від будь-якої конкретної архітектури машини і через це без особливих зусиль дозволяє писати "перенесення" програми, тобто програми, які можна пропускати без змін на різних апаратних засобах. У наших колах став вже традицією перенесення програмного забезпечення, розробленого на системі "UNIX", на системи ЕОМ: HONEYWELL, IBM і INTERDATA. Фактично компілятори з "C" і програмне забезпечення під час прогону програм на цих чотирьох системах, мабуть, набагато більш сумісні, ніж стандартні версії Фортрану американського національного інституту стандартів (ANSI). Сама операційна система "UNIX" тепер працює як на PDP-11, так і на INTERDATA 8/32. За винятком програм, які неминуче виявляються в деякій мірі машинно-залежними, таких як компілятор, асемблер і відладчик. Написаний на мові "C" програмне забезпечення ідентично на обох машинах. Усередині самої операційної системи 7000 рядків програми, виключаючи математичне забезпечення мови асемблера ЕОМ та управління операціями вводу-виводу, збігаються на 95 відсотків.

    Програмістам, знайомим з іншими мовами, для порівняння і протиставлення може виявитися корисним згадка декількох історичних, технічних та філософських аспектів "C".

    Багато хто з найбільш важливих ідей "C" походять від набагато більше старого, але все ще цілком життєвого мови BCPL, розробленого Мартіном Річардсом. Побічно мова BCPL вплинув на "C" через мову "B", написаний Кеном Томпсоном у 1970 році для першої операційної системи "UNIX" на ЕОМ PDP-7.

    Хоча мова "C" має кілька спільних з BCPL характерних особливостей, він жодним чином не є діалектом останнього. І BCPL і "B" - "безтіпние" мови; єдиним видом даних для них є машинне слово, а доступ до інших об'єктів реалізується спеціальними операторами або зверненням до функцій. У мові "C" об'єктами основних типів даних є символи, цілі числа декількох розмірів і числа з плаваючою точкою. Крім того, є ієрархія похідних типів даних, що створюються покажчиками, масивами, структурами, об'єднаннями та функціями.

    Мова "C" включає основні конструкції потоку управління, необхідні для добре структурувати програм: групування операторів, прийняття рішень (IF), цикли з перевіркою завершення на початку (WHILE, FOR) або в кінці (DO) і вибір одного з безлічі можливих варіантів (SWITCH). (Всі ці можливості забезпечувалися і в BCPL, хоча і за кілька відмінному синтаксисі; ця мова передчував що наступила через кілька років моду на структурний програмування).

    У мові "C" є покажчики і можливість адресної арифметики. Аргументи передаються функцій за допомогою копіювання значення аргументу, і викликана функція не може змінити фактичний аргумент на що викликає програмі. Якщо бажано добитися "виклику за посиланням", можна неявно передати вказівник, і функція зможе змінити об'єкт, на який цей покажчик вказує. Імена масивів передаються зазначенням початку масивів, так що аргументи на кшталт масивів ефективно викликаються за посиланням.

    До будь-якої функції можна звертатися рекурсивно, і її локальні змінні звичайно "автоматичні", тобто Створюються заново при кожному зверненні. Опис однієї функції не може міститися всередині іншого, але змінні можуть описуватися відповідно до звичайної блокової структурою. Опції в "C" програмі можуть транслюватися окремо. змінні по відношенню до функції можуть бути внутрішніми, зовнішніми, але відомими тільки в межах одного вихідного файлу, або повністю глобальними. Внутрішні змінні можуть бути автоматичними або статичними. Автоматичні змінні для більшої ефективності можна поміщати в регістри, але оголошення регістра є тільки вказівкою для компілятора і ніяк не пов'язане з конкретними машинними регістрами.

    Мова "C" не є мовою до строгих типами в сенсі Паскаль чи Алгол 68. Він порівняно поблажливий до перетворення даних, хоча і не буде автоматично перетворювати типи даних з буйною невимушеністю мови PL/1.

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

    У тих ситуаціях, коли бажана сувора перевірка типів, використовується спеціальна версія компілятора. Ця програма називається LINT очевидно, тому вона вибирає шматочки пуху з вашої програми. Програма LINT не генерує машинного коду, а робить дуже строгу перевірку всіх тих сторін програми, які можна проконтролювати під час компіляції та завантаження. Вона визначає невідповідність типів, несумісність аргументів, невикористані або очевидним чином неініціалізовані змінні, потенційні труднощі переносимості і т.д. Для програм, які благополучно проходять через LINT, гарантується відсутність помилок типу приблизно з тією ж повнотою, як і для програм, написаних, наприклад, на Алгол-68. Інші можливості програми LINT будуть відзначені, коли випаде відповідний випадок.

    Нарешті, мова "C", подібно до будь-якої іншої мови, має свої недоліки. Деякі операції мають невдале старшинство; деякі розділи синтаксису могли б бути краще; сушествует кілька версій мови, що відрізняються невеликими деталями. Проте мова "C" зарекомендував себе як виключно ефективний і виразний мова для широкого розмаїття застосувань програмування.

    Зміст книги організовано наступним чином. Глава 1 є навчальним введенням в центральну частину мови "C".

    Мета - дозволити читачеві стартувати так швидко, як тільки можливо, тому що ми твердо переконані, що єдиний спосіб вивчити нову мову - писати нею програми. При цьому, однак, передбачається робоче володіння основними елементами програмування; тут не пояснюється, що таке ЕОМ або компілятор, не пояснюється сенс виразів типу N = N 1. Хоча ми й намагалися, де це можливо, продемонструвати корисну техніку програмування. Ця книга не призначається бути довідковим керівництвом щодо структур даних і алгоритмів;

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

    У розділах з 2-го по 6-у різні аспекти "C" викладаються більш детально і трохи більш формально, ніж у розділі 1, хоча наголос, як і раніше робиться на розборі прикладів закінчених, корисних програм, а не на окремих фрагментах .

    У розділі 2 обговорюються основні типи даних, оператори і вирази. У розділі 3 розглядаються керуючі оператори: IF-ELSE, WHILE, FOR і т.д. Глава 4 охоплює функції і структуру програми - зовнішні змінні, правила певних областей дії опису і т.д. У главі 5 обговорюються покажчики і адресна арифметика. Глава 6 містить докладний опис структур та об'єднань.

    У главі 7 описується стандартна бібліотека вводу-виводу мови "C", яка забезпечує стандартний інтерфейс з операційною системою. Ця бібліотека введення-виведення підтримується на всіх машинах, на яких реалізовано "C", так що програми, які використовують її для вводу, виводу та інших системних функцій, можуть переноситися з однієї системи на іншу по суті без змін.

    У главі 8 описується інтерфейс між "C" - програмами і операційною системою "UNIX". Наголос робиться на введення-виведення, систему файлів і переносимість. Хоча деякі частини цієї глави специфічні для операційної системи "UNIX", програмісти, які не використовують "UNIX", все ж таки повинні знайти тут корисний матеріал, в тому числі деяке уявлення про те, як реалізована одна версія стандартної бібліотеки та пропозиції для досягнення переносимості програми.

    Додаток A містить довідкове керівництво по мові "C". Воно є "офіційним" викладом синтаксису і семантики "C" і (виключаючи чийсь власний компілятор) остаточним арбітром для всіх двозначностей і упущень у попередніх розділах.

    Так як "C" є, що розвиваються мовою, реалізованим на безлічі систем, частина матеріалу цієї книги може не відповідати цьому станом розробки на якійсь конкретній системі. Ми намагалися уникати таких проблем і застерігати про можливі труднощі. У сумнівних випадках, однак, ми зазвичай віддавали перевагу описувати ситуацію для системи "UNIX" PDP-11, так як вона є середовищем для більшості програмують на мові "C". У додатку а також описані розбіжності в реалізаціях мови "C" на основних системах.

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

    Давайте почнемо з швидкого введення в мову "C". Наша мета - продемонструвати суттєві елементи мови на реальних програмах, не грузнучи при цьому в деталях, формальних правил та виключень. У цій главі ми не намагаємося викласти мова повністю або хоча б суворо (зрозуміло, що наводяться приклади будуть коректними). Ми хочемо якомога швидше довести вас до такого рівня, на якому ви були б в змозі писати корисні програми, і щоб досягти цього, ми зосереджується на основному: змінних і константи, арифметики, операторів передачі управління, функ?? іях і елементарних відомостях про введення і виведення. Ми абсолютно навмисно залишаємо за межами цієї глави багато елементів мови "C", які мають першорядне значення при написанні великих програм, у тому числі покажчики, сртуктури, більшу частину з багатого набору операторів мови "C", кілька операторів передачі управління і незліченна кількість деталей .

    Такий підхід має, звичайно, свої недоліки. Найбільш істотним є те, що повний опис будь-якого конкретного елемента мови не викладається в одному місці, а пояснення, в силу стислості, можуть призвести до неправильного тлумачення. Крім того, через неможливість використовувати всю міць мови, приклади виявляються не настільки короткими і елегантними, як вони могли б бути. І хоча ми намагалися звести до мінімуму ці недоліки, все ж таки їх майте на увазі.

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

    У всякому разі, досвідчені програмісти повинні опинитися в стані проекстраполіровать матеріал даного розділу на свої власні програмістські потреби. Початківці ж повинні на додаток писати аналогічні маленькі самостійні програми. І ті, й інші можуть використовувати цей розділ як каркас, на який будуть навішуватись більш докладні описи, що починаються з голови 2.

    1.1. Hачінаем. Єдиний спосіб освоїти нову мову програмування - писати нею програми. Перша програма, яка повинна бути написана, - один для всіх мов: надрукувати слова: HELLO, WORLD.

    Це - найбільш істотний бар'єр; щоб подолати його, ви повинні зуміти завести десь текст програми, успішно його скомпілювати, завантажити, прогнати і знайти, де виявилася ваша видача. Якщо ви навчилися справлятися з цими технічними деталями, все інше порівняно просто.

    Програма друку "HELLO, WORLD" на мові "C" має вигляд: MAIN ()

    (PRINTF ( "HELLO, WORLDN");

    ) Як пропустити цю програму - залежить від використовуваної вами системи. Зокрема, на операційній системі "UNIX" ви повинні завести вихідну програму у файлі, ім'я якого закінчується на ". C", наприклад, HELLO.C, і потім скомпілювати її по команді

    CC HELLO.C Якщо ви не допустили будь-якої недбалості, такий як пропуск символу або неправильне написання, компіляція пройде без повідомлень і буде створений виконуваний файл з ім'ям а.OUT. Прогон його по команді

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

    Вправа 1-1.

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

    Тепер деякі пояснення до самій програмі. Будь-яка "C"-програма, яким би не був її розмір, складається з однієї або більше "функцій", що вказують фактичні операції комп'ютера, які повинні бути виконані. Функції в мові "C" подібні до функцій і підпрограм Фортрану та процедур PL/1, Паскаль і т.д. У нашому прикладі такою функцією є MAIN. Зазвичай ви можете давати функцій будь-які імена на ваш розсуд, але MAIN - це особливе ім'я; виконання вашої програми починається спочатку з функції MAIN. Це означає, що кожна програма повинна в якомусь місці містити функцію з ім'ям MAIN. Для виконання певних дій функція MAIN зазвичай звертається до інших функцій, частина з яких знаходиться в тій же самій програмі, а частина - в бібліотеках, що містять раніше написані функції.

    Одним способом обміну даними між функціями є передача за допомогою аргументів. Круглі дужки, наступні за ім'ям функції, містять в собі список аргументів; тут маIN - функція без аргументів, що вказується як (). Оператори, що становлять функцію, полягають у фігурні дужки (і), які аналогічні DO-END в PL/1 або BEGIN-END в Алгол, Паскаль і т.д. Звернення до функції здійснюється зазначенням її імені, за яким слідує ув'язнений в круглі дужки список аргументів. тут немає ніяких операторів CALL, як у фортране або PL/1. Круглі дужки повинні бути присутнім і в тому випадку, коли функція не має аргументів.

    Рядок

    PRINTF ( "HELLO, WORLDN");

    є зверненням до функції, яка викликає функцію з ім'ям PRINTF і аргуметом "HELLO, WORLDN". Функція PRINTF є бібліотечної функцією, яка видає вихідні дані на термінал (якщо тільки не вказано якесь інше місце призначення). У даному випадку друкується рядок символів, що є аргументом функції.

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

    Послідовність N у наведеній рядку є позначенням на мові "C" для 'символу нового рядка', який служить вказівкою для переходу на терміналі до лівого краю наступного рядка. Якщо ви не включите N (корисний експеримент), то виявите, що ваша видача не закінчиться переходом терміналу на новий рядок. Використання послідовності N - єдиний спосіб введення символу нового рядка в аргумент функції PRINTF; якщо ви спробуєте щось на зразок

    PRINTF ( "HELLO, WORLD

    ");

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

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

    MAIN ()

    (PRINTF ( "HELLO,");

    PRINTF ( "WORLD");

    PRINTF ( "N");

    )

    Підкреслимо, що N представляє тільки один символ. Умовні 'послідовності', подібні N, дають загальний і допускає розширення механізм для представлення важких для друку або невидимих символів. Серед інших символів в мові "C" передбачені наступні: т - для табуляції, B - для повернення на одну позицію, "- для подвійної лапки і для самої зворотного косою риси.

    Вправа 1-2.

    Проведіть експерименти для того, щоб дізнатися що відбудеться, якщо в рядку, що є аргументом функції PRINTF міститиметься X, де X - деякий символ, що не входить у вищенаведений список.

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

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

    C = (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 <= UPPER) (CELSIUS = (5.0/9.0) * (FAHR -32.0);

    PRINTF ( "% 4.0F% 6.1FN", FAHR, CELSIUS);

    FAHR = FAHR + STEP;

    )

    )

    Перші два рядки/* PRINT FAHRENHEIT-CELSIUS TABLE FOR F = 0, 20, ..., 300 */є коментарем, який у цьому випадку коротко пояснює, що робить програма. Будь-які символи між/* і */ігноруються компілятором; можна вільно користуватися коментарями для полегшення розуміння програми. Коментарі можуть з'являтися в будь-якому місці, де можливий пробіл або перехід на новий рядок.

    У мові "C" всі змінні повинні бути описані до їх використання, зазвичай це робиться на початку функції до першого виконуваного оператора. Якщо ви забудете вставити опис, то отримаєте діагностичне повідомлення від компілятора. Опис складається з типу і списку змінних, що мають цей тип, як у

    INT LOWER, UPPER, STEP;

    FLOAT FAHR, CELSIUS;

    Тип INT означає, що всі змінні списку цілі; тип FLOAT призначений для чисел з плаваючою точкою, тобто для чисел, які можуть мати дробову частину. Точність як INT, TAK і FLOAT залежить від конкретної машини, на якій ви працюєте. На PDP-11, наприклад, тип INT відповідає 16-бітовому числа зі знаком, тобто числу, лежить між -32768 і 32767. Число типу FLOAT - це 32-бітове число, що має близько семи значущих цифр і що лежить в діапазоні від 10е-38 до 10е 38. У розділі 2 наводиться список розмірів для інших машин.

    У мові "C" передбачено кілька інших основних типів даних, крім INT і FLOAT:

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

    SHORT коротке ціле

    LONG довге ціле DOUBLE плаваюче з подвійною точністю Розміри цих об'єктів теж машинно-незалежні; деталі наведені у розділі 2. Є також масиви, структури та об'єднання цих основних типів, покажчики на них та функції, що їх повертають; з усіма ними ми зустрінемося в свій час.

    Фактично обчислення в програмі перекладу температур починаються з операторів присвоювання LOWER = 0;

    UPPER = 300;

    STEP = 20;

    FAHR = LOWER;

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

    Кожен рядок таблиці обчислюється однаковим чином, тому що ми використовуємо цикл, що повторюється один раз на рядок. У цьому призначення оператора WHILE: WHILE (FAHR <= UPPER) (

    ....

    )

    перевіряється умова у дужках. Якщо воно істинно (FAHR менше або рівне UPPER), то виконується тіло циклу (всі оператори, укладені у фігурні дужки (і)). Потім знову перевіряється ця умова і, якщо воно істинно, знову виконується тіло циклу. Якщо ж умова не виконується (FAHR перевершує UPPER), цикл закінчується і відбувається перехід до виконання оператора, наступного за оператором циклу. Так як в цій програмі немає жодних подальших операторів, то виконання програми завершується.

    Тіло оператора WHILE може складатися з одного або більше операторів, укладених у фігурні дужки, як у програмі перекладу температур, або з одного оператора без дужок, як, наприклад, в

    WHILE (I В обох випадках оператори, керовані оператором WHILE, зрушені на одну табуляцію, щоб ви могли з першого погляду бачити, які оператори знаходяться всередині циклу. Такий зсув підкреслює логічну структуру програми. Хоча в мові "C" допускається цілком довільне розташування операторів у рядку, що підходить зсув і використання прогалин значно полегшують читання програм. Ми рекомендуємо писати тільки один оператор на рядку і (звичайно) залишати пробіли навколо операторів. Розташування фігурних дужок менш істотно, і ми вибрали один з декількох популярних стилів. Виберіть відповідний для вас стиль і потім використовуйте його послідовно.

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

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

    причина використання виразу 5.0/9.0 замість виглядає простіше 5/9 полягає в тому, що в мові "C", як і в багатьох інших мовах, при діленні цілих відбувається усікання, що складається у відкиданні дробової частини результату. Таким чином, результат операції 5/9 дорівнює нулю, і, звичайно, у цьому випадку всі температури виявилися б рівними нулю. Десяткова крапка в константі вказує, що вона має тип з плаваючою точкою, так що, як ми й хотіли, 5.0/9.0 одно 0.5555 ... .

    Ми також писали 32.0 замість 32, незважаючи на те, що так як мінлива FAHR має тип FLOAT, ціле 32 автоматично б перетворилося до типу FLOAT (у 32.0) перед вирахуванням.

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

    Докладні правила про те, в якому випадку цілі перетворюються до типу з плаваюшей точкою, наведені в розділі 2. Зараз же відзначимо, що присвоювання

    FAHR = LOWER;

    перевірка WHILE (FAHR <= UPPER) працюють, як очікується, - перед виконанням операцій цілі перетворюються в плаваючу форму.

    Цей же приклад повідомляє трохи більше про те, як працює PRINTF. Функція PRINTF фактично є універсальною функцією форматних перетворень, яка буде повністю описана в розділі 7. Її першим аргументом є рядок символів, що повинна бути надрукована, причому кожен знак% вказує, куди повинен підставлятися кожен з інших аргументів/другий, третій, .../і в якій формі він повинен друкуватися. Наприклад, в операторі

    PRINTF ( "% 4.0F% 6.1FN", FAHR, CELSIUS);

    специфікація перетворення% 4.0F говорить, що число з плаваючою точкою має бути надруковано в поле шириною принаймні в чотири символи без цифр після десяткової крапки.

    специфікація% 6.1F описує інше число, яке повинне займати принаймні шість позицій з однією цифрою після десяткового дробу, аналогічно специфікаціям F6.1 в фортране або F (6,1) в PL/1. Різні частини специфікації можуть бути опущені: специфікація% 6F говорить, що число буде шириною принаймні в шість символів; специфікація% 2 потребує двох позицій після десяткової крапки, але ширина при цьому не обмежується; специфікація% F говорить тільки про те, що потрібно надрукувати число з плаваючою точкою. Функція PRINTF також розпізнає наступні характеристики:% D - для десяткового цілого,% о - для восьмеричного числа,% х - для шестнадцатірічное,% з - для символу,% S - для символьної строки та%% для самого символу%.

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

    Між іншим, функція PRINTF не є частиною мови "C"; у самій мові "C" не визначені операції вводу-виводу.

    Немає нічого таємничого і у функції PRINTF; це - просто корисна функція, що є частиною стандартної бібліотеки підпрограм, яка зазвичай доступна "C"-програмами. Щоб зосередитися на самій мові, ми не будемо детально зупинятися на операціях введення-виведення до глави 7. Зокрема, ми до тих пір відкладемо форматний введення. Якщо вам треба ввести числа - прочитайте опис функції SCANF в главі 7, розділ 7.4. Функція SCANF багато в чому схожа з PRINTF, але вона зчитує вхідні дані, а не друкує вихідні.

    Вправа 1-3.

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

    Вправа 1-4.

    Напишіть програми друку відповідної таблиці переходу від градусів цельсия до градуси Фаренгейта.

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

    Як і можна було очікувати, є безліч різних способів написання кожної програми. Давайте розглянемо такий варіант програми перекладу температур: MAIN ()/* FAHRENHEIT-CELSIUS TABLE * /

    (INT FAHR;

    FOR (FAHR = 0; FAHR <= 300; FAHR = FAHR + 20) PRINTF ( "% 4D% 6.1FN", FAHR, (5.0/9.0) * (FAHR-32.0));

    )

    Ця програма видає ті ж самі результати, але виглядає безумовно по-іншому. Головна зміна - виключення більшості змінних; залишилася тільки мінлива FAHR, причому типу INT (це зроблено для того, щоб продемонструвати перетворення% D у функції PRINTF). Нижня і верхня межі і розмір щага з'являються тільки як константи в операторі FOR, який сам є новою конструкцією, а вираз, обчислює температуру за цельсієм, входить тепер у вигляді третього аргументу функції PRINTF, а не у вигляді окремого оператора присвоєння.

    Остання зміна є прикладом цілком загального правила мови "C" - в будь-якому контексті, в якому допускається використання значення змінної деякого типу, ви можете використовувати вираз цього типу. Так як третій аргумент функції PRINTF повинен мати значення з плаваючою точкою, щоб відповідати специфікації% 6.1F, то в цьому місці може зустрітися будь-який вираз плаваючого типу.

    Сам оператор FOR - це оператор циклу, що узагальнює оператор WHILE. Його функціонування має стати ясним, якщо ви порівняйте його з раніше описаним оператором WHILE. Оператор FOR містить три частини, що розділяються крапкою з комою. Перша частина

    FAHR = 0 виконується один раз перед входом в сам цикл. Друга частина перевірка, або умова, яка керує циклом:

    FAHR <= 300 ця умова перевіряється і, якщо воно істинно, то виконується тіло циклу (у даному випадку тільки функція PRINTF). Потім виконується крок Реініціалізація

    FAHR = FAHR + 20 і умова перевіряється знову. цикл завершується, коли ця умова стає помилковим. Так само, як і у випадку оператора WHILE, тіло циклу може складатися з одного оператора або з групи операторів, укладених у фігурні дужки. Ініціалізувалися і реініціалізірующая частини можуть бути будь-якими окремими виразами.

    Вибір між операторами WHILE і FOR довільний і грунтується на тому, що виглядає ясніше. Оператор FOR зазвичай зручний для циклів, в яких ініціалізація і Реініціалізація логічно пов'язані і кожна задається одним оператором, тому що в цьому випадку запис більш компактна, ніж при використанні оператора WHILE, а оператори управління циклом зосереджуються разом в одному місці.

    Вправа 1-5.

    змінюйте програму перекладу температур таким чином, щоб вона друкувала таблицю в обратном порядку, тобто Від 300 градусів до 0.

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

    Останнє зауваження, перш ніж ми назавжди залишимо програму перекладу температур. Ховати "магічні числа", такі як 300 і 20, всередину програми - це невдала практика; вони дають мало інформації тим, хто, можливо, повинен буде розбиратися в цій програмі пізніше, і їх важко змінювати систематичним чином. На щастя в мові "C" передбачений спосіб, що дозволяє уникнути таких "магічних чисел". Використовуючи конструкцію # 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 <= UPPER; FAHR = FAHR + STEP) PRINTF ( "% 4D% 6.1FN", FAHR, (5.0/9.0) * (FAHR-32));

    )

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

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

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

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

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

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

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

    C = GETCHAR () змінна 'C' містить наступний символ з вхідних даних.

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

    Функція PUTCHAR © є доповненням до GETCHAR: в результаті звернення PUTCHAR © вміст змінної 'C' видається на деякий вихідний носій, звичайно знову на термінал. Звернення до функцій PUTCHAR і PRINTF можуть перемежовуватися; видача буде з'являтися в тому порядку, в якому відбуваються звернення.

    Як і функція PRINTF, функції GETCHAR і PUTCHAR не містять нічого екстраординарного. Вони не входять до складу мови "C", але до них завжди можна звернутися.

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

    Маючи у своєму розпорядженні тільки функції GETCHAR і PUTCHAR ви можете, не знаючи нічого про операції вводу-виводу, написати дивовижне кількість корисних програм. Простим прикладом може бути програма посимвольний копіювання вступного файлу в вивідний. Загальна схема має вигляд: ввести символ WHILE (символ не є ознакою кінця файлу) вивести щойно прочитаний символ ст

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status