Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual_C_console.pdf
Скачиваний:
34
Добавлен:
16.05.2015
Размер:
954.14 Кб
Скачать

 

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)

{

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]