Помогите пожалуйста описать алгоритм, а то не знаю даже с чего начать, чтобы все условия задания были выполнены

вот задание

это как бы напутствие

Вариант задания реализовать в виде функции, использующей для работы со строкой и матрицами только указатели и операции вида *P++, P++ итд Если функция возвращает строку или ее фрагмент, то это также необходимо сделать через указатель. Строки и матрицы динамические, размер вводится с клавиатуры. Числовые значения считать целыми. Инициализацию матриц реализовать через датчик случайных чисел или ввод с клавиатуры. Строки вводить с клавиатуры. Результат программы записать в файл.

Выполнить следующее задания, не используя стандартные операции и процедуры для строк и символов


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

Комментарии
07.01.2010 в 20:44

WAAAAAAAAAGH!!!!!!1111ONEONE
заводишь массив int charOccur[256];
проходишь по массиву и на каждый символ инкрементируешь соответствующий элемент массива на 1. потом делаешь выхлоп. мысль ясна?
07.01.2010 в 21:24

всех символов 256?

берем символ из текста, проверяем есть ли он в массиве, если есть добавляем счетчик единицу, если нет
добавляем символ в конец массива счетчик 1

далее в файл, символ - кол-во


а есть еще как вариант

берем символ узнаем его анси код, он ведь в пределах 256, и забиваем его в массив номером его кода

к примеру? символ А , код 14
забиваем в массив masiv[14]

далее если его встречаем дабавим счетчик 1

так можно???

указатели чутка проблемно, может сначала без них наваять, а потом будет не так сложно подправить???
07.01.2010 в 21:28

не используя стандартные операции и процедуры для строк и символов

это как??

на заочке учусь, особо и спрасить не укого..
раньше на delphi, всяк мелочи писал для себя..
07.01.2010 в 21:32

WAAAAAAAAAGH!!!!!!1111ONEONE
vadimpirov
если не юникод, то 256 символов хватит для большинства кодировок
идея такая, что ты в массив записываешь количество повторений каждого символа.
char *myString;
int numOccur[256];
int i = 0;
// тут чтение и т.п. фигня
for(i = 0; i < strlen(myString), i++) {numOccur[myString[i]]++;} // вот и посчитали все
07.01.2010 в 21:48

наверн нужно проветрится)) торможу

думал делать 2 массива, в одном символ , во втором кол-во

m[14] = A
m[14] = 9


запись не совсем понятна

{numOccur[myString[i]]++;}

myString[i] -- получим символ номером i
к примеру А

{numOccur[A]++;}

а это по символу найдет счетчик и увеличит его???

все дело в том что весь код над прокомментировать.. наверн надо еще лит-ру почитать
07.01.2010 в 22:08

WAAAAAAAAAGH!!!!!!1111ONEONE
ну в сях char - это один байт. со всеми вытекающими. т.е. (int)'A' - это будет аски код.
08.01.2010 в 01:32



вот что пока получилось,, а как быть с пробелами ??? как только пробел то получается конец строки..

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

или пробелы не нужны?? и от них вначале избавиться? либо есть другие способы
08.01.2010 в 04:38

потестил явно есть ошибки(( с большим кол-вом символов программка валится...

да еще статейка про

Арифметические операции с указателями (сложение, вычитание, инкремент и декремент)

наводит на мысль, что да и не тем способ пытаюсь сделать..

надеюсь на Вашу помощь..
08.01.2010 в 14:06



уже на пробелах не останавливаюсь,, но получается ограничение на длину строки , в дан случае 64

и русские буквы пропускает((
08.01.2010 в 15:07

Per anus ad astra!
> myString = new char [64];
Прости, а тебе не кажется ли, что если ты заводишь строку на 64 символа, то больше в неё и не влезет?)
Или динамическое сделай, или побольше.

А русские буквы - может от среды зависит. Проверь, как у тебя русские буквы в твою строку попадают и какие численные значения имеют.
08.01.2010 в 15:46

на 64 символа, то больше в неё и не влезет?)

это то понятно)) как узнаать длину строки во время работы программы??

len=strlen(myString); показывает длину до первого пробела

как это реализовать??


русские буквы - значения отрицательные
гдет встречалось что надо использовать unsigned char, проблемма решится
правда с заменной char на unsigned char, появл другие ошибки((


а код надо ведь править ?? относительно условий задачи

*.... для работы со строкой и матрицами только указатели и операции вида *P++, P++ ....*


сделал так

numOccur[((unsigned char)myString[i])]++ ;

теперь русские норм! но кодировка чутка пострадала, пришлось
"Символ - Кол-во - Код символа" писать в транслите, тогда норм
09.01.2010 в 15:37

Per anus ad astra!
>как узнаать длину строки во время работы программы??
Есть много способов.)
Самый простой из них - юзать библиотеку string, но вам так делать запретили, как я понимаю.(
Можно считывать их в динамический массив и расширять его по мере надобности.
Можно просто завести массив на 65536 чаров и быть увереным, что виндозовская консоль матюгнётся раньше, чем твоя программа. :~P

>len=strlen(myString); показывает длину до первого пробела
Имя некрасивое для функции взял. Перекликается со стандартной функцией для стрингов.

>как это реализовать??

Например, таким образом:

int i = sizeof s;
for (int j = 0; j<=i; ++j)
{
if (s[j] == ' ') (i = j);
};
return(i);

>а код надо ведь править ?? относительно условий задачи
Ну, например, цикл построй так:

j = sizeof myString;
char * c;
c = myString;

for(i=0; i < j;++i, ++c)
{
numOccur[((unsigned char)*c)]++ ;
}


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




Кстати, я так подумал... По большому счёту не нужно даже строку заводить, можно просто по символу из консоли читать пока строка не закончится, эффект будет тот же, только памяти меньше нужно.)
10.01.2010 в 04:33



перечитал условия
*размер вводится с клавиатуры.* изменил чутка, и вынес в функцию
Нужно еще что-то править??

PS Спасибо всем за поддержку!)
10.01.2010 в 13:29

Per anus ad astra!
Класс.) Если всё работает, то править уже ничего не стоит.)