
- •Лекция №10 Тема: Строки.
- •Функции работы со строками из библиотеки обработки строк
- •Пример 4.
- •Пример 5
- •Пример на многомерные динамические массивы
- •Указатели на функции
- •Пример №1
- •Результат выполнения программы:
- •Пример №2
- •Результат выполнения программы
- •Пример №3
- •Результаты выполнения программы
Пример 4.
Задача. Дана строка символов, подсчитать сколько раз среди символов строки встречается буква x.
#include <iostream.h>
void main( void )
{
char str[100]; // объявление строки символов
cout<<"\nVvedite stroky: "; // просим пользователя ввести строку символов
cin >> str; // считываем строку, введенную пользователем
int count = 0; /* объявление переменной-счетчика, в которой
будем хранить количество вхождений х в строку */
int i = 0;
while(str[i]!='\0')
{
if (str[i]=='x') count++;
i++;
}
cout<<"\n Simvol x vxodit v stroky –"<<count; // выводим результат на экран
}
Пример 5
Задача. Написать программу, которая получает от пользователя набор символов, исключая пробел, и удаляет из этого набора все вхождения символов S и s.
Наибольший интерес представляет анализ строки. Для реализации этого анализа нужно поэлементно двигаться от нулевого индекса массива к последнему и делать проверку каждого элемента. Если будет встречен такой элемент с индексом i, то нам нужно сместить все элементы с индексами, большими чем i, на один индекс меньше. Другими словами:
Пускай дана следующая строка: A b s D e f
0 1 2 3 4 5 ------ индексы
Проверяя поиндексно каждый элемент массива, видим, что 2 элемент массива и есть искомый символ. Тогда, нужно сместить каждый элемент массива на 1 индекс меньше, т.е. получить следующий результат: A b D e f
0 1 2 3 4
#include <iostream.h>
void main()
{
const int CharCount=10; //зададим размерность массива через константу
char arr[CharCount]; //объявление символьного массива
//Предупредим пользователя, что ввод ограничен размерностью массива
cout<<"\nVvedite stroky, no ne bolee, chem "<<CharCount-1<<" simvolov\n";
cin >> arr; // ввод строки
int i=0;
while (arr[i]!='\0') //Цикл работает пока не встретится признак конца строки
if (arr[i]=='S'||arr[i]=='s') //Проверка на наличие искомого символа
{ /*Если это искомый символ, то перенесем оставшуюся часть строки
на один элемент левее.*/
for (int j=i;arr[j]!='\0';j++)
arr[j]=arr[j+1];
}
else i++; //а если это не искомый символ, то будем двигаться по строке дальше
cout<<endl<<arr<<endl; //вывести результат
}
Замечание к задаче. Как Вы думаете, что произойдет, если в программу ввести строку содержащую пробелы (т.е. нарушить условия задачи)?
Пример 6
Задача. Написать программу сравнения двух строк.
Перед тем как перейти непосредственно к программе, сделаем примечание. В некоторых случаях желательно вводить в массив полную строку текста. С этой целью C++ снабжен функцией cin.getline(s). Функция cin.getline(s) требует три аргумента – массив символов, в котором должна храниться строка текста, длина и символ ограничитель. Например, фрагмент программы
char sentence[80];
cin.getline(sentence, 80, '\n');
объявляет массив sentence из 80 символов, затем считывает строку текста с клавиатуры в этот массив. Функция прекращает считывание символов в случаях, если встречается символ-ограничитель '\n', если вводится указатель конца файла или если количество считанных символов оказывается на один меньше, чем указано во втором аргументе (последний символ в массиве резервируется для завершающего нулевого символа). Если встречается символ ограничитель, он считывается и отбрасывается. Третий аргумент cin.getline(s) имеет '\n' в качестве значения по умолчанию, так что предыдущий вызов функции мог быть написан в следующем виде:
cin.getline(sentence, 80);
#include<iostream.h>
#include<string.h>
void main()
{
int len; // длина вводимой строки
char s[81]; // место хранения вводимой строки
char *s1,*s2;
cout<<"Vvedite pervyyu stroky: ";
cin.getline(s, 80); // ввод первой строки
len = strlen(s); // определение длины строки
s1 = new char[ len + 1]; // динамическое выделение памяти под строку s1
strcpy(s1, s); // копирование введенной строки в строку s1
cout<<" Vvedite vtoryyu stroky: ";
cin.getline(s, 80); // ввод второй строки
len = strlen(s);
s2 = new char[len + 1]; // динамическое выделение памяти под строку s2
strcpy(s2, s);
// какая из введенных строк больше?
if(strcmp(s1, s2) > 0)
cout<<"Stroka s1:\t"<<s1<<"\n\t > \n"
<< "Stroka s2:\t"<<s2<<endl;
else if (strcmp(s1, s2) == 0)
cout<<"String s1:\t"<<s1<<"\n\t=\n"
<<"String s2:\t"<<s2<<endl;
else
cout<<"String s1:\t"<<s1<<"\n\t < \n"
<<"String s2:\t"
<<s2<<endl;
delete []s1; // удаление строк из памяти
delete []s2;
}
Пример
/*Рассмотрим такую задачу: необходимо реализовать следующие функции для работы
с массивами.
1) Функция ввода элементов массива;
2) Функция распечатки массива;
3) Функция сортировки массива;
4) Функция добавления нового элемента в конец массива;
5) Функция удаления заданного элемента.
Для данной задачи были использованы материалы текущего урока, а именно:
передача массивов в функцию, передача параметров по ссылке (чтобы изменялись
реальные данные), возврат указателя из функции.
Все данные функции часто применимы в реальной жизни, например, при создании
всевозможных справочников.*/
#include <iostream.h>
int* Add(int*, int&); // Функция добавления элемента в конец массива
int* Del(int*, int&); // Функция удаления элемента в заданной позиции
void Input(int*, int);// Функция ввода элементов массива
void Sort(int*, int); // Функция сортировки элементов массива
void Print(int*, int);// Функция распечатки элементов массива
void main() // Пример реализации
{
int n, *a;
cout<<"Vvedite razmer massiva:\t";
cin >> n; // Количество элементов массива
a = new int[n]; // Выделение памяти для массива из n элементов
Input(a, n); // Ввод элементов массива
cout<<"\nArray:\n";
Print(a, n); // Вывод массива на экран
Sort(a, n); // Сортировка массива
cout<<"Otsortirovannuj massiv:\n";
Print(a, n); // Вывод отсортированного массива на экран
a = Add(a, n); // Изменение массива - добавление нового элемента
cout<<"Novuj massiv:\n";
Print(a, n); // Вывод измененного массива
a = Del(a, n); // Изменение массива - удаление указанного элемента
cout<<" Novuj massiv:\n";
Print(a, n); // Вывод измененного массива
delete [] a; // Высвобождение памяти, отведенной под массив
}
void Input(int *a, int n)
{
for(int i = 0; i < n; i++)
{
cout<<"Element #"<<i + 1<<"\t";
cin >> a[i]; // Ввод элементов массива
}
}
void Print(int *a, int n)
{
for(int i = 0; i < n; i++)
cout<<a[i]<<" ";
cout<<endl; // Вывод элементов массива
}
void Sort(int *a, int n)
{
int temp; // Временная переменная для обмена значений
bool flag = true;// Флаг окончания сортировки
for(int j = 1; ; j++)
{
for(int i = 0; i < n - j; i++)
if(a[i] > a[i+1])
{
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
flag = false;
}
if(flag == true)
break;
flag = true;
}
}
int* Add(int *a, int &n)
{
int i, m;
int *p = new int[++n]; // Создание временного массива большего размера
cout<<"Vvedite dobavlyaemuj element:\t";
cin >> m; // Добавляемый элемент
for(i = 0; i < n - 1; i++)
p[i] = a[i]; // Сохранение элементов
delete [] a; // Удаление старого массива
p[n - 1] = m; // Новый элемент
return p; // Возвращение адреса нового массива
}
int* Del(int* a, int &n)
{
int i, m, j = 0;
n--; // Уменьшение размерности массива
int *p = new int[n]; // Создание временного массива меньшего размера
cout<<"Element s kakim indeksom ydalim:\t";
cin >> m; // Ввод индекса удаляемого элемента (индекс с нуля)
for(i = 0; i < n; i++)
{
if(i == m)
j = 1;
p[i] = a[i+j]; // Сохранение элементов, не учитывая указанный
}
delete [] a; // Удаление массива
return p; // Возвращение адреса нового массива