58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 844
1

Динамически выделяемый массив структур пожертвований

19.07.2015, 17:24. Показов 978. Ответов 14
Метки нет (Все метки)

Почитал про динамические структуры и решил для закрепления решить задачу. Я должен ввести имена и суммы пожертвований (эта инф хранится в динамически выделяемом массиве структур) а потом просто это все вывести.
Но чувствую что очень лажанул и чего то не понял. Подскажите где я начинаю ошибаться.
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
#include<iostream>
using namespace std;
struct spip 
{
    char name[20];
    double sum;
};
 
int main()
{
    int patrons;
    cout<<"Enter the number of patrons: ";
    cin>>patrons;
    spip* ps = new spip[patrons];
    cout<<"Enter name and sum of donation \n";
    int i=1;
    while (i<=patrons)
    {
        cin.ignore();
        cout<<"Name: ";
        cin.get(ps->name,20);
        cin.get();
        cout<<"Sum: ";
        cin>>ps->sum;
        ps = ps + 1; // чтобы не стереть предыдущую запись
        i++;
    }
    /*for ()
    {
        cout<<(ps->name,20)<<"\t";
        cout<<ps->sum<<"\n";
    } */
    delete [] ps;
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.07.2015, 17:24
Ответы с готовыми решениями:

Объем памяти, выделяемый под многомерный массив
Здравствуйте! Проблема в следующем: в процессе считывания из файла записываю необходимые мне...

Не получается динамически увеличить массив структур "Отрезок" "Прямоугольник"
Делая следующее задание наткунлся на проблему Определить структуры: отрезок (задан длиной) и...

Как динамически создать массив из динамически конструируемых экземпляров класса?
Есть два класса.Подразумевается ,что первый в конструкторе выделяет интовый массив длинной n,второй...

Составить массив структур состоящий из имени и цены,по введенному имени изменить цену,вывести обновленный массив структур
составить массив структур состоящий из имени и цены,по введенному имени изменить цену,вывести...

14
2753 / 1908 / 568
Регистрация: 05.06.2014
Сообщений: 5,559
19.07.2015, 17:54 2
Цикл меняет ps, поэтому delete [] ps; удаляет что-то не то.
0
2 / 2 / 1
Регистрация: 07.07.2015
Сообщений: 27
19.07.2015, 18:15 3
Вроде как получилось

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
#include<iostream>
using namespace std;
struct spip
{
    char name[20];
    double sum;
};
 
int main()
{
    int patrons;
    cout << "Enter the number of patrons: ";
    cin >> patrons;
    system("cls");
    spip* ps = new spip[patrons];
    cout << "Enter name and sum of donation \n";
    int i = 0;
    while (i < patrons)
    {
        cin.ignore();
        cout << "Name: ";
        cin.get((ps + i)->name, 20);
        cin.get();
        cout << "Sum: ";
        cin >> (ps + i)->sum;
        ++i;
        system("cls");
    }
    for (int j = 0; j < patrons; ++j)
    {
        cout << ps[j].name << "\t";
        cout << ps[j].sum << "\n\n";
    } 
    delete [] ps;
    system("pause");
    return 0;
}
1
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 844
19.07.2015, 18:30  [ТС] 4
IgRiK000 спасибо. Что то про +i забыл в итоге все стиралось)
Что то я вам спасибо поставить не могу. Нет этой вкладки xD
0
2 / 2 / 1
Регистрация: 07.07.2015
Сообщений: 27
19.07.2015, 18:31 5
Цитата Сообщение от Senarist Посмотреть сообщение
IgRiK000 спасибо. Что то про +i забыл в итоге все стиралось)
Да, правильно

Пожалуйста)
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 844
19.07.2015, 21:25  [ТС] 6
IgRiK000
Могу ли я как то в последнем и предпоследнем цикле, если условие ни разу не выполняется, то вывести none? Без создания нового цикла.
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
#include<iostream>
using namespace std;
int s = 0;
struct spip 
{
    char name[20];
    double sum;
};
 
int main()
{
    int patrons;
    cout<<"Enter the number of patrons: ";
    cin>>patrons;
    spip* ps = new spip[patrons];
    cout<<"Enter name and sum of donation \n";
    for (int i = 0; i<patrons; i++)
    {
        cin.ignore();
        cout<<"Name: ";
        cin.get((ps+i)->name,20);
        cout<<"Sum: ";
        cin>>(ps+i)->sum;
                
    }
    cout<<"Grand patrons: \n";
    for (int i = 0; i<patrons; i++)
    {
            if (((ps+i)->sum)>10000) 
        cout<<(ps+i)->name<<"\n";
                                    
    } 
    cout<<"\n\nPatrons: \n";
    for (int i = 0; i<patrons; i++)
    {
            if (((ps+i)->sum)<10000 )
        cout<<(ps+i)->name<<"\n";
            
        
    }
    delete [] ps;
    return 0;
}
0
2 / 2 / 1
Регистрация: 07.07.2015
Сообщений: 27
19.07.2015, 21:27 7
то есть если patrons = 0 или же в поля имя и сумма ничего пользователь не внес?
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 844
19.07.2015, 23:09  [ТС] 8
Т.е если он вносил за все время меньше 10 000 то Grand patrons должен 1 раз вывести none ну и так же для patrons.
но если допустим он хоть раз (из 10 раз) внес больше 10 000 то 9 раз none не нужно выводить

Добавлено через 1 час 37 минут
IgRiK000 вот так получается:

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
#include<iostream>
using namespace std;
int s = 0, k = 0;
struct spip 
{
    char name[20];
    double sum;
};
 
int main()
{
    int patrons;
    cout<<"Enter the number of patrons: ";
    cin>>patrons;
    spip* ps = new spip[patrons];
    cout<<"Enter name and sum of donation \n";
    for (int i = 0; i<patrons; i++)
    {
        cin.ignore();
        cout<<"Name: ";
        cin.get((ps+i)->name,20);
        cout<<"Sum: ";
        cin>>(ps+i)->sum;
        if ((ps+i)->sum > 10000)
            s=s+1;
        else
            k=k+1;
                
    }
    cout<<"Grand patrons: \n";
    if (s>0) {
    for (int i = 0; i<patrons; i++)
    {
            if (((ps+i)->sum)>10000) 
        cout<<(ps+i)->name<<"\n";
                                    
    } 
            }
    else
    cout<<"none";
    cout<<"\n\nPatrons: \n";
    if (u>0){
    for (int i = 0; i<patrons; i++)
    {
            if (((ps+i)->sum)<10000 )
        cout<<(ps+i)->name<<"\n";
            
        
    }
            }
    else
    cout<<"none";
    delete [] ps;
    return 0;
}
Этот код вообще читаем? Если посмотреть со стороны.
Напрягают эти конструкции (ps+i)->sum.Может их можно как то на что то другое поменять. Особенно в условиях не очень красиво смотрится.
0
2 / 2 / 1
Регистрация: 07.07.2015
Сообщений: 27
20.07.2015, 00:47 9
хм.... нет. так нельзя. По крайней мере я не могу ничего придумать.

Тут нужно прокрутить цикл сначала и сравнить если он не вносил денег больше чем на 10000 то вывести просто один раз None и все. ну и если вводил то тогда в следующем цикле выводить уже значения как в коде

Добавлено через 1 минуту
если тебе не нравится (ps+i)->name то можна заменить на ps[i]->name. Это одно и тоже и неважно как написано. что то и что то правильно, просто кто как привык так и пишет.

Добавлено через 16 минут
хотя..... вроду так вот можно)

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
#include <iostream>
#include <conio.h>
using namespace std;
struct spip
{
    char name[20];
    double sum;
};
 
int main()
{
    int patrons, counter = 0;
    cout << "Enter the number of patrons: ";
    cin >> patrons;
    spip* ps = new spip[patrons];
    cout << "Enter name and sum of donation \n";
    for (int i = 0; i<patrons; i++)
    {
        cin.ignore();
        cout << "Name: ";
        cin.get((ps + i)->name, 20);
        cout << "Sum: ";
        cin >> (ps + i)->sum;
 
    }
    cout << "Grand patrons: \n";
    for (int i = 0; i<patrons; i++)
    {
        if (((ps + i)->sum)>10000)
            cout << (ps + i)->name << "\n";
        else
            counter++;
 
    }
    if (counter == patrons)
        cout << "None";
    cout << "\n\nPatrons: \n";
    for (int i = 0; i<patrons; i++)
    {
        if (((ps + i)->sum)<10000)
            cout << (ps + i)->name << "\n";
 
 
    }
    delete[] ps;
    _getch();
    return 0;
}
Добавлено через 53 секунды
и зачем тебе глобальная переменная s = 0?????
ты ее нигде не используешь
0
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
20.07.2015, 07:24 10
Цитата Сообщение от IgRiK000 Посмотреть сообщение
cout << "Grand patrons: \n";
for (int i = 0; i<patrons; i++)
{
if (((ps + i)->sum)>10000)
cout << (ps + i)->name << "\n";
else
counter++;
}
if (counter == patrons)
cout << "None";
cout << "\n\nPatrons: \n";
for (int i = 0; i<patrons; i++)
{
if (((ps + i)->sum)<10000)
cout << (ps + i)->name << "\n";
}
Это не сработает, т.к. будет повторно печатать имена с суммами больше 10000 и имена с суммами меньше 10000.

Как по мне, принципиально неправильный подход к делу. Должно быть как-то так.
C++
1
2
3
4
5
6
7
8
struct spip{
long idUser; // идентификатор дарителя
long idTransaction; // идентификатор платежа
//date transactionDate; // можно определить дополнительную структуру и хранить дату
char name[20];
double sum;
bool isGreatePatron; // истина, если был большой взнос.
}
или вообще так
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct date{
    unsigned short day;
    unsigned short mon;
    unsigned short year;
    }
    
struct check{
    long id;
    date donDate;
    double sum;
    }
    
struct spip{
    long id;
    char name[20];
    check Check;
    bool isGreatePatron;
    }
Еще правильней вынести персону в отдельную структуру.

C++
1
2
3
4
5
struct person{
long id;
char name[20];
и т.д. (адрес, телефон)
}
тогда
C++
1
2
3
4
5
6
struct spip{
    long idPatronn;
    person patron;
    check donation;
    bool isGreatePatron;
    }


При вносе пожертвований вначале создать (или проверить) дарителя по id и фамилии, при этом можно сразу упорядочивать по id (сортировка вставками). Если упорядочить, то тогда можно перебирая по id и isGreatePatron напечатать то, что вам нужно. Также можно будет печатать любую другую информацию, например список транзакций и т.п. Т.е. вам нужно эмулировать работу БД.
И да, если вы допускаете, что один может внести пожертвование больше одного раза, то ваш подход тоже не сработает, так как вы выделяете память для хранения массива по спонсорам, а не по взносам. ИМХО, страдает логика организации программы и, скорее всего, изначально неправильный выбор структуры данных для решения этой конкретной задачи.
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 844
20.07.2015, 11:10  [ТС] 11
Вот условие:
Кликните здесь для просмотра всего текста
Постройте программу, которая отслеживает пожертвования в Общество
Защиты Влиятельных Лиц. Она должна запрашивать у пользователя количество
меценатов, а затем приглашать вводить их имена и суммы пожертвований от
каждого. Информация должна сохраняться в динамически выделяемом массиве
структур. Каждая структура должна иметь два члена: символьный массив для
хранения имени и переменную-член типа double - для хранения суммы
пожертвования. После чтения всех данных программа должна отображать
имена и суммы пожертвования тех, кто не пожалел 10000 и более.
Этот список должен быть озаглавлен меткой "Grand patrons". После этого
программа должна выдать список остальных пожертвований. Он должен быть
озаглавлен "Patrons". Если в одной из двух категорий не окажется никого,
программа должна напечатать "none". Помимо отображения двух категорий,
никакой другой сортировки делать не нужно.


Кликните здесь для просмотра всего текста
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
#include<iostream>
using namespace std;
struct spip 
{
    char name[20];
    double sum;
};
 
int main()
{
    int s = 0, k = 0;
    int patrons;
    cout<<"Enter the number of patrons: ";
    cin>>patrons;
    spip* ps = new spip[patrons];
    cout<<"Enter name and sum of donation \n";
    for (int i = 0; i<patrons; i++)
    {
        cin.ignore();
        cout<<"Name: ";
        cin.get((ps+i)->name,20);
        cout<<"Sum: ";
        cin>>(ps+i)->sum;
        if ((ps+i)->sum > 10000)
            s=s+1;
        else
            k=k+1;
                
    }
    cout<<"Grand patrons: \n";
    if (s>0) {
    for (int i = 0; i<patrons; i++)
    {
            if (((ps+i)->sum)>10000) 
        cout<<(ps+i)->name<<"\n";
                                    
    } 
            }
    else
    cout<<"none";
    cout<<"\n\nPatrons: \n";
    if (k>0){
    for (int i = 0; i<patrons; i++)
    {
            if (((ps+i)->sum)<10000 )
        cout<<(ps+i)->name<<"\n";
            
        
    }
            }
    else
    cout<<"none";
    delete [] ps;
    return 0;
}


Почему мой вариант не верный? s, k это переменные которые подсчитывают, сколько раз было больше 10тыс
А потом сразу условие проверяет было ли хоть раз больше 10 тыс если было то заходим в цикл и их выводим, если нет то сразу выводим 1 раз none, аналогично и для patrons.

vua72 по условию задачи в структуре должно быть 2 члена. Хотя да, я же условие не скидывал.
0
2 / 2 / 1
Регистрация: 07.07.2015
Сообщений: 27
20.07.2015, 17:29 12
Так в задаче же нету условия что нельзя выводить по несколько раз одно и тоже имя....

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

у вашей программе все работает, просто ресурсоемко получилось у вас. Использовать 2 переменные для реализации этой задачи... ну как по мне слишком много.

Добавлено через 1 час 30 минут
думаю тут легче всего было бы работать именно с ИД каждого клиента, так как мы знаем что имена людей имеют свойство совпадать. Тем более, как по мне, так было бы легче
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 844
20.07.2015, 17:54  [ТС] 13
Цитата Сообщение от IgRiK000 Посмотреть сообщение
просто ресурсоемко получилось у вас.
всего то 2 переменные. Может попроще потом сделаю. (хотя пока не очень понимаю как)
Цитата Сообщение от IgRiK000 Посмотреть сообщение
так как мы знаем что имена людей имеют свойство совпадать
Если имена совпадают то инициалы. Иначе Oleg 7000 и Oleg 34000 и гадай какой из Олегов вносил какую сумму)
0
2 / 2 / 1
Регистрация: 07.07.2015
Сообщений: 27
20.07.2015, 20:07 14
попробуйте сделать по ИД, надеюсь у вас нет ограничения что обязательно по имени нужно. По ИД все будет намного легче.
0
0 / 0 / 0
Регистрация: 04.02.2017
Сообщений: 1
21.09.2017, 08:54 15
Изучаю c++ только вторую неделю, поэтому хочу максимально понимать язык.Кто шарит, прочитайте задание и обратите внимание на возможность использования объекта string.
Кликните здесь для просмотра всего текста
Постройте программу, которая отслеживает пожертвования в Общество Защиты Влиятельных Лиц. Она должна запрашивать у пользователя
количество меценатов, а затем приглашать вводить их имена и суммы пожертвований от
каждого. Информация должна сохраняться в динамически выделяемом массиве
структур. Каждая структура должна иметь два члена: символьный массив (или
объект string) для хранения имени и переменную-член типа double — для
хранения суммы пожертвования. После чтения всех данных программа должна
отображать имена и суммы пожертвований тех, кто не пожалел $10 000 и
более. Этот список должен быть озаглавлен меткой "Grand Patrons". После этого
программа должна выдать список остальных жертвователей. Он должен быть
озаглавлен "Patrons". Если в одной из двух категорий не окажется никого,
программа должна напечатать "попе". Помимо отображения двух категорий,
никакой другой сортировки делать не нужно.

Если использовать объект string (естественно включив его #include <string>)
Компилятор начинает ругаться уже на 6 строке:
Ошибка C3646 name: неизвестный спецификатор переопределения
Собственно, что не так? С массивом char все четко получается.
Вот мой код с использованием массива.

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
#include <iostream>
 
struct MyStruct
{
    char name[20];
    double money;
};
using namespace std;
int main()
{
    int mec;
    int count = 0;
    cout << "Vedite kolichestvo mec: ";
    cin >> mec;
    cin.get();
    MyStruct *ps = new MyStruct[mec];
    for (int i = 0; i < mec; i++)
    {
        cout << i + 1 << " mec:\n" << "Name: ";
        cin.getline(ps[i].name,20);
        cout << "Money: ";
        cin >> ps[i].money;
        cin.get();
    }
    cout << "Grand Patrons:\n";
    for (int i = 0; i < mec; i++)
    {
        if (ps[i].money >= 10000)
        {
            ++count;
            cout << ps[i].name << "   " << ps[i].money << endl;
        }
    }
    if (count == 0)
        cout << "none\n";
    count = 0;
    cout << "Patrons:\n";
    for (int i = 0; i < mec; i++)
    {
        if (ps[i].money < 10000)
        {
            ++count;
            cout << ps[i].name << "   " << ps[i].money << endl;
        }
    }
    if (count == 0)
        cout << "none\n";
    delete [] ps;
    system("pause");
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2017, 08:54
Помогаю со студенческими работами здесь

Структуры.Обработка массивов структур.Создать массив структур из 10-ти элементов
Создать массив структур из 10-ти элементов: &lt;Номер договора&gt;&lt;Фамилия клиента&gt;&lt;стоимость...

Блочная сортировка структур (Отсортировать массив структур по фамилии)
Подскажите алгоритм блочной сортировки структур на языке С++. Мне нужно отсортировать массив...

Менеджер пожертвований
У меня сайт на Вордпрес. Вопрос по регистрации пользователей. Сайт с низкой посещаемостью 5-10 в...

Динамический массив структур в другом массиве структур
Можно ли реализовать динамический (или статический) массив структур в другом массиве структур?...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru