подскажите,а почему неправильно работает следующая весч: (мне нужно найти в первом предложении самое короткое слово,которого нет во втором)
Код
const lim=[#0..#32,'.',',',':',';','!','?','"','+']; type Twords=array[1..40] of string; var i,j,k,n1,n2,nmin,h:byte; w1,w2:Twords; function GWords(p:string;var w:Twords):byte; var i,b,n:byte; begin i:=1; n:=0; while (i<=length(p)) do begin while (i<=length(p)) and (p[i] in lim) do inc(i);{+1} if i<=length(p) then begin b:=i; while (i<=length(p)) and not(p[i] in lim) do inc(i); inc(n); w[n]:=copy(p,b,i-b); end; end; GWords:=n; end; begin n1:=GWords(p1,w1);//ñîáèðàåì â ìàññèâ ñëîâà 1 ïðåäëîæåíèÿ n2:=GWords(p2,w2);//ñîáèðàåì â ìàññèâ ñëîâà 2 ïðåäëîæåíèÿ //óäàëÿåì èç ïåðâîãî ìàññèâà ñëîâà,êîòîðûå åñòü âî âòîðîì i:=1; while (i<=n1) do begin j:=1; while (j<=n2) and (AnsiLowerCase(w1[i])<>AnsiLowerCase(w2[j])) do inc(j); if j<=n2 then begin for k:=i to pred(n1) do w1[k]:=w1[succ(k)]; dec(n1);//n1-1 end else inc(i);//i+1 end; //èùåì ñàìîå êîðîòêîå ñëîâî èç îñòàâøèõñÿ nmin:=0; if n1>0 then begin nmin:=1; for i:=2 to n1 do if w1[i]<w1[nmin] then begin nmin:=i; memo1.Lines.append(w1[nmin]); end; end; end;
Автор: klem4 28.03.2006 23:52
Я же привел тебе работающую программу в "Задачах" зачем было что-то менять ? Если уж надо на делфи то бери эти две строки из мемо или эдитов или откуда тебе надо и делай с ними то же самое !
s1 := Edit1.Text; s2 := Edit2.Text;
и все.
Автор: Tribunal 29.03.2006 10:26
да не в этом дело. она не выводит искомое слово. или слова,если слов такой длины несколько. то есть если я задаю условие вывода -длину самого короткого слова, выводится лишь последнее слово данной длины.
Автор: lapp 29.03.2006 11:04
Цитата(Tribunal @ 29.03.2006 6:26)
она не выводит искомое слово.
В конце у тебя есть сравнение строк. Ты знаешь, как оно работает? Посимвольно. То есть любая строка, начинающаяся с A будет больше любой строки, начинающейся с B. Прогони вот этот примерчик:
begin WriteLn('abcdef'>'bc') end.
- его результат FALSE Для сравнения длин используй функцию Length(s).
Автор: Tribunal 29.03.2006 11:26
хорошо.с этим ясно. нужно теперь выцвести слова заданной длины списком в мемо. как это сделать?
Автор: lapp 29.03.2006 11:35
Цитата(Tribunal @ 29.03.2006 7:26)
нужно теперь выцвести слова заданной длины списком в мемо. как это сделать?
Не совсем ясно, что именно не ясно Как искать слова заданной длины? вроде, должно быть ясно, если ясно предыдущее все.. Как выводить в мемо? вроде, ты это делала.. И что значит - списком? в смысле, пронумеровать? ?
Автор: Tribunal 29.03.2006 11:43
Цитата(lapp @ 29.03.2006 14:35)
Не совсем ясно, что именно не ясно Как искать слова заданной длины? вроде, должно быть ясно, если ясно предыдущее все.. Как выводить в мемо? вроде, ты это делала.. И что значит - списком? в смысле, пронумеровать? ?
да не то,чтобы пронумеровать,просто мне нужно вывести все слова минимальной длины. так,как вроде бы должно выводить,выводит лишь последнее такое слово
Код
if nmin>0 then begin Memo1.Lines.Append(w1[nmin]); for i:=nmin+1 to n1 do if length(w1[i])=length(w1[nmin]) then Memo1.Lines.Append(w1[i]); end;
Автор: Tribunal 29.03.2006 12:01
всё=) спасибо,Всё нормально=)
последний вопрос.... какие символы входят в диапазон #0..#32 ?
Автор: klem4 29.03.2006 12:09
Служебные символы и пробел (#32)
Автор: lapp 29.03.2006 12:30
Цитата(Tribunal @ 29.03.2006 8:01)
какие символы входят в диапазон #0..#32 ?
Большинство из них представляется комбинацией <Ctrl-...> в порядке алвафита. Например, символ <Ctrl-С> имеет номер 3, а <Ctrl-Z> - 26. У многих из них есть общеупотребительное значение. Например, №13 - перевод строки, №8 - backspace, №26 - конец файла. Далее, №27 - это ESC. #0 обычно используется как обозначение конца строки.
Автор: klem4 29.03.2006 12:39
Цитата
#0 обычно используется как обозначение конца строки.
Это на сколко я знаю не правда, в с/с++ строка символьная завершается нулевым символом, а в паскале
Цитата(Volvo (FAQ))
каждая строка заканчивается символом конца строки (end of line), который представляет собой символ перевода каретки (Chr(13)), за которым, возможно, следует символ перевода строки (Chr(10)).
Это в файле.
Автор: lapp 29.03.2006 12:47
Цитата(klem4 @ 29.03.2006 8:39)
Это на сколко я знаю не правда, в с/с++ строка символьная завершается нулевым символом, а в паскале Это в файле.
Да, разумеется, я имел в виду не конец строки в файле. Я имел в виду именно С. Бес, как грится, попутал, оффтоп приплел.. sorry
Автор: Tribunal 29.03.2006 15:21
а,например, "+" , "-" , "*" туда входят ?
полагаю,нет. а # видимо входит... так?
Автор: lapp 29.03.2006 15:59
Цитата(Tribunal @ 29.03.2006 11:21)
а,например, "+" , "-" , "*" туда входят ?
полагаю,нет. а # видимо входит... так?
Сначала полагаешь правильно, а потом - не "так" Ты в Widows работаешь? Запусти Пуск - Программы - Аксессуары - System tools - Character map Там показываются символы, начиная с №33 ($21)
И еще один совет. Если хочешь проверить, что за символ с номером, скажем, 123, сделай так. В любом редакторе: нажми Alt и не отпускай. Набери на цифровой клавиатуре (это справа) 1 2 3 - и отпусти альт. Символ должен появиться в редакторе. Осторожно с символами до 32! если наберешь 27 - будет обычный esc, например.
Еще один hint: сделай простую прогу, которая выдаст тебе табличку символов типа 16х16. Только с первой строчкой в ней будь осторожна...