• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

[Неактуальная тема] Написать программу, которая выполняет следующи

  • Автор темы INFINITIFXXX
  • Дата начала
I

INFINITIFXXX

4.20 Дана запись с именем ORDER, содержащая следующие поля:
• Расчетный счет плательщика;
• Расчетный счет получателя;
• Перечисляемая сумма в руб.

Написать программу, которая выполняет следующие действия:
• Ввод с клавиатуры данных из 8 элементов типа ORDER, и занесение их в файл данных;
• Чтение данных из файла и вывод их на экран;
• вывод на экран информации о сумме, снятой с расчетного счета плательщика, введенного с клавиатуры (если таких нет – вывести об этом сообщение).
• Список должен быть упорядочен по расчетным счетам плательщиков.
 
I

INFINITIFXXX

да. Вот есть код для структуры. Надо переделать его для записи...

C++:
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <string>

struct Order {
std::string debet;
std::string credit;
float sum;
};

std::ostream &operator<<(std::ostream &stream, const Order &order) {
std::cout << "From: " << order.debet << std::endl 
<< "To: " << order.credit << std::endl
<< "Sum: " << std::setprecision(2) << std::fixed << order.sum
<< " rub." << std::endl;
return stream;
}

Order RandomOrder() {
Order result;
for (int i = 0; i < 20; ++i) {
result.debet += rand() % 10 + '0';
result.credit += rand() % 10 + '0';
}
result.sum = (rand() % 100000) / 100.0;
return result;
}

bool OrderByDebet(const Order &a, const Order &b) {
return (a.debet < b.debet);
}

Order *FindFirstByDebet(Order *begin, Order *end,
const std::string &debet) {
for (Order *result = begin; result != end; ++result)
if (result->debet == debet)
return result;
return NULL;
}

float AccumulateSumByDebet(Order *begin, Order *end,
const std::string &debet) {
float result = 0;
for (Order *current = begin; current != end; ++current)
if (current->debet == debet)
result += current->sum;
return result;
}

int main(int argc, char *argv[]) {
srand(time(NULL));
Order orders[8];
for (int i = 0; i < 8; ++i)
orders[i] = RandomOrder();
std::sort(orders, orders+8, OrderByDebet);
for (int i = 0; i < 8; ++i)
std::cout << "#" << i << " " << orders[i] << std::endl;

std::string debet = orders[rand() % 8].debet;
// вместо предыдущей строки ввод:
// std::string debet;
// std::cout << "Enter debetor: ";
// std::cin >> debet;

std::cout << "Search for debet: " << debet << std::endl;

Order *order = FindFirstByDebet(orders, orders+8, debet);
if (order != NULL) {
float result = AccumulateSumByDebet(orders, orders+8, debet);
std::cout << "Debetor " << debet
<< " spent " << result << " rub." << std::endl;
} else {
std::cout << "No such debetor." << std::endl;
}

return 0;
}
 
R

rrrFer

дак вы скажите что конкретно неработает. А-то мне лень запускать ваш код и искать в чем он не соответствует заданию )
 
L

lazybiz

INFINITIFXXX, поясните пожалуйста в деталях, что означает следующая запись:
C++:
result.debet += rand() % 10 + '0';
Это же Вы писали, если я все правильно понимаю...
 
R

rrrFer

lazybiz
Вам надо чтобы именно INFINITIFXXX пояснил(а)?
а-то ИМХО вполне нормальный фрагмент, не
Код:
result.debet += rand() % 10 + 48;
и-то хорошо
 
L

lazybiz

r04, просто у меня закрались подозрения что автор темы не является автором данного кода.
 
R

rrrFer

lazybiz
Ну тогда можно было более интересные фрагменты поискать, мне вот этот больше нравится:
Код:
std::string debet = orders[rand() % 8].debet;
:)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!