|
Главная | Правила | Регистрация | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
|
Опции темы | Опции просмотра |
22.05.2011, 15:49 | #1 (permalink) |
Новичок
Регистрация: 22.05.2011
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Ошибка в элементарной программе, поменять местами буквы в строке
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. |
22.05.2011, 15:49 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Помогу вам этими ссылками - наверняка там много интересного для вас Статическая ошибка в информационном файле установки в строке 8152 Процедура удаления пробелов в строке |
22.05.2011, 22:36 | #2 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Я бы не назвал эту задачу такой уж "элементарной". Тем более, что Ваша программа содержит море ошибок. И главная из них - следующая. Есть такое шутливое определение: "Компьютер - это дурак, твёрдо освоивший четыре действия". А это значит, что компьютер не воспринимает общих идей и совершенно не способен понять, "а что имел в виду автор программы?". Ему нужна абсолютная точность и выверенность каждого значка. А у Вас жуткая путаница прежде всего строковых переменных. Например, присваиваете переменной значение "пустая строка" и тут же пытаетесь анализировать её i-тый символ. Сами полюбуйтесь:
Цитата:
Вот Вам отлаженный работающий код - попробуйте разобраться: Код:
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. |
|
23.05.2011, 15:41 | #3 (permalink) |
Новичок
Регистрация: 22.05.2011
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Спасибо большое, разобраться это не проблема единственное что могу сказать в оправдание, то что писалось это всё в последние 10 минут пары, и ещё через 2 недели в те же последние 10 минут в ней пытался разобраться и внести коррективы
ещё раз спасибо) |
23.05.2011, 15:54 | #5 (permalink) |
Новичок
Регистрация: 22.05.2011
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
единственный вопрос
Какую нагрузку несёт в строке str:=Copy(stmp,i1,i2-i1); действие i2-i1 ? |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
23.05.2011, 16:17 | #6 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
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. Перебрав все слова и выведя на экран результат, радуемся жизни. |
|
23.05.2011, 17:43 | #7 (permalink) |
Новичок
Регистрация: 22.05.2011
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Спасибо за столь подробный ответ, но достаточно было просто разьяснить про указанный момент, остальные механизмы были полностью понятны)
хотя может дело в том как я сформулировал вопрос... в любом случае, в очередной раз большое спасибо |
23.05.2011, 20:13 | #8 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Метки |
pascal, pascal abc |
Опции темы | |
Опции просмотра | |
|
|