Перший параметр є символьним рядком, що задає
специфікації формату (див. функцію printf()). Інші параметри -
перерахування адрес змінних, у які вводяться дані. У цьому списку перед іменами
всіх перемінних, крім тих, котрі вводяться по специфікації типу % s,
повинний стояти символ &.
Операція% - операція взяття модуля
використовується в цілочисельні арифметиці. Її результатом являється залишок
від ділення цілого числа, яке стоїть зліва від знака операції на число, яке
розташоване справа від нього.
Всі вони мають однаковий пріоритет. Рівно на одну
ступінь нижче пріоритет операторів зрівнювання на рівність: = =,! =
Логічні операції та операції відношення
обчислюються зліва направо та обчислюються як тільки стає відомим істинність
результату.
1)
крім операцій пересилки значення операцій присвоювання має ще і
значення рівне результату присвоювання. Це значить, що можна записувати
декілька операцій присвоювання, тобто а = в = с=3
2)
натискання комбінованих операцій присвоювання і =і+2, тобто і + =
2 до старшого значення «+» та зробити новим значенням.
Вираз 1 операція = вираз 2; (вир. 1) = (вир. 1)
опер. (вир. 2) з тієї різниці, що вираз 1 обчислюється один раз.
В мові С операції з високими пріоритетами
обчислюються першими. Самим вищим пріоритетом являється пріоритет, який
дорівнює 1. Пріоритети та порядок операцій наведені в таблиці 1.2
Пріоритет
|
Знак
операції
|
Типи
операцій
|
Порядок
виконання
|
2
|
() [].
->
|
Вираження
|
Зліва
направо
|
1
|
- ~! *
& ++ - sizeof наведення типів
|
Унарні
|
Вправо
наліво
|
3
|
* /%
|
Мультиплікаційні
|
Зліва
направо
|
4
|
+ -
|
Адитивні
|
|
5
|
<<
>>
|
Зсув
|
|
6
|
<
> <= >=
|
Відношення
|
|
7
|
==!=
|
Відношення
(рівність)
|
|
8
|
&
|
Порозрядне
І
|
|
9
|
^
|
Порозрядно
виключаюче ІЛІ
|
|
10
|
|
|
Порозрядне
ІЛІ
|
|
11
|
&&
|
Логічне
І
|
|
12
|
||
|
Логічне
ІЛІ
|
|
13
|
?:
|
Умовна
|
|
14
|
= *=
/=%= += -= &= |= >>= <<= ^=
|
Просте
та складове присвоювання
|
Справа
наліво
|
15
|
,
|
Послідовне
віднімання
|
1.2
Робота з побітовими операціями
.2.1 Умова завдання.
Скласти функцію, яка зрушує вправо біти
негативних чисел на два розряди, а біти 0 і 4 позитивних чисел скидає. Елементи
фіксованого масиву знакових чисел представити в десятковому і
шістнадцятирічному форматі. Вивести результати дій на екран.
1.2.2 Опис методу рішення
Бітова операція в програмуванні - деякі операції
над ланцюжками бітів. У програмуванні, як правило, розглядаються лише деякі
види цих операцій: логічні побітові операції і бітові зрушення. Бітові операції
застосовуються в мовах програмування і цифровій техніці, вивчаються в
дискретній математиці.
До бітових операцій також відносять бітові
зрушення. При зрушенні значення бітів копіюються в сусідні по
напряму зрушення. Розрізняють декілька видів зрушень - логічного, арифметичного
і циклічного, залежно від обробки крайніх бітів. Також розрізняють
зрушення вліво (у напрямі від молодшого біта до старшого) і вправо (у напрямі
від старшого біта до молодшого).
При логічному зрушенні значення останнього
біта по напряму зрушення втрачається (копіюючись в біт перенесення), а перший
набуває нульового значення. Також розрізняють зрушення вліво (у напрямі від
молодшого біта до старшого) і вправо (у напрямі від старшого біта до
молодшого). Логічні зрушення вліво і вправо використовуються для швидкого
множення і ділення на 2, відповідно.
Мал. 1.3 - Логічне зрушення
Арифметичне зрушення аналогічне логічному, але
значення слова вважається знаковим числом, представленим в додатковому коді.
Так, при правому зрушенні старший біт зберігає своє значення. Ліве арифметичне
зрушення ідентичне логічному.
Мал. 1.4 - Арифметичне зрушення (правий)
При циклічному зрушенні, значення
останнього біта по напряму зрушення копіюється в перший біт (і копіюється в біт
перенесення).
Рис. 1.5 - Циклічне зрушення
Отже, можна прийти до висновку, ща наша функція
використовує зрушення вправо для негативних чисел, тобто ділення на 2, а 0 і 4
біти позитивних чисел скидуються.
1.2.3 Опис алгоритму програмиint massive - заданий
масив цілих типів даних с фіксованим значенням {13, 41, -513, 53, -41, 12,
-425, 52, 21} виводиться на екран користувачеві за допомогою printf, з
поміткою «Before», тобто те, що задано начально. Далі у функції worker
(int arg[]) відбувається проголошення проголошення змінної i,
яка при умові, що доки i менше довжини массиву i<sizeof(arg),
визначається знак та проводяться побітові функції до кожного значення під
номером i в масиві, який ми передали раніше. Сама функція здвигу
відображаються в программі як «>>» та «<<» в
залежності від напряму здвигу. У нашому випадку біти негативних чисел
здвигаються вправо, тобто arg[i] >> 2, біти 0 і 4 позитивних чисел
скидає, тобто arg[i]|=(0<<0)|(0<<4). Далі в printer (int
arg[]) відбувається друк результатів з поміткою «This is hex and dec values
after conversion», дані після здвигу та конвертації. За допомогою параметрів
printf:%d\n (друк у десятковому форматі), 0x % X\n (друк у
шістнадцятирічному форматі) виводяться результати перетворень та здвигів на
екран.
1.2.4 Тестування роботи програми
Так як вхідних даних, які вводить безпосередньо
користувач у програмі немає, то достатньо тільки запустити програму task1.exe
і дочекатися виводу на екран проведених операцій із масивом {13, 41, -513, 53,
-41, 12, -425, 52, 21}. Для виходу достатньо натиснути будь-яку кнопку на
клавіатурі.
Як ми бачимо на екрані, програма використовує
заданий масив та робить побітове зрушення, після чого відображає на екран результати
DEC (десяткові) та HEX (шістнадцятирічні) значення.
Рис. 1.6 - Тест task 1
1.3 Робота з функцією заміни у рядку символів
1.3.1 Умова завдання
Скласти функцію, яка замінює в рядку символів
першу букву кожного слова великою літерою, якщо вона є рядковою. Функція
відображує кількість зроблених змін на екран користувачеві.
1.3.2 Опис методу рішення
Бібліотека обробки рядків в MS Visual Studio
забезпечує багато корисних функцій для роботи із строковими даними, наприклад,
порівняння рядків, пошук в рядках символів і інших підрядків, розмітку рядків
(розподіл рядків на логічні шматки) і визначення довжини рядка.
Якщо функція повинна приймати аргументи, то в її
оголошенні слід декларувати параметри, які набудуть значень цих аргументів. Як
видно з оголошення наступної функції, оголошення параметрів стоять після імені
функції.
Функція is_in() має два параметри: s
і d. Якщо символ c входить в рядок s, то ця функція повертає 1,
інакше вона повертає 0.
Хоча параметри виконують спеціальне завдання, -
набувають значень аргументів, що передаються функції, - вони все одно
поводяться так, як і інші локальні змінні. Формальним параметрам функції,
наприклад, можна привласнювати які-небудь значення або використовувати ці
параметри в яких-небудь виразах.
Виклики за значенням і по посиланню: у мовах
програмування є два способи передачі значень підпрограмі. Перший з них - виклик
за значенням. При його застосуванні у формальний параметр підпрограми
копіюється значення аргументу. У такому разі зміни параметра на аргумент не
впливають.
Другим способом передачі аргументів підпрограмі
являється виклик по посиланню. При його застосуванні в параметр копіюється
адреса аргументу. Це означає, що, на відміну від виклику за значенням, зміни
значення параметра призводять до таких самих змін значення аргументу. За
невеликою кількістю виключень, в мові Сі для передачі аргументів
використовується виклик за значенням. Зазвичай це означає, що код, що
знаходиться усередині функції, не може змінювати значень аргументів, які
використовувалися при виклику функції.
Виклик функцій за допомогою масивів: коли в якості
аргументу функції використовується масив, то функції передається його адреса. У
цьому і полягає виключення по відношенню до правила, яке свідчить, що при
передачі параметрів використовується виклик за значенням. У разі передачі
масиву функції її внутрішній код працює з реальним вмістом цього масиву і
цілком може змінити цей вміст. Але ця программа не працює із символами
кирилиці.
.3.3 Опис алгоритму програми
Першим етапом складання програми стає оголошення
вхідних даних current за допомогою типу char, який
використовується для представлення символів з таблиці ASCII. Далі у оголошуємо
головну змінну zum_number, паралельно в second.h оголошуємо індикатор
пробелів (space_detector) та лічильник замін (count), встановлений
на 0, після чого оголошується перший символ (firstchar) у стан 1.
За допомогою модифікатору extern, який використовується для
оголошення методу із зовнішньою реалізацією, задаємо умову для заміни символів,
використовуючи змінні індикатор пробелів (space_detector) та перший
символ (firstchar). Параметр *s рівний пробелу, становить
значення індикатора пробелів (space_detector) в 1, далі якщо
індикатор пробелів та перший символ однаково знаходяться у стані 1, функція
робить заміну за такою формулою:
*s = *s + ('A' - 'a')
Після чого змінні обнуляються до 0 і програма
повертаються до лічильника замін (return count). Але все це робиться
тільки після того, коли користувач вводить дані, при умові, що всі дані -
літерні символи латиниці. За допомогою printf на екран виводиться пропозиція
ввести дані «Input text, press enter to parse». При умові, що getchar()
(функція, що повертає із стандартного потоку stdin наступний символ) рівна сurrent
(вхідним даним), число замін (zum_number) буде дорівнювати числу
виконаних замін над введенними даними. Після чого функція putchar(current),
записує символ, що міститься в молодшому байті параметра ch, в стандартний
потік виведення stdout, тобто робить заміну малої літери на велику по вище
описаній формулі з параметром *s. В завершенні програма відображає на екран
кількість зроблених замін з таким діалогом «There was N replacements», де N -
число замін.
1.3.4 Тестування роботи програми
В даній програмі присутні вхідні та вихідні дані.
Присутність вхідних даних зобов'язує користувача вводити їх. Вхідними даними
можуть бути будь-які літери латиниці. Вводити слова потрібно через пробел.
Розглянемо декілька прикладів роботи програми.
Перший приклад (рис. 1.7) наглядно показує нам
. Данні для вводу здійснені користувачем «eto
prosto zamechatelniy kursovoi».
. Преобразування введеного тексту з
заміною маленької заглавної літери на велику «Eto Prosto Zamechatelniy
Kursovoi».
. Відображення кількості зроблених замін
«There was 4 replacemnts».
Рис. 1.7 - Тест Task 2_1
Рис. 1.8 - Тест Task 2_2
Як і в першому прикладі програма робить одні і
тіж дії, підраховуючи кількість зроблених замін. Але з недоліків є те, що
початковий ввод заглавних великих літер призводить до помилки, наприклад, як у
другому прикладі у слов «and». Хоча в рамках поставленої задачі вона праціє
ісправно, і це є її головною особливістю.
2. Робота з масивами
2.1 Умова завдання
Задавши двомірний масив речових даних (матрицю
А), реалізувати його обробку, як зазначено у варіанті. Вихідні дані задати
самостійно, враховуючи специфіку завдання. У програмі повинні бути передбачені
функції введення-виведення елементів масиву А та його обробки. Задана квадратна
матриця A розміром 4 x 4, що складається з дійсних елементів.
2.2 Опис методу рішення
Двовимірний масив - це одновимірний масив,
елементами якого є одновимірні масиви. Іншими словами, це набір однотипних
даних, що має загальне ім'я, доступ до елементів якого здійснюється по двох
індексах. Наочно двовимірний масив зручно представляти у вигляді таблиці, в
якій n рядків і m стовпців, а під елементом таблиці, що стоїть в i - у рядку і
j - му стовпці розуміють деякий елемент масиву a[i] [j].
побітовий масив алгоритм програмування
Рис. 1.9 - Представлення двовимірного масиву
Дійсно, якщо розібратися з тим, що таке a[i] при
фіксованому значенні i, то побачимо, що це одновимірний масив, що складається з
m елементів, до яких можна звертатися по індексу,: a[i] [1], a[i] [2]., a[i]
[m]. Схематично це уся i - й рядок рядок таблиці. Аналогічно, якщо ми
розглянемо одновимірний масив рядків, то зможемо помітити, що це так само
двовимірний масив, де кожен окремий елемент - це символ типу char, а a[i] - це
одновимірний масив, що представляє окремий рядок початкового одновимірного
масиву рядків. Виходячи з ідеї визначення двумерного масиву можна визначити
рекурентне поняття багатовимірного масиву: n - мерный масив - це
одновимірний масив, елементами якого є (n - 1) -масиви. Нескладно здогадатися,
що 3-мірний масив візуально можна представити у вигляді куба з осередками
(схоже на кубик Рубика), де кожен елемент має вигляд a[i] [j] [k]. А ось з
великою розмірністю виникають складнощі з візуальним представленням, але математична
модель ясна.
По-іншому двовимірний масив також називають матрицею,
а у тому випадку, коли n=m (число рядків дорівнює числу стовпців) матрицю
називають квадратною. У матрицях можна зберігати будь-які табличні дані: зміст
ігрового поля (шашки, шахи, Lines і так далі), лабіринти, таблицю суміжності
графа, коефіцієнти системи лінійних рівнянь і так далі. Матриці часто
використовують для вирішення олімпіадних і математичних завдань. У завданнях
табличні дані часто визначаються у вхідному файлі таким чином: спочатку в
першому рядку вказуються значення n і m через пропуск, а далі йдуть n рядків по
m елементів в кожній, також один від одного відокремлені пропуском і вхідний
файл може мати, наприклад, наступний зміст, що зрозуміло відбиває вміст матриці
при звичайному перегляді.
Директива #define служить для заміни
констант, що часто використовуються, ключових слів, операторів або виразів
деякими ідентифікаторами. Ідентифікатори, замінюючі текстові або числові
константи, називають іменованими константами. Ідентифікатори, замінюючі
фрагменти програм, називають макровизначеннями, причому макровизначення можуть
мати аргументи.
Ця директива замінює усі наступні входження
ідентифікатора на текст. Такий процес називається макропідстановкою. Текст може
бути будь-яким фрагментом програми на З, а також може бути і відсутнім. У
останньому випадку усі екземпляри ідентифікатора видаляються з програми.
Ці директиви змінять в тексті програми кожне
слово WIDTH на число 80, а кожне слово LENGTH на вираження (80+10) разом з
дужками, що оточують його.
Дужки, що містяться в макровизначенні, дозволяють
уникнути непорозумінь, пов'язаних з порядком обчислення операцій. Наприклад, за
відсутності дужок вираження t=LENGTH*7 буде перетворено у вираження t=80+10*7,
а не у вираження t=(80+10)*7, як це виходить за наявності дужок, і в результаті
вийде 780, а не 630.
У другій синтаксичній формі в директиві #define є
список формальних параметрів, який може містити один або декілька
ідентифікаторів, розділених комами. Формальні параметри в тексті макровизначення
відмічають позиції на які мають бути підставлені фактичні аргументи
макровиклику. Кожен формальний параметр може з'явитися в тексті макровизначення
кілька разів.
При макровиклику услід за ідентифікатором
записується список фактичних аргументів, кількість яких повинна співпадати з
кількістю формальних параметрів.
Як і в попередньому прикладі, круглі дужки, в які
поміщені формальні параметри макровизначення, дозволяють уникнути помилок
пов'язаних з неправильним порядком виконання операцій, якщо фактичні аргументи
є виразами.
Для змінних, що представляють число з плаваючою
точкою використовуються наступні модификаторы-типа: float, double, long
double (у деяких реалізаціях мови long double СІ відсутній).
Величина з модификатором-типа float займає
4 байти. З них 1 байт відводиться для знаку, 8 біт для надмірної експоненти і
23 біта для мантиси. Відмітимо, що старший біт мантиси завжди дорівнює 1, тому
він не заповнюється, у зв'язку з цим діапазон значень змінної з плаваючою
точкою приблизно рівний від 3.14E-38 до 3.14E+38.
2.3 Опис алгоритму програми
За допомогою #define задається кількість
рядків і стовпців в матриці 4х4 (X_DIM 4, Y_DIM 4). Далі інформуємо
компілятор про функцію, яка буде використана за текстом раніше, ніж буде
описана, після чого стоврюється масив завдовжки X_DIM, в який потім запишеться
адреса найбільшого числа у стовпціint cur_y [X_DIM].
Слідуючим етапом стає створення двовимірного
масиву, з яким будуть проводиться операції matrix[][] і масив для
знайдених максимумів float matrix [X_DIM] [Y_DIM], found_biggest [X_DIM].Створюємо
також лічільники i, t = 0 і змінну для находження суми float summ
= 0.0f. Після чого програма виводить запит на введення даних, натякаючи на
розміри матриці в пристрій стандартного виводу, та поки дійсна умова, що i
менше Y_DIM - перемикаються рядки, а t менше X_DIM перемикаються стовпці. Потім
друкує запит на введення даних за поточною адресою в матриці в пристрій
стандартного виводу і зчитує введення за поточною адресою в матриці. Поки i
менше X_DIM (кількості стовпців) - перемикає стовпці від 0 до X_DIM. Далі
призначає масиву для знайдених максимумів за адресою лічильника стовпців
знайдений максимум в цьому стовпці found_biggest[i]=biggest_in_column
(matrix, i, cur_y) і друкує знайдений максимум в стовпці в пристрій
стандартного виводу, вказуючи номер стовпця, само число і де в стовпці воно
було знайдене. Після чого підсумовує поточний максимум з попереднім значенням
(чи нулем, якщо це перший) summ = summ + found_biggest[i].
Під кінець програма виводить суму максимумів.
Можна використовувати і не покажчик. Наприклад
так: float biggest_in_column (float local_matrix [X_DIM] [Y_DIM], int column,
int cur_y [Y_DIM], але для масивів це не принципово. Лічильник встановлюється в
0 і потім задається поточний максимум теж як 0, що б не було помилок, інакше
при виклику змінної виникне несумісність (float current_biggest = 0.0f.
Покилічильник менше висоти стовпця, порівнює чи більше поточне значення в цьому
стовпці і в цьому рядку того, що зараз вважається максимумом і якщо так,
призначає максимуму поточне значення в цьому стовпці і в цьому рядку current_biggest=local_matrix[column]
[i].
Так само записує в якому місці знаходиться це
значення у цього стовпця cur_y[column]=i і після чого повертає максимум
в стовпці return current_biggest.
2.4 Тестування роботи програми
В даній програмі присутні вхідні та вихідні дані.
Присутність вхідних даних зобов'язує користувача вводити їх. Вхідними даними
можуть бути будь-які числа, навіть дробові. Вводити числа потрібно по черзі по
кожній координаті при діалозі, з’являється із запитом. Заповнивши числами матрицю,
програма оброблює та показує координати найбільших чисел у стовпцях, після чого
сумує ці числа і виводить на екран. Розглянемо декілька прикладів роботи
програми.
Перший приклад (рис. 1.7) наглядно показує нам
. Данні для вводу здійснені користувачем «7,
-1, -2.4, 78, -56, 89, 6.7, -8.1, 7.8, 99, 65, -4, -7, 1, 2, -9».
. Знаходження координати найбільших чисел
у стовпцяхin column 0 is 7.8 at 2in column 0 is 99 at 2in column 0 is 65 at 2in
column 0 is 78 at 2
. Відображення cуми найбільших чиселis
249.8
Рис. 1.10 - Тест task3_1
Рис. 1.11 - Тест task3_2
Як і в першому прикладі програма працює ісправно
в рамках завдання.
Висновки
Отже, розробка трьох програм допомогла отримати
практичні навички в роботі з порозрядними логічними операціями та операціями
зсуву; створення функції заміни у рядку символів та роботі з одномірними та
двомірними масивами.
Розроблені програми можуть повноцінно
використатись у створенні інших проектів.
В даний час індустрія виробництва комп'ютерів та
програмного забезпечення є однією з найбільш важливих сфер економіки розвинених
країн. Щорічно у світі продаються десятки мільйонів комп'ютерів. Тільки в США
обсяг продажів комп'ютерів складає десятки мільйонів доларів і постійно
продовжує рости. У чому ж причини такого стрімкого зростання індустрії
персональних комп'ютерів та їх порівняльна вигідність для багатьох ділових
застосувань? Простота використання, забезпечена за допомогою діалогового
способу взаємодії з комп'ютером.
Відносно високі можливості з переробки
інформації, наявність програмного забезпечення, а також потужних систем для
розробки нового програмного забезпечення.+ + - модульна статично універсальна
мова програмування загального призначення. Підтримує різні парадигми
програмування, але, в порівнянні з його попередником - мовою Сі, - найбільшу
увагу приділено підтримці об'єктно-орієнтованого і узагальненого програмування.
Назва
«C + +» походить від Сі (C), в якому унарний
оператор ++ позначає інкремент змінної. У 1990-х роках стала однією з найбільш
широко застосовуваних мов програмування загального призначення.
При створенні C ++ прагнули зберегти сумісність з
мовою Сі. Більшість програм на С справно працюватимуть і з компілятором C + +.
Крім цього, С + + успішно використовується як у
багатьох додатках, так і в потужних операційних системах.
Visual C++ 2010 надає потужне і гнучке
середовище розробки, що дозволяє створювати застосування для Microsoft Windows
і застосування, засновані на Microsoft.NET. Це середовище можна використовувати
як інтегроване середовище розробки, так і в якості окремих засобів.
Список джерел
1. Страуструп Б. «Язык программирования С++».
. Шилдт Г. «Искусство программирования на C++».
. wikipedia.com
. msdn.microsoft.com