Borland C++ 5.02 cout не отображается в окне консоли

Извините за этот вопрос новичка, я пытался сделать эту программу с помощью borland 5.02, но по какой-то причине cout в if (stat) не отображается в окне консоли, когда я пишу замуж. Я не знаю, что случилось, и я застрял в течение нескольких часов. пожалуйста, помогите мне

#include <stdio.h>
#include <conio.h>
#include <iostream.h>

int main()
{
   int NIP, GOL, GP, TI, TA, JA, TG ;
   char NM[20], STAT[10] ;

   cout << "ID Number : " ;
   cin >> NIP ;

   cout << "Name : " ;
   cin >> NM ;

   cout << "Faction : " ;
   cin >> GOL ;

   if (GOL == 1)
   {
    GP = 1500000 ;
   }
   else if (GOL == 2)
   {
    GP = 2000000 ;
   }
   else
   {
    GP = 2500000 ;
   }

   cout << "Status  : " ;
   gets (STAT) ;

   if (STAT == "Married" || STAT == "married")
   {
      cout << "Number of children : " << endl ;
      cin >> JA ;
      TI = 0.05 * GP ;

      if (JA <= 3)
      {
        TA = 0.02 * GP * JA ;
      }
      else
      {
        TA = 0.02 * GP * 3 ;
      }
   }
   else
   {
    TI = 0 ;
    TA = 0 ;
   }

   TG = GP + TI+ TA ;

   cout << endl << "-Results-" << endl ;
   cout << "Your GP: " << GP << endl ;
   cout << "Your TI: " << TI << endl ;
   cout << "Your TA: " << TA << endl ;
   cout << "Your TG: " << TG << endl ;

   getch () ;

}

Обновление: я пытался изменить gets(STAT) ; на cin >> STAT ; раньше, но, похоже, это не дало никакого эффекта. программа выглядела так, когда я запускал их


Идентификационный номер: 0123141421

Имя: Выкмон

Фракция : 1

Статус: женат (Вот проблема)

-Полученные результаты-

Ваш GP: 1500000

Ваш ТИ: 0

Ваша ЦА: 0

Ваш ТГ: 1500000


Несмотря на то, что я написал о статусе женат, cout << "Number of children : " << endl ; не отображалось в окне консоли. как будто if (STAT == "Married" || STAT == "married") не работает, а "Статус: женат" считается

else
   {
    TI = 0 ;
    TA = 0 ;
   }

person Vykmon    schedule 06.11.2016    source источник
comment
STAT == "Married" Это не способ сравнения двухсимвольного массива   -  person Danh    schedule 06.11.2016
comment
(gets() устарел, так как не предоставляет средств для предотвращения переполнения буфера. Имена CAPS для локальных переменных - необычны.) Что вы пытались выяснить, что происходит? Подружитесь с отладчиком. cout << '|' << STAT << '|' << endl; сразу после std::cin.get(STAT, sizeof STAT);. Попробуйте "Married" == STAT и "Married" == string(STAT).   -  person greybeard    schedule 06.11.2016
comment
Исправлено это объявление main: в C++ никогда не было неявного int.   -  person Cheers and hth. - Alf    schedule 06.11.2016


Ответы (3)


STAT == "Married" работало бы в стандартном C++, если бы STAT было std::string.

Однако это массив из char, и это означает, что вы сравниваете два указателя. Потому что C++ не поддерживает прямое сравнение массивов. Таким образом, каждое из двух выражений массива распадается на указатель на первый элемент.

И эти указатели гарантированно будут разными.


Примечание 1: Borland C++ 5.02 звучит как середина 1990-х, до появления первого стандарта C++. Существует множество бесплатных современных компиляторов. Наиболее известны три из них: g++, clang и Visual C++ (последний доступен только для платформы ПК).

Примечание 2: Насколько я помню, std::string в Borland C++ был полностью испорчен. Если просто использование std::string не работает, рассмотрите возможность использования strcmp для сравнения строк C (например, массивов, которые у вас есть).

Примечание 3. В стандарте C++ (начиная с первого стандарта в 1998 г.) нет заголовка <iostream.h>. Вместо этого включите <iostream> и, возможно, добавьте using namespace std;. Или соответствующие директивы using, или уточнения имен вроде cout и endl, то есть написание std::cout и std::endl.


В других новостях:

  • Зарезервировав имена SHOUTCASE для макросов, вы можете значительно облегчить чтение кода и избежать непреднамеренной замены текста при загрузке. Не говоря уже о соответствии общепринятому соглашению об этом.

  • Используя getline вместо >>, программа может прочитать имя с пробелом в нем. Однако это хорошо работает только тогда, когда входной буфер пуст (поскольку getline не пропускает пробелы). Итак, это то, что нужно учитывать, но это может потребовать некоторой работы.

person Cheers and hth. - Alf    schedule 06.11.2016

Я пытался написать код по-другому, и как-то это работает. Но я все еще не знал источник проблемы из предыдущего кода.

#include <stdio.h>
#include <conio.h>
#include <iostream.h>

main()
{
    char NM [20], STAT ;
    int NIP, GOL, GP, JA, TI, TA, TG ;

    cout << "ID Number: " ;
    cin >> NIP ;

    cout << "Name: " ;
    gets (NM) ;

    cout << "Faction: " ;
    cin >> GOL ;

    if (GOL == 1)
        GP = 1500000 ;
    else if (GOL == 2)
        GP = 2000000 ;
    else
        GP = 2500000 ;

    cout << "Status: " ;
    cin >> STAT ;

    if (STAT == 'K')
    {
        TI = 0.05 * GP ;
        cout << "Number of children: " ;
        cin >> JA ;
        if (JA <= 3)
            TA = 0.02 * GP * JA ;
        else
            TA = 0.02 * GP * 3 ;
    }
    else
        TI = 0, TA = 0 ;

    TG = GP + TI + TA ;

    cout << endl << "-Results-" << endl ;
    cout << "Your GP: " << GP << endl ;
    cout << "Your TI: " << TI << endl ;
    cout << "Your TA: " << TA << endl ;
    cout << "Your TG: " << TG << endl ;

    getch () ;

}
person Vykmon    schedule 06.11.2016

Я пересмотрел ваш код!

#include <stdio.h>
#include <conio.h>
#include <iostream.h>

int main()
{
   int NIP, GOL, GP, TI, TA, JA, TG ;
   char NM[20];
   string STAT; // FIX 1 --------------------------------------------------------

   cout << "ID Number : " ;
   cin >> NIP ;

   cout << "Name : " ;
   gets(NM);

   cout << "Faction : " ;
   cin >> GOL ;

   if (GOL == 1)
   {
    GP = 1500000 ;
   }
   else if (GOL == 2)
   {
    GP = 2000000 ;
   }
   else
   {
    GP = 2500000 ;
   }

   cout << "Status  : " ;
   cin>>STAT;

   if ((STAT == "Married") || (STAT == "married"))
    {
      cout << "Number of children : " ; // FIX #2 -------------------------------------------------
      cin >> JA ;
      TI = 0.05 * GP ;

      if (JA <= 3)
      {
        TA = 0.02 * GP * JA ;
      }
      else
      {
        TA = 0.02 * GP * 3 ;
      }
   }
   else
   {
    TI = 0 ;
    TA = 0 ;
   }

   TG = GP + TI+ TA ;

   cout << endl << "-Results-" << endl ;
   cout << "Your GP: " << GP << endl ;
   cout << "Your TI: " << TI << endl ;
   cout << "Your TA: " << TA << endl ;
   cout << "Your TG: " << TG << endl ;

   getch () ;

}

Проблема заключалась в том, что вы не можете просто сравнить массив, используя оператор if в C++. Вы могли бы использовать char, а затем просто использовать один символ, например «M», или вместо этого вы могли бы использовать строку, но, возможно, это вызовет некоторые предупреждения.

person Zombie Chibi XD    schedule 20.03.2018