Консультация № 66305
10.12.2006, 02:21
0.00 руб.
0 2 2
Здравствуйте эксперты! Вот помогите пожалуйста решить задачу......

Дана строка символов, состоящая из произвольного текста,
слова разделены пробелами. Вывести на экран порядковый номер слова,
накрывающего k-ю позицию ( если на k-ю позицию попадает пробел, то номер предыдущего слова), и найти в нём количество повторяющихся символов.

Обсуждение

Неизвестный
11.12.2006, 11:00
общий
это ответ
Здравствуйте, Whitesnake!

Создайте запись

type Words=record
wrd: string;
lwrd: integer;
end;

объявим динамический массив
var
My_Words: array of Words;

в нужном Вам обработчике надо написать события:
1: разбить строку на слова;
text:=text+‘|‘; // символ ‘|‘ необходим далее для указания конца строки и соответственно уменьшения кода программы.
For i:=1 to length(text) do //text - входящая строка
if text[i]<>‘|‘ then
if text[i]<>‘ ‘ then
begin
My_Words[length(My_Words)-1].wrd:=My_Words[length(My_Words)-1].wrd+text[i];
My_Words[length(My_Words)-1].lwrd:=My_Words[length(My_Words)-1].lwrd+1;
end else
SetLength(My_Words, Length(My_Words)+1);

после того, как мы разбили слова и определили их длинну (хотя длинну можно вычислять и потом)

теперь необходимо вычислить к какому слову относиться данный символ

var
lng, wrd_index: integer;

for i:=0 to length(My_Words)-1 do
begin
lng:=lng+My_Words[i].lwrd+1;
if k<=lng then wrd_index:=i;
break;
end;

нашли индекс слова к которому принадлежит символ с индексом K

дальше осталось самое легкое просчитать кол-во повторяющихся символов
создадим еще один массив на подобии My_Words

type Chars=record;
chrs: char;
clng: integer;
end;

var
My_Chars: Chars;
exist: boolean;

и будем оперировать с ним
for i:=1 to My_Words[wrd_index].lwrd do
begin
exist:=false;
For j:=0 to length(My_Chars)-1 do
if My_Words[wrd_index].wrd[i]=My_Chars[j].chrs then
begin
My_Chars[j].lchrs:=My_Chars[j].lchrs+1;
exist:=true;
end
if exist=false then
begin
setlength(length(My_Chars)+1);
My_Chars[length(My_Chars)-1].chrs:=My_Words[wrd_index].wrd[i];
end;
memo1.lines.append(‘В веденной строке: ‘+inttostr(length(My_Words))+‘ слов‘);
memo1.lines.append(‘Символ с порядковым номером ‘+inttostr(k)+‘ соодержиться в ‘+inttostr(wrd_index)+‘ слове‘);
memo1.lines.append(‘Количество совпадающих символов: ‘);
for i:=0 to length(My_Chars)-1 do
memo1.lines.append(My_Chars[i].chrs+‘ совпадений ‘+floattostr(sqrt(My_Chars[i].lchrs));

Примерно вот, так. (задача для Вас, все расставить на свои места порядок остается преждним) код программы писался без использования делфы, а потому прошу прощения за беспорядок.
Если, что задавайте вопросы.
Неизвестный
11.12.2006, 19:21
общий
это ответ
Здравствуйте, Whitesnake!

Процедура,конечно,стандартная,но пришлось не много поломать голову.Вообще-то,мне нравится решать такие головоломки.
Так как у вас не было оговорки,какие буквы в словах вводятся,то я взял по умолчанию,что они все равны.
Другими словами говоря,алгоритм работает верно при одинаковых введённых буквах в слове!
Код получился не много запутанным,но я думаю вы разберётесь.Кое-где я дал описания.
И ещё,не забудьте добавить обработку исключений по нажатию запускающей кнопки,если в окнах
ничего ни введено!
Я ещё добавил в код процедуру упорядочивания по пробелу,чтобы между словами был только один пробел.
Одним словом смотрите приложение.

Удачи!


Приложение:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type TForm1 = class(TForm) Edit1: TEdit; Edit3: TEdit; Edit4: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; BitBtn1: TBitBtn; BitBtn2: TBitBtn; Label4: TLabel; Label5: TLabel; Edit2: TEdit; Button1: TButton; procedure FormCreate(Sender: TObject); procedure BitBtn1Click(Sender: TObject); //для запуска операции procedure Button1Click(Sender: TObject); //для упорядочивания по пробелу private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Label1.Caption:=‘Введите номер‘+#13+‘ k-й позиции‘; Label2.Caption:=‘Порядковый номер‘+#13‘ слова‘; Label3.Caption:=‘ Количество‘+#13+‘повторяющихся‘+#13+‘ символов‘; Label4.Caption:=‘Вывести результат‘; Label5.Caption:=‘Ведите текст‘; Edit1.Clear; Edit2.Clear; Edit3.Clear; Edit4.Clear; end; procedure TForm1.Button1Click(Sender: TObject); var i,j:Integer; s:string; begin s:=Edit1.Text; s:=Trim(s); j:=Length(s); i:=1; while i<=j do begin if s[i]=#32 then while s[i+1]=#32 do begin delete(s,i+1,1); j:=j-1; end; i:=i+1; end; Edit1.Text:=s; end; procedure TForm1.BitBtn1Click(Sender: TObject); var i,j,Sl,k,Sp:Integer; s:string; begin s:=Edit1.Text; s:=Trim(s); j:=Length(s); k:=StrToInt(Edit2.Text); j:=(j+k)-j; Sl:=0; for i:=1 to j do if s[i]=#32 then begin Sl:=Sl+1; end; if s[j]=#32 then begin Sl:=Sl-1; end; Sp:=0; while s[j]<>#32 do //вся суть кода здесь begin begin while s[j]=s[j+1] do begin j:=j+1; end; j:=j+1; end; end; j:=j-1; begin while s[j]=s[j-1] do begin while s[j]<>#32 do begin j:=j-1; Sp:=Sp+1; end; end; Edit4.Text:=IntToStr(Sp); end; Edit3.Text:=IntToStr(Sl+1); end; end.
Форма ответа