Автор: Пользователь скрыл имя, 20 Сентября 2011 в 10:17, курсовая работа
Об’єкт дослідження – обробка одновимірних масивів.
Предметом дослідження – обробка рядкових масивів даних.
Мета дослідження – простежити сутність методів обробка рядкових масивів даних.
Одним із каменів спотикання у цьому питанні є ключове слово export, використовуване також і для розділення оголошення і визначення шаблонів.
Першим компілятором, що підтримів export в шаблонах, став Comeau C++ на початку 2003 року (опісля п'ять років після виходу стандарту). У 2004 році бета-версія компілятора Borland C++ Builder X також почала його підтримку.
Обидва цих компілятора засновані на зовнішньому інтерфейсі EDG. Інші компілятори, такі як Microsoft Visual C++ або GCC, взагалі цього не підтримують. Ерб Саттер (Herb Sutter), секретар комітету із стандартизації С++, рекомендував прибрати export з майбутніх версій стандарту унаслідок серйозних складнощів в повноцінній реалізації, проте згодом остаточним рішенням було вирішено його залишити.
Із
списку інших проблем, пов'язаних з
шаблонами, можна навести питання
конструкцій часткової
ВИСНОВКИ
Мова
C++ є однією з найпоширеніших сучасних
мов програмування. Вона займає домінуюче
положення в світі персональних комп'ютерів.
C++ - універсальна мова високого рівня.
Але окрім властивостей, властивих іншим
мовам високого рівня (структурність,
модульність програм), в неї включені засоби
програмування, властиві мовам низького
рівня типу Асемблера (побітові операції,
операції зрушення, робота з адресами).
C++ витончена і зручна для побудови багатомодульних
структурованих програм. Вона є могутнім
і гнучким засобом для написання на ній
операційних систем, їх компонентів. Мова
C++ є продовженням і розвитком мови С, розробленої
Д. Рітчи на початку сімдесятих років і
що набула широке поширення. Сама ж мова
C++, розроблена Бьярном Страуструпом, з'явилася
лише в 1983 р. До стандарту Д. Рітчи були
додані нові елементи, можливості, що істотно
розширили його. Це перш за все класи, додавання
яких зробило C++ однією з самих широко
використовуваних об'єктно-орієнтованих
мов програмування. Не дивлячись на відносно
недавню розробку, мова C++ до теперішнього
часу вже завоювала велику популярність
як у професійних, так і програмістів,
що починають.
РОЗДІЛ 2. Обробка рядкових масивів даних
2.1. Робота з масивами
Масив – це кінцева послідовність даних одного типу. Кожен елемент масиву має однакове ім’я – ім’я масиву, і відрізняється індексом (ціле число), за яким здійснюється доступ до елемента масиву. Індекси масивів у С/С++ починаються з 0. У програмі одновимірний масив оголошується наступним чином:
<тип> <ім’я масиву> [розмір] <ініціалізація>; ,
де розмір – кількість елементів одновимірного масиву.
Після визначення ім’я масиву стає вказівником-константою, значення якого є незмінним і становить адресу першого (нульового) елемента масиву.
За способом розміщення масиви поділяються на статичні та динамічні. Розмір статичного масиву можна задавати константою або константним виразом. Оскільки ділянка у оперативній пам’яті під масив задається на етапі компіляції і її розмір визначається типом елементів масиву та їх кількістю, розмірність масиву повинна бути визначена у тексті програми, а не підчас її виконання. Для визначення масиву змінного розміру використовується механізм динамічного виділення пам’яті.
Наприклад:
-
оголошення одновимірного
int a[5];
- динамічне виділення пам’яті під 10 цілочисельних елементів:
int*m=new int [10];
Враховуючи те, що ім¢я масиву є вказівником, зрозумілим стає зміст останньої операції: вказівникові на int m присвоюється початкова адреса ділянки пам¢яті, виділеної у динамічній області під 10 цілочисельних елементів.
Перевагою динамічних масивів є те, що їх розмірність може бути змінною, тобто у програмі можна працювати з масивами довільного розміру, не вносячи змін до тексту програми. Проте, динамічні масиви не можна ініціалізувати при визначенні і вони за замовчуванням не заповнюються нулями.
Натомість
ініціалізацію статичних
Наприклад:
double d[] = {1, 2, 3, 4, 5};
float f[10]={1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.0};
При поєднанні визначення масиву з ініціалізацією його розмірність у квадратних дужках можна не вказувати. Довжину масиву компілятор визначить за кількістю значень, наведених у фігурних дужках.
Для звернення до елементів масивів використовуються два способи, наприклад до 4-го (по порядку) елемента масиву a можна звернутися як a[3] або *(a+3). Останнє звернення базується на факті, що ім’я масиву є одночасно вказівником на його нульовий елемент, а зміщення вказівника у пам’яті відбувається на величину індексу помножену на розмір типу елементів масиву у байтах.
Пам’ять, зарезервовану під динамічний масив за допомогою new[ ], потрібно звільняти оператором delete [] <ім¢я массиву>.
Отже, якщо кількість елементів масиву відома до виконання програми, краще використовувати статичний масив, розмірність якого позначити як значення іменованої константи. Якщо розмірність масиву необхідно задавати в процесі виконання програми (до введення його елементів), то доцільно створювати динамічний масив.
2.2. Рядки, як одновимірні масиви символів
У мовах С/С++ немає окремого типу даних “рядок символів”, подібно до типу string у алгоритмічній мові PASCAL. Тому робота з рядками реалізована шляхом використання одновимірних масивів типу char. Рядок символів – це одновимірний масив типу char, останнім елементом якого є нульовий байт. Нульовий байт – це байт, кожен біт якого рівний нулю, при цьому для нульового байта визначена символьная константа ¢\0¢ (ознака закінчення рядка або нуль-термінатор). Тому, якщо рядок містить k символів, в описі масиву потрібно вказати розмірність k+1.
Так, для збереження у масиві рядкової константи “Лабораторна робота з рядками”, необхідно описати масив char s. В кінці рядкової константи символ ґ \0¢ вказувати не потрібно, оскільки це зробить компілятор мови С.
Рядки можна
а) ініціалізувати при декларуванні.
Наприклад:
charS1[10]=”123456789”,S2[]
де в двох останніх випадках розмір рядків буде встановлений за кількістю символів;
б)
вводити з клавіатури, не використовуючи
при цьому оператора циклу, подібно
звичайним масивам.
2.3. Символьна інформація та рядки
2.3.1. Збереження символьної інформації
Для символьних даних в C/С++ введено тип char. Для представлення символьної інформації використовуються символи, символьні змінні і текстові константи. Приклади:
const char c=’c’; //символ-константа – займає один байт
char a,b; // символьні змінні, займають по одному байту
const char *s=“Приклад рядка\n” ; // рядкова константа
Рядок
в С++ - це масив символів, що закінчується
нуль-символом ‘\0’. За місцезнаходженням
цього символу визначається фактична
довжина рядка. Кількість елементів
у такому масиві на 1 більше за зображення
рядка (рис. 8.1).
A | \0 | A | |
“A”
рядок(2байти) |
‘A’
символ (1байт) |
Рис.
8.1.
Рядок розміщується у масиві або за допомогою операції вводу з клавіатури, або за допомогою ініціалізації.
Приклади:
char s1[10]="string1"; // масив символів з десяти елементів
char
s3[]={‘s’,’t’,’a’,‘r’,’t’,’\0’
сhar *s4="string4"; // вказівник-змінна на рядок
char *s=”String5”; // виділяється 8 байтів для рядка
char *sss=new char[10]; /* виділяється динамічна пам’ять
під 10 елементів типу char*/
strcpy(sss,”Thanks”);//
у цю область пам’яті
2.3.2. Функції вводу/виводу при роботі з рядками
Для вводу і виводу символьних даних у бібліотеці мови С (файл <stdio.h>) визначені наступні функції:
int getchar() - здійснює введення одного символу з вхідного потоку і повертає один байт інформації (символ) у вигляді значення типу int. Це робиться для розпізнавання ситуації, коли при зчитуванні буде досягнуто кінець файлу.
int putchar (int c) – розміщує в стандартний вихідний потік символ c.
Приклад:
# include <stdio.h>
void main()
{char c, d;
c=getchar(); putchar(c);
d=getchar(); putchar(d);
}
char* gets(char*s) – зчитує рядок s із стандартного потоку до появи символу ‘\n’, сам символ ‘\n’ у рядок не заноситься. Повертає вказівник на цей рядок.
int puts(const char* s) – записує рядок у стандартний потік виводу, додаючи в кінці рядка символ ‘\n’, у випадку вдалого завершення повертає значення більше або рівне 0 і від’ємне значення у випадку помилки.
Також
для вводу/виводу рядка можна
використовувати функції scanf/
# include <stdio.h>
void main(){
const int n=10;
char s[n];
scanf(“%s”, s); printf(“%s”, s);}
Ім’я масиву є вказівником-константою на початок рядка, тому не слід застосовувати операцію взяття адреси (&), що зазвичай використовується з функцією вводу scanf. Ввід буде здійснюватися до першого символу пропуску. Для того щоб ввести рядок, який складається з декількох слів, використовується специфікатор %c (символи) із зазначенням у ньому максимальної кількості символів, що вводяться, наприклад:
scanf(“%10c”, s);
При виводі рядка на екран можна в специфікації %s зазначити кількість символів, які відводяться під рядок:
printf(“%15s”, s);
Функції вводу/виводу мови С++, описані у заголовному файлі <iostream.h>:
cin>>s; //ввід рядка зі стандартного потоку до появи першого пропуску.
При введенні, наприклад, рядка “Ваня Іванов” в рядок s буде записано лише перше слово рядка, а саме “Ваня\0”.
cout<<s; //вивід рядка в стандартний потік до першого пропуску.
Якщо потрібно ввести рядок, який складається з декількох слів, в одну рядкову змінну, використовують методи getline або get класу istream, об’єктом якого є cin. Виклик цього методу здійснюється наступним чином: після імені об’єкту cin ставиться крапка, за якою записується ім’я методу:
#include<iostream.h>
int main()
{const in n=80;
char s[n];
cin.getline(s, n); cout<<s<<endl;
cin.get(s, n); cout<< s}
Метод getline зчитує з вхідного потоку n-1 символів або менше (якщо символ переводу рядка зустрінеться раніше) і записує їх у рядкову змінну s. Символ переводу рядка також зчитується (видаляється) з вхідного потоку, але не записується у рядкову змінну, замість нього розміщується завершальний ’\0’. Якщо в рядку вихідних даних більше за n-1 символів, наступне введення буде виконуватися з того ж рядка, починаючи з першого символу, що не був зчитаний.