Если операторы не работают в то время как l oop (C ++) - PullRequest
0 голосов
/ 05 апреля 2020

Я нуб C ++, довольно новый для языка. Я пытаюсь написать программу, которая рассчитывает время в других часовых поясах США на основе вашего текущего времени. Я написал некоторое время l oop в void-функции, но операторы if, используемые для поддержания часов в диапазоне (1 - 12), не работают. Если вы выберете время и зону, которые не будут изменены, например, 8:35 вечера по восточному времени, это будет работать просто отлично. Однако, если часы go больше 12 или меньше 0, операторы if ничего не делают. Я пытался положить их снаружи, пока я oop. Я также пытался сделать для l oop. Решение, вероятно, очень простое для всех вас, но любая помощь будет очень признательна. Вот моя программа:

#include <iostream>
#include <vector>

// to be used when input is invalid (duh)
void invalid()
{

 for(int i; i < 40; i++) 
 {
   std::cout << "\n";
 }
 std::cout << "Invaild input.\n\n";
}

// switches am to pm to match the cycle (I had to put in the equal sign because 12 changes to cycle, but it still a valid hour, so I couldn't change the if statement's parameters)

void amstay(bool x, int y)
{
 if (x == true && y >= 12)
     {
       std::cout << " PM";
     }
 else if(x == false && y >= 12)
     {
       std::cout << " AM";
     }
}

void amswitch(bool x, int y)
{
 if (x == true && y >= 12)
     {
       std::cout << " PM";
     }
 else if(x == false && y >= 12)
     {
       std::cout << " AM";
     }
}

// used to display the zone's time
void finTimeDisplay(int h, int m, bool a, int x)
{
 int i;

 // Had to use an array because vectors weren't working for some reason :/
 std::string altZoneDisplay [4] = {"Pacific Time: ","\nMountain Time: ","\nCentral Time: ","\nEastern Time: "};
 //got to return to the while loop
 whileloop:
 // displays the vector and return the hours plus the index it is on (and the minute) when the hours are valid
 while(h <= 12 && h > 0 && i < 4)
 {
   std::cout << altZoneDisplay[i] << (h + i) + x<< ":" << m;
   i++;

   // returns hours to the beginning of it's cycle (1) 
   if (h > 12)
   {
     h = (h - 12) + x;
     std::cout << altZoneDisplay[i] << h + i << ":" << m;
     amswitch(a, h);
     goto whileloop;
   }
   // returns hours to the end of it's cycle
   else if (h < 0)
   {
     std::cout << altZoneDisplay[i] << h + 12 << ":" << m;
     amswitch(a, h);
     goto whileloop;
   }
 }
}


int main()
{


 // to add to hours (if you pick mountain, central, or eastern zones, you must have a lesser value for i or else it will register your time for pacific every time)


 int iAdd0 = 0;
 int iAdd1 = -1;
 int iAdd2 = -2;
 int iAdd3 = -3;

 int minutes;
 int hours;
 std::string amOrPm;
 bool am;
  int zone;

 std::vector<std::string> zoneDisplay (4);
 zoneDisplay.push_back ("\n1. Pacific");
 zoneDisplay.push_back ("\n2. Mountain");
 zoneDisplay.push_back ("\n3. Central");
 zoneDisplay.push_back ("\n4. Eastern");

 zonepick:

 std::cout << "\nUS Time Zone Converter\n\n================\n\nEnter a Timezone:";

 // for loop for display and goto for invalid input

 display:

 for(int i; i<zoneDisplay.size(); i++)
 {

   std::cout << zoneDisplay[i] << "\n";
 }
 std::cout << "\n";

 std::cin >> zone;
 if(zone != 1 && zone != 2 && zone != 3 && zone != 4) {
   invalid();
   goto display;
 }


 // goto for invalid input
 hourspick:
 std::cout << "\nEnter the time (hours): ";
 std::cin >> hours;
 if (hours > 12)
 {
   invalid();
   goto hourspick;
 }

 // goto for invalid input

 minutespick:
 std::cout << "\nEnter the time (minutes): ";
 std::cin >> minutes;
 if (minutes > 60)
 {
   invalid();
   goto minutespick;
 }

 // goto for invalid input

 ampmcycle:
 std::cout << "\nAM or PM? ";
 std::cin >> amOrPm;
 if (amOrPm == "am" || amOrPm == "AM")
 {
   am = true;
 }
 else if (amOrPm == "pm" || amOrPm == "PM")
 {
   am = false;
 }
 else {
   invalid();
   goto ampmcycle;
 }


 // didn't use booleans because that would waste space

 for (int i; i < 4; i++) {
   if (zone == i) {

   }
 }

 if (zone == 1)
 {
   finTimeDisplay(hours, minutes, am, iAdd0);
 }
 else if (zone == 2)
 {
   finTimeDisplay(hours, minutes, am, iAdd1);
 }
 else if (zone == 3)
 {
   finTimeDisplay(hours, minutes, am, iAdd2);
 }
 else if (zone == 4) {
   finTimeDisplay(hours, minutes, am, iAdd3);
 }


 /* 
 I thought this would work as a replacement for the if statements above. It didn't. 
 for (int i; i < 4; i++) 
 {
   if (zone == i) {
     finTimeDisplay(hours, minutes, am, iAdds.at(i));
   }
 }
*/
} 

1 Ответ

1 голос
/ 05 апреля 2020

Операторы if ничего не делают, потому что вы никогда не достигаете операторов if. Посмотрите на код

 while(h <= 12 && h > 0 && i < 4)
 {
     ...
     if (h > 12)
     {

Вы попадете в l oop только если h <= 12, поэтому h > 12 никогда не может быть истинным . Та же проблема для if (h < 0).

...