2017-02-21 8 views
0

Я пытался сделать холлендж/проблему, как показано ниже в HackerRank. (Вам не нужно входить, чтобы просмотреть проблему, для тех, кто не хочет просматривать ее по ссылке, я кратко напишу про описание проблемы).Неисправность логической инструкции IF для удвоений C#

https://www.hackerrank.com/challenges/time-conversion

Учитывая указанный вход (строка) даты (2:34:50 PM) в AM формате/PM, я должен был превратить его в военное время (14:34:50). Полночь в Вооруженных силах - 00:00:00, а в формате AM/PM - 12:00:00 AM, а на второй день в Милатари - 12:00:00, а в формате AM/PM - 12:00:00 PM.

Теперь подход, который я использовал, это проверка второго последнего значения строки, поскольку был указан формат ввода. B/c Мне нужно изменить только часы, которые я использую только для 0-го и 1-го индексов строки, которые преобразуют его в double, используя «GetNumericValue».

Теперь, когда я использую значения этих удвоений в моей инструкции IF (в блоке PM if), они терпят неудачу, если я проверяю на «! =». Я привел код ниже. После использования отладчика и просмотра того, что происходит, он полностью отказывается от оператора IF, содержащего «! =». Это происходит, если мой ввод имеет «1» в первом индексе или имеет «2» во втором индексе.

Сначала я думал, что это может быть проблема с точностью двойного с таким небольшим числом, однако мой код дает правильный ответ, если вход «01: xx: xxPM». Поэтому я склонен думать о своей логике моего заявления IF, хотя я так долго смотрел на него, и я понятия не имею, почему это не сработает. Я дал альтернативный фрагмент кода, который я написал, который сработал. Я в основном сделал то же самое, за исключением того, я использовал «==» и заявление еще (до этого я использовал «! =» И оператор еще)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace HackerRank_Algorithms 
{ 
    class Time_Conversion 
    { 
     static void Main(string[] args) 
     { 

      //Reading input Date in the format "02:34:50PM" 
      string time = Console.ReadLine(); 
      //Creating a double array for storing the first digits that is the hours 
      //used double since 'GetNumericValue' returns type double 
      double[] timeIn24 = new double[2]; 
      //loop to convert the first two digits from string into double 
      for (int x = 0; x < 2; x++) 
      { 
       timeIn24[x] = char.GetNumericValue(time, x); 
      } 

      //Because I know the date will always be in a specified format I check at the place for 
      //'P' or 'A' for AM or PM 
      //If PM then do this 
      if (time[time.Length-2] == 'P') 
      { 
       //Console.WriteLine("Time is PM"); 

       /******************************************** 
       //I tried doing this since but didn't work 
       //timeIn24[1] = Convert.ToInt32(timeIn24[1]); 
       //timeIn24[0] = Convert.ToInt32(timeIn24[0]); 
       *********************************************/ 

       //Console.WriteLine("Before {0} timeIn24[0]", timeIn24[0]); 
       //Console.WriteLine("Before {0} timeIn24[1]", timeIn24[1]); 


       //PROBLEM OCCURRING HERE I check if its 12PM or not if it isn't then I do the follwoing 
       if (timeIn24[1] != 2 && timeIn24[0] != 1) 
       { 
        //add 2 to the unit of hours 
        timeIn24[1] = timeIn24[1] + 2; 

        //Console.WriteLine("After addition {0} timeIn24[0]", timeIn24[0]); 

        //if the sum i get is greater than 10 that is I'm getting a carry 
        if (timeIn24[1] > 9) 
        { 
         //I add one to the tenth of hours 
         timeIn24[0] = timeIn24[0] + 1; 
         //Modulus to get the last digit of unith hour 
         timeIn24[1] = timeIn24[1] % 10; 
        } 
        timeIn24[0] = timeIn24[0] + 1; 
        Console.Write("{0}{1}", timeIn24[0], timeIn24[1]); 


        //Console.WriteLine(timeIn24[0]); 
        //Console.WriteLine(timeIn24[1]); 
       } 
       else //if its 12PM then I do not do anything and I print it as is 
       { 
        Console.Write("{0}{1}", timeIn24[0], timeIn24[1]); 
       } 

       /***********CODE THAT GAVE THE CORRECT SOLUTION******************/ 
       //if (timeIn24[1] == 2 && timeIn24[0] == 1) 
       //{ 
       // Console.Write("{0}{1}", timeIn24[0], timeIn24[1]); 


       // //timeIn24[0] = timeIn24[0]/10; 
       // //Console.WriteLine(timeIn24[0]); 
       // //Console.WriteLine(timeIn24[1]); 
       //} 
       //else 
       //{ 
       // timeIn24[1] = timeIn24[1] + 2; 
       // //Console.WriteLine("After addition {0} timeIn24[0]", timeIn24[0]); 
       // if (timeIn24[1] > 9) 
       // { 
       //  timeIn24[0] = timeIn24[0] + 1; 
       //  timeIn24[1] = timeIn24[1] % 10; 
       // } 
       // timeIn24[0] = timeIn24[0] + 1; 
       // Console.Write("{0}{1}", timeIn24[0], timeIn24[1]); 
       //} 
       /******************************************************************/ 

       //Here I simply start from the first colon and print the date as string till end 
       int y = 2; 
       while(y < time.Length-2) 
       { 
        Console.Write("{0}", time[y]); 
        y++; 
       } 
      } 
      else //if its AM 
      { 
       //if its 12AM that is Midnight 
       if (timeIn24[0] == 1 && timeIn24[1] == 2) 
       { //set both tenth and unit of hour to 0 
        timeIn24[0] = 0; 
        timeIn24[1] = 0; 
       } 
       //print the hours 
       Console.Write("{0}{1}", timeIn24[0], timeIn24[1]); 

       //again print from first colon + the remaining of string 
       int x = 2; 
       while (x < time.Length-2) 
       { 
        Console.Write("{0}", time[x]); 
        x++; 
       } 
      } 

      Console.ReadLine(); 
     } 
    } 
} 
+1

Вам нужно сравнить двойные значения, используя epsilon, а не только == или! = Или> = или <= и т. Д. См. Сравнение поплавков и парных разрядов с Epsilon. http://stackoverflow.com/questions/2411392/double-epsilon-for-equality-greater-than-less-than-less-than-or-equal-to-gre и http: // с плавающей запятой. de/errors/comparison/ – Brandon

+1

Я думаю, что у вас будет больше успеха в работе с сборкой .NET в стиле DateTime. https://msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx – maniak1982

+2

Существует много длинных академических материалов. Не разрешает ли хакерская программа встроенные функции? Должна быть проверка пользователей как «TryParse». И у вас уже есть 24-часовой формат 'date.ToString (" HH: mm: ss ")'. –

ответ

0

Вопрос действительно является с if заявлением. Подумайте об использовании 10:00:00AM в качестве вашего ввода. В этом случае, timeIn24[1] != 2 будет вычисляться true (так как вторая цифра 0, а не 2), а вторая часть, timeIn24[0] != 1, будет вычисляться false, потому что первая цифра действительно 1. Так как вы используете &&, как стороны должны оценить до true, чтобы ввести заявление if.

Если вы используете || (или) вместо && (и), то if заявление должно работать правильно, потому что если либо цифра не равна правильное значение, то код будет ввести if блок.

Конечно, как отмечали другие, если это не было специально запрещено вызовом, было бы намного проще использовать встроенный тип DateTime.

+0

Ах да, вы абсолютно правы. Я просто не видел его, пока не увидел, что это написано в вашем ответе. Спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^