Официальный сайт студ.городка НГТУ
Программирование и БД » [C++ Builder] Вывод на экран символов, которые встречаются только один 

#1  08.04.11 08:18

[C++ Builder] Вывод на экран символов, которые встречаются только один

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

Код::

TStringList *list = new TStringList();
int i=1, len;
memGet->Clear();
list->Text = memEnter->Text;

len=list->Strings[i].Length();

for (i=0;i<len;i++)
{
int count=0;
for(int j=0;j<len;j++)
{
if (list->Strings[i]==list->Strings[j])
count++;
}
if (!count)
memGet->Lines->Add(list->Strings[i]);
}

delete list;

Offline

#2  08.04.11 11:42

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

кхм... может ты тогда расскажешь по каждой строчке чего ты тут делаешь? ну, так сказать, чтобы ты сам понимал чего ты тут вытворяешь...

смотрим:

Nirvash написал(а):

Код::

int i=1, len;
...
len=list->Strings[i].Length();

1. зачем тебе длина второй строки?

Nirvash написал(а):

Код::

for (i=0;i<len;i++)

2. этот цикл для перебора чего нужен?

Nirvash написал(а):

Код::

for(int j=0;j<len;j++)

3. а этот цикл чего перебирает?

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

Offline

#3  08.04.11 14:47

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

1. Это просто присваивание длины строки параметру len.
2. Для перебора первой строки.
3. Для перебора второй строки, вернее перебор той же строки.
Если элементы совпадают, добавляем в счетчик.
Далее выводим только те символы, чей счетчик равен единице.

Offline

#4  08.04.11 15:04

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

ну, тогда почитай документацию на тип TStringList, какие методы и поля он имеет, как с ними работать... так же надо тебе почитать про тип TString, какие методы и поля он предоставляет для доступа непосредственно к каждому символу строки.

Offline

#5  08.04.11 15:35

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

Jaguar, почитал. Только ошибки все еще не вижу :)

Offline

#6  08.04.11 15:43

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

Nirvash, значит очень плохо читал.
У тебя в голове есть разница между понятиями "строка" и "символ"?

Offline

#7  08.04.11 15:45

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

Draloskop, что-то есть. Насколько я понимаю, String - это строка. А String[i] - собственно элемент строки, то есть символ. Или я что-то путаю?

Offline

#8  08.04.11 15:48

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

Не путаешь. Но вот только "list->Strings", это не то же самое, что "String". Здесь соответствие такое:
list->Strings - множество строк
list->Strings[i] - отдельная строка, множество сиволов.

Offline

#9  08.04.11 15:48

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

Nirvash написал(а):

Или я что-то путаю?

вероятно путаешь

Nirvash написал(а):

String[i]

и

Nirvash написал(а):

Strings[i]

я полагаю, разжевывать не надо?

Offline

#10  08.04.11 15:50

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

Нужно вывести алфавит, используемый в тексте, то есть все буквы, которые в нём появляются, по одному разу. Правильно я понял задачу?

Offline

#11  08.04.11 15:57

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

Draloskop, думаю, ты правильно понимаешь задание... а вот автор не до конца...

Offline

#12  08.04.11 15:58

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

Jaguar, туго до меня доходит, однако :)

Draloskop, нет. У нас есть входной поток  символов. Например 'aaаbbcdddd'. Проходим по всей строке и в memGet выведется только c. Таким образом, надо вывести только те символы, которые встречаются один раз.

P.S. на С++ такую задачу уже решал, а вот в Builder'е сложнее.

Исправлено Nirvash (08.04.11 15:59)

Offline

#13  08.04.11 16:07

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

Короче вот тебе алгоритм, прямо из печки, свеж и пахнет вкусно. Решит любую подобную задачу: и твою, и мою и даже если надо будет найти букву, которая встретилась ровно 666 раз в тексте.
Допустим ты используешь самый обыкновенный char[], AnsiString и иже с ними. Там всего 256 уникальных символов может быть. Создаёшь массив из обычных целых чисел. Берёшь первый символ из входного потока. Допустим у него код 0x30 = 48. Ты увеличиваешь 48-й элемент своего массива целых чисел на единичку. Переходишь к следующему символу и заново.
Потом, как обработаешь весь текст - пробегаешь по массиву целых чисел и выводишь все символы, у которых там в ячейке единичка будет. Варьируя вот это последнее условие можешь менять логику выборки своей.

Offline

#14  08.04.11 16:08

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

И если даже там у тебя юникод, драмы не произойдёт, создашь массив целых чисел не на 256 элементов, а на 65 тыщ с копейками.

Offline

#15  08.04.11 16:09

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

Nirvash написал(а):

Draloskop, нет. У нас есть входной поток  символов. Например 'aaаbbcdddd'.

вот как раз "да"... пойми, входной поток - это не одна строка... это может быть и многострочный текст....
хорошо... предположим, что ты запутался и принял массив строк, за массив символов... объясни мне, на кой ты бирешь тогда очередной символ и сравниваешь со всеми символами в строке? ведь вложенный цикл именно это показывает...

на самом деле твоя задача сводится к тому, чтобы пройтись по тексту (по всем символам всех строк) и заполнить простой массивчик из 255 элементов... ну, либо прям создавать тот самый "алфавит", или хэш-таблицу, соответствия символу кол-во появлений в тексте... чуешь разницу? т.е. реально тут один цикл по строкам, второй (вложенный) по каждому символу в строке... а у тебя чего там написано?

Offline

#16  08.04.11 16:11

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

Draloskop, ну, на самом деле не 256.. .и даже не 255... нулевой символ (окончание строки) учитывать не надо... также и символы "\r" "\n"... но это уже мелочи :)

Исправлено Jaguar (08.04.11 16:12)

Offline

#17  08.04.11 16:14

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

Имею в виду, что 256 будет достаточно)

Offline

#18  08.04.11 16:25

Re: [C++ Builder] Вывод на экран символов, которые встречаются только один

Спасибо, попробую разобраться :)

Offline

Программирование и БД » [C++ Builder] Вывод на экран символов, которые встречаются только один 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.678 сек.
Выполнено 14 запросов.