Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
5 / 5 / 3
Регистрация: 19.09.2010
Сообщений: 173
1

Массив в функции с переменным количеством параметров

21.12.2014, 13:53. Просмотров 2004. Ответов 7
Метки нет (Все метки)


Добрый день. Не могу разобраться, как в функции с переменным количеством параметров сделать указатель на элемент массива. Ниже код, на котором все пока что и повисло. Пробовал (*(p+1)+i), по аналогии с *(p+i) в обычных одномерных массивах в main(), но это было бы слишком просто... Помогите, пожалуйста.
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 "time.h"
using namespace std;
float fmax(float z,... /*float *a, float m*/)
{
    int i;
    float  *p = &z, max = -999;
    for (i = 0; i < *(p + 2); i++)
    {
        if (z == 1) { if (a[i] > max) max = (*(p + 1)+i); }
        //cout << (a + i) << '\n';
    }
    return max;
}
int main()
{
    setlocale(LC_CTYPE, "Rus");
    srand((unsigned)time(NULL));
    int i, dc, z, a[1000], dr[1000], cl[1000], p, cel, drob;
    float b[1000], all[2000];
    do
    {
        cout << "Количество чисел: ";
        cin >> dc;
        cel = 0; drob = 0;
        for (i = 0; i < dc; i++)
        {
            z = rand() % 2;
            cout << "Введите ";
            if (z == 0) { cout << "дробное число: "; cin >> b[i]; dr[i] = i; drob++; }
            if (z == 1) { cout << "целое число: "; cin >> a[i]; cl[i] = i; cel++; }
        }
        for (i = 0; i < dc; i++)
        {
            if (dr[i] == i) all[i] = b[i];
            if (cl[i] == i) all[i] = a[i];
            cout << all[i] << '\n';
        }   
        cout << "Найти максимальное из:\n1. Всех введенных чисел\n2. Целых чисел\n3. Дробных чисел\nВыбор: ";
        cin >> p;
        if (p == 1) cout << fmax(p, all, dc) << '\n';
        /*if (p == 2) cout << fmax(p, cl, cel) << '\n';
        if (p == 3) cout << fmax(p, dr, drob) << '\n';*/
        cout << "\nЕще раз? 1 - да: ";
        cin >> p;
    } while (p == 1);
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2014, 13:53
Ответы с готовыми решениями:

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

Функции с переменным количеством параметров в языке C ++
Реализовать функцию конкатенации (сцепления) произвольного количества C-строк с динамическим...

Шаблон функции с переменным количеством параметров и среднее арифметическое
Никак не могу придумать, как вычислить среднее арифметическое. Получилось найти сумму, а вот...

Функции с переменным количеством параметров, stdarg.h. Исправить код
Почему не работает? В итоге получается 0, а если в функции все что надо заменить с float на int, то...

7
6918 / 5983 / 2710
Регистрация: 14.04.2014
Сообщений: 25,504
21.12.2014, 14:44 2
Так попробуй
C++
1
float *p = *((float **)(&z + 1));
0
5 / 5 / 3
Регистрация: 19.09.2010
Сообщений: 173
21.12.2014, 15:48  [ТС] 3
nmcf, не совсем вышло. Тут такой вопрос, как можно в fmax r2 объявить через первую переменную? Пробовал
double *p = &r;
а потом объявлять r2 как *(p+2), но не выходит...

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
#include <iostream>
#include "time.h"
using namespace std;
double fmax(double r, double *r1, double r2)
{
    int i;
    double max = -999;
    double i1 = r2;
    cout << "p="<< i1 << '\n';
    system("pause");
    for (i = 0; i < i1; i++)
    {
        /*if (z == 1) {*/ if (r1[i] > max) max = r1[i]; /*}*/
        cout << r1[i] << '\n';
    }
    return max;
}
/*int*/void main()
{
    setlocale(LC_CTYPE, "Rus");
    srand((unsigned)time(NULL));
    /*int i,  z, a[1000], dr[1000], cl[1000], r, cel, drob;
    double dc, b[1000], all[2000];*/
    int i;
    double dc, b[1000], all[2000], z, a[1000], dr[1000], cl[1000], r, cel, drob;
    do
    {
        cout << "Количество чисел: ";
        cin >> dc;
        cel = 0; drob = 0;
        for (i = 0; i < dc; i++)
        {
            z = rand() % 2;
            cout << "Введите ";
            if (z == 0) { cout << "дробное число: "; cin >> b[i]; dr[i] = i; drob++; }
            if (z == 1) { cout << "целое число: "; cin >> a[i]; cl[i] = i; cel++; }
        }
        for (i = 0; i < dc; i++)
        {
            if (dr[i] == i) all[i] = b[i];
            if (cl[i] == i) all[i] = a[i];
            cout << all[i] << '\n';
        }   
        cout << "Найти максимальное из:\n1. Всех введенных чисел\n2. Целых чисел\n3. Дробных чисел\nВыбор: ";
        cin >> r;
        if (r == 1) cout <<"max="<< fmax(r, all, dc) << '\n' ;
        /*if (r == 2) cout << fmax(r, cl, cel) << '\n';
        if (r == 3) cout << fmax(r, dr, drob) << '\n';*/
        cout << "\nЕще раз? 1 - да: ";
        cin >> r;
    } while (r == 1);
    //return 0;
}
0
6918 / 5983 / 2710
Регистрация: 14.04.2014
Сообщений: 25,504
21.12.2014, 16:34 4
Как-то понятнее объясни задачу. Здесь вообще нет переменного числа параметров, да и в первом варианте не ясно, зачем они, если всегда передаётся три.
0
5 / 5 / 3
Регистрация: 19.09.2010
Сообщений: 173
21.12.2014, 16:39  [ТС] 5
Вот такое задание, может, так будет проще... Я уже три часа с этим вожусь, ну никак не выходит) Вечно что-то не так... Если отталкиваться от первой переменной, то не понимаю, как массив реализовать...

Программа должна содержать вызывающую функцию main и функцию с переменным числом параметров, к которой должно быть не менее трех обращений с различным количеством параметров. Написать функцию fmax с переменным числом параметров, которая находит минимальное из чисел типа int или из чисел типа double, тип параметров определяется с помощью первого параметра функции.

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

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
#include <iostream>
#include "time.h"
using namespace std;
double fmax(double r,...)
{
    int i;
    double max = -999;
    //double *p = &r;   
    //cout << "p="<< *p << '\n';
    system("pause");
    double *p = &r;
    double p1 = *(p + 1);
    for (i = 0; i < *(p + 2); i++)
    {
        /*if (z == 1) {*/ if (*(p + i) > max) max = p1[i]/**(p + i)*/; /*}*/
        cout << *(p + i) << '\n';
    }
    return max;
}
int main()
{
    setlocale(LC_CTYPE, "Rus");
    srand((unsigned)time(NULL));
    int i;
    double dc, b[1000], all[2000], z, a[1000], dr[1000], cl[1000], r, cel, drob;
    do
    {
        cout << "Количество чисел: ";
        cin >> dc;
        cel = 0; drob = 0;
        for (i = 0; i < dc; i++)
        {
            z = rand() % 2;
            cout << "Введите ";
            if (z == 0) { cout << "дробное число: "; cin >> b[i]; dr[i] = i; drob++; }
            if (z == 1) { cout << "целое число: "; cin >> a[i]; cl[i] = i; cel++; }
        }
        for (i = 0; i < dc; i++)
        {
            if (dr[i] == i) all[i] = b[i];
            if (cl[i] == i) all[i] = a[i];
            //cout << all[i] << '\n';
        }   
        cout << "Найти максимальное из:\n1. Всех введенных чисел\n2. Целых чисел\n3. Дробных чисел\nВыбор: ";
        cin >> r;
        if (r == 1) cout <<"max="<< fmax(r, all, dc) << '\n' ;
        /*if (r == 2) cout << fmax(r, cl, cel) << '\n';
        if (r == 3) cout << fmax(r, dr, drob) << '\n';*/
        cout << "\nЕще раз? 1 - да: ";
        cin >> r;
    } while (r == 1);
    return 0;
}
0
6918 / 5983 / 2710
Регистрация: 14.04.2014
Сообщений: 25,504
21.12.2014, 16:46 6
Лучший ответ Сообщение было отмечено Minchanin-Bel как решение

Решение

Ну тогда первые 2 параметра должны быть явно заданы: тип и количество чисел. Дальше многоточие. И массивы туда передавать не нужно.
C++
1
2
fmax(0, 2, 4, 5)
fmax(1, 3, 5.6, 3.1, 0.8)
Как-то так.
1
5 / 5 / 3
Регистрация: 19.09.2010
Сообщений: 173
21.12.2014, 16:48  [ТС] 7
nmcf, почему тогда *(p+2) не работает, а выводит нечто странное, при попытке сослаться на 3й параметр, когда *p=&r

Охх, кажется, наконец, до меня дошло Спасибо! А такой тогда вопрос: как через консольку это организовать, если не массивом? Просто из интереса такой вопрос.. Но Ваш вариант вполне устроит
0
6918 / 5983 / 2710
Регистрация: 14.04.2014
Сообщений: 25,504
21.12.2014, 16:56 8
Лучший ответ Сообщение было отмечено Minchanin-Bel как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
float fmax(int t,...)
{
    int *p, n;
    float *fp;
 
    n = *(&t + 1); // количество чисел
 
    if (t == 0) // int
    {
        p = &t + 2; // указатель на первое число int
 
    }
    else // float
    {
        fp = (float *)(&t + 2);  // указатель на первое число float
    
    }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.12.2014, 16:56

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Шаблон с переменным количеством параметров
У меня компилятор Visual Studio 2012, но не работает следующий код: #include &lt;iostream&gt;...

Функция с переменным количеством параметров
Здравствуйте, возникла вот такая проблема: создаю функцию с переменным кол-ом параметров. Пример...

Функция с переменным количеством параметров
Доброго времени суток! Я озадачился таким вопросом - как производится компиляция функций с...

Функция суммы с переменным количеством параметров
На просторах форума нашёл код. Стало интересно посмотреть что выводят его отдельные части(отдельно...

Функция с переменным количеством параметров-оъектов
Нашел на форуме пример функции с переменным количеством int, подскажите как переписать ее для...

Разработать функцию с переменным количеством параметров
Функция должна вернуть наименьшее из введенных значений. #include &lt;iostream&gt; #include &lt;cstdlib&gt;...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.