Булева функция в программе возвращает недопустимый введенный диапазон - PullRequest
0 голосов
/ 03 февраля 2020

Я работаю над программой, которая определяет, есть ли числа с повторяющимися цифрами в пределах диапазона. Сама программа работает нормально, но один из ее компонентов определяет, является ли введенный пользователем диапазон действительным. Требуется, чтобы я сделал логическую функцию для этого называется range_is_valid. Два входа a и b, если b

#include <iostream>
#include <vector>
#include <stdbool.h>
using namespace std;


//function for finding repeating digits
bool has_repeating_digits(int number){
    bool hasDigit[10] = {false, false, false, false, false, false, false, false, false, false};
    int count = 0;
    while (number > 0) {
        int digit = number % 10;
        if (hasDigit[digit]){
            return true; // We already have this digit0
        }
        hasDigit[digit] = true; // Flag the digit we just found
        number /= 10; // Divide by 10, to move onto the next digit
    }
    return false; // If we get here, there is no repeat digit
}  

//function for counting valid numbers
int count_valid_nums(int a, int b, int count){
    int validnums = ((b - a) + 1) - count; //the total range minus the count of invalid nums leaves just valid nums
    return validnums; 
}

//function for determining if inputted range is valid
bool range_is_valid(int a, int b){
    if ((a > b) || (a < 0) || (b < 0) || (a > 10000) || (b > 10000)) {
        return false; //if any of those are true then invalid range
    }
}

int main(){
    //variables
    int a, b, i, count= 0; // a & b inputs, i for iterating

    //entering number range
    cout << "Enter numbers 0 < a <= b <= 10000: " << endl;
    cin >> a;
    cin >> b;

    //Check if the range is valid
    range_is_valid(a,b);
    if (range_is_valid(a, b) == false){
        cout << "The range is invalid" << endl;
    }

    //making a vector to contain numbers between a and b
    vector<int> listofnums((b-a)+1); 
    int initialvalue = a;
    while (i <= (b-a)) {  
        listofnums[i] = initialvalue;                                 


        //call the has repeating digits function
        has_repeating_digits(listofnums[i]);
        if (has_repeating_digits(listofnums[i])){ //counting how many numbers in vector have repeat digits
            count++;
        }   
        initialvalue++; 
        i++;

    }

    //call the count valid numbers function
    cout << "There are " << count_valid_nums (a, b, count) << " valid numbers between " << a << " and " << b << endl;

    return 0;
}

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Когда у вас есть это

if (condition) return true;
else return false;

Вы также можете написать

return condition;

В range_is_valid у вас есть

if (condition) return false;
// missing return !!!!

, который ничего не возвращает, когда condition == false. Вы можете написать это как

return !(condition);
0 голосов
/ 03 февраля 2020

Это просто. Кажется, что оба числа должны быть положительными и не превышать 10000.

Функция может выглядеть, например, следующим образом

bool range_is_valid(int a, int b)
{
    return a <= b && a > 0 && b <= 10'000; 
}

Однако это не очень хороший подход, потому что функция использует маги c число 10000.

Лучше передать такое число в качестве аргумента функции.

Принимая это во внимание, функция может выглядеть следующим образомg

#include <utility>

//...

bool range_is_valid( const std::pair<int, int> &data, const std::pair<int, int> &range )
{
    return data.first <= data.second && 
           data.first > range.first  &&
           data.second <= range.second;   
}

Вот демонстрационная программа.

#include <iostream>
#include <iomanip>
#include <utility>

bool range_is_valid( const std::pair<int, int> &data, const std::pair<int, int> &range )
{
    return data.first <= data.second && 
           data.first > range.first  &&
           data.second <= range.second;   
}

int main() 
{
    const std::pair<int, int> range( 0, 10'000 );

    int a, b;

    size_t attempts = 3;

    while ( attempts-- != 0 )
    {
        std::cout << "Enter numbers " << range.first << 
                     " < a <= b <= " << range.second << '\n';

        std::cin >> a >> b;

        std::cout << std::boolalpha << range_is_valid( { a, b }, range ) << '\n';
    }

    return 0;
}

Ее вывод может выглядеть, например, как

Enter numbers 0 < a <= b <= 10000
0 10000
false
Enter numbers 0 < a <= b <= 10000
1 10001
false
Enter numbers 0 < a <= b <= 10000
1 10000
true

Всегда пытайтесь написать более универсальную c функцию.

Обратите внимание, что это объявление

bool hasDigit[10] = {false, false, false, false, false, false, false, false, false, false};

выглядит глупо.

Вы можете просто написать

bool hasDigit[10] = {};

или

bool hasDigit[10] = { false };
...