Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 22.05.2011, 15:49   #1 (permalink)
snakind
Новичок
 
Регистрация: 22.05.2011
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Question Ошибка в элементарной программе, поменять местами буквы в строке

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

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.
snakind вне форума   Ответить с цитированием

Старый 22.05.2011, 15:49
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Помогу вам этими ссылками - наверняка там много интересного для вас

Статическая ошибка в информационном файле установки в строке 8152
Процедура удаления пробелов в строке

Старый 22.05.2011, 22:36   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Я бы не назвал эту задачу такой уж "элементарной". Тем более, что Ваша программа содержит море ошибок. И главная из них - следующая. Есть такое шутливое определение: "Компьютер - это дурак, твёрдо освоивший четыре действия". А это значит, что компьютер не воспринимает общих идей и совершенно не способен понять, "а что имел в виду автор программы?". Ему нужна абсолютная точность и выверенность каждого значка. А у Вас жуткая путаница прежде всего строковых переменных. Например, присваиваете переменной значение "пустая строка" и тут же пытаетесь анализировать её i-тый символ. Сами полюбуйтесь:
Цитата:
str:='';
while (i<=Length(s)) and (not(str[i] in delim)) do
И таких ошибок в программе - полно. И строки не инициализированы (об этом посмотрите здесь: Паскаль: сравнение версий, глюки и т.п. начиная с #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.
Vladimir_S вне форума   Ответить с цитированием
Старый 23.05.2011, 15:41   #3 (permalink)
snakind
Новичок
 
Регистрация: 22.05.2011
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

ещё раз спасибо)
snakind вне форума   Ответить с цитированием
Старый 23.05.2011, 15:52   #4 (permalink)
snakind
Новичок
 
Регистрация: 22.05.2011
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

за свой оригинал стыдно))
snakind вне форума   Ответить с цитированием
Старый 23.05.2011, 15:54   #5 (permalink)
snakind
Новичок
 
Регистрация: 22.05.2011
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

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

действие i2-i1 ?
snakind вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 23.05.2011, 16:17   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от snakind Посмотреть сообщение
единственный вопрос
Какую нагрузку несёт в строке

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. Перебрав все слова и выведя на экран результат, радуемся жизни.
Vladimir_S вне форума   Ответить с цитированием
Старый 23.05.2011, 17:43   #7 (permalink)
snakind
Новичок
 
Регистрация: 22.05.2011
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

в любом случае, в очередной раз большое спасибо
snakind вне форума   Ответить с цитированием
Старый 23.05.2011, 20:13   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от snakind Посмотреть сообщение
Спасибо за столь подробный ответ, но достаточно было просто разьяснить про указанный момент
Э-э... виноват! Исправлюсь!
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Метки
pascal, pascal abc

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.