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