Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Перетворення типу

 

Згадаємо, що компілятор Паскаля виконує автоматичне перетворення типів даних, особливо в математичних виразах, коли найчастіше цілочисельний тип перетворюється у тип з плаваючою комою. Цей стиль підтримує і Сі, причому значення типу char та int в арифметичних виразах змішуються: кожний з таких символів автоматично перетворюється в ціле. Взагалі, якщо операнди мають різні типи, перед тим, як виконати операцію, молодший тип "підтягується" до старшого.

Результат - старшого типу. Отже,

• char та short перетворюються в int;

• float перетворюється в double;

• якщо один з операндів long double, то і другий перетворюється в long double;

• якщо один з операндів long, тоді другий перетворюється відповідно до того ж типу, і результат буде long;

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

Приклад:
double ft, sd;

unsigned char ch;

unsigned long in;

int i;

/*... */

sd = ft*(i+ch/in);

При виконанні оператора присвоювання в даному прикладі правила перетворення типів будуть використані наступним чином. Операнд ch перетворюється до unsigned int. Після цього він перетворюється до типу unsigned long. За цим же принципом і перетворюється до unsigned long і результат операції, що розміщена в круглих дужках буде мати тип unsigned long. Потім він перетворюється до типу double і результат всього виразу буде мати тип double.

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

Але, окрім цього в Сі з'являється можливість і примусового перетворення типу, щоб дозволити явно конвертувати (перетворювати) значення одного типу даних в інший. Загальний синтаксис перетворення типу має два варіанти:

1). (новий_тип) вираз;

2). новий_тип (вираз);

Обидва варіанти перетворення виглядають так:

сhar letter = 'a';

int nasc = int (letter);

long iasc = (long) letter;

 

1.3.4 Функції введення та виведення


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

В мові Сі на стандартні потоки введення-виведення (в більшості випадків - клавіатура та монітор) завжди вказують імена stdin та stdout. Обробку цих потоків здійснюють функції, визначені в заголовочному файлі stdio.h.

Розглянемо основні функції введення-виведення.

Функція getchar() зчитує і повертає черговий символ з послідовності символів вхідного потоку. Якщо цю послідовність вичерпано, то функція getchar() повертає значення -1 (цьому значенню відповідає константа EOF).

Функція putchar (аргумент), де аргументом є вираз цілого типу, виводить у стандартний вихідний потік значення аргументу, перетворене до типу char.

Приклад
#include<stdio.h>
void main()

{

char ch;

ch=getchar();

putchar(ch);

}

Для введення та виведення більш складної інформації використовуються функції

scanf() та printf().

Функція printf() призначена для виведення інформації за заданим форматом. printf("Рядок формату"[, аргумент1[, аргумент2, [...]]]);

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

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

Приклад

#include<stdio.h>

void main()

{

int a=10,b=20,c=30;

printf(" a==%d \n b==%d \n c==%d \n",a,b,c);

}

Специфікації перетворення для функції printf():

%d - десяткове ціле;

%i - десяткове ціле;

%o - вісімкове ціле без знаку;

%u - десяткове ціле без знаку (unsigned)

%x - шістнадцяткове ціле без знаку;

%f - представлення величин float та double з фіксованою точкою;

%e або %Е - експоненціальний формат представлення дійсних величин;

%g - представлення дійсних величин як f або Е в залежності від значень;

%c - один символ (char);

%s - рядок символів;

%p – покажчик

%n – покажчик

%ld - long (в десятковому вигляді);

%lo - long (у вісімковому вигляді);

%p - виведення покажчика в шістнадцятковій формі;

%lu - unsigned long.

Можна дещо розширити основне визначення специфікації перетворення, помістивши модифікатори між знаком % і символами, які визначають тип перетворення:

- Аргумент буде друкуватися починаючи з лівої позиції поля заданої ширини. Звичайно друк аргументу закінчується в самій правій позиції поля. Приклад: %-10d
Рядок цифр Задає мінімальну ширину поля. Поле буде автоматично збільшуватися, якщо число або рядок не буде вміщуватися у полі. Приклад: %4d
Цифри.цифри Визначає точність: для типів даних з плаваючою комою - число символів, що друкуються зліва від десяткової коми; для символьних рядків - максимальну кількість символів, що можуть бути надруковані. Приклад: %4.2f

 

Приклад 1 Результат
#include <stdio.h> main() { printf("/%d/\n",336); printf("/%2d/\n",336); printf("/%10d/\n",336); printf("/%-10d/\n",336); };   /336/ /336/ / 336/ /336 /
Приклад 2 Результат
#include <stdio.h> main() { printf("/%f/\n",1234.56); printf("/%e/\n",1234.56); printf("/%4.2f/\n",1234.56); printf("/%3.1f/\n",1234.56); printf("/%10.3f/\n",1234.56); printf("/%10.3e/\n",1234.56); }   /1234.560000/ /1.234560e+03/ /1234.56/ /1234.6/ / 1234.560/ / 1.235e+03/

Для введення інформації зі стандартного потоку введення використовується функція scanf().

scanf("Рядок формату",&аргумент1[,&аргрумент2[,...]]);

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

Поширеною помилкою використання scanf() у початківців є звертання: scanf("%d",n) замість scanf("%d",&n). Параметри цієї функції обов'язково повинні бути покажчиками!
Функція scanf() використовує практично той же набір символів специфікації, що і функція printf().

#include <stdio.h>

main()

{ int a,b,c;

printf("A=");

scanf("%d",&a);

printf("B=");

scanf("%d",&b);

c=a+b;

printf("A+B=%d",c);

}

 

1.3 Основні операції

 

Операції подібні вбудованим функціям мови програмування. Вони застосовуються до виразів (операндів). Більшість операцій мають два операнди, один з яких розташовується перед знаком операції, а інший - після. Наприклад, два операнди має операція додавання А+В. Операції, які мають два операнди називаються бінарними. Існують і унарні операції, тобто такі, які мають лише один операнд. Наприклад, запис -А означає застосування до операнду А операції унарного мінуса. А три операнди має лише одна операція -?:. Це єдина тернарна операція мови Сі.
У складних виразах послідовність виконання операцій визначається дужками, старшинством операцій, а при однаковому старшинстві - асоціативністю.

За призначенням операції можна поділити на:

• арифметичні операції;

• операції присвоювання;

• операції відношення;

• логічні операції;

• порозрядні операції;

• операція обчислення розміру sizeof();

• умовна операція?;

• операція слідування (кома).

 

1.4.1 Арифметичні операції

 

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

Для наведених арифметичних операцій діють наступні правила:

• бінарні операції додавання (+) та віднімання (-) можуть застосовуватися до цілих та дійних чисел, а також до покажчиків;

• в операціях множення (*) та ділення (/) операнди можуть бути будь-яких арифметичних типів;

• операція "залишок від ділення" застосовується лише до цілих операндів.

• операції виконуються зліва направо, тобто спочатку обчислюється вираз лівого операнда, потім вираз, що стоїть справа від знака операції. Якщо операнди мають однаковий тип, то результат арифметичної операції має той же тип. Тому, коли операції ділення / застосовується до цілих або символьних змінних, залишок відкидається. Так, вираз 11/3 буде рівний 3, а вираз 1/2 буде рівним нулю.

В мові Сі визначені також і унарні арифметичні операції

 

Операція інкременту (++) збільшує операнд на одиницю, а операція декременту (--) відповідно зменшує операнд на одиницю. Ці операції виконуються швидше, ніж звичайні операції додавання одиниці (a=a+1;) чи віднімання одиниці (a=a-1;).

Існує дві форми запису операцій інкременту та декременту: префіксна та постфіксна.

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

Приклад, який демонструє роботу операції інкременту

#include<stdio.h>

void main()

{

int x=3,y=3;

printf("Значення префіксного виразу: %d\n ",++x);

printf("Значення постфіксного виразу: %d\n ",y++);

printf("Значення х після інкременту: %d\n ",x);

printf("Значення y після декременту: %d\n ",y);

}

 

1.4.2 Операції присвоювання


В мові Сі знак = не означає "дорівнює". Він означає операцію при­сво­ювання деякого зна­чен­ня змінній. Тобто зміст рядка вигляду

"vr1=1024;"

не виража­ється словами "vr1 дорівнює 1024". Замість цього потрібно казати так: "присвоїти змінній vr1 значення 1024".

 

 

Операція присвоювання повертає як результат присвоєне значення. Завдяки цьому в мові Сі допускаються присвоювання виду:

a=(b=c=1)+1;

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

#include<stdio.h>

void main()

{

int data1, data2, data3;

data1=data2=data3=68;

printf("\ndata1=%d\ndata2=%d\ndata3=%d",

data1,data2,data3);

}

Результат роботи програми виглядає так:
data1=68
data2=68
data3=68

Присвоювання відбувається справа наліво: спочатку змінна data3 отримує значення 68, потім змінна datа2 і нарешті data1.

 

1.4.3 Операції порівняння

 

Операції порівняння здебіль­шого використовуються в умовних виразах. Приклади умовних вира­зів:

b<0,

'b'=='B','f'!='F',

201>=205,

Кожна умова перевіряється: істинна вона чи хибна. Точніше слід сказати, що кожна умова приймає значення "істинно" (true) або "хибно" (flase). В мові Сі немає логічного (булевого) типу. Тому результатом умовного виразу є цілочисельне арифметичне значення. "Істинно" - це ненульова величина, а "хибно" - це нуль. В більшості випадків в якості ненульового значення "істинно" використовується одиниця.

Приклад

#include<stdio.h>

main()

{

int tr, fal;

tr=(111<=115); /* вираз істинний */

fal=(111>115); /* вираз хибний */

printf("true - %d false - %d \n",tr,fal);

return 0;

}

 


 

1.4.4 Логічні операції


Логічні операції &&, ||,! використовуються здебільшого для "об'єднання" виразів порівняння у відповідності з правилами логічного І, логічного АБО та логічного заперечення.

 

Складні логічні вирази обчислюються "раціональним способом". Наприклад, якщо у виразі (A<=B)&&(B<=C)виявилось, що А більше В, то всі вирази, як і його перша частина (А<=B), приймають значення "хибно", тому друга частина (В<=C) не обчислюється.

Результат логічної операції 1, якщо істина і 0 у протилежному випадку.

 

1.4.5 Порозрядні операції (побітові операції)

 

Порозрядні операції застосовуються тільки до цілочисельних операндів і "працюють" з їх двійковими представленнями. Ці операції неможливо вико­рис­то­ву­вати із змінними типу double, float, long double.

Порозрядне заперечення! заміняє змінює кожну 1 на 0, а 0 на 1.

Приклад: ~ (10011010) == (01100101)

Порозрядна кон'юнкція & (порозрядне І) порівнює послідовно розряд за розрядом два операнди. Для кожного розряду результат рівний 1, якщо тільки два відповідних розряди операндів рівні 1, в інших випадках результат 0.

Приклад: (10010011) & (00111101) == (00010001)

Порозрядна диз'юнкція | (порозрядне АБО) порівнює послідовно розряд за розрядом два операнди. Для кожного розряду результат рівний 1, якщо хоча б один з відповідних розрядів рівний 1.

Приклад: (10010011) | (00111101) == (10111111)

Побітове додавання за МОД2 порівнює послідовно розряд за розрядом два операнди. Для кожного розряду результат рівний 1, якщо один з двох (але не обидва) відповідних розряди рівні 1.

Приклад: (10010011) ^ (00111101) == (10101110)

На операції побітового додавання за МОД2 ґрунтується метод обміну значень двох цілочисельних змінних.

a^=b^=a^=b;

Операція зсуву вліво (вправо) переміщує розряди першого операнду вліво (вправо) на число позицій, яке задане другим операндом. Позиції, що звільняються, заповнюються нулями, а розряди, що зсуваються за ліву (праву) границю, втрачаються.
Приклади

(10001010) << 2 == (00101000)

(10001010) >> 2 == (00100010)

 

1.4.6 Операція слідування (кома)

 

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

a=4;

b=a+5;

можна записати так

a=4, b=b+5;

Операція слідування використовується в основному в операторах циклу for() (про оператори циклів піде мова пізніше).

Для порівняння наводимо приклад з використанням операції слідування (приклад 1) та без неї (приклад 2):

Приклад 1. int a[10],sum,i; /*... */ sum=a[0]; for (i=1;i<10;i++) sum+=a[i]; Приклад 2. int a[10],sum,i; /*... */ for (i=1,sum=a[0];i<10;sum+=a[i],i++);    

 

1.4.7 Умовна операція ?:

 

Умовна операція?: - єдина тернарна операція в мові Сі. Її синтаксис:

умова? вираз_1: вираз_2

Принцип її роботи такий. Спочатку обчислюється вираз умови. Якщо цей вираз має ненульове значення, то обчислюється вираз_1. Результатом операції?: в даному випадку буде значення виразу_1. Якщо вираз умови рівний нулю, то обчислюється вираз_2 і його значення буде результатом операції. В будь-якому випадку обчислюється тільки один із виразів (вираз_1 або вираз_2).

Приклад 1 #include<stdio.h> void main() { int points; printf("Введiть оцiнку [2..5]:"); scanf("%d",&points); printf("%s",points>3?"Ви добре\ знаєте матерiал!":"Погано..."); } Приклад 2   j = (i<0)? (-i): (i); /* змінній j присвоюється модуль i*/   Приклад 3   max=(x>y)?x:y;  

1.4.8 Операція sizeof()

 

Дана операція обчислює розмір пам'яті, необхідний для розміщення в ній виразів або змінних вказаних типів.

Операція має дві форми

1). ім'я_типу А;

sizeof А;

2). sizeof (ім'я_типу);

Операцію sizeof() можна застосовувати до констант, типів або змінних, у результаті чого буде отримано число байт, що відводяться під операнд. Приміром, sizеof(int) поверне число байт для розміщення змінної типу int.

 

<== предыдущая лекция | следующая лекция ==>
Константи. Константами називають сталі величини, тобто такі, які в процесі виконання програми не змінюються. | Питання для узагальнення. – Ким було вперше математизовано формально логіку?
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 808; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.