失败的IF逻辑语句为双精度c#

时间:2017-02-21 18:05:15

标签: c# if-statement

我正在尝试HackerRank中的挑战/问题。 (您无需登录即可查看问题,对于那些不希望通过链接查看问题的人,我会简要介绍问题陈述。)

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

给定AM / PM格式的日期(02:34:50 PM)的指定输入(字符串),我必须将其转换为军事时间(14:34:50)。 Military的午夜时间为00:00:00,AM / PM格式为12:00:00 AM,Milatary的下午时间为12:00:00,AM / PM格式为12:00:00 PM。

现在我使用的方法是检查字符串的第二个最后一个值,因为指定了输入格式。 B / c我只需要更改小时数我只取第0个和第1个字符串索引,使用“GetNumericValue”将其转换为double。

现在当我在IF语句中使用这些双精度值时(在PM if块中),如果我检查“!=”,它们就会失败。我已经给出了下面的代码。在使用调试器并查看发生了什么后,它完全放弃了包含“!=”的IF语句。如果我的输入在其第一个索引中具有“1”或在其第二个索引中具有“2”,则会发生这种情况。

起初我认为这可能是一个问题,精度为double这么小的数字,但是,如果输入“01:xx:xxPM”,我的代码会给出正确的答案。所以我倾向于认为它是我的IF语句的逻辑,虽然我已经盯着它看了这么久,但我不知道它为什么不起作用。我给了我编写的替代代码片段。我基本上做了同样的事情,除了我使用“==”和一个else语句(在我使用“!=”和else语句之前)

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 个答案:

答案 0 :(得分:0)

问题确实在于if声明。考虑使用10:00:00AM作为输入。在这种情况下,timeIn24[1] != 2将评估为true(因为第二个数字为0,而不是2),但第二个部分timeIn24[0] != 1将评估为false,因为第一个数字确实是1.由于您正在使用&&这两个方需要评估为true才能输入if语句。

如果您使用||(或)代替&&(和),if语句应该可以正常运行,因为如果 数字不是&#39 ; t等于正确的值,代码将进入if块。

当然,和其他人一样,除非挑战明确禁止,否则使用内置DateTime类型会更加简单。