Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ed8009
7 / 7 / 1
Регистрация: 31.08.2011
Сообщений: 135
#1

Файлы и строки: проверить каждую строку на сходство друг с другом - C++

23.05.2013, 14:13. Просмотров 1160. Ответов 10
Метки нет (Все метки)

У меня такой вопрос, допустим у нас есть текстовый файл, там ОЧЕНЬ много символов, мне нужно проверить каждую строку на сходство друг с другом. Если разбить этот файл на 2 части(т.е. создать еще один файл и туда поместить половину строк от первого), то программа быстрее будет работать? Или это все глупости?)
Если глупости, то каким образом можно ускорить работу программы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2013, 14:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Файлы и строки: проверить каждую строку на сходство друг с другом (C++):

Умножить каждую строку исходной матрицы на наименьший по значению элемент соответствующей строки - C++
Получить новую матрицу путем умножения элементов каждой строки исходной матрицы на наименьший по значению элемент соответствующей строки.

Прокомментировать каждую строку кода (или хотя бы каждую функцию) - C++
нашел программу в интернете, только ничего не понял) можете прокомментировать каждую строку (ну или хотя бы каждую функцию) #include...

Строки. Преобразовать строку, заменяя каждую цифру соответствующим ей числом символов нижнего подчеркивания - C++
Нужно преобразовать строку, заменяя каждую цифру соответствующим ей числом символов нижнего подчеркивания. Например: «3 слона» -> «_ _...

Проверить, можно ли из букв строки А составить строку В - C++
Помогите пожалуйста с программой. Дана задача: Даны два текстовых поля А и В. Составьте программу, проверяющую, можно ли из букв,...

Объединить два массива друг за другом - C++
1. Даны 2 одномерных массива А и В по К элементов каждый. Создать 3-й массив С из К * 2 элементов, переписывая сначала у него все...

Создать функцию обработки строки. Проверить строку на симетричность - C++
Вечер добрый. Для защиты лабораторной дали вот такое вот индивидуальное задание. Не могли бы вы подсказать как реализовать данную...

10
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.05.2013, 14:38 #2
Выходит, что у тебя есть примерно такой файл?
"1234567
123
1
123456789
1234
1234
12345678"
, так?

Если да, то разбивать ничего не нужно. Это глупость. Просто если строки длинные (как вы сказали "много символов"), то самым правильным будет вместо проверки самих строк сначала проверять равенство их длин, а уж потом, если совпадут, и сами строки на равенство. Более того, если первая строка была проверена со всеми остальными, то вам не нужно больше её трогать, и трогать те, что были проверены. Можно завести доп. массив флагов для строк. Примерный код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (int i = 0; i < n - 1; ++i)
{
    if (flag[i] == 0)
    {
        for (int j = i + 1; j < n; ++ j) //j подстраивается под i. Это нужно для того, чтобы не проверять уже проверенные строки
        {
            if (flag[j] == 0 && length[i] == length[j] && str[i] == str[j]) // равенство строк не проверяется, если не выполняется второе или первое
            {
                //do something. j-ая строка - это строка-копия i-ой строки.
                flag[j] = 1; 
            }
        }
    }
}
Если же строк много, но их длина не большая, то лучше будет тогда убрать length. (небольшая = ~5-15 символов. Хотя я точно не уверен в этом)
1
ed8009
7 / 7 / 1
Регистрация: 31.08.2011
Сообщений: 135
23.05.2013, 14:55  [ТС] #3
Мне очень понравилась идея, спасибо)

Добавлено через 7 минут
Можно еще вопрос? Как мне начинать проверку? Как мне считать первую строку так, что бы сравнение шло уже со второй строки. Я думал сравнивать getline(строка, sizeof(строка)), ведь таким образом размер строки будет определяться сам.
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.05.2013, 15:20 #4
ed8009, не понял вопроса.
0
ed8009
7 / 7 / 1
Регистрация: 31.08.2011
Сообщений: 135
23.05.2013, 15:22  [ТС] #5
Как проверить строки на равенство? Просто во всех примерах одна строка уже известно и ее сравнивают с остальными в файле.
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.05.2013, 15:32 #6
ed8009, опять не понял.
Файл большой-пребольшой? Его можно засунуть в обычный массив строк? Если да, то считываете весь файл и сверяете строки. Если нет, то можно пойти "обходом" : считать каждую строку отдельно, подсчитывая их length. Закрыть файл и открыть его в двоичной форме, где можно будет при помощи fseek и используя массив length гулять по самим строкам. В обычном файле такое не прокатит, он последовательного доступа.
0
ed8009
7 / 7 / 1
Регистрация: 31.08.2011
Сообщений: 135
23.05.2013, 15:37  [ТС] #7
Файл большой-пребольшой. Размер строки может быть 10, а может и 5000. Я тогда думал сделать так
#define MAXBUF 5000
char s[MAXBUF]
Но таким образом мы будем долго проверять файл.
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.05.2013, 15:42 #8
ed8009, а кол-во строк сколько может быть?
0
ed8009
7 / 7 / 1
Регистрация: 31.08.2011
Сообщений: 135
23.05.2013, 15:43  [ТС] #9
Сколько угодно.
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.05.2013, 15:51 #10
ed8009, ну тогда делаешь вторым способом (используя двоичный файл).
Заводишь:
C++
1
2
#define MAXBUF 5000
 char s[MAXBUF]
и читаешь строки одну за другой, высчитываешь их length, потом по алгоритму.
Фактически, будет прочитано "n+n+(n-1)+(n-2)+..2"-строк.
0
ed8009
7 / 7 / 1
Регистрация: 31.08.2011
Сообщений: 135
23.05.2013, 15:56  [ТС] #11
Ага, понятно, спасибо огромное!)
0
23.05.2013, 15:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2013, 15:56
Привет! Вот еще темы с ответами:

Размещение панелек друг над другом в псевдографике - C++
Не знал, куда такое задание кинуть, надеюсь, что попал по адресу. Если что это задание для первокурсника факультета информатики. ...

Проверить одну строку на наличие в ней слова из второй строки - C++
Программа просит ввести строку №1 и строку №2. Первая строка больше второй. Затем если в первой строке присудствует фраза либо слово из...

Вывести четыре следующих друг за другом гласных букв - C++
Есть строка, состоящая из слов, разделенных любым количеством пробелов. Напишите программу, которая выводит на экран четыре и более...

Как объединить столбцы таблицы под друг другом? - C++
Всем привет! я новичок в программировании. Заранее извиняюсь за тупой вопрос. Мне нужно чтобы три столбца (предположим как в excel)...


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

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

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