
- •Конспект лекцій
- •Вираз 1; while (вираз 2) { тіло вираз 3;
- •Специфікації при введенні і виведенні інформації.
- •Функція printf().
- •Функція виведення рядків puts().
- •Виведення символів на екран - putchar().
- •Перетворення при обчисленні виразів.
- •Арифметичні операції
- •4. Операції присвоювання.
- •5. Повітові операції
- •Функції введення інформації. Функція scanf().
- •Функція gets().
- •Функція fgets().
- •Функція getchar().
- •If (вираз) оператор
- •If (вираз) оператор 1
- •If (вираз 1)
- •Оголошення масиву
- •Покажчики і масиви.
- •Масивів.
Функція виведення рядків puts().
Функція puts() дуже проста у використанні. Досить передати їй адресу рядка як аргумент.
#include <stdio.h> int main ()
{
char strl[80];
puts ("Введите строку");
gets(strl);
puts(strl);
return 0;
}
На відміну від printf(), при виведенні функція puts() автоматично здійснює перехід на новий рядок. Вона припиняє виведення, зустрівши нульовий символ, тому краще, щоб рядок містив такий символ.
Функція fputs().
Функція fputs() є файл - орієнтованою версією функції puts(). Основні розходження між цими функціями полягають у наступному:
Функція fputs() використовує другий аргумент, що вказує, у який файл варто виконати запис. Для виведення на екран дисплея в якості цього аргумента можна використовувати stdout (від standard output - стандартне виведення), обумовлений у файлі stdio.h.
На відміну від puts(), функція fputs() не додає до виводу символ переходу на інший рядок автоматично.
Необхідно звернути увагу, що функція gets() відкидає символ переходу на інший рядок при введенні даних, a puts() додає його до виведення. І навпроти, fgets() зберігає символ нового рядка у введенні, a fputs() не додає цей символ до виведенні.
Виведення символів на екран - putchar().
Функція putchar(), поміщає свій аргумент у «стандартне виведення», що за замовчуванням є терміналом. Виведення можна направити і у деякий файл.
Приклад використання функції: putchar(ch);
Струюура Сі - програми
Звичайна Сі-програма є визначенням функції main, яка для виконання необхідних дій викликає інші функції. Наприклад, програма, що є одним початковим файлом, який містить визначення функції main і функцій, що викликаються з main (виключаючи функції бібліотеки Сі, які в більшості своїй доступні програмісту у відкомпільованому, об'єктному вигляді). Ці функції здійснюють зв'язок за даними за допомогою передачі параметрів і повернення значень.
Проте реальний програмний проект розробляється як безліч початкових файлів, які компілюються окремо, а потім об'єднуються у виконувану програму редактором зв'язків. При такій структурі початкової програми функції з різних файлів можуть використовувати глобально доступні зовнішні змінні. Самі функції за визначенням завжди зовнішні і доступні з будь-яких файлів.
Приклад структури програми, що складається з двох файлів fнlel.c і fнle2.c, представлений нижче:
fнlel.c fнle2.c
main() шпс2()
{ {
} }
func1() func3()
{ {
} }
В даному прикладі функція main може виконати будь-яку з трьох функцій ftmcl, func2, func3. Кожна з цих функцій може викликати будь-яку з тих двох, що залишилися.
Для того, щоб визначувана функція могла виконати яку-небудь роботу, вона повинна використовувати змінні. В мові Сі всі змінні повинні бути оголошені до їх використання. Оголошення встановлюють відповідність між ім'ям і атрибутами змінної, функції або типу. Розглянемо основні поняття Сі-програми.
Початкова програма- це сукупність наступних об'єктів: директив, вказівок компілятору, оголошень і визначень. Директиви задають дії препроцесора по перетворенню тексту програми перед компіляцією.
Вказівки компілятору - це команди, виконувані компілятором під час процесу компіляції. Оголошення задають імена і атрибути змінних, функцій і типів, що використовуються в програмі.
Визначення - це оголошення, що визначають змінні і функції. Визначення змінної в доповненні до її імені і типу задає початкове значення оголошеної змінної. Крім того, визначення припускає розподіл пам'яті для змінної.
Визначення функції специфікує її структуру, яка є сумішшю з оголошень і операторів, які утворюють саму функцію. Визначення функції також задає ім'я функції, її формальні параметри і тип величини, що повертається.
Початкова програма може містити будь-яке число директив, вказівок компілятору, оголошень і визначень. Будь-якій з об'єктів програми має певний синтаксис, і кожна складова може з'являтися у будь-якому порядку, хоча вплив порядку, в якому слідують змінні і функції може бути використано в програмі.
Нетривіальна програма завжди містить більше одного визначення функції. Функція визначає дії, виконувані програмою.
В наступному прикладі ілюструється проста початкова програма на мові
Сі.
int х = 1; /*визначення змінної х */
inty=2;
extern intprintf (char* ...);/*оголошення функції */
main () /* оголошення головної функції або точка початку програми */
{
int z; /*оголошення змінної */
int w;
z = у + х; w = у - х;
printf("z = %d\n w = %d \n", z, x);
Ця початкова програма визначає функцію з ім'ям main і оголошує функцію printf(). Змінні х і у задаються своїми визначеннями. Змінні z і w тільки оголошуються.
Початкові Сі-файли.
Початкові програми можуть бути розділені на декілька файлів. Початковий файл Сі - це текстовий файл, який містить частину або всю початкову програму. Він може, наприклад, містити тільки деякі функції, що потрібні програмі. При компіляції початкової програми кожний з початкових файлів повинен бути відкомпільований окремо, а потім оброблений складальником. Окремі початкові файли перед компіляцією можна сполучати в один великий початковий файл за допомогою директиви #include.
Початковий файл може містити будь-яку комбінацію наборів: директив, вказівок компілятору, оголошень і визначень. Такі об'єкти, як визначення функцій або великі структури даних, не можуть розриватися, починаючись в одному файлі і продовжуючись в іншому.
Початковий файл не обов'язково повинен містити виконувані оператори. Іноді корисно розміщувати описи змінних в одному файлі з тим, щоб використовувати їх шляхом оголошення посилань з інших файлів. В цьому випадку визначення стають легко доступними для пошуку і модифікації. З тих же самих міркувань константи і макроси часто організовують в окремих #include- файлах і включають їх, якщо потрібно, в початкові файли.
Директиви початкового файла відносяться тільки до цього початкового файла і файлів, що включають його (за допомогою #include). Крім того, кожна директива відноситься тільки до частини файла, яка слідує за нею. Якщо безліч директив повинні відноситися до всієї початкової програми, то всі початкові файли повинні містити ці директиви.
Вказівки компілятору звичайно ефективні для окремих областей початкового файла. Специфічні дії компілятора, що задається вказівками, визначаються змістом останніх.
Виконання програм.
Кожна програма містить головну програмну функцію. В Сі головна програмна функція повинна бути поіменована як main. Функція main служить точкою старту при виконанні програми і звичайно управляє виконанням програми, організовуючи виклики інших функцій. Програма звичайно завершує виконання по закінченню функції main, хоча вона може завершитися і в інших точках, залежно від навколишнього оточення.
Початкова програма звичайно включає декілька функцій, кожна з яких призначена для виконання певного завдання. Функція main може викликати ці функції з тим, щоб виконати те або інше завдання. Функція повертає управління при виконанні оператора return або по закінченні самої функції (вихід на кінець функції).
Всі функції, включаючи функцію main, можуть бути оголошені з параметрами. Функції, що викликаються, набувають значення параметрів із викликаючих функцій. Значення параметрів функції main можуть бути передані із зовнішнього оточення. Наприклад, вони можуть бути передані з командного рядка.
Угода Сі вимагає, щоб перші два параметри функції main називалися arge і
argv.
Параметр argc визначає загальне число аргументів, що передаються функції main. Параметр argv оголошується як масив вказівників, кожний елемент якого посилається на рядкове представлення аргументу, передаваного функції main. Третій параметр функції main (якщо він є) традиційно задається ім'ям envp. Проте Сі не вимагає цього імені. Параметр envp- це покажчик на масив вказівників рядкових величин, які визначають оточення, в якому виконується програма.
Операційна система підтримує передачу значень для argc, argv, і envp параметрів, а користувач підтримує завдання значень фактичних параметрів для функції main. Угода про передачу параметрів більшою мірою визначається операційною системою, ніж самою мовою Сі.
Формальні параметри функції повинні бути оголошені під час опису функції.
Час життя і видимість.
Концепції "Час життя" і "Видимість" є дуже важливими для розуміння структури програм на Сі. Час життя змінної може бути або "глобальним" або "локальним".
Об'єкт з глобальним часом життя характеризується певною пам'яттю і значенням протягом всього життя програми.
Об'єкт з локальним часом життя захоплює нову пам'ять при кожному вході в «блок», в якому він визначений або оголошений. Коли блок завершується, локальний об'єкт пропадає, а отже пропадає його значення.
Об'єкт вважається «видимим» в блоці або початковому файлі, якщо відомий тип і ім'я об'єкту в блоці або початковому файлі. Об'єкт може бути «глобально видимим», коли мається на увазі, що він бачимий або може бути оголошений видимим протягом всього початкового файла, створюючого програму.
Блок - це складовий оператор. Складові оператори складаються з оголошень і операторів. Блоки можуть бути вкладеними.
Структура функції є сукупністю складових операторів. Таким чином, функції мають блокову структуру, блоки, у свою чергу, можуть містити усередині себе інші блоки.
Всі функції мають глобальний час життя, незважаючи на те, де вони оголошені. Змінні, оголошені на зовнішньому рівні, завжди мають глобальний час життя. Змінні, оголошені на внутрішньому рівні, завжди мають локальний час життя.
Типи даних і їхнє об'явлення. Правила опису змінних.
Важливою відмінністю мови Сі від інших мов є відсутність принципу змовчання, що приводить до необхідності об'явлення всіх змінних, що використовуються в програмі явно разом із указівкою відповідних їм типів.
Об'явлення змінної має наступний формат:
[специфікатор-класа-пам 'яті] специфікатор-типу описувач [=ініціатор][, описувач[= ініціатор]]...
Описувач - ідентифікатор простої змінної або більш складна конструкція із квадратними дужками, круглими дужками або зірочкою (набором зірочок).
Специфікатор типу - одно чи кілька ключових слів, що визначають тип змінної, що об'являється. У мові Сі є стандартний набір типів даних, використовуючи який можна сконструювати нові (унікальні) типи даних.
Ініціатор - задає початкове значення або список початкових значень, що привласнюються змінним при об'явленні.
Специфікатор класу пам'яті - визначається одним з чотирьох ключових слів мови Сі: auto, extern, register, static, і вказує, яким чином буде розподілятися пам'ять під оголошувану змінну, з одного боку, а з іншого, область видимості цієї змінної, тобто, з яких частин програми можна до неї звернутися.
Категорії типів даних.
Ключові слова для визначення основних типів даних:
Цілі типи: Дійсні типи:
Char float
Int double
Short long double
Signed
Unsigned
Змінна будь-якого типу може бути об'явлена як немодифікована. Це досягається додаванням ключового слова const до специфікатора-типу. Об'єкти з типом const являють собою дані, використовувані тільки для читання, тобто цій змінній не може бути привласнене нове значення. Якщо після слова const відсутній специфікатор-типу, то мається на увазі специфікатор типу int. Якщо ключове слово const стоїть перед об'явленням складених типів (масив, структура, суміш, перерахування), то це приводить до того, що кожний елемент також повинен бути немодифікованим, тобто значення йому може бути привласнено тільки один раз.
Приклади:
const double А = 2.128Е-2;
const В = 286; (мається на увазі const int В = 286).
Цілий тип даних.
Для визначення даних цілого типу використовуються різні ключові слова, що визначають діапазон значень і розмір області пам'яті, яка виділяється під
змінну (табл. 1).
Таблиця І
Tun |
Розмір пам'яті в байтах |
Діапазон значень |
Char |
1 |
Від-128 до 127 |
Int |
2 |
|
Short |
2 |
Від -32 768 до 32 767 |
Long |
4 |
Від -2 147 483 648 до 2 147 483 647 |
Unsigned char |
1 |
Від 0 до 255 |
Unsigned int |
2 |
* |
Unsigned short |
2 |
Від 0 до 65535 |
Unsigned long |
4 |
Від 0 до 4 294 967 295 |
Ключові слова signed і unsigned необов'язкові. Вони вказують, як інтерпретується нульовий біт оголошуваної змінної, тобто, якщо зазначене ключове слово unsigned, то нульовий біт інтерпретується як частина числа, у противному випадку нульовий біт інтерпретується як знаковий. У випадку відсутності ключового слова unsigned ціла змінна вважається знаковою. У тому випадку, якщо специфікатор типу складається з ключового типу signed чи unsigned і далі стоїть ідентифікатор змінної, то вона буде розглядатися як змінна типу int. Наприклад:
unsigned int n;
unsigned int b;
int c; (мається на увазі signed int c);
unsigned d; (мається на увазі unsigned int d);
Модифікатор-типу char використовується для представлення символу (з масиву представлення символів) або для об'явлення строкових літералів. Значенням об'єкта типу char є код (розміром 1 байт), що відповідає символу, що представляється. Для представлення символів російського алфавіту, модифікатор типу ідентифікатора даних має вид unsigned char, тому що коди російських букв перевищують величину 127.
Дійсні дані
Для змінних, що представляють дійсне число, використовуються наступні модифікатори-типу: float, double, long double (у деяких реалізаціях мови Сі long double відсутній).
Величина з модифікатором-типу float займає 4 байти. З них 1 байт приділяється для знака, 8 біт для надлишкової експоненти і 23 біта для
мантиси. Старший біт мантиси завжди дорівнює 1, тому він не заповнюється, у зв'язку з цим діапазон значень дійсної змінної, приблизно дорівнює від 3.14Е -38до3.14Е +38.
Величина типу double займає 8 біт у пам'яті. її формат аналогічний формату float. Біти пам'яті розподіляються в такий спосіб: 1 біт для знака, 11 біт для експоненти і 52 біта для мантиси. З урахуванням опущеного старшого біта мантиси діапазон значень дорівнює від 1.7Е -308 до 1.7Е +308.
Приклади:
float а, з; double х, у;
Вирази. Перетворення при обчисленні виразів.
Комбінація знаків операцій і операндів, результатом якої є певне значення, називається виразом. Знаки операцій визначають дії, що повинні бути виконані над операндами. Кожен операнд у виразі може бути виразом. Значення виразу залежить від розташування знаків операцій і круглих дужок у виразі, а також від пріоритету виконання операцій.
У мові Сі присвоювання також є виразом, і значенням такого виразу є величина, що привласнюється.
При обчисленні виразів тип кожного операнда може бути перетворений до іншого типу. Перетворення типів можуть бути неявними, при виконанні операцій і викликів функцій, чи явними, при виконанні операцій приведення типів.
Операнд - це константа, літерал, ідентифікатор, виклик функції, індексний вираз, вираз вибору елемента або більш складний вираз, сформований комбінацією операндів, знаків операцій і круглих дужок. Будь-який операнд, що має константне значення, називається константним виразом. Кожен операнд має тип.
Якщо в якості операнда використовується константа, то йому відповідає значення і тип константи, що його представляє. Ціла константа може бути типу int, long, unsigned int, unsigned long, у залежності від її значення і від форми запису. Символьна константа має тип int. Константа дійсного типу завжди має тип double чи float.
Константний вираз - це вираз, результатом якого є константа. Операндом константного виразу можуть бути цілі константи, символьні константи, константи дійсного типу, константи перерахування, вирази приведення типів, вирази з операцією sizeof і інші константні вирази. Однак на використання знаків операцій у константних виразах накладаються наступні обмеження.
1.У константних виразах не можна використовувати операції присвоювання і послідовного обчислення (,).
2. Операція «адреса» (&) може бути використана тільки при деяких ініціалізаціях.
Вирази зі знаками операцій можуть бути використані у виразах як операнди. Вирази зі знаками операцій можуть бути унарними (з одним операндом), бінарними (із двома операндами) і тернарними (із трьома операндами).
Унарний вираз складається з операнда і попереднього йому знаку унарної операції і має наступний формат:
знак-унарної-операції операнд
Бінарний вираз складається з двох операндів, розділених знаком бінарної операції:
операнд 1 знака-бінарної-операції операнд2
Тернарний вираз складається з трьох операндів, розділених знаками тернарної операції (?) і (:), і має формат:
операнд 1 ? операнд2 : операндЗ Вирази в дужках.
Будь-який операнд може бути укладений у дужки. Вони не впливають на тип і значення виразу, укладеного в дужки. Наприклад, у виразі
(10 + 5)/5
дужки, у яких міститься запис 10 + 5, означають, що величина 10 + 5 є лівим операндом операції ділення. Результат виразу (10 +5) /5 дорівнює 3. Без дужок значення запису 10 + 5/5 дорівнювало 6 11. Хоча дужки впливають на те, яким шляхом групуються операнди у виразі, вони не гарантують детальний порядок обчислення виразу.