Поисковая форма:) поиск по free-lance.ru Топ/история/обновления фриланса, по разным параметрам (темы, сообщения, пользователи...) Автоматическое удаление постов от ненужных юзеров в топике (php скрипт) Досье(точный ник)
 

Ник (или часть ника):
?
Какой текст ищем:
?
Раздел блогов:
За срок
дней
Тип поиска: (по вхождению: по тексту гуг выдаст посты с "гуг", "гугл", "огугл"; "полнотекстовый": по тексту "гуг" выдаст посты только с "гуг")
По вхождению строки:  Полнотекстовый: 
(поиск не 100% актуальный, есть определённая задержка при обновлении данных для поиска. )
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 не устраивает? 
msdn.microsoft.com/en-us/...
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 Копия темы
ну пока да, а так корень просто.

Загвоздка в том что неполучается частично заплнить/выбрать

собственно
acm.timus.ru/problem.aspx...
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(), пробежавшись итератором
woofer46 Сообщение 25/09/2011 17:16 Копия темы
Вектор не вышло, поэтому тут массив
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]); 
}
}
woofer46 Сообщение 25/09/2011 17:21 Копия темы
screencast.com/t/JOcibJBW... вот, в чем ошибка
alex1153 Сообщение 25/09/2011 17:23 Копия темы
я это уже объяснил – 

>>2) очень интересно, как ты работаешь с вектором, если ты его не инициализировал ? Ты не меняешь его размер, а создан он у тебя пустым. Программа упадёт 

и ладно ещё дебаг это вежливо в виде ассерта показал )) Релиз просто тупо упадёт
woofer46 Сообщение 25/09/2011 17:24 Копия темы
скомпилировал, вот так выходит screencast.com/t/pLtWmqyq
alex1153 Сообщение 25/09/2011 17:24 Копия темы
я задал размер в 3 элемента

std::vector<float> cash(3,0); 

но это далеко не единственный способ регулировать количество элементов вектора
alex1153 Сообщение 25/09/2011 17:25 Копия темы
мой косяк, надо не <= , а просто <

скопипастил ))
woofer46 Сообщение 25/09/2011 17:27 Копия темы
О, работает, так, те наро размер задавать... я просто нагуглил что у него размер может динамически изменяться
alex1153 Сообщение 25/09/2011 17:27 Копия темы
а как ты такие видюшки делаешь ? Тоже хочу так )
alex1153 Сообщение 25/09/2011 17:27 Копия темы
конечно может!
woofer46 Сообщение 25/09/2011 17:28 Копия темы
вот www.techsmith.com/jing/   очень удобно
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 , то этот счётчик будет считать некорректно (меньше, чем на самом деле). Деструкторы для каждого элемента вызываются исправно
alex1153 Сообщение 25/09/2011 17:30 Копия темы
благодарю
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 Копия темы
Спасибо большое, вродь к успеху иду потихоньку
screencast.com/t/jgQAd6Lf...
alex1153 Сообщение 25/09/2011 18:05 Копия темы
не за что, работа такая )
woofer46 Сообщение 25/09/2011 18:10 Копия темы
А с графами, орграфами случано не доводилось иметь дело?)
alex1153 Сообщение 25/09/2011 18:12 Копия темы
на практике приходилось, наверное, но теорию ихнюю я не знаю, поэтому не могу точно сказать, они это были или нет ) Но если надо будет – разберусь
woofer46 Сообщение 25/09/2011 18:19 Копия темы
Если можно, я потом напишу как нибудь, а то я над ними неделю сижу)
alex1153 Сообщение 25/09/2011 18:20 Копия темы
пиши
woofer46 Сообщение 25/09/2011 18:50 Копия темы
С вектором вроде получилось, резерв правд не вышло но вроде так все работает, сейчас только думаю почему корень неправильно считает
screencast.com/t/seBGtyOr...
alex1153 Сообщение 25/09/2011 18:55 Копия темы
>> резерв правда не вышло

не понял фразу

А корень он считает правильно, только точность страдает. Попробуй применть double вместо float, либо задайся точностью
woofer46 Сообщение 26/09/2011 08:42 Копия темы
Почемуто с даблом почему то ответы 0.0000 еще не разобрал
alex1153 Сообщение 26/09/2011 10:37 Копия темы
при выводе как форматируешь ?
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:42 Копия темы
попробуй "%.04lf"

(long float то есть)
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 Копия темы
sizeof(float) == 4
sizeof(double) == 8

типа "long float" нет, это double.
0

©2008 edogs egods
Выразить восторг, поругаться
или предложить что-нибудь можно на форуме
Для обсуждения этого сервиса так же есть темы на фрилансе по
поиску , флудотопу ,и по удалённым сообщениям ,и по Актуальным/популярным темам , и по топу "кто кому больше наотвечал"