626 items (0 unread) in 45 feeds
Минулого разу я розповідав про типи-цілі числа. На кінець замітки я запропонував написати програму, яка б реалізовувала розрахунок за якою-небудь математичною формулою. Ну от наприклад, всім відома з шкільних часів формула переміщення під час рівноприскореного руху S = v*t + a*t2/2. Сподіваюсь, що труднощів таке завдання не викликає та одразу ж приведу програмний код без пояснень: #include "stdio.h" int main() { int a = 10, t = 5, v = 0; printf("S = %in", (v*t + a*t*t/2)); return 0; } Відкопілювавши та виконавши цю програму отримаємо: S = 125 Для a = 10, все добре. А якщо замінити на 11, то ми мали б отримати 137,5, а ось програма поверне всього 137. Зрозуміло, що втрати дробної частини числа далеко не завжди є допустимими, тому в мові C присутні дійсні числові типи. Дійсні числові типи в мові C Можна виділити три дійсні числові типи: float, double, long double. На відміну від цілих типів, дійсні числові типи в пам'яті представлені у вигляді знаку, мантиси та порядку. Напишемо невеличку програму, щоб розібратись з даними про дійсні типи. #include "stdio.h" int main() { printf("float %i, double %i, long double %in", sizeof(float), sizeof(double), sizeof(long double)); return 0; } Отримаємо: float 4, double 8, long double 12 Тип float займає 4 байти, з яких один розряд (біт) йде на знак, 7 на порядок та 24 під мантису. Аналогічно в double під порядок та мантису йде 11 та 52 розріди відповідно. А в long double 19 та 76. Виводимо дійсні числа Для виведення дійсних чисел на контенкст виводу через функції форматного виведення, як і цілочислені дані. Однак формат виведення буде іншим. %f - дійсне число у вигляді десяткового дробу; %e - у вигляді числа з фіксованою крапкою, тобто мантиси та порядку; %g - автовибір між %f та %e, для оптимального відображення (наприклад, 10-10 при %f роздрукується як 0.000000, а 1.000000e-10); %l - для подовження типу. Операції з дійсними числами Для дійсних чисел доступні всі операції, що й для цілих окрім двох: цілочислене ділення замінене на звичайне, тобто таке що повертає дійсні числа, та повністю відсутня операція залишку від ділення. Тут хочу наголосити, що всі операції, що виконуються з дійсними числами в результаті повертають дійсні числа, а якщо всі числа цілі, то й результатом буде ціле число. Тому потрібно бути обережним при використанні дійсних та цілих чисел в одному виразі. Наведу декілька прикладів. Вираз: printf("%f", 1/10); надрукує в консолі 0.000000, тому-що операції виконувались з цілими числами і виконувалось цілочислене ділення. А ось: printf("%f %f", 1./10, 1/10.); надрукує "0.100000 0.100000", тому що один з операндів дійсне число. Доречі, спроба присвоїти цілій змінній результат виконання операції з дійсними числами неможливий. Потрібно використовувати приведення типів: int i = (int) 1.5; Модифікована програма розрахунку за формулою На кінець хочу навести код модифікованої програми для розрахунку за формулою: #include "stdio.h" int main() { float a = 11, t = 5, v = 0; printf("S = %fn", (v*t + a*t*t/2)); return 0; } Результатом ії виконання буде: S = 137.500000 , що й треба було отримати. Пропоную всім хто слідкує за моїми дописами та виконує мої завдання спробувати модифікувати власні програми для того, щоб вони працювали з дійсними числами. Наступного разу планую розповісти детальніше про функції введення/виведення. Слідкуйте через rss та поштову розсилку, залишайте відгуки в коментарях та мені на пошту grandse(at)ukr.net. Дякую за увагу!
Минулого разу я розповідав про типи-цілі числа. На кінець замітки я запропонував написати програму, яка б реалізовувала розрахунок за якою-небудь математичною формулою. Ну от наприклад, всім відома з шкільних часів формула переміщення під час рівноприскореного руху S = v*t + a*t2/2. Сподіваюсь, що труднощів таке завдання не викликає та одразу ж приведу програмний код без пояснень: #include "stdio.h" int main() { int a = 10, t = 5, v = 0; printf("S = %in", (v*t + a*t*t/2)); return 0; } Відкопілювавши та виконавши цю програму отримаємо: S = 125 Для a = 10, все добре. А якщо замінити на 11, то ми мали б отримати 137,5, а ось програма поверне всього 137. Зрозуміло, що втрати дробної частини числа далеко не завжди є допустимими, тому в мові C присутні дійсні числові типи. Дійсні числові типи в мові C Можна виділити три дійсні числові типи: float, double, long double. На відміну від цілих типів, дійсні числові типи в пам'яті представлені у вигляді знаку, мантиси та порядку. Напишемо невеличку програму, щоб розібратись з даними про дійсні типи. #include "stdio.h" int main() { printf("float %i, double %i, long double %in", sizeof(float), sizeof(double), sizeof(long double)); return 0; } Отримаємо: float 4, double 8, long double 12 Тип float займає 4 байти, з яких один розряд (біт) йде на знак, 7 на порядок та 24 під мантису. Аналогічно в double під порядок та мантису йде 11 та 52 розріди відповідно. А в long double 19 та 76. Виводимо дійсні числа Для виведення дійсних чисел на контенкст виводу через функції форматного виведення, як і цілочислені дані. Однак формат виведення буде іншим. %f - дійсне число у вигляді десяткового дробу; %e - у вигляді числа з фіксованою крапкою, тобто мантиси та порядку; %g - автовибір між %f та %e, для оптимального відображення (наприклад, 10-10 при %f роздрукується як 0.000000, а 1.000000e-10); %l - для подовження типу. Операції з дійсними числами Для дійсних чисел доступні всі операції, що й для цілих окрім двох: цілочислене ділення замінене на звичайне, тобто таке що повертає дійсні числа, та повністю відсутня операція залишку від ділення. Тут хочу наголосити, що всі операції, що виконуються з дійсними числами в результаті повертають дійсні числа, а якщо всі числа цілі, то й результатом буде ціле число. Тому потрібно бути обережним при використанні дійсних та цілих чисел в одному виразі. Наведу декілька прикладів. Вираз: printf("%f", 1/10); надрукує в консолі 0.000000, тому-що операції виконувались з цілими числами і виконувалось цілочислене ділення. А ось: printf("%f %f", 1./10, 1/10.); надрукує "0.100000 0.100000", тому що один з операндів дійсне число. Доречі, спроба присвоїти цілій змінній результат виконання операції з дійсними числами неможливий. Потрібно використовувати приведення типів: int i = (int) 1.5; Модифікована програма розрахунку за формулою На кінець хочу навести код модифікованої програми для розрахунку за формулою: #include "stdio.h" int main() { float a = 11, t = 5, v = 0; printf("S = %fn", (v*t + a*t*t/2)); return 0; } Результатом ії виконання буде: S = 137.500000 , що й треба було отримати. Пропоную всім хто слідкує за моїми дописами та виконує мої завдання спробувати модифікувати власні програми для того, щоб вони працювали з дійсними числами. Наступного разу планую розповісти детальніше про функції введення/виведення. Слідкуйте через rss та поштову розсилку, залишайте відгуки в коментарях та мені на пошту grandse(at)ukr.net. Дякую за увагу!| Назва типу | Об'єм пам'яті, байт | Діапазон значень |
| short | 2 | -32768...+32767 |
| int | 4 | -2147483648...+2147483647 |
| long | 4 | -2147483648...+2147483647 |
Сміялись ми довго, жартуючи, що всі в Microsoft напевне користуються Firefox та Opera, розуміючи наскільки кривими є їх розробки :) Ну а потім вирішили подивитись, як же буде виглядати їх творіння в інших браузерах. І ось такі результати отримали:
Для виправдовування Microsoft, якій від мене сьогодні й так не мало дісталось, скажу що причиною деяких проблем з меню в Firefox є та Opera є відсутність стандартних для Windows шрифтів у системі. Під Windows меню виглядає нормально. А ось чому попливли деякі елементи дизайну в Opera для мене залишається загадкою. А тим більше, чому компанія, що створила браузер, який вважається жахом для верстальщика (не дарма в кожному третьому шаблоні, що можна знайти є коментарі на зразок Stupid IE - сам сьогодні переживав подібне), не змогла змусити відображатись власні сторінки в ньому коректно. Оце вже не просто дивує, а викликає обурення. До того ж і до шрифтів теж могли б віднестись уважніше: в більшості дистрибутивів Linux всі пропрієтарні шрифти відсутні, тому в стилях для того ж меню слід було вказати альтернативи з вільнорозповсюджуваних. Не маленька ж конторка, а ціла корпорація, тому спеціалістів повно, а грошенят щоб їм заплатити за роботу теж вистачати повинно. А мені й справді цікаво було почитати, що ж там зробили в Microsoft. Однак усіляке бажання після такого кудись зникло. Мабуть зникло б не в мене одного. Вчимося на чужих помилках, та уважніше ставимось до таких дрібниць, не залишаючи дірок, якщо можливість їх знайти та використати мізерно мала - якщо недоліки є, то вони обов'язково проявлять себе. А до яких наслідків це може призвести залежить від кожного конкретного випадку. Однак краще, щоб нічого подібного з Вами не сталось. Чого Вам і бажаю. Дякую за увагу! Сподіваюсь, зміг трішечки підняти Вам настрій. ;)
Як я і казав вони виділяються за значеннями допустимими для даного типу. Тому серед простих типів виділяють цілі (цілі числа), дійсні , символьний тип та перераховувані, що видно з наведеної вище схеми. До типів складних я планую повернутись в майбутньому. Поняття змінної Як же типізація використовується на практиці. Справа в тому, що для зберігання даних в мовах програмування використовуються спеціальні контейнери, що називаються "змінна". Змінна - зв'язок між певним символічним іменем (ідентифікатором) та областю в пам'яті виділеним для збереження даних. Кожна змінна в мові С має 1. Клас збереження. 2. Тип. 3. Ідентифікатор. Описується змінна таким чином: [клас збереження] тип ідентифікатор Наприклад, int i; Про цілий тип int я вже згадував попереднього разу і детальніше розповім наступного разу. Такою конструкцією ми описали змінну з ідентифікатором i цілого типу. Тобто має виділятись область пам'яті, що буде зв'язана з ідентифікатором i. Значить за цим ідентифікатором ми можемо до неї звертатись. А отже рядок: i = 0; Буде значити, що ми кладемо в комірку пам'яті зв'язану з цим ідентифікатором значення 0. Для прикладу використання змінних модифікуємо попередньо написану програму. #include 'stdio.h' int main() { int i; puts("Hello, world!"); i = 0; return i; } Тепер наша програма в створює змінну, встановлює її значення та повертає його, як результат свого виконання. Приклад синтетичний і введення змінних ніякої користі не приносить, однак дозволяє показати як ними користуватись. Скажу два правила, яких слід дотримуватись при роботі зі змінними в мові С: 1. Всі змінні мають описуватись до першої командного рядка. (в прикладі єдина змінна i описана до виклику бібліотечної функції чи присвоєння). 2. Всі змінні мають бути описані до їх використання та проініціалізовані до їх використання. До речі, змінні ініціалізуватись одразу при описанні. Наприклад: int i = 0; Які зміни це дозволяє внести в код програми пропоную Вам самостійно поміркувати. Гадаю, що на цей раз інформації вистачить. Наступного разу розповім про прості цілі типи детальніше, та ще трошки розповім про функції введення/виведення. Щоб не пропустити наступний випуск підписуйтесь на rss та поштову розсилку. Дякую за увагу.Код є доволі прозорим, однак дам декілька коментарів. В функції highlight спочатку я описую п'ять типів елементів через регулярні вирази: ключові слова (keywords), дужки (brackets), рядки (strings), функції користувача (functions) та коментарі (coments). Далі, користуючись функцією replace огортаю елементи що відповідають описаним регулярним виразам в відповідні span'и. Далі в коді я описую функцію, що буде виконана при завантаженні документу. Ця анонімна функція вибирає всі елементи з класом code за замінює їх вміст (innerHTML) результатом роботи функції highlight. Як ви бачите все доволі просто. Залишається підключити всі необхідні файли, а саме white-utils.js (в якому зібрані утилітарні функції, хоча використовується з них зараз лише одна) та highlight.js. Інші шляхи Було б нечесно назвати себе першопрохідцем такої справи. Взагалі то моє рішення базується на одному записі з блога на хабрі. На жаль, скрипти наведені за тим посиланням відмовились коректно працювати з двигунцем мого блога. Тому довелось його вдосконалювати. Є вже готові бібліотеки, наприклад highlight.js чи Codepress. Однак їх розмір значно перевищує розмір мого коду, разом з усіма утилітарними функціями (враховуючи те, що взагалі то з 2 Кб підключений функцій я використовую лише одну єдину, то можна розмір ще більше скоротити і вийде приблизно 1 Кб). Мене такі результати влаштовують. Думаю, що в подальшому буду розвивати цей модуль для надання йому більшого функціоналу. Приєднуйтесь якщо бажаєте. Пишіть в коментарях чи мені на пошту (grandse(at)ukr.net) про виявлені помилки та додатки. Буду вдячний за будь-які відгуки. Сподіваюсь матеріал стане в нагоді. P.S.: Приношу свої вибачення за паузу в публікаціях, оскільки прийшов майже тиждень з часу останньої замітки і за можливі подальші прогалини. Зараз я доволі сильно захворів тому не практично не можу працювати. Як тільки моє здоров'я покращиться буду писати більше: ідей у мене для публікацій є ще багато, так що кому цікаво читати не забувайте про підписку через rss та поштову розсилку.