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

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

02.02.2014, 21:31. Просмотров 2154. Ответов 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-х символов и составить из них...

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

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

18
zss
Модератор
Эксперт С++
7179 / 6678 / 4226
Регистрация: 18.12.2011
Сообщений: 17,622
Завершенные тесты: 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
Комп_Оратор)
Эксперт по математике/физике
7053 / 3356 / 454
Регистрация: 04.12.2011
Сообщений: 9,338
Записей в блоге: 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
zss
Модератор
Эксперт С++
7179 / 6678 / 4226
Регистрация: 18.12.2011
Сообщений: 17,622
Завершенные тесты: 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
Комп_Оратор)
Эксперт по математике/физике
7053 / 3356 / 454
Регистрация: 04.12.2011
Сообщений: 9,338
Записей в блоге: 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
Модератор
Эксперт С++
7179 / 6678 / 4226
Регистрация: 18.12.2011
Сообщений: 17,622
Завершенные тесты: 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
Комп_Оратор)
Эксперт по математике/физике
7053 / 3356 / 454
Регистрация: 04.12.2011
Сообщений: 9,338
Записей в блоге: 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
Комп_Оратор)
Эксперт по математике/физике
7053 / 3356 / 454
Регистрация: 04.12.2011
Сообщений: 9,338
Записей в блоге: 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
Комп_Оратор)
Эксперт по математике/физике
7053 / 3356 / 454
Регистрация: 04.12.2011
Сообщений: 9,338
Записей в блоге: 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
Модератор
Эксперт С++
7179 / 6678 / 4226
Регистрация: 18.12.2011
Сообщений: 17,622
Завершенные тесты: 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
Модератор
Эксперт С++
7179 / 6678 / 4226
Регистрация: 18.12.2011
Сообщений: 17,622
Завершенные тесты: 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

Найти слово, начинающееся с самой младшей латинской буквы и возвратить индекс его начала
Дана строка, содержащая некоторый текст (включая пробелы и знаки препинания)....

Дана строка длиной не более 80 символов, оканчивающаяся точкой. Подчеркнуть все гласные буквы в строке
Дана строка длиной не более 80 символов, оканчивающаяся точкой. Подчеркнуть все...

Найти слова длиной не более трех символов
в строке, содержащей слова через пробел, найти слова не более 3-х символов и...


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

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

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