Предмет: Информатика, автор: anastasiyafomina353

СРОЧНО! С++ Перетворіть код так щоб виводилось 5 найменших за кількістю товарів. Кількість товарів в структурі - а.num.

Тут вже відсортовані записи у файлі, попрацюйте тільки з виведенням 5 найменших за кількістю товарів. Додайте ще, якщо 5 і 6 записи мають однакову кількість, виводилось і 6 запис( або інші записи, які дорівнюють 5 запису)

void FiveProductLeast(const char* fn) {
Handmade a,c;
int n = 0;
int amount = AmountTovar(fn);
fopen_s(&handmade_store, fn, "r+b");
do {
bool flag = false;
fread(&a, sizeof(Handmade), 1, handmade_store);
for (size_t i = 0; i < amount - 1; i++)
{
fseek(handmade_store, sizeof(Handmade) * (i + 1), SEEK_SET);
fread(&c, sizeof(Handmade), 1, handmade_store);
if (a.num > c.num) {
fseek(handmade_store, sizeof(Handmade) * i, SEEK_SET);
fwrite(&c, sizeof(Handmade), 1, handmade_store);
fwrite(&a, sizeof(Handmade), 1, handmade_store);
flag = true;
}
else {
a = c;
}
}
if (!flag) {
break;
}
else {
rewind(handmade_store);
}
} while (true);
fclose(handmade_store);
Hat();
fopen_s(&handmade_store, fn, "rb");
while (fread(&a, sizeof(Handmade), 1, handmade_store)) {
n++;
for (int i = 0; i < 1; i++) {
cout << "| " << setw(3) << right << n << " "
<< "| " << setw(14) << left << a.code << " "
<< "| " << setw(26) << left << a.tovar << " "
<< "| " << setw(13) << left << a.category << " "
<< "| " << setw(17) << left << a.oznaka << " "
<< "| " << setw(8) << right << fixed << setprecision(3) << a.len << " "
<< "| " << setw(5) << right << a.num << " "
<< "| " << setw(17) << left << a.country << " "
<< "| " << setw(9) << right << setprecision(2) << a.cost << " "
<< " |" << endl;
}
}
Line();
fclose(handmade_store);
}​

Ответы

Автор ответа: falusytubejaste
1

код на C++, который выводит 5 записей с наименьшим значением поля num (количество товаров) из файла:

void FiveProductLeast(const char* fn) {

Handmade a,c;

int n = 0;

int amount = AmountTovar(fn);

fopen_s(&handmade_store, fn, "r+b");

// Сортируем записи в файле по возрастанию количества товаров

do {

bool flag = false;

fseek(handmade_store, 0, SEEK_SET);

fread(&a, sizeof(Handmade), 1, handmade_store);

for (size_t i = 0; i < amount - 1; i++)

{

fread(&c, sizeof(Handmade), 1, handmade_store);

if (a.num > c.num) {

fseek(handmade_store, sizeof(Handmade) * i, SEEK_SET);

fwrite(&c, sizeof(Handmade), 1, handmade_store);

fwrite(&a, sizeof(Handmade), 1, handmade_store);

flag = true;

}

else {

a = c;

}

}

if (!flag) {

break;

}

else {

fseek(handmade_store, 0, SEEK_SET);

}

} while (true);

fclose(handmade_store);

Hat();

// Выводим 5 записей с наименьшим значением поля num

fopen_s(&handmade_store, fn, "rb");

int min_num = INT_MAX; // минимальное значение поля num

int count = 0; // счетчик выведенных записей

while (count < 5 && fread(&a, sizeof(Handmade), 1, handmade_store)) {

if (a.num < min_num) {

min_num = a.num;

count++;

for (int i = 0; i < 1; i++) {

cout << "| " << setw(3) << right << count << " "

<< "| " << setw(14) << left << a.code << " "

<< "| " << setw(26) << left << a.tovar << " "

<< "| " << setw(13) << left << a.category << " "

<< "| " << setw(17) << left << a.oznaka << " "

<< "| " << setw(8) << right << fixed << setprecision(3) << a.len << " "

<< "| " << setw(5) << right << a.num << " "

<< "| " << setw(17) << left << a.country << " "

<< "| " << setw(9) << right << setprecision(2) << a.cost << " "

<< " |" << endl;

}

}

else if (count == 5 && a.num == min_num) {

// Если 5 и 6 записи имеют одинаковое значение поля num, выводим и 6 запись

for (int i = 0; i < 1; i++) {

cout << "| " << setw(3) << right << count+1 << " "

<< "| " << setw(14) << left << a.code << " "

<< "| " << setw(26) << left << a.tovar << " "

<< "| " << setw(13) << left << a.category << " "

<< "| "


anastasiyafomina353: выводится одна запись, потому, что мы берём значение одного минимального INT_MAX
anastasiyafomina353: подскажите как исправить ситуацию, тогда дам лучший ответ
Похожие вопросы
Предмет: Окружающий мир, автор: bogdanbosnak55
Предмет: Математика, автор: z817054