IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> подсчёт символов
сообщение
Сообщение #1


Гость






Здравствуйте.
Помогите пожалуйста выполнить задачу на Си. Она основано на другой уже выполнено задаче. Суть её состояла в том, что нужно было подать строку символов и выдать в итоге сколько и каких символов в ней использовалось. С этой задачей мне уже помогли на этом форуме. Прошу помочь и с её продолжением. преподаватель сказал, что теперь подавать надо не строку символов а массив чисел и сказал, что это приводит к некоторому видоизменению программы. решение предыдущей задачи заключалось в том, чтобы просто за индексы массива взять считываемые символы, а значением ячейки присваивать кол-во этих символов в строке....
Вот так прошу помочь с решением, ну или хотя бы объяснить в чём смысл изменения программы при использовании массива числового.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
в чём смысл изменения программы при использовании массива числового
Для начала давай разберемся с ограничениями. С какими числами будешь работать (меня интересует интервал значений)? Сколько будет таких чисел?

Пойми, до тех пор, пока ты не дашь эту информацию, ничего сказать нельзя. Например, если ты работаешь с числами в интервале 0 .. 255, то программа просто не изменится. Если же интервал будет 0 .. (2^32 - 1), то придется применять специальные методы обработки, ибо не получится у тебя работать с массивом такой размерности...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Понимаю...
Ну как я понял преподавателя, то проблема видимо именно в этом, что всё это дело уходит за пределы в 255....иногда сильно уходит....правда от него прозвучала странная фраза, что это не возможно а займёт много памяти, но возможно он оговорился или я не понял.... Если предположить, что дело именно в интервале и он достаточно большой то можно ли помочь мне? Был бы очень благодарен за исходник.... (если есть время, то хоть с короткими комментариями)...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
Если предположить, что дело именно в интервале и он достаточно большой то можно ли помочь мне?
Можно. Создаешь на диске файл байтов размером 2 Гб, и используешь его вместо массива. Т.е. при получении числа 2409 просто переходишь на позицию №2409 в файле (fseek), читаешь байт, находящийся на этой позиции, увеличиваешь его на 1, и пишешь назад...

Алгоритм понятен?

Ограничения: максимальные значения счетчиков не более 255 (если работать с файлом из байтов).
Преимущества: допустимый интервал чисел: 0 .. 2147483647

Такой метод устроит?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






меня да а вот препод сказал, что как раз надо бы обойтись без крупных файлов...можно ещё что - то придумать, но вот если честно алгоритм не понял, если можно другой? Если нельзя то очень буду благодарен исходнику хотя бы этого, так си я только начал учить вот и с файлами и всем подобным работаю не очень....
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Ага... Без крупных файлов, без современных компиляторов, без...

Без компьюьера не надо обойтись?

Все остальные варианты будут занимать память (которой и так всегда не хватает), что менее желательно, чем работа с большим файлом... Хочешь - реализуй Hash, но это скорее всего даст тебе только проигрыш, ибо опять же, ты не сказал НИЧЕГО об интервалах, и НИЧЕГО о количестве чисел. Больше я на пустые вопросы отвечать не буду. Хочешь конкретики - давай информацию.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Извини... постараюсь более конкретно, но не могу сказать больше чем сказали мне.... почти дословно - количество чисел намного больше чем 255 и массив здесь не катит, в качестве примера привели
+- 2147483647, что то в этом роде, точно я число конечно не помню, но скорее так.... всё что я знаю... т.е. ты во всём прав только теперь у меня не хватает знаний чтобы так сделать вот в чём вся проблема....
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






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

12 654 7852 12 7852
результат
12 - 2 раза
654 - 1 раз
7852 - 2 раза
Вот так. Если можно опять попрошу помочь.... вообще я немного не понимаю есть ли в этой задаче подвох?
В общем помогите пожалуйста.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Ну видимо тут 2 варианта, либо сортировать массив, потом подсчитывать, либо вот так :

# include <stdio.h>
# include <conio.h>
# include <stdlib.h>

void InitArray(int *&arr, int n)
{
arr = (int*)malloc(n * sizeof(int));

for (int i = 0; i < n; i++)
{
printf("arr[%d]=", i);
scanf("%d", (arr+i));
}
}

void PrintArray(int *arr, int n)
{
printf("\n");
for (int i = 0; i < n; i++) printf("arr[%d] = %d\n", i, arr[i]);
}

int Del(int *arr, int n, int value)
{
int i = 0;

while (i < n)
{
if (arr[i] == value)
{
for (int j = i; j < n; j++)
arr[j] = arr[j+1];
--n;
}
else i++;
}

return n;

}


void GetInfo(int *arr, int n)
{
printf("\n");

int i = 0;
while (i < n)
{
int count = 1;
for (int j = i + 1; j < n; j++)
if (arr[i] == arr[j]) count++;
printf("%d - %d\n", arr[i], count);
n = Del(arr, n, arr[i]);
}
}



int main (void)
{
clrscr();

int *arr;

int n;

printf("n = "); scanf("%d", &n);

InitArray(arr, n);
GetInfo(arr, n);

return 0;
}


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Гость, опять тот же вопрос: интервалы чисел какие? Количество чисел?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Ой извини не хотел....
Кол во чисел максимально дотупное для массива 256, значения чисел ".... любое из диапахона типа Int ..."
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






klem4, так что твоя программа при попытке

arr = (int*)malloc(n * sizeof(int));
(а вызывать тебе ее придется так: InitArray(arr, 65536)) вылетает по попытке работы с нулевым указателем (malloc за один раз столько памяти не выделит, и вернет NULL)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата
65536


А зачем так много - то ? На солкько я понял по последнему посту автора, количество элементов в массиве вооще будет < 256, так что можно в принципе вообще без динамического массива обойтись ?

Цитата(гость)
Кол во чисел максимально дотупное для массива 256


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Цитата
А зачем так много - то ?


Потому что нужно отвести место для хранения счетчиков для ЛЮБОГО числа... А число -
Цитата
".... любое из диапахона типа Int ..."
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Так у меня программа по другому принципу работает, я сделал простой массив и просто-нарпосто подсчитывал сколько каждый элемент в нем повторяется. unsure.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






Цитата
На солкько я понял по последнему посту автора, количество элементов в массиве вооще будет < 256
Попробуй... Вот тебе 10 чисел для теста:

1, -25200, 32000, -17500, -25200, 0, -17500, -17500, 6, 4
Количество экземпляров КАЖДОГО элемента в массиве меньше 256? Меньше... Каждое число в диапазоне Int? В диапазоне... Твой ход... wink.gif

Цитата
просто-нарпосто подсчитывал сколько каждый элемент в нем повторяется.
А если я выпишу в ряд все числа от -32768 до 32767, они что все поместятся в твой массив? Как считать-то будешь, если НЕЧЕГО считать?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата
-32768 до 32767


Так где в задании сказано что массив должен быть таким огромным ?!!! Этот интервал - интервал для значений элементов, так с этим никаких проблем нет ! И вовсе не нужно юзать массив a[65536], если нам конечно не нужно подсчитывать одинаковые элементы среди такого огромного количества.

Либо я вообще ничего не понял в чем суть.


Эскизы прикрепленных изображений
Прикрепленное изображение

--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Ребята не подскажите алгоритм, т.е. не рсшифруете запись?
Ещё такая проблема... на каком компилятора без проблем запускается? Просто у меня почему ругается.... что посоветуете? Может скинуть сюда сведния?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Небольшая поправка, что желательно задачу напистаь на С и адаптировать к компилятору Visual C
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Гость






Цитата
если нам конечно не нужно подсчитывать одинаковые элементы среди такого огромного количества.
Знаешь, мне тоже надоело работать тут телепатом. Автор НИЧЕГО не хочет говорить, а то, что говорит - как будто специально запутывает обсуждение еще больше... Так что, Sorry, пока не будет тестовых данных - ничего не могу поделать, для решения задачи нет ЧЕТКОЙ информации.
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 20.11.2017 23:55
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"