Лекции по C++
Прототип функции strnicmp :
int strnicmp(const char *strl, const char *str2, size_t num);
Функция сравнивает первые num символов строк strl и str2, не делая
различия в регистре символов. Возвращает в качестве результата сравнения
целую величину:
< 0 когда strl меньше, чем str2;
= 0 когда strl равна str2;
> 0 когда strl больше, чем str2.
Пример
char string1[] = "Borland C++";
char string2[] = "BORLAND Pascal";
i = strnicmp(string1, string2, 7);
В последнем операторе переменной i присваивается значение 0, так как
подстрока "Borland" отличается в этих строках только регистром.
Рассмотрим пример программы, в которой применяются функции сравнения строк.
Программа из листинга 5 объявляет массив строк и присваивает им значения.
Затем программа выводит исходный массив, сортирует его и выводит значения
строк отсортированного массива. |
(см. List7_5.cpp - Исходный текст программы STRING2.CPP)
Преобразование строк
Функция strlwr
Прототип функции strlwr:
char* strlwr (char *source)
Функция преобразует символы верхнего регистра в символы нижнего регистра в
строке source. Другие символы не затрагиваются. Функция возвращает
указатель на строку source.
Пример
char str[] = "HELLO THERE";
strlwr(str);
Переменная str теперь содержит строку "hello there".
Функция strupr
Прототип функции strupr:
char* strupr(char *source)
Функция преобразует символы нижнего регистра в символы верхнего регистра в
строке source. Другие символы не затрагиваются. Функция возвращает
указатель на строку source.
Пример
char str[] = "Borland C++";
strupr(str);
Переменная str теперь содержит строку "BORLAND С ++".
Обращение строк
Библиотека STRING.H предлагает функцию strrev для записи символов в строке
в обратном порядке.
Функция strrev
Прототип функции strrev:
char* strrev(char *str)
Функция обращает порядок символов в строке str и возвращает указатель на
строку str. char str[] = "Hello";
strrev(str) ;
cout « str;
Будет выведено "olleH".
Рассмотрим программу, которая манипулирует символами в строке.
List7_6.cpp показывает исходный текст программы STRING3.CPP. Программа
выполняет следующие задачи:
. Запрашивает у вас ввод строки
. Отображает ваш ввод
. Выводит вашу строку в нижнем регистре
. Выводит вашу строку в верхнем регистре
. Отображает символы, которые вы ввели, в обратном порядке
. Выводит сообщение, что ваш ввод не содержит символов верхнего регистра,
если это так
. Выводит сообщение, что ваш ввод не содержит символов в нижнем регистре,
если это так
. Выводит сообщение, что ваша строка симметрична, если это так
Поиск символов
Библиотека STRING.H предлагает ряд функций для поиска символов в строках.
Это функции strchr, strrchr, strspn, strcspn и strpbrk. Они осуществляют
поиск в строках символов и простых символьных шаблонов.
Функция strchr
Функция strchr определяет первое вхождение символа в строку.
Прототип функции strchr:
char* strchr(const char *target, int c)
Функция находит первое вхождение символа с в строку target. Функция
возвращает указатель на символ в строке target, который соответствует
заданному образцу с. Если символ с в строке не обнаруживается, функция
возвращает 0.
Пример
char str[81] = "Borland C++";
char *strPtr;
strPtr = strchr(str, '+');
Указатель strPtr теперь содержит адрес подстроки "++" в строке str.
Функция strrchr
Функция strrchr определяет последнее вхождение символа в строке.
Прототип функции strrchr:
char* strrchr(const char *target, int c)
Функция находит последнее вхождение символа с в строку target. Функция
возвращает указатель на символ в строке target, который соответствует
заданному образцу с. Если символ с в строке не обнаруживается, функция
возвращает 0.
Пример
char str[81] = "Borland C++ is here";
char* strPtr;
strPtr = strrchr(str, '+');
Указатель strPtr теперь указывает на подстроку "+ is here " в строке str.
Функция Strspn
Функция strspn возвращает число символов с начала строки, совпадающих с
любым символом из шаблона.
Прототип для функции strspn:
size_t strspn(const char *target, const char *pattern)
Функция strspn возвращает число символов от начала строки target,
совпадающих с любым символом из шаблона pattern.
Пример
char str[] = "Borland C++ 5";
char substr[] = "narlBod";
int index;
index = strspn(str, substr);
Этот оператор присваивает 8 переменной index, потому что первые восемь
символов из str содержатся в подстроке substr.
Функция strcspn
Функция strcspn просматривает строку и выдает число первых символов в
строке, которые не содержатся в шаблоне.
Прототип функции strcspn:
size_t strcspn(const char* str1, const char* str2)
Функция strcspn просматривает строку str1 и выдает длину подстроки,
отсчитываемой с начала строки, символы которой полностью отсутствуют в
строке str2.
Пример
char strng[] = "The rain in Spain";
int i = strcspn(strng, " in");
Этот пример возвращает 3 (расположение первого пробела в строке strng)
переменной i.
Функция strpbrk
Функция strpbrk просматривает строку и определяет первое вхождение любого
символа из образца.
Прототип функции strpbrk:
char* strpbrk(const char* target, const char* pattern)
Функция strpbrk ищет в строке target первое вхождение любого символа из
образца pattern. Если символы из образца не содержатся в строке, функция
возвращает 0.
Пример
char *str = "Hello there how are you";
char *substr = "hr";
char *ptr;
ptr = strpbrk(str, substr);
cout « ptr « endl;
Вы увидите на экране строку "here how are you", потому что 'h' встречается
в строке str раньше, чем 'r'.
Поиск строк
Библиотека функций STRING.H предлагает для поиска подстроки в строке
функцию strstr.
Функция strstr
Прототип функции strstr:
char* strstr(const char *str, const char *substr);
Функция ищет в строке str первое вхождение подстроки substr. Функция
возвращает указатель на первый символ найденной в строке str подстроки
substr. Если строка substr не обнаружена в строке str, функция возвращает
0.
Пример
char str[] = "Hello there! how are you";
char substr[] = "how";
char *ptr;
ptr = strstr (str, substr);
cout « ptr « endl ;
Это приведет к выводу строки "how are you", поскольку в строке str ,
была обнаружена подстрока "how". Указатель ptr содержит адрес остатка
первоначальной строки, начинающегося с подстроки "how".
Функция strtok
Библиотека функций для работы со строками имеет функцию strtok, которая
дает вам возможность разбить строку на подстроки на основании заданного
набора символов-ограничителей.
Подстроки иногда называются лексемами.
Прототип функции strtok:
char* strtok(char *target, const char * delimiters);
Функция разбивает строку на лексемы, согласно символам-ограничителям,
заданным в параметре delimeters. В следующем примере показано, как работать
с этой функцией и как получать лексемы, на которые была разбита строка.
Функция strtok вводит символ '\0' после каждой лексемы. (Опять же не
забудьте сохранить копию вашей строки в другой строковой переменной.)
Пример
#include // см. файл Ex02.cpp
#include
int main()
{
char *str = "(Base_Cost + Profit) * Margin";
char *tkn = "+*()";
char *ptr = str;
printf("%s\n", str);
// Первый вызов функции
ptr = strtok(str, tkn);
printf("Лексемы этой строки: %s", ptr);
while (ptr)
{
// Первый аргумент должен быть равен нулю
if ((ptr = strtok(0, tkn)) != 0)
printf (",%s", ptr);
}
printf("\n");
return 0;
}
В результате выполнения этой программы на экран выводятся следующие строки:
(Base_Cost + Profit) * Margin
Лексемы этой строки: Base_Cost, Profit, Margin
Рассмотрим пример программы поиска символов и строк. Листинг 7
(List7_7.cpp) содержит исходный текст программы STRING4.CPP. Программа
выполняет следующие задачи:
. Запрашивает у вас ввод основной строки
. Запрашивает строку поиска
. Предлагает вам ввести символ поиска
. Выводит линейку цифр и основную строку
. Выводит номер символа в основной строке, с которого начинается строка
поиска *
. Выводит номер символа в основной строке, совпавшего с символом поиска.
Основы объектно-ориентированного программирования СИНТАКСИС ОСНОВНЫХ
КОНСТРУКЦИЙ
Объявление базовых классов
В С++ мы имеем возможность объявлять классы, которые инкапсулируют
элементы-данные и функции-элементы. Эти функции изменяют и позволяют
обращаться к значениям данных-элементов и выполняют другие задачи.
Базовый класс
Базовый класс определяется следующим образом (синтаксис):
class className
{
private:
protected:
public:
};
Пример 1:
class point
{
protected:
double х;
double у;
public:
point(double xVal, double yVal);
double getX();
double getY();
void assign(double xVal, double yVal);
point& assign(point &pt);
};
Разделы класса
Классы С++ имеют три различных уровня доступа к своим элементам - как к
данным, так и к функциям:
- Закрытые (частные) элементы
- Защищенные элементы
- Открытые элементы
К данным в закрытом разделе имеют доступ только функции-элементы
класса.
Классам-потомкам запрещен доступ к закрытым данным своих 6азовых
классов.
К данным в защищенной секции имеют доступ функции-элементы класса и
классов-потомков. Данные из открытой секции находятся в области видимости
функций-элементов класса, функций-элементов классов-потомков, и вообще
доступны кому угодно.
Существуют следующие правила для разделов класса:
1. Разделы могут появляться в любом порядке.
2. Один и тот же раздел можно определять несколько раз.
3. Если не определен ни один раздел, компилятор (по умолчанию) объявляет
все элементы закрытыми.
4. Помещать данные-элементы в открытый раздел следует только в том случае,
если в этом есть необходимость, например, если это упрощает вашу задачу.
Обычно элементы-данные помещаются в защищенный раздел, чтобы к ним
имели доступ функции-элементы классов-потомков.
5. Используйте для изменения значений данных и доступа к ним функции-
элементы. При использовании функции вы можете осуществлять проверку
данных и, если нужно, изменять другие данные.
6. Класс может иметь несколько конструкторов.
7. Класс может иметь только один деструктор, который должен объявляться в
открытом разделе класса.
8. Функции-элементы (в том числе конструкторы и деструкторы), состоящие из
нескольких операторов, должны определяться вне объявления класса.
Определение функции может содержаться в том же файле, в котором
определяется класс. Это напоминает порядок работы с обычными функциями:
задание прототипа и определение функции.
Конструкторы являются специфическим типом функций-элементов, тип
возвращаемого значения для которых не указывается, а имя должно совпадать с
именем класса-хозяина. Вызываются они при создании нового представителя
класса. Деструктор вызывается для разрушения представителя класса.
При определении функции-элемента вы должны указать ее имя и имя ее
класса. Сначала вы должны Сначала необходимо указать имя класса (т.н.
квалификатор), а затем, через два двоеточия (::), имя функции. В качестве
примера рассмотрим такой класс:
class point
{
protected:
double x;
double y;
public:
point(double xVal, double yVal);
double getX();
// другие функции-элементы
};
Определения конструктора и функций-элементов должны выглядеть так
point::point (double xVal, double yVal)
{
// операторы
}
double point::getX()
{
// операторы
}
После того, как вы объявили класс, вы можете использовать имя класса в
качестве спецификатора типа данных при объявлении представителей класса.
Синтаксис объявления тот же, что и при объявлении переменной.
В листинге 8.1 приведен исходный текст программы RECT.CPP. Программа
предлагает вам ввести длину и ширину прямоугольника (в данном примере
прямоугольник является объектом). Затем программа выводит значения длины,
ширины и площади определенного вами прямоугольника.
Конструкторы
Конструкторы и деструкторы в С++ вызываются автоматически, что
гарантирует правильное создание и разрушение объектов класса.
Общий вид (синтаксис) объявления конструктора:
class className
{
public:
className(); // конструктор по умолчанию
className(const className &c); // конструктор копии
className(); // остальные конструкторы
};
Пример 2:
// Замечание: Здесь только объявление класса без описания объявленных
// функций-параметров
class point
{
protected:
double x;
double y;
public:
point();
point(double xVal, double yVal);
point(const point &pt);
double getX();
double getY();
void assign(double xVal, double yVal);
point& assign(point &pt);
};
int main()
{
point p1;
point p2(10, 20);
point p3(p2);
p1.assign(p2);
cout ] parentClass
{
private:
protected:
public:
};
Пример 4 объявления класса Rectangle и класса-потомка Box:
class Rectangle
{
protected:
double length;
double width;
public:
Rectangle(double len, double wide);
double getLength() const;
double getWidth() const;
double assign(double len, double wide);
double calcArea();
};
class Вох : public Rectangle
{
protected:
double height;
public:
Box(double len, double wide, double height);
double getHeight () const;
assign(double len, double wide, double height);
double calcVolume();
};
(см. LIST8-3.CPP)
Виртуальные функции
Мы уже упоминали о полиморфизме - важной особенности объектно-
ориентированного программирования. Рассмотрим следующий пример (6):
#include
class X
{
public:
double A(double x) { return x * x; }
double B(double x) { return A(x) / 2; }
};
class Y : public X
{
public:
double A(double x) { return x * x * x; }
};
int main ()
{
Y y;
cout );
};
class className2 : public className1
{
// функции-элементы
virtual returnType functionName();
};
Пример 7, показывающий, как при помощи виртуальных функций можно
реализовать полиморфное поведение классов X и Y:
#include
class X
{
public:
virtual double A(double x) { return x * x; }
double B (double x) { return A(x) / 2; }
};
class Y : public X
{
public:
virtual double A(double x) { return x * x * x; }
};
main()
{
Y y;
cout
class A
{
public:
A() {}
virtual void foo(char c)
{ cout );
};
Пример 9:
class String
{
protected:
char *str;
int len;
public:
String();
~String();
// другие функции-элементы
friend String& append(String &str1, String &str2);
friend String& append(const char* str1, String &str2);
friend String& append(String &str1, const char* str2);
};
Дружественные функции могут решать задачи, которые при помощи
функций-элементов решаются с трудом, неуклюже или не могут быть решены
вообще.
Рассмотрим простой пример использования дружественных функций. Текст
программы FRIEND.CPP представлен в листинге 8.5. Программа следит за
памятью, отведенной для хранения массива символов. Эта программа - первый
шаг к созданию класса string.
Операции и дружественные операции
Последняя программа использовала функции-элементы и дружественную
функцию, которые реализовали действия, выполняемые в стандартных типах с
помощью операций вроде = и +. Подход типичен для языков C и Pascal, потому
что эти языки не поддерживают определяемые пользователем операции. В
отличии от них C++ позволяет вам объявлять операции и дружественные
операции. Эти операции включают в себя: +, -, *, /, %, ==, !=, =,
>, +=, -=, *=, /=, %=, [],
(), >. Обратитесь к описанию языка C++, где обсуждаются детали
определения этих операций. С++ трактует операции и дружественные операции
как специальный тип функций-элементов и дружественных функций.
Общий синтаксис для объявления операций и дружественных операций:
class className
{
public:
// конструкторы и деструктор
// функции-элементы
// унарная операция
returnType operator operatorSymbol();
// бинарная операция
returnType operator operatorSymbol(operand);
// унарная дружественная операция
friend returnType operator operatorSymbol(operand);
// бинарная дружественная операция
friend returnType operator operatorSymbol(firstOperand, secondOperand);
};
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
|