Solved

Can I do this in 'C'

Posted on 2001-09-06
28
242 Views
Last Modified: 2010-04-15
I'm writing a date conversion program and I've put the input as a constant(I'm not sure if I can do it, as It might need to be a construct or method).
When I check the initial input, if its the wrong data the I want to call up the original input message without using a goto etc.
Code below

static const userInput[10] =
     {
      //     userInput=0;
          printf("Please enter a date using the format of dd/mm/yy, "),
          printf("and press enter. A year after 2000 is accepted only. "),
          fflush(stdin),
          scanf("%d/%d/%d", iday, imonth, iyear)
     };
I call the userInput up at the end of the error message

printf("\nInvalid entry, Please re-enter the whole date: ", userInput);

Any help would be appreciated.
Regards Ned
0
Comment
Question by:Ned_Kelly
  • 16
  • 12
28 Comments
 
LVL 6

Expert Comment

by:Triskelion
Comment Utility
Do something like this...

While (/*Getting my data is not valid*/)
   {
   /*GetMyDataHere();*/
   }
0
 
LVL 6

Expert Comment

by:Triskelion
Comment Utility
  while(0==(chrOption=GetMenuOption(pstrAcceptables)))
      {
      puts("Please enter a selection from the menu");
      }

This process was waiting on a valid character as a selection in a menu.  I made the function GetMenuOption() check the range of acceptable values and return 0 if it was not acceptable.  Of course I first set chrOption=0 earlier in the program.


0
 
LVL 6

Expert Comment

by:Triskelion
Comment Utility
#include <stdio.h>
#include <string.h>

int     GetValidDate(char * pstrDateToReturn)
{
     auto     int     iday=0, imonth=0,iyear=0;

     fflush(stdin),
     scanf("%02d/%02d/%04d", &iday, &imonth, &iyear);
     if (iyear > 2000)
          {
          sprintf(pstrDateToReturn, "%02d/%02d/%02d", iday, imonth, iyear);
          return 1;
          }
     return 0;
}

void          Usage(void)
{
     puts("Please enter a date using the format of dd/mm/yy, \n"
               "and press enter. A year after 2000 is accepted only.");
}

int main(void)
{
     static     char     strDate[16];
     auto          int     intRetVal=0;
     //
     Usage();
     while(0==(intRetVal=GetValidDate(strDate)))
          {
          Usage();
          }
     puts(strDate);
     return 0;
}
0
 

Author Comment

by:Ned_Kelly
Comment Utility
Hi Triskelion, thanks for your comment.  I think I can see what you are doing, you set up the variable GetValidDate and then set the length to the char * the pstring
DateTo Return,  I haven't come accross the auto yet so I'm assuming it sets the values at zero, though I thought just the  int     iday=0, imonth=0,iyear=0;  would do the same.
Not sure what the s is in front of the printf, you set up Usage in void which as I understand it there can only be one of it.  You then call it  if GetValidDate is an invalid date though I'm not quite sure with your code.
The assignment is to accept a short date input from the user and convert it to a long date format, while doing all the error and validation checking, including the leap year.
I do need some help but have done most of it already, if you want to see I can post the code, such as it is.  What I was trying to do was to recall the input if the user put wrong data in for either the day, month or year. Once that was checked then to check for the days in each month and the leap year then to convert before printing it out.
Many thanks
Ned


0
 
LVL 6

Expert Comment

by:Triskelion
Comment Utility
Yes, you can post the code if you wish.
The 'auto' is a default.  Every time you declare a variable and put nothing in front of it, its default 'storage class' is auto.  That means create this variable using the 'stack' and set its value to whatever is on the stack unless it is set with a value at creation.
Auto variables have their values reset every time the function is entered.  They are always recreated, too.
When the function ends, so does their lifespan (they go out of scope).
{
   int iData; /*value = ???*/
//is the same as
   auto int iData; /*value = ???*/

//but
   auto int iData=0; /*always initialized and set to 0*/
}

The opposite of auto is 'static'

static variables stay alive even when the function using them is not active.
They are not re-created or reinitialized unless you FORCE them to be.

Check these two examples.
#include <stdio.h>

void DoScopeAuto(void)
{
     int intData=0;

     intData++;

     printf("%d\n", intData);
}

void DoScopeStatic(void)
{
     static int intData=0;

     intData++;

     printf("%d\n", intData);
}

int main(void)
{
     int     intLoop;

     for (intLoop=0; intLoop < 10; intLoop++)
          {
          DoScopeAuto();
          }

     for (intLoop=0; intLoop < 10; intLoop++)
          {
          DoScopeStatic();
          }
     return 0;
}
0
 
LVL 6

Expert Comment

by:Triskelion
Comment Utility
...but in my original answer:
It does not depend on the string length.
What I do is return the value of the date in the string pstrDateToReturn.
I have an integer called intRetVal that receives the return value from the function.  This is overkill, but I wanted to demonstrate how to return a value to show you if the function succeeded or not and also modify the original strDate.

What you should do is create a separate project with my examples in it.
Compile it in DEBUG mode and trace through it step by step until you understand what they are doing.  It'll be fun.

If you need or want a /simpler/, more straing-forward example, let me know.
0
 
LVL 6

Expert Comment

by:Triskelion
Comment Utility
straight-forward not 'straing-forward'
0
 

Author Comment

by:Ned_Kelly
Comment Utility
HI Triskelion, I will do what you suggest with your code, although I think the simpler version might be what I need.  Either way I'm learning.

                                                                                                                                                                                                                                                                                                                                               
/*Program by Michael Kelly started on the 24/08.01
1st assignment for C programming*/
//Header files
#include<stdio.h>
#include<conio.h>
#include<string.h>


void main()
{
      //Declare variables
      int iday, imonth, iyear;
      int day, month, year;

      //Clear screen
      clrscr();

static const userInput[10]=
      {
         //      userInput=0;
            printf("Please enter a date using the format of dd/mm/yy, "),
            printf("and press enter. A year after 2000 is accepted only. "),
            fflush(stdin),
            scanf("%d/%d/%d", iday, imonth, iyear)
      };


      //Check for the days to be in between 1 and 31
      if ((iday>=01) && (iday<=31))
      {
                      iday = day;
                  //Check for the months to be in between 1 and 12
                  if ((imonth>=01) && (imonth<=12))
                  {
                        imonth = month;
                        //Check for the years to be in between 2000 and 9999
                        if ((iyear>=00) && (iyear<99))
                        {
                              iyear = year;


                        }

                  else
                        printf("\nInvalid entry, Please re-enter the whole date: ", userInput);
                  }


      else
            printf("\nInvalid entry, Please re-enter the whole date: ", userInput);
      }


            //Convert the short day to the long day
            switch (day)
            {
                  case '01':            iday="1st";
                                          break;
                  case '21':            iday="21st";
                                          break;
                  case '31':            iday="31st";
                                          break;
                  case '02':            iday="2nd";
                                          break;
                  case '22':          iday="22nd";
                                          break;
                  case '03':            iday="3rd";
                                          break;
                  case '23':            iday="23rd";
                                          break;
                  default:            "th";
                                          break;
            }


      //Choose the string value to match the month
      switch (month)
      {
                                    //Assertain the number of days per month
            case '01':            while ((imonth >=1) && (imonth <=31))
                                    {
                                          "January"=month;      //Assign string to integer variable
                                          //printf("January");      //Print month
                                          break;              //Break from switch statement
                                    }

            case '02':      while ((imonth >=1) && (imonth <=29))
                                    {
                                          if ((!(iyear % 4)) && ((iyear % 100))||(!(iyear % 400)))
                                          {
                                                iday=29
                                          }
                                          Else
                                          {
                                                iday=28
                                          }
                                          month="Febuary";
                                          break;
                                    }

            case '03':      while ((imonth >=1) && (imonth <=31))
                                    {
                                          month="March";
                                          break;
                                    }

            case '04':      while ((imonth >=1) && (imonth <=30))
                                    {
                                          month="April";
                                          break;
                                    }

            case '05':      while ((imonth >=1) && (imonth <=31))
                                    {
                                          month"May";
                                          break;
                                    }

            case '06':      while ((imonth >=1) && (imonth <=30))
                                    {
                                          month="June";
                                          break;
                                    }

            case '07':      while ((imonth >=1) && (imonth <=31))
                                    {
                                          month="July";
                                          break;
                                    }

            case '08':      while ((imonth >=1) && (imonth <=31))
                                    {
                                          month"August";
                                          break;
                                    }

            case '09':      while ((imonth >=1) && (imonth <=30))
                                    {
                                          month="September";
                                          break;
                                    }

            case '10':      while ((imonth >=1) && (imonth <=31))
                                    {
                                          month="October";
                                          break;
                                    }

            case '11':      while ((imonth >=1) && (imonth <=30))
                                    {
                                          month="November";
                                          break;
                                    }

            case '12':      while ((imonth >=1) && (imonth <=31))
                                    {
                                          month="December";
                                          break;
                                    }

            default      :       while ((imonth <1) && (imonth >31))
                                    {
                                          exit();      //Exit from loop
                                    }
      }




      //Clear screen
      clrscr();

      //Print long format date
      printf("\n%d/%c/%cThe date is: ", day, month, year);


      getch();




}


I'm not sure how this will indent once I post it, so please excuse it if it looks weird.
Regards Ned
0
 

Author Comment

by:Ned_Kelly
Comment Utility
I'm having errors converting int's to char, and a few others as well.
Thanks for your help.
Ned
0
 
LVL 6

Expert Comment

by:Triskelion
Comment Utility
I'm looking at it now.
0
 
LVL 6

Expert Comment

by:Triskelion
Comment Utility
Here are some generic comments:
1) Don't use exit()
2) Don't put numbers in '' when you really mean they are numbers.
3) Don't zero pad numbers unless you mean OCTAL or it's in a display.
   
4) The data types with 'i' in front of them are integers (as you have them), but the others
   month, day, year are of type char *

I assume this program is to take a date given by the user like 1/1/2001 and return
The date is January 1st, 2001
right?

If this assumption is correct, the sample code I'll post for you will be COMPLETELY different than what you're thinking, but it'll show you another way of thinking about the technique to solve the problem.
   
0
 
LVL 6

Expert Comment

by:Triskelion
Comment Utility
Please study this carefully.
The style used is different than what you're studying, but it will clarify a few things if you trace through it in DEBUG mode.  If you want to fully understand this, step through it in the debugger.

If I were writing this for myself, it would be a little tighter (removal of strcat());
Anyway... here's 98 lines of code
#include <stdio.h>
#include <string.h>
#include <minmax.h>

#ifdef     _MSC_VER          //microsoft only
#include <stdlib.h>     //needs
void     clrscr(void)     //this
{
     system("cls");          //modification
}
#endif

static     char * arr_strMonths[14] ={
     "Nevuary",     "January",     "February",     "March",
     "April",          "May",          "June",          "July",
     "August",     "September","October",     "November",
     "December",     "Juvember"
     };

typedef struct tagVALID_DATE
     {
     char          strMonth[16];
     char          strDay[16];
     char          strYear[5];    
     } VALID_DATE;


void          Usage(void)
{
     clrscr();
     puts("Please enter a date using the format of dd/mm/yy, \n"
               "and press enter. A year after 2000 is accepted only.");
}

int     GetValidDate(VALID_DATE * ptrDate)
{
     auto     int     intDay=0, intMonth=0, intYear=0;

     Usage();
     fflush(stdin);
     scanf("%02d/%02d/%04d", &intMonth, &intDay, &intYear);

     if(((intDay <1) || (intDay > 31))   ||
          ((intMonth <1) || (intMonth>12)) ||     (intYear < 2000)
          )
          {
          return 0;
          }

     sprintf(ptrDate->strMonth, "%-*.*s",
          min(sizeof(ptrDate->strMonth)-1, strlen(arr_strMonths[intMonth])),
          min(sizeof(ptrDate->strMonth)-1, strlen(arr_strMonths[intMonth])),
          arr_strMonths[intMonth]);

     sprintf(ptrDate->strYear, "%04d", intYear);

     sprintf(ptrDate->strDay, "%d", intDay);
     switch(intDay)
          {
          case 1:
          case 21:
          case 31:
               {
               strcat(ptrDate->strDay, "st");
               break;
               }
          case     2:
          case     22:
               {
               strcat(ptrDate->strDay, "nd");
               break;
               }
          case     3:
          case     23:
               {
               strcat(ptrDate->strDay, "rd");
               break;
               }
          default:
               {
               strcat(ptrDate->strDay, "th");
               break;
               }
          }
     return 1;
}

int main(void)
{
     static          VALID_DATE     xxxMyDate;
     //
     while(0==GetValidDate(&xxxMyDate))
          {// Just keep looping;
          }
     printf("The date is %s %s, %s", xxxMyDate.strMonth, xxxMyDate.strDay, xxxMyDate.strYear);
     getchar();
     return 0;
}

0
 

Author Comment

by:Ned_Kelly
Comment Utility
Thanks Triskelion, you were right in that its very different to mine.
I will step it through in the debugger and check it out, I never got to that with my code as I was still getting errors out of it to try it with the debugger.
You have the points from the first comment I think, I would like to check it out and get back to you first if thats ok.
Regards Ned.
0
 
LVL 6

Expert Comment

by:Triskelion
Comment Utility
Take your time.
0
Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

 

Author Comment

by:Ned_Kelly
Comment Utility
Hi Triskelion, I got all the errors from my pasting out and found it wouldn't run as it didn't have a minmax header file.  I found one on the net and put it in the bin file and tried to run it but it keeps coming up with an error in the header file.
Regardless of that, I'm using the same version of C that they use at Tafe, which is Turbo C++ version 3.  If that dosen't have it on my version then it wont have it on the version at Tafe, so I'm thinking that it's not a good idea to use a header file that my Instructor wont be able to use.
Apart from that I have been reading your code and can understand it fairly well, though there are a few brain gliches.
The static array of str_months is great though I'm not up with the Nevuary and the Juvember.
The type definition structure tagValid_Date is a construct that you have put together, and is filled from the scanf in the Usage(); setting the integers to 0 is a good idea.
I'm not up to date with the pointers as in ptrDate.
I like your if statement very nice when compared to mine.  The return 0; is so that the Struct then hold s the data that was input instead of doing anything with it until it can be processed by the sprintf and the min(sizeof etc, or am I way of track.
int     GetValidDate(VALID_DATE * ptrDate)  The * sign is used as a pointer and not as a multiplication sign, the GetValidDate is a program reserved word or something, it then compares the date to a date in its files in regards to format etc.

ifdef     _MSC_VER          //microsoft only
                                                       #include <stdlib.h>     //needs
                                                       void     clrscr(void)     //this
                                                       {
                                                           system("cls");          //modification
                                                       }
This is so that microsoft can clear the screen, if that is the case then why does it clear the screen when in dos, or is that why, because of dos.
I also like your switch statement and I take it that is where you change the intDay to a string in the statement  strcat(ptrDate->strDay, "st");

The
}
return 1;
}
not to sure of as I thought all brackets were meant to face each other ie
{
return 1;
}
if its an error it doesn't show up in my Turbo C
I take it that xxxMyDate could also have been myDate.
I'm also unsure of the 's' infront of the printf for some of your print statements, maybe its printed to the system memory .
Thanks a lot
Ned.

                                                       #endif
0
 

Author Comment

by:Ned_Kelly
Comment Utility
The #endif is supposed to be under the under the bracket after //modification
0
 
LVL 6

Expert Comment

by:Triskelion
Comment Utility
The brackets DO face each other.
You're looking at the wrong brackets.

The #ifdef stuff is used so that my Microsoft compiler could use a function called clrscr().

sprintf() formats a string (it does not print).

I use the xxx or udf prefix on my objects for user defined objects.  It's my own take on Hungarian Notation.

The GetValidDate is a 'function' name I made up.  You see the body of the function.  The main() function calls to it.
I use functions to encapsulate 'like' functionality.  This usually aids in efficiency and REALLY helps in debugging.  Also, If I try to make a lot of functions that can be reused in other code.

The 'min' function should be available to you in one of the Borland libraries already.  Maybe it's called '_min()'.
The technique I used says, "take the size of the smaller string whichever it is".

It's all technique.  Every programmer has a differing take on the 'what' and 'how' of programming.
0
 

Author Comment

by:Ned_Kelly
Comment Utility
Thanks Triskelion, thats great, many thanks.
Of to Borland.
0
 
LVL 6

Expert Comment

by:Triskelion
Comment Utility
Is everything still OK?
0
 

Author Comment

by:Ned_Kelly
Comment Utility
Hi Triskelion, I haven't been able to get it to run without the minmax header file, so I have been trying to get a mixture of mine and yours going.
Not to well mind you, but I'm having fun and learning heaps.
I will post the code on in a day or two to let you see how I'm going.
I'm trying to set up a functions to call when there is an error.
Thanks for your time
Ned
0
 
LVL 6

Expert Comment

by:Triskelion
Comment Utility
You don't need the minmax header.
Just change the call of min() to whatever Borland uses.
Maybe it's _min() or MIN().
I'm sure you already have one.
0
 

Author Comment

by:Ned_Kelly
Comment Utility
0
 

Author Comment

by:Ned_Kelly
Comment Utility
Hi Triskelion, here is my code and I'll go and try to find the header file that Borland uses.
Regards Ned

/*Program by Michael Kelly starte
d on the 24/08.01
1st assignment for C programming*/
//Header files
#include<stdio.h>
#include<conio.h>
#include<string.h>

int checkforDate(int iday, int imonth, int iyear);

void main()
{

      //Declare variables
      int iday, imonth, iyear, year;
      char day[5], month[10];




      //Clear screen
      clrscr();

         //      printf("Please enter a date using the format of dd/mm/yy, ");
         //      printf("and press enter. A year after 2000 is accepted only. ");
         //      fflush(stdin);
         //      scanf("%02d/%02d/%02d", iday, imonth, iyear);

int checkforDate()
      {
            int iday, imonth, iyear;
            printf("Please enter a date using the format of dd/mm/yy, ");
            printf("and press enter. A year after 2000 is accepted only.\n");
            fflush(stdin);
            scanf("%02d/%02d/%02d", iday, imonth, iyear);
            return 1;
      }


      //Check for the days to be in between 1 and 31

            if ((iday>=01) && (iday<=31))
      {

            day = iday;
                  //Check for the months to be in between 1 and 12
                  if ((imonth>=01) && (imonth<=12))
                  {
                        month = imonth;
                        //Check for the years to be in between 2000 and 9999
                        if ((iyear>=00) && (iyear<99))
                        {
                              year = iyear;


                        }

                  else
                     //      printf("\nInvalid entry, Please re-enter the whole date: ");
                        checkforDate();

                  }

               //      printf("\nInvalid entry, Please re-enter the whole date: ");
                  checkforDate();

            }


            //Convert the short day to the long day
            switch (day)
            {
                  case 1:
                  case 21:
                  case 31:
                              {

                                          day("%d%s", iday, "st");
                                          break;
                              }
                  case 2:
                  case 22:
                              {
                                          day=("%d%s", iday + "nd");
                                          break;
                              }
                  case 3:
                  case 23:
                              {
                                          day=("%d%s", iday + "rd");
                                          break;
                              }
                  default:
                              {
                                          day=("%d%s", iday + "th");
                                          break;
                              }
            }


      //Choose the string value to match the month
      switch (month)
      {
                                    //Assertain the number of days per month
            case 1:            while ((imonth >=1) && (imonth <=31))
                                    {
                                          month("January");      //Assign string to integer variable
                                          //printf("January");      //Print month
                                          break;              //Break from switch statement
                                    }

            case 2:      while ((imonth >=1) && (imonth <=28))
                                    {
                                          if ((!(iyear % 4)) && ((iyear % 100))||(!(iyear % 400)))
                                          {
                                                iday=29;
                                          }

                                          month="Febuary";
                                          break;
                                    }

            case 3:      while ((imonth >=1) && (imonth <=31))
                                    {
                                          month="March";
                                          break;
                                    }

            case 4:      while ((imonth >=1) && (imonth <=30))
                                    {
                                          month="April";
                                          break;
                                    }

            case 5:      while ((imonth >=1) && (imonth <=31))
                                    {
                                          month="May";
                                          break;
                                    }

            case 6:      while ((imonth >=1) && (imonth <=30))
                                    {
                                          month="June";
                                          break;
                                    }

            case 7:      while ((imonth >=1) && (imonth <=31))
                                    {
                                          month="July";
                                          break;
                                    }

            case 8:      while ((imonth >=1) && (imonth <=31))
                                    {
                                          month="August";
                                          break;
                                    }

            case 9:      while ((imonth >=1) && (imonth <=30))
                                    {
                                          month="September";
                                          break;
                                    }

            case 10:      while ((imonth >=1) && (imonth <=31))
                                    {
                                          month="October";
                                          break;
                                    }

            case 11:      while ((imonth >=1) && (imonth <=30))
                                    {
                                          month="November";
                                          break;
                                    }

            case 12:      while ((imonth >=1) && (imonth <=31))
                                    {
                                          month="December";
                                          break;
                                    }               default      :       while ((imonth <1) && (imonth >31))
                                    {
                                          exit();      //Exit from loop
                                    }
      }




      //Clear screen
      clrscr();

      //Print long format date
      printf("\n%s/%s/%d", "The date is: ", day, month, year);

      getch();

}



I only have one error in this code and its a "declaration syntax error" at this point in the code.

int checkforDate()
      {
Regards Ned
0
 
LVL 6

Expert Comment

by:Triskelion
Comment Utility
int checkforDate()
in the function implementation must look EXACTLY like
the prototype (without the semi-colon).
0
 
LVL 6

Accepted Solution

by:
Triskelion earned 100 total points
Comment Utility
... also, the function should not be inside of the main() function.
You can do things like that in pascal, but it will not work in C.

The 'while' statements are not necessary (inside the case) and will lock up your code if the mismatch condition ever arises.
They do not even need to be 'if' statements.  That's what the 'case' does.

Look at this:

int iFred=0;

while (iFred < 10)
{
   printf("hey\n");
}

// iFred is never incremented and therefore will NEVER be equal or greater than 10.

There are other things like
month("January");
that should be
month="January";

// this will not work, you need sprintf() to put the value  into day.
day("%d%s", iday, "st");

Don't compare your numbers with leading zeroes.
It may look pretty, but you'll get in trouble once you go above 7 (unless you're coding for OCTAL instead of decimal).

day and iday are different types and cannot be mixed like your attempt.

Re-study the example I gave you.  
I think anything else on this topic (in Experts Exchange) is going too far for 25 points.

Maybe we should take it outside of this system.
0
 

Author Comment

by:Ned_Kelly
Comment Utility
Hi Triskelion, I was going to increase to points to fifty, but if you are willing to go on I can increase from that.
I need a lot of practice as you  can see.
A few of the things that I'm trying are the 'itoa', which as I understand it is supposed to convert an int to a char, and the function is just form my own doing.
 I would like to have some understanding of them from this exercise.
Have I got a long way to go.
If I was to take out the while statements the nested if statements above it would do the checking for me, I think.
I'm also happy to take it out of the system.
Regards Ned
0
 
LVL 6

Expert Comment

by:Triskelion
Comment Utility
Check my profile for my e-mail address.

I don't use itoa for simple number to string conversions.
I use sprintf();

int intFred=456;
char strFred[16];

sprintf(strFred, "%06d", intFred);
//produces      000456
printf("%s\n", strFred);
0
 

Author Comment

by:Ned_Kelly
Comment Utility
Thanks Trisklion, an email is on the way.
Many thanks for your help.
Ned
0

Featured Post

Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

Join & Write a Comment

Have you thought about creating an iPhone application (app), but didn't even know where to get started? Here's how: ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Important pre-programming comments: I’ve never tri…
An Outlet in Cocoa is a persistent reference to a GUI control; it connects a property (a variable) to a control.  For example, it is common to create an Outlet for the text field GUI control and change the text that appears in this field via that Ou…
The goal of this video is to provide viewers with basic examples to understand and use structures in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use while-loops in the C programming language.

771 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now