Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Вставка и удаление элементов




 

Вставка строки

Мы уже рассматривали операции вставки для одно­мерных массивов. Обобщим их для двухмерных.

Пример

Вставить строку из нулей после строки с номером k.

Решение

Для решения этой задачи необходимо:

1. Первые k строк оставить без изменения.

2. Все строки после k−й сдвинуть на одну вниз, это лучше начать с последней строки и идти до (k+1)−й.

3. Присвоить значения элементам (k+1) строки.

 Кроме того, необходимо обратить внимание на раз­мерность массива. Так как мы вставляем строку, то не­обходимо иметь одну строку "в запасе".

Program Example_122;

Const n=5; m:=7;

Type dmyarray=Array[1..n+1,1..m]

Of Integer;

Var A: dmyarray; k:Integer;

Теперь опишем процедуру вставки:

Procedure Insert(k1: Integer;

Var x: dmyarray);

Var i, j: Integer;

Begin

For i:=n Downto k1+1 Do

For j:=1 To m Do x[i+1, j]:=x[i, j];

{Элементу столбца с номером j присваиваем

элемент этого же столбца, но из

предыдущей строки}

For j:=1 То m Do x[k1+1, j]:=0;

End;

Так как число строк меняется, то процедуру Print надо изменить. Она должна выводить указанное количест­во строк, начиная с первой:

Procedure Print1 (n1: Integer;

x: dmyarray);

Var i, j: Integer;

Begin

For i:=1 To n1 Do

Begin

For j:=1 To m Do Write(x[i, j]: 4);

Writeln;

End;

End;

Часть основной программы будет такой:

Begin

Init(A);

Print(n, A);

Writeln ('Введите номер строки, после

которой надо вставить новую строку');

Readln(k);

Insert(k, A);

Print1(n+1, A);

Readln;

End.

Примечания

1. Если необходимо вставить новую строку после строки, удовлетворяющей некоторому условию, то надо лишь найти номер этой строки  и задача сведется к решению уже рас­смотренной.

2. Если надо вставлять новые строки после всех строк с заданным условием, то надо учесть это при описании масси­ва. Заметим, что удобнее просматривать строки с последней и ввести счетчик вставленных строк.

3. Вставка новой строки перед строкой с номером k изме­нится только тем, что сдвигать назад надо не с (k+1)−й стро­ки, а с k−й.

4. Если надо вставлять столбцы, то размерность массива увеличивается по столбцам, а все остальное практически не меняется: надо сдвинуть столбцы вправо и на данное место записать новый столбец.

Удаление строки

Пример

Удалить строку с номером k.

Решение

Дли того чтобы удалить строку с номером k, необходимо:

· Сдвинуть все строки, начиная с данной на одну вверх.

· Последнюю строку "обнулить", то есть всем эле­ментам последней строки присвоить значение 0.

Описание массивов оставим прежним (размером nxm). Также в программе будем использовать процеду­ру вывода Print1 из предыдущего параграфа. Будем выводить на экран сначала все строки, а второй раз, после удаления, на одну меньше. Теперь опишем процеду­ру удаления строки с данным номером:

Program Example_123;

Procedure Delete (k1: Integer;

Var x: dmyarray);

Var i, j: Integer;

Begin

For i:=k1 To n-1 Do

For j:=1 To m Do

x [i, j]:=x[i+1, j];

For j:=1 To m Do x[n, j]:=0;

End;

Примечания

1. Задачу удаления строки, удовлетворяющей заданному условию, можно решить этим же способом, достаточно толь­ко найти ее номер.

2. Используя данную процедуру, можно решить еще одну задачу − удаление всех строк, которые обладают некоторым свойством.

Перестановка элементов массива Перестановка двух элементов

 

Пример 1

Поменять местами два элемента массива А с задан­ными координатами (номерами строки и столбца).

Решение

Можно эту задачу решить несколькими способами. Первый способ аналогичен перестановке элементов в одномерном массиве, когда в процедуру передаются индексы элементов и массив, в котором надо их поме­нять. Тогда процедура может быть такой:

Program Example_124;

Procedure Swap1(k1, l1, k2, l2: Integer;

Varx: dmyarray);

Var c: Integer;

Begin

c:=x[k1, l1]; x[k1, l1]:=x[k2,l2];

x[k2,l2]:=c;

End;

Второй способ. Вспомним процедуру Swap, кото­рая меняет местами значения двух целых переменных.

Program Example_125;

Procedure Swap(Varx, у: Integer);

Var z: Integer;

Begin

z:=x; x:=y; y:=z;

End;

А теперь обратимся к ней, передавая данные эле­менты: Swap(A[k1, l1], A[k2, l2]).

Рассмотрим задачу о перестановке двух столбцов (строк), так как многие задачи используют это действие.

Пример 2

Поменять местами столбцы с номерами l1 и l2. Эту задачу также можно решить несколькими спо­собами. Составим процедуру, в которую будем переда­вать номера столбцов, и массив, в котором надо их переставить. Кроме того, добавим проверку коррект­ности ввода данных номеров, так как если столбца с данным номером нет, то и переставлять ничего не надо. В самой процедуре можно использовать, например, процедуру Swap

Program Example_126;

Procedure Swap2(l1, l2: Integer;

Var x: dmyarray);

Var i: Integer;

Begin

If (l1<1) Or (l1>m)) Or (l2<1)

Or (12>m)) Then

Writeln ('Ввод неправильный')

Else

For i:=1 To m Do

Swap(x[i, l1], x[i, l2]);

End;

Если применять первую процедуру Swap1, то после проверки правильности ввода данных будет такое обра­щение:

For i:=1 То m Do

Swap1(i, l1, i, l2, x);

 

СТРОКОВЫЙ ТИП ДАННЫХ

Строкой называется последовательность заданной дли­ны, состоящая из символов.

Строки (переменные типа String) могут быть объяв­лены, например, следующим образом:

Var Str1: String[30]; Str2: String;

При объявлении строковой переменной в квадрат­ных скобках может указываться длина строки. Если дли­на строки не указана, то она принимается равной 255. Максимальная длина строки также равна 255. В дан­ном случае в первой строке может содержаться макси­мум 30 символов, а во второй − 255. Надо заметить, что строка похожа на одномерный массив символов: она имеет определенную длину (не больше некоторого числа), к каждому символу можно обратиться по его номеру (как в массиве) – Str1[i] − это обраще­ние к i−му элементу строки Str1.

Переменные типа String выводятся на экран по­средством стандартных процедур Write и Writeln и вводятся с помощью стандартных процедур Readln и Read. To есть вводятся и выводятся не поэлементно, как массивы, а целиком.

Примечание. Если при вводе задать символов больше, чем максимально допустимо, то лишние символы будут проигно­рированы.

Операции со строками

 

В Паскале имеется два основных способа обработки переменных типа String. Первый способ предпола­гает обработку всей строки как единого целого, т.е. единого объекта. Кроме того (это второй способ), мож­но рассматривать строку как составной объект, состоя­щий из отдельных символов, то есть элементов типа Char, которые при обработке доступны каждый в от­дельности.

Склеивание

Под склеиванием понимается последовательное объе­динение нескольких строк.

Пример

Var Str1, Str2, Str3: String[20];

Str1:='y Егорки';

Str2:='всегда отговорки';

Str3:=Str1+' '+Str2;

Строка Str3 имеет значение 'У Егорки всегда отго'. В данном примере максимальная длина стро­ки Str3 равна 20 символам, поэтому будут взяты только первые 20 символов суммы строк, а остальные рассматриваться не будут. Паскаль позволяет выпол­нять операции объединения (сцепления) нескольких строк в процессе их присвоения какой-либо перемен­ной: Str3:= 'У Егорки '+' всегда '+' отговорки'. В результате такой операции в пере­менной Str3 будет то же самое содержимое, что и в предыдущем примере.

Примечание. "Склеить" строки можно также при помо­щи функции

Concat(Str1, Str2,..., StrN).

 

Сравнение

Паскаль позволяет выполнять операции сравнения двух строк. Сравнение происходит посимвольно слева направо: сравниваются коды соответствующих симво­лов до тех пор, пока не нарушится равенство или не кончится одна из строк (или обе сразу), при этом сра­зу делается вывод о знаке неравенства. Две строки на­зываются равными, если они равны по длине и совпа­дают посимвольно.

Пример

 

'Balkon'<'balkon'(Ord(' B' )<Ord('b'));

'balkon'>'balken'(Ord('o')>0rd('e')) ;

'balkon'>'balk' (длина первой строки больше);

'кошка '>'кошка' (длина первой строки больше);

'кот'='кот' (равны по длине и совпадают посимвольно).

Можно использовать любые операции отношения (>, <, =, <>, >=, =<) и их комбинации в условных операторах. Их результат − это одно из двух значений: True или False.

Для доступа к отдельному символу в строке необходи­мо указать имя строки и в квадратных скобках номер позиции элемента (символа) в строке. При этом по от­ношению к отдельному символу строки возможны все те же операции, что и к переменной типа Char.

 










Последнее изменение этой страницы: 2018-05-31; просмотров: 202.

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