Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 28.02.2018
Сообщений: 24

Перенос данных из одного массива структур в другой

14.01.2020, 18:21. Показов 5395. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, крайне начинающий в с++, запутался вот с какой проблемой.Есть код, добавляющий в массив работников и высчитывающий их зарплату. Все работники с зарплатой от 100 до 500 должны добавляться в новый массив и показываться отдельно. Находил как можно просто перенести элементы массива с одного в другой, используя конструкции типа a[]=b[], однако не совсем понимаю как это правильно прописывать для массива структур. Код при компиляции ругается на этот кусок естественно, ошибки скорее всего фундаментальные и глупые.
Так же вторая задача - взять всех работников с параметром hours>50 и rate<5, и отсортировать по rate. Как начинающий решил взять метод пузырька, однако опять же запутался как работать им с массивом структур. Пока в коде оставил стандартный пример алгоритма.Но не совсем понимаю, нужно ли в моем случае объявлять размер массива итд - первый опыт с подобным. Если кто подскажет заодно как он должен выглядеть при работе со структурой - буду премного благодарен. Всем заранее спасибо.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>
#include <cstdlib>
using namespace std;
 
struct worker {
    string name;
    double rate;
    int hours;
    double salary;
};
double calc_salary(int h, double r){
    return (h>40)?h*r*1.5:h*r;
}
void menu();
int add();
int sort_sal();
int sort_rate();\
int *arr; // указатель для выделения памяти под массив
int size; // размер массива
/*главное меню*/
void menu ()
{struct worker arr[5];
int choose;
do{
do{
 
cout << "Choose:\n" << endl;
cout << "1. Standart order" << endl;
cout << "2. Salary between 100 and 500" << endl;
cout << "3. Hours>50 and rate<5" << endl;
cout << "Choose 1 to 3:" << endl;
cin>>choose;
} while (choose<1||choose>3);
switch (choose)
 {
        case 1:
            cout << "Add/display" << endl;
            add(); system("pause");
            break;
        case 2:
            cout << "Show only salary between 100 and 500" << endl;
            sort_sal();
            break;
        case 3:         
            cout << "Hours>50 and rate<5" << endl;
            sort_rate(); system("pause");
            break;
        
        default:
            cerr << "Error" << endl;
            exit(EXIT_FAILURE);
    }} 
    while (choose=!3);
   
    }
 
 
 
/*добавление данных в массив*/
void create_arr(worker arr[])
{ cin.get();
    for (int i=0;i<5;i++)
    {   
        cout<<endl<<"Input name: ";
        getline(cin,arr[i].name);
        cout<<endl<<"Input rate: ";
        cin>>arr[i].rate;
        cout<<endl<<"Input hours: ";
        cin>>arr[i].hours;
        arr[i].salary=calc_salary(arr[i].hours,arr[i].rate);
        cin.ignore(1000,'\n');
    }
}
/*простой показ данных*/
void display (worker arr[])
{
    for (int i=0;i<5;i++)
    {cout<<endl<<"Name: "<<arr[i].name;
    cout<<endl<<"Rate: "<<arr[i].rate;
    cout<<endl<<"Hours: "<<arr[i].hours;
    cout<<endl<<"Salary: "<<arr[i].salary<<endl;
    }
}
/*1 пункт меню*/
int add(){
    worker arr[5];
    create_arr(arr);display(arr);
    return 0;
}
/*перенос всех элементов с salary от 100 до 500 в новый массив*/
int sort_sal(){
worker arr[5];
for (int i=0;i<5;i++)
    create_arr(arr);
    if (arr[i].salary>100 && arr[i].salary<500) {
    worker arr[]=worker arr2[];
    }   
}
/*показ нового массива*/
void display2 (worker arr2[])
{
    for (int i=0;i<5;i++)   
    {cout<<endl<<"Name: "<<arr[i].name;
    cout<<endl<<"Rate: "<<arr[i].rate;
    cout<<endl<<"Hours: "<<arr[i].hours;
    cout<<endl<<"Salary: "<<arr[i].salary<<endl;
    }
}
/*показ эелементов массива с hours>50 и rate <5, сортированных по rate*/
void display3 (worker arr[])
{ int temp;
for (int i=0;i<5;i++)
if (arr[i].hours>50 && arr[i].rate<5) {
 
    // Сортировка массива пузырьком
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // меняем элементы местами
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
 
    // Вывод отсортированного массива на экран
    for (int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;   
cout<<endl<<"Name: "<<arr[i].name;
    cout<<endl<<"Rate: "<<arr[i].rate;
    cout<<endl<<"Hours: "<<arr[i].hours;
    cout<<endl<<"Salary: "<<arr[i].salary<<endl;    
}   
}
 
int sort_rate (worker arr[])
{
worker arr[5];
    create_arr(arr);display3(arr);
    return 0;   
}
 
 
int main()
{
    menu();
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.01.2020, 18:21
Ответы с готовыми решениями:

Копирование одного динамического массива структур в другой
есть структура struct Katalog{ int num_tov; int date; }; создаю динамический массив структур Katalog *K = new...

Перенос данных с одного ListBox в другой
создать программку которая переносит с одного listbox где написаны фамилии и оценки при нажатии на кнопку переходят в другой listbox но...

Перенос данных из одного DbGrid-а в другой
Всем добрый)))) Народ на форме имеются все компоненты по подсоединению с БД и ее отображении... Как сделать так, чтобы при клике по...

13
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
14.01.2020, 18:34
По коду, лучше прототипы объявлять вначале, а реализацию после функции main()
(к структуре это тоже относится)

С табуляцией худо

Цитата Сообщение от Nyorn Посмотреть сообщение
int *arr; // указатель для выделения памяти под массив
Он то объявлен, но память для него не выделенна
C++
1
arr = new int[size]; // вот так нужно
статическое объявляйте гдет подальше от функций (сливаются)
В идеале вообще на хедеры разбить

Добавлено через 2 минуты
Использовать статические переменные нужно только в крайних случаях

(в других передавать их как аргумент функции)

Добавлено через 1 минуту
arr[] = arr2[]

нету такого
определяйте оператор '=' сами

Добавлено через 54 секунды
И вот вопрос, почему вы не исправляете ошибки, по мере их поступления?

Сейчас же трудно будет всё исправить

Добавлено через 1 минуту
Тут помимо ошибок компиляции ещё и логических куча, я не знаю как в некоторых случаях должен был вести себя код, надеюсь кто то сообразительнее сможет помочь
1
43 / 39 / 5
Регистрация: 16.09.2019
Сообщений: 285
14.01.2020, 18:46
Ну... по порядку:
Цитата Сообщение от Nyorn Посмотреть сообщение
используя конструкции типа a[]=b[]
в твоем случае точно так же, ведь у тебя нет в структуре указателей (массивов), в этом случае необходимо было бы копировать участок памяти (по указателям)
но не забывай индексировать элементы массива
Цитата Сообщение от Nyorn Посмотреть сообщение
worker arr[]=worker arr2[];
C++
1
arr2[i]=arr[i]
Но у тебя в результате будут пустые элементы, так как не все будут скопированы, а некоторые пропущены.
Цитата Сообщение от Nyorn Посмотреть сообщение
/*перенос всех элементов с salary от 100 до 500 в новый массив*/
int sort_sal(){
worker arr[5]; - объявленный массив тут бесполезен в дальнейшем, он не виден за пределы функции - надо либо глобальным его объявить, либо передать в качестве параметра в функцию, массив из которого будешь копировать аналогично надо передавать аргументом
for (int i=0;i<5;i++)
    create_arr(arr); - какой в ней смысл?
    if (arr[i].salary>100 && arr[i].salary<500) {
    worker arr[]=worker arr2[]; - указание типов при действиях с переменными не требуется и порядок куда[i]=от_куда[i]
    }  
}
Разберешься - пиши дальше посмотрим
1
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
14.01.2020, 19:10
Цитата Сообщение от БедолагаЖека Посмотреть сообщение
надо либо глобальным его объявить
лучше не надо
0
43 / 39 / 5
Регистрация: 16.09.2019
Сообщений: 285
14.01.2020, 19:25
Цитата Сообщение от AndryS1 Посмотреть сообщение
лучше не надо
Никто ж не спорит.... в процессе обучения бывает такое, что народ, для упрощения понимания, так поступает, что бы сразу не порвало голову информацией
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
14.01.2020, 19:33
Цитата Сообщение от БедолагаЖека Посмотреть сообщение
Никто ж не спорит.... в процессе обучения бывает такое, что народ, для упрощения понимания, так поступает, что бы сразу не порвало голову информацией
Главное чтобы это в привычку не вошло, а для понимания сложно так же как и goto
0
43 / 39 / 5
Регистрация: 16.09.2019
Сообщений: 285
14.01.2020, 20:02
Цитата Сообщение от AndryS1 Посмотреть сообщение
Главное чтобы это в привычку не вошло
Где-то с месяц-другой тому назад, эти же слова по такому же поводу были написаны мною....кому-тА....
ТС слишком нагородил, что бы его распутать можно было по-правильному...
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.01.2020, 21:42
Цитата Сообщение от Nyorn Посмотреть сообщение
void create_arr(worker arr[])
C++
1
2
{ cin.get();
 for (int i=0;i<5;i++)
Nyorn, указатель вы передали, а размер зашили наглухо литеральной константой 5.
Учите пошагово. не нужно писать кучи кода, который не станет шагом к пониманию.
1
0 / 0 / 0
Регистрация: 28.02.2018
Сообщений: 24
14.01.2020, 22:26  [ТС]
Решил немного переделать код, убавить ошибок и вырезать совсем нерабочие куски. Не уверен, что смог верно разместить прототипы и прочее - голова действительно пухнет от информации и все еще путаюсь в терминологии)
Цитата Сообщение от AndryS1 Посмотреть сообщение
И вот вопрос, почему вы не исправляете ошибки, по мере их поступления?
На моменте меню и первого пункта (ввод/вывод) все работало. Далее попробовал написать кусок с копированием массива - получил ошибку. Вырезал - попробовал написать сортировку - не вышло. Как итог - соединил все куски в одно и выложил сюда, потому такое огромное количество ошибок.

Цитата Сообщение от БедолагаЖека Посмотреть сообщение
create_arr(arr); - какой в ней смысл?
чтобы функция ввода сработала, после этого нужные данные скопировались в другой массив и отображался уже он. Ну это по моим представлениям должно было так быть, как правильно - не знаю

Цитата Сообщение от IGPIGP Посмотреть сообщение
Nyorn, указатель вы передали, а размер зашили наглухо литеральной константой 5.
Условия задачи таковы, что массив расчитан на ввод 5 элементов.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Учите пошагово. не нужно писать кучи кода, который не станет шагом к пониманию.
К сожалению осознание подобного приходит как раз в момент, когда закопался по самое немогу, и переучивать по шагам придется после выполнения текущей задачи



В целом сейчас код запускается (кусок с сортировкой пока вырезал), однако не смог добиться работоспособности ввода данных во втором пункте. Как раз момент
C++
1
create_arr(arr);
не понимаю. По моей задумке должна вызываться функция ввода данных, как в первом пункте меню, затем фильтрация по зп 100-500, и передача их во второй массив. Однако получаю без ввода просто массив с нулями. Что я сделал не так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>
#include <cstdlib>
using namespace std;
 
 
void menu();
struct worker {
    string name;
    double rate;
    int hours;
    double salary;
};
double calc_salary(int h, double r){
    return (h>40)?h*r*1.5:h*r;
}
 
 
 
int add();
int sort_sal();
int sort_rate();
 
 
const int size = 5; // размер массива
int size2 = 0; //новый размер массива
worker arr[size];
worker arr2[size];
 
 
 
int main()
{
    menu();
    return 0;
}
 
 
/*главное меню*/
void menu ()
{struct worker arr[5];
int choose;
do{
do{
 
cout << "Choose:\n" << endl;
cout << "1. Standart order" << endl;
cout << "2. Salary between 100 and 500" << endl;
cout << "3. Hours>50 and rate<5" << endl;
cout << "Choose 1 to 3:" << endl;
cin>>choose;
} while (choose<1||choose>3);
switch (choose)
 {
        case 1:
            cout << "Add/display" << endl;
            add(); system("pause");
            break;
        case 2:
            cout << "Show only salary between 100 and 500" << endl;
            sort_sal(); system("pause");
            break;
        case 3:         
            cout << "Hours>50 and rate<5" << endl;
            system("pause");
            break;
        
        default:
            cerr << "Error" << endl;
            exit(EXIT_FAILURE);
    }} 
    while (choose=!3);
   
    }
 
 
 
/*добавление данных в массив*/
void create_arr(worker arr[])
{cin.get();
    for (int i=0;i<5;i++)
    {
        cout<<endl<<"Input name: ";
        getline(cin,arr[i].name);
        cout<<endl<<"Input rate: ";
        cin>>arr[i].rate;
        cout<<endl<<"Input hours: ";
        cin>>arr[i].hours;
        arr[i].salary=calc_salary(arr[i].hours,arr[i].rate);
        cin.ignore(1000,'\n');
    }
}
 
 
/*простой показ данных*/
void display (worker arr[])
{
    for (int i=0;i<5;i++)
    {cout<<endl<<"Name: "<<arr[i].name;
    cout<<endl<<"Rate: "<<arr[i].rate;
    cout<<endl<<"Hours: "<<arr[i].hours;
    cout<<endl<<"Salary: "<<arr[i].salary<<endl;
    }
}
 
/*1 пункт меню*/
int add(){
    worker arr[5];
    create_arr(arr);display(arr);
    return 0;
}
 
 
/*перенос всех элементов с salary от 100 до 500 в новый массив*/
int sort_sal(worker arr[size],worker arr2[size]){
create_arr(arr);
for (int i=0;i<5;i++)
    
    if (arr[i].salary>100 && arr[i].salary<500) {
    arr2[i]=arr[i];
    arr2[size2]=arr[i];
    size2 +=1; 
    
    }   
}
 
/*показ данных зп 100-500*/
void display2 (worker arr2[])
{
    for (int i=0;i<5;i++)
    {cout<<endl<<"Name: "<<arr[i].name;
    cout<<endl<<"Rate: "<<arr[i].rate;
    cout<<endl<<"Hours: "<<arr[i].hours;
    cout<<endl<<"Salary: "<<arr[i].salary<<endl;
    }
}
 
/*2 пункт меню*/
int sort_sal(){
worker arr2[size2];
display2(arr2);
return 0;   
}
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
14.01.2020, 22:35
Nyorn, вот от души, ну реально, просто послушай, может лучше переписать код без всех статических переменных?)
0
0 / 0 / 0
Регистрация: 28.02.2018
Сообщений: 24
14.01.2020, 23:01  [ТС]
Цитата Сообщение от AndryS1 Посмотреть сообщение
Nyorn, вот от души, ну реально, просто послушай, может лучше переписать код без всех статических переменных?)
Стыдно признаться, но я не понял какие из переменных тут статические) Краткий поиск в гугле показал мне по такому запросу переменные, которые будут болтаться в памяти но не использоваться, однако они должны быть вроде как с директивой static, и могут использоваться только внутри одного документа. Без такой директивы не совсем понимаю, каких из них статические. А так я бы с радостью переписал на более грамотный вариант)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.01.2020, 23:02
Цитата Сообщение от Nyorn Посмотреть сообщение
Условия задачи таковы, что массив расчитан на ввод 5 элементов.
А завтра нужно будет 25 и что? Я не сторонник абсолютного перфекционизма, пуризма и пр., но в основном, нужно писать то, что осознаваемо. Для копирования из массива в массив, нужно создать массив назначения (используя размер источника) и оператором присваивания поприсваивать. Нужны также конструкторы копирования и по умолчанию если данные не тривиальны, но нужно исходить из правила нуля или трёх/пяти.
Самое главное не это. Главное - делать осознанные подзадачи так чтобы был толк. И вопросы легче решать. Небольшая задача легко анализируется и описывается. Впрочем, - ваше дело.
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
14.01.2020, 23:05
Цитата Сообщение от Nyorn Посмотреть сообщение
Стыдно признаться, но я не понял какие из переменных тут статические)
Всё что ты используешь вне функций, классов и т.п. - по умолчанию static

Добавлено через 47 секунд
А бесит то что у тебя изменить одну и ту же переменную можно одновременно в кучи местах
0
43 / 39 / 5
Регистрация: 16.09.2019
Сообщений: 285
14.01.2020, 23:29
Цитата Сообщение от AndryS1 Посмотреть сообщение
по умолчанию static
глобал? статик, это чуть иначе, вроде....чуть-чуть...
Цитата Сообщение от AndryS1 Посмотреть сообщение
А бесит
- в мейне только вызов одной функции
- ввод массива для каждого варианта
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.01.2020, 23:29
Помогаю со студенческими работами здесь

Перенос данных из одного листа на другой
Всем доброго времени суток, господа Проблема вот в чём: есть рабочая книга, в ней два листа. На одном листе указана информация о каждом...

Перенос данных из одного листа на другой
У меня в excel предположим, что в диапазоне A1:F2 данные, и мне нужно, что бы эти данные были на следующем листе столбцом в ячейке A1:A10....

Перенос данных с одного листа на другой
Форум привет. Подскажите, как это загуглить или сделать. Дано: таблица с данными, пополняется вручную Требуется переносить эти данные...

Перенос данных из одного списка в другой
/*Поместить в список все числа кратные 5- это написал 4 последних числа, которые делятся на 3 поместить в новый список вставить в новом...

Перенос данных с одного листа на другой
Такая проблема, на одном листе записаны автомобили и их гос.номера. нужно, чтобы на другом листе, при вводе автомобиля, в соседней ячейке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru