我需要从用户输入中找到某些数字的位置

时间:2013-09-24 05:05:25

标签: c++

我一直试图完成这段代码(功能)一段时间,但是我坚持到最后一部分。在此代码中,我提示用户选择一些整数和任意数量的数字,然后找到这些数字中的最小值和最大值。在下一部分,我应该确定哪个给定的数字最小和最大位于输出应该是:

数字_可以在整数中找到:_,_

如果我的代码很草率,我提前道歉;我刚刚开始学习C ++,还没有完全掌握这门语言。

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;
}

应该为用户输入输出的示例:

如果用户为userNumInteger选择2,并输入数字值1234和-1578,

我的问题的输出应该是:

最小数字:1 数字1可以在整数中找到:1,2 。 。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果数字很重要,则输入022不同(即使两者都表示数字2;请注意02可以是八进制表示法)。因此,您应该阅读std::string,使用isdigit检查其数字是否正确,然后使用std::stol(在C ++ 11中)或strtol进行转换。< / p>

您最好使用一些std::vector<int>,而不是使用new int[userNumInteger]初始化指针......

答案 1 :(得分:0)

既然你提到你现在只能使用整数,那会让你的生活变得有点困难。当Basile提到你应该使用字符串时,他是对的。这可以帮助你反复遍历数字,就像我在下面做的那样但是它完成了任务 - 缺点是你必须迭代3次但是如果你不想排序或做任何特别的事情那么它就足够了....

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;

}