Для циклов в C ++ - переменные не увеличиваются должным образом - PullRequest
0 голосов
/ 09 февраля 2012

Я пытался написать некоторый код, который запрашивает у пользователя несколько дебетовых записей для бухгалтерской программы.Если пользователь дает 5 в качестве ответа, программа должна спросить его имя дебетной записи и сумму 5 раз, прежде чем перейти к следующей строке кода.Итак, я использовал циклы для решения этой проблемы, и кажется, что-то странное происходит.

Это формат, в котором код должен запускаться при компиляции и выполнении:

Сколько дебетовых записей вы хотите сделать ?: 2
1Имя дебетовой записи: пример1
1. Сумма дебетования: 123
2. Название дебетовой записи: пример2
2. Сумма дебетования: 456



перейти к следующей строке кода

Вот код, написанный на C ++ для этой части бухгалтерской программы:

#include <iostream>
#include <string>
using namespace std;

int main()
{
   cout << "How many debit entries do you wish to make?: ";
   int entries;
   cin >> entries;
   string debitNames[50];
   float debitAmounts[50];
   int offset = 0;
   int number = 1;
   for (offset = 0; offset < entries; offset++)
   {
      cout << number << ". Debit Entry Name: ";
      cin >> debitNames[offset];
      cout << number << ". Debit Amount: ";
      cin >> debitAmounts[offset];
      for (number = 1; number <= entries; number++)
      {
      }
   }
   char response;
   cin >> response;
   return 0;
}



Результат очень странный, вот что происходит, когда я компилирую и запускаю его:

Сколько дебетовых записей вы хотите сделать ?: 5
1. Имя дебетовой записи: пример1
1. Сумма дебетования: 123
6. Название дебетовой записи: пример2
6. Сумма дебетования: 123
6. Имя записи дебетования: пример3
6. Дебетовая сумма: 123
6. Имя дебетовой записи: example4
6. Дебетовая сумма: 123
6. Дебетовая запись: example5
6. Дебетовая сумма: 123


перейти к следующей строке кода

Программа, после перечисления числа в 1, внезапно перепрыгивает на 6 и остается там, пока все 5 наборов вопросов не будут иметьспросили.Как вы уже знаете, я использую переменную 'number', чтобы просто сообщить пользователю, что были запрошены записи 'number', как указано самим пользователем.Попробуйте запустить этот код в вашем компиляторе и посмотрите, появится ли тот же результат.Кстати, я использую Visual C ++ 20120 Express Edition. Может ли это быть как-то связано с проблемой?

Большое спасибо.

Ответы [ 6 ]

1 голос
/ 09 февраля 2012

Очевидно, что ошибка в этой части кода:

for (number = 1; number <= entries; number++)
      {
      }

Вы используете number для отображения номера дебетовой записи

И он увеличивается в цикле выше до enteries + 1

1 голос
/ 09 февраля 2012

Ну, перед циклом вы устанавливаете переменную number равной 1.

Внутри цикла вы устанавливаете переменную number равной (entries + 1), используя этот фрагмент:

for (number = 1; number <= entries; number++)
{
}

Почему бы просто не сделать это?

cout << (offset + 1) << ". Debit Entry Name: ";
1 голос
/ 09 февраля 2012

Ваш внутренний цикл for всегда будет оставлять число в записях + 1:

  for (number = 1; number <= entries; number++)
  {
  }

Вы хотели использовать здесь другую переменную вместо того, чтобы повторно использовать существующую number?

0 голосов
/ 09 февраля 2012

Вы хотите добавить 1 к числу в конце цикла. Самый простой способ сделать это - использовать:

    number++;

Цикл для

  for (number = 1; number <= entries; number++)   
  {   
  }

совершенно не требуется, при кодировании всегда начинайте с самого простого решения, которое вы можете себе представить, и усложняйте его по мере продвижения.

0 голосов
/ 09 февраля 2012

Почему бы тебе?

  number++;
  for (int number = 1; number <= entries; number++)
  {
  }

Также более близкое к реальной жизни решение - не держать это отдельно. Гораздо логичнее создать структуру или класс.

#include <iostream>
#include <list>
#include <time.h>
#include<string>
using namespace std;

struct Debt{

  string name;
  float owe;
};


int main()
{
cout << "How many debit entries do you wish to make?: ";
int entries;
cin >> entries;
list<Debt> debts;



for (int offset = 1; offset <= entries; offset++)
{
  Debt debt;

  cout << offset << ". Debit Entry Name: ";
  cin >> debt.name;

  cout << offset << ". Debit Amount: ";
  cin >> debt.owe;

  debts.push_back(debt);

  for (int number = 1; number <= entries; number++)
  {
  }
}
int i=0;
list<Debt>::iterator it;
for ( it=debts.begin() ; it != debts.end(); it++ )
  cout << "Debt seq " << ++i << " Name " << (*it).name << " debt is " << (*it).owe << endl;


char response;
cin >> response;
return 0;
}
0 голосов
/ 09 февраля 2012

Вы выводите переменную number, которую вы увеличили в своем внутреннем цикле for, до entries + 1 ...

...