Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <string>
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <numeric>
- #include <algorithm>
- #include <ctime>
- using namespace std;
- struct Tovar
- {
- string name;
- int amount;
- double price;
- };
- struct Kooperativ
- {
- string name;
- Tovar koop_list[3];
- };
- struct Realizator
- {
- int real_days;
- Tovar real_list[3];
- };
- int main()
- {
- setlocale(0, "");
- int i, j;
- int real_count; //кол-во реализаторов
- ifstream fin("file.txt");
- Kooperativ coop;
- int count = 0; //счётчик проходов
- double cost; //стоимость (цена * кол-во)
- double month_prib[30][4]; //массив для хранения прибыли на день (30 дней х 4 кооператива)
- fin.ignore(65); //пропускаем заголовок в файле
- for (i = 0; i < 30; i++)
- for (j = 0; j < 5; j++)
- month_prib[i][j] = 0; //обнуляем
- while (!fin.eof()) //цикл, считывает инфу по структурам построчно до конца файла
- {
- srand(time(nullptr)); //для генератора рандомных чисел
- fin >> coop.name;
- for (i = 0; i < 3; i++)
- {
- fin >> coop.koop_list[i].name;
- }
- for (i = 0; i < 3; i++)
- {
- fin >> coop.koop_list[i].amount;
- }
- for (i = 0; i < 3; i++)
- {
- fin >> coop.koop_list[i].price;
- }
- cout << "Введите количество реализаторов для кооператива \"" << coop.name << "\" : ";
- cin >> real_count;
- int *real_tovar = new int[real_count]; //массив для хранения случайный чисел, т.е. количества продуктов для реализатора взятых из списка (от 1 до 3 (вкл.) ) каждого кооператива
- for (i = 0; i < real_count; i++)
- real_tovar[i] = 1 + rand() % 3;
- Realizator* impl = new Realizator[real_count];
- int real_percent; //процент реализации (увеличение цены для прибыли на столько-то процентов)
- /* Последующий код взял из инета, я так и сказал, норм вроде не спрашивала. Суть его - три случайных уникальных числа в массив (вектор) vec как номера продуктов из кооператива*/
- vector<int> vec(3); //вектор (массив) для хранения трёх уникальных чисел инт
- iota(vec.begin(), vec.end(), 0); //присваивание значений от 0 до 2
- random_shuffle(vec.begin(), vec.end()); //встряска (случайное месторасположение) чисел
- /* Конец кода из инета */
- for (i = 0; i < real_count; i++)
- {
- //По каждому реализатору берём кол-во дней на реализацию для него
- cout << "\n\t Введите кол-во дней реализации для реализатора № " << i + 1 << ": ";
- cin >> impl[i].real_days;
- for (j = 0; j < real_tovar[i]; j++)
- {
- real_percent = 100 + rand() % 25; //увеличение цены на случ. число от 100 до 125 процентов
- impl[i].real_list[j].name = coop.koop_list[vec[j]].name;
- impl[i].real_list[j].amount = coop.koop_list[vec[j]].amount;
- impl[i].real_list[j].price = coop.koop_list[vec[j]].price / 100 * real_percent;
- }
- }
- double **month = new double*[real_count]; //массив для вывода ( вроде как xD )
- for (i = 0; i < real_count; i++)
- {
- month[i] = new double[30];
- }
- for (i = 0; i < real_count; i++) //обнуляем его
- for (j = 0; j < 30; j++)
- month[i][j] = 0;
- int maximum_days = 0;
- int days_count = 0;
- int prod_tovar; //кол-во проданных товаров
- int ostatok_tovar; // остаток товаров, от него будут отниматься кол-во проданных
- int enter_count = 0; //количество входов в цикл (надо шоб на нулевом входе зароботок писало (строка 139-140) )
- double zarabotok = 0; //прибыль
- //начало огромного фора
- for (i = 0; i < real_count; i++)
- {
- cost = 0;
- enter_count = 0;
- for (j = 0; j < real_tovar[i]; j++)
- {
- days_count = 0;
- ostatok_tovar = impl[i].real_list[j].amount;
- while (ostatok_tovar > 0)
- {
- zarabotok = 0;
- prod_tovar = 1 + rand() % ostatok_tovar; //продаём случ. кол-во товара
- zarabotok += prod_tovar*(impl[i].real_list[j].price - coop.koop_list[vec[j]].price); //считаем прибыль
- if (j == 0 && enter_count == 0) month[i][days_count] = zarabotok;
- else month[i][days_count] += zarabotok;
- ostatok_tovar -= prod_tovar; //вычитаем из остатка проданный товар
- if (days_count > maximum_days)
- maximum_days = days_count;
- if (ostatok_tovar < 0)
- ostatok_tovar += prod_tovar;
- days_count++;
- if (days_count == impl[i].real_days)
- {
- cost += ostatok_tovar*coop.koop_list[vec[j]].price;
- break;
- }
- enter_count++;
- }
- }
- /*
- не помню нах последующий код нужен, попробуй понять)
- если шо - пролистай как-нибудь, шоб по-бырику перейти дальше
- */
- for (j = 0; j < maximum_days + 1; j++)
- month[i][maximum_days + 1] += month[i][j];
- month[i][maximum_days + 1] -= cost;
- for (j = maximum_days + 1; j < 30; j++)
- month[i][j] = month[i][maximum_days + 1];
- maximum_days = 0;
- /* конец кода "хз зачем" */
- }
- //конец огромного фора
- for (i = 0; i < 30; i++)
- for (j = 0; j < real_count; j++)
- month_prib[i][count] += month[j][i];
- count++;
- cout << "Подсчитано. " << endl;
- } //конец огромного вайла
- cout << "Результат получен." << endl;
- fin.close();
- //Выводим в файл
- ofstream fout("file_result.txt", ios::out);
- fout << "Дни: Первый Второй Третий Чётвертый\n";
- for (i = 0; i < 30; i++)
- {
- fout << endl;
- fout << i + 1 << "-й день\t";
- for (j = 0; j < 4; j++)
- {
- if (month_prib[i][j] >= 0) fout << "\t[Пр.]" << month_prib[i][j] << "\t\t"; //если положительная прибыль, выводит с приставкой [пр.] (прибыль)
- else fout << "\t[Уб.]" << fabs(month_prib[i][j]) << "\t\t"; //если нет - выводит с приставкой [уб.] (убыток)
- }
- }
- fout.close();
- int day; //для дня
- int maxarr[3]; //массив для хранения номеров трёх прибыльных массивов, будет отсортирован в порядке спадания по прибыльности
- double max;
- cout << "Вывести итог дня №: ";
- cin >> day;
- //собственно поиск и сортировка по прибыльности
- for (j = 0; j < 3; j++)
- {
- max = -10000;
- for (i = 0; i < 4; i++)
- {
- if (month_prib[day - 1][i] > max)
- {
- max = month_prib[day - 1][i];
- maxarr[j] = i;
- }
- }
- month_prib[day - 1][maxarr[j]] = -10000;
- }
- //Выводим последнее в файл, добавляя в конец
- fout.open("file_result.txt", ios::app);
- fout << endl;
- fout << "\nИтог дня № " << day;
- fout << "\nПрибыльные кооперативы (по спаданию): ";
- for (i = 0; i < 3; i++) fout << '\t' <<maxarr[i] + 1 << '\t';
- fout.close();
- cout << "Результат в файле \"file_result.txt\". Выход..." << endl;
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement