• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Ошибка в элементарной программе, поменять местами буквы в строке

  • Автор темы Автор темы snakind
  • Дата начала Дата начала

snakind

Ученик
Регистрация
22 Май 2011
Сообщения
7
Реакции
0
Баллы
0
Ошибка в элементарной программе, поменять местами буквы в строке

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

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 in delim) do
stmp:=stmp+s;
inc(i);
str:='';
while (i<=Length(s)) and (not(str in delim)) do
begin
str:=str+str;
inc(i);
end;

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

writeln('получается', stmp);
end.
 
Я бы не назвал эту задачу такой уж "элементарной". Тем более, что Ваша программа содержит море ошибок. И главная из них - следующая. Есть такое шутливое определение: "Компьютер - это дурак, твёрдо освоивший четыре действия". А это значит, что компьютер не воспринимает общих идей и совершенно не способен понять, "а что имел в виду автор программы?". Ему нужна абсолютная точность и выверенность каждого значка. А у Вас жуткая путаница прежде всего строковых переменных. Например, присваиваете переменной значение "пустая строка" и тут же пытаетесь анализировать её i-тый символ. Сами полюбуйтесь:
str:='';
while (i<=Length(s)) and (not(str 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.
 
Спасибо большое, разобраться это не проблема:tehnari_ru_889: единственное что могу сказать в оправдание, то что писалось это всё в последние 10 минут пары, и ещё через 2 недели в те же последние 10 минут в ней пытался разобраться и внести коррективы:tehnari_ru_203:

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

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

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

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

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. Перебрав все слова и выведя на экран результат, радуемся жизни.
 
Спасибо за столь подробный ответ, но достаточно было просто разьяснить про указанный момент, остальные механизмы были полностью понятны)
хотя может дело в том как я сформулировал вопрос...

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