c++ litera a liczba Pomocy

0

cześć mam taki programik, chodzi mi o to że jak ktoś nie ma jakieś liczby do wzory to zamiast tego wpisał przysłowiowe x, Problem jednak się pojawia bo kompilator oczekuje liczby a nie litery jak zrobić aby oczekwiał jednej litery "X" lub cyfr ? Oczywiście program na dole jest błedny ale co powinienem teraz zrobic ? Jakiej funkcji użyc ? Aby gdy użytkownik wpisze znak X z klawiatury zrobiły się if'y ?

 float dlugoscPodstawy, dlugoscPrzeciwprostokatnej, wysokosc,pole,obwod,dlugoscPrzeciwprostokatnejKwadrat, dlugoscPodstawyKwadrat,wysokoscKwadrat;
        cout<<"Witaj, jezeli nie bedziesz mial jakiejs dlugosci wpisz taki znak z duzej litery: \"X\" "<<endl;
        cout<<"Podaj dlugosc przeciprostokatnej";
        cin>>dlugoscPrzeciwprostokatnej;
        cout<<"Podaj dlugosc podstawy: ";
        cin>>dlugoscPodstawy;
        cout<<"Podaj wysokosc trojkata: ";
        cin>>wysokosc;

        if (dlugoscPrzeciwprostokatnej=="X")
        {
            dlugoscPrzeciwprostokatnejKwadrat=(wysokosc*wysokosc)+(dlugoscPodstawy*dlugoscPodstawy);
            dlugoscPrzeciwprostokatnej=pow(dlugoscPrzeciwprostokatnejKwadrat,1.0/2.0);
        }
        if (dlugoscPodstawy=="X")
        {
            dlugoscPodstawyKwadrat=(dlugoscPrzeciwprostokatnej*dlugoscPrzeciwprostokatnej)-(wysokosc*wysokosc);
            dlugoscPodstawy=pow(dlugoscPodstawyKwadrat,1.0/2.0);
        }
        if (wysokosc=="X")
        {
            wysokoscKwadrat=(dlugoscPrzeciwprostokatnej*dlugoscPrzeciwprostokatnej)-(dlugoscPodstawy*dlugoscPodstawy);
            wysokosc=pow(wysokoscKwadrat,1.0/2.0);
        }

        pole=(dlugoscPodstawy*wysokosc)/2;
        obwod=dlugoscPodstawy+wysokosc+dlugoscPrzeciwprostokatnej;
        cout<<"Pole tego trojkata jest rowne: "<<pole<<endl;
        cout<<"Obwod tego trojkata jest rowny: "<<obwod<<endl;

1

Użyj apostrofów do pojedynczych znaków i powinno działać.
Cudzysłów oznacza const char* więc wskaźnik do znaku, a apostrof pojedynczy znak.

2

Jeśli chciałbys rozwiązać to w taki sposób, musiałbyś pobierać stringi, sprawdzać, czy nie są x-em, próbować zamienić wtedy dopiero na zmienną typu zmiennoprzecinkowego

0

Wydaje mi się, że te znaki 'X' nie są Ci do niczego potrzebne. Możesz robić walidację danych przy wczytywaniu:

if (std::cin >> ...)

Niestety działa to tylko w prostych programach, jak powyżej, gdzie obliczenia możesz wykonać od razu po odczycie z wejścia.

Możesz zrobić coś na kształt tego:

#include <iostream>
#include <string>

int main() {
  float number = 0.0;
  char c = '\a';

  bool exit = false;
  while(!exit) {
    std::cout << "Enter value or X: ";
      if (std::cin >> c && c == 'X')
        exit = true;
      else {
        if (std::cin.eof()) {
          c = 'X';
          exit = true;
        } else {
          std::cin.putback(c);
          if (std::cin >> number) {
            c = '\a';
            exit = true;
          }
          else {
            std::cout << "Wrong value, try again:\n";
            std::cout.flush();
            std::cin.clear();
            while (std::cin.get() != '\n')
              ;
            }
        }
     }
  }
  std::cout << "Exit: " << number << ", " << (c != 'X' ? "Value OK!" : "X") << std::endl;

  return 0;
}

Albo stworzyć własny typ danych, który będzie przechowywał informację o poprawności. Tu bardzo prosty i ograniczony przykład:

#include <iostream>

template<typename T>
struct Data {
  Data() : value(static_cast<T>(0)), validated(false) {}

  T value;
  bool validated;
};

int main() {
  Data<float> data[3];

  std::cout << "Enter 3 numbers:\n";
  for (size_t i = 0; i < 3; ++i) {
    if (std::cin >> data[i].value) {
      data[i].validated = true;
    } else {
      std::cin.clear();
      while(std::cin.get() != '\n')
        ;
    }
  }

  for (size_t i = 0; i < 3; ++i) {
    if (data[i].validated)
      std::cout << i << ". " << data[i].value << std::endl;
    else
      std::cout << i << ". " << "invalid value" << std::endl;
  }

  return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1