Другие языки программирования и технологии

Паскаль строки

Удалить лишние пробелы из строки, использую процедуру.
Подскажите, что неправильно:

program prim;
type
arr=array [1..50] of string;
var
a: arr;
str: string;
i: integer;
procedure trim(str:string; a: arr);
var
i: integer;
begin
for i:=1 to length(str) do
if (a=' ') and (a[i+1]=' ')
then
delete(str, i+1, 1);
end;
begin
writeln('Введите строку');
readln(str);
for i:=1 to length(str) do
a:=copy(str, i,1);
trim(str, a);
writeln;
writeln(str);
readln;
end.
Во первых зачем массивы? если вводить с клавиатуры одну строку и удалять пробелы

итак у вас
вводим строку
от 1 до длина_строки
копируем одну букву
и пытаемся присвоить ее массиву строк (вот тут и начинается неправильно)

строка и есть массив символов, используйте Pos для нахождения двойного пробела
в цикле while пока не останется в строке двойных пробелов удаляйте лишние процедурой Delete
Besim Kaya
Besim Kaya
1 704
Лучший ответ
Джеват Эмираметов program prim;
var
str: string;
i: integer;
procedure trim(str:string);
var
i: integer;
begin
i:=pos(str,' ');
while i=0 do
delete(str, i, 1);
end;
begin
writeln('Введите строку');
readln(str);
trim(str);
writeln;
writeln(str);
readln;
end.
Просто виснет и ничего не делает, помогите, пожалуйста
Не правильно вот это

for i:=1 to length(str) do
if (a[ i ]=' ') and (a[i+1]=' ') then delete(str, i+1, 1);

У вас цикл до ДЛИНЫ строки, а вы пытаетесь получить i+1 символ, т. е. попадаете ЗА границу строки. А во-вторых, у вас цикл в прямом направлении выполняется в то время, как некоторые реализации паскаля верхнюю границу определяют один раз ДО выполнения цикла. А строка-то укарачивается при удалении "лишних" символов.. .

Вот так не будет виснуть

for i:=length(str) downto 2 do if (str[ i ]=' ') and (str[i-1]=' ') then delete(str, i, 1);

Дальше. Лучше, если это будет реализовано функцией, но если требуется все-таки процедура, то параметры нужно передавать по ссылке, т. е. со словом var, а не по значению, как у вас.

Ну и наконец, а для чего вы какой-то цикл крутите в основной программе после ввода исходной строки? Для какого ...Ой! А для чего вам массив из 50 строк? Задача решается строчкой, которую я привел выше. Вводите данные в переменную str, выполняете цикл и выводите результат. Все!