Форум «Всё о Паскале» _ Ада и другие языки _ подсчёт символов
Автор: Nikolas 5.10.2006 19:45
Здравствуйте. Помогите пожалуйста выполнить задачу на Си. Она основано на другой уже выполнено задаче. Суть её состояла в том, что нужно было подать строку символов и выдать в итоге сколько и каких символов в ней использовалось. С этой задачей мне уже помогли на этом форуме. Прошу помочь и с её продолжением. преподаватель сказал, что теперь подавать надо не строку символов а массив чисел и сказал, что это приводит к некоторому видоизменению программы. решение предыдущей задачи заключалось в том, чтобы просто за индексы массива взять считываемые символы, а значением ячейки присваивать кол-во этих символов в строке.... Вот так прошу помочь с решением, ну или хотя бы объяснить в чём смысл изменения программы при использовании массива числового.
Автор: volvo 5.10.2006 19:50
Цитата
в чём смысл изменения программы при использовании массива числового
Для начала давай разберемся с ограничениями. С какими числами будешь работать (меня интересует интервал значений)? Сколько будет таких чисел?
Пойми, до тех пор, пока ты не дашь эту информацию, ничего сказать нельзя. Например, если ты работаешь с числами в интервале 0 .. 255, то программа просто не изменится. Если же интервал будет 0 .. (2^32 - 1), то придется применять специальные методы обработки, ибо не получится у тебя работать с массивом такой размерности...
Автор: Гость 5.10.2006 21:18
Понимаю... Ну как я понял преподавателя, то проблема видимо именно в этом, что всё это дело уходит за пределы в 255....иногда сильно уходит....правда от него прозвучала странная фраза, что это не возможно а займёт много памяти, но возможно он оговорился или я не понял.... Если предположить, что дело именно в интервале и он достаточно большой то можно ли помочь мне? Был бы очень благодарен за исходник.... (если есть время, то хоть с короткими комментариями)...
Автор: volvo 5.10.2006 21:36
Цитата
Если предположить, что дело именно в интервале и он достаточно большой то можно ли помочь мне?
Можно. Создаешь на диске файл байтов размером 2 Гб, и используешь его вместо массива. Т.е. при получении числа 2409 просто переходишь на позицию №2409 в файле (fseek), читаешь байт, находящийся на этой позиции, увеличиваешь его на 1, и пишешь назад...
Алгоритм понятен?
Ограничения: максимальные значения счетчиков не более 255 (если работать с файлом из байтов). Преимущества: допустимый интервал чисел: 0 .. 2147483647
Такой метод устроит?
Автор: Гость 5.10.2006 23:21
меня да а вот препод сказал, что как раз надо бы обойтись без крупных файлов...можно ещё что - то придумать, но вот если честно алгоритм не понял, если можно другой? Если нельзя то очень буду благодарен исходнику хотя бы этого, так си я только начал учить вот и с файлами и всем подобным работаю не очень....
Автор: volvo 5.10.2006 23:38
Ага... Без крупных файлов, без современных компиляторов, без...
Без компьюьера не надо обойтись?
Все остальные варианты будут занимать память (которой и так всегда не хватает), что менее желательно, чем работа с большим файлом... Хочешь - реализуй Hash, но это скорее всего даст тебе только проигрыш, ибо опять же, ты не сказал НИЧЕГО об интервалах, и НИЧЕГО о количестве чисел. Больше я на пустые вопросы отвечать не буду. Хочешь конкретики - давай информацию.
Автор: Гость 5.10.2006 23:51
Извини... постараюсь более конкретно, но не могу сказать больше чем сказали мне.... почти дословно - количество чисел намного больше чем 255 и массив здесь не катит, в качестве примера привели +- 2147483647, что то в этом роде, точно я число конечно не помню, но скорее так.... всё что я знаю... т.е. ты во всём прав только теперь у меня не хватает знаний чтобы так сделать вот в чём вся проблема....
Автор: Гость 8.10.2006 12:22
Доброго времени суток. Дело в том, что преподаватель немного изменил условие, толи осознал, что его нынешняя формулировка ещё сложна для нас то ли просто некорректно сформулировал, но факт остаётся фактом... Теперь суть заключается в том, что подаётся массив чисел, и надо в этом массиве найти одинаковые числа, именно числа а не цифры... т.е.
12 654 7852 12 7852 результат 12 - 2 раза 654 - 1 раз 7852 - 2 раза Вот так. Если можно опять попрошу помочь.... вообще я немного не понимаю есть ли в этой задаче подвох? В общем помогите пожалуйста.
Автор: klem4 8.10.2006 13:22
Ну видимо тут 2 варианта, либо сортировать массив, потом подсчитывать, либо вот так :
# include <stdio.h> # include <conio.h> # include <stdlib.h>
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 8.10.2006 14:13
Гость, опять тот же вопрос: интервалы чисел какие? Количество чисел?
Автор: Гость 8.10.2006 15:22
Ой извини не хотел.... Кол во чисел максимально дотупное для массива 256, значения чисел ".... любое из диапахона типа Int ..."
Автор: volvo 8.10.2006 16:35
klem4, так что твоя программа при попытке
arr = (int*)malloc(n * sizeof(int));
(а вызывать тебе ее придется так: InitArray(arr, 65536)) вылетает по попытке работы с нулевым указателем (malloc за один раз столько памяти не выделит, и вернет NULL)
Автор: klem4 8.10.2006 16:39
Цитата
65536
А зачем так много - то ? На солкько я понял по последнему посту автора, количество элементов в массиве вооще будет < 256, так что можно в принципе вообще без динамического массива обойтись ?
Цитата(гость)
Кол во чисел максимально дотупное для массива 256
Автор: volvo 8.10.2006 17:00
Цитата
А зачем так много - то ?
Потому что нужно отвести место для хранения счетчиков для ЛЮБОГО числа... А число -
Цитата
".... любое из диапахона типа Int ..."
Автор: klem4 8.10.2006 17:03
Так у меня программа по другому принципу работает, я сделал простой массив и просто-нарпосто подсчитывал сколько каждый элемент в нем повторяется.
Автор: volvo 8.10.2006 17:04
Цитата
На солкько я понял по последнему посту автора, количество элементов в массиве вооще будет < 256
Попробуй... Вот тебе 10 чисел для теста:
1, -25200, 32000, -17500, -25200, 0, -17500, -17500, 6, 4 Количество экземпляров КАЖДОГО элемента в массиве меньше 256? Меньше... Каждое число в диапазоне Int? В диапазоне... Твой ход...
Цитата
просто-нарпосто подсчитывал сколько каждый элемент в нем повторяется.
А если я выпишу в ряд все числа от -32768 до 32767, они что все поместятся в твой массив? Как считать-то будешь, если НЕЧЕГО считать?
Автор: klem4 8.10.2006 17:22
Цитата
-32768 до 32767
Так где в задании сказано что массив должен быть таким огромным ?!!! Этот интервал - интервал для значений элементов, так с этим никаких проблем нет ! И вовсе не нужно юзать массив a[65536], если нам конечно не нужно подсчитывать одинаковые элементы среди такого огромного количества.
Либо я вообще ничего не понял в чем суть.
Эскизы прикрепленных изображений
Автор: Nucris 8.10.2006 20:16
Ребята не подскажите алгоритм, т.е. не рсшифруете запись? Ещё такая проблема... на каком компилятора без проблем запускается? Просто у меня почему ругается.... что посоветуете? Может скинуть сюда сведния?
Автор: Nucris 8.10.2006 22:58
Небольшая поправка, что желательно задачу напистаь на С и адаптировать к компилятору Visual C
Автор: volvo 8.10.2006 23:08
Цитата
если нам конечно не нужно подсчитывать одинаковые элементы среди такого огромного количества.
Знаешь, мне тоже надоело работать тут телепатом. Автор НИЧЕГО не хочет говорить, а то, что говорит - как будто специально запутывает обсуждение еще больше... Так что, Sorry, пока не будет тестовых данных - ничего не могу поделать, для решения задачи нет ЧЕТКОЙ информации.
Автор: Nucris 8.10.2006 23:24
Ребята извините, но терь я не могу понять что ещё нужно?
Элементов 256, числа в масиве любые из диапозона Int, язык С, компилятор Visual C
Автор: Nucris 9.10.2006 16:55
Друзья ну помогите пожалуйста вроди вё что нужно привёл, условие более или менее понятно, некоторые условия привёл, что не сказал, так и нам того препод не говорит, значит на своё усмотрение это его не так интересует. Я ведь не заинтересован задерживать Вас...что знал всё сказал. По прежнему надеюсь на Вашу помощь
Автор: klem4 9.10.2006 20:28
Цитата
Элементов 256, числа в масиве любые из диапозона Int, язык С, компилятор Visual C
Чем моя программа не подошла ?
Автор: Nucris 9.10.2006 20:40
Почему то вот это пишет, понимаю, что твой исходник верен, но на что вот компиль ругается понять не могу....поясни пожалуйста
Цитата
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 9.10.2006 20:47
Поставь компилятор попроще
Присоединяю Borland C 3.0, не так красиво как VS, но прогу запустишь без рпоблем))
Не забудь прописать правильные пути в Options->Directories
понимаю, но препод заставляет на этом компиле... я и с задачей про домину из - за того и мучаюсь, что на вижале сдать надо иначе бы давно уже исходник запустил.... Даже не знаю....
Автор: klem4 9.10.2006 22:29
Так тебе код нужен на ЧИСТОМ C ? Или С++ ?
Автор: Nucris 10.10.2006 2:02
На чистом С Мыпросто создаём проект С++, потом создаём файл source и расширешние срр меняем на с, потом запускаем и ждём....вот так...так тчо надо на С. Дико конечно как-то, но что поделать
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 12.10.2006 19:51
понимаю, что всё работает, но я не понимаю почему мой компиль пишут вот это
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