Методів обробка рядкових масивів даних

Автор: Пользователь скрыл имя, 20 Сентября 2011 в 10:17, курсовая работа

Описание работы

Об’єкт дослідження – обробка одновимірних масивів.

Предметом дослідження – обробка рядкових масивів даних.

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

Работа содержит 1 файл

курсовая по информатике.doc

— 192.00 Кб (Скачать)

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

   Так само, як і в Сі, можливості бібліотек активізуються використанням директиви #include для включення стандартних файлів. Всього в стандарті С++ визначено 50 таких файлів.

    STL до включення в стандарт  С++ була сторонньою розробкою,  на початку — фірми HP, а потім  SGI. Стандарт мови не називає її «STL», оскільки ця бібліотека стала невід'ємною частиною мови, проте багато людей до цих пір використовують цю назву, щоб відрізняти її від решти частини стандартної бібліотеки (потоки введення/виводу (Iostream), підрозділ Сі тощо). Проект під назвою STLport, заснований на SGI STL, здійснює постійне оновлення STL, IОstream і рядкових класів. Деякі інші проекти також займаються розробкою приватних застосувань стандартної бібліотеки для різних конструкторських завдань. Кожен виробник компіляторів Сі++ обов'язково поставляє якусь реалізацію цієї бібліотеки, оскільки вона є дуже важливою частиною стандарту і широко використовується.

    1.5. Нові можливості в порівнянні з Сі 

   Мова  С++ багато в чому є надмножиною  Сі. Нові можливості С++ включають оголошення у вигляді виразів, перетворення типів у вигляді функцій, оператори new і delete, тип bool, посилання, розширене поняття константності, функції, що підставляються, аргументи за умовчанням, перевизначення, простори імен, класи (включаючи і всі пов'язані з класами можливості, такі як успадкування, функції-члени (методи), віртуальні функції, абстрактні класи і конструктори), перевизначення операторів, шаблони, оператор ::, обробку винятків, динамічну ідентифікацію і багато що інше. Мова С++ також у багатьох випадках строго відноситься до перевірки типів, порівняно з Сі.

   У С++ з'явилися коментарі у вигляді  подвійної косої риски («//»), які  були в попереднику Сі — мові BCPL.

   Деякі особливості С++ пізніше були перенесені в Сі, наприклад ключові слова const і inline, оголошення в циклах for і коментарі в стилі С++ («//»). У пізніших реалізаціях Сі також були представлені можливості, яких немає в С++, наприклад макроси vararg і покращена робота з масивами-параметрами. 

    1.6. Об'єктно-орієнтовані особливості мови С++ 

   С++ додає до Сі об'єктно-орієнтовані  можливості. Він вводить класи, які  забезпечують три найважливіші властивості  ООП: інкапсуляцію, успадкування і поліморфізм.

   Проблеми  старого підходу

   В мові C основним способом організації  даних були структури. Структура складається з набору полів, які ніяк не захищені. Якщо елементи структури мають змінну довжину, їх представляють у вигляді вказівників. Виділення і звільнення пам'яті під ці вказівники робляться вручну. Так, наприклад, одновимірний масив змінної довжини в мові C з перевіркою меж може представлятися таким чином:

   struct Array {

       double* val;

       int len;

   };

    

   void FreeArray (const struct Array*);

   void AllocArray (const struct Array*, int len);

   double Elem (const struct Array*, int i);

   void ChangeElem (const struct Array*, int i, double x );

 

   Така  реалізація небезпечна і неефективна  з багатьох причин:

  • Необхідно викликати FreeArray і AllocArray. Програміст може забути викликати одну з цих функцій, або викликати її дуже рано/запізно, або двічі, або з вказівником на неправильний масив. Все це приводить до помилок, що важко виявити.
  • Функції Elem і ChangeElem повільні.
  • Немає ніякого способу перешкодити програмістам створювати і інші функції для роботи із структурою Array. Ці функції можуть робити з полями len і val будь-що.
  • Немає ніякого способу перешкодити програмістам безпосередньо міняти поля len і val.
  • Присвоєння об'єктів типу struct Array приведе до того, що їх поля val указуватимуть на одну і ту ж область пам'яті. Немає ніякого способу ні заборонити присвоєння, ні змінити таку поведінку.

   Мова  Сі++, використовуючи ООП, усуває всі  ці проблеми.

    1.7. Не об'єктно-орієнтовані можливості мови С++ 

   В цьому розділі описуються можливості, безпосередньо не пов'язані з  об'єктно-орієнтованим програмуванням (ООП). Багато які з них, проте, особливо важливі у поєднанні з ООП.

  • Ключове слово inline означає, що функція є хорошим кандидатом на оптимізацію, при якій в місцях звернення до функції компілятор вставить тіло цієї функції, а не код виклику. Приклад: inline double Sqr(double x) {return x*x;}
  • Замість функцій malloc і free, введені нові оператори new і delete. Якщо T — довільний тип, то
  • new T виділяє пам'ять, достатню для розміщення одного об'єкту типу Т; після завершення виклику оператора, компілятор здійснює ініціалізацію об'єкта (викликаючи його конструктор, якщо такий був визначний) і повертає вказівник типу Т*.
  • new T[n] виділяє пам'ять, достатню для розміщення n об'єктів типу Т; після завершення виклику оператора, компілятор здійснює ініціалізацію кожного з n об'єктів і повертає вказівник типу Т*.
  • delete p — звільняє пам'ять, на яку посилається вказівник p, виділену для нього раніше операцією new T. Деініціалізація об'єкту (викликаючи деструктора) забезпечується компілятором ще до виклику оператора delete.
  • delete [] p — звільняє область пам'яті, виділену для цього масиву раніше операцією new T[n]. Деініціалізація кожного елементу масиву забезпечується компілятором ще до виклику оператора.

   Як  видно, однією з принципових відмінностей операторів new та delete від своїх попередників, malloc і free, є обов'язковість ініціалізації об'єктів, пам'ять під які було призначено. Іншою відмінністю є те, що загальна реалізація (тобто визначена за умовчанням) оператора new не повертає нулеву вартість вказівника в випадку помилки призначення пам'яті (наприклад з причини її браку). Натомість, new кидає виняток (наприклад, std::bad_alloc в ситуації браку пам'яті). Так само як і для free, якщо вартістю аргументу оператора delete є 0, ані звільнення пам'яті, ані деініціація не відбувається (при тому, подібна ситуація не вважається помилковою).

  • Функції можуть приймати аргументи за посиланням. Наприклад, функція void f(int& x) {x=3;} присвоює своєму аргументу значення 3. Функції також можуть повертати результат за посиланням, і посилання можуть бути поза всяким зв'язком з функціями. Наприклад, {double&b=a[3]; b=sin(b);} еквівалентно а[3]=sin(а[3]);. Посилання певною мірою схожі з вказівниками, з наступними особливостями: при описі посилання ініціалізувалися вказівкою на існуюче значення даного типу; посилання довічно указує на одну і ту ж адресу; при зверненні до посилання операція читання пам'яті за адресою посилання проводиться автоматично. На відміну від вказівників, посилання не може бути константним саме по собі, однак може посилатися на константний об'єкт. Наприклад, int const & const ref = a[3]; на відміну від int const * const ref = &a[3]; — є некоректним, з точки зору С++, виразом; в свою чергу, і int const & ref = a[3];, і int const * ref = &a[3]; — є цілком прийнятними.
  • Можуть бути декілька функцій з одним і тим же ім'ям, але різними типами або кількістю аргументів (перевантаження функцій; при цьому тип значення, що повертається, на перевантаження не впливає). Наприклад, цілком можна писати:
   void Print(int x);

   void Print(double x);

   void Print(int x, int y);

 
   
  • Один або  декілька останніх аргументів функції  можуть задаватися за умовчанням. Наприклад, якщо функція описана як void f(int x, int y=5, int z=10), виклики f(1), f(1,5) і f(1,5,10) еквівалентні.
  • При описі функцій відсутність аргументів в дужках означає, на відміну від Сі, що аргументів немає, а не те, що вони невідомі. Якщо аргументи невідомі, треба користуватися багатокрапкою, наприклад int printf(const char* fmt …). Тип першого аргументу повинен бути заданий.
  • Можна описувати оператори над новими типами. Наприклад, так:
   struct Date {int day, month, year;};

   void operator ++(struct Date& date);

 

   Оператори нічим не відрізняються від (інших) функцій. Не можна описувати оператори  над зумовленими типами (скажімо, перевизначати множення чисел); не можна вигадувати нові операції, яких немає в С++ (скажімо **); арність (кількість параметрів) і пріоритет операцій зберігається (скажімо, у виразі a+b*c спочатку виконуватиметься множення, а потім складання, до яких би типів не належали а, b і с.) Можна перевизначити оператор [] (з одним параметром) і () (з будь-яким числом параметрів).

  • Додані простори імен namespace. Наприклад, якщо написати
   namespace Foo {

      const int x=5;

      typedef int** T;

      void f(y) {return y*x};

      double g(T);

      ...

   }

   то  поза фігурними дужками ми повинні  звертатися до T, x, f, g як Foo::T, Foo::x, Foo::f, Foo::g. Якщо ми в якійсь одиниці трансляції (файл основного коду, наприклад myFile.cpp, та всі заголовкові файли що він  включає) хочемо звертатися до них безпосередньо, ми можемо написати

   using namespace Foo;

   Або ж

   using Foo::T;

   Також можна створити синонім на вже  існуючий простір імен (наприклад, аби  уникнути постійно повторювати довгу  назву простору)

   namespace MyVeryOwnNameSpace {

      typedef std::vector< std::string > StringTable;

   }

   namespace My = MyVeryOwnNameSpace;

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

   namespace {

      ...

   }

   Всі імена, описані в ньому, доступні в поточній одиниці трансляції і  більше ніде, неначебто ми до кожного  опису приписали static.

  • Доданий новий тип bool, що має значення true і false. Операції порівняння повертають тип bool. Вирази в дужках після if, while приводяться до типу bool.
  • // означає, що вся частина рядка, що залишилася, є коментарем.
  • Додані шаблони (template). Наприклад, template<class T> T Min(T x, T у) {return x<y?x:y;} визначає функцію Min для будь-яких типів. Шаблони можуть задавати не тільки функції, але і типи. Наприклад, template<class T> struct Array{int len; T* val;}; визначає масив значень будь-якого типу, після чого ми можемо писати Array<float> x;
  • Введена стандартна бібліотека шаблонів (STL, англ. Standard Template Library), що визначає шаблони і функції для векторів (одновимірних масивів довільної довжини), множин, асоціативних масивів (map), списків, символьних рядків, потоків введення-виводу і інші шаблони і функції.
  • Якщо описана структура, клас (про класи див. нижче), об'єднання (union) або перерахування (enum), її ім'я є ім'ям типу, наприклад:
   struct Time{int hh,mm,ss;};

   Time t1, t2;

  • Усередині структури або класу можна описувати нові типи, як через typedef, так і через опис інших структур або класів. Для доступу до таких типів поза структурою або класу, до імені типу додається ім'я структури і дві двокрапки:
   struct S {typedef int** T; T x;}; S::T у;
 

    1.8. Майбутній розвиток мови С++

   С++ продовжує розвиватися, щоб відповідати сучасним вимогам. Одна з груп, що займаються мовою С++ в його сучасному вигляді і що направляють комітету із стандартизації С++ поради з його поліпшення, — це Boost. Наприклад, один з напрямів діяльності цієї групи — вдосконалення можливостей мови шляхом додавання в нього особливостей метапрограмування.

   Стандарт  С++ не описує способи іменування об'єктів, деякі деталі обробки винятків і  інші можливості, пов'язані з деталями реалізації, що робить несумісним об'єктний код, створений різними компіляторами. Проте для цього третіми особами створена безліч стандартів для конкретної архітектури і операційних систем.

   Проте (за станом на час написання цієї статті) серед компіляторів Сі++ все  ще продовжується битва за повну  реалізацію стандарту Сі++, особливо в області шаблонів — частини мови, зовсім недавно повністю розробленій комітетом стандартизації.

Информация о работе Методів обробка рядкових масивів даних