Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



Згадаємо, що компілятор Паскаля виконує автоматичне перетворення типів даних, особливо в математичних виразах, коли найчастіше цілочисельний тип перетворюється у тип з плаваючою комою. Цей стиль підтримує і Сі, причому значення типу 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():

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.

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

Таблиця 1.3. Значення основних модифікаторів рядка формату
Модифікатор Значення
- Аргумент буде друкуватися починаючи з лівої позиції поля заданої ширини. Звичайно друк аргументу закінчується в самій правій позиції поля. Приклад: %-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);

}

Більшість реалізацій мови Сі дозволяють пов'язувати імена stdin та stdout не тільки з клавіатурою та екраном, а й із зовнішніми файлами. Для цього в рядку виклику Сі програми необхідно вказати імена цих файлів. Якщо перед ім'ям файла введення поставити знак <, то даний файл буде пов'язаний з потоком введення.

prog < file.in

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

prog > file.out

А при такому виклику програми інформація виводиться не на екран, а у файл file.out.

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

prog < file.in > file.out





Дата публикования: 2015-01-23; Прочитано: 954 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2025 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...