Поиск в массиве для сопоставления результатов и членов структуры Cout C ++ - PullRequest
0 голосов
/ 10 января 2020

Завершение программы отслеживания производительности Academi c, которая требовалась в качестве окончательного проекта в прошлом семестре. Я не закончил sh до того, как это должно было произойти, и я пытаюсь понять, почему некоторые функции не работают так, как мне бы хотелось.

Функция (searchCourse) предназначена для поиска в массиве в структуре. Если совпадение найдено, все члены структуры должны быть напечатаны пользователю. Я ищу по альфа-обозначению курса (например, CIT). Я загрузил в программу файл с тремя классами CIT, и при вызове этой функции они не распознаются. Обозначение курса альфа имеет тип данных char. Было бы проще выполнить sh, если бы это был строковый тип и использование strcmp в 'for' l oop?

//Prompts user to enter course alpha designator for comparison purposes. 
void searchCourse(courses course[])
{
    char desig[3];//User inputs course alpha designator to compare within loop
    //Assigned array value of 4 since strcmp requires 'desig' to have a size for comparison to course[i]
    int i;//Location / loop counter

    cout << endl << "Enter course Alpha-Designator (Ex: CIT, DFIA, etc.): " << endl;//User prompt
    cin >> desig;
    //Set course info headings
    cout << endl;
    cout << left << setw(10) << "Course" << left << setw(25) << "Title" << setw(7) << "Hours" << "Grade" << endl << endl;

    //begin for loop
    for (i = 0; i < courseArrayLength; i++)
    {
       if(course[i].courseName == desig) //If the value in course.courseName is equal to user 'desig'
                                               //Have to use strcmp function when comparing c-strings in array.
                                               //I tried to use the example in CH.8-2 and apply it here. 
        {
            cout << left << setw(4) << course[i].courseName << left << setw(6) << course[i].courseNum;//Print info formatting
            cout << left << setw(25) << course[i].courseTitle << left << setw(7) << course[i].courseHours << course[i].courseGrade << endl;
        }   
        else
        {
            cout << "No courses by that designator.";//Message to display if input 'desig' finds no matches.
            break;
        }
    }

}

Полный программный код находится на github, если кому-то это понравится. Любая помощь приветствуется. Это последние две из девяти функций для завершения этого проекта. Если я смогу узнать, как правильно это исправить, то следующий по сути тот же.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 10 января 2020
  • desig недостаточно велико: в нем также должен быть установлен нулевой терминатор . Если разрешено, используйте std::string. Если нет, выберите достаточно большой массив, скажем char desig[ 1024 ].
  • Объявите переменную счетчика i в операторе for : for ( int i = 0;…
  • course[ i ].courseName == desig сравнивает два указателя , а не две строки. Используйте std::strcmp: if ( 0 == strcmp( course[ i ].courseName, desig ) ).... Если вы переключитесь на std::string, вы можете использовать сравнение так же, как и раньше.
  • Вы слишком быстро сломаете l oop : когда вы найдете первый несоответствующий курс (вы может найду позже). Вы, вероятно, захотите сломать l oop, как только найдете первое совпадение: удалите else и переместите разрыв внутрь if.

Добро пожаловать на SO и удачи!

0 голосов
/ 17 января 2020

Спасибо всем за ответы. Я, очевидно, новичок в программировании, и этот проект многому меня научил. Все ответы дали мне повод задуматься, и я в итоге выполнил то, что намеревался сделать самостоятельно. В любом случае код ниже работает.

void searchCourse(courses course[])
{
    string desig;//User inputs course alpha designator to compare within loop
    //Assigned array value of 4 since strcmp requires 'desig' to have a size for comparison to course[i]
    bool found = false;

    cout << endl << "Enter course Alpha-Designator (Ex: CIT, DFIA, etc.): " << endl;//User prompt
    cin >> desig;
    cout << endl;//Terminal formatting
    cout << left << setw(10) << "Course" << left << setw(25) << "Title" << setw(7) << "Hours" << "Grade" << endl << endl;
    //Format info header
    //begin for loop
    for (int i = 0; i < courseArrayLength; i++)//For loop to process array
    {
        while (i < courseArrayLength)//While array processes...
        {
            if(strcmp(course[i].courseName, desig.c_str()) == 0) //If the value in course.courseName is equal to user 'desig'
                {
                    found = true;//Boolean 'found' is set to true
                    cout << left << setw(4) << course[i].courseName << left << setw(6) << course[i].courseNum;//Print info formatting
                    cout << left << setw(25) << course[i].courseTitle << left << setw(7); 
                    cout << course[i].courseHours << course[i].courseGrade << endl;
                    break;//Required since nested in while loop
                }   

            else if(i < courseArrayLength)//Continue array process.
                {
                    i++;                   
                }
        }
        if(found == false)//If no courses found by user defined designator...
        {
            cout << "No courses by that designator." << endl;//Message to display if input 'desig' finds no matches.
            break;
        }  
    } 
}
...