Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ подсчёт символов

Автор: 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>

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 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

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

Автор: volvo 8.10.2006 17:04

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

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

Цитата
просто-нарпосто подсчитывал сколько каждый элемент в нем повторяется.
А если я выпишу в ряд все числа от -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

Поставь компилятор попроще smile.gif

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

Не забудь прописать правильные пути в Options->Directories



Прикрепленные файлы
Прикрепленный файл  bc30.rar ( 1.47 мегабайт ) Кол-во скачиваний: 126

Автор: Nucris 9.10.2006 21:50

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

Автор: klem4 9.10.2006 22:29

Так тебе код нужен на ЧИСТОМ C ? Или С++ ?

Автор: Nucris 10.10.2006 2:02

На чистом С
Мыпросто создаём проект С++, потом создаём файл source и расширешние срр меняем на с, потом запускаем и ждём....вот так...так тчо надо на С. Дико конечно как-то, но что поделать

Автор: klem4 10.10.2006 10:58

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 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