-2
//библиотеки
#include<iostream>
#include <iomanip>
#include<vector>
#include <locale>
#include <fstream>
#include <cstring>
using namespace std;

//структура работников
struct workers {
    char fullname[100];         
    char job[100];
    int age;
    int hours;
    double perhour;
    double salary;
    };

//ввод данных
void setinf(workers*worker) {
    cout << "Введите имя сотрудника: ";cin >> worker[0].fullname;
    cout << "Введите возраст сотрудника: "; cin >> worker[0].age;
    cout << "Введите должность сотрудника: "; cin >> worker[0].job;
    cout << "Введите почасовую оплату сотрудника: "; cin >> worker[0].perhour;
    cout << "Введите кол-во рабочих часов сотрудника: "; cin >> worker[0].hours;
}

//вывод данных
void getinf(workers* worker) {
    cout << worker->fullname;
}

//удаление
void delinf(workers* worker) {
}

//меню
void menu(int* ptrkey) {
A:
    cout << "1 - Зарегестрировать работника" << endl
        << "2 - Получить информацию о работнике" << endl
        << "3 - Редактировать информацию о работнике" << endl
        << "4 - Очистить информацию о работнике" << endl
        << "5 - Сохранить информацию в файл" << endl
        << "6 - Загрузить информацию из файла" << endl
        << "7 - Список всех работников" << endl
        << "8 - Сортировка" << endl
        << "9 - Выход" << endl;
    cout << "Выберите действие: "; cin >> *ptrkey; cout << endl;
    workers* worker= nullptr;
    switch (*ptrkey) {
    case(1):
        setinf(worker); goto A;
    case(2):
        getinf(worker); goto A;
    case(3):
        ; break;
    case(4):
        delinf(worker); goto A;
    case(5):; break;
    case(6):; break;
    case(7):; break;
    case(8):; break;
    case(9):; break;
    }

}

//программа
int main() { 
    setlocale(LC_ALL, "RU");
    int key;
    int* ptrkey = { &key };
    workers worker[10];
    menu(ptrkey);



    return 0; 
}
insolor
  • 49,104
Dzen
  • 1
  • Пожалуйста, уточните вашу конкретную проблему или приведите более подробную информацию о том, что именно вам нужно. В текущем виде сложно понять, что именно вы спрашиваете. – Çℏėτᶄắɤẵ Çℏėτɤᶉᶄắ Oct 15 '23 at 07:47
  • Что означает "не получается"? Например, "рука не дотягивается до клавиатуры" — это тоже "не получается ввести"... А вообще уверен, что надо прописать как дубликат https://ru.stackoverflow.com/q/834447/195342 – Harry Oct 15 '23 at 08:10

1 Answers1

0

Ошибок несколько. Во первых простые переменные, например int лучше передавать в функции в виде ссылки а не указателя. Во вторых делать это с простыми переменными лучше только там, где это необходимо, чтобы например вернуть в нее значение, так как на создание указателя выделяется больше ресурсов чем на копию простой переменной (menu()).

В третьих забудьте о существовании goto. Этот оператор вообще использовать нельзя никогда и нигде. Обходитесь без него.

Теперь об ошибке. В строке 51 Вы создаётё пустой указатель на структуру workers. Этот указатель не ссылается ни на какую память. То есть Вы как таковой объект струтуры не создали. Создайте для начала объект.Потом работайте с ним не по указателю, а по ссылке. Указатель необходим только в тех случаях, когда нужна арифметика указателей. В Вашем случае она не нужна.

В setinf Вы добавили индексацию в квадратных скобках. Если бы Ваша функция принимала массив объектов workers, то индексация нужна была бы, но в Вашем случае Вы принимаете один такой объект. А значит индексы никакие не нужны.

Для разыменовывания указателя используйте ->, но для ссылок этого делать не нужно.

Я немного подправил код. Рекомендую посмотреть на изменения и понять каждое из них.

      //библиотеки
#include<iostream>
#include <iomanip>
#include<vector>
#include <locale>
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;

//структура работников struct workers { char fullname[100]; char job[100]; int age; int hours; double perhour; double salary; };

//ввод данных void add_worker(vector<workers> &all_workers) { workers new_worker; cout << "Введите имя сотрудника: "; cin >> new_worker.fullname; cout << "Введите возраст сотрудника: "; cin >> new_worker.age; cout << "Введите должность сотрудника: "; cin >> new_worker.job; cout << "Введите почасовую оплату сотрудника: "; cin >> new_worker.perhour; cout << "Введите кол-во рабочих часов сотрудника: "; cin >> new_worker.hours;

all_workers.push_back(new_worker);
cout &lt;&lt; &quot;Сотруднику &quot; &lt;&lt; new_worker.fullname &lt;&lt; &quot; присвоен индекс &quot; &lt;&lt; all_workers.size() - 1 &lt;&lt; endl &lt;&lt; endl &lt;&lt; endl;

}

//вывод данных void print_info(vector<workers> all_workers, int index) { // по какому критерию будет в контейнере искаться работник? cout << "Имя: " << all_workers[index].fullname << endl; cout << "Возраст: " << all_workers[index].age << endl; cout << "Должность: " << all_workers[index].job << endl; cout << "Оплата: " << all_workers[index].perhour << endl; cout << "Часы: " << all_workers[index].hours << endl << endl << endl;

}

//удаление void delinf(workers& worker) { }

//меню void menu(vector<workers> &all_workers) { int input = 100; while (input != 9) { cout << "1 - Зарегистрировать работника" << endl << "2 - Получить информацию о работнике" << endl << "3 - Редактировать информацию о работнике" << endl << "4 - Очистить информацию о работнике" << endl << "5 - Сохранить информацию в файл" << endl << "6 - Загрузить информацию из файла" << endl << "7 - Список всех работников" << endl << "8 - Сортировка" << endl << "9 - Выход" << endl; cout << "Выберите действие: "; cin >> input; cout << endl;

    switch (input) {
    case(1):
        add_worker(all_workers); 
        break;
    case(2): {
        cout &lt;&lt; &quot;Введите индекс&quot; &lt;&lt; endl;
        int index;
        cin &gt;&gt; index;
        print_info(all_workers, index);
        break;
    }
    case(3):
        ; break;
    case(4):

    case(5):; break;
    case(6):; break;
    case(7):; break;
    case(8):; break;
    case(9):; break;
    }
}

}

//программа int main() { setlocale(LC_ALL, "RU");

vector&lt;workers&gt; all_workers;
menu(all_workers);




return 0;

}

Избавьтесь от goto и вызывайте необходимые функции, обращаясь к ним. Создайте массив объектов и складывайте в него каждый добавленный объект. Используйте циклы для того, чтобы возвращаться к меню.

  • Обращаю Ваше внимание на то, что мои изменения заставили Ваш код работать, но не исправили всех недочетов. – Не профессионалы мы Oct 15 '23 at 08:24
  • Мне нужно работать с массивом, поэтому использую индексацию и указатели – Dzen Oct 15 '23 at 09:03
  • Очень трудно разобраться в Вашем коде. Вижу, что создаёте статический массив на 10 элементов в main но никуда не передаете этот массив. Более того, подумайте, что произойдет, если сотрудников будет 11. Вам подойдет динамический контейнер. Можно использовать динамический массив, но проще использовать vector. В main создаёте вектор сотрудников. В цикле вызывайте меню, передав в меню вектор пока пользователь не введет 9. В меню работайте с вектором, создавая новых работников или удаляя их из контейнера. – Не профессионалы мы Oct 15 '23 at 09:23
  • Я еще изменил код. Изучите все моменты, многое станет понятнее – Не профессионалы мы Oct 15 '23 at 09:51