русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Змінні й арифметичні вирази


Дата додавання: 2014-11-28; переглядів: 822.


Програма далі використовує формулу °C=(5/9)(°F-32) для виводу наступної таблиці температур по Фаренгейту та відповідних значень за Цельсієм:

1 -17

20 -6

40 4

60 15

80 26

100 37

120 48

140 60

160 71

180 82

200 93

220 104

240 115

260 126

280 137

300 148

Сама програма все ще складається з однієї тільки функції main. Вона довша, ніж та, яка виводила «hello world», але не є складною. Ця програма привносить декілька нових понять, таких як коментарі, оголошення, змінні, арифметичні вирази, цикли та форматований вивід.

#include <stdio.h>

 

/* вивести таблицю Фаренгейт-Цельсій

із fahr = 0, 20, ..., 300 */

main()

{

int fahr, celsius;

int lower, upper, step;

 

lower = 0; /* нижня межа температурної шкали */

upper = 300; /* верхня межа */

step = 20; /* розмір поступу */

 

fahr = lower;

while (fahr <= upper) {

celsius = 5 * (fahr-32) / 9;

printf("%d\t%d\n", fahr, celsius);

fahr = fahr + step;

}

}

Рядки

/* вивести таблицю Фаренгейт-Цельсій

із fahr = 0, 20, ..., 300 */

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

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

int fahr, celsius;

int lower, upper, step;

Тип int означає, що ці змінні — цілі числа, на відміну від float, що позначає числа з рухомою точкою, тобто числа, які можуть мати дробову частину. Обсяг обох, int і float, залежить від машини; поширеним типом є 16-бітні значення int, що знаходяться у межах від -32768 до +32768, так само як і 32-бітні int. Значення float, як правило, являються 32-бітної довжини, здатної утримувати шестизначні числа в діапазоні між 10-38 і 1038. C передбачає декілька додаткових типів даних, окрім int та float, включаючи

char символ - один байт
short коротке ціле число
long довге ціле число
double число з рухомою точкою подвійної точності

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

Обчислення в програмі перетворення температур починається з виразів присвоєння

lower = 0;

upper = 300;

step = 20;

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

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

while (fahr <= upper) {

...

}

Цикл while діє наступним чином: умова в дужках перевіряється, якщо вона є істинною (значення fahr дійсно менше або рівне upper), виконується тіло циклу (три вирази, включені у фігурні дужки). Після цього умова перевіряється знову, якщо істина — тіло буде виконано знову. Коли умова виявиться хибною (fahr стане більше за upper), цикл завершиться, і виконання програми продовжиться з виразу, що слідує одразу за циклом. Якщо додаткових виразів немає, програма завершиться.

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

while (i < j)

i = 2 * i;

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

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

celsius = 5 * (fahr-32) / 9;

Причиною множення на п'ять а потім ділення на 9 замість просто множення на 5/9 є те, що C, як і багато інших мов, стинає результат поділу цілих чисел — дробова частина відкидається. Оскільки 5 і 9 — обидва цілі числа, поділ 5/9 округлиться до нуля, тож всі температури за Цельсієм звітуватимуться як нульові.

Цей приклад програми також розкриває нам трохи більше стосовно роботи printf. printf — це функція загального призначення для форматованого виводу (ми її опишемо докладніше вРозділі 7). Її першим аргументом є ланцюжок знаків, які буде виведено, де % вказує ті частини, які буде замінено, і в якій формі відбудеться вивід. Так наприклад, %d вказує на десятковий аргумент, тож вираз

printf("%d\t%d\n", fahr, celsius);

виведе значення двох цілих fahr і celsius, розділені табуляцією (\t).

Кожна конструкція з % першого (включеного у лапки) аргументу printf, знаходить собі пару у другому, третьому, і так далі, аргументові printf; вони мають збігтися кількісно і за типом, інакше ви отримаєте помилкові відповіді.

Між іншим, printf не є частиною мови C, ввід і вивід не визначено у самій мові. printf — це просто функція серед інших функцій стандартної бібліотеки мови. Однак, поводження printf описане стандартом ANSI, тож воно має бути однаковим, незалежно від компілятора та платформи, які використовуються.

Для того, щоб зосередитись на самій C, ми не обговорюватимемо ввід і вивід значною мірою аж до Розділу 7. Зокрема, ми втримаємося до того часу від форматованого вводу. Якщо вам треба написати щось із вводом чисел, загляніть до обговорення функції scanf у Розділі 7.4. Остання схожа на printf, за виключенням того, що scanf читає ввід, замість здійснювати вивід.

Наша програма перетворення температури має проте декілька вад. Найпростіша з них це те, що вивід — не досить привабливий, оскільки числа не вирівняно з правого боку. Це легко виправити, якщо додати до кожного твердження %d функції printf аргумент ширини. У цьому випадку, числа буде вирівняно праворуч. Так, наприклад, ми можемо сказати

printf("%3d %6d\n", fahr, celsius);

щоб вивести перше число кожного рядка шириною в три знаки, а друге число - шириною в шість:

0 -17

20 -6

40 4

60 15

80 26

100 37

...

Серйозніша проблема полягає у тому, що ми використали арифметику десяткових чисел, тож отримана температура за Цельсієм — не досить точна. Наприклад, 0F, насправді дорівнює -17.8C, а не -17. Щоб отримати точніші відповіді, ми повинні звернутися до арифметики чисел з рухомою точкою замість цілих. Це вимагає деяких змін у програмі. Ось друга версія:

#include <stdio.h>

 

/* виводить таблицю Фаренгейт-Цельсій із fahr = 0, 20, ..., 300;

версія з числами з рухомою точкою */

main()

{

float fahr, celsius;

float lower, upper, step;

 

lower = 0; /* нижня межа температурної шкали */

upper = 300; /* верхня межа */

step = 20; /* розмір кроку */

 

fahr = lower;

while (fahr <= upper) {

celsius = (5.0/9.0) * (fahr-32.0);

printf("%3.0f %6.1f\n", fahr, celsius);

fahr = fahr + step;

 

}

}

Цей варіант дуже подібний до попереднього, за винятком того, що fahr і celsius оголошено як float, а саму формулу перетворення написано у натуральніший спосіб. Ми не могли використати 5/9 у попередній програмі, оскільки ділення цілих округлилося би до нуля. Десяткова точка у константі вказує на те, що це — числом з рухомою точкою, тож 5.0/9.0 не округляється.

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

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

fahr = lower;

і тестування

while (fahr <= upper)

також працюють у натуральний спосіб — int перетворено у float перед тим як здійснити операцію.

Вказівник перетворення %3.0f функції printf вказує на те, що потрібно вивести число з рухомою точкою (тут fahr), шириною, щонайменше, три знаки, без десяткової крапки та дробової частини. %6.1f описує інше число (celsius), яке буде виведено, щонайменше, шириною шість знаків, з однією цифрою після десяткового знака. Вивід виглядатиме наступним чином:

0 -17.8

20 -6.7

40 4.4

...

Ширина і точність може бути опущеною у вказівникові: %6f вказує на те, що число повинно бути, принаймні, шириною шість знаків, %.2f вказує на два знаки після десяткової крапки, але без обмеження ширини, а %f — просто вивід числа з рухомою точкою.

%d вивести як десяткове ціле
%6d вивести як десяткове ціле шириною, щонайменше, 6 знаків
%f вивести як число з рухомою точкою
%6f вивести як число з рухомою точкою шириною, щонайменше, 6 знаків
%.2f вивести як число з рухомою точкою з двома знаками після десяткової крапки
%6.2f вивести як число з рухомою точкою шириною, щонайменше, 6 знаків з 2-а після десяткової крапки

Серед інших, printf також розпізнає %o для вісімкового, %x — для шістнадцяткового, %c — для символу, %s — для символьного ланцюжка, і %% — для відображення самого %.

Вправа 1-3. Змініть програму по перетворенню температур таким чином, щоб вона виводила заголовок над таблицею.

Вправа 1-4. Напишіть програму, яка би виводила відповідну таблицю перетворень з Цельсія у Фаренгейт.


<== попередня лекція | наступна лекція ==>
Перші кроки | Твердження for


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн