Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите с Паскалем

Сергей Новиков Профи (760), на голосовании 8 лет назад
Даны две строки. Необходимо поменять местами последние слова этих строк. Написал программу. Не работает. Где в ней ошибки?
Дополнен 8 лет назад
Голосование за лучший ответ
_ _ Профи (617) 8 лет назад
вы стирайте каждый раз как попадает пробел? плохо различимы 1 и i на скрине
Сергей НовиковПрофи (760) 8 лет назад
program lastwords;
var
str1, str2, a, b: string;
i: integer;
begin
write('First string: ');
readln(str1);
write('Second string: ');
readln(str2);
TrimRight(str1);
TrimRight(str2);
for i:=1 downto Length(str1) do
if str1[i]=' ' then
begin
a:=copy(str1,i,length(str1)-i);
delete(str1,i,length(str1)-i)
end;
for i:=1 downto length(str2) do
if str2[i]=' ' then
begin
b:=copy(str2,i,length(str2)-i);
delete(str2,i,length(str2)-i)
end;
str1:=str1+a;
str2:=str2+b;
writeln('First string now: ', str1);
writeln('Second string now: ', str2);
readln;
end.
_ _ Профи (617) TrimRight это не процедура, а функция. она убирает пробелы кажется
_ _Профи (617) 8 лет назад
Если там никто не умер то я чуть подкорректировал, компилятора нет проверить не могу )

program lastwords;
var
str1, str2, a, b: string;
i: integer;
begin
write('First string: ');
readln(str1);
write('Second string: ');
readln(str2);
str1:=TrimRight(str1);
str2:=TrimRight(str2);
for i:=Length(str1) downto 1 do
if str1[i]=' ' then
begin
a:=copy(str1,i,Length(str1));
delete(str1,i,Length(str1));
break;
end;
{аналогично для второй строки}
str1:=str1+a;
str2:=str2+b;
writeln('First string now: ', str1);
writeln('Second string now: ', str2);
readln;
end.
_ _ Профи (617) только ещё str1:=str1+b; str2:=str2+a;
maximf4 Профи (585) 8 лет назад
Удаляй всю программу
bilal_greeneyes@yahoo.com Ученик (106) 8 лет назад
у тебя bit-частота стоит на 1
Лав Вал Гуру (4098) 8 лет назад
Зачем такие сложности?
Так можно:
program words;
var
str1, str2, temp: string;
begin
Writeln('Введи первое слово');
Readln(str1);
Writeln('Введи второе слово');
Readln(str2);
temp := str1;
str1 := str2;
str2 := temp;
Writeln('Первое слово теперь ',str1);
Writeln('Второе слово теперь ',str2);
end.
Сергей НовиковПрофи (760) 8 лет назад
Вы поменяли местами по сути две строки состоящие из одного слова. Задание же требует поменять местами последние слова сколь угодно длинных и сложных строк.
Лав Вал Гуру (4098) Без проблем, проверил. Всё работает.
Dmitry Tikhomirov Знаток (264) 8 лет назад
Ошибка, например, в циклах for.
Я бы сделал так:
http://pascalabc.net/WDE/?file=06257.pas

Program LastWorlds;
var str1,str2,a,b: string;
i:integer;
pos1,pos2: integer;
begin
write('1st string: ');
readln(str1);

write('2nd string: ');
readln(str2);

str1 := TrimRight(str1);
str2 := TrimRight(str2);

i:=Length(str1);
while str1[i] <> ' ' do
begin
i:=i-1;
end;
pos1 := i;

i:=Length(str2);
while str2[i] <> ' ' do
begin
i:=i-1;
end;
pos2 := i;

a:= RightStr(str1,Length(str1)-pos1);
b:= RightStr(str2,Length(str2)-pos2);

str1:= LeftStr(str1,pos1) + b;
str2:= LeftStr(str2,pos2) + a;

Writeln(str1);
Writeln(str2);

end.
Клыков Владимир Гуру (4079) 8 лет назад
Еще актуально? а то чтот все решения громоздкие =)
Александр Гуру (2858) 8 лет назад
В строке
for i:=1 downto Length(str1) do
ошибка!! Правильнее будет
for i:=Length(str1) downto 1 do

Ведь проверка должна быть с конца! слова, значит, не с 1-го символа, а с последнего!

P.S.
Короче, вот так работает правильно:

Добавить переменные l1 и l2: (L1 и L2, если заглавные буквы)
l1,l2: integer;
А после TrimRight написать так:

for i:=Length(str1) downto 1 do
if str1[i]=' ' then
begin
a:=copy(str1,i+1,255);
l1:=i;
break;
end;
for i:=Length(str2) downto 1 do
if str2[i]=' ' then
begin
b:=copy(str2,i+1,255);
l2:=i;
break;
end;
str1:=copy(str1,1,l1)+b;
str2:=copy(str2,1,l2)+a;

Ну, а потом WriteLn...
Похожие вопросы