Доброго времения суток! Изучаю массивы и столкнулся с такой задачей:
Дано предложение составить программу располагающую слова в порядке убывания длины слов
program z; uses crt; type slov = array [1..10] of string; var p,b : string; s : slov; i,j,l : integer; q : boolean; procedure maxdl( ii,jj : integer;ss : slov; var ll : integer ); var t:integer;m:string; begin m:=ss[ii]; { считает max(t) } ll:=ii; { l-номер max } for t:=ii+1 to jj do if length(m)<length(ss[t]) then begin m:=ss[t]; ll:=t; end; end; begin clrscr; write('текст p=');readln(p); j:=1; for i:=1 to length(p) do begin b:=p[i]; if b=' ' then j:=j+1 else s[j]:=s[j]+b;{ склеивание слова и заносим в таб } end; b:=''; for i:=1 to j do begin maxdl(i,j,s,l); { находим номер мах элм } b:=s[i]; { меняем местами мах элм: } s[i]:=s[l]; s[l]:=b; end; for i:=1 to j do write(s[i],' '); readln; end.
Меня очень заинтерисовал тип slov. Это что именное . Какой это тип переменных, какой диапазон и т.д. На какой другой тип его можно заменить? Пожалуйста, помогите понять.
Автор: Freedom 10.12.2010 2:35
type slov = array [1..10] of string; var p,b : string; s : slov;
slov это пользовательский тип переменных. type slov = array [1..10] of string; - из этой строки можно узнать что переменные типа slov являются одномерным массивом с 10ю элементами типа string. Можно заменить s:array [1..10] of string;
procedure maxdl( ii,jj : integer;ss : array of string; var ll : integer );
Автор: volvo 10.12.2010 4:02
Цитата
Можно заменить
Нельзя. Индексация собьется, и ответ будет неправильный.
Автор: Lapp 10.12.2010 7:27
Цитата(Verb @ 9.12.2010 22:29)
Меня очень заинтерисовал тип slov. Это что именное . Какой это тип переменных, какой диапазон и т.д. На какой другой тип его можно заменить?
Как тебе уже сказали, это тип, введенный самим программистом. В Паскале можно делать свои типы - какие угодно и сколько хочешь. С точки зрения организации доступа к данным этот кусок:
type slov= array [1..10] of string; var s: slov;
- совершенно эквивалентен такому:
var s: array [1..10] of string;
Отличие состоит только в том, что если ты объявил тип, то ты можешь его использовать в нескольких разных местах для объявления переменных. Все эти переменные будут принадлежать к одному и тому же типу и, следовательно, будут совместимы по присваиванию. Строго говоря, если ты описываешь так:
var a: array[1..10]of integer; b: array[1..10]of integer;
- то ты не можешь сделать далее в коде:
a:=b;
(хотя, возмможно, TurboPascal это и пропустит, но более новый компилятор - нет). Для комприлятора эти два типа разные (хотя по сути они одинаковые). А если ты опишешь этот массив отдельным типом, а потом заведешь переменные этого типа - то можно.
В данном же случае ситуация еще более жесткая, так как в формальных параметрах процедуры вообще нельзя конструировать типы. Поэтому, чтобы передать массив как параметр, нужно описать его тип, и этот тип использовать как при описании самого массива, так и для формального параметра функции, куда он будет передаваться.
То, что сказал Freedom - это особый случай т.н. открытого массива. Использовать это в принципе можно, но, как уже сказал volvo, будут проблемы с индексами. Использование собственного типа в данной ситуации совершенно оправдано, и не нужно его ни на что заменять. Учись использовать все средства, которые предоставляет язык.