Помощь - Поиск - Пользователи - Календарь
Полная версия: подсчёт символов
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Nikolas
Здравствуйте.
Помогите пожалуйста выполнить задачу на Си. Она основано на другой уже выполнено задаче. Суть её состояла в том, что нужно было подать строку символов и выдать в итоге сколько и каких символов в ней использовалось. С этой задачей мне уже помогли на этом форуме. Прошу помочь и с её продолжением. преподаватель сказал, что теперь подавать надо не строку символов а массив чисел и сказал, что это приводит к некоторому видоизменению программы. решение предыдущей задачи заключалось в том, чтобы просто за индексы массива взять считываемые символы, а значением ячейки присваивать кол-во этих символов в строке....
Вот так прошу помочь с решением, ну или хотя бы объяснить в чём смысл изменения программы при использовании массива числового.
volvo
Цитата
в чём смысл изменения программы при использовании массива числового
Для начала давай разберемся с ограничениями. С какими числами будешь работать (меня интересует интервал значений)? Сколько будет таких чисел?

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

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

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

Такой метод устроит?
Гость
меня да а вот препод сказал, что как раз надо бы обойтись без крупных файлов...можно ещё что - то придумать, но вот если честно алгоритм не понял, если можно другой? Если нельзя то очень буду благодарен исходнику хотя бы этого, так си я только начал учить вот и с файлами и всем подобным работаю не очень....
volvo
Ага... Без крупных файлов, без современных компиляторов, без...

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

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

12 654 7852 12 7852
результат
12 - 2 раза
654 - 1 раз
7852 - 2 раза
Вот так. Если можно опять попрошу помочь.... вообще я немного не понимаю есть ли в этой задаче подвох?
В общем помогите пожалуйста.
klem4
Ну видимо тут 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;
}
volvo
Гость, опять тот же вопрос: интервалы чисел какие? Количество чисел?
Гость
Ой извини не хотел....
Кол во чисел максимально дотупное для массива 256, значения чисел ".... любое из диапахона типа Int ..."
volvo
klem4, так что твоя программа при попытке

arr = (int*)malloc(n * sizeof(int));
(а вызывать тебе ее придется так: InitArray(arr, 65536)) вылетает по попытке работы с нулевым указателем (malloc за один раз столько памяти не выделит, и вернет NULL)
klem4
Цитата
65536


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

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


Потому что нужно отвести место для хранения счетчиков для ЛЮБОГО числа... А число -
Цитата
".... любое из диапахона типа Int ..."
klem4
Так у меня программа по другому принципу работает, я сделал простой массив и просто-нарпосто подсчитывал сколько каждый элемент в нем повторяется. unsure.gif
volvo
Цитата
На солкько я понял по последнему посту автора, количество элементов в массиве вооще будет < 256
Попробуй... Вот тебе 10 чисел для теста:

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

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


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

Либо я вообще ничего не понял в чем суть.
Nucris
Ребята не подскажите алгоритм, т.е. не рсшифруете запись?
Ещё такая проблема... на каком компилятора без проблем запускается? Просто у меня почему ругается.... что посоветуете? Может скинуть сюда сведния?
Nucris
Небольшая поправка, что желательно задачу напистаь на С и адаптировать к компилятору Visual C
volvo
Цитата
если нам конечно не нужно подсчитывать одинаковые элементы среди такого огромного количества.
Знаешь, мне тоже надоело работать тут телепатом. Автор НИЧЕГО не хочет говорить, а то, что говорит - как будто специально запутывает обсуждение еще больше... Так что, Sorry, пока не будет тестовых данных - ничего не могу поделать, для решения задачи нет ЧЕТКОЙ информации.
Nucris
Ребята извините, но терь я не могу понять что ещё нужно?

Элементов 256, числа в масиве любые из диапозона Int, язык С, компилятор Visual C
Nucris
Друзья ну помогите пожалуйста вроди вё что нужно привёл, условие более или менее понятно, некоторые условия привёл, что не сказал, так и нам того препод не говорит, значит на своё усмотрение это его не так интересует. Я ведь не заинтересован задерживать Вас...что знал всё сказал.
По прежнему надеюсь на Вашу помощь
klem4
Цитата
Элементов 256, числа в масиве любые из диапозона Int, язык С, компилятор Visual C


Чем моя программа не подошла ?
Nucris
Почему то вот это пишет, понимаю, что твой исходник верен, но на что вот компиль ругается понять не могу....поясни пожалуйста


Цитата
1>------ Build started: Project: Proba2, Configuration: Debug Win32 ------
1>Compiling...
1>main.c
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(5) : error C2143: syntax error : missing ')' before '&'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(5) : error C2143: syntax error : missing '{' before '&'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(5) : error C2059: syntax error : '&'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(5) : error C2059: syntax error : ')'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(19) : error C2143: syntax error : missing ';' before 'type'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(19) : error C2143: syntax error : missing ';' before 'type'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(19) : error C2143: syntax error : missing ')' before 'type'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(19) : error C2143: syntax error : missing ';' before 'type'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(19) : error C2065: 'i' : undeclared identifier
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(19) : warning C4552: '<' : operator has no effect; expected operator with side-effect
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(19) : error C2059: syntax error : ')'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(19) : error C2146: syntax error : missing ';' before identifier 'printf'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(30) : error C2143: syntax error : missing ';' before 'type'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(30) : error C2143: syntax error : missing ';' before 'type'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(30) : error C2143: syntax error : missing ')' before 'type'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(30) : error C2143: syntax error : missing ';' before 'type'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(30) : error C2065: 'j' : undeclared identifier
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(30) : warning C4552: '<' : operator has no effect; expected operator with side-effect
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(30) : error C2059: syntax error : ')'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(31) : error C2146: syntax error : missing ';' before identifier 'arr'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(46) : error C2143: syntax error : missing ';' before 'type'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(50) : error C2143: syntax error : missing ';' before 'type'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(50) : error C2143: syntax error : missing ';' before 'type'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(50) : error C2143: syntax error : missing ')' before 'type'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(50) : error C2143: syntax error : missing ';' before 'type'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(50) : warning C4552: '<' : operator has no effect; expected operator with side-effect
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(50) : error C2059: syntax error : ')'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(51) : error C2143: syntax error : missing ';' before 'if'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(61) : warning C4013: 'clrscr' undefined; assuming extern returning int
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(63) : error C2143: syntax error : missing ';' before 'type'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(65) : error C2143: syntax error : missing ';' before 'type'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(67) : error C2065: 'n' : undeclared identifier
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(69) : warning C4013: 'InitArray' undefined; assuming extern returning int
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(69) : error C2065: 'arr' : undeclared identifier
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(70) : warning C4047: 'function' : 'int *' differs in levels of indirection from 'int'
1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\proba2\proba2\main.c(70) : warning C4024: 'GetInfo' : different types for formal and actual parameter 1
1>Build log was saved at "file://c:\Documents and Settings\VBproffi\My Documents\Visual Studio 2005\Projects\Proba2\Proba2\Debug\BuildLog.htm"
1>Proba2 - 29 error(s), 7 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
klem4
Поставь компилятор попроще smile.gif

Присоединяю Borland C 3.0, не так красиво как VS, но прогу запустишь без рпоблем))

Не забудь прописать правильные пути в Options->Directories
Nucris
понимаю, но препод заставляет на этом компиле... я и с задачей про домину из - за того и мучаюсь, что на вижале сдать надо иначе бы давно уже исходник запустил.... Даже не знаю....
klem4
Так тебе код нужен на ЧИСТОМ C ? Или С++ ?
Nucris
На чистом С
Мыпросто создаём проект С++, потом создаём файл source и расширешние срр меняем на с, потом запускаем и ждём....вот так...так тчо надо на С. Дико конечно как-то, но что поделать
klem4
VS2003

Win32ConsoleApplication :

#include "stdafx.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 _tmain(int argc, _TCHAR* argv[])
{
int *arr;

int n;

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

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

return 0;

}


Работает без проблем
Nucris
понимаю, что всё работает, но я не понимаю почему мой компиль пишут вот это

1>c:\documents and settings\vbproffi\my documents\visual studio 2005\projects\qwe123\qwe123\123.c(1) : fatal error C1083: Cannot open include file: 'stdafx.h': No such file or directory
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.