Реферат по предмету "Информатика, программирование"


Вказівки, масиви і символьні рядки в мові C

Лабораторна роботаВказівки, масиви і символьні рядки в мові Cпрограма вказівка масив символрядок
1. Мета роботи
Метою лабораторної роботи є отримання практичних навиків в роботіз вказівниками і з адресною арифметикою в мові С. 2. Теоретичні відомості
В С++існує надзвичайно потужний інструмент для роботи зі складними агрегатами даних,який надає загальний підхід до різних на перший погляд програмних об’єктівтаких як масив та рядок. Цей і нструмент базується на широкому використаннівказівника.
Вказівник- це символічне представлення адреси. Він використовується для непрямоїадресації змінних і об'єктів.
Вмові С++ є операція визначення адреси — &, за допомогою якої визначаєтьсяадреса комірки пам’яті, що містить задану змінну. Наприклад, якщо vr — ім’я змінної,то &vr —адреса цієї змінної.
В С++також існують і змінні типу вказівник. Значенням змінної типу вказівник єадреса змінної або об'єкта. Нехай змінна типу вказівник має ім'я ptr, тоді в якостізначення їй можна присвоїти адресу за допомогою наступного оператора:
ptr=&vr;
Вмові С++ при роботі з вказівниками велике значення має операція непрямоїадресації — *. Операція * дозволяєзвертатися до змінної не напряму, а через вказівник, який містить адресу цієїзмінної. Ця операція є одномісною і має асоціативність зліва направо. Цюоперацію не слід плутати з бінарною операцією множення. Нехай ptr — вказівник,тоді *ptr — це значеннязмінної, на яку вказує ptr.
Описзмінних типу вказівник здійснюється за допомогою операторів наступної форми:
*;
Кожназмінна в програмі це об'єкт, що має ім'я і значення по імені можна звернутисядо змінного й одержати її значення.
Операторприсвоювання ( = ) виконує зворотну дію: імені змінної ставиться увідповідність значення.
/>a=10;                   
 
Вираз&a дозволяє одержати адресу ділянки пам'яті, виділеного змінній а. Операція& застосовна тільки до об'єктів, що мають ім'я і розміщених у пам'яті.
          Маючиможливість визначити адреси змінної за допомогою &, треба мати можливістьпрацювати з цією адресою: зберігати його, передавати, перетворювати.
Дляцього вводиться поняття вказівника.
Вказівник- це змінна, значенням якої служить адреса об'єкта конкретного типу. Нульоваадреса позначається константою NULL, що визначена в заголовному файлі stdio.h.Щоб визначити вказівник треба повідомити на об'єкт якого типу посилається цейвказівник.
char*z;
int*k,*i;
float*f;
* — це операція разіменування. Операндом цієї операції завжди є вказівник.Результат операції — це той об'єкт, що адресує вказівник_операнд.

/>*z=’$ ‘;       /> /> /> /> /> /> />

*k=*i=0;    
/>Приклад:
inte, c, b, *m;
….…
m =&e;
*m =c + b;
Операціїнад вказівниками.
присвоювання(=);
одержаннязначення об'єкта, на який посилається вказівник (*);
одержанняадреси самого вказівника (&).
Приклад:
/>int date = 10;       
int*i, *k;;            
i =&date;            
k =i;                    
z =NULL;
Подібнобудь-яким змінної змінна типу вказівник має ім'я, арес у пам'яті і значення.
/>                                      
         

Задопомогою унарних операцій ++ і –і числові значення змінних типу вказівникміняються по різному, у залежності від типу даних, з яким зв'язані ці змінні.
Приклад:
char*z;
int*k,*i;
float*f;
….…
z++;// значення змінюється на 1
і++;// значення змінюється на 2
f++;// значення змінюється на 4
Тобтопри зміні вказівника на 1, вказівник переходить до початку наступного(попереднього) поля тієї довжини, що визначається типом об'єкта, якийадресується вказівником.
2.1 Використаннявказівників при роботі з масивами
          Ім'ямасиву без індексу є вказівником-константою, тобто адресою першого елементамасиву (a[0]).
/>a
*a = = a[0] ;
*(a+1) = = a[1];
 …
*(a+і) = =a[і];
Відповіднодо синтаксису в С існують тільки одномірні масиви, але їх елементами, у своючергу, теж можуть бути масиви.
inta[5][5];
Длядвовимірного масиву:
a[m][n]= = *(a[m]+n) = = *(*(a+m)+n);
Приклад1.Опис вказівників.
int*ptri; //вказівник на змінну цілого типу
char*ptrc; //вказівник на змінну символьного типу
float*ptrf; //вказівник на змінну з плаваючою точкою
Такийспосіб оголошення вказівників виник внаслідок того, що змінні різних типівзаймають різну кількість комірок пам'яті. При цьому для деяких операцій звказівниками необхідно знати об'єм відведеної пам'яті. Операція * в деякомурозумінні є оберненою до операції &.
Вказівникивикористовуються для роботи з масивами. розглянемо оголошення двовимірного масиву:
intmas[4][2];
int*ptr;
Тодівираз ptr=mas вказує на першу колонку першого рядка матриці. Записи mas і&mаs[0][0] рівносильні. Вираз ptr+1 вказує на mas[0][1], далі йдутьелементи: mas[1][0], mas[1][1], mas[2][0] і т. д.; ptr+5 вказує на mas[2][1].
Двовимірнімасиви розташовані в пам’яті так само, як і одновимірні масиви, займаючипослідовні комірки пам’яті ptr ptr+1 ptr+2 ptr+3 ptr+4 ptr+5 mas[0][0] mas[0][1] mas[1][0] mas[1][1] mas[2][0] mas[2][1]

Розміщеннядвовимірного масиву в пам’яті
Динамічним називаєтьсямасив, розмірність якого стає відомою в процесі виконання програми.
В С++для роботи з динамічними об’єктами використовують спеціальні операції new і delete. Задопомогою операції new виділяєтьсяпам’ять під динамічний об’єкт (який створюється в процесі виконання програми),а за допомогою операції delete створенийоб’єкт видаляється з пам’яті.
Приклад. Виділенняпам’яті під динамічний масив.
Нехайрозмірність динамічного масиву вводиться з клавіатури. Спочатку необхідновиділити пам’ять під цей масив, а потім створений динамічний масив требавидалити.

int n;
scanf(n;       // n — розмірність масиву
int *mas=new int[n]; // виділення пам’яті під масив
delete [] mas;        // звільнення пам’яті

Вцьому прикладі mas є вказівником на масив з n елементів. Оператор int *mas=new int[n]виконує дві дії: оголошується змінна типу вказівник, далі вказівнику надаєтьсяадреса виділеної області пам’яті у відповідності з заданим типом об’єкта.
Дляцього ж прикладу можна задати наступну еквівалентну послідовність операторів:

int n, *mas;
scanf(n;// n — розмірність масиву
mas=new int[n];// виділення пам’яті під масив
delete [] mas;// звільнення пам’яті

Якщоза допомогою операції new неможливовиділити потрібний об’єм пам’яті, то результатом операції new є 0.
Інодіпри програмуванні виникає необхідність створення багатовимірних динамічнихоб’єктів. Програмісти-початківці за аналогією з поданим способом створенняодновимірних динамічних масивів для двовимірного динамічного масиву розмірностіn*k запишутьнаступне
mas=new int[n][k]; //Невірно! Помилка!
Такийспосіб виділення пам’яті не дасть вірного результату. Наведемо прикладстворення двовимірного масиву.
#include
#include
int main()
{
int n;const m=5;
printf(«input the number»;
scanf(&n);
int** a; //a — вказівник на масив вказівників на рядки
a=new int* [n]; //виділення пам’яті длямасиву вказівників на n рядків
for(int i=0;i
a[i]=new int [m]; //виділення пам’ятідля кожного рядка масиву розмірністю nxm

for(int i=0;i
{for(int j=0;j
printf(a[i][j]);
}
for(int i=0;i
delete [] a[i]; //звільнення пам’яті від кожного рядка
delete [] a; //звільнення пам’яті від масиву вказівників
getch();
return 0;
}
2.2 Використання вказівників при роботі з рядками
 
Символьнаконстанта складається з одного символа ASCII між апострофами (''). Приклади спеціальних символів:Новий рядок '\n' Горизонтальна табуляція '\t' Повернення каретки '\r' Апостроф '\'' Лапки '\"' Нульовий символ '\0' Зворотний слеш '\\'
Символьнідані в С предствляють у вигляді стрингів. Стринги є одним з найбільш кориснихта важливих типів даних мови С. Символьний рядок (стринг) — цемасив символів, що закінчується у лапки ("). Він має тип char. Нульовий символ (\0) автоматично додається останнімбайтом символьного рядка та виконує роль ознаки його кінця. Кількість елементіву масиві дорівнює кількості символів у стрингу плюс один, оскільки нульовийсимвол також є елементом масива. Кожна стрингова константа, навіть у випадку, коливона ідентична іншій стринговій константі, зберігається у окремому місціпам'яті. Якщо необхідно ввести у рядок символ лапок ("), то перед ним треба поставитисимвол зворотного слешу (\). У стринг можутьбути введені будь-які спеціальні символьні константи, перед якими стоїть символ\.
Прототипивсіх функцій, що працюють з рядками символів, містяться у файлі string.h. Всі функції працюють зрядками, що закінчуються нульовим символом. Ось деякі з них:
int strcat( char *, char *) — з'єднати два стринги;
int strcpy(char *s1, char *s2) — копіюватирядок s2 у рядок s1;
int strlen(char *s) — визначити довжину рядку (кількістьсимволів без нульового символа).
Дляроботи з масивом символів, що не має у кінці нульового байта, можнакористуватися функціями перетворення буферів. Протипи цих функцій знаходяться уфайлі mem.h. Ці функціїдозволяють присвоювати кожному байту в межах вказаного буфера задане значення,а також використовуються для порівняння вмісту двох буферів. Наприклад:
memcpy() — копіювання символів з одного буфера у другий,поки не буде скопійований заданий символ або не буде скопійовано визначенукількість символів
memcmp() — порівнює вказану кількість символів з двохбуферів
Уфайлі ctype.h описанопрототипи функцій, що призначені для перевірки літер. Ці функції повертаютьненульове значення (істина), коли її аргумент задовольняє заданій умові абоналежить вказаному класу літер, та нуль в іншому випадку. Наприклад:
int islower(int с) — символ с є малою літерою;
int isupper(int c) — символ с є великою літерою;
int isalnum(int c) — символ с є буквою або цифрою;
int isalpha(int c) — символ с є буквою;
int tolower(int c) — перетворення літери у нижній регістр;
int strtol(int c) — перетворення стрингу у довге цілечисло;Приклад
Обчислитивираз з дужками, десятковими цифрами та знаками +, -, *, /.
#include
#include
isdig(charc) {return ((isdigit(c)) || 'с'=='.');}
doubleval(char **);
doublegetdig(char ** s)
{
          doubleres;
          if(**s=='(')res=val(++*s);
          else{res=atof(*s); while(isdig(*++*s));};
          returnres;
}
doublemulti(char** s)
{
          doubleres=getdig(s);
          while((**s=='*')|| (**s=='/'))
          if(**s=='*')res*=getdig(++*s);
          elseres/=getdig(++*s);
}
doubleval(char** s)
{
          doubleres=multi(s);
          while((**s!=')')&& (**s!='\0'))
          if(**s=='+')res+=multi(++*s);
          elseres-=*(++*s);
          if(**s==')')++*s;
          returnres;
}
doublegetsvalue(char* s) {char** l; *l=s;
returnval(l);}
main()
{
          char*s=«2-4/2+25/(2+3)/5+(-1)*(2*4/8-2)*(-1)+5»;
          cout
}3.Порядок виконання роботи
Проаналізуватиумову задачі.
Розробитиалгоритм та створити програму розв’язання задачі згідно з номером варіанту.
Результатироботи оформити протоколом


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.