Форум программистов, компьютерный форум CyberForum.ru

Возрат массива из функции - C++

Восстановить пароль Регистрация
 
InSpectr
 Аватар для InSpectr
10 / 10 / 1
Регистрация: 09.09.2013
Сообщений: 53
05.10.2013, 23:01     Возрат массива из функции #1
Добрый вечер. Подскажите пожалуйста как вернуть массив
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
#include "stdafx.h"
#include <iostream>
#include <string>
#include <cstdlib>
#include <Windows.h>
using namespace std;
 
 
class NOTEC
{
    public:
        NOTEC()
        {
            NAME="Perev Dima";
            TELE=8919799;
            BDAY[1]=7;
            BDAY[2]=1;
            BDAY[3]=19;
        }
        NOTEC(string a, long long int b, int c[])
        {
             set_nam(a);
             set_tel(b);
             set_bda(c);
        }
        void set_nam(string a)
        {
            NAME=a;
        }
 
        void set_tel(long long int b)
        {
            TELE=b;
        }
 
        void set_bda(int c[])
        {
            for( int i=0;i<3;i++)
                BDAY[i]=c[i];
        }
        string get_nam()
        {
            return NAME;
        }
        long long int get_tel()
        {
            return TELE;
        }
 
        int get_bday()
        {   
            //как здесь вернуть массив?
            return BDAY;
        }
 
 
 
 
    private:
        string NAME;
        long long int TELE;
        int BDAY[3];
 
};
 
 
 
 
 
int main()
{
    string a;
    long long int b;
    int c[3];
    
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout<<"Сколько сотрудников: ";
    NOTEC *BLOCKNOTE= new NOTEC [2];
 
    
    cout<<"Введите Имя, Телефон, Дату рождения\n";
    for(int i=0;i<2;i++)
    { 
        getline(cin, a);
        cin >>b;
        for(int q=0;q<3;q++)
            cin>>c[q];
        BLOCKNOTE[i].set_nam(a);
        BLOCKNOTE[i].set_tel(b);
        BLOCKNOTE[i].set_bda(c);
 
        cin.get(); 
    }
    for(int j=0;j<2;j++)
    {
        cout<<BLOCKNOTE[j].get_nam()<<" "<<BLOCKNOTE[j].get_tel()<<" ";
    // а тут его вывести?
    }
    
 
    return 0;
}
как вот тут вернуть(в конце класса)
C++
1
2
3
4
5
int get_bday()
        {   
            
            return BDAY;
        }
а тут его вывести
C++
1
2
3
4
5
for(int j=0;j<2;j++)
    {
        cout<<BLOCKNOTE[j].get_nam()<<" "<<BLOCKNOTE[j].get_tel()<<" ";
            //тут
    }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6230 / 2959 / 287
Регистрация: 04.12.2011
Сообщений: 7,899
Записей в блоге: 3
05.10.2013, 23:17     Возрат массива из функции #2
InSpectr, если BDAY объявлен в private секции, то возвращать его Вы не собирались?
Нужно сразу решить надо оно или нет. Присвоить его Вы можете но для возврата можно перегрузить оператор [] или написать функцию (public) int get(int ind), где предусмотреть проверку границ индексации, правильности значений и тп.
Вернуть массив из свободной функции можно по-разному. В Вашем случае например, создается динамический массив и значит нужно вернуть указатель и размер. Размер можно по ссылке вернуть. То есть в число параметров должно войти что-то вроде int &arr_size, а указатель может быть как параметром так и возвращаемым значением.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.10.2013, 23:25     Возрат массива из функции #3
не выпендривайся, а создай структуру и туда лепи твои данные. зачем городить массив, если там всегда три элемента? чтоб потом думать, а что же я там имел ввиду?

Добавлено через 1 минуту
да, в конструкторе вызывать сэттеры - перебор.
InSpectr
 Аватар для InSpectr
10 / 10 / 1
Регистрация: 09.09.2013
Сообщений: 53
05.10.2013, 23:28  [ТС]     Возрат массива из функции #4
задание сделать класс...
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6230 / 2959 / 287
Регистрация: 04.12.2011
Сообщений: 7,899
Записей в блоге: 3
05.10.2013, 23:28     Возрат массива из функции #5
Цитата Сообщение от novi4ok Посмотреть сообщение
не выпендривайся, а создай структуру и туда лепи твои данные. зачем городить массив, если там всегда три элемента? чтоб потом думать, а что же я там имел ввиду?
Можно. Но доступ же нужен. А конструктор имеет доступ и без сеттеров если инициализацию иметь ввиду.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.10.2013, 01:27     Возрат массива из функции #6
Цитата Сообщение от InSpectr Посмотреть сообщение
задание сделать класс...
это понятно. класс ты сделал, и как он "наружу выглядит" - нормально (почти). а как он внутри устроен - не годится. чем ближе твой дизайн к реально отображаемым вещам, тем проще и твой класс строить, и с ним работать. я так понял, ты хочешь использовать этот массив, чтобы хранить день рождения, или я недопонял?

Добавлено через 52 секунды
Цитата Сообщение от IGPIGP Посмотреть сообщение
Можно. Но доступ же нужен. А конструктор имеет доступ и без сеттеров если инициализацию иметь ввиду.
ничччьо не понял, звиняй

Добавлено через 10 минут
попробуй так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class NOTEC {
  public:
 
    typedef struct llist_tag {
      unsigned char _00_day;
      unsigned char _01_mon;
      unsigned short _02_year;
    } Bday;
    NOTEC();
    Bday getBday ();
...
  private:
    Bday m_Bday;
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6230 / 2959 / 287
Регистрация: 04.12.2011
Сообщений: 7,899
Записей в блоге: 3
06.10.2013, 02:18     Возрат массива из функции #7
Цитата Сообщение от InSpectr Посмотреть сообщение
int get_bday() { //как здесь вернуть массив? return BDAY; }
Ну раз уж так... Напишите:
C++
1
2
3
void show_bday() {
cout << "Day : " <<  BDAY[0] << "Month : " << BDAY[1] << "Year : " <<  BDAY[2] << endl;
}
InSpectr
 Аватар для InSpectr
10 / 10 / 1
Регистрация: 09.09.2013
Сообщений: 53
06.10.2013, 12:25  [ТС]     Возрат массива из функции #8
Да массив для хранения дня рождения.
Спасибо всем, сейчас буду думать.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6230 / 2959 / 287
Регистрация: 04.12.2011
Сообщений: 7,899
Записей в блоге: 3
07.10.2013, 00:25     Возрат массива из функции #9
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
#include <iostream>
#include <string>
#include <cstdlib>
#include <Windows.h>
using namespace std;
 
class NOTEC
{
    public:
        NOTEC()
        {
            NAME="";
            TELE=-1;
            BDAY[0]=-1;
            BDAY[1]=-1;
            BDAY[2]=-1;
        }
        NOTEC(string a, long long int b, int c[])
        {
            NAME=a;
            TELE=b;
            BDAY[1]=c[0];
            BDAY[2]=c[1];
            BDAY[3]=c[2];
        }
        NOTEC(const NOTEC &orig)
        {
            if(this != &orig){
            NAME=orig.NAME;
            TELE=orig.TELE;
            BDAY[0]=orig.BDAY[0];
            BDAY[1]=orig.BDAY[1];
            BDAY[2]=orig.BDAY[2];
            }
        }
 
        void err_assert(string err) const {//можно решить и выбрасывать исключения но пока так...
cout << err<<"\n";
system("pause"); 
exit(1);
        }
 
        int operator[](int ind) const {
            if(ind > -1 && ind < 3)
            return BDAY[ind];
            else
err_assert("Аварийное завершение в  int operator[](int )\n выход за границы массива");
        }
 
        void set_nam(string a)
        {
            if(!a.empty())  NAME=a;
            else
err_assert("Аварийное завершение в  void set_nam(string )\n имя не может быть пустой строкой");
        }
 
        void set_tel(long long int b)
        {
           if(b>0) TELE=b;
           else{
err_assert("Аварийное завершение в  void set_tel(string )\n номер телефоне не может быть <0 ");
           }
        }
 
        void set_BDAY(int c[])
        {//хотя тут попробуем симитировать защищённый ввод иначе не было смысла
            //объявлять BDAY private
            //проверку на попытку ввести 29 февраля в не высокосный год и пр. 
            //оставляю Вам
            // я только сделаю примитивный шаблон
if(c[2]>0)BDAY[2]=c[2];//год сначала потому, что потом проверяете дату (по году)
else{
err_assert("Аварийное завершение в set_BDAY(int c[])\n год не может быть таким ");
           }    
if(c[1]>0 && c[1] < 13)BDAY[1]=c[1];//это где угодно можно, но пусть уж всё наоборот
else{
err_assert("Аварийное завершение в set_BDAY(int c[])\n месяц не может быть таким ");
           }
            if(c[0]>0 && c[0] < 31/*хоть так*/)BDAY[0]=c[0];//тут условие и логику можно усложнить с учетом сказанного)
else{
err_assert("Аварийное завершение в set_BDAY(int c[])\n день не может быть таким ");
           }      
        }
        string get_nam()
        {
            return NAME;
        }
        long long int get_tel()
        {
            return TELE;
        } 
 
    private:
        string NAME;
        long long int TELE;
        int BDAY[3];
 
};
 
int main()
{
    string a;
    long long int b;
    int c[3];
    
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int numb;
    cout<<"Сколько сотрудников: ";
    cin >> numb;
    NOTEC *BLOCKNOTE= new NOTEC [numb]; 
  
    cout<<"Введите Имя, Телефон, Дату рождения\n";
    for(int i=0;i<numb;i++)
    { 
        cout << "Имя : ";
        cin >> a;
        cout << endl;
        BLOCKNOTE[i].set_nam(a);
        
        cout << "Телефон : ";
        cin >>b;
        BLOCKNOTE[i].set_tel(b);
        cout << endl;
 
        cout << "Год рождения : ";
        cin >>c[2];
        cout << endl;
 
        cout << "Месяц года : ";
        cin >>c[1];
        cout << endl;
 
        cout << "День месяца : ";
        cin >>c[0];
        cout << endl;
 
        BLOCKNOTE[i].set_BDAY(c);
         
    }
    cout << "Введены такие люди:" << endl;
    cout << "Имя\tТелефон\tдень\tмесяц\tгод" << endl;
    for(int j=0;j<numb;j++)
    {
cout<<BLOCKNOTE[j].get_nam()<<"\t"<<BLOCKNOTE[j].get_tel()<<"\t"<<BLOCKNOTE[j][0]<<"\t"<<BLOCKNOTE[j][1]<<"\t"<<BLOCKNOTE[j][2]<<endl;
    // а тут его вывести?
    }
system("pause"); 
    return 0;
    }
До ума доведите сами.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2013, 00:33     Возрат массива из функции
Еще ссылки по теме:

C++ вывод массива из функции
C++ Возврат массива из функции
Вывод массива из функции C++
C++ Как реализовать передачу массива в функцию и возвращение массива из функции?
C++ Реализовать функции, позволяющие добавлять/удалять блок элементов в массива/из массива

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

Или воспользуйтесь поиском по форуму:
XRuZzz
Антикодер
603 / 504 / 25
Регистрация: 15.09.2012
Сообщений: 2,450
07.10.2013, 00:33     Возрат массива из функции #10
Страуструп поэтому и рекомендует использовать vector вместо массивов(всмысле потому, что с ними можно удобнее работать, в том числе и возвращать вектор из метода)
Yandex
Объявления
07.10.2013, 00:33     Возрат массива из функции
Ответ Создать тему
Опции темы

Текущее время: 21:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru