Функція Scanf C: опис. §1 Загальні відомості про мову. Етапи проектування програми. Моделі життєвого циклу додатків Все про c

1. Введення

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

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

За основу обговорення проблем автоматного програмування візьмемо нещодавню лекцію Шалито О.О. та його «програмні» статті до визначення парадигми автоматного програмування.

Мова програмування C++

Останнє оновлення: 28.08.2017

Мова програмування С++ представляє високорівневу компілювану мову програмування загального призначення зі статичною типізацією, який підходить для створення різних додатків. На сьогоднішній день С++ є однією з найпопулярніших і найпоширеніших мов.

Своїм корінням він сягає мови Сі, який був розроблений в 1969-1973 роках в компанії Bell Labs програмістом Деннісом Рітчі (Dennis Ritchie). На початку 1980-х років датський програміст Бьорн Страуструп (Bjarne Stroustrup), який на той час працював у компанії Bell Labs, розробив С++ як розширення до мови Сі. Практично спочатку C++ легко доповнював мову Си деякими здібностями об'єктно-орієнтованого програмування. І тому сам Страуструп спочатку називав його як "C with classes" ("Сі з класами").

Згодом нова мова стала набирати популярності. До нього були додані нові можливості, які робили його не просто доповненням до Сі, а новою мовою програмування. У результаті "Сі з класами" було перейменовано на С++. І з тих по обидві мови стали розвиватися незалежно одна від одної.

С++ є потужною мовою, успадкувавши від Сі багаті можливості роботи з пам'яттю. Тому нерідко С++ знаходить своє застосування у системному програмуванні, зокрема, під час створення операційних систем, драйверів, різних утиліт, антивірусів тощо. До речі, ОС Windows переважно написана на С++. Але лише системним програмуванням застосування цієї мови не обмежується. С++ можна використовувати у програмах будь-якого рівня, де важливі швидкість роботи та продуктивність. Нерідко він застосовується до створення графічних додатків, різних прикладних програм. Також особливо часто його використовують для створення ігор із багатою насиченою візуалізацією. Крім того, останнім часом набирає хід мобільний напрямок, де С++ теж знайшов своє застосування. І навіть у веб-розробці можна використовувати С++ для створення веб-додатків або якихось допоміжних сервісів, які обслуговують веб-додатки. Загалом С++ - мова широкого користування, якою можна створювати практично будь-які види програм.

С++ є мовою, що компілюється, а це означає, що компілятор транслює вихідний код на С++ у виконуваний файл, який містить набір машинних інструкцій. Але різні платформи мають свої особливості, тому скомпільовані програми не можна просто перенести з однієї платформи на іншу і там уже запустити. Однак на рівні вихідного коду програми на С++ переважно мають переносимість, якщо не використовуються якісь специфічні для поточної ос функції. А наявність компіляторів, бібліотек та інструментів розробки майже під усі поширені платформи дозволяє компілювати той самий вихідний код на С++ у додатки під ці платформи.

На відміну від Сі мова C++ дозволяє писати додатки в об'єктно-орієнтованому стилі, представляючи програму як сукупність класів і об'єктів, що взаємодіють між собою. Що полегшує створення великих додатків.

Основні етапи розвитку

У 1979-80 роках Бьорн Страуструп розробив розширення до мови Сі - "Сі з класами". У 1983 мову було перейменовано на С++.

У 1985 році було випущено першу комерційну версію мови С++, а також перше видання книги "Мова програмування C++", яка представляла перше опис цієї мови за відсутності офіційного стандарту.

У 1989 була випущена нова версія мови C++ 2.0, яка включала низку нових можливостей. Після цього мова розвивалася відносно повільно аж до 2011 року. Але при цьому в 1998 році була зроблена перша спроба стандартизації мови організацією ISO (International Organiztion for Standartization). Перший стандарт отримав назву ISO/IEC 14882:1998 або скорочено C++98. Надалі у 2003 було видано нову версію стандарту C++03.

У 2011 році було видано новий стандарт C++11, який містив безліч додавань і збагачував мову С++ великою кількістю нових функціональних можливостей. Після цього у 2014 році було випущено невелике додавання до стандарту, відоме також як C++14. І ще один ключовий реліз мови намічено на 2017 рік.

Компілятори та середовища розробки

Для розробки програм на С++ необхідний компілятор - він транслює вихідний код мовою С++ виконуваний файл, який можна запускати. Але зараз є дуже багато різних компіляторів. Вони можуть відрізнятися за різними аспектами, зокрема щодо реалізації стандартів. Базовий список компіляторів для С++ можна переглянути у вікіпедії. Рекомендується для розробки вибирати ті компілятори, які розвиваються та реалізують усі останні стандарти. Так, протягом усього керівництва переважно використовуватиметься вільно розповсюджуваний компілятор g++, розроблений у рамках проекту GNU.

Також для створення програм можна використовувати інтегровані середовища розробки IDE, як Visual Studio, Netbeans, Eclipse, Qt і т.д.

У цій статті функція scanf() розглядається у загальному вигляді без прив'язки до конкретного стандарту, тому сюди включені дані будь-яких стандартів C99, C11, C++11, C++14. Можливо, у деяких стандартах функція працює з відмінністю від викладеного у статті матеріалу.

Функція scanf C - опис

scanf() - це функція, розташована в заголовному файлі stdio.h(C) і cstdio(C++), вона також називається форматованим введенням даних у програму. scanf читає символи зі стандартного потоку введення (stdin) та перетворює їх відповідно до формату, після чого записує у зазначені змінні. Формат - означає, що дані на час вступу наводяться до певного виду. Таким чином, функція scanf C описується:

scanf("%формат", &змінна1[, &змінна2,[…]]),

де змінні передаються як адрес. Причина такого способу передачі змінних у функцію очевидна: у результаті вона повертає значення, що вказує на наявність помилок, тому єдиним способом змінювати значення змінних є передача за адресою. Також завдяки такому способу функція може обробляти дані будь-яких типів.

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

Scanf дозволяє здійснювати введення всіх базових типів мови: char, int, float, string тощо. У випадку зі змінними типу string немає потреби вказувати знак адреси - «&», оскільки змінна типу string є масивом, і її ім'я є адресою першого елемента масиву в пам'яті комп'ютера.

Формат введення даних або керуючий рядок

Почнемо з розгляду прикладу використання функції scanf C з опису.

#include int main() ( int x; while (scanf("%d", &x) == 1) printf("%d\n", x); return 0; // вимога linux-систем )

Формат введення складається з чотирьох параметрів: %[*][ширина][модифікатори] тип. При цьому знак "%" та тип є обов'язковими параметрами. Тобто мінімальний вигляд формату виглядає наступним чином: %s, %d і так далі.

У загальному випадку символи, що становлять рядок формату, поділяються на:

  • специфікатори формату – все, що начитається із символу %;
  • розділові або пробільні символи - ними вважаються пробіл, табуляція (t), новий рядок (n);
  • символи, що відрізняються від пробілів.

Функція може бути небезпечною.

Використовуйте замість scanf() функцію scanf_s().

(повідомлення від Visual Studio)

Тип, чи специфікатори формату, чи літери перетворення, чи контролюючі символи

Опис scanf C має містити, як мінімум, специфікатор формату, який вказується наприкінці виразів, що починаються зі знака «%». Він повідомляє програмі тип даних, який слід очікувати під час введення, зазвичай з клавіатури. Список усіх специфікаторів формату у таблиці нижче.

Значення

Програма очікує на введення символу. Змінна для запису має мати символьний тип char.

Програма очікує на введення десяткового числа цілого типу. Змінна повинна мати тип int.

Програма очікує введення числа з плаваючою точкою (комою) в експоненційній формі. Змінна повинна мати тип float.

Програма очікує введення числа з плаваючою точкою (комою). Змінна повинна мати тип float.

7

Програма очікує введення числа з плаваючою точкою (комою). Змінна повинна мати тип float.

Програма очікує на введення вісімкового числа. Змінна повинна мати тип int.

Програма очікує на введення рядка. Рядком вважається набір будь-яких символів до першого зустрінутого роздільного символу. Змінна повинна мати тип string.

Програма очікує на введення шістнадцяткового числа. Змінна повинна мати тип int.

Змінна очікує введення покажчика. Змінна повинна мати тип покажчика.

Записує в змінну ціле значення, що дорівнює кількості лічених до поточного моменту символів функцією scanf.

Програма зчитує беззнакове ціле число. Тип змінної повинен бути unsigned integer.

Програма очікує на введення двійкового числа. Змінна повинна мати тип int.

Набір символів сканування. Програма очікує введення символів, з обмеженого пулу, вказаного між scanf буде працювати до тих пір, поки на потоці введення знаходяться символи із зазначеної множини.

Символи у рядку формату

Символ зірочка (*)

Зірочка (*) - це прапор, що вказує на те, що операцію присвоєння треба придушити. Зірочка ставиться відразу після символу «%». Наприклад,

Scanf("%d%*c%d", &x, &y); //ігнорувати символ між двома цілими числами. scanf("%s%*d%s", str, str2); //ігнорувати ціле число між двома рядками.

Тобто якщо ввести в консолі рядок «45-20» програма зробить таке:

  1. Змінній "x" буде присвоєно значення 45.
  2. Змінною «y» буде надано значення 20.
  3. А знак мінус(тире) "-" буде проігнорований завдяки "% * c".

Ширина (або ширина поля)

Це ціле число між знаком % і специфікатором формату, яке визначає максимальну кількість символів для зчитування за поточну операцію читання.

Слід пам'ятати кілька важливих моментів:

  1. scanf припинить свою роботу, якщо зустріне розділовий символ, навіть якщо не рахував 20 символів.
  2. Якщо на введення подається більше 20 символів, у змінну str будуть записані лише перші 20 із них.

Модифікатори типу (або точність)

Це спеціальні прапори, які модифікують тип даних, які очікуються до введення. Прапор вказується зліва від специфікатора типу:

  • L або l (маленька L) При використанні "l" зі специфікаторами d, i, o, u, x прапор повідомляє програму, що очікується введення даних типу long int. При використанні "l" зі специфікатором e або f прапор повідомляє програмі, що вона повинна очікувати введення значення типу double. Використання L повідомляє програмі, що очікується значення типу long double. Використання "l" зі специфікаторами "c" та "s" повідомляє програмі, що очікуються двобайтові символи типу wchar_t. Наприклад, %lc, %ls, %l.
  • h – прапор, що вказує на тип short.
  • hh - позначає, що змінна є вказівником значення типу signed char чи unsigned char. Прапор можна використовувати із специфікаторами d, i, o, u, x, n.
  • ll (дві маленькі L) - означає, що змінна є вказівником на значення типу signed int або unsigned long long int. Прапор використовується із специфікаторами: d, i, o, u, x, n.
  • j - означає, що змінна є вказівником на тип intmax_t або uintmax_t із заголовного файлу stdint.h. Використовується із специфікаторами: d, i, o, u, x, n.
  • z - означає, що змінна є вказівником на тип size_t, визначення якого знаходиться у stddef.h. Використовується із специфікаторами: d, i, o, u, x, n.
  • t - означає, що змінна є вказівником на тип ptrdiff_t. Визначення цього типу знаходиться в stddef.h. Використовується із специфікаторами: d, i, o, u, x, n.

Більш очевидно картину з модифікаторами можна у вигляді таблиці. Такий опис scanf C для програмістів буде зрозумілішим.

Інші символи

Будь-які символи, які будуть зустрінуті у форматі, відкидатимуться. При цьому варто відзначити, що наявність у рядку пробілів або розділових символів (новий рядок, пробіл, табуляція) може призводити до різної поведінки функції. В одній версії scanf() читатиме без збереження будь-яку кількість роздільників до моменту, поки не зустріне символ, відмінний від роздільника, а в іншій версії - пробіли (тільки вони) не відіграють ролі та вираз "%d + %d" еквівалентно "% d+%d".

Приклади

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

Scanf("%3s", str); //якщо ввести в консолі рядок «1d2s3d1;3», у str запишеться тільки «1d2» scanf("%dminus%d", &x, &y); //символи «minus» між двома числами будуть відкинуті scanf("%5", str); //введення символів у str відбуватиметься доти, доки їх не буде 5 і символи є числами від 0 до 9. scanf("%lf", &d); // очікується введення даних типу double scanf ("% hd", & x); //очікується число типу short scanf("%hu", &y); //очікується число типу unsigned short scanf("lx", &z); // очікується число типу long int

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

scanf C - опис для початківців

Цей розділ буде корисний новачкам. Найчастіше потрібно мати під рукою не стільки повний опис scanf C, скільки деталі роботи функції.

  • Функція є почасти застарілою. Існує кілька різних реалізацій у бібліотеках різних версій. Наприклад, удосконалена функція scanf S C, опис якої можна знайти на сайті Microsoft.
  • Кількість специфікаторів у форматі має відповідати кількості переданих функцій аргументів.
  • Елементи вхідного потоку повинні відокремлюватися лише розділовими символами: пробіл, табуляція, новий рядок. Кома, точка з комою, точка і т. д. - ці символи не є роздільними для функції scanf().
  • Якщо scanf зустріне розділовий символ, введення буде зупинено. Якщо змінних для читання більше однієї, то scanf перейде до читання наступної змінної.
  • Найменша невідповідність формату даних, що вводяться, призводить до непередбачуваних результатів роботи програми. Добре, якщо програма просто завершиться помилково. Але часто програма продовжує працювати і робить це неправильно.
  • scanf("%20s …", …); Якщо вхідний потік перевищує 20 символів, то scanf прочитає перші 20 символів і або припинить роботу, або перейде до читання наступної змінної, якщо вона вказана. При цьому наступний виклик scanf продовжить читання вхідного потоку з місця, де зупинилася робота попереднього виклику scanf. Якщо при читанні перших 20 символів буде зустрінутий розділовий символ, scanf припинить свою роботу або перейде до читання наступної змінної, навіть якщо не рахував 20 символів для першої змінної. При цьому всі незліченні символи причепляться до наступної змінної.
  • Якщо набір символів, що скануються, почати зі знака «^», то scanf читатиме дані до тих пір, поки не зустріне розділовий символ або символ з набору. Наприклад, "%[^A-E1-5]" зчитуватиме дані з потоку, доки не буде зустрінутий один із символів англійського алфавіту від А до Е у верхньому регістрі або одне з чисел від 1 до 5.
  • Функція scanf C за описом повертає число, що дорівнює успішній кількості записів у змінні. Якщо scanf записує 3 змінні, то результатом успішної роботи функції буде повернення числа 3. Якщо scanf не зміг записати жодної змінної, то результат буде 0. І, нарешті, якщо scanf взагалі не зміг почати працювати з якихось причин, результатом буде EOF .
  • Якщо функція scanf() завершила свою роботу неправильно. Наприклад, scanf("%d", &x) - очікувалося число, а на введення прийшли символи. Наступний дзвінок scanf() розпочне свою роботу з того місця в потоці введення, де завершився попередній дзвінок функції. Щоб подолати цю проблему, необхідно позбавитися проблемних символів. Це можна зробити, наприклад, викликавши scanf("%*s"). Тобто функція прочитає рядок символів та викине його. Таким чином можна продовжити введення потрібних даних.
  • У деяких реалізаціях scanf() у наборі символів, що скануються, неприпустиме використання «-».
  • Специфікатор %c читає кожен символ з потоку. Тобто символ-розділювач він також читає. Щоб пропустити символ роздільника та читати потрібний символ, можна використовувати “%1s”.
  • При використанні специфікатора "c" допустимо використовувати ширину "%10c", проте тоді у вигляді змінної функції scanf потрібно передати масив елементів типу char.
  • "%" - це означає "всі маленькі літери англійського алфавіту", а "%" - означає просто 3 символи: 'z', 'a', '-'. Інакше кажучи, символ «-» означає діапазон лише тому випадку, якщо стоїть між двома символами, які у правильному порядку следования. Якщо «-» знаходиться в кінці виразу, на початку або в неправильному порядку символів по обидва боки від них, то він є просто символом дефісу, а не діапазоном.

Висновок

На цьому завершується опис scanf C. Це гарна зручна функція для роботи в невеликих програмах та при використанні процедурного методу програмування. Однак головним недоліком є ​​кількість непередбачуваних помилок, які можуть виникнути при використанні scanf. Тому опис scanf C при програмуванні найкраще тримати перед очима. У великих професійних проектах використовуються потоки iostream, через те, що мають більш високорівневі можливості, краще дозволяють відловлювати і обробляти помилки, а також працювати зі значними обсягами інформації. Також слід зазначити, що опис scanf C російською доступно на мережевих багатьох джерелах, як і приклади її використання, зважаючи на вік функції. Тому за потреби завжди можна знайти відповідь на тематичних форумах.

Стандартна бібліотека C/C++ включає низку функцій для читання та запису на консолі (клавіатура та монітор). Ці функції читають та пишуть дані як простий потік символів.

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

Функція стандартного виводу printf()

Функція printf() є стандартною функцією виведення. За допомогою цієї функції можна вивести на екран монітора рядок символів, число, значення змінної...

Функція printf() має прототип у файлі stdio.h
int printf(char *керівник, ...);

У разі успіху, функція printf() повертає кількість виведених символів.

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

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

Специфікатори формату:

символ
%d ціле десяткове число
%i ціле десяткове число
%e десяткове число у вигляді x.xx e+xx
%E десяткове число у вигляді x.xx E+xx
%f
%F десяткове число з плаваючою комою xx.xxxx
%g %f або %e, що коротше
%G %F або %E, що коротше
%o вісімкове число
%s рядок символів
%u беззнакове десяткове число
%x шістнадцяткове число
%X шістнадцяткове число
%% символ %
%p покажчик
%n покажчик

Крім того, до команд формату можуть бути застосовані модифікатори l та h.

%ld друк long int
%hu друк short unsigned
%Lf друк long double

У специфікаторі формату після символу % може бути вказана точність (число цифр після коми). Точність задається так: %.n<код формата>. Де n – число цифр після коми, а<код формата>- один із кодів наведених вище.

Наприклад, якщо у нас є змінна x=10.3563 типу float і ми хочемо вивести її значення з точністю до 3 цифр після коми, то ми повинні написати:

printf("Змінна x = %. 3f", x);

Результат:
Змінна x = 10.356

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

Наприклад, якщо ви напишіть:

printf("%5d",20);

то результат буде наступним:
20

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

Наприклад:

printf("%05d",20);

Результат:
00020

Крім специфікаторів формату даних у рядку, що управляє, можуть знаходитися управляючі символи:

\b BS, забій
\f Нова сторінка, переклад сторінки
\n Новий рядок, переклад рядка
\r Повернення каретки
\t Горизонтальна табуляція
\v Вертикальна табуляція
\" Подвійна лапка
\" Апостроф
\\ Зворотня коса риса
\0 Нульовий символ, нульовий байт
\a Сигнал
\N Вісімкова константа
\xN Шістнадцяткова константа
\? Знак питання

Найчастіше ви використовуватимете символ \n. За допомогою цього символу керування ви зможете переходити на новий рядок. Подивіться приклади програм і ви все зрозумієте.

приклади програм.

/* Приклад 1 */
#include

void main(void)
{
int a, b, c; // Оголошення змінних a, b, c
a=5;
b = 6;
c=9;
printf("a=%d, b=%d, c=%d",a,b,c);
}

Результат роботи програми:
a=5, b=6, c=9

/* Приклад 2 */
#include

void main(void)
{
float x, y, z;

X = 10.5;
y=130.67;
z=54;

Printf("Координати об'єкта: x:%.2f, y:%.2f, z:%.2f", x, y, z);
}

Результат роботи програми:
Координати об'єкта: x:10.50, y:130.67, z:54.00

/* Приклад 3 */
#include

void main()
{
int x;

X = 5;
printf("x=%d", x*2);
}

Результат роботи програми:
x=10

/* Приклад 4 */
#include

void main(void)
{
printf("Текст в лапках");
printf("\nЗміст кисню: 100%");
}

Результат роботи програми:
"Текст у лапках"
Вміст кисню: 100%

/* Приклад 5 */
#include

void main(void)
{
int a;

A=11; // 11 в десятковій і b в шістнадцятковій
printf("a-dec=%d, a-hex=%X",a,a);
}

Результат роботи програми:
a-dec=11, a-hex=b

/* Приклад 6 */
#include

void main(void)
{
char ch1, ch2, ch3;

Ch1 = "A";
ch2 = "B";
ch3="C";

Printf("%c%c",ch1,ch2,ch3);
}

Результат роботи програми:
ABC

/* Приклад 7 */
#include

void main(void)
{
char *str="Мій рядок.";

Printf("Це %s",str);
}

Результат роботи програми:
Це Мій рядок.

/* Приклад 8 */
#include

void main(void)
{
printf("Доброго дня!\n"); // Після друку буде перехід на новий рядок - \n
printf("Мене звуть Павло"); // Це буде надруковано на новому рядку
}

Результат роботи програми:
Вітаю!
Мене звати Павел.

Функція стандартного введення scanf()

Функція scanf() – функція форматованого введення. З її допомогою можна вводити дані зі стандартного пристрою введення (клавіатури). Введеними даними можуть бути цілі числа, числа з плаваючою комою, символи, рядки та покажчики.

Функція scanf() має наступний прототип у файлі stdio.h:
int scanf(char *керуючий рядок);

Функція повертає кількість змінних, яким було присвоєно значення.

Керуючий рядок містить три види символів: специфікатори формату, пробіли та інші символи. Специфікатори формату починаються із символу %.

Специфікатори формату:

При введенні рядка за допомогою функції scanf() (специфікатор формату %s), рядок вводиться до першого пробілу!! тобто. якщо ви вводите рядок "Привіт мир!" з використанням функції scanf()


scanf("%s",str);

то після введення результуючий рядок, який зберігатиметься в масиві str складатиметься з одного слова "Привіт". ФУНКЦІЯ Вводить РЯДОК ДО ПЕРШОГО ПРОБІЛУ! Якщо ви хочете вводити рядки з пробілами, використовуйте функцію

char * gets (char * buf);

За допомогою функції gets() ви зможете вводити повноцінні рядки. Функція gets() читає символи з клавіатури до появи нового рядка (\n). Сам символ нового рядка з'являється, коли ви натискаєте клавішу enter. Функція повертає курсор на buf. buf - буфер (пам'ять) для рядка, що вводиться.

Хоча gets() не входить у тему цієї статті, але все ж таки напишемо приклад програми, яка дозволяє ввести цілий рядок з клавіатури та вивести її на екран.

#include

void main(void)
{
char buffer; // масив (буфер) для рядка, що вводиться

Gets(buffer); // вводимо рядок і натискаємо enter
printf("%s",buffer); // Виведення введеного рядка на екран
}

Ще одне важливе зауваження! Для введення даних за допомогою функції scanf() їй як параметри потрібно передавати адреси змінних, а не самі змінні. Щоб отримати адресу змінної, необхідно поставити перед іменем змінної знак &(амперсанд). Знак & означає взяття адреси.

Що означає адреса? Спробую пояснити. У програмі ми маємо змінну. Змінна зберігає значення у пам'яті комп'ютера. Так ось адресу, яку ми отримуємо за допомогою & це адреса в пам'яті комп'ютера, де зберігається значення змінної.

Давайте розглянемо приклад програми, який показує нам як використовувати &

#include

void main(void)
{
int x;

Printf("Введіть змінну x:");
scanf("%d",&x);
printf("Змінна x=%d",x);
}

Тепер давайте повернемося до рядка функції scanf(). Ще раз:

int scanf(char *керуючий рядок);

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

Розділювачами між двома цифрами, що вводяться, є символи пробілу, табуляції або нового рядка. Знак * після % та перед кодом формату (специфікатором формату) дає команду прочитати дані зазначеного типу, але не надавати це значення.

Наприклад:

scanf("%d%*c%d",&i,&j);

при введенні 50+20 надасть змінної i значення 50, змінної j - значення 20, а символ буде прочитаний і проігнорований.

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

Наприклад:

scanf("%5s",str);

вказує на необхідність прочитати з потоку введення перші 5 символів. При введенні 1234567890ABC масив str міститиме лише 12345, інші символи будуть проігноровані. Розділювачі: пробіл, символ табуляції та символ нового рядка – при введенні символу сприймаються, як і всі інші символи.

Якщо в рядку, що управляє, зустрічаються будь-які інші символи, то вони призначаються для того, щоб визначити і пропустити відповідний символ. Потік символів 10plus20 оператором

scanf("%dplus%d",&x,&y);

надасть змінної x значення 10, змінної y - значення 20, а символи plus пропустить, оскільки вони зустрілися в рядку, що управляє.

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

#include

void main(void)
{
char str1, str2;
scanf("%%s", str1, str2);
printf("\n%s\n%s",str1,str2);
}
Введемо набір символів:
12345abcdefg456

На екрані програма видасть:
12345
abcdefg456

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

scanf("%10", str1);

Можна також визначити символи, які не входять до пошуку. Перед першим із цих символів ставиться знак ^. Безліч символів розрізняє малі та великі літери.

Нагадаю, що при використанні функції scanf(), їй як параметри потрібно передавати адреси змінних. Вище було написано код:

char str; // масив на 80 символів
scanf("%s",str);

Зверніть увагу, що перед str не стоїть символ &. Це зроблено тому, що str є масивом, а ім'я масиву - str є вказівником першого елемента масиву. Тому знак & не ставиться. Ми вже передаємо функції scanf() адресу. Ну простіше кажучи str це адреса в пам'яті комп'ютера де зберігатиметься значення першого елемента масиву.

приклади програм.

приклад 1.
Ця програма виводить на екран запит "Скільки вам років?:" і чекає на введення даних. Якщо, наприклад, ввести число 20, програма виведе рядок "Вам 20 років.". При виклику функції scanf(), перед змінною age ми поставили знак &, оскільки функції scanf() потрібні адреси змінних. Функція scanf() запише введене значення за вказаною адресою. У нашому випадку введене значення 20 буде записано на адресу змінної age.

/* Приклад 1 */

#include

void main(void)
{
int age;

Printf("\nСкільки вам років?:");
scanf("%d",&age);
printf("Вам %d років.", age);
}

приклад 2.
Програма калькулятор. Цей калькулятор може лише складати числа. При введенні 100+34 програма видасть результат: 100+34=134.

/* Приклад 2 */

#include

void main(void)
{
int x, y;

Printf("\nКалькулятор:");
scanf("%d+%d", &x, &y);
printf("\n%d+%d=%d", x, y, x+y);
}

приклад 3.
Цей приклад показує, як встановити ширину поля зчитування. У прикладі ширина поля дорівнює п'яти символам. Якщо ви введете рядок з великою кількістю символів, всі символи після 5-го будуть відкинуті. Зверніть увагу на виклик функції scanf(). Знак & не стоїть перед ім'ям масиву name, оскільки ім'я масиву name є адресою першого елемента масиву.

/* Приклад 3 */

#include

void main(void)
{
char name;

Printf("\nВведіть ваш логін (не більше 5 символів):");
scanf("%5s", name);
printf("\nВи ввели %s", name);
}

приклад 4.
Останній приклад у цій статті показує, як можна використовувати безліч пошуку. Після запуску введіть число від 2 до 5.

/* Приклад 4 */

#include

void main(void)
{
char bal;

Printf("Ваша оцінка 2,3,4,5:");
scanf("%", &bal);
printf("\nОцінка %c", bal);
}

C++ (читається сі-плюс-плюс) - компілюється, статично типізована мова програмування загального призначення, якою можна створювати програми будь-якого рівня складності.
Понад 20 років ця мова знаходиться в трійці найпопулярніших мов програмування. (У цьому можна переконатись, відвідавши сайт TIOBE).
Мова виникла на початку 1980-х років, коли співробітник фірми Bell Labs Бйорн Страуструп вигадав низку удосконалень до мови C під власні потреби.

Bjarne Stroustrup – творець мови C++

Страуструп вирішив доповнити мову C можливостями, що є у мові Симула. Мова C, будучи базовою мовою системи UNIX, на якій працювали комп'ютери Bell, є швидкою, багатофункціональною та переносимою. Страуструп додав до нього можливість роботи з класами та об'єктами. В результаті практичні завдання моделювання виявилися доступними для вирішення як з точки зору часу розробки (завдяки використанню Симула-подібних класів), так і з точки зору часу обчислень (завдяки швидкодії C).
Ось як про це говорить сам розробник мови:



У 1998 році був опублікований перший стандарт мови, відомий як C++98, розроблений комітетом зі стандартизації. C++ продовжує розвиватись, щоб відповідати сучасним вимогам. Одна з груп, що розробляють мову C++ та направляють комітету зі стандартизації C++ пропозиції щодо її покращення - це Boost, яка займається, у тому числі, удосконаленням можливостей мови шляхом додавання до неї особливостей метапрограмування. Останній стандарт вийшов у 2017 році та носить найменування С++17. Наступний стандарт не змусить на себе довго чекати і з'явиться, як очікують, у 2020 році.
Ніхто не має прав на мову C++, він є вільним. У березні 2016 року в Росії було створено робочу групу РГ21 С++. Група була організована для збору пропозицій до стандарту C++, надсилання їх до комітету та захисту на загальних зборах Міжнародної організації зі стандартизації.
С++ - це мультипарадигмальний мову (від слова парадигма - стиль написання комп'ютерних програм), що включає широкий спектр різних стилів та технологій програмування. Часто його зараховують до об'єктно-орієнтованих мов, але, власне кажучи, це не так. У процесі роботи розробник отримує абсолютну свободу у виборі інструментів для того, щоб завдання, яке вирішується за допомогою того чи іншого підходу, було вирішено максимально ефективно. Інакше кажучи, С++ не змушує програміста дотримуватися лише одного стилю розробки програми (наприклад, объектно-ориентированного).
C++ має багату стандартну бібліотеку, яка включає поширені контейнери і алгоритми, введення-виведення, регулярні висловлювання, підтримку багатопоточності та інші можливості. C++ вплинув на багато мов програмування, в тому числі: Java, C#, D. Оскільки C++ належить сімейству мов заснованих на синтаксисі мови Сі, то можна легко освоїти й інші мови програмування цієї родини: JavaScript, PHP, Perl, Objective-C та багато інших. . ін, у тому числі, і сама батьківська мова – Сі. ()
За час існування за мовою С++ закріпилися стійкі міфи, які легко спростовуються (див. тут: Частина1 і Частина2)

Історія мови та виходу стандартів

1983

Творець мови – Бйорн Страуструп, Співробітник Bell Labs, представив ранню версію мови C++ ("Сі з класами")

1985

Перший комерційний випуск C++, мова набуває сучасну назву

1986

Видання першого видання The C++ Programming Language - книги, присвяченої C++, яку написав Бйорн Страуструп

1998

Ратифіковано міжнародний стандарт мови C++: ISO/IEC 14882:1998 "Standard for the C++ Programming Language"

2003
2005

Випущено звіт Library Technical Report 1 (TR1). Не будучи офіційно частиною стандарту, звіт описував розширення стандартної бібліотеки, які мають бути включені до наступної версії мови C++

2011

Вихід нового стандарту – C++11 чи ISO/IEC 14882:2011; новий стандарт включив доповнення в ядрі мови та розширення стандартної бібліотеки, у тому числі більшу частину TR1

2014

Вихід стандарту C++14 (International Standard ISO/IEC 14882:2014(E) Programming Language C++); C++14 можна розглядати як невелике розширення над C++11, що містить в основному виправлення помилок та невеликі покращення

2017

Вихід нового стандарту – C++1z (C++17). Цей стандарт вніс багато змін та доповнень. Наприклад, до складу STD увійшли бібліотеки стандарту C11, файлової системи, заснована на boost::filesystem, більшість експериментальної бібліотеки TS I.

2020

C++20 - неофіційна назва стандарту ISO/IEC мови програмування C++, який очікується після C++17. Чернетка стандарту N4800.

Філософія С++

У книзі «Дизайн та еволюція C++» (2007) Бйорн Страуструп описує принципи, яких він дотримувався при проектуванні C++ (наводяться у скороченні):

  • Отримати універсальну мову зі статичними типами даних, ефективністю та переносимістю мови C.
  • Безпосередньо та всебічно підтримувати безліч стилів програмування.
  • Дати програмісту свободу вибору, навіть якщо це дасть можливість вибирати неправильно.
  • Максимально зберегти сумісність із C, тим самим уможливлюючи легкий перехід від програмування на C.
  • Уникнути різночитань між C і C++: будь-яка конструкція, допустима в обох мовах, повинна в кожному з них позначати те саме і призводити до однієї і тієї ж поведінки програми.
  • Уникати особливостей, які залежать від платформи чи не є універсальними.
  • "Не платити за те, що не використовується" - ніякий мовний засіб не повинен призводити до зниження продуктивності програм, що не використовують його.
  • Не вимагати надто ускладненого середовища програмування.

C та C++

Синтаксис C++ успадкований від мови C. Хоча, формально, однією з принципів C++ залишається збереження сумісності з мовою C, фактично групи зі стандартизації цих мов не взаємодіють, а внесені ними як не корелюють, а й нерідко принципово суперечать одне одному ідеологічно. Так, елементи, які нові стандарти C додають у ядро, у стандарті C++ є елементами стандартної бібліотеки та в ядрі взагалі відсутні, наприклад, динамічні масиви, масиви з фіксованими межами, засоби паралельної обробки. Як вважає Страуструп, об'єднання розробки цих двох мов принесло б велику користь, але воно навряд чи можливе з політичних міркувань. Отже, практична сумісність між C і C++ поступово втрачатиметься.
У цьому прикладі, залежно від компілятора, буде виведено або “C++”, або “C”:

Програма 9.1

#include int main() ( printf("%s\n", (sizeof("a") == sizeof(char)) ? "C++" : "C"); return 0; )

Пов'язано це про те, що символьні константи C мають тип int , а C++ - тип char , але розміри цих типів різняться.

Моделі життєвого циклу програми

Життєвий циклПрограмне забезпечення - це період часу, який починається з моменту прийняття рішення про необхідність створення програмного продукту і закінчується в момент його повного вилучення з експлуатації. Цей цикл - процес побудови та розвитку програмного забезпечення (ПЗ). Існує декілька моделей життєвого циклу.
Каскадна модельжиттєвого циклу (англ. waterfall model) було запропоновано 1970 р. Уинстоном Ройсом. Вона передбачає послідовне виконання всіх етапів проекту у строго фіксованому порядку. Перехід на наступний етап означає повне завершення робіт на попередньому етапі. Вимоги, визначені на стадії формування вимог, суворо документуються як технічного завдання і фіксуються весь час розробки проекту. Кожна стадія завершується випуском повного комплекту документації, достатньої для того, щоб технологія могла бути продовжена іншою командою розробників.
Етапи проекту відповідно до каскадної моделі:

  1. формування вимог;
  2. Проектування;
  3. Реалізація;
  4. Тестування;
  5. Впровадження;
  6. Експлуатація та супровід.

У каскадної моделі перехід від однієї фази проекту до іншої передбачає повну коректність результату попередньої фази. У великих проектах цього досягти практично неможливо. Тому така модель придатна лише розробки невеликого проекту. (Сам У. Ройс не дотримувався цієї моделі і використовував ітераційну модель).
Ітераційна модель
Альтернативою каскадної моделі є модель ітеративної та інкрементальної розробки (англ. iterative and incremental development, IID), що отримала від Т. Гілба у 70-ті роки. назва еволюційної моделі Модель IID передбачає розбиття життєвого циклу проекту на послідовність ітерацій, кожна з яких нагадує «міні-проект», включаючи всі процеси розробки щодо створення менших фрагментів функціональності, в порівнянні з проектом в цілому. Мета кожної ітерації - отримання працюючої версії програмної системи, що включає функціональність, визначену інтегрованим змістом усіх попередніх та поточної ітерації. Результат фінальної ітерації містить усю необхідну функціональність продукту. Таким чином, із завершенням кожної ітерації продукт отримує приріст - інкремент - до його можливостей, які, отже, розвиваються еволюційно.


Різні варіанти ітераційного підходу реалізовані у більшості сучасних методологій розробки:

Процес розробки - Rational Unified Process (RUP)

Rational Unified Process (RUP)(Раціональний уніфікований процес) – методологія розробки програмного забезпечення, яка підтримується компанією Rational Software (IBM). У методології даються рекомендації з усіх етапів розробки: від моделювання бізнесу до тестування та здачі в експлуатацію готової програми. В якості мови моделювання використовується мова Unified Modelling Language (UML).
Повний життєвий цикл розробки продукту складається з чотирьох фаз, кожна з яких включає одну або кілька ітерацій.

  • Початкова стадія (Inception)
  • Визначення масштабів проекту та обсягу необхідних ресурсів. Визначаються основні вимоги, обмеження та ключова функціональність продукту. Оцінюються ризики. Планування процесів. При завершенні початкової фази оцінюється досягнення етапу життєвого циклу мети (англ. Lifecycle Objective Milestone), яке передбачає угоду зацікавлених сторін про продовження проекту.

  • Уточнення (Elaboration)
  • Документування вимог. Проектування, реалізація та тестування архітектури, що виконується. Уточнення термінів та вартості. Зниження основних ризиків. Успішне виконання фази розробки означає досягнення етапу життєвого циклу архітектури (Lifecycle Architecture Milestone).

  • Побудова (Construction)
  • У фазі «Побудова» відбувається реалізація більшої частини функціональності продукту: додаток завершено, вихідний код написаний. Фаза Побудова завершується першим зовнішнім релізом системи та віхою початкової функціональної готовності (Initial Operational Capability).

  • Впровадження (Transition)
  • У фазі "Впровадження" створюється фінальна версія продукту і передається від розробника до замовника. Це включає програму бета-тестування, навчання користувачів, а також визначення якості продукту. У випадку, якщо якість не відповідає очікуванням користувачів або критеріям, встановленим у фазі Початок, фаза Впровадження повторюється знову. Виконання всіх цілей означає досягнення віхи готового продукту (Product Release) та завершення повного циклу розробки.



"Інформаційна технологія. Системна та програмна інженерія. Процеси життєвого циклу програмних засобів». Цей стандарт прийнятий Федеральним агентством з технічного регулювання та метрології РФ та аналогічний міжнародному стандарту ISO/IEC 12207:2008. Цей стандарт, встановлює загальну структуру процесів життєвого циклу програмних засобів, яку можна орієнтуватися у програмній промисловості. Стандарт не пропонує конкретної моделі життєвого циклу. Його положення є спільними для будь-яких моделей життєвого циклу, методів та технологій створення ПЗ. Він описує структуру процесів життєвого циклу, не конкретизуючи, як реалізувати чи виконати дії та завдання, включені до цих процесів.

Презентація до уроку
Теми повідомлень
  • Фонд вільного програмного забезпечення (FSF)
  • Вільні ліцензії ПЗ
  • FreeSoftware та Open Source
  • Історія розвитку мов програмування
  • Історія виникнення мови C. C та C++
  • Історія
  • Критика C++
  • Історія UNIX
  • Спіральна модель життєвого циклу ПЗ
  • UML (англ. Unified Modeling Language – уніфікована мова моделювання)
  • Microsoft Solutions Framework
  • IDE для програмування на C/C++ у Windows
  • Компілятори C/C++
  • Створення консольної програми у Windows
Запитання
  1. Чому каскадна модель розробки програмного забезпечення не застосовується у великих проектах?
  2. У чому різниця між каскадною та ітераційною моделями розробки?
  3. Перерахуйте стадії розробки програмного забезпечення в методології Rational Unified Process (RUP)
Роутери