编辑:现在工作
我刚开始上大学的第一年,我们做了一些功课。
我们被要求创建一个从用户接收数字和数字的函数,并打印该数字在该数字中的次数。 另外,我们应该使用算法顶部提到的const整数 - 如果数字为负数则返回NEGATIVE_INPUT_NUMBER,如果数字为负数或大于9,则返回ILLEGAL_DIGIT。 我想知道我的程序出了什么问题?它不能用于某种原因。有人可以解释一下原因吗?
非常感谢
它是:
#include <iostream>
using namespace std;
const int NEGATIVE_INPUT_NUMBER = -1;
const int ILLEGAL_DIGIT = -2;
int digitInNumber(int number, int digit);
void main()
{
int digit,number;
cout<< "Please insert a number and then a digit" << endl;
cin>> number >>digit;
cout << digitInNumber(number, digit) << endl;
}
int digitInNumber(int number,int digit)
{
int lastDig;
int counter = 0;
if (number < 0)
return NEGATIVE_INPUT_NUMBER;
if (digit > 9 || digit < 0)
return ILLEGAL_DIGIT;
while (number>0)
{
lastDig = number % 10;
if (lastDig == digit)
counter++;
number = number / 10;
}
return counter;
答案 0 :(得分:1)
在函数digitInNumber
中,您将模数运算的结果注册为数字,同时应将其保存在另一个变量中:
int digitInNumber(int number,int digit)
{
int counter = 0;
int lastDigit = 0;
if (number < 0)
return NEGATIVE_INPUT_NUMBER;
if (digit > 9 || digit < 1)
return ILLEGAL_DIGIT;
while (number>0)
{
lastDigit = number % 10;
if (lastDigit == digit)
counter++;
number = number / 10;
}
return counter;
}
你的版本是&#34;忘记&#34;第一次循环迭代后的数字值。
答案 1 :(得分:1)
这句话错了:
number = number % 10;
它会将number
的值更改为您不想要的内容。引入临时局部变量tempint
并改为使用它:
tempint = number % 10;
if (tempint == digit) {
counter++;
}
或者只是删除该语句并将if
条件修改为:
if (number % 10 == digit) {
counter++;
}
替代方法是将整数转换为字符串,将整数转换为char并使用std::count函数:
int digitInNumber(int no, int dig) {
std::cout << "Enter number and a digit: ";
std::cin >> no >> dig;
std::string number = std::to_string(no);
char digit = dig + '0';
int num_items1 = std::count(number.begin(), number.end(), digit);
return num_items1;
}
答案 2 :(得分:0)
对于根据C ++标准的初学者,没有参数的函数main应声明为
int main()
ILLEGAL_DIGIT,以防数字为负数或超过9
此if语句中的条件不满足要求。
if (digit > 9 || digit < 1)
return ILLEGAL_DIGIT;
例如考虑像
这样的调用digitInNumber( 1010, 0 );
每个变量都应在使用它的范围内声明。变量
int lastDig;
未在函数digitInNumber
的外部范围内使用。
不要将幻数用作10.使用命名常量。
该功能可以按以下方式查看。
int digitInNumber(int number, int digit)
{
const int Base = 10;
if (number < 0)
{
return NEGATIVE_INPUT_NUMBER;
}
if (digit >= Base || digit < 0)
{
return ILLEGAL_DIGIT;
}
int counter = 0;
do
{
counter += number % Base == digit;
} while (number /= Base);
return counter;
}
或者更通用的写函数方法是再添加一个参数。
这是一个示范程序
#include <iostream>
const int NEGATIVE_INPUT_NUMBER = -1;
const int ILLEGAL_DIGIT = -2;
int digitInNumber(int number, int digit, int base = 10)
{
const int DEFAULT_BASE = 10;
const int MINIMUM_BASE = 2;
const int MAXIMUM_BASE = 16;
if (base < MINIMUM_BASE or base > MAXIMUM_BASE) base = DEFAULT_BASE;
if (number < 0)
{
return NEGATIVE_INPUT_NUMBER;
}
if (digit >= base or digit < 0)
{
return ILLEGAL_DIGIT;
}
int counter = 0;
do
{
counter += number % base == digit;
} while (number /= base);
return counter;
}
int main()
{
std::cout << digitInNumber(0, 0) << std::endl;
std::cout << digitInNumber(10, 0) << std::endl;
std::cout << digitInNumber(1010, 0) << std::endl;
std::cout << digitInNumber(0xff, 0xf, 16) << std::endl;
return 0;
}
它的输出是
1
1
2
2
注意这个电话
std::cout << digitInNumber(0xff, 0xf, 16) << std::endl;
答案 3 :(得分:0)
或者,简单的c ++
#include <iostream>
#include <string>
#include <algorithm>
// returns the number of occurrences of 'c' in 's'
size_t count_occurrences(const std::string& s, char c)
{
size_t n = 0;
for (std::string::const_iterator it = s.begin(); it != s.end(); ++it)
{
if (*it == c)
++n;
}
return n;
}
bool validate_number(const std::string& s)
{
return s.length() && s.find_first_not_of("0123456789") == std::string::npos;
}
bool validate_digit(const std::string& s)
{
return s.length() == 1 && isdigit(s[0]);
}
int main()
{
std::string number, s;
char digit = 0;
for(;;)
{
std::cout<< "Please insert a number: ";
std::cin >> number;
if (validate_number(number))
break;
std::cout<< "Invalid entry! Please try again.\n";
}
for (;;)
{
std::cout<< "Please insert a digit to look for: ";
std::cin >> s;
if (validate_digit(s))
{
digit = s[0];
break;
}
std::cout<< "Invalid entry! Please try again.\n";
}
std::cout << "Count: " << count_occurrences(number, digit) << endl;
return 0;
}