#c
#c
Вопрос:
У меня есть домашнее задание, которое, я чувствую, я близок к правильному выполнению. Назначение выглядит следующим образом:
Банки ссужают деньги друг другу. В трудные экономические времена, если банк обанкротится, он может оказаться не в состоянии погасить кредит. Совокупные активы банка — это его текущий баланс плюс его кредиты другим банкам. Рисунок 8.1 (прикрепленное изображение) представляет собой диаграмму, на которой показаны пять банков. Текущие балансы банков составляют: 25, 125, 175, 75 и 181 миллион долларов соответственно. Направленное ребро от узла 1 к узлу 2 указывает, что банк 1 предоставляет банку 2 40 миллионов кредитов.
Если общий актив банка находится ниже определенного предела, банк считается небезопасным. Если банк небезопасен, деньги, которые он занял, не могут быть возвращены кредитору, и кредитор не может включить ссуду в свои общие активы. Следовательно, кредитор также может быть небезопасным.
Напишите программу для поиска всех небезопасных банков. Ваша программа считывает входные данные следующим образом. Сначала он считывает два целых числа, n
и limit
, где n
указывает количество банков и limit
минимальные активы для обеспечения безопасности банка. Затем он считывает n
строки, описывающие информацию для n
банков с идентификатором от 0 до n-1. Первое число в строке — это баланс банка. Второе число указывает на количество тех, кто занял деньги в банке, а остальные представляют собой пары из двух чисел. Каждая пара описывает заемщика. Первое число — это идентификатор банка, а второе число — это сумма, которую он занял. Предположим, что максимальное количество банков равно 100. Например, входные данные для пяти банков следующие (ограничение равно 201)
5 201
25 2 1 100.5 4 320.5
125 2 2 40 3 85
175 2 0 125 3 75
75 1 0 125
181 1 2 125
Общие активы банка 3 составляют 75 плюс 125, что меньше 201, поэтому банк небезопасен. После того, как банк 3 становится небезопасным, общие активы банка 1 становятся 125 40 и теперь также небезопасны. Вывод должен быть «Небезопасные банки равны 3 1»
Это мое текущее решение проблемы. Я не могу понять, как заставить его найти все небезопасные банки. Только первый. Я настроил его на получение статического ввода для тестирования. У меня есть рабочий код пользовательского ввода, готовый к работе, если я смогу заставить его работать должным образом.
#include <iostream>
using namespace std;
int main()
{
const int SIZE = 100;
double balance[SIZE];
double loan[SIZE][SIZE];
int nobanks;
int limit;
int i = 0;
int j = 0;
int k = 0;
int noborrowers;
double assets[SIZE];
bool isSafe[SIZE];
bool newunsafefound = true;
cout << "Enter number of banks and the limit:" << endl;
// Set all of the data
nobanks = 5;
limit = 201;
balance[0] = 25.0;
balance[1] = 125.0;
balance[2] = 175.0;
balance[3] = 75.0;
balance[4] = 181.0;
loan[0][1] = 100.5;
loan[0][4] = 320.5;
loan[1][2] = 40.0;
loan[1][3] = 85.0;
loan[2][0] = 125.0;
loan[2][3] = 75.0;
loan[3][0] = 125.0;
loan[4][2] = 125.0;
// Set array to all true values
for(i = 0; i < nobanks; i )
{
isSafe[i] = true ;
}
cout << "Unsafe banks are: ";
i=0;
while(isSafe[i] == true)
{
newunsafefound=false;
i=0;
do
{
assets[i] = balance[i]; //Set assets to balance
for (j = 0; j < nobanks; j ) // Check if a bank has loans and add them to assets
{
if (loan[i][j] >= 0)
assets[i] = loan[i][j];
}
if (assets[i] < limit) // Check to see if current bank meets limit
{
isSafe[i] = false; // Set bank to not safe if limit not met
newunsafefound = true;
cout << i << " " ; //Display the bank that is unsafe and a space for the next bank
k=0;
for (k = 0; k < nobanks; k )
{
loan[i][k] = 0; //Set banks loans to 0 if unsafe.
k ;
}
}
i ;
} while(i < nobanks);
}
return (0);
}
Что я делаю не так?
Комментарии:
1. Вы действительно не делаете отступы в своем коде, или у вас просто возникли проблемы с копированием и вставкой его?
2. Разве вы не должны читать свои входные данные из файла?
3. я делаю отступ… у меня были проблемы с форматированием в сообщении. я новичок в этом.
4. Кроме того, пожалуйста, используйте значимые переменные цикла. ‘i’ ‘j’ ‘k’ ужасны.
5. он принимает входные данные от пользовательского ввода. он может использовать файл, но на самом деле это не проблема. и я сделаю отступ в коде, чтобы он был более читабельным.
Ответ №1:
Вы должны явно инициализировать loan
массив, чтобы элементы, которые вы не используете, не имели произвольных значений:
double loan[SIZE][SIZE] = {{0}};
Также loan[i][k] = 0;
означает, что вы обнуляете кредит, который банк i
предоставил банку k
, но вы хотите обнулить все деньги, которые банк i
одолжил банку k
.
И есть проблема:
- в состоянии выхода вашего внешнего цикла (он завершится только в том случае, если последний банк
(nobank-1)
был небезопасным), - при обработке
newunsafefound
которого не выполняется то, что предполагает имя переменной.
Комментарии:
1. это полезно. я думал, что это была моя проблема раньше, но это не так.
Ответ №2:
for (k = 0; k < nobanks; k )
{
loan[i][k] = 0; //Set banks loans to 0 if unsafe.
k ;
}
Это дополнительное увеличение для k
выглядит очень подозрительно 😉
Комментарии:
1. да, это так… этого не должно быть. некоторое время назад я перешел на цикл for и не избавился от ошибки. к сожалению, все еще сломан.
2. @user999861 Вы должны обновить свой соответствующий код до того, что у вас есть сейчас. Я не уверен, как выглядит код, который вы запускаете.
Ответ №3:
// Astrid Giraldo
public static void main (String[] args) {
Scanner input = new Scanner(System.in);
int n; // number of banks
double limit; // Minimum total assets for keeping a bank safe.
System.out.println("Enter number of banks: ");
n = input.nextInt();
System.out.println("Enter minimum total assets to be a safe bank: ");
limit = input.nextDouble();
double[][] borrowers = new double[n][n];
double[] balance = new double[n];
int numBorrowers;
for (int i = 0; i < borrowers.length; i ) {
System.out.println("Enter the bank's balance");
balance[i] = input.nextDouble();
System.out.println("Enter number of borrowers from this bank");
numBorrowers = input.nextInt();
for (int j = 0; j < numBorrowers; j ) {
System.out.println("Enter borrower bank id and the amount borrowed: ");
borrowers[i][input.nextInt()] = input.nextDouble();
}
}
markUnsafeBanks(borrowers,balance, limit);
displayUnsafeBanks(borrowers, balance, limit);
}
public static double analizeUnsafeBanks(double[][] borrowers, double[] balance, int bankId) {
double sum = balance[bankId];
for (int i = 0; i < borrowers.length; i ) {
sum = borrowers[bankId][i];
}
return sum;
}
public static void setLoanToZero(double[][] borrowers, double[] balance, int unsafeBankId, double limit) {
for (int i = 0; i < borrowers.length; i ) {
if (borrowers[i][unsafeBankId] > 0) {
borrowers[i][unsafeBankId] = 0;
if ( unsafeBankId > i amp;amp; analizeUnsafeBanks(borrowers, balance, i) < limit) {
setLoanToZero(borrowers, balance, i, limit);
}
}
}
}
public static void markUnsafeBanks(double[][] borrowers, double[] balance, double limit) {
for (int i = 0; i < borrowers.length; i ) {
if (analizeUnsafeBanks(borrowers, balance, i) < limit) {
setLoanToZero(borrowers, balance, i, limit);
}
}
}
public static void displayUnsafeBanks(double[][] borrowers, double[] balance, double limit){
for (int i = 0; i < borrowers.length; i ) {
double assets = analizeUnsafeBanks(borrowers,balance,i);
if ( assets < limit) {
System.out.println("Bank " i " is unsafe. It assets are " assets);
}
}
}
Комментарии:
1. Поскольку вы отвечаете на вопрос 8-летней давности, ответ только с кодом без объяснений или комментариев не так полезен, как мог бы быть.