- •Введение
- •Структура программы на языке Си
- •Директивы препроцессора
- •Константы
- •Переменные
- •Арифметические выражения
- •Операция присваивания
- •Ввод информации с клавиатуры и вывод на экран
- •Логические выражения
- •Операторы управления
- •Оператор условного перехода if
- •Оператор выбора варианта
- •Перечисляемый тип данных
- •Циклы
- •Оператор цикла while
- •Оператор цикла do-while
- •Оператор цикла for
- •Локальные и глобальные переменные
- •Переменные с индексами (массивы)
- •Примеры обработки одномерных массивов
- •Многомерные массивы
- •Массивы и указатели
- •Арифметические и логические операции с указателями
- •Обработка массивов с помощью указателей
- •Обработка массивов переменной размерности
- •Обработка матриц переменной размерности
- •Обработка текстовой информации
- •Стандартные строки языка С++
- •Пример 1. Определение длины строки.
- •Пример 2. Копирование одной строки в другую
- •Пример 3. Исключение из строки символа.
- •Пример 4. Вставка в строку символа
- •Пример 5. Проверка правильности расстановки скобок.
- •Строки типа string
- •Массивы указателей
- •Указатели на функции
- •Сводная таблица форм объявления указателей
- •Преобразование типов
- •Ссылки
- •Структуры
- •Объединения
- •Файлы
- •Чтение файла в матрицу
- •Чтение файла в структуру
- •Функции для обработки произвольных полей структур
- •Связные списки
- •Контейнерные классы
- •Стеки
- •Рекурсия
- •Вопросы для самопроверки
- •Литература
|
103 |
{ |
|
pt = st + w - 1; |
// Отсчет позиций от 0, а не от 1 |
qt = pt + 1; |
// Указатель на 1 вправо |
while(*pt++ = *qt++); // Копирование
cout << "Строка после исключения равна " << st;
}
else cout << "\n Ошибка в данных"; _getch();
}
Пример 4. Вставка в строку символа
Для вставки символа должны быть заданы (кроме самой строки) позиция вставки и вставляемый символ. Отсчет позиций символов в этом примере такой же, как и в предыдущей задаче.
Для вставки требуется переместить часть строки от позиции вставки до конца строки вправо на одну позицию и на освободившееся место записать вставляемый символ. Для выполнения этой операции необходимо, чтобы позиция вставки была в пределах строки (включая символ конца строки), а длина строки после вставки не должна превышать объявленную длину строки. Номер позиции вставки символа отсчитывается, начиная с 1.
Перемещение части строки вправо можно выполнить тремя способами:
1.Скопировать часть строки до точки вставки в промежуточную строку, затем вставить символ. После этого в промежуточную строку скопировать оставшуюся часть. Схема обработки:
104
Пример этой программы приведен ниже.
// Вставка символа в строку с помощью дополнительной строки.
#include "stdafx.h" #include <conio.h> #include <iostream> using namespace std; #define SIZE 80
void _tmain()
{
char st[SIZE], stp[SIZE], *pt, *qt, ch;
int w; // № позиции для вставки (отсчет от 1) cout << "Введите строку n";
cin >> st;
cout << "Введите номер позиции \n"; cin >> w;
cout << "Введите символ \n"; cin >> ch;
if (w < strlen(st) && w < SIZE - 1 && w > 0)
{
for (int i = 0; i < w - 1; i++)
stp[i] = st[i]; // Копирование до точки вставки stp[w - 1] = ch; // Вставка символа
// Настройка указателей для копирования остатка pt = st + w - 1;
qt = stp + w;
while(*qt++ = *pt++); // Копирование остатка
105
cout << "Строка после вставки равна " << stp;
}
else cout << "Ошибка в данных"; _getch();
}
2.Настроить рабочие указатели на последний символ (со значением '\0') строки и на символ, следующий за ним. После этого выполнить копирование указателей с декрементом (операция --), пока не будет достигнута заданная позиция вставки. Условие окончания цикла выбирается из следующих соображений (см. 2-й цикл while в программе). Позиция вставки равна разности рабочего указателя (pt) и указателя на начало строки (st), если отсчет позиций выполняется от 0. Поэтому номер позиции уменьшен на 1. После окончания этого цикла в позиции вставки останется символ, который был в этой позиции ранее, и этот же символ будет размещен и в следующей позиции (выполнялось копирование, а не пересылка). Теперь можно заменить символ в позиции вставки требуемым. Схема обработки представлена ниже.
//Программа вставки символа за счет сдвига строки вправо
#include "stdafx.h" #include <conio.h> #include <iostream> using namespace std; #define SIZE 17
void _tmain()
{
char st[SIZE],*pt,*qt, ch; int w, len;
cout << "Введите строку\n";
106
cin >> st;
cout << "Введите номер позиции \n"; cin >> w;
cout << "Введите символ n"; cin >> ch;
len = strlen(st); // Эта функция возвращает длину без учета ‘\0'
if (w < len + 1 && w < SIZE - 1 && w > 0)
{
pt = st;
while(*pt++); Поставить указатель на конец строки.
//После окончания цикла указатель за признаком конца строки,
//поэтому его надо возвратить на одну позицию обратно
qt = pt; |
// Второй указатель за концом строки |
pt--; |
// Первый указатель на 1 позицию влево |
while((pt - st) >= w - 1) // Копирование до позиции вставки
*qt-- = *pt--;
st[w - 1] = ch; // Вставка символа: место свободно cout << "Строка после вставки равна \n" << st;
}
else cout << "\n Ошибка в данных"; _getch();
}
3.Запомнить символ в точке вставки, на его место записать вставляемый символ. Аналогично поступить с запомненным символом, т.е. переносить символы по одному от точки вставки, а на освободившееся место записывать очередной символ. Для этого следует настроить указатели так же, как и при исключении, но простое копирование при этом не проходит потому, что предыдущий символ будет переписываться на место последующего, и будет затирать его. Поэтому при переносе вправо одиночного символа, сначала следует прочесть и сохранить последующий символ, затем в текущую позицию строки записать символ, сохраненный на предыдущем шаге. В примере программы для промежуточного
107
хранения символа использована переменная t. Для подготовки к выполнению следующего шага цикла в переменную t переписывается символ, сохраненный в текущем шаге. После этого наращивается рабочий указатель.
Ниже приведена схема вставки символа в строку этим методом (метод «переката»). Ниже показано содержимое переменных на первом шаге «переката».
На следующем рисунке показано содержимое переменных после первого шага перестановок (буква 'o' вставлена, все готово для вставки буквы ‘д’).
108
Ниже приведена программа, реализующая описанный алгоритм.
// Вставка в строку символа методом «переката»
#include "stdafx.h" #include <conio.h> #include <iostream> using namespace std; #define SIZE 80
void _tmain()
{
char st[SIZE],*pt, ch, temp; int w;
cout << "Введите строку \n"; cin >> st;
cout << "Введите позицию вставки \n"; cin >> w;
cout << "Введите символ \n"; cin >> ch;
if (w < strlen(st) && w < SIZE - 1 && w > 0)
{
pt = st + w - 1; while(*pt)
{