pshevnin, Тогда пробуйте читать сначала число в кавычках, и если не читается, то без кавычек:
int parsed;
parsed = fscanf(file, "\"%d\"", &x);
if (parsed == 0) {
parsed = fscanf(file, "%d", &x);
}
Ну или действительно через strtok - если первый символ ", то затирайте последний символ " нулем и скармливайте atoi. Почему у вас strtok ломается при этом - я не знаю.
Еще, выделите чтение в отдельную функцию, возвращающую int. Очень уж глаза режет, что у вас строка и от нее кучу раз вызывается atoi.
pshevnin, Что за переменную? Что у вас там за значение? Число? Так-то в си переменные строки - это и есть указатели. Поэтому у вас уже есть переменная со значением.
pshevnin, Нет. Вам надо массив самим перевыделять память и увеличивать размер. Смотрите в сторону функции realloc. Хорошим решением будет увеличивать размер массива в 2 раза всякий раз, когда там не хватает места для следующего элемента.
Но вообще, раз уж у вас в задании есть слово список, то наврно от вас ждут связного списка.
Еще важный момент. vector::clear не удаляет элементы вектора. Capacity остается не тронутой. Поэтому даже если бы у вас в векторе хранились не указатели а std::string, которые бы сами удалили память в деструкторе, то память бы не освободилась в момент clear(). Это не была бы утечка, как таковая, потому что дальнейшая работа с вектором или удаляла элементы или переиспользовала бы их.
Если вам надо именно сейчас очистить память занятую веткором, то надо переприсвоить вектору пустой вектор: data = std::vector<Student>();
Ну или лучше воспользоваться swap: std::vector<Student>().swap(data);
Akina, Ранец как раз и взялся из ссылки. И прибыль - оттуда же. И я как раз и говорил, что к этому вопросу это все не применимо.
"на двумерный лист положить максимальное количество двумерных же деталей", вообще говоря - это задача упаковки, а не раскроя. Ну вот так у математиков получилось, что слово "раскрой" занято вот той задачей по ссылке, которая к вопросу отношения не имеет.
Akina, ну блин, задача раскроя, как и задача о ранце - целочисленное линейное программирование. Сформулируйте хоть одно целочисленное линейное уравнение тут.
То, что слово "раскрой" встречается и в вопросе и в названии задачи, не значит, что это та самая задача.
Выглядит, словно вы нагуглили и выдали первую попавшеюся ссылку даже не читая ее.
Artyom_Kopan, Почти. Домножать надо ужe uint. Тогда домножение на большое простое (или хотя бы нечетное) число в 64 бита и арифметика uint64_t по модулю 2^64 вносит элемент случайности.
И еще у вас у memcpy перепутан порядок аргументов.
Вместо сдвигов туда и обратно для младших битов можно использовать операцию побитового и с 0xFFFFFFFF или просто привести к int32_t - что отбросит лишние биты.
Или, можно вообще сразу написать return static_cast<uint32_t>((temp >> 32)^temp);. В младших битах как раз что вам надо получится и старшие выкинутся.
И старший/младший не переводится так на прямо на английский. Для этого там есть термины high/low.
Вам надо придумать еще парочку, для каждого варианта найти формулу, сколько шаблонов влезет по горизонтали и вертикали в зависимости от размеров листа (W, H) и трех размеров коробки (a, b, c)
Шаблон со сдвигом по диаганали, наверно, не самый эффективный, но это вам на подумать пример.
Например, для верхнего левого варианта влезает x=floor(W/(2a+2b) по горизонтали и y=floor((H-b)/(b+c)). Значит, всего в лист влезет x*y раскроев.
Еще возможны шаблоны, где используется не один вид развертки коробки, а несколько. Потом, еще могут быть всякие хитрые развертки, когда размеры коробки частично совпадают (например, 2 числа одинаковые, а третье больше или меньше). В этом случае могут быть возможны еще варианты расположений коробок. Еще отдельный случай - кубы. Когда у коробок все размеры одинаковые, ими можно замостить плоскость.
Потом вам надо в программе перебрать 6 перестановок всех длин коробки, 2 перестановки размеров листа, подставить во все формулы для разных паттернов и выбрать максимум.
Если коробок влезает мало, то возможно сделать полный перебор, который пытается впихнуть одну из возможных разверток на лист, касаясь уже поставленных там разверток и краев коробки (перебираете все возможные точки касания потом смотрите чтобы нигде ни с чем ничто не пересекалось). Но это может сможет расположить три вместо двух разверток. Если их хотя бы десяток влезает простым шаблоном, то полный перебор будет работать вечность и максимум впихнут 2-3 лишние коробки.
Lynn «Кофеман», Это уже сверху навешивается, когда имея набор шаблонов и их цены, надо выбрать, что же вырезать, чтобы побольше прибыли получить. Тут же более геометрическая задача - распихать в прямоугольнике как можно болше разверток одинаковых коробок.
ashot_powershot, C++ не умеет выводить массивы. Вам придется выводить по одному числу. Можно не выводить текст и вместо перевода строки выводить пробел. Тогда массив будет напечатан на одной строке.
Ну или действительно через strtok - если первый символ ", то затирайте последний символ " нулем и скармливайте atoi. Почему у вас strtok ломается при этом - я не знаю.
Еще, выделите чтение в отдельную функцию, возвращающую int. Очень уж глаза режет, что у вас строка и от нее кучу раз вызывается atoi.