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

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Прямой алгоритм поиск. СИ
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 50
Пол: Женский
Реальное имя: Сафиуллина Алёна

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


При запуске программы пользователь вводит две строки, длины которых ограничены 1024. Вывести индексы всех вхождений второй строки в первую, используя Прямой алгоритм.
Не могу понять как это впринципе осуществляется. Сам порядок решения. Подскажите, пожалуйста.


--------------------
Жизнь похожа на собачью упряжку: если не идёшь впереди, то всё время видишь одно и то же...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Eichhorn @ 3.06.2011 9:36) *
Вывести индексы всех вхождений второй строки в первую, используя Прямой алгоритм.
Не могу понять как это впринципе осуществляется. Сам порядок решения.

Ну, как-то вот так.. Я, правда, не знаю, что такое "прямой алгоритм". Думаю, что это он и есть )). Если ошибаюсь - поправьте, плз.
l= strlen(c2);
i= 0;
while (c1[i]>0) {
j= 0;
while ((c2[j]>0) && (c2[j]==c1[i+j])) j++;
if (j=l) printf("%d\n",i++);
}


исправлено )


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


Я бы, наверное, сделал вот так:
    char *pc1 = c1;
while(*pc1++)
{
char *p = pc1;
char *pc2 = c2;
while((*p != 0) && (*pc2 != 0) && (*p++ == *pc2++));

if(!(*pc2)) printf("%d\n", (pc1 - c1));
}


blink.gif then? Пошел перечитывать азбуку... Я явно что-то упускаю...

Сообщение отредактировано: IUnknown -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(IUnknown @ 3.06.2011 11:37) *
blink.gif then? Пошел перечитывать азбуку... Я явно что-то упускаю...

Спасибо, исправляю.. ))


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 50
Пол: Женский
Реальное имя: Сафиуллина Алёна

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



#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
char c1[]="mamapopmamakjhmama";
char c2[]="mama";
char *pc1=c1;

while(*pc1++)
{
char *p = pc1;
char *pc2 = c2;
while((*p != 0) && (*pc2 != 0) && (*p++ == *pc2++));

if(!(*pc2)) printf("%d\n", (pc1 - c1));
}
getch();
return 0;
}


Вот такой код получается. Но не считается певрое вхождение, когда индекс равен нулю.. И можно пояснить, что значит рс1 и рс2?


--------------------
Жизнь похожа на собачью упряжку: если не идёшь впереди, то всё время видишь одно и то же...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


Говорила мне мама - не пиши на С, проблемы на пустом месте возникают. pc1 надо увеличивать в другом месте:

while(*pc1)
{
char *p = pc1;
char *pc2 = c2;
while((*p != 0) && (*pc2 != 0) && (*p++ == *pc2++));

if(!(*pc2)) printf("%d\n", (pc1 - c1));

pc1++; /* <--- Вот тут */
}
, тогда должно сработать. Проверь, у меня сейчас компилятора С-шного под рукой нет...

Цитата
И можно пояснить, что значит рс1 и рс2?
Можно, это временные указатели на строку. Чтобы сравнивать подстроки между собой - можно воспользоваться тем способом, как это делается в Паскале (что продемонстрировал Lapp) - т.е., обращаться к символу по индексу, а можно сделать в духе С, используя указатель на строку... То есть:
Цитата
        char *p = pc1;  // начинаем просмотр с текущего места основной строки
char *pc2 = c2; // и с начала подстроки

// пока не дошли до конца строки и не дошли до конца подстроки,
// и очередные символы равны между собой - продвигаемся в обеих
// строках дальше
while((*p != 0) && (*pc2 != 0) && (*p++ == *pc2++));
, а потом достаточно сравнить *pc2 с нулем, чтобы понять, нашли мы полное вхождение подстроки в строку, или частичное. Если там 0 - значит, полное, пробежали до конца подстроки, можно выводить номер позиции...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 50
Пол: Женский
Реальное имя: Сафиуллина Алёна

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


Огромное спасибо!!! Всё поняла, во всём разобралась.


--------------------
Жизнь похожа на собачью упряжку: если не идёшь впереди, то всё время видишь одно и то же...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Приношу запоздалые извинения за свои ляпы. Все же коды надо проверять..
Вот рабочий вариант (чисто для порядку)):
  int l= strlen(c2);
int i= 0;
while (c1[i]>0) {
int j= 0;
while ((c2[j]>0) && (c1[i]>0) && (c2[j]==c1[i+j])) j++;
if (j==l) printf("%d\n",i);
i++;
}

Согласен, что длину я зря приплел.. (


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 29.03.2024 7:42
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name