IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Описание
REFER
сообщение 29.10.2004 22:25
Сообщение #1


Гость






Кто-нибудь подскажите что в этой программе значат эти строки
Код
for i:=k to length(st3) do
if st3[i]=' ' then begin d1:=i; break end;
for i:=k downto 1 do
if st3[i]=' ' then begin d2:=i; break end;
d:=d1-d2;
slovo:=copy(st3,d2+1,d)

и переменные в них.


Программа:
Код
uses crt;
var st1,st2,st3,slovo: string;
i,p,k,d1,d2,d: integer;
b: char;
begin clrscr;
write('Vvedite stroku1: ',st1); readln(st1);
write('Vvedite stroku2: ',st2); readln(st2);
if length(st1)>length(st2) then
for i:=1 to length(st1) do begin
if st1[i]<>st2[i] then begin
b:=st1[i]; p:=2; k:=i; break;
end else st3:=st2;
end
else for i:=1 to length(st2) do
if st2[i]<>st1[i] then begin
b:=st2[i]; p:=1; k:=i; break;
end else st3:=st1;
for i:=k to length(st3) do
if st3[i]=' ' then begin d1:=i; break end;
for i:=k downto 1 do
if st3[i]=' ' then begin d2:=i; break end;
d:=d1-d2;
slovo:=copy(st3,d2+1,d);
writeln ('Bukva "',b,'" propushena v stroke "',p,'" v slove " ',slovo,'"');
repeat until readkey=#27;
end.


Если можете, можно расписать всю программу по шагам (так даже лучше), буду очень признателен!!!
Спасибо...
 К началу страницы 
+ Ответить 
Amro
сообщение 29.10.2004 22:37
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  2  +


Хех я уже такую решал где-то, вот тута, слово в слово написана smile.gif
http://forum.pascal.dax.ru/forum/index.php?showtopic=2736


--------------------
Закон иудеев: Семь раз отмерь, один отрежь.
Закон экономии: Семь раз отмерь, семь раз отрежь.
Закон программиста: Семь раз отрежь, ошибся, отмерь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Digitalator
сообщение 29.10.2004 22:42
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 247
Пол: Мужской

Репутация: -  1  +


use f7 / f8

как я понял прога ищет первое расхождение в строках и выводит соотв. символ, для чего находится строка подлиннее (которая считается верной) и смотрятся все символы поочереди, пока не встиречается первое расхождение, для которого запоминаются номер символа, номер короткой строки (первая или вторая)

не понятна следуящая строка
Код
end else st3:=st2;

эту операцию можно перед самым началом цикла сверки.
вот это
Код

for i:=k to length(st3) do
if st3[i]=' ' then begin d1:=i; break end;
for i:=k downto 1 do
if st3[i]=' ' then begin d2:=i; break end;
d:=d1-d2;
slovo:=copy(st3,d2+1,d);

судя по всему выделяет слово по известному индексу одной буквы этого слова - а именно находит индексы первого левого и первого правого пробела и вырезает по ним.
Алгоритм неэффективный и содержит кучу багов <_<
PS:
1. читай правила - весь код в теги!
2. вряд ли кто-то захочет объяснять по шагам столь глючную прогу - ее код можно сократить примерно в три раза.
3. Мой тебе совет - купи хорошую книжку (советы по книгам найдешь на форуме) и изучай програмирование, чтоб не задавть подобных вопросов, и самому писать программы

А мой тебе совет, не строй из себя супер кодера... если код можно сократить, сократи его! administrator.

Сообщение отредактировано: Oleg_Z - 30.10.2004 6:08


--------------------
In byte we trust
ICQ World.ru
mail[dog]digitalator[dot]com
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Amro
сообщение 29.10.2004 22:49
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  2  +


Цитата
судя по всему выделяет слово по известному индексу одной буквы этого слова - а именно находит индексы первого левого и первого правого пробела и вырезает по ним.

Именно так!!!
Цитата
вряд ли кто-то захочет объяснять по шагам столь глючную прогу - ее код можно сократить примерно в три раза.

Сократи!!!!


--------------------
Закон иудеев: Семь раз отмерь, один отрежь.
Закон экономии: Семь раз отмерь, семь раз отрежь.
Закон программиста: Семь раз отрежь, ошибся, отмерь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Digitalator
сообщение 29.10.2004 22:56
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 247
Пол: Мужской

Репутация: -  1  +


по твоей ссылке код уже почти 2 раза меньше.. стоит заменить афигенное условие if (length(st1.... одним маленьким, а потом работать с измененными строками, то получается еще меньше.


--------------------
In byte we trust
ICQ World.ru
mail[dog]digitalator[dot]com
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Amro
сообщение 29.10.2004 23:30
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  2  +


Уважаемый Digitalator ! Критика хороша только в том случае, если наряду со словами имеются действия!!! Конкретно, применительно к нашему форуму под действиями подразумевается код!!! Другими словами сила критики в программировании это не болтавня а код!!! А то что вы здесь пишите, все ваши слова : стоит не стоит, можно сократить и тому подобное, это пустые слова и они ни коим образом не помогут тем людям которые обращаются на форум за помощью!!!
Если вам лень написать код, тогда не критекуйте !!!!
Кажется это ваши слова
Цитата
Я к вам на работу не нанимался...

Так вот у нас тут не работа ... наша деятельность построена только на чистом энтузиазме .... и нам за это деньги не платять ...
Я не хотел вас обидеть, просто хочу чтобы вы подумали куда попали ....

P.S. Каждый алгоритм в чём то неэффективен, всегда можно придумать, что-то лучшее, и всегда можно найти даже в лучшем кое-какие ошибки.... Не существует ничего совершенного!!! Есть только конкретные цели и их решения ...

Сообщение отредактировано: Amro - 30.10.2004 1:15


--------------------
Закон иудеев: Семь раз отмерь, один отрежь.
Закон экономии: Семь раз отмерь, семь раз отрежь.
Закон программиста: Семь раз отрежь, ошибся, отмерь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 30.10.2004 1:26
Сообщение #7


Гость






REFER
Приведенный Вами алгоритм действительно неэффективен. Вот что получилось у меня...

Код

Var
 correct, sErr, s1, s2: String;
 index, i, start, finish: Byte;
 Letter: Char;
Begin
 Write('str1:>'); ReadLn(s1);
 Write('str2:>'); ReadLn(s2);

 If Length(s1) >= Length(s2) Then
   Begin correct := s1; sErr := s2 End
 Else
   Begin correct := s2; sErr := s1 End;

 index := 0;
 For i := 1 To Length(sErr) Do
   If correct[i] <> sErr[i] Then
     Begin index := i; Break End;

 If index = 0 Then
   Begin
     index := Length(sErr);
     Letter := correct[succ(index)]
   End
 Else Letter := correct[index];

 start := index;
 While (start > 0) and (sErr[start] <> ' ') Do Dec(start);
 finish := index;
 While (finish <= Length(sErr)) and (sErr[finish] <> ' ') Do Inc(finish);

 WriteLn( 'Bukva "', Letter, '" propushena v stroke "',
          1 + Byte(Length(s1) >= Length(s2)),
          '" v slove "', Copy(sErr, Succ(start), finish-start),'"');
 ReadLn
End.


Сообщение отредактировано: volvo - 30.10.2004 1:39
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 16:26
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"