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


Вказівки, масиви і символьні рядки в мові 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 мильонов к студенческой карме :

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

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

Сейчас смотрят :

Реферат Понятие и признаки несостоятельности (банкротства). Состав денежных обязательств и обязательных платежей
Реферат Инфляция и ее экономические и социальные последствия
Реферат Eastman Kodak Digital ROC 1.1.2
Реферат OTC Over The Counter Drugs Essay Research
Реферат Загальні принципи і задачі комплексного використання водних ресурсів
Реферат Проблема общения в психологии
Реферат Code Hero In A Farewell 2 Arms
Реферат Проект реконструкции зоны текущего ремонта ОАО «ПАК» с детальной разработкой универсального канавного подъемника для замены коробки передач и редуктора автобуса
Реферат Экономика государства
Реферат Экспериментальные исследования по установлению соединения
Реферат Поняття про біологію
Реферат Программа тренинга по улучшению взаимоотношений между сотрудниками, их личностному росту через повышение их коммуникативной компетентности
Реферат Александр Андреевич Иванов. Живопись. Рисунок. Акварель. Интерактивная программа
Реферат Конспект лекций по политэкономии
Реферат Heart Of Darkness 6 Essay Research Paper