Проблема с циклом, преждевременная остановка

#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-летней давности, ответ только с кодом без объяснений или комментариев не так полезен, как мог бы быть.