1

Тема: Виправте код. Задача з масивом структур

Задача звучить наступним чином. "Створити масив структур, що містить інформацію про співробітників приватної клініки. Кожна структура містить поля - прізвище лікаря, спеціалізація, стаж роботи. Написати програму, яка видає наступну інформацію: список лікарів за спеціалізацією Х із зазначенням стажу роботи; середній стаж співробітників клініки. Спеціалізація Х вводиться за запитом з клавіатури."

Я написала код з використанням функцій, але він не працює так, як треба: або виводить забагато, або взагалі не виводить нічого.

#include <iostream> 
#include "windows.h"
#include <clocale>
#include <conio.h>
#include "stdio.h"

using namespace std;

struct book {
    char surname[30];
    char special[40];
    int year;
};

void show(const book obj[], int n)
{
    char special[40];
    char spec[40];
    cout << "Введіть шукану спеціалізацію: ";
    cin.getline(spec, 40);
    for (int i = 0; i < n; i++)
    {
        for (int k = 0; k < n; k++) {
        if (special[40] == spec[k])
            cout << "\nПрізвище:\t" << obj[i].surname << "\tСтаж роботи:\t" << obj[i].year << endl;
        }
    }
}

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    const int n = 3;
    book array[n] = {};
    for (int i = 0; i < n; i++)
    {
        cout << "Прізвище: ";
        cin.getline(array[i].surname, 30);

        cout << "Спеціалізація: ";
        cin.getline(array[i].special, 40);

        cout << "Стаж роботи: ";
        cin >> array[i].year;

        cin.get();
    }
    show(array, n);
    _getch();
    system("pause");
    return 0;
}

2

Re: Виправте код. Задача з масивом структур

if (special[40] == spec[k])

Що саме ви тут порівнюєте?
Пошукайте документацію функції strcmp, тільки читайте уважно, вона дещо несподівано може поводитися.

3

Re: Виправте код. Задача з масивом структур

koala написав:
if (special[40] == spec[k])

Що саме ви тут порівнюєте?
Пошукайте документацію функції strcmp, тільки читайте уважно, вона дещо несподівано може поводитися.

Спробувала використати її, але результат не краще

for (int i = 0; i < n; i++)
        {   
            bool k = strcmp(special, spec);
            if (k==0)
            cout << "\nПрізвище:\t" << obj[i].surname << "\tСтаж роботи:\t" << obj[i].year << endl;
        }

4

Re: Виправте код. Задача з масивом структур

if (strcmp (arr[i].spec,spec) == 0)

Ви не уважно читали документацію strcmp

Подякували: leofun011

5

Re: Виправте код. Задача з масивом структур

А вас не засмутило те, що вираз strcmp(special, spec) ніяк не залежить від i, тобто в усіх ітераціях даватиме один і той самий результат?

Подякували: leofun011

6

Re: Виправте код. Задача з масивом структур

Задача звучить наступним чином:

1. Створити масив структур, що містить інформацію про співробітників приватної клініки..
Чому структура носить назву struct book? А не скажімо Employee.

2. Кожна структура містить поля - прізвище лікаря, спеціалізація, стаж роботи.

Тоді ваша структура мала б наступний вигляд

typedef struct EMPLOYEE Employee;

#define SNAME 16
#define SSPEC 16

typedef struct EMPLOYEE
{
    char name[SNAME];
    char spec[SSPEC];
    size_t wexp;
} Employee;

Якщо, вам важко розібратись із рядками. То поле спеціальності лікаря можна замінити цілочисельним типом даних. Та порівнювати числа. Код мав би наступний вигляд.

typedef struct EMPLOYEE Employee;

#define SNAME 16

struct EMPLOYEE
{
    char name[SNAME];
    TYPE spec; // де TYPE можна використати перелік спеціальностей в enum, або int
    size_t wexp;
};

Числа надіюсь ви порівнювати вмієте?

Подякували: leofun011

7

Re: Виправте код. Задача з масивом структур

А якщо по вашому коду, тоді:

void show(const book obj[], int n)
{
    char special[40]; // Для чого ці два масиви?
    char spec[40]; // одного вистачить


    cout << "Введіть шукану спеціалізацію: ";
    cin.getline(spec, 40);
    for (int i = 0; i < n; i++)
    {
        for (int k = 0; k < n; k++) { // Цей цикл зайвий. Для чого він....
        if (special[40] == spec[k]) // Тут потрібно порівнювати obj[i].spec та spec
            cout << "\nПрізвище:\t" << obj[i].surname << "\tСтаж роботи:\t" << obj[i].year << endl;
        }
    }
}

8

Re: Виправте код. Задача з масивом структур

Це взагалі C++. Викинути typedef і використовувати vector та string.

9

Re: Виправте код. Задача з масивом структур

koala написав:

Це взагалі C++. Викинути typedef і використовувати vector та string.

typedef - Це стара звичка (перша мова C). А на рахунок vector та string, я тільки за. Але про що мова, якщо не можуть порівняти два символьні ряди.