Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
sergeevichvn
0 / 0 / 0
Регистрация: 02.02.2014
Сообщений: 8
1

Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них

02.02.2014, 21:31. Просмотров 2717. Ответов 18
Метки нет (Все метки)

Всем добрый вечер.
Собственно нужна ваша помощь, есть условие:
"Найти в строке два одинаковых фрагмента (не включающих в себя пробелы) длиной более 5 символов и возвратить индекс начала первого из них (т.е. для “aaaaaabcdefgxxxxxxbcdefgwwwww” вернуть n=6 - индекс начала “bcdefg”)."
Кто может помочь с решением задачи, написанием кода? Ну или хотя бы доходчиво объяснить, что от меня требуется, как должна работать программа?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2014, 21:31
Ответы с готовыми решениями:

Найти в строке два одинаковых фрагмента (не включая пробелы) длиной более 5 символов
Привет всем вопрос состоит:Найти в строке два одинаковых фрагмента (не включая пробелы) длиной...

Найти слова в исходной строке длиной не более 3-х символов и составить из них новую строку
найти слова в исходной строке длиной не более 3-х символов и составить из них новую строку, ввод...

Найти слова в исходной строке длиной не более 3-х символов и составить из них новую строку
найти слова в исходной строке длиной не более 3-х символов и составить из них новую строку, ввод...

Возвратить индекс начала фрагмента, симметричного относительно центрального символа
Буду благодарен. Возвратить индекс начала фрагмента, симметричного относительно центрального...

Найти в строке слово минимальной длины и возвратить индекс его начала
Информатика 1 курс, прошу помочь с написанием программы: Найти в строке слово минимальной длины...

18
zss
Модератор
Эксперт С++
8085 / 7226 / 4500
Регистрация: 18.12.2011
Сообщений: 19,100
Завершенные тесты: 1
02.02.2014, 21:44 2
C
1
2
3
4
5
6
7
8
9
10
11
#include <string.h>
#include <stdio.h>
int main()
{
    char str[]=“aaaaaabcdefgxxxxxxbcdefgwwwww” ;
    char srs[]=“bcdefg”;
    int pos;
    pos=strstr(str,src);
    printf("позиция фрагмента %s =%d",srs,pos);
    retun 0;
}
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7299 / 3555 / 486
Регистрация: 04.12.2011
Сообщений: 10,040
Записей в блоге: 5
03.02.2014, 00:59 3
sergeevichvn, могут ли перекрываться фрагменты:
"тратратр" ?
0
Fene4ka_
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,244
03.02.2014, 02:01 4
zss, строка должна быть любой, в вашем же случае такое работать не будет
0
03.02.2014, 02:01
zss
Модератор
Эксперт С++
8085 / 7226 / 4500
Регистрация: 18.12.2011
Сообщений: 19,100
Завершенные тесты: 1
03.02.2014, 13:37 5
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
строка должна быть любой
Так добавьте команду ввода строки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <string.h>
#include <stdio.h>
int main()
{
    int pos;
    char str[100];
    char srs[50];
    puts("Где ищем:");
    gets(str);
    puts("Что ищем:");
    gets(srs);
    pos=strstr(str,src);
    printf("позиция фрагмента %s =%d",srs,pos);
    retun 0;
}
0
Fene4ka_
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,244
03.02.2014, 16:51 6
zss, также на сколько я понимаю, мы не должны вводить, что ищем, а оно должно само найти, что ищем ...
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7299 / 3555 / 486
Регистрация: 04.12.2011
Сообщений: 10,040
Записей в блоге: 5
03.02.2014, 16:54 7
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
zss, также на сколько я понимаю, мы не должны вводить, что ищем, а оно должно само найти, что ищем ...
Так функцию же показали. А из строки ввести разве сложнее чем с консоли? Вот тут много лишнего, но как рабочий вариант (не проверял дотошно ) :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
 
int main()
{
char sourcestr[]="olo lol tratratrumbumbumubumbum bum bum bum";
const size_t size_compiring_str = 5;
char compiring_str[size_compiring_str+1]={0};
 
size_t pos_cmp=0;
size_t pos_fnd=pos_cmp+1;
char *find_pos=0;
char *rezult_pos=0;
size_t size_sourcestr = sizeof(sourcestr)/sizeof(char);
while(pos_cmp < size_sourcestr){
while(pos_fnd < size_sourcestr){
find_pos=0;
rezult_pos=0;
strncpy(compiring_str, &sourcestr[pos_cmp], size_compiring_str); 
if((find_pos = strstr(&sourcestr[pos_fnd], compiring_str))!=0){
rezult_pos=&sourcestr[pos_cmp]; 
    break;
}
pos_fnd++;
}
if(find_pos!=0){
    break;
}
pos_cmp++;
pos_fnd=pos_cmp+1;
}
if(find_pos){
cout<<"the first entry is "<<rezult_pos<<" at pos "<<pos_cmp<<" in "<<sourcestr<<endl;
cout<<"and the substring is "<< find_pos;
}
else
cout<<"position is not found";
 
cout<<endl;
system("pause");
return 0;
}
Если перекрываться могут, но ТС молчит, как партизан.
0
zss
Модератор
Эксперт С++
8085 / 7226 / 4500
Регистрация: 18.12.2011
Сообщений: 19,100
Завершенные тесты: 1
03.02.2014, 17:16 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <string.h>
#include <stdio.h>
int main()
{
    int L;
    char str[100];
    char srs[7],*pos;
    puts("Где ищем:");
    gets(str);
    L=strlen(str);
    for(int i=6;i<L-6;i++)
    {
        strncpy(srs,str+i-6,6); // берем очередные 6 символов из строки
        srs[6]=0;
        pos=strstr(str+i,srs); // ищем после последнего взятого символа
        if(pos!=NULL)
           printf("позиция второго фрагмента %s =%d",srs,(int)(pos-str));
    }
    return 0;
}
1
sergeevichvn
0 / 0 / 0
Регистрация: 02.02.2014
Сообщений: 8
03.02.2014, 23:51  [ТС] 9
Я так понимаю, мы с клавиатуры вводим строку, в этой строке нужно найти два одинаковых фрагмента из 5 символов, в переменную возвращается индекс, после которого начинается этот фрагмент.

Что значит перекрываются?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7299 / 3555 / 486
Регистрация: 04.12.2011
Сообщений: 10,040
Записей в блоге: 5
04.02.2014, 01:37 10
Цитата Сообщение от sergeevichvn Посмотреть сообщение
Что значит перекрываются?
То есть буквально. Но не абсолютно. Я же пример в вопросе привёл и в коде тоже два фрагмента перекрываются. Первый содержит несколько символов следующего:
tratratr
tratr это фрагмент, а перекрываются они по tr.
Поскольку Вы не оговорили этот момент, то следует полагать, что перекрываться они могут. Но в задании, возможно, это оговорено, поэтому я и спрашивал. Впрочем, для случая неперекрывающихся фрагментов переделать пара пустяков. Сдвигать в первой итерации не на 1, а на 5.
0
sergeevichvn
0 / 0 / 0
Регистрация: 02.02.2014
Сообщений: 8
04.02.2014, 02:32  [ТС] 11
Задание скопировано, это все условие, которое давалось.
То что написали Вы, кажется не совсем то, если я покажу такой код препод офигеет. Мы азы только прошли
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7299 / 3555 / 486
Регистрация: 04.12.2011
Сообщений: 10,040
Записей в блоге: 5
04.02.2014, 02:43 12
Цитата Сообщение от sergeevichvn Посмотреть сообщение
Задание скопировано, это все условие, которое давалось.
То что написали Вы, кажется не совсем то, если я покажу такой код препод офигеет. Мы азы только прошли
Значит могут перекрываться. Что касается кода, то чем он короче, тем красивее и лучше, обычно. Такой код, который предложил zss, новичёк конечно может написать. Но это либо случайно или очень талантливый новичёк (имхо).
А что касается:
Цитата Сообщение от sergeevichvn Посмотреть сообщение
препод офигеет.
то это же его работа.
Главное, что бы Вы понимали, что происходит и почему, и разобравшись смогли написать что-то осмысленное(имхо).
0
sergeevichvn
0 / 0 / 0
Регистрация: 02.02.2014
Сообщений: 8
04.02.2014, 03:00  [ТС] 13
Цитата Сообщение от IGPIGP Посмотреть сообщение
Главное, что бы Вы понимали, что происходит и почему, и разобравшись смогли написать что-то осмысленное(имхо).
#include <string.h> // Подключаем библиотеки
#include <stdio.h> // Подключаем библиотеки
int main()
{
int L; // Объявляем переменную L типа integeer
char str[100]; //создаем массив символьного типа
char srs[7],*pos; //создаем массив символьного типа, + переменную pos (НЕ понятно, что значит звездочка)
puts("Где ищем:"); //вывод строки на экран, наверное лучше printf
gets(str); // получаем строку с клавиатуры и записываем в массив str
L=strlen(str); //присваиваем переменной l значение длинны введенной строки
for(int i=6;i<L-6;i++) // цикл выполняется пока i меньше длина строки-6 симвоолов
{
strncOpy(srs,str+i-6,6); // берем очередные 6 символов из строки // тут не совсем понятно, что в скобках
srs[6]=0; // присваиваем 6 элементу массива 0?
pos=strstr(str+i,srs); // ищем после последнего взятого символа //что значит strstr, почему два раза и что в скобках?
if(pos!=NULL) // условие, если переменная пос не равна 0, выводим на экран
printf("позиция второго фрагмента %s =%d",srs,(int)(pos-str));
}
return 0;
}
0
Fene4ka_
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,244
04.02.2014, 03:10 14
sergeevichvn, а в теги С++ не судьба была вставить ?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7299 / 3555 / 486
Регистрация: 04.12.2011
Сообщений: 10,040
Записей в блоге: 5
04.02.2014, 03:29 15
sergeevichvn, в левом верхнем углу окна редактора сообщений, средняя строка линейки начинается символом С++. Ткнув его вы получите в окне пару тегов (открывающий/закрывающий) форматирования кода:
[CPP][/CPP]. Поставив курсор между ними и скопировав код, Вы сможете представить его, так:
C++
1
int *a;
звёздочка это символ, специфицирующий объявляемый тип, как указатель в данном объявлении. В выражениях это может быть знак операции умножения или разадресации.
O в strncpy, действительно не нужно, но Вам же показывают идею, а не дают, непременно, работающий код. Отвечающий может не располагать временем, например. Помощь ведь не в том, чтобы сделать за Вас работу, а в том, чтобы помочь Вам её сделать.
И ещё о окне форума и его фичах. Внизу под каждым постом, есть кнопка "спасибо". Это не обязательная процедура, но обычно ею пользуются. Чтобы потренироваться, нажмите здесь:
Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них
демонстрируя признательность автору поста. Это будет, просто, нормально.
1
sergeevichvn
0 / 0 / 0
Регистрация: 02.02.2014
Сообщений: 8
04.02.2014, 03:42  [ТС] 16
Спасибо ребят, дальше сам попробую разобраться
0
zss
Модератор
Эксперт С++
8085 / 7226 / 4500
Регистрация: 18.12.2011
Сообщений: 19,100
Завершенные тесты: 1
04.02.2014, 17:39 17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <string.h> // Подключаем библиотеки
#include <stdio.h> // Подключаем библиотеки
int main()
{
   int L; // Объявляем переменную L типа integeer
   char str[100]; //создаем массив символьного типа
   char srs[7]; //создаем массив символьного типа, 
   char *pos;//+ переменную pos - указатель на char. В ней будет храниться адрес начала фрагмента
   puts("Где ищем:"); //вывод запроса на экран,  printf не лучше,т.к. в строке нет символов форматирования 
   gets(str); // получаем строку с клавиатуры и записываем в массив str
   L=strlen(str); //присваиваем переменной l значение длинны введенной строки
   for(int i=6;i<L-6;i++) 
   // цикл начинаем с конца первого 6-символьного фрагмента и выполняется пока i меньше длина строки-длина фрагмента
   {
        strncopy(srs,str+i-6,6); // берем очередные 6 символов из строки 
// тут не совсем понятно, что в скобках: srs - куда копируем,str+i-6 начиная откуда копировать,6 - не более 6 символов.
        srs[6]=0; // присваиваем 6 элементу массива 0. Ноль - это признак конца строки.
        pos=strstr(str+i,srs); // ищем после последнего взятого символа 
//что значит strstr - функция поиска подстроки srs В строке str начиная с i-го символа
        if(pos!=NULL) // если указатель pos нулевой, то такой подстроки нет
               printf("позиция второго фрагмента %s =%d",srs,(int)(pos-str));
   }
   return 0;
}
1
sergeevichvn
0 / 0 / 0
Регистрация: 02.02.2014
Сообщений: 8
04.02.2014, 23:48  [ТС] 18
Цитата Сообщение от zss Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <string.h> // Подключаем библиотеки
#include <stdio.h> // Подключаем библиотеки
int main()
{
   int L; // Объявляем переменную L типа integeer
   char str[100]; //создаем массив символьного типа
   char srs[7]; //создаем массив символьного типа, 
   char *pos;//+ переменную pos - указатель на char. В ней будет храниться адрес начала фрагмента
   puts("Где ищем:"); //вывод запроса на экран,  printf не лучше,т.к. в строке нет символов форматирования 
   gets(str); // получаем строку с клавиатуры и записываем в массив str
   L=strlen(str); //присваиваем переменной l значение длинны введенной строки
   for(int i=6;i<L-6;i++) 
   // цикл начинаем с конца первого 6-символьного фрагмента и выполняется пока i меньше длина строки-длина фрагмента
   {
        strncopy(srs,str+i-6,6); // берем очередные 6 символов из строки 
// тут не совсем понятно, что в скобках: srs - куда копируем,str+i-6 начиная откуда копировать,6 - не более 6 символов.
        srs[6]=0; // присваиваем 6 элементу массива 0. Ноль - это признак конца строки.
        pos=strstr(str+i,srs); // ищем после последнего взятого символа 
//что значит strstr - функция поиска подстроки srs В строке str начиная с i-го символа
        if(pos!=NULL) // если указатель pos нулевой, то такой подстроки нет
               printf("позиция второго фрагмента %s =%d",srs,(int)(pos-str));
   }
   return 0;
}
Огромное спасибо, если сдам, готов пополнить ваш баланс кармы

Добавлено через 52 минуты
15 31 D:\Безымянный1.cpp [Error] 'strncopy' was not declared in this scope - ошибка на строке strncopy(srs,str+i-6,6);
0
zss
Модератор
Эксперт С++
8085 / 7226 / 4500
Регистрация: 18.12.2011
Сообщений: 19,100
Завершенные тесты: 1
05.02.2014, 11:13 19
Цитата Сообщение от sergeevichvn Посмотреть сообщение
D:\Безымянный1.cpp [Error] 'strncopy' was not declared in this scope - ошибка на строке strncopy(srs,str+i-6,6);
Не знаю как оно получилось, но в оригинале было правильно (без буквы o)
C++
1
strncpy(srs,str+i-6,6);
Похоже, это вы ее вставили в 13 посте.
1
05.02.2014, 11:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2014, 11:13

Текст, состоящий не более чем из 255 символов, разбить на строки длиной не более 50 символов в строке
Текст, состоящий не более чем из 255 символов, разбейте на строки длиной не более 50 символов в...

Найти в строке фрагменты, содержащие последовательность одинаковых символов длиной более 3
Задача:Функция находит в строке фрагменты, содержащие последовательность одинаковых символов длиной...

В заданной строке заменить все последовательности одинаковых символов длиной более двух на конструкцию
Не могу понять в чем ошибка... Прога не работает... Задание такое: В заданной строке заменить все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru