1 / 1 / 0 Регистрация: 02.12.2009 Сообщений: 38 |
|
1 |
|
Найти все различные слова в строке14.12.2009, 16:00. Показов 6228. Ответов 31
не могли бы вы помочь с задачей на строки??Дано предложение.Найти все его различные слова.Пожалуйста помогите..
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
14.12.2009, 16:00 |
31 |
кот Бегемот Платежеспособный зверь 8818 / 4245 / 1618 Регистрация: 28.10.2009 Сообщений: 11,385 |
||||
14.12.2009, 16:12 |
2 |
|||
не могли бы вы помочь с задачей на строки??Дано предложение.Найти все его различные слова.Пожалуйста помогите..
1 |
1 / 1 / 0 Регистрация: 02.12.2009 Сообщений: 38 |
|
14.12.2009, 16:52 [ТС] |
3 |
alexevt, Спасибо большое!!!!!!!!!!Вы меня очень выручили!!!!!!
0 |
кот Бегемот Платежеспособный зверь 8818 / 4245 / 1618 Регистрация: 28.10.2009 Сообщений: 11,385 |
||||
14.12.2009, 16:54 |
4 |
|||
А код, видимо неточный. Я неверно понял задание. Программа находит только неповторяющиеся слова. Сейчас исправлю. Добавлено через 1 минуту
1 |
1 / 1 / 0 Регистрация: 02.12.2009 Сообщений: 38 |
|
14.12.2009, 17:05 [ТС] |
5 |
alexevt, вы бы только не могли мне объяснить,какие тут переменные зачем?? Добавлено через 6 минут
0 |
кот Бегемот Платежеспособный зверь 8818 / 4245 / 1618 Регистрация: 28.10.2009 Сообщений: 11,385 |
||||
14.12.2009, 17:15 |
6 |
|||
не волнуйтесь, всё работает именно так, как надо. Код, написанный выше выведет
1 |
1 / 1 / 0 Регистрация: 02.12.2009 Сообщений: 38 |
|
14.12.2009, 17:18 [ТС] |
7 |
ой,ОГРОМНОЕ СПАСИБО!!Благодаря Вам,я завтра надеюсь даже получу зачет))
0 |
1 / 1 / 0 Регистрация: 02.12.2009 Сообщений: 38 |
|
17.12.2009, 17:07 [ТС] |
8 |
как дописать программу так,чтобы,если за словом стоит,.!”;%:?*((),т.е разные символы и цифры,комп принимал не за различные слова?Например:если набрать:Привет Привет!,чтобы он ничего не выводил,потому что это одинаковые слова. Добавлено через 12 минут
0 |
1 / 1 / 0 Регистрация: 02.12.2009 Сообщений: 38 |
|
18.12.2009, 19:45 [ТС] |
9 |
alexevt, нашли?))
0 |
yanyk1n 4341 / 1473 / 680 Регистрация: 12.03.2009 Сообщений: 5,310 |
||||
18.12.2009, 19:47 |
10 |
|||
if a[i]=’ ‘ then inc(k)else b[k]:=b[k]+a[i]; вместо a[i]=’ ‘ добавьте:
1 |
Inadequate Retired 7726 / 2558 / 671 Регистрация: 17.10.2009 Сообщений: 5,100 |
||||
18.12.2009, 19:50 |
11 |
|||
Сообщение было отмечено как решение Решениеk1ry4, множества обозначаются так
3 |
1 / 1 / 0 Регистрация: 02.12.2009 Сообщений: 38 |
|
18.12.2009, 19:56 [ТС] |
12 |
значит как я поняла…a[i]=’ ‘ удаляем и вместо этого пишем a[i] in…да??
0 |
4341 / 1473 / 680 Регистрация: 12.03.2009 Сообщений: 5,310 |
|
18.12.2009, 19:57 |
13 |
Так точно, в квадратных скобках через запятую в апострофах перечисляем все необходимые символы, которые будем игнорировать
1 |
Inadequate Retired 7726 / 2558 / 671 Регистрация: 17.10.2009 Сообщений: 5,100 |
||||
18.12.2009, 20:03 |
14 |
|||
LenaLop, не совсем так… Вот я переделал код alexevt‘a под Ваш случай
2 |
1 / 1 / 0 Регистрация: 02.12.2009 Сообщений: 38 |
|
18.12.2009, 20:07 [ТС] |
15 |
спасибо)))у меня в паскале опять неправильно выводит,но я думаю из-за того что у меня паскаль такой…А так вроде так и должно быть)0Большое спасибо!!!!!
0 |
Платежеспособный зверь 8818 / 4245 / 1618 Регистрация: 28.10.2009 Сообщений: 11,385 |
|
18.12.2009, 20:09 |
16 |
сейчас попробуем
1 |
Retired 7726 / 2558 / 671 Регистрация: 17.10.2009 Сообщений: 5,100 |
|
18.12.2009, 20:11 |
17 |
LenaLop, да видимо у Вас что-то с паскалем, потому как я сейчас все еще раз проверил, все работает. А паскаль рекомендую Вам скачать вот здесь.
0 |
1 / 1 / 0 Регистрация: 02.12.2009 Сообщений: 38 |
|
18.12.2009, 20:12 [ТС] |
18 |
k1ry4, вы бы мне не могли исправить ошибке в другой программе..пожалуйста..называется из заданного на множестве точек выбрать 3 различные так
0 |
Retired 7726 / 2558 / 671 Регистрация: 17.10.2009 Сообщений: 5,100 |
|
18.12.2009, 20:14 |
19 |
Хотя опять же у Вас довольно неоднозначно написанно задание… Вам нужно было вывести слова, которые встречаются в строке один раз или Вам нужно было вывести первые повторы слов?
0 |
Платежеспособный зверь 8818 / 4245 / 1618 Регистрация: 28.10.2009 Сообщений: 11,385 |
|
18.12.2009, 20:14 |
20 |
Допишите нужные символы в программу Inadequate , например так: c=[‘,’,’.’,’ ‘,’:’,’&’,’=’,’!’,’?’,’;’] и всё будет хорошо. проверено
2 |
program str1;
var
str, word, newWord: string;
i, j, number, correctWord : integer;
isIdenticaly: boolean;
begin
correctWord := 0;
writeln (‘Введите строку’);
readln(str);
writeln (‘Введите cлово’);
readln(word);
//количество возможных слов и соответственно итераций цикла
number:= Length(str)-(Length(word)-1);
//Тут мы запускаем цикл, который повторится столько раз, сколько возможно получить слов такой же длины, как искомое слово
for i:=1 to number do
begin
isIdenticaly:= true; //Это переменная которая изначально равна true, но меняет значение на false если символ искомого слова не соответствует символу нового слова
//тут запускаем цикл внутри цикла, который проверяет каждую букву нового слова на соответствие символу искомого слова
for j:=0 to (Length(word)-1) do
begin
if (str[i+j] <> word[j+1]) then
begin
isIdenticaly:= false; //В этом месте мы меняем true на false если хоть один символ слова отличается от искомого
break;
end;
end;
if (isIdenticaly = true) then // Тут мы проверяем, если эта переменная осталась true до этого момента, значит все символы соответствуют
begin
correctWord:= correctWord + 1;
end;
end;
writeln(correctWord); //выводим количество найденных подходящих слов
end.
-
Выделение слов из строки
Под словами будем понимать последовательности
символов разделенных пробелами (кроме,
соответственно, первого и последнего
слов).
Пусть s=’мама мыла раму’. Признаком конца
слова можно считать пробел, кроме
последнего слова. Чтобы не обрабатывать
последнее слово специальным образом,
добавим в конец строки оператором S:=s+’
‘ символ «пробел».
Просмотрим все элементы строки и если
символ не пробел, то добавляем его к
строке t. Если пробел, то в t уже целое
слово. Выдаем его на экран, и начинаем
формировать в t новое слово. Перед
формированием «очищаем» слово t (t:=”-
пустая строка).
Var s, r, t: string;
i: integer;
Begin
Readln(s);
s:=s+’ ‘; t:=”; {tпустая строка}
For i:=1 to length(s) do
If s[i]<>’ ‘ then t:=t+s[i]
else Begin
Writeln(t);
t:=”;
End;
readln
End.
Используем эту идею для решения более
сложной задачи: найти в строке самое
длинное слово – палиндром. Для этого
формируем как прямое слово t:=t+s[i],
так и обратноеr:=s[i]+r.
Кроме того, последовательно проверяем
длины слов и ищем самое длинное.
Var s, r, t, wmax: string;
i, lmax, l: integer;
Begin
Readln(s); s:=s+’ ‘;
r:=”;{“обратное”
слово-пустая строка}
t:=”;{“прямое”
слово-пустая строка }
wmax:=”;{искомое слово –
пустая строка}
For i:=1 to length(s) do
Ifs[i]<>’
‘then{символ не равен
пробелу}
Begin
r:=s[i] + r; t:=t + s[i]
End
else Begin
If r = t then
If length(r)>length (wmax)
thenwmax:=r;
r:=”;t:=”;
{готовимся формировать новые слова}
End;
Write(wmax);
Readln
End.
Теперь представим, что «очень много»
символов последовательно записано в
текстовом файле (на олимпиадах обычно
бывает именно так). Тогда последним
символом окажется код #26 (признак конца
файла). Но, если при создании файла в
конце строки будет нажата клавиша
«Enter», то в конце файла могут появиться
и символы #13 (CR) или (и) #10 (LF). Не забудьте
об этом при участии в соревнованиях,
именно из этого символа команда СГАУ
на четвертьфинале чемпионата мира сдала
программу только с третьей попытки,
заработав 40 минут штрафного времени.
Обязательно закрывайте выходной файл,
иначе результат в нем может не появиться.
Используем стандартные файлы ввода и
вывода. Тогда их можно не описывать и
не указывать их имена в операторах ввода
и вывода
Будем считывать символы из файла
последовательно и по алгоритму,
изложенному выше, решим задачу.
Var r, t, wmax: string;
ch: char;
Begin
Assign (input, ‘input.txt’); Reset(input);
Assign (output, ‘output.txt’); Rewrite(output);
r:=”; t:=”; wmax:=”;
Repeat
Read (ch);
If (ch<>’ ‘)and(ch<>#26)and(ch<>#10)and(ch<>#13)
then
Begin r:=ch+r; t:=t+ch End
else Begin
If r=t then
If length (r)>length (wmax) then wmax:=r;
r:=”; t:=”;
End;
Until (ch=#26) or (ch=#10) or (ch=#13);
Write (wmax);
Close (output);
End.
Соседние файлы в предмете Программирование на Pascal
- #
- #
- #
- #
- #
- #
Как найти слова в строке?
, Нужно найти слова и их длину
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Из заданного предложения распечатать все слова, длина которых больше пяти символов! |
Eiden |
|
Несложно, но муторно
Program zadacha; Const Syms = [‘;’,’.’,’,’,’ ‘,’:’,’-‘]; Var Source, Temp : String ; I : Byte ; Done : Boolean ; Begin Write(‘Enter string: ‘); ReadLn(Source); Done := False; I := 1; Temp := ”; Repeat While (Not (Source[I] in Syms)) And (I<=Length(Source)) Do Begin Temp := Temp + Source[I]; Inc(I); End; If I = Length(Source) Done := True; If Length(Temp) > 5 Then WriteLn(Temp); Temp := ”; Until Done; End. Хм, не так муторно, как думал |
Vesper |
|
Цитата Eiden, 4.02.04, 01:13 Then забыл Цитата Eiden, 4.02.04, 01:13
Имхо лучше проверять на [‘A’..’Z’,’a’..’z’] и без not. А вдруг там есть длинное число, скажем 100000? Тогда оно выведется. |
Eiden |
|
Неудивительно, я теперь только на C++ кодю Хорошо хоть в скобки не беру условие (хотя разницы никакой). Цитата Имхо лучше проверять на [‘A’..’Z’,’a’..’z’] и без not. А вдруг там есть длинное число, скажем 100000? Тогда оно выведется. Да, согласен. Но тогда уж и на ‘А’..’Я’,’а’..’п’,’р’..’я’. В итоге в коде исправляем две строчки:
Syms = [‘A’..’Z’,’a’..’z’,’А’..’Я’,’а’..’п’,’р’..’я’]
While (Source[I] in Syms) And (I <= Length(Source)) Do Ну про тот Then не забыть Сообщение отредактировано: Eiden – 04.02.04, 09:29 |
Юлия |
|
Скажите а каким образом предложение разбито не слова?? |
Eiden |
|
Оно разбито на слова. Слово – последовательность символом русского или латинского алфавита. |
Юлия |
|
Хорошо, а что тогда является разделителeм для слов!?? |
Some1 |
|
А как обычно: Добавлено в 04.02.04, 19:40: |
Юлия |
|
Temp:=” —-Непонятно что присваивается?? Программу почему то циклит, можете кто-то показать хоть пример как надо вводить предложение!!! |
Some1 |
|
Ну вот. Точно работает. Только принцип немного другой – проверяем с конца строки к началу. Что вобщем-то одно и то-же:
const prepen=[‘;’,’:’,’!’,’?’,’,’,’.’,’ ‘,'”‘,’-‘]; var s:string; p,o:byte; begin write(‘Введите предложение: ‘); readln(s); p:=length(s); repeat if s[p] in prepen then dec(p) else begin o:=p; while (p>0) and not (s[p] in prepen) do dec(p); if o-p=5 then writeln(copy(s,p+1,5)); end; until p=0; end. |
Юлия |
|
Покажите пожалуйста в данной программе пример ввода предложения!! |
Eiden |
|
Цитата Temp:=” —-Непонятно что присваивается?? присваивается пустая строка, то есть ничего. Переменная типа String (строка) как бы обнуляется. Как программу циклит? |
Vesper |
|
кстати, программу циклит из-за того, что i не увеличивается, если мы вышли из цикла по “не-символу”. То есть строчку Цитата Eiden, 4.02.04, 01:13 надо заменить на
If I = Length(Source) Then Done := True Else Inc(I); ЗЫ: Опять Then пропустил. Ну это не страшно. Сообщение отредактировано: vesper1 – 07.02.04, 07:41 |
Eiden |
|
Цитата кстати, программу циклит из-за того, что i не увеличивается, если мы вышли из цикла по “не-символу”. Угу, точно, спасибо! Просто привык такие вещи через цикл с постусловием делать (там i точно увеличивается), а тут что-то не подумал. Сообщение отредактировано: Eiden – 08.02.04, 20:24 |
Юлия |
|
Всем спасибо за помощь!!!! |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Pascal
- Следующая тема
[ Script execution time: 0,0723 ] [ 15 queries used ] [ Generated: 25.05.23, 02:07 GMT ]
Как найти в определенном предложении всё слова, где присутствуют цифры.
То есть в итоге вывести количество таких слов.
Делал вот так но что то не работает
Function num_count(s:string):integer;
Var i,num:integer;
n:0..9;
word:string;
begin
num:=0;
word:='';
for i:=1 to Length(S) do //просматриваем всю строку
begin
if(S[i]=' ') then //если пробел то новое слово
word:=''
else
begin
//если находим цифру то прибавляем счетчик
if Pos(inttostr(n),word)<>0 then
num:=num+1;
word:=word+S[i];
Continue;
end;
Result:= num;
end;end;
задан 15 дек 2011 в 13:18
2
Вариант выше при пробелах подряд в середине и конце строки ошибается
А так же использует долгие функции
Вот приемлимый код по скорости и объему кода
function num_count(s:string):integer;
var
i,num,len:integer;
begin
num:=0;
i:=1;
len:=length(s);
while (i<=len) do
if (s[i] in ['0'..'9'] )
then
begin
inc(num);
while ( (s[i] <> ' ') and (i<=len) ) do inc(i);
end
else inc(i);
result:= num;
end;
ответ дан 15 дек 2011 в 16:37
Поправил.
Function num_count(s:string):integer;
Var
i,num:integer;
begin
num:=0;
i:=1;
While (S[Length(S)]=' ') Do // удаляю пробелы в конце
Delete(S, Length(S), 1);
// Вместо предыдущего цикла в Delphi можно использовать S:=Trim(S);
While (i<=Length(S)) Do
Begin
If (S[i]=' ') Then
Begin
Repeat // теперь не ошибётся
delete(S, 1, 1);
Until (S[1]<>' ');
i:=1;
End;
if (S[i] In ['0'..'9']) then
Begin
num:=num+1;
If (Pos(' ', S)=0) Then
Break // можно написать так
{Begin // или так
Result:= num;
Exit;
End}
Else
delete(S, 1, Pos(' ', S));
i:=1;
End
Else
Inc(i);
End;
Result:= num;
end;
Теперь мой вариант не ошибается, если пробелов в центр строки натыкать, хотя достаточно велик по объёму кода (оптимизацией я тут не занимался – написал то, что первое в голову пришло).
ответ дан 15 дек 2011 в 13:30
DelphiM0ZGDelphiM0ZG
3,03714 серебряных знаков18 бронзовых знаков
2