Помогите пожалуйста описать алгоритм, а то не знаю даже с чего начать, чтобы все условия задания были выполнены
вот задание
это как бы напутствие
Вариант задания реализовать в виде функции, использующей для работы со строкой и матрицами только указатели и операции вида *P++, P++ итд Если функция возвращает строку или ее фрагмент, то это также необходимо сделать через указатель. Строки и матрицы динамические, размер вводится с клавиатуры. Числовые значения считать целыми. Инициализацию матриц реализовать через датчик случайных чисел или ввод с клавиатуры. Строки вводить с клавиатуры. Результат программы записать в файл.
Выполнить следующее задания, не используя стандартные операции и процедуры для строк и символов
Написать функцию, которая для каждого символа заданного текста выводит, сколько раз он встречается в тексте. Сообщение об одном символе должно печататься не более одного раза.
вот задание
это как бы напутствие
Вариант задания реализовать в виде функции, использующей для работы со строкой и матрицами только указатели и операции вида *P++, P++ итд Если функция возвращает строку или ее фрагмент, то это также необходимо сделать через указатель. Строки и матрицы динамические, размер вводится с клавиатуры. Числовые значения считать целыми. Инициализацию матриц реализовать через датчик случайных чисел или ввод с клавиатуры. Строки вводить с клавиатуры. Результат программы записать в файл.
Выполнить следующее задания, не используя стандартные операции и процедуры для строк и символов
Написать функцию, которая для каждого символа заданного текста выводит, сколько раз он встречается в тексте. Сообщение об одном символе должно печататься не более одного раза.
проходишь по массиву и на каждый символ инкрементируешь соответствующий элемент массива на 1. потом делаешь выхлоп. мысль ясна?
берем символ из текста, проверяем есть ли он в массиве, если есть добавляем счетчик единицу, если нет
добавляем символ в конец массива счетчик 1
далее в файл, символ - кол-во
а есть еще как вариант
берем символ узнаем его анси код, он ведь в пределах 256, и забиваем его в массив номером его кода
к примеру? символ А , код 14
забиваем в массив masiv[14]
далее если его встречаем дабавим счетчик 1
так можно???
указатели чутка проблемно, может сначала без них наваять, а потом будет не так сложно подправить???
это как??
на заочке учусь, особо и спрасить не укого..
раньше на delphi, всяк мелочи писал для себя..
если не юникод, то 256 символов хватит для большинства кодировок
идея такая, что ты в массив записываешь количество повторений каждого символа.
char *myString;
int numOccur[256];
int i = 0;
// тут чтение и т.п. фигня
for(i = 0; i < strlen(myString), i++) {numOccur[myString[i]]++;} // вот и посчитали все
думал делать 2 массива, в одном символ , во втором кол-во
m[14] = A
m[14] = 9
запись не совсем понятна
{numOccur[myString[i]]++;}
myString[i] -- получим символ номером i
к примеру А
{numOccur[A]++;}
а это по символу найдет счетчик и увеличит его???
все дело в том что весь код над прокомментировать.. наверн надо еще лит-ру почитать
вот что пока получилось,, а как быть с пробелами ??? как только пробел то получается конец строки..
каж чтото слышал о том пробел вначале менять на другой неиспольз символ, а потом учитывать эту замену
или пробелы не нужны?? и от них вначале избавиться? либо есть другие способы
да еще статейка про
Арифметические операции с указателями (сложение, вычитание, инкремент и декремент)
наводит на мысль, что да и не тем способ пытаюсь сделать..
надеюсь на Вашу помощь..
уже на пробелах не останавливаюсь,, но получается ограничение на длину строки , в дан случае 64
и русские буквы пропускает((
Прости, а тебе не кажется ли, что если ты заводишь строку на 64 символа, то больше в неё и не влезет?)
Или динамическое сделай, или побольше.
А русские буквы - может от среды зависит. Проверь, как у тебя русские буквы в твою строку попадают и какие численные значения имеют.
это то понятно)) как узнаать длину строки во время работы программы??
len=strlen(myString); показывает длину до первого пробела
как это реализовать??
русские буквы - значения отрицательные
гдет встречалось что надо использовать unsigned char, проблемма решится
правда с заменной char на unsigned char, появл другие ошибки((
а код надо ведь править ?? относительно условий задачи
*.... для работы со строкой и матрицами только указатели и операции вида *P++, P++ ....*
сделал так
numOccur[((unsigned char)myString[i])]++ ;
теперь русские норм! но кодировка чутка пострадала, пришлось
"Символ - Кол-во - Код символа" писать в транслите, тогда норм
Есть много способов.)
Самый простой из них - юзать библиотеку 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)]++ ;
}
>но кодировка чутка пострадала
Хм... А ты больше ничего не менял?
Просто от того, как ты в массив загоняешь символы вообще говоря не должно зависить то, как ты их выводишь...)
Кстати, я так подумал... По большому счёту не нужно даже строку заводить, можно просто по символу из консоли читать пока строка не закончится, эффект будет тот же, только памяти меньше нужно.)
перечитал условия
*размер вводится с клавиатуры.* изменил чутка, и вынес в функцию
Нужно еще что-то править??
PS Спасибо всем за поддержку!)