Как вводить значения продаж несколько раз, используя цикл For и sentinel?

#c #for-loop #sentinel

#c #for-цикл #sentinel

Вопрос:

Чтобы предоставить некоторый контекст, я очень новичок в программировании и C , поэтому я понимаю, что мой код, вероятно, не самый эффективный, и моя ошибка, вероятно, довольно проста. Это просто то, что я делаю для развлечения, и у меня особый интерес к музыке, так что именно это вдохновило меня на создание программ такого типа.

Я пытаюсь практиковать то, что я узнал в классе, чтобы улучшить свое кодирование. Я работаю над программой, которая будет: 1) получать название альбома от пользователя 2) получать от пользователя количество синглов, выпущенных с альбома 3) получать продажи альбома от пользователя 4) получать продажи каждого сингла от пользователя и 5) вычислятьобщий объем продаж альбомов и синглов с альбома.

Пока что мой код работает хорошо, но у меня возникают некоторые трудности с отдельными продажами, и я не уверен, как его закодировать, чтобы он работал правильно. Я хочу использовать цикл For, который запрашивает продажи каждого сингла. Внутри цикла у меня есть вложенный цикл while, чтобы прекратить сбор продаж для одного, когда пользователь вводит «1». Мой код хорошо работает для первого сингла, однако после того, как я ввожу «1», чтобы указать, что для первого сингла больше не нужно вводить продажи, цикл For просто выводит запрос о продажах следующих синглов, но не допускает никакой записи. Я знаю, что это из-за вложенного цикла while, который я включил, но я не знаю, как заставить цикл принимать ввод пользовательских продаж для каждого отдельного элемента, сохраняя при этом возможность отмечать конец ввода для каждого отдельного элемента, используя «1» в качестве sentinel.

Вот как выглядит программа при запуске цикла For и использовании моего собственного ввода:

«Каковы продажи одного # 1?

-5000000

-250000

-320000

-1

Каковы продажи одного # 2?

Каковы продажи одного # 3?

Каковы продажи одного # 4?

Каковы продажи одного # 5?

Единичные продажи составляют 5570000. »

Я указал, что с альбома было выпущено 5 синглов, но я могу ввести данные о продажах только для первого сингла. Как я уже упоминал, я знаю, что это происходит потому, что, когда я ввел 1, вложенный цикл while, который я использую для сбора продаж, завершается, а затем цикл For просто распечатывает написанный мной оператор cout. Тем не менее, я ищу способ закодировать это, чтобы я мог вводить продажи для всех 5 синглов.

Кто-нибудь знает, как я мог бы это исправить? Я ценю любую предложенную помощь и буду рад ответить на любые дополнительные вопросы, которые могут возникнуть у кого-либо. Я также включаю код, который я написал для функции, которая обрабатывает отдельные продажи, для справки, но я могу включить и весь свой код, если это будет полезно. Спасибо!

 int singleSales(int numOfSingles)
{
    
//Holds single sales and accumulated sales
    int singleSales = 0;
    int totalSales = 0;
    
    //Collects the single sales for each single as determined by user
    for (int singleNum = 1; singleNum <= numOfSingles; singleNum  )
    {
        cout << "nWhat are the sales of single #" << singleNum << "?n";
        
        while (singleSales != 1) //Collects single sales while input is not 1
        {
            cin >> singleSales;
            totalSales  = singleSales; //Accumulates single sales
        }
    }
    
    return totalSales - 1;
}
 

Ответ №1:

Значение вашей переменной singleSales находится 1 в конце цикла. Итак, для любого singleNum после первого, ваше while (singleSales != 1) значение уже будет false, и вы никогда не достигнете cin части.

Вам нужно установить int singleSales = 0; внутри цикла for, а не снаружи.