Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Float sum(float a, float b, float c)




{ return a+b+c; }

В цьому прикладі float – тип значення, яке повертає функція, sum – ім'я функції, за яким у круглих дужках стоїть список формальних параметрів a, b, c,а у фігурних дужках – тіло функції. В даному випадку функція знаходить суму трьох чисел і повертає результат.

Якщо функція не повертає ніякого значення, то тип її void, а оператор returnможе бути без виразу або бути відсутнім. Наприклад:

Void func1()

{printf("pi=%f\n",3.141592);}

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

ім'я_функції(список фактичних параметрів);

де список_фактичних_параметрів – це порожньо або void, або фактичні параметри (константи або раніш визначені змінні, змінні з перетворенням типу, вирази).

При звернення до функції формальні параметри змінюються на фактичні параметрив строгій відповідності до типів параметрів. Відповідність між формальними і фактичними параметрами встанов­люється по їх взаємному розташуванню в списках. Например:

Int max(int x, int y)

{if (x>y)return x;

 return y;}

Void main()

{int a=10,res1,res2; float f=55.9;

 res1=max(a,20); // res1=20

 res2=max(int(f),a+30);} // res2=55

Якщо функція визначена після функціїmain() або в іншому файлі, то до першого звернення до функції вона має бути описана. Опис функції називається прототипом. Це необхідно для перевірки компілятором відповідності типів та кількості переданих у функцію параметрів і типів повернених значень. У прототипі можна не вказу­вати імена формальних параметрів. У кінці прототипу обов'язкова крапка з комою. Приклади прототипів :

float sum(float a, float b, float c);

int max(int, int y);

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

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

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

int func1(int arr[]){..}

чи int func2(int *mass){..}

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

Доступ до елементів масиву усередині функції може здійснюватися як за допомогою індексів (arr[0], arr[i]), так і за допомогою операції розіменування покажчика (*(arr+0), *(arr+i)).

Для роботи з усіма елементами масиву необхідно знати кількість елементів в масиві. Є два способи визначення кінця масиву :

1) в якості одного з параметрів у функцію передається розмір масиву; 2) останній елемент масиву задається будь-яким унікальним значенням, яке аналізують у функції.

Приклад. Функція обчислює суму елементів масиву.

#include <stdio.h>

int sum(int N, int x[]) // N визначає кількість елементів в масиві

{int S=0;

 for(int i=0;i<N;i++)

S+=x[i];

 return S;}

Void main()

{int a[5]={1,3,5,10,2},c[3]={2,1,6}, res1,res2;

 res1=sum(5, a);

 res2=sum(3, c);

 printf("res1=%d res2=%d\n", res1,res2);} // 21 9

Приклад. Функція обчислює кількість символів в слові.

#include <stdio.h>

int len(char *c) //визначення функції

{int i=0;

 while(c[i++]!='\0'); //ознака кінця рядка символ '\0'

 return i-1; }  //довжина рядка без урахування символу '\0'

Void main()

{char *name="TERMINATOR", *str="Рядок";;

 printf("Довжина 1 рядка=%d", len(name));  // 10

 printf("Довжина 2 рядка=%d", len(str)); } // 5

Функції з параметрами за умовчанням.Це функції, що мають в специфікації формальних параметрів значення за умовчанням. При зверненні до такої функції параметри за умовчанням можна не вказу­вати. Але якщо параметр має значення за умовчанням, то всі парамет­ри, що йдуть за ним, повинні мати теж значення за умовчанням. Наприклад:

int def(int a,int b=3,int c=4)

{return a*b+c;}

Void main()

{int am=2,bm=5,cm=6,dm1,dm2,dm3;

 dm1=def(am);   // 2*3+4=10

 dm2=def(am,bm); // 2*5+4=14

 dm3=def(am,bm,cm); // 2*5+6=16

 printf("dm1=%d dm2=%d dm3=%d\n",dm1,dm2 dm3); }

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

Синтаксис визначення прототипу таких функцій :

тип ім'я(специфікація явних параметрів, …);

Остання кома необов'язкова. Три крапки повідомляють, що подаль­ший контроль відповідності кількості параметрів і їх типів при обробці виклику не треба проводити. Перехід в списку від параметра до параметра здійснюється за допомогою покажчика, тип якого є типом змінної. При збільшенні покажчика на одиницю здійснюється перехід до наступної змінної такого ж типу. У ВС++ функції із змінним числом параметрів не працюють з типами char, unsigned char, float.

У таких функціях існують два способи визначення кількості параметрів: 1) передача у функцію в списку фактичних параметрів інформації про їх кількість; 2) додавання параметра-індикатора в кінець списку фактичних параметрів.

Приклади прототипів:

double sumd(int i,double d …); // i – кількість елементів в списку

double mult(double arg, …); // аналізується значення  0.0

Передача параметрів у функцію main().В функцію main() як і в будь-яку іншу функцію можуть передаватися параметри. Для цього функцію main() варто описати у формі:

[тип] main(int argc,char **argv) {…}

чи [тип] main(int argc,char **argv, char **envp) {…}

В першому випадку функція main() буде мати доступ до слів командного рядка, а в другому ‑ ще і до рядків середовища програми, що визначає деякі особливості операційної системи, файлової системи, шляху пошуку (path) і ін.

Аргумент int argc визначає кількість слів у командному рядку.

Аргумент char **argv – покажчик на масив слів з командного рядка. Розмір цього масиву дорівнює argc. Нульове слово, на яке вказує argv[0], є специфікацією програми, що запускається на виконання.

Аргумент char **envp – покажчик на масив слів середовища програми.

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

Розпізнавання перевантажених функцій при виклику виконується тільки за сигнатурою (списком параметрів функції).

Наприклад:

int sum(int x,int y) {return x+y;}

float sum (float x, float y) {return x+y;}

int sum (int x,int y, int z) {return x+y+z;}

Void main()

{int a=2,b=5,c=6,d1,d2; float f1=1.5,f2=4.6,f3;

 d1=sum(a,b);      // 2+5=7

 d2=sum(a,b,c); // 2+5+6=13

 f3=sum(f1,f2); // 1.5+4.6=6.1

}

Шаблони функцій.Для автоматизації перевантаження функцій різного виду в С++ введені шаблони функцій. Визначається шаблон сімейства функцій так:

template <class type1,class type 2, і т.д.>

де type1, type2 і т.д. – формальні параметри шаблона, якими можна позначати тип функції, типи формальних та локальних параметрів в визначенні функції.

Наприклад:

template <class T>

T max(T x, T y)

{if(x>y) return x; return y; }

Void main()

{int a1=-20,a2=10,a3; float f1=-10.5,f2=-45.8,f3;

 a3=max(a1,a2); // Tприймає значенняint

 f3=max(f1,f2); // Tприймає значенняfloat

}

Параметри шаблонів мають наступні властивості:

1. Імена параметрів шаблону повинні бути унікальними;

2. Список параметрів шаблону не може бути порожнім;

3. Оголошення кожного параметра повинне починатися із слова class;

4. Ім'я параметра шаблону має властивості і права типу, область видимості усе визначення функції;

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

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

Функції обміну з файлами працюють в двох режимах: текстовому і двійковому. За замовченням встановлюється текстовий режим. В текстовому режимі при запису в файл символ '\n' перетворюється в два символи '\n' та '\0', а при читанні з файлу такі символи вже сприймаються як два символи '\n' и '\0'. Крім тогонатисканняклавішCtrl+Z (кінець введення рядка) сприймається як символ '\0', який не записується в файл. При обміні з файлом в двійковому режимі ніяких перетворень символів не виконується.

В файлах<fcntl.h>, <stdlib.h>описана спеціальна змінна _fmode,може приймати значення O_BINARY та O_TEXT.

Для кожного файлу, відкритого для доступу через потік, ство­рюється структурна змінна за шаблоном FILE, що визначена у файлі <stdio.h>. У цій структурі зберігаються різні атрибути і прапори відкритого файлу. Після закриття файлу ця змінна вилучається.

Відкриття і закриття файлу.Для відкриття файлу використо­вується функція fopen(), що повертає покажчик на змінну типу FILE, якщо файл успішно відкритий, або NULL-покажчик, якщо файл не відкрився. Прототип функції має вигляд

FILE *fopen(const char *filename, const char *mode);

де filename – покажчик на рядок, що задає шлях та ім'я файлу, якщо шлях не задано, то вибирається поточний диск, директорій;

mode – покажчик на рядок символів, що задають режим відкриття.

Деякі комбінації цих символів приведені нижче:

r – потік відкривається для читання з існуючого файлу,

r+– потік відкривається для читання і запису в існуючий файл;

w – потік відкривається тільки для запису у файл,

w+ –потік відкривається для запису у файл і для читання з файлу.Якщо файлу немає, він створюється, якщо файл існує, його старий вміст пропадає;

a – потік відкривається для запису даних в кінець (для додавання) файлу,

a+ – потік відкривається для додавання в файл і для читання з файлу. Якщо файл не існує, він створюється;

t – потік відкривається в текстовому режимі, задається після r, w, a;

b – потік відкривається в двійковому режимі, задається післяr, w, a.

Закриття файлу виконує функція fclose(), що має прототип

int fclose(FILE *fp);

Функція закриває потік введення-виведення, на який указує fp. При успішному закритті файлу функція повертає 0, інакше – EOF.

Наприклад:

FILE *fp=fopen("D:\\User\\myfile.txt","w");

if(fp==NULL){puts("помилка відкриття файлу");return -1;}

...

fclose(fp);

Функції введення-виводу в файл.Нижче приводяться функції введення в файл та виведення з файлу, які найчастіше застосовуються.

Функція символьного запису в файл

int fputc(int ch, FILE *fp); //прототип

Функція у випадку успіху записує у відкритий файл символ ch після його перетворення в тип char, інакше –EOF.Наприклад:

char c1 ='A';

fputc(c1,fp);

Функція символьного читання з файлу

int fgetc(FILE *fp); //прототип

Функція при успіху повертає прочитаний символ після його перетво­рення в intбез врахування знаку. У випадку помилки чи досягнення кінця файлу повертається EOF.Наприклад:

char c2= fgetc(fp);

putch(c2); //виведення на екран

Функція рядкового запису в файл

int *fputs(char *s, FILE *fp) ; //прототип

Функція переносить байти символів з рядка, на який вказує s. Перенесення закінчується при досягненні символу кінця рядка '\0', який в файл не записується. У випадку успіху повертає код останнього записаного у файл символу рядка, інакше –EOF.Наприклад:

char string[20]="Програмування";

fputs(string,fp);

Функція рядкового читання з файлу

char *fgets(char *str, int N, FILE *fp); //прототип

Функція приймає байти з відкритого файлу і розміщає їх за адресою, що задана покажчиком str. Прийом символів закінчується після передачі N байт чи при одержанні символу '\n'. У випадку успіху повертає покажчик на прочитаний рядок символів, інакше – NULL.Під зчитаний рядок треба зарезервувати пам'ять. Наприклад:

char str[21];

fgets(str,21,fp);

puts(str); //виведення на екран

Функція форматованого введення в файл

int fprintf(FILE *fp, char *format[,arg]…); //прототип

Функція виконує записує значення змінних з перетворенням за вказаним форматом у відкритий файл. У випадку успіху повертає записанене число байтів, інакше – повертає EOF.Наприклад:

int d=7; float f=3.5; char g=’B’;

fprintf (fin,"%d %f %c",d,f,g);

Функція форматованого читання з файлу

int fscanf(FILE *fp,char *format[,pointer]…); //прототип

Функція виконує читання значень змінних з перетворенням за вказаним форматом з відкритого файлу. У випадку успіху повертає число успішно оброблених при читанні полів, інакше – повертає EOF. Наприклад:

int a; float b; char c;

fscanf(fp,"%d %f %c",&a,&b,&c);

printf("%d %f %c\n",a,b,с); //виведення на екран

Функція блокового запису в файл

int fwrite(void *ptr,int size,int n,FILE* fp); //прототип

Функція виконує запис у відкритий файлn блоків, розміром size байт кожен. У випадку успіху повертає введене число блоків, інакше – повертає EOF. Наприклад: 

struct REC{int a; float b[2];};

REC st1={1,2,3.3};

fwrite(&str1,sizeof(REC),1,fp); //запис в файл структури

REC st2[3]={{10,20,1.5},{30,40,2.5},{50,60,3.5}};

fwrite(st2,sizeof(REC),3, fp); //запис в файл масиву структур

Функція блокового читання з файлу

int fread(void *ptr,int size,int N,FILE *fp); //прототип

Функція виконує читання з відкритого файлуN блоків, розміром size байт кожен. У випадку успіху повертає виведене число блоків, інакше – повертає EOF.Наприклад:

REC st3, st4[3];

fread(&st3,sizeof(REC),1,fp); //читання з файлу структури

fread(st4,sizeof(REC),3,fp); //читання з файлу масиву структур

//виведення на екран зчитаних структури та масиву структур

printf("%d %d %.2f\n",st3.a[0],st.a[1],st.b);

for(int i=0;i<3;i++)

printf("%d %d %.2f\n",st3[i].a[0],st3[i].a[1],st3[i].b);

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

Найпростіший спосіб збирання файлів у єдину програму, це створити програму з декількох файлів, використовуючи препросе­сорную директиву #include, за допомогою якої в файл з головною функцією підключаються усі необхідні файли.

При об'єднанні декількох файлів в один проект слід пам’ятати:

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

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

Для збирання файлів у єдину програму в BC++ v3.1 існує метод багатофайлової компіляції і компоновки, що полягає в створенні багатофайлового проекту.

Для збирання файлів у єдину програму в середовищі програмування Borland C++ v3.1 виконуються наступні дії:

1. Розробляються та запам’ятовуються окремо декілька файлів з розширенням *.срр, з яких тільки один файл с ім’ям main();

2. У головному меню обирається команда Project, в меню якого обирається опціяOpen project, вводиться ім’я проекту з розширен­ням prj. В нижній частині вікна з’явиться нове вікно, а в рядку з’явиться опції Add (додати), Delete (видалити) та ін.

3. За командою Add з'явиться список файлів поточного директорія, в якому обираються потрібні файли з розширенням *.срр.Після занесення всіх файлів в проект обирається команда Done(закрити). В вікні проекту будуть знаходитися всі файли, що занесені в проект. Для видалення файлів з проекту використовують команду Delete (видалити);

4. Далі проект запускається на компіляцію та компоновку Run | Runабо (Ctrl+F9), після чого отримуємо файл з розширенням *.ехе. Якщо потрібно перекомпілювати всі файли проекту в меню Compile обирається команда Build all, а потімRun | Run;

Створення бібліотеки.Декілька файлів можна об'єднати, створивши бібліотеку з розширенням  *.lib.

Для цього установіть опцію Options|Make After Compiling Run librarian., а потімстворюється проект (з розширенням prj), в який включають необхідні для бібліотеки файли, як описано раніш. Потім виконується команда Compile|Make чи Compile|Build all. При цьому в поточному директорії створиться файл з ім'ям проекту й розширенням lib. Далі знову установіть опцію Options | Make After Compiling Run linkerта створюється новий проект(з новим ім’ям з розширенням prj), в який включаються отриманий бібліотечний файл ( з розширенням *.lib), файл з функцією main() та інші бібліотечні файли й файли з розширенням *.cpp.



Лабораторні роботи

Лабораторна робота №1
Робота з масивами

Мета роботи – вдосконалення навичок роботи з масивами і покажчиками.

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

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>


Int main()

{clrscr();

 int N,M, i,j;

 float **ptrF; //покажчик на масив покажчиків

 puts("Введіть розміри двовимірної матриці");

 scanf("%d %d",&N,&M);

//запит пам'яті для масиву покажчиків

 ptrF=(float**)malloc(N*sizeof(float*));

 if(ptrF==NULL){puts("Помилка"); return -1;}

//запит пам'яті для масивів елементів

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

{ptrF[i]=(float*)malloc(M*sizeof(float));

if (ptrF[i]==NULL){puts("Помилка"); return -1;}

}

 randomize();

 puts("\nзаповнюєм масив ptrF випадковими числами:");

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

{for(j=0;j<M;j++)

{ptrF[i][j]=random(1000)*0.01;//від 0.00 до 9.99

printf("%8.2f",ptrF[i][j]);}

printf("\n"); }

 float *sum;

//запит пам'яті для масиву елементів

 sum=(float*)malloc(N*sizeof(float));

 if(sum==NULL){puts("Помилка"); return -1;}

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

for(j=0,sum[i]=0.0;j<M;j++)

 sum[i]+=ptrF[i][j];

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

   printf("сума %d-й рядка дорiвнює: %.2f\n",i,sum[i]);

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

 free(ptrF[i]); //звільнення пам'яті з-під масивів елементів

 free (ptrF);  //звільнення пам'яті з-під масиву покажчиків

 free (sum);   //звільнення пам'яті з-під масиву елементів

 puts("Press any key...");

 getch();

 return 0;

}

Завдання до програми 1.1 Доповніть програму, створивши другий одновимірний динамічний масив, в який занесіть згідно варіанту обчисленні дані. Результат виведіть на екран.

1. Обчисліть суми дробових частин елементів рядків.

2. Обчисліть кількість елементів в рядках, що більші 5.0.

3. Обчисліть суми елементів стовбців.

4. Обчисліть кількість елементів в стовбцях, що менші 2.5.

5. Обчисліть суми цілих частин елементів стовбців.

Програма 1.2В програмі створюються двовимірні динамічні квадратні матриці. Розмір матриць вводиться з клавіатури. Значення елементів першої матриці вводяться з клавіатури, а другої – заповнюються випадковими числами від -50до +50. Потім в другу матрицю заносяться суми елементів обох матриць.

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

Int main()

{clrscr();

 int i,j,N;

 printf("Введіть порядок квадратної матриці: ");

 scanf("%u",&N);

 int **matr; //покажчик на масив покажчиків

  matr=new int*[N]; //запит пам’яті для масиву покажчиків

 if(matr==NULL){puts("Масив не створено!"); return -1;}

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

 {matr[i]=new int[N]; //запит пам’яті для елементів рядків

 if(matr[i]==NULL) {puts("Масив не створено!");return -2;}

 }

 puts("\n Введіть значення елементів матриці matr:”);

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

for(j=0;j<N;j++)

scanf(“%d”, &matr[i][j]);

puts("\n\tМатриця matr:”);

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

  {for(j=0;j<N;j++)

{printf("%8d", matr[i][j]);}

  printf("\n"); }

 int **mas;//Покажчик на масив покажчиків

 mas=new int*[N];//Запит пам’яті для масиву покажчиків

 if(mas==NULL){puts("Масив не створено!"); return -1;}

 randomize();

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

 {mas[i]=new int[N]; //Запит пам’яті для елементів рядків

 if(mas[i]==NULL) {puts("Масив не створено!");return -2;}

 }

 puts("\nЗаповнюємо матрицю mas випадковими числами:”);

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

{for(j=0;j<N;j++)

{mas[i][j]=random(100)-50;

printf("%8d",mas[i][j]);}

printf("\n"); }

puts("\n\tНові значення матриці mas:”);

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

{for(j=0;j<N;j++)

{mas[i][j]=matr[i][j]+mas[i][j];

printf("%8d",mas[i][j]);}

printf("\n"); }

//Звільнення пам’яті

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

{delete matr[i]; //звільнення пам'яті з-під масивів елементів

delete mas[i]; //звільнення пам'яті з-під масивів елементів

}

 delete [] matr; //звільнення пам'яті з-під масиву покажчиків

 delete [] mas; //звільнення пам'яті з-під масиву покажчиків

 puts("Press any key...");

 getch();

 return 0;

}

Завдання до програми 1.2 Доповніть програму, створивши третю динамічну матрицю. Виконайте задані відповідно варіанту дії. Результат занесіть в третю матрицю та виведіть на екран.

1. Порівняйте значення елементів перших двох матриць, найбільше значення занесіть в третю матрицю.

2. Першу матрицю заповніть випадковими числами до 100. В третю матрицю занесіть суму елементів перших двох матриць, якщо вона знаходиться в діапазоні від 60 до 120, інакше занесіть число 46. Результат виведіть на екран у символьному вигляді.

3. Перемножте першу та другу матрицю, результат занесіть в третю матрицю. Примітка: .

4. Порівняйте значення елементів перших двох матриць. Якщо відповідні елементи від’ємні, то в третю матрицю занесіть –1, якщо додатні – +1, інакше 0.

5. Першу матрицю заповніть випадковими числами від -100 до +100. В третю матрицю занесіть суму абсолютних значень елементів перших двох матриць.

Контрольні питання до лабораторної роботи № 1

1. Дайте визначення масиву. Приведіть приклади.

2. Дайте визначення покажчика. Приведіть приклади.

3. Що таке багатовимірний масив? Як розташовуються в пам'яті елементи багатомірних масивів?

4. Що таке масив покажчиків? Наведіть приклад.

5. Що таке динамічний масив? Чим відрізняється від звичайного?

6. Які масиви називають глобальним, статичним та автоматичним? Як ці масиви ініціалізуються за умовчанням?

7. Створіть динамічну матрицю 5 на 10 для елементів типу long за допомогою оператора new. Значення елементів масиву введіть з клавіатури. Звільніть пам‘ять.

8. Створіть динамічну матрицю 4 на 5 для елементів типу float за допомогою функції malloc().Значенням елементів масиву привлас­ніть випадкові числа. Звільніть пам‘ять.

9. Які три об'єкти (покажчики, масиви) породжує в програмі створення двовимірного масиву?

10. Визначено масив int c[4][3]; та покажчик int*ptc=c[0];Зверніться різними способами до останнього елементу масиву.


Лабораторна робота № 2
Структури. Об'єднання.
Бітові поля структур і об'єднань

Мета роботи – вивчити способи визначення та ініціалізації структур, покажчиків на структуру, і масивів структур; вивчити прийоми використання об'єднань, бітових полів структур і об'єднань.

Програма 2.1.В програмі визначаються проста структури, масив структур та покажчик на структуру. Елементам всіх структур привласнюються певні значення.

#include <stdio.h>

#include <conio.h>

struct REC {char *name; //визначення структурного тип

int age;

float rating;};




Int main()

{clrscr();

 REC rec1; //визначенняструктуру rec1типуREC

 rec1.name="Петров I.С.";

 rec1.age=19;  rec1.rating=4.5;

 printf("%s %d %.2f\n",rec1.name,rec1.age,rec1.rating);

 REC str[3]={"Федоров I.Г.",19,4.17};

//Визначення масивуз 3-хструктур типуREC і ініціалізація першої з них

 str[1].name="Семенов В.I.";

 str[1].age=20; str[1].rating=4.33;

 str[2].name="Орлов С.О.";

 str[2].age=21;  str[2].rating=3.95;

 for(int i=0;i<3;i++)

{printf("%s ",str[i].name );

printf("%d %.2f\n",str[i].age, i[str].rating);}

 REC *ptrrec;   //визначенняпокажчик на структуру типуREC

 ptrrec=new REC; //запит пам‘яті для структури типуREC

 if(ptrrec==NULL){puts(„Помилка”); return -1;}

 ptrrec->name="Iванов П.Ю.";

 ptrrec->age=18;  (*ptrrec).rating=4.2;

 printf("%s ",(*ptrrec).name); 

 printf("%d %.2f\n",ptrrec->age, ptrrec->rating);

 delete ptrrec; //звільнення пам’яті

 puts("Press any key...");

 getch();

 return 0;}

Завдання до програми 2.1Створіть заданий структурний тип, за допомогою якого визначить просту структуру, покажчик на структуру, під який запросить динамічну пам‘ять, та масив з 3-х структур. Елементи перших двох структур з масиву проініціалізуйте, іншим елементам усіх структур привласніть будь-які значення. Всі значення структур виведіть їх на екран. Визначить розмір пам’яті, який займають ці структури.

1. Створіть структурний тип, членами якого є символ та масив з 3-х чисел типу float.

2. Створіть структурний тип, членами якого є масив з 4-х чисел типу intта покажчик на рядок.

3. Створіть структурний тип, членами якого є число типу int та масив з 3-х чисел типу double.

4. Створіть структурний тип, членами якого є число типу float та масив з 4-х чисел типу int.

5. Створіть структурний тип, членами якого є число типу int та масив з 3-х символів.

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

#include <stdio.h>

#include <conio.h>

struct CHARACT{char rg; //розрядність

 char *mem; //об’єм доступної пам’яті

};

struct INTEL {int year; //рiк створення

char *mean; //позначення

CHARACT ch; //вкладена структура

};

Int main()

{clrscr();

 INTEL in[7] ={{1974,"8080",8,"64K"},

{1978,"8086",16,"1M"},

{1983,"80186",16,"1M"}};

 in[3].year=1983; in[3].mean="80286";

 in[4].year=1987; in[4].mean="i386";

 in[5].year=1990; in[5].mean="i486";

 in[6].year=1993; in[6].mean="Pentium";

 in[3].ch.rg=16;  in[3].ch.mem="16M";

 in[4].ch.rg=32;  in[4].ch.mem="4G";

 in[5].ch.rg=32;  in[5].ch.mem="4G";

 in[6].ch.rg=64;  in[6].ch.mem="4G";

 puts("History Of 80x86");

 for(int i=0;i<7;i++)

  {printf("%d %7s ",in[i].year,in[i].mean);

printf("%5d %5s\n",in[i].ch.rg, in[i].ch.mem); }

 puts("Press any key...");

 getch();

 return 0;}

Завдання до програми 2.2 Визначить масив з 4-х структур заданого типу. Елементи перших двох структур проініціалізуйте, елементам інших структур привласніть довільні значення. Значення всіх елементів масиву структур виведіть на екран.

1. Структурний тип містить дані про книгу (автор, назва книги, рік видання) та вкладену структуру, що вказує місце збереження книги (стелаж, ряд і місце на полиці).

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

3. Структурний тип містить дані про студента (прізвище, ім'я, по батькові) та вкладену структуру з назвою факультету, номером курсу, назвою групи.

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

5. Структурний тип містить дані про працівника: прізвище, рік народження та вкладену структуру з даними про посаду, оклад, стаж.

Програма 2.3.В програмі демонструється використання об'єднання union для дослідження внутрішнього зображення дійсних чисел. Число типу float виводиться у вигляді цілого числа типу long, а потім аналізуються його двійкові розряди.

#include <stdio.h>

#include <conio.h>

//визначення типу UNоб'єднання

union UN{float F; unsigned long L;};

Void main()

{clrscr();

 UN FtoL; //визначення об'єднання FtoLтипу UN

 FtoL.F=15.375;

//15.375 (10 СЧ)=01000001011101100000000000000000 (2 СЧ)

 printf("F=%.3f L=%ld=%#lx \n",FtoL.F,FtoL.L,FtoL.L);

 unsigned long m;

 int i,n,counter;

 n=8*sizeof(m);

 for(i=n,m=1L<<n-1;i>0;i--)

  {if(FtoL.L&m) printf("1");else printf("0");

m>>=1;}

 printf("\nзнак числа: ");

 for(i=n,counter=0,m=1L<<n-1;i>0;i--)

{if(FtoL.L&m) printf("1"); else printf("0");

m>>=1;

if(counter==0)printf("\nзсунутий порядок числа: ");

if(counter==8)printf("\nмантiса числа: ");

counter++;

}

 printf("\n");

 getch();

}

Завдання до програми 2.3

1. Визначте об'єднання, елементами якого є масиви з 3-х чисел типу int та з 6-и символів. Значення елементів об'єднання введіть з клавіа­тури у вигляді 16-х чисел типу int, а виведіть на екран у вигляді сим­волів.

2. Визначте об'єднання, елементами якого є масив з 4-х символів і ціле число типуlong. Значення елементів об'єднання введіть з клавіатури у вигляді символів, а виведіть на екран у вигляді числа типу long.

3. Визначтеь об'єднання, елементами якого є масиви з 8-х символів та з 4-х чисел типу int. Значення елементів об'єднання введіть з клавіатури у вигляді символів, а виведіть на екран у вигляді 16-х чисел типу int.

4. Визначте об'єднання, елементами якого є масиви з 8-х символів і 2-х чисел типу long, та проініціалізуйте його. Значення елементів об'єднання виведіть на екран у вигляді 16-х чисел типу long.

5. Визначте об'єднання, елементами якого є масиви з 6-х цілих чисел та з 12-х символів, та проініціалізуйте його. Значення елементів об'єднання виведіть на екран у вигляді символів.

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

#include <stdio.h>

#include <conio.h>

#define M 3

struct CARD{char name[20];     //прізвище

unsigned sex:1; //стать

unsigned family:1; //сімейний стан

unsigned children:3; //кількість дітей

unsigned region:3; //район міста

};

CARD card[M];

Int main()

{clrscr();

 int flag;

 for (int i=0;i<M;i++)

{puts("Введiть данi");

printf("і'мя: ");

gets(card[i].name);

puts("Стать: жiноча-0, чоловiча-1");

scanf("%d",&flag);

fflush(stdin);

if(flag) card[i].sex=1;

else card[i].sex=0;

puts("одружений(одружена)- 1, нi- 0");

scanf("%d",&flag);

fflush(stdin);

if(flag) card[i].family=1;

else card[i].family=0;

puts("кiлькiсть дiтей:");

scanf("%d",&flag);

fflush(stdin);

card[i].children=flag;

puts("район проживання:");

puts("\"Оржоникідзевський\" - 0");

puts("\"Жовтневий\" - 1");

puts("\"Ленінський\" - 2");

puts("\"Хортицький\" - 3");

puts("\"Космічний\" - 4");

puts("\"Заводський\" - 5");

puts("\"Південий\" - 6");

puts("\"Бородинський\" - 7");

scanf("%d",&flag);

fflush(stdin);

card[i].region=flag; 

}

 puts("\n   Введені данi:");

 puts(" Прізвище   стать одружен діти  район");

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

  {printf("%d. %-10s ”,i+1, card[i].name);

 printf("%4d %6d %6d %6d\n”, card[i].sex, card[i].family, card[i].children, card[i].region);

 }

 getch();

 return 0;}

Завдання до програми 2.4 Визначте масив з 4-х структур заданого типу. Елементи перших двох структур проініціалізуйте, елементам інших структур привласніть довільні значення. Значення всіх елементів масиву структур виведіть на екран. Визначить розмір пам‘яті, який займає масив структур.

1. Структурний тип містить дані про працівника (прізвище, ім'я, по батькові) та бітові поля про стать та кількість повних років (до 100)

2. Структурний тип містить дані про студента (прізвище, ініціали, рік народження) та бітові поля з даними бюджетна чи контрактна форма навчання, номер групи (до 4), номер за списком (до 30).

3. Структурний тип містить дані про книгу (прізвище автора, назва) та бітові поля з даними про місце знаходження книги: номер стелажу (до 4), номер полиці (до 100), номер місця на полиці (до 100).

4. Структурний тип містить дані про працівника: прізвище, рік народження та бітові поля з даними про стать, освіту (неповна середня, середня, середня спеціальна, вища), стаж (до 30).

5. Структурний тип містить дані про викладача (прізвище, ініціали) та бітові поля з даними про номер кафедри (до 16), посаду (завідувач кафедри, доцент, старший викладач, асистент), наявність ученого ступеня (ктн, кфмн, дтн, немає).



Контрольні питання до лабораторної роботи № 2

1. Дайте визначення структури та визначення структурного типу (шаблона). Чим відрізняється шаблон структури від структури?

2. Визначить та проініціалізуйте структуруr1 імасив з двох структурr2з типом REC.

struct REC {int a[2];

       char b[3];

     float c;};

Схематично покажіть розподіл пам'яті цих структур.

3. Створіть динамічну структуру типа REC за допомогою функції malloc(). Перевірте, чи створилася динамічна структура. Звільніть пам'ять.

4. Створіть масив з 5-и динамічних структур типа REC за допомогою операції new. Перевірте, чи створився масив динамічних структур. Звільніть пам'ять.

5. Дайте визначення об'єднанню. Чим об'єднання відрізняється від структури?

6. Визначить та проініціалізуйте об'єднанняun1з типомUN1.

union UN1{int a[3];

     long c;

     char d;};

Схематично покажіть розподіл пам'яті цього об'єднання.

7. Для чого можна використовувати бітові поля? Як задається розмір бітового поля при описі його в структурі?

8. Чи може до бітового поля застосовуватися операція "одержати адресу" &? Чому?

9. Схематично покажіть розподіл пам'яті для структури rec:

struct STR {int n;

       unsigned a:5;

       unsigned b:3;

       char ch;}rec;

10. Схематично покажіть розподіл пам'яті для об’єднання un2та привласніть кожному елементу об’єднання максимальне значення:

union UN2{int Lg;

     struct{unsigned b1:2;

            unsigned b2:3;

            unsigned b3:5;

            unsigned b4:6;}bit;

      }un2;


Лабораторна робота № 3
Елементарне введення у функції

Мета роботи – вивчити елемент мови С(С++) – функції, навчитися створювати і використовувати їх.

Програма 3.1.В програмі показана робота найпростіших функцій.

#include <stdio.h>

#include <conio.h>

int mul(int arg1,int arg2) //визначення функції  mul

 {return arg1*arg2;}

float func(float x,float y) //визначення функції  func

 {if(x!=0.0||y!=0.0) return 1/(x*x+y*y);

  else {puts("It is error!"); return -1;}

 }

long double epsilon() //визначення функції epsilon

 {long double eps=1.0L,eps1;

do{eps*=0.5L;

   eps1=eps+1.0L;

}while(eps1>1.0L);

 return eps;}



Int main()

{clrscr();

 int a=2,b=3,c=5,d=6,k1,k2;

 float f1=0.5, f2=0.2, f3=0.0,r1,r2,r3;

 puts("Функцiя множення:");

 k1=mul(a,b);   //виклик функції mul

 k2=mul(c,d);   //виклик функції mul

 printf("k1=%d\nk2=%d\n",k1,k2);

 puts("Функцiя 1/(x*x+y*y):");

 r1=func(f1,f2); //виклик функції func

 r2=func(f3,f1); //виклик функції func

 r3=func(f2,f3); //виклик функції func

 printf("r1=%.1f\nr2=%.1f\nr3=%.1f\n", r1,r2,r3);

 puts("Найменше число, що можна додати до одиницi:");

 long double E=epsilon(); //виклик функції epsilon

 printf("E=%Le\n",E);

 puts("Press any key...");

 getch();

 return 0;}

Завдання до програми 3.1 Розробіть задані згідно варіанту функції та продемонструйте роботу цих функцій, зробивши в головній програмі кілька викликів функцій з різними параметрами.

1. Функція типу int, що повертає більше з трьох цілих чисел та функція типу float, що повертає суму двох вхідних параметрів, якщо другий параметр додатний, інакше повертає різницю цих параметрів.

2. Функція типу int, що повертає суму остач від ділення першого та другого параметрів на 5, якщо суму більша 4, інакше повертає число 0, та функція типу double, що повертає мінімальне з двох вхідних параметрів.

3. Функція типу float, що повертає абсолютне значення різниці першого та другого аргументів, та функція типу int, що повертає мінімальне з трьох цілих чисел.

4. Функція типу long, що повертає добуток двох чисел типу long, якщо друге число менше 100, інакше повертає число 100, та функція типу float, що повертає середнє арифметичне трьох чисел.

5. Функція типу int, що повертає суму трьох вхідних параметрів, якщо значення першого параметру непарне, інакше повертає число 50, та функція типу float, що повертає різницю квадратів двох вхідних параметрів.

Програма 3.2.В програмі функція визначає суму елементів масиву. При цьому у функцію передається покажчик на масив та розмір масиву. Функція визначається наприкінці файлу. Компілятору повідомляється про подальше визначенні функції за допомогою прототипу функції.

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

float summa(float[], int); //визначення прототипу

Int main()

{clrscr();

 float res1,mas1[]={3.3,2.7,7.5,1.5},res2,mas2[10];

 int n=sizeof(mas1)/sizeof(mas1[0]);

 puts(" Massiv 1");

 for(int i=0;i<n;i++)

  printf("%.1f ",mas1[i]);

 res1=summa(mas1,n); //виклик функції

 printf("summa1=%.1f\n",res1);

 randomize();

 puts(" Massiv 2");

 for(int i=0;i<10;i++)

 {mas2[i]=random(100)*0.1;

  printf("%.1f ",mas2[i]);}

 res2=summa(mas2,10); //виклик функції

 printf("\nsumma2=%.1f\n",res2);

 getch();

 return 0;}

float summa(float arr[],int size) //визначення функції

{float sum=0.0;

 for(int i=0;i<size;i++)

sum+=arr[i];

 return sum;

}

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

1. Функція, в яку передається масив типу double, що повертає середнє арифметичне елементів масиву.

2. Функція, в яку передається масив типу int, що повертає максимальний елемент масиву.

3. Функція, в яку передається масив типуfloat, що повертає кількість додатних елементів.

4. Функція, в яку передається масив типу long, що повертає кількість непарних елементів масиву.

5. Функція, в яку передається масив типу char, що повертає індекс мінімального елементу цього масиву.

Програма 3.3.В програмі визначається функція з параметрами за умовчанням.

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#define N 5

float bigger(int var,int n=10) //визначення функції

{if(var<n) return n;

return var;

}

Int main()

{clrscr();

 randomize();

 int arr[N];

puts(“Максимальне число 10”);

 for(int i=0;i<N;i++)

{arr[i]=random(20);

printf("arr[%d]=%3d ",i,arr[i]);

arr[i]=bigger(arr[i]); //виклик функції, значення

                     //параметра nдорівнює 10

printf("barr[%d]=%3d\n",i,arr[i]);

}

puts(“\nМаксимальне число 50”);

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

{arr[i]=random(100);

printf("arr[%d]=%3d ",i,arr[i]);

arr[i]=bigger(arr[i],50); //виклик функції, значення

                        //параметра nзамінюється на 50

printf("barr[%d]=%3d\n",i,arr[i]);

}

 getch();

 return 0;

}

Завдання до програми 3.3 Розробіть задану згідно варіанту функцію з трьома вхідними параметрами типуfloat x, a, b, два з яких (a,b) мають значення за умовчанням, та продемонструйте роботу цієї функції, зробивши в головній програмі кілька викликів функції з різними значеннями та різним числом параметрів.

1. Функція, яка повертає значення a*x, якщо а додатне, інакше значення b*x.

2. Функція, яка повертає значення x*x-a, якщо а від‘ємне, інакше значення x*x-b.

3. Функція, яка повертає значення x+a, якщо а більше b, інакше значення x+b.

4. Функція, яка повертає значення виразу (x*a–b).

5. Функція, яка повертає значення виразу (a+x*b).

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

#include <stdio.h>

#include <conio.h>

int varg1(int i,...) //визначення функції varg1

{int *num_arg=&i;

 int sum=0;

 for(;i;i--)

sum+=*(++num_arg);

 return sum;

}

double varg2(double arg,...) //визначення функції varg2

{double mul=1.0;

 double *ptr=&arg;

 if(*ptr==0.0) return 0;

 for(;*ptr!=999.0;ptr++) mul*=*ptr;

 return mul;

}

Int main()

{clrscr();

 int a=11,b=22,c=33,sum;

 double mul,x=2.25,y=4.4,z=5.0,end=999.0;

 sum=varg1(2,a,b); //виклик функції

 printf("sum(a,b)=%d\n",sum);

 int j=3;

 sum=varg1(j,a,b,c); //виклик функції

 printf("sum(a,b,c)=%d\n",sum);

sum=varg1(6,a,b,c,100,200,700); //виклик функції

 printf("sum(...)=%d\n",sum);

 mul=varg2(x,y,z,end); //виклик функції

 printf("mul(x,y,z)=%.2lf\n",mul);

 mul=varg2(x,y,z,1.5,4.2,end); //виклик функції

 printf("mul(...)=%.2lf\n",mul);

 puts("Press any key...");

 getch();

 return 0;}

Завдання до програми 3.4 Розробіть задану згідно варіанту функцію зі змінним числом параметрів та продемонструйте роботу цієї функції, зробивши в головній програмі кілька викликів функції з різними значеннями. Всі параметри, крім розміру, мають тип double.

1. Функція обчислює суму першого параметра і добуток параметрів, що йдуть за другим: F=arg1+arg3*arg4*..., загальна кількість параметрів передається за допомогою другого параметру (типint) .

2. Функція обчислює добуток першого параметра і суми параметрів, що йдуть за першим: F=arg1*(arg2+arg3+arg4+…),ознакою закінчення списку параметрів є деяке визначене значення параметра.

3. Функція обчислює суму додатних параметрів типу double, загальна кількість параметрів передається за допомогою першого параметру (типint) .

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

5. Функція обчислює суму другого параметра і добуток параметрів, що слідують за другим: F=arg2+(arg3*arg4*…),загальна кількість параметрів передається за допомогою першого параметру (типint) .

Програма 3.5В програмі демонструється передача аргументів у функцію main (int argc,char **argv). Для роботи програми її необхідно запустити з командного рядка, наприклад, у середовищі FAR, NC, VC і ін. Для налагодження подібних програм у IDE BC31 є опція Run|Arguments, за допомогою якої в діалоговому вікні Program Arguments можна ввести аргументи.

#include <stdio.h>

#include <conio.h>

int main(int argc, char **argv, char **envp)

{clrscr();

 for(int i=0;i<argc;i++)

printf("argv[%d]=%s\n",i,argv[i]);

 puts("Press any key...");

 getch();

 while(*envp) puts(*envp++);

 puts("Press any key...");

 getch();

 return 0;

}

Завдання до програми 3.5 Розробіть програму з використанням передачі аргументів в головну функцію з командного рядка. В функцію int main(int argc,char**argv) з командного рядка передаються заданий згідно варіанту пароль, число та інші повідомлення. Якщо пароль правильний, то на екран виводиться вся інформація з командного рядка, прізвище і ім‘я студента та таблиця множення на задане число, інакше виводиться повідомлення про неправильний пароль.

1. Місяць народження студента.

2. Назва вулиці, на якій проживає студент.

3. Ім’я улюбленої кінозірки.

4. Назва улюбленої спортивної ігри.

5. Улюблена пора року.

Контрольні питання до лабораторної роботи № 3

1. Із чого складається визначення функції?

2. Які параметри називають фактичними, а які формальними?

3. Для чого та коли використовується прототип функції?

4. Для чого використовується оператор return у функції? Скільки таких операторів може мати функція?

5. В чому різниця передачі параметрів за значенням та за покажчиком?

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

7. В чому різниця між функціями, прототипи яких мають вигляд?

int *fp(int,float); int fp(int *,float);

8. Дайте визначення та приведіть приклад прототипу функції з параметрами за умовчанням.

9. Дайте визначення та приведіть приклад прототипу функції з змінним числом параметрів. З якими типами даних не можна використовувати такі функції?

10. Як та які параметри передаються до функції main()?


Лабораторна робота № 4
Прийоми використання функцій

Мета роботи – познайомитися і зрозуміти деякі сучасні засоби мови С++, такі як перевантаження функцій, шаблони функцій і покажчики










Последнее изменение этой страницы: 2018-04-12; просмотров: 376.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...