Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
рограмування Лабораторна робота № 2_5
Мета: Отримання навиків обробки одновимірних масивів. Організувати обробку масивів з використанням функцій, навчитися передавати масиви як параметри функцій.
1.1. Визначення масиву
Визначення масиву містить тип елементів, ім'я масиву і кількість елементів в масиві.
int mas[10];
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Т. ч. індекси елементів в масиві mas можуть мінятися від 0 до 9, всього в масиві 10 елементів.
1.2. Ініціалізація масиву
Ініціалізація масивів можлива при їх визначенні:
double d[] = {1, 2, 3, 4, 5};
Довжина масиву обчислюється компілятором по кількості значень перерахованих у фігурних дужках.
1.3. Покажчики
Кожна змінна в програмі це об'єкт, що має ім'я і значення на ім'я можна звернутися до змінної і отримати її значення. Оператор привласнення ( = ) виконує зворотну дію: імені змінної ставиться у відповідність значення.
a=10;
Вираз &a дозволяє отримати адресу ділянки пам'яті, виділеної змінній а. Операція & застосовна тільки до об'єктів які мають ім'я і розміщені в пам'яті.
Маючи нагоду визначити адресу змінної з допомогою &, треба мати нагоду працювати з цією адресою: зберігати його, передавати, перетворювати. Для цього вводиться поняття покажчика. Покажчик - це змінна, значенням якої служить адреса об'єкту конкретного типу. Нульова адреса позначається константою NULL, яка визначена в заголовному файлі stdio.h. Щоб визначити покажчик треба повідомити на об'єкт якого типу посилається цей покажчик.
char *z;
int *k,*i;
float *f;
* - це операція розіменування. Операндом цієї операції завжди є покажчик. Результат операції - це той об'єкт, який адресує покажчик_операнд.
*z=$ ;
*k=*i=0;
Приклад:
int e, з, b *m;
. . . . . . . . .
m = &e ;
*m = з + b ;
Операції над покажчиками.
привласнення (=);
отримання значення об'єкту, на який посилається покажчик (*);
отримання адреси самого покажчика (&).
Приклад:
int date = 10;
int *i *k;;
i = &date;
до = i;
z = NULL;
Подібно будь-яким змінним змінна типу покажчик має ім'я, адрес в пам'яті і значення.
За допомогою унарних операцій ++ і - числові значення змінних типу покажчик міняються по різному, залежно від типа даних, з яким пов'язані ці змінні.
Приклад:
char *z;
int *k,*i;
float *f;
. . . . . . .
z++; // значення змінюється на 1
i++; // значення змінюється на 2
f++; // значення змінюється на 4
Т. ч. при зміні покажчика на 1, покажчик переходить до початку наступного (попереднього) поля тієї довжини, яка визначається типом об'єкту, що адресується покажчиком.
1.4. Покажчики і масиви
Ім'я масиву без індексу є покажчиком-константою, тобто адресою першого елемента масиву (а[0]).
а
*a = = а[0];
*(a+1) = = а[1];
. . . . . . . . .
*(a+i) = =a[i];
Відповідно до синтаксису в Сі існують тільки одновимірні масиви, але їх елементами, у свою чергу, теж можуть бути масиви.
int а[5][5];
1.5. Функції
Функцію в Сі можна розглядати:
як один з похідних типів даних (разом з масивами і покажчиками);
як мінімальний виконуваний модуль програми (підпрограму).
Всі функції мають єдиний формат визначення:
<тип><імя_функції>(<список_формальних_параметрів>), де
<тіло_функції>, де
<тип> - або void, якщо функція не повертає значення, або тип що повертається функцією значення;
<імя_функции> - або main для основної функції, або довільний ідентифікатор, не співпадаючий із службовими словами і іменами інших об'єктів програми;
<список_формальних_параметрів> - або порожній ( ), або список, кожний елемент якого має вигляд:
<позначння_типу><імя_параметра>
Наприклад:
(int до )
(char i, char j, int z)
<тіло_функції> - це частина визначення функції, укладена у фігурні дужки { }.Тело функції може бути або складовим оператором, або блоком. Визначення функцій не можуть бути вкладеними.
Для передачі результату з функції в ту, що викликає функцію використовується оператор return. Він може використовуватися в двох формах:
Якщо програміст не пише оператор return явно, то компілятор автоматично дописує return в кінець тіла функції перед закриваючою фігурною дужкою}.
Приклад:
int op (char з, int x, int у)
{
switch з
{
case + : return x+y;
case - : return x-y;
case * : return x*y;
case / : return x/y;
default: cout<<“\nОперация не визначена”;
return 0;
}
}
Виклик функції здійснюється таким чином:
<позначння функції>(<список фактичних параметрів>); де
<позначння функції> - або ім'я функції, або покажчик на функцію;
<список фактичних параметрів> - список виразів, кількість яких рівно числу формальних параметрів функції. Між формальними і фактичними параметрами повинна бути відповідність по типах.
Наприклад:
з = op ( +, 5,4 );
Синтаксис Сі передбачає тільки один спосіб передачі параметрів - передача по значенню (тобто змінити значення параметрів усередині функції не можна). Але існує можливість побічно змінити значення змінних які передаються у вигляді параметрів: за допомогою покажчика у функцію, що викликається, можна передати адресу будь-якого об'єкту із зухвалої програми. Якщо покажчик розіменування, то вийде значення, записане за цією адресою.
Приклад:
1)
//опис функції для обміну змінних а і b
void change (int а,int b)
{
int r;
r = а; а = b; b = r;
}
// виклик функції
change(а, b);
Обміну не відбудеться, оскільки результат не буде переданий в програму, що викликає.
2)
void change (int *a,int *b)
{
int r;
r = *a; *a = *b; *b = r;
}
// виклик функції
change(&a &b);
При виклику передаються адреси, по яких знаходяться значення і виконується обмін значень, які знаходяться за цими адресами.
1.6. Масиви і рядки як параметри функцій
Якщо як параметр функції використовується позначення масиву, то насправді у функцію передається адреса першого елемента масиву.
Приклад:
//обчислення суми елементів масиву
//варіант 1
int sum (int n, int a[] )
{
int i,int s=0;
for( i=0; i<n; i++ )
s+=a[i]
return s;
}
void main()
{
int a[]={ 3, 5, 7, 9, 11, 13, 15 };
int s = sum( 7, а );
cout<<s;
}
//варіант 2
int sum (int n, int *a)
{
for(int i=0, s=0; i<n; s+=*(a+i),i++ );
return s;
}
void main()
{
int a[]={ 3, 5, 7, 9, 11, 13, 15 };
int s = sum( 7, а );
cout<<s;
}
Рядки як фактичні параметри можуть бути визначені або як одновимірні масиви типу char[], або як покажчики типу char*. На відміну від звичайних масивів в цьому випадку немає необхідності явно указувати довжину рядка.
2. Постановка задачі
Використовуючи одновимірний масив, виконати його обробку відповідно до варіанту завдання.
2.1. Методические вказівки до задачі
1) При виконанні роботи використовуються статичні масиви. Для організації статичних масивів з псевдозмінними межами необхідно оголосити масив достатньо великої довжини, наприклад, 100 елементів:
int N=100;
int а[N];
Потім користувач вводить реальну довжину масиву (не більше N) і працює з масивом тієї довжини, яку він сам вказав. Решта елементів (хоча пам'ять під них і буде виділена) не розглядається.
2) При зменшенні або збільшенні довжини масиву необхідно змінювати його реальну довжину.
2.2. Варіанти задачі
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
7
10
а
&а
$
*z
z
0
*k
0
*i
i
30
m
10
20
c
b
e
10
date
&date
k i
Значение
Значение объекта
Указатель а
&a
*а объект,
адресуемый указателем а