Search code examples
c++functionloopsinfinite-loop

My function skips a loop parameter in c++


My GetMark() function, which is supposed to check for correct range and afterwards return the value, if correct to the given array gets stuck in a infinite loop when a parameter is given outside of the accepted range, before i added the SearchMark() function it worked correctly and looped only until the user finally entered a value in the given range (0 - 100) but now after the first out of range value is given it loops no matter what is entered, I will be thankful for any suggestions. full code:

int GetMark(int ModuleIndex) //user input function
{
    bool help;
    if (ModuleIndex < 0 || ModuleIndex >100)
    {
        help = false;
        while (help != true)
        {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "hey, that's a invalid value, try again!" << endl;
            GetMark(ModuleIndex);
            if ((ModuleIndex > 0) &&( ModuleIndex < 101))
            {
                help = true;
            }
        }
    }

    return ModuleIndex;
}

int SearchMark(int A[], int a) //search grades array for numbers of specific grades
{
    int i = 0;
    int ii = 0;

    while (i < 12)
    {
        if (A[i] == a)
            ii++;
        i++;
    }
    cout << "Mark " << a << " was found: " << ii << " times" << endl;
    return 0;
}



int main()
{
    int marks[12]; 
    int i = 0;
    int sum = 0;
    int grades[12];

    while (i < 12)
    {
        cout << "enter mark (0 - 100): " << endl;
        cin >> marks[i];
        GetMark(marks[i]);
        sum = sum + marks[i];
        if (marks[i] > 69)
        {
            grades[i] = 1;
        }
        else if (marks[i] > 59 && marks[i] < 70)
        {
            grades[i] = 2;
        }
        else if (marks[i] > 49 && marks[i] < 60)
        {
            grades[i] = 22;
        }
        else if (marks[i] > 39 && marks[i < 50])
        {
            grades[i] = 3;
        }
        else if (marks[i] < 35)
        {
            grades[i] = 4;
        }
        i++;
    }
    sum = sum / 12;
    cout << "your average is: " << sum  << endl;




    if (sum > 69)
    {
        cout << "You passed with 1st!" << endl;
    }
    else if ((sum > 59) && (sum < 70))
    {
        cout << "You passed with 2i!" << endl;
    }
    else if ((sum > 49) && (sum < 60))
    {
        cout << "You passed with 2ii!" << endl;
    }
    else if ((sum > 39) && (sum < 50))
    {
        cout << "You passed with 3rd!" << endl;
    }
    else if (sum < 40)
    {
        cout << "Your average is too low! You failed." << endl;
    }


    i = 0;
    while (i < 12)
    {
        if (marks[i] < 35)
        {
            cout << "Referred in module " << i + 1 << " mark too low." << endl;
        }
        i++;
    }

    SearchMark(grades, 1);
    SearchMark(grades, 2);
    SearchMark(grades, 22);
    SearchMark(grades, 3);
    SearchMark(grades, 4);

    return 0;
}`

Solution

  • That function is overly complicated for what it does. Just loop while the value is bad, and prompt for a new value:

    int GetMark(int ModuleIndex) {
        while (ModuleIndex < 0 || ModuleIndex > 100) {
            std::cout << "Invalid value.\n"
            std::cin >> ModuleIndex;
        }
        return ModuleIndex;
    }
    

    Recursion is very handy in theoretical analysis, but in practice it's almost always a mistake.