Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB_ZI.doc
Скачиваний:
5
Добавлен:
13.11.2019
Размер:
1.85 Mб
Скачать

5 Приклад виконання лабораторної роботи

Протабулювати функцію на проміжку з кроком (b-a)/k, де (a=-1, b=1, k=10). Результати обчислень вивести на екран у вигляді таблиці пар чисел і . Визначити кількість від’ємних значень функції. Якщо дані не існують, вивести про це повідомлення.

Текс програми мовою С

include <stdio.h>

#include <math.h>

double x, y, a, b, h, z;

int i, k=10, kil=0;

void main()

{

printf ("Programa Lab_5\n");

a=-1;

b=1;

k=10;

h=(b-a)/k;

for (x=a; x<=b; x=x+h)

{z=2*sin((x-7)/2.);

if (z<0)

printf("x=%lf\targument <0\n", x);

else

{

y=-log( 2*sin((x-7)/2));

if( y<0) kil=kil+1;

printf("x=%lf\ty=%lf\n", x,y);

}

}

printf("kil=%d\n", kil);

printf ("\n");

}

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

Programa Lab_5

x=-1.000000 y=-0.414494

x=-0.800000 y=-0.318841

x=-0.600000 y=-0.201892

x=-0.400000 y=-0.057960

x=-0.200000 y=0.122121

x=-0.000000 y=0.354440

x=0.200000 y=0.671225

x=0.400000 y=1.153624

x=0.600000 y=2.147735

x=0.800000 argument <0

x=1.000000 argument <0

kil=4

6 Контрольні запитання

  1. Що таке формальні і фактичні параметри?

  2. Скільки операторів return може бути в функції?

  3. Складові частини функції?.

  4. Напишіть на мові С логарифмічні і степеневі функції?

  5. Яку бібліотеку необхідно підключити при використанні математичних функцій?

  6. Як записується функція ?.

  7. Як записується функція ?.

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

Тема: Використання адресної арифметики для роботи з вказівниками

Мета роботи: Навчитись описувати і задавати вказівники; оволодіти основними способами роботи з вказівниками в C- програмах, а також визначати адреси елементів масиву з використанням адресної арифметики.

1 Короткі теоретичні відомості

1.1 Визначення вказівника. Вказівник – це змінна, яка містить адрес іншої змінної. Вказівники призначені для зберігання адрес пам'яті. Використання вказівників допомагає гнучко керувати даними в програмах..

Переваги вказівників включають:

  • Операції, які з допомогою вказівників виконуються легше і зручніше.

  • Операції, які без вказівників взагалі виконати неможливо.

Коли компілятор обробляє оператор визначення змінної, наприклад, int i=10, то в пам'яті виділяється ділянка відповідно до типу змінної (int=> 4 байти) і записує в цю ділянку значення змінної. Всі звертання до цієї змінної компілятор замінить на адресу області пам'яті, у якій зберігається ця змінна.

Програміст визначає змінні-вказівники для зберігання адресів області пам'яті. Такі змінні називаються вказівниками. Вказівник не є самостійним типом, він завжди пов'язаний з якимсь іншим типом.

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

1.2 Опис вказівників. Вказівники є числовими змінними, тому їх треба описати перед використанням. Імена вказівників повинні задовольняти тим умовам, що і інші змінні і бути унікальними. Вказівник не має самостійного типу. Тип вказівника - це тип змінної, на яку вказує вказівник.

Синтаксис опису:

Ім’я типу *ім’я вказівника

Наприклад:

int *i; double *f, *ff; char *c;

Вказівник може бути константою або змінною, а також вказувати на константу або змінну.

int i; //ціла змінна

const int ci=1; //ціла константа

int *pi; //вказівник на цілу змінну

const int *pci; //вказівник на цілу константу

Якщо модифікатор const ставиться до вказівника (тобто перебуває між ім'ям вказівника й * ), то він забороняє зміну вказівника, а якщо він перебуває ліворуч від типу (тобто ліворуч від *), то він забороняє зміну значення, на яке вказує вказівник.

Наприклад,

float *p_data, d;

/* *p_data вказівник на змінну типу float, а d звичайна змінна типу float */

1.3 Ініціалізація (задання) вказівників. Використання не заданих вказівників дає непередбачені результати і це небезпечно, хоч і можливо. Якщо вказівник не містить адреси змінної, він не приносить ніякої користі. Адреса в вказівнику сама не з’явиться, її треба там помістити з допомогою операції взяття адреси, яка позначається значком амперсанд (&). Операція поєднання & і імені змінної, перед якою він стоїть, повертає адресу даної змінної. Тому вказівник можна ініціалізувати таким оператором присвоєння.

Вказівник = &змінна;

P_data =&data.; /* присвоює адресу data вказівнику P_data*/

Після ініціалізації вказівник вказує на змінну.

Операція посилання по вказівнику (*).

Коли знак цієї операції стоїть перед іменем вказівника, така конструкція позначає змінну, на яку вказує вказівник. Тому змінна і посилання на вказівник цієї змінної є речі ідентичні.

Наприклад, оператори

printf(“%d”, data);

printf(“%d”, *p_data);

дають однаковий ефект. Ці оператори еквівалентні.

1.4 Вказівник на массив. Вказівники і масиви тісно пов’язані. Ім’я масиву без квадратних дужок є вказівником на перший елемент масиву. Якщо а ім’я масиву, то а – це адреса першого елементу масиву, тобто еквівалентне співвідношення.

&a[0] = = a

Ім’я масиву є постійним вказівником (адресною константою, яку не можна міняти, тому заборонена операція а++ або а--, якщо а – ім’я масиву), його не можна змінити і воно (ім’я) є фіксованим протягом виконання програми.

1.5 Адресна арифметика. Адресу першого елементу масиву легко одержати по його вказівнику, тобто його імені. Щоб звернутися до будь-якого елементу масиву, вказівник має одержати приріст, кратний розміру елементів масиву. Для звертання до елементів масиву з допомогою вказівників використовується адресна арифметика. Адресна арифметика проста в використанні і з її допомогою легко працювати з вказівниками. Тут використовується дві унарні операції: інкременту і декременту.

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

Якщо ptr_short є вказівником на елемент масиву типу short , то оператор

ptr_short ++;

збільшує значення ptr_short на довжину типу short (2 байти) і вказівник буде вказувати на наступний елемент масиву.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]