русс | укр

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

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


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


Функції, які не повертають цілих


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


Досі, наші приклади функцій або не повертали жодного значення (void), або повертали int. А що, як функція має повернути якийсь інший тип? Багато математичних функцій, таких як sqrt,sin або cos повертають double; інші спеціалізовані функції повертають інші типи. Щоб проілюструвати, як впоратись з цією задачею, напишімо та випробуємо функцію atof(s), яка перетворює ланцюжок s у її еквівалент у вигляді числа з рухомою точкою подвійної точності. Функція atof — це розширення atoi, версії якої ми розглянули у Розділі 2 і 3. Остання обробляла можливий знак і десяткову крапку, так само як брак чи наявність цілої або дробової частини. Наша версія не є високоякісною функцією перетворення вводу; це зайняло би більше місця, ніж ми хотіли би використати тут. Стандартна бібліотека включає atof; у заголовку<stdlib.h> ви знайдете її оголошення.

Перш за все, сама atof має оголосити тип значення, яке вона повертає, оскільки це — не int. Назва типу стоятиме перед назвою функції:

#include <ctype.h>

 

/* atof: перетворює s у число подвійної точності */

double atof(char s[])

{

double val, power;

int i, sign;

 

for (i = 0; isspace(s[i]); i++) /* пропустити пробіли */

;

sign = (s[i] == '-') ? -1 : 1;

if (s[i] == '+' || s[i] == '-')

i++;

for (val = 0.0; isdigit(s[i]); i++)

val = 10.0 * val + (s[i] - '0');

if (s[i] == '.')

i++;

for (power = 1.0; isdigit(s[i]); i++) {

val = 10.0 * val + (s[i] - '0');

power *= 10.0;

}

return sign * val / power;

}

По-друге, так само важливо, щоб викликаюча функція знала, що atof повертає не-intзначення. Один із способів досягти цього — це явно оголосити atof у викликовій функції. Оголошення, показане у наступній примітивній програмці-калькуляторі (достатньої хіба що для збалансовування чекової книжки), яка читає по одному числу на рядок, з можливим знаком попереду, і додає їх, виводячи поточну суму після кожного вводу:

#include <stdio.h>

 

#define MAXLINE 100

 

/* простенький калькулятор */

main()

{

double sum, atof(char []);

char line[MAXLINE];

int getline(char line[], int max);

 

sum = 0;

while (getline(line, MAXLINE) > 0)

printf("\t%g\n", sum += atof(line));

return 0;

}

Оголошення

double sum, atof(char []);

вказує на те, що sum являється змінною типу double і, що atof — це функція, яка візьме один аргумент char[] і поверне число типу double.

Функцію atof має бути оголошено та визначено без протиріч. Якщо сама atof та її виклик всередині main матимуть неузгоджені типи у тому самому вихідному тексті, компілятор помітить помилку. Але (що буває частіше), якщо atof було компільовано окремо, розбіжність виявлено не буде, atof повернула би double, яке main розглянула би як int, видаючи беззмістовне значення.

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

sum += atof(line);

Якщо назва, якої не було попередньо оголошено, з'явиться у якомусь виразі, і за нею слідує ліва дужка, її буде розглянуто в контексті як оголошення назви функції, а функції, як відомо, без задання повертають int без жодних припущень щого її аргументів. Більше того, якщо оголошення функції не містить аргументів, як наприклад

double atof();

це також означає, що нічого не допускається стосовно аргументів atof, і перевірку параметрів буде вимкнено. Цей особливий зміст порожнього списку аргументів передбачено для того, щоб дозволити старшим C-програмам компілюватися з новими компіляторами. Але використовувати порожній список у нових програмах — це погана ідея. Якщо функція бере аргументи, оголосіть їх, якщо ні — скористайтеся з void.

Маючи правильно оголошену atof, ми могли би написати atoi (функцію перетворення ланцюжка на int), виходячи з неї:

/* atoi: за допомогою atof перетворює ланцюжок s на ціле число */

int atoi(char s[])

{

double atof(char s[]);

 

return (int) atof(s);

}

Зверніть увагу на структуру оголошень і на твердження return. Значення виразу

return вираз;

перетворетворюється до типу функції, до того, як відбудеться поверннення. Таким чином, значення atof, число подвійної точності, автоматично перетворено на int при появі в return, оскільки функція atoi має повернути int. Ця операція, проте, потенційно, відкидає частину інформації, тож деякі компілятори можуть попередити про це. Оператор зведення типів заявляє відверто, що саме це малося на увазі, і пригнічує будь-які попередження.

Вправа 4-2. Продовжте atof, щоб вона могла оперувати експоненційним представленням у формі

123.45e-6

де за числом з рухомою точкою може слідувати e або E і необов'язкова знакова експонента.


<== попередня лекція | наступна лекція ==>
Основні знання про функції | Зовнішні змінні


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