Смекни!
smekni.com

Алгебра логіки як розділ математики (стр. 4 из 6)

Навести повний текст програм з поясненнями.

Лабораторна робота № 4

РЕАЛІЗАЦІЯ АЛГОРИТМІВ З РОЗГАЛУЖЕННЯМИ В С++

Теоретична частина

Базова структура „розгалуження" забезпечує вибір одного з альтернативних шляхів алгоритму в залежності від перевірки деякої умови. Кожен зі шляхів веде до загального виходу незалежно від того, який шлях було обрано. Структура розгалуження реалізується в наступних варіантах:

1. ЯКЩО - ТО

У С++ така структура реалізується з допомогою інструкції If

if (умова)

вираз або

if (умова) {. Вираз 1; вираз 2;

.

вираз n;)

БЛОК-СХЕМА:

2. ЯКЩО - ТО - ІНАКШЕ

If/else

if (умова)

вираз1; else

вираз2;

вкладені конструкції

if (умова1) <

if (умова2)

вираз2;

>

else

вираз1;

При позитивному результаті перевірки вибирається для виконання оператор, що безпосередньо йде за умовою, при негативному - оператор, що йде за символом else. Тобто, якщо перевірка умови дає результат true, то виконується вираз 1, в іншому випадку-вираз 2.

БЛОК-СХЕМА:

У програмах нерідко трапляється, що вибір дії залежить від результату декількох наступних перевірок - до першої, що завершилася успішно.

Приклад:

char ZNAC;

int x,y,z;

if (ZNAC == '-') x = y - z;

else if (ZNAC == '+') x = y + z;

else if (ZNAC == '*') x = y * z;

else if (ZNAC == '/') x = y / z;

3. ВИБІР

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

< оператор вибору>:: =

case <вираз> of

послідовність гілок>

endcase

<послідовність гілок >:: = <гілка>| <послідовність гілок >; < гілка >

< гілка >:: = <мітка>: <оператор> [<мітка>: < гілка >

<мітка>:: = <позначення значення>

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

БЛОК-СХЕМА

Синтаксис на С++

switch (цілочисельний вираз) {

case константа1:

вираз 1;

break;

саsе константа2:

вираз 2;

break;

case константа-n:

вираз n;

break;

default:

дія за замовчуванням; }

Приклад

#include <stdio. h>

#include <string. h>

#include <math. h>

int main (void)

{

char ch;

float x,y;

x=0.5;

printf ("1 ");

printf ("2 ");

printf ("3 ");

printf (" Enter your choice: ");

do {

ch = getchar (); /* read the selection from

the keyboard */

switch (ch) {

case '1':

y=sin (x);

printf ("%f",y);

break;

case '2':

y=cos (x);

printf ("%f",y);

break;

case '3':

y=sin (x) /cos (x);

printf ("%f",y);

break;

}

Завдання до лабораторної роботи:

1. Скласти програму для знаходження розв’язку квадратного рівняння.

2. Визначити номер квадранта, в якому знаходиться точка з заданими координатами х, у.

3. Визначити, чи є задане число двозначним і парним.

4. Ввести з клавіатури два рядки і порівняти їх за кількістю символів.

Вимоги до оформлення звіту:

Звіт повинен містити блок схеми алгоритмів і тексти програм до всіх завдань

Лабораторна робота № 5

АЛГОРИТМИ З ЦИКЛІЧНОЮ СТРУКТУРОЮ

Теоретична частина

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

Існує кілька видів циклів.

<цикл із попередньою перевіркою>:: =

while <логічний вираз> do

<оператор>

end do

БЛОК-СХЕМА

Синтаксис в С++

· while

while (умова) {вираз1;

вираз2;

;

вираз-n; }

<цикл із перевіркою в кінці>:: =

repeat

<оператор>

until < логічний вираз >

БЛОК-СХЕМА

do{ вираз1;

вираз2;

вираз-n; }

while (умова);

<цикл із параметром>:: =

for <параметр> - <початкове значення>

step <крок>

to < граничне значення >

do <оператор>

enddo

<параметр>:: = <ідентифікатор>

БЛОК-СХЕМА

Синтаксис в С++:

for

(ініціалізуючий вираз; умовний вираз; модифікуючий вираз) {

вираз1;

вираз2;

вираз-n; }

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

1. Обчислити таблицю значень функції y=2x/ (1+sin (x/3)), якщо х змінюється в інтервалі від 1.5 до 6.5 з кроком 0.5

#include <math. h>

#include <stdio. h>

double F (double x);

int main (void)

{

double xmax=6.5,dx=0.5; xmin=1.5;

while (xmin<xmax)

{

printf (“%d&bsol;n%d”, xmin,F (xmin));

xmin+=dx;

}

return 0;

}

double F (double x)

{

return 2*x/ (1+sin (x/3));

}

2. Задати масив з 4 елементів і знайти його найменший елемент

#include <stdio. h>

int main (void)

{

double X [4];

double min;

int i;

printf (“Enter the elements”);

for (i=0; i<=4; i++)

scanf ("%d&bsol;n", &X [i]);

min=X [0];

for (i=1; i<=4; i++)

{

if (X [i] <min)

min=X [i];

}

printf (“Minimal is %d”,min)

return 0;

}

Завдання до лабораторної роботи

1. Обчислити таблицю значень функції y=0,5/ (1/x+lnx), якщо х змінюється в інтервалі від 10 до 25 з кроком 1.5 Вивести на екран значення, що знаходяться в межах 0.16-0.18

2. Задати масив з 5 елементів і знайти суму додатних елементів і добуток від’ємних

3. Задати слово і порахувати, скільки разів в нього входить літера А.

Вимоги до оформлення звіту:

Звіт повинен містити блок схеми алгоритмів і тексти програм до всіх завдань

Лабораторна робота №6

Робота з вказівниками

1. Теоретична частина

Вказівник - це змінна, в якій зберігається адреса іншого об’єкта. Якщо змінна містить адресу іншої змінної, прийнято говорити, що вона посилається на неї.

Змінна, що зберігає адресу комірки пам’яті, має бути оголошена як вказівник. Оголошення вказівника складається з імені базового типу, символу * і імені змінної. Загальна форма виглядає наступним чином:

int *p;

Базовий тип вказівника визначається базовим типом змінної, на яку він посилається.

Існує два спеціальні оператори роботи з вказівниками - це оператор розіменування вказівника * і оператор взяття адреси &. Оператор & є унарним і повертає адресу свого операнда. Наприклад, оператор присвоєння

А=&c

записує у вказівник адресу змінної с. Ця адреса відноситься до комірки пам’яті, яку займає с. Адреса і значення змінної в жоден спосіб не пов’язані.

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

Пріоритет операцій * і & вищий за пріоритет всіх арифметичних операцій, за винятком унарного мінуса.

Якщо адреса займає декілька комірок пам’яті, її адресою вважається адреса першої комірки.

Необхідно слідкувати за тим, що вказівник посилається на змінну правильного типу. Розглянемо приклад (в результат виконання програми змінній у мало бути присвоєно значення змінної х)

#include <stdio. h>

int main (void)

{

double x = 100.1, y;

int *p;

p = (int *) &x; /* Вказівник цілого типу р посилається на змінну подвійної точності

y = *p; /Оператор працює не так, як вимагалося

printf ("%f", y);. Число 100.1 не виводиться

return 0;

}

Вказівник можна присвоїти іншому вказівнику.

Приклад

#include <stdio. h>

int main (void)

{

int x;

int *p1, *p2;

p1 = &x;

p2 = p1;

printf (" %p", p2); /* Виводить адресу змінної х, не її значення */

return 0;

}

У прикладі на змінну х посилаються обидва вказівника р1 і р2.

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

До вказівників можна застосовувати операції порівняння. Як правило, це робиться тоді, коли вказівними посилаються на той самий об’єкт, наприклад, масив. Розглянемо в якості прикладу пару функцій для роботи зі стеками, в які записують і з яких зчитують цілі числа. Стек-це список, доступ до елементів якого здійснюється за принципом „першим увійшов-останнім вийшов”. Стеки використовуються в компіляторах, інтерпретаторах, програмах обробки електронних таблиць. Щоб створити стек, необхідні дві функції push () і pop ().

Функція push () заносить числа в стек, а функція рор () видобуває їх звідтам. У наведеній нижче програмі вони керуються функцією. При вводі числа з клавіатури програма заносить його в стек. Якщо користувач ввів 0, значення видобувається зі стеку. Програма припинить роботу при введенні - 1.

#include <stdio. h>

#include <stdlib. h>

#define SIZE 50

void push (int i);

int pop (void);

int *tos, *p1, stack [SIZE];

int main (void)

{

int value;

tos = stack; /* tos вказує на вершину стеку */

p1 = stack; /* Ініціалізація p1 */

do {

printf ("Enter value: ");

scanf ("%d", &value);

if (value! =0) push (value);

else printf ("value on top is %d&bsol;n", pop ());

} while (value! =-1);

return 0;

}

void push (int i)

{

p1++;

if (p1== (tos+SIZE)) {

printf ("Stack Overflow. &bsol;n");

exit (1);

}

*p1 = i;

}

int pop (void)

{

if (p1==tos) {

printf ("Stack Underflow. &bsol;n");

exit (1);

}

p1--;

return * (p1+1);

}

Як бачимо, стек реалізовано у вигляді масиву stack. Спочатку вказівними pi і tos посилаються на перший елемент стека. Потім вказівник рі починає переміщуватись по стеку, а tos зберігає значення вершини. Це дозволяє запобігти переповненню стека і звертанню до порожнього стека. Функції push () і pop () можна застосовувати відразу після ініціалізації стека. У кожній з них виконується перевірка, чи не вийшов вказівник за межі допустимого діапазону значень.