|
0 Всего найдено: 45
woofer46
Сообщение
25/09/2011 13:27
Копия темы
Где хранить У меня такая задачка требуется посчитать корни чисел и вывести их в обратном порядке чисел может быть очень много (10в18), не массив же использовать для хранения, я пытался использовать вектор но не получается ни борланд ни визстуд нехотят его воспринимать. как быть? #include <stdio.h> #include <math.h> #include <vector> //std::vector<float> cash; int main(void) { vector<float> cash0; int i; for (i=0; i<=3; i++) scanf("%f",&cash[i]); for (i=3; i>=0; i--) printf ("%0.4f",cash[i]); }
koz128901
Сообщение
25/09/2011 14:57
Копия темы
Честно говоря Я сомневаюсь что Вы где-то сможете достать 10^18 чисел. Тогда Вам нужен суперкомпьютер, т.к. на реальном это невозможно. (конечно есть танцы с бубном, но это не выход)
woofer46
Сообщение
25/09/2011 15:27
Копия темы
Да, я попутал)) но проблему всеравно не решил входной поток не более 256кб, а число может быть до 10в18
koz128901
Сообщение
25/09/2011 15:36
Копия темы
А чем тип double и long long не устраивает?
woofer46
Сообщение
25/09/2011 15:49
Копия темы
while(cash[i] !=EOF) { scanf("%d",&cash[i]); i++; } Вот данный кусок верно написан?
woofer46
Сообщение
25/09/2011 15:55
Копия темы
до еофа и считается нормально, как только еоф оно начинает бежать до 109 #include <stdio.h> #include <conio.h> #include <math.h> int main(void) {int b,c; int cash[64]; int i=0; for(i=0;i<64;i++) { cash[i]=-5; } i=0; printf("%d\n",i); while(cash[i] !=EOF) { scanf("%d",&cash[i]); printf("%d\n",i); i++; } printf("%d\n",i); while(i>=0) { printf("%f ",(float)cash[i]); i--; } getch(); }
koz128901
Сообщение
25/09/2011 16:01
Копия темы
А собственно что считает? Или просто в обратном порядке вывести?
woofer46
Сообщение
25/09/2011 16:09
Копия темы
ну пока да, а так корень просто. Загвоздка в том что неполучается частично заплнить/выбрать собственно
alex1153
Сообщение
25/09/2011 17:07
Копия темы
1) компилятор не видит определение класса контейнера нужно ты же не указал пространство имён. Нужно либо в начале написать using std либо (что гораздо лучше) везде явно его указывать std::vector<float> cash; 2) очень интересно, как ты работаешь с вектором, если ты его не инициализировал ? Ты не меняешь его размер, а создан он у тебя пустым. Программа упадёт 3) для сортировки есть два пути (для данной задачи можно любой из них) 3.a) сохранять корни в вектор, затем отсортировать std::sort (подключи файл <algorithm>) 3.b) сохранять корни в std::map . Выводить, начиная с rbegin() до rend(), пробежавшись итератором
alex1153
Сообщение
25/09/2011 17:21
Копия темы
а почему не вышло ? :) Дело в том, что вектор (суть тот же массив) удобнее и безопаснее попробуй скомпилить этот код #include <stdio.h> #include <math.h> #include <vector> int main(void) { std::vector<float> cash(3,0); for(int i=0; i<=cash.size(); i++) { scanf("%f",&cash[i]); } for(int i=0; i<=cash.size(); i++) { printf ("%0.4f",cash[i]); } }
alex1153
Сообщение
25/09/2011 17:23
Копия темы
я это уже объяснил >>2) очень интересно, как ты работаешь с вектором, если ты его не инициализировал ? Ты не меняешь его размер, а создан он у тебя пустым. Программа упадёт и ладно ещё дебаг это вежливо в виде ассерта показал )) Релиз просто тупо упадёт
woofer46
Сообщение
25/09/2011 17:24
Копия темы
скомпилировал, вот так выходит
alex1153
Сообщение
25/09/2011 17:24
Копия темы
я задал размер в 3 элемента std::vector<float> cash(3,0); но это далеко не единственный способ регулировать количество элементов вектора
woofer46
Сообщение
25/09/2011 17:27
Копия темы
О, работает, так, те наро размер задавать... я просто нагуглил что у него размер может динамически изменяться
alex1153
Сообщение
25/09/2011 17:29
Копия темы
вот недавно кратко описывал новичку работу вектора, чтобы писанина не пропала, тут оставлю тоже )) Кратко векторе: по стандарту весь массив данных должен быть выделен в памяти в виде одного сплошного блока, что позволяет переходить к работе как с обычным массивом: std::vector<int> vec(10,0); //контейнер на 10 элементов, инициализированных 0 int* pArray=&vec[0]; //указатель на начало массива //vec.size() количество элементов в массиве память выделяется на куче. Если вместо статических массивов всегда применять вектор, то можно забыть об уязвимости, связанной с переполнением буфера, так как в куче переполнение не испортит содержимое стека напрямую когда меняем размер контейнера в бОльшую сторону, то контейнер смотрит, хватает ли ему уже выделенной заранее памяти (см.методы reserve , capacity) . Если хватает, то массив в памяти не меняет адрес, только увеличивается в размере (увеличивается соответствующая переменная в классе, хранящая текущую длину массива). Если памяти мало, то происходит переаллокация выделяется новый блок памяти нужного размера, данные копируются, старый блок возвращается в кучу. Операция очень "тяжёлая" в плане быстродействия, поэтому всегда нужно планировать и контролировать возникновение переаллокаций всех алгоритмах, где производится очень много изменений размера массива. Заранее зарезервировать память можно через reserve. При переаллокации становятся невалидными все итераторы и указатели, связанные с данными в контейнере. При уменьшении размера вектора (а также при вызове метода clear или методов resize/assign с мЕньшим размером, чем size() ) переаллокации не происходит, освободившаяся часть памяти остаётся висеть "мёртвым грузом" (вернее быть зарезервированной). Это часто удобно, когда содержимое вектора часто меняется, не превышая определённый размер массива. У вектора есть особенность: при добавлении N элементов типа T, конструктор T() вызывется один раз, затем этот объект копируется во все элементы оператором = (он должен быть определён для T). Поэтому, если в конструкторе T() имеется, к примеру, некий статический счётчик экземпляров класса T , то этот счётчик будет считать некорректно (меньше, чем на самом деле). Деструкторы для каждого элемента вызываются исправно
woofer46
Сообщение
25/09/2011 17:30
Копия темы
А вот как его размер динамически менять, то есть я знаю что максимум может быть N но не факт что столько забьется Точнее у меня даже дано что максимум 256кб
alex1153
Сообщение
25/09/2011 17:34
Копия темы
сделай резервирование std::vector<float> cash;//пустой вектор cash.reserve(N); //на N элементов без переаллокаций далее добавляй новые элементы через insert или push_back Если примерно для заданного объёма памяти 256к std::vector<float> cash;//пустой вектор cash.reserve(1024*256/sizeof(cash[0])); //на 256к
alex1153
Сообщение
25/09/2011 17:38
Копия темы
чтобы контролировать выход размеров за резерв, проверяй методом capacity максимальное зарезервированное количество элементов. Когда size() равен capacity() добавлять больше нельзя (вернее, можно, конечно, но займётся памяти больше, чем 256к)
woofer46
Сообщение
25/09/2011 17:39
Копия темы
если например сейчас у меня 10 элементов и я напишу cash.insert(1) станет 11? так? сейчас попробую.
alex1153
Сообщение
25/09/2011 17:43
Копия темы
добавить один элемент в конец вектора push_back insert вставляет группу элементов , и ты неправильно написал его вызов.
woofer46
Сообщение
25/09/2011 18:02
Копия темы
Спасибо большое, вродь к успеху иду потихоньку
woofer46
Сообщение
25/09/2011 18:10
Копия темы
А с графами, орграфами случано не доводилось иметь дело?)
alex1153
Сообщение
25/09/2011 18:12
Копия темы
на практике приходилось, наверное, но теорию ихнюю я не знаю, поэтому не могу точно сказать, они это были или нет ) Но если надо будет разберусь
woofer46
Сообщение
25/09/2011 18:19
Копия темы
Если можно, я потом напишу как нибудь, а то я над ними неделю сижу)
woofer46
Сообщение
25/09/2011 18:50
Копия темы
С вектором вроде получилось, резерв правд не вышло но вроде так все работает, сейчас только думаю почему корень неправильно считает
alex1153
Сообщение
25/09/2011 18:55
Копия темы
>> резерв правда не вышло не понял фразу А корень он считает правильно, только точность страдает. Попробуй применть double вместо float, либо задайся точностью
woofer46
Сообщение
26/09/2011 08:42
Копия темы
Почемуто с даблом почему то ответы 0.0000 еще не разобрал
woofer46
Сообщение
26/09/2011 13:56
Копия темы
%0.4f #include <stdio.h> #include <math.h> #include <conio.h> #include <vector> int main() { std::vector<float> cash(1024*256,0); int i=0,k=0; float c; do { c=scanf("%f",&cash[k]); k++; } while(c!=EOF); for( i=(k-2); i>=0; i--) { printf ("%0.4f\n",sqrt(cash[i])); } getch(); } Ну собственно double место float
woofer46
Сообщение
26/09/2011 14:12
Копия темы
проблема точно в формате, при %d работает, а какой можно еще формат поставить?
alex1153
Сообщение
26/09/2011 14:44
Копия темы
так блин, а кто тип контейнера то менять будет ? ))) std::vector<double> cash(1024*256,0); // отмечу только, что это 8*256 килобайт . Ты упоминал только про 256
woofer46
Сообщение
26/09/2011 15:09
Копия темы
Во, с лонг флоат ом все заработало, супер. только сайт лежит немогу отправить роботу на проверку))) Я что то непонял про "что это 8*256 килобайт"
alex1153
Сообщение
26/09/2011 15:20
Копия темы
по идее, нет такого типа "long float" , это я для запоминания символов форматирования так сказал ) что такое "что это 8*256 килобайт": ты пишешь std::vector<double> cash(1024*256,0); при этом из кучи выделится память размером в sizeof(double)*1024*256 == 2048 килобайтов. А ты, говоришь, тебе по условию нужно не более 256кБ
woofer46
Сообщение
26/09/2011 15:24
Копия темы
понял, только у меня не дабл а флоат, он столько же занимает? вот рабочий int main() { std::vector<long float> cash(8*256,0); int i=0,k=0; long float c; do { c=scanf("%lf",&cash[k]); //printf ("%d\n",cash[k]); k++;
alex1153
Сообщение
26/09/2011 15:28
Копия темы
0
sizeof(float) == 4 sizeof(double) == 8 типа "long float" нет, это double. |
Выразить восторг, поругаться или предложить что-нибудь можно на форуме |
Для обсуждения этого сервиса так же есть темы на фрилансе по поиску , флудотопу ,и по удалённым сообщениям ,и по Актуальным/популярным темам , и по топу "кто кому больше наотвечал" |