user2809589
user2809589

Reputation: 11

I need to find the location of certain digits from user input

I have been trying to finish this code (function) for a while now, but am stuck on the last part. In this code, I prompt the user to select a number of integers and any number of digits and then find the smallest and largest value within these digits. On the next part, I am supposed to determine which of the given digits the smallest and largest are located such that the output should be:

Digit _ can be found in integer number(s): _, _

I apologize in advance if my code is sloppy; I just started learning C++ and haven't fully grasped the language yet.

int digitSizeLoca() {

  int userNumInteger;
  int* iPtr;
  int* iPtr2;
  int* iPtr3;
  int value;
  int value2;
  int value3;

  std::cout << "\nHow many integers? ";
  std::cin >> userNumInteger;

  iPtr = new int[userNumInteger];
  iPtr2 = new int[userNumInteger];
  iPtr3 = new int[userNumInteger];

  for (int i = 0; i < userNumInteger; i++) {

    *(iPtr3 + 1) = *(iPtr2 + 1) = *(iPtr + 1);

    std::cout << "\nEnter digit #" << i + 1 << ": ";
    std::cin >> *(iPtr + 1); 
  }

  value = *(iPtr + 1);
  value2 = *(iPtr2 + 1);
  value3 = *(iPtr3 + 1);

  if (value != 0, value2 != 0, value3 != 0) {

    if (value <= 0) 
      value = -value;
    if (value2 <= 0)
      value2 = -value2;
    if (value3 <= 0)
      value3 = -value3;

    int lDigit;
    int sDigit;
    int curDigit;
    int pot = 10; 

    lDigit = sDigit =  value % pot;

    while (value, value2, value3) {

      if (value / pot == 0, value2 / pot == 0, value3 / pot == 0) break; 

      curDigit = (value / pot, value2 / pot, value3 / pot) % 10;

      if (curDigit < sDigit) 
        sDigit = curDigit;

      if (curDigit > lDigit)
        lDigit = curDigit; 

      pot*=10;
    }

    std::cout << "\nThe smallest digit: " << sDigit << std::endl
      << "\n  Digit " << sDigit
      << " can be found in integer number(s): ";

    std::cout << "\nThe largest digit: " << lDigit << std::endl
      << "\n  Digit " << lDigit
      << " can be found in integer number(s): ";
  }

  return 0;
}

Example of what output should be given user input:

If user chooses 2 for userNumInteger, and inputs the digit values 1234 and -1578,

the output for my question should be:

Smallest digit: 1 Digit 1 can be found in integer number(s): 1, 2 . . .

Thank you!

Upvotes: 0

Views: 398

Answers (2)

user142650
user142650

Reputation:

Since you mentioned that you can only use integer for now, it makes your life a bit difficult. Basile was right when he mentioned that you should use string. That would help you iterating through the numbers over and over again like I did below but it does the task - the drawback being that you will have to iterate 3 times but if you do not want to sort or do anything special then it is good enough....

int digitSizeLoca()
{

  int userNumInteger;
  int* iPtr;
  int lowest = 9;
  int highest = 0;

  std::cout << "\nHow many integers? ";
  std::cin >> userNumInteger;

  iPtr = new int[userNumInteger];

  for (int i = 0; i < userNumInteger; i++)
  {
      std::cout << "\nEnter digit #" << i + 1 << ": ";
      std::cin >> *(iPtr + i);
  }
  for (int i = 0; i < userNumInteger; i++)
  {
      int number = *(iPtr  + i);
      std::cout << "You Entered (" << i << "): " << *(iPtr + i) << std::endl;
      do
      {
          int remainder = number % 10;
          if (remainder > highest) highest = remainder;
          if (remainder < lowest) lowest = remainder;
          number = number / 10;
      }
      while (number > 0);
  }
  std::cout << "\nThe largest digit: " << highest << std::endl
      << " can be found in integer number(s): ";// Notice no endl here
  for (int i = 0; i < userNumInteger; i++)
  {
      int number = *(iPtr  + i);
      do
      {
          int remainder = number % 10;
          if (remainder == highest)
          {
              std::cout << (i+1) << ",";
              break;
          }
          number = number / 10;
      }
      while (number > 0);
  }
  std::cout << std::endl;


  std::cout << "\nThe smallest digit: " << lowest << std::endl
      << " can be found in integer number(s): ";// Notice no endl here
  for (int i = 0; i < userNumInteger; i++)
  {
      int number = *(iPtr  + i);
      do
      {
          int remainder = number % 10;
          if (remainder == lowest)
          {
              std::cout << (i+1) << ",";
              break;
          }
          number = number / 10;
      }
      while (number > 0);
  }
  std::cout << std::endl;

}

Upvotes: 0

If digits matter, then input 02 is not the same as 2 (even if both means the number 2; beware that 02 could be an octal notation). So you should read a std::string, check that it has digits appropriately using isdigit, then use std::stol (in C++11) or strtol to do the conversion.

You'll better use some std::vector<int> instead of initializing a pointer with new int[userNumInteger] ...

Upvotes: 1

Related Questions