Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Paskal_ucheb_posob_ch1_21_11_2011

.pdf
Скачиваний:
47
Добавлен:
09.04.2015
Размер:
943 Кб
Скачать

61

СЕМИНАРЫ ЧАСТЬ IV Обработка строк

Упражнение 26.

Ввести строку символов до точки. Символы между пробелами или группами пробелов считаются словами. Количество пробелов между словами неограниченно. Посчитать количество слов в строке.

var

Str1:string;

{входнастрока}

J, K, I : integer;

{к = количество слов}

Begin

write (' Input your text->'); Readln(Str1);

J:= Pos('.',Str1);

{позиция первой точки во входной строке}

if Str1[j-1]=' ' then k:= -1 else k:=0;

{инициализация количества слов в зависимости от наличия/ отсутствия пробела перед точкой}

Str1:= copy(Str1, 1, J-1);

{удаляем всѐ из исходной строки до первой точки}

{Str1:= Str1+' ';} Repeat

I:=Pos(' ',Str1);

{находим позицию 1-го пробела}

Delete (Str1, 1, I);

{удаляем из исходной строки всѐ, что есть с первой позиции до позиции этого пробела вместе с ним, даже если он на 1-й позиции}

if I <> 1 then inc(k);

{Если позиция пробела не = 1, то это слово, и счетчик = +1}

Until I=0;

62

{выход из цикла тогда, когда в строке не будет ни одного пробела, т.е. его позиция = 0}

Writeln ('You have ', k, ' word(s)'); Readln ;

{ TODO -oUser -cConsole Main : Insert code here } end.

В переменной Str1 хранится исходная строка.

Далее определяется местоположение первой строчки в тексте. Если точка есть, то «лишний» текст обрезается вместе с ней. Если символ пред точкой является пробелом, то количество слов k:= -1, т.к. символ после пробела считается словом, а этот символ – точка. В другом случае количество слов k:=0.

В цикле Repeat определяется позиция первого пробела в тексте и из строки удаляются все символы вместе с этим пробелом. Если позиция пробела была не равна 1, т.е. это было слово, то счетчик количества слов увеличивается на единицу. Цикл выполняется до тех пор, пока позиция пробела не будет равной 0, т.е. в исходной строке не останется ни одного символа и она окажется пустой.

Упражнение 27.

Ввести строку символов до точки. Символы между пробелами или группами пробелов считаются словами. Количество пробелов между словами неограниченно. Определить длину самого короткого и самого длинного слова.

var

Str1:string;

MAX, MIN, J, I: integer; Begin

write (‘ Input your text->’);

Readln(Str1); J:= Pos(‘. ‘,Str1);

Str1:= copy(Str1, 1, J-1); Max :=0;

MIN :=256; Repeat

I:=Pos(‘ ‘,Str1);

Delete (Str1, 1, I);

if (I-1) > MAX then MAX := I-1;

if (I-1< MIN) and (I>1) then MIN := I-1;

63

Until I=0:;

Writeln (‘Самое длинное слово имеет-> ’,MAX,’символов’);

Writeln (‘Самое короткое слово имеет-> ’,MIN,’символов’);

Readln ;

end.

В переменной Str1 хранится исходная строка.

Далее определяется местоположение первой строчки в тексте. Если точка есть, то «лишний» текст обрезается вместе с ней.

Изначально принято, что исходная максимальная длина слова составляет 0 символов, а минимальная длина слова равна максимальному количеству символов в строке256 символов.

В цикле Repeat определяется позиция первого пробела в тексте и из строки удаляются все символы вместе с этим пробелом. Если длина слова, без учета пробела, больше текущего значения максимальной длины слова MAX, то длина этого слова становится максимальным. Подобным же образом определяется минимальная длина слова, но при этом проверяют – не является ли слово пробелом, Если позиция пробела была не равна 1, т.е. это было слово, и текущая длина слова меньше минимальной, то запоминается длина данного слова с наименьшим числом символов.

Цикл выполняется до тех пор, пока позиция пробела не будет равной 0, т.е. в исходной строке не останется ни одного символа и она окажется пустой.

64

ЛЕКЦИЯ 9.

СТРУКТУРНЫЕ (СЛОЖНЫЕ) ТИПЫ

Структурный тип, характеризуемый методом структурирования и типами своих компонент, имеет более одного значения. Если тип компонент является структурным, то получаемый в результате структурный тип имеет более одного уровня структурирования. Структурный тип может иметь неограниченные уровни структурирования.

Примечание: Максимальный допустимый размер структурного типа в Turbo Pascal равен 65520 байт.

Тип массив

Массивы содержат фиксированное число компонент одного типа - тип компоненты.

Приведем пример типа массив:

SDF: array [11..100] of Real;

В типах индекса, по одному для каждой размерности массива, указывается число элементов. Допустимыми типами индекса являются все порядковые типы, за исключением Longint и поддиапазонов Longint. Массив может быть проиндексирован по каждой размерности всеми значениями соответствующего типа индекса; число элементов поэтому равно числу значений в каждом типе индекса. Число размерностей является неограниченным.

Если тип компоненты в типе массив также является массивом, то результат можно рассматривать как массив массивов или как один многомерный массив. Например,

array [1..33] of array [1..10] of

array [Size] of Real;

интерпретируется компилятором точно так же, как array [1..33, 1..10, Size] of Real.

Для доступа к элементам массива необходимо указать идентификатор массива с одним или несколькими индексами в скобках.

Конкретный элемент массива обозначается с помощью ссылки на переменную массива, за которой указывается индекс, задающий элемент. Конкретный символ в строковой переменной обозначается с помощью ссылки на строковую переменную, за которой указывается индекс, задающий позицию символа.

Индексные выражения обозначают элементы в соответствующей размерности массива. Число выражений не должно превышать числа ин-

65

дексных типов в объявлении массива. Более того, тип каждого выражения должен быть совместим по присваиванию с соответствующим индексным типом.

В случае многомерного массива одинаково можно использовать несколько индексов или несколько выражений в индексе; например,

Matrix[I][J] тождественно Matrix[I, J]

Строковую переменную можно проиндексировать с помощью одиночного индексного выражения, значение которого должно быть в диапазоне 0..N, где N - указанный в объявлении размер строки. Это дает доступ к каждому символу в строковом значении, с типом Char, даваемому этому символьному значению.

Первый символ строковой переменной (индекс 0) содержит динамическую длину строки; то есть Length(S) тождественно Ord(S[0]). Если атрибуту длины присваивается значение, то компилятор не проверяет, является ли это значение меньше объявленного размера строки. Вы можете указать индекс строки и вне ее текущей динамической длины. В этом случае считываемые символы будут случайными, а присваивания вне текущей длины не повлияют на действительное значение строковой переменной.

Константы с типом массив.

Объявление константы с типом массив содержит значения компонент, заключенные в скобки и разделенные запятыми.

Приведем пример константы с типом массив: type

Status = (Active, Passive, Waiting); StatusMap = array [Status] of string[7];

const

StatStr:StatusMaр = ('Active', 'Passive', 'Waiting');

В этом примере определяется константа - массив StatStr, которая может быть использована для преобразования значений типа Status в соответствующие им строковые представления. Компонентами StatStr являются:

StatStr[Active] = 'Active'; StatStr[Passive] = 'Passive'; StatStr[Waiting] = 'Waiting';

Тип компоненты константы-массива может быть любым, кроме файлового типа. Константы строкового типа (символьные массивы) могут быть определены и как одиночные символы, и как строки. Определение

const

Digits : array[0..9] of Сhar =('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');

66

можно представить в более удобном виде: const

Digits: array [0..9] of Char = ('0123456789');

При объявлении константы типа многомерный массив константы каждой размерности заключаются в отдельные скобки и разделяются запятыми. Расположенные в середине константы соответствуют самым правым размерностям. Объявление

type

Cube = array[0..1, 0..1, 0..1] of Integer;

const

Maze: Cube=(

(

(0,1),(2,3)

),

(

(4,5),(6,7)

)

);

задает следующие начальные значения массиву Maze:

Maze[0, 0, 0] = 0

Maze[0, 0, 1] = 1

Maze[0, 1, 0] = 2

Maze[0, 1, 1] = 3

Maze[1, 0, 0] = 4

Maze[1, 0, 1] = 5

Maze[1, 1, 0] = 6

Maze[1, 1, 1] = 7

СЕМИНАРЫ ЧАСТЬ IV ОДНОМЕРНЫЕ МАССИВЫ

Упражнение 28.

Написать программу, которая во входной символьной строке произвольной длины l >= 3, рассчитывает число включений слова «END».

Type

SS=array[1..3] of char; {ss=string[3]}

Var

K: integer; S : SS;

Begin

writeln(‘Введите строку’); read( S[1],S[2] );

repeat

read( s[3] );

if( S='end') then K:=K+1;

S[1]:=S[2];

S[2]:=S[3]; until eoln; writeln ( K );

End.

Программа сначала вводит 3 символа входной строки в массив S, затем в цикле сравнивает массив S с символьной строкой "END" и в случае их совпадения увеличивает счетчик слов К на 1. Затем значение второго компонента массива передвигается на место первого, значение третьего - на место второго. После этого в конце цикла проверяется наличие символов во входной строке. Если есть - то возврат на начало цикла, если нет - конец цикла.

Упражнение 29.

Составить программу, которая переписывает подряд в массив Y положительные элементы массива X.

68

Type

B=array[1..200] of real;

Var

X,Y: B;

I,N,K : integer; Begin

write ('Input N <= 200) '); readln (N);

for I:=1 to N do readln ( X[I] );

{ randomize; For i := 1 to N do

X[i]:= (random(100)-50)/(random(200)-120);}

}

K:=0;

for I:=1 to N do

if ( X[I] > 0 ) then begin K:=K+1; Y[K]:=X[I];

end;

for I:=1 to K do write(‘ ‘, Y[I]:5:2 );

End.

В данной программе алгоритм достаточно прост. При переборе элементов исходного массива Х производится проверка больше ли этот элемент нуля. Если больше, то увеличить счетчик элементов массива Y и записать в новую позицию положительное значение. Если элемент массива Х меньше или равен 0, то согласно оператора цикла, берется следующий элемент массива Х.

69

ЛЕКЦИЯ 10.

Упражнение 30.

Найти наименьший из элементов массива X , состоящего из 50 элементов и его порядковый номер.

uses crt; var

a:array[1..50] of integer; i,j,zap,min,n_min:integer;

begin

clrscr;

writeln (' Vvod budet avtomatical'); writeln;

randomize;

for i:= 1 to 50 do a[i]:=random(100);

writeln('ishodnyi massiv'); writeln;

for i:= 1 to 50 do write(' ',a[i]);

writeln; n_min:=1; min:=a[1];

for j:= 2 to 50 do

if a[j]< min then begin min:= a[j]; n_min:=j;

end;

writeln (‘n_min=’, n_min,’ min:=’, min); readln;

end.

Упражнение 31

Составить программу упорядочивания массива, состоящего из 10 элементов, расположив их по убыванию в том же массиве с использованием приема нахождения наибольшего элемента.

70

uses crt; var

a:array[1..10] of integer;

i, j, zap, max, n_max : integer;

begin

clrscr;

writeln (' Vvod budet avtomatical'); writeln;

randomize;

for i:= 1 to 10 do a[i]:=random(100);

writeln('ishodnyi massiv'); writeln;

for i:= 1 to 10 do write(' ',a[i]);

writeln;

for i:= 1 to 10-1 do begin n_max:=i; max:=a[i];

for j:= i+1 to 10 do

if a[j]> max then begin max:= a[j]; n_max:=j;

end; zap:=a[n_max]; a[n_max]:=a[i]; a[i]:=zap;

end;

writeln;

writeln('--------------massiv posle sortirovki--------------'); writeln;

for i:= 1 to 10

do write(' ',a[i]); writeln;

readln;

end.

Упражнение 32

Составить программу упорядочивания массива, состоящего из 100 элементов, расположив их по убыванию в том же массиве с использованием приема пузырьковой сортировки.

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