Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Ошибка в элементарной программе, поменять местами буквы в строке (http://www.tehnari.ru/f41/t52063/)

snakind 22.05.2011 15:49

Ошибка в элементарной программе, поменять местами буквы в строке
 
По заданию нужно в введённой строке, в словах переставить местами буквы по алфавиту. Ну и вывести итоговую строку самособой. Подскажите пожалуйста, какой рекурсии не хватает и где?

program Slovaeng;
const
Delim=[' ', ',', '.', '?', '!'];
var
s, stmp, str:string;
i:Integer;
Min:char;
begin
begin
writeln ('S:');
readln (s);
i:=1;
str:='';
while i<= length(s) do
begin
while (i<=Length(s)) and (s[i] in delim) do
stmp:=stmp+s[i];
inc(i);
str:='';
while (i<=Length(s)) and (not(str[i] in delim)) do
begin
str:=str+str[i];
inc(i);
end;

if str[i]>(str[i+1]) then min:=str[i+1];
end;
str[i]:=min;
str[i+1]:=str[i];
end;

writeln('получается', stmp);
end.

Vladimir_S 22.05.2011 22:36

Я бы не назвал эту задачу такой уж "элементарной". Тем более, что Ваша программа содержит море ошибок. И главная из них - следующая. Есть такое шутливое определение: "Компьютер - это дурак, твёрдо освоивший четыре действия". А это значит, что компьютер не воспринимает общих идей и совершенно не способен понять, "а что имел в виду автор программы?". Ему нужна абсолютная точность и выверенность каждого значка. А у Вас жуткая путаница прежде всего строковых переменных. Например, присваиваете переменной значение "пустая строка" и тут же пытаетесь анализировать её i-тый символ. Сами полюбуйтесь:
Цитата:

str:='';
while (i<=Length(s)) and (not(str[i] in delim)) do
И таких ошибок в программе - полно. И строки не инициализированы (об этом посмотрите здесь: http://www.tehnari.ru/f43/t43891/ начиная с #3), и перестановка символов в словах выполнена безграмотно, и много чего еще.
Вот Вам отлаженный работающий код - попробуйте разобраться:
Код:

program Slovaeng;
const
 Delim=[' ', ',', '.', '?', '!'];
var
 s,stmp,str:string;
 i,j,k,i1,i2:Integer;
 Min:char;

begin
 writeln('S:');
 readln(s);
 stmp:=s;
 i:=1;
 while i<=length(s) do
  begin
  while (i<=Length(s)) and (s[i] in delim) do inc(i);
  i1:=i;
  i2:=i;
  while (i<=Length(s)) and (not(s[i] in delim)) do
    begin
    inc(i);
    inc(i2);
    end;
  If i2>i1 then
    begin
    str:=Copy(stmp,i1,i2-i1);
    Delete(stmp,i1,i2-i1);
    for j:=1 to Length(str) do
      for k:=1 to Length(str)-j do
      if Ord(str[k])>Ord(str[k+1]) then
        begin
        min:=str[k+1];
        str[k+1]:=str[k];
        str[k]:=min;
        end;
    Insert(str,stmp,i1);
    end;
  end;

 writeln('Result:');
 writeln(stmp);
 readln;
end.


snakind 23.05.2011 15:41

Спасибо большое, разобраться это не проблема:tehnari_ru_889: единственное что могу сказать в оправдание, то что писалось это всё в последние 10 минут пары, и ещё через 2 недели в те же последние 10 минут в ней пытался разобраться и внести коррективы:tehnari_ru_203:

ещё раз спасибо)

snakind 23.05.2011 15:52

В программе разобрался, очень здорово)

за свой оригинал стыдно)) :tehnari_ru_281:

snakind 23.05.2011 15:54

единственный вопрос
Какую нагрузку несёт в строке

str:=Copy(stmp,i1,i2-i1);

действие i2-i1 ?

Vladimir_S 23.05.2011 16:17

Цитата:

Сообщение от snakind (Сообщение 525466)
единственный вопрос
Какую нагрузку несёт в строке

str:=Copy(stmp,i1,i2-i1);

действие i2-i1 ?

Да... ну тут, видимо, придется подробно расписать алгоритм, тогда всё станет понятно.
1. Считываем исходную строку (s).
2. Будущей результирующей строке (stmp) присваиваем значение исходной строки s. Дальше работаем только с stmp.
3. В строке stmp находим очередное слово. i1 - это порядковый номер первой буквы слова, i2 - символа, следующего за последней буквой.
4. Командой (функцией) Copy копируем найденное слово в строку str. При этом в параметрах команды нужно указать откуда копируем (stmp), номер позиции символа исходной строки, начиная с которого копируем (i1), и количество копируемых символов (i2-i1).
5. В str проводим перестановку букв, выстраивая их по алфавиту.
6. Командой (процедурой) Delete удаляем из stmp старое слово. Опять же указываем строку, позицию первого символа, количество символов.
7. Командой (процедурой) Insert вставляем преобразованное слово. Параметры команды - что вставляем (str), во что вставляем (stmp), начиная с какой позиции вставляем (i1).
8. Перебрав все слова и выведя на экран результат, радуемся жизни.

snakind 23.05.2011 17:43

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

в любом случае, в очередной раз большое спасибо:tehnari_ru_203:

Vladimir_S 23.05.2011 20:13

Цитата:

Сообщение от snakind (Сообщение 525537)
Спасибо за столь подробный ответ, но достаточно было просто разьяснить про указанный момент

Э-э... виноват! Исправлюсь!


Часовой пояс GMT +4, время: 20:58.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.