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

Написать функцию принимающую массив и возвращающую указатель на динамический массив - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
ashta
6 / 6 / 1
Регистрация: 28.08.2012
Сообщений: 65
21.03.2013, 12:11     Написать функцию принимающую массив и возвращающую указатель на динамический массив #1
Написать функцию принимающую массив и возвращающую указатель на динамический массив содержащий первые n нaибольших чисел.

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

Как вывести первые n максимальных элементов? n- вводится с клавиатуры.

Моя попытка решения ниже:

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
# include <iostream>
# include <stdlib.h>
# include <time.h>
 
using namespace std;
 
//ф-я вывод массива
 
int* array (int* arr, int arr_size)
 
{
 
    for (int i=0; i<arr_size; i++)
         cout<<"Array="<<arr[i]<<endl;
 
}
 
// ф-я поиска наибольшего эл-та
 int* searchnmax(int* arr, int arr_size, int max_count)
 {
     
     // временный элемент, с которым сравниваются эл-ты массива
     int n=0;
 
     for (int j=0; j<arr_size; j++)
     {
         if (arr[j]<max_count)
         {
             if (n<arr[j]) n=arr[j];
         }
     }
             return ;
 
 }
 
 void main ()
 
 {
     srand (time(NULL));
     const int arr_size=10;
     int* arr=new int[arr_size];
    
     int* max;
      //кол-во наибольших чисел
     int k=0;
 
      for (int i=0;i<arr_size; i++)
         arr[i]=rand()%100;
 
      array (&arr[0], arr_size);
 
     cout<<"Please enter number less than"<<arr_size<<"of max elements you would like to print out"<<endl;
     cin>>k;
 
    searchnmax(arr,arr_size,100);
 
    for (int i=0; i<k; i++)
        max[i]=searchnmax(arr, arr_size,k(i-1));
    array (max,k);
 
    delete[] arr;
 
 }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2013, 12:11     Написать функцию принимающую массив и возвращающую указатель на динамический массив
Посмотрите здесь:

C++ написать функцию, возвращающую массив
C++ Дан массив из прототипов функций или указателей на функцию, сделать функцию, возвращающую этот массив
C++ Написать функцию, принимающую массив структур Student
C++ Написать функцию, принимающую указатель на строку и выполняющую удаление всех букв «а» из строки
Написать шаблонную функцию, принимающую три параметра и возвращающую их среднее арифметическое как float C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
21.03.2013, 21:06     Написать функцию принимающую массив и возвращающую указатель на динамический массив #2
ashta, вот, вариант такой, отсортировать массив по убыванию и вывести n первых элементов, так как они и будут максимальными

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
// obr.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
 
//ф-я вывод массива
int* show_array(int *arr, int size)
{
    cout << "Array: ";
    for(int i = 0; i < size; ++i)
         cout << arr[i] << ' ';
 
    cout << endl;
    return arr;
}
 
// ф-я поиска наибольшего эл-та
int* sort(int *arr, int &size)
{ 
    for(int i = 0; i < size - 1; ++i)
        for(int j = i + 1; j < size; ++j){
            int t;
            if(arr[i] < arr[j])
            {
                t = arr[i];
                arr[i] = arr[j];
                arr[j] = t;
            }
        }
 
    return arr;
}
 
int main()
{
    srand(time(NULL));
 
    int size;
    cout << "Enter size: ";
        cin >> size;
 
    int *arr = new int[size];
 
    for(int i = 0; i < size; ++i)
         arr[i] = 1 + rand() % 100;
 
    show_array(arr, size);          //выводим массив
    arr = sort(arr, size);          //сортируем массив по убыванию
 
    int count;                      //кол-во максимал эл-во
    cout << "Enter count: ";
        cin >> count;
 
    for(int i = 0; i < count; ++i)          //выводим максим эл-ты
        cout << arr[i] << ' ';
 
    delete[] arr;
 
    cout << "\n\n";
    return 0;
}
ashta
6 / 6 / 1
Регистрация: 28.08.2012
Сообщений: 65
22.03.2013, 11:56  [ТС]     Написать функцию принимающую массив и возвращающую указатель на динамический массив #3
Цитата Сообщение от yoghurt92 Посмотреть сообщение
ashta, вот, вариант такой, отсортировать массив по убыванию и вывести n первых элементов, так как они и будут максимальными
Спасибо большое, Yoghurt92. Хорошая идея с сортировкой, только все равно получается, что не идеальна, т.к. вот например в следующем массиве http://screencast.com/t/uEVucVcYs7p должно по идее было бы вывести 78 95 82 (первые три максимальных элемента). Как это реализовать, не знаете?
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
22.03.2013, 12:42     Написать функцию принимающую массив и возвращающую указатель на динамический массив #4
я бы написал что-нибудь на подобие следующего:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int* array(int *arr, int n, int size)
{
    int max   = 0;
 
    int *max_arr = new int[n];
 
    for (int i = 0; i < size; ++i)
    {
        if (arr[i] > max) max = arr[i];
    }
    max_arr[0] = max;
 
    for (int j = 0; j < n; ++j)
    {
        max = 0;
        for (int i = 0; i < size; ++i)
        {
            if (arr[i] > max && arr[i] < max_arr[j-1]) max = arr[i];
        }
        max_arr[j] = max;
    }
        return *max_arr;
}
главное когда завершишь работу с массивом, полученным через указатель, возвращаемый функцией не забудь очистить память

C++
1
delete []max_arr;
вродь так

Добавлено через 11 минут
Хотя как по мне то гораздо удобнее использовать векторы и в функцию передавать ссылки на них, например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
bool find_max_arr(const vector<int> &in_data, vector<int> &result, int n)
{
     result.clear();
     if (in_data.size() > n) return false;
     if (in_data.size() == n) 
     {
          result = in_data;
          return true;
     }
     /*операции с векторами*/
     return true;
}
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
22.03.2013, 14:11     Написать функцию принимающую массив и возвращающую указатель на динамический массив #5
ashta, а по какому признаку определять максимальное? а если я вам скажу что первые три максимальные это 95, 82, 83? И я тоже буду прав если делать как вы хотите, то я думаю нужно выводить максимальное из двух, сравнивать по 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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// obr.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
 
//ф-я вывод массива
int* show_array(int *arr, int size)
{
    cout << "Array: ";
    for(int i = 0; i < size; ++i)
         cout << arr[i] << ' ';
 
    cout << endl;
    return arr;
}
 
// ф-я поиска наибольшего эл-та
int* max_from_pair(int *arr, int &count, int &size)
{ 
    int kol = 0;
 
    cout << "first " << count << " maximal elements: ";
    for(int i = 0; i < size; i += 2){
        if(kol != 3){
            if(arr[i] < arr[i + 1])
                cout << arr[i + 1] << ' ';
            else
                cout << arr[i] << ' ';
        }
        else
            break;
 
        ++kol;
    }
 
    return arr;
}
 
int main()
{
    srand(time(NULL));
 
    int size;
    cout << "Enter size: ";
        cin >> size;
 
    int *arr = new int[size];
 
    for(int i = 0; i < size; ++i)
         arr[i] = 1 + rand() % 100;
 
    show_array(arr, size);          //выводим массив
 
    int count;                      
    cout << "\nEnter count: ";
        cin >> count;
 
    max_from_pair(arr, count, size);        //выводим n первых макс эл-ов
                                    //сравниваем по парам
 
    delete[] arr;
 
    cout << "\n\n";
    return 0;
}
тут сравниваем по парам, иначе значения буду повторяться

Добавлено через 2 минуты
igor001, зачем создавать еще один массив? не легче просто выводить значения? по мне, так это лишнее...
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
22.03.2013, 14:34     Написать функцию принимающую массив и возвращающую указатель на динамический массив #6
задача вернуть указатель на массив с n наибольших элементов, не указано что передаваемый массив нужно изменять так что получаеться нужно создавать новый
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
22.03.2013, 15:01     Написать функцию принимающую массив и возвращающую указатель на динамический массив #7
igor001, не прочитал первую часть, ну тогда да.
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
22.03.2013, 15:05     Написать функцию принимающую массив и возвращающую указатель на динамический массив #8
щерт, извиняюсь за грубую ошибку. создавать указатель на локальную переменную и функцией возвращать указатель на нее нельзя, так как локальные переменные вызванные функцией размещаются в стеке и удаляются из него по завершении работы функции, так что указатель будет указывать хз куда. так что если ты хочешь чтобы функция вернула тебе указатель необходимо заранее его определить и передать в функцию, правда тогда можно его и не возвращать функцией имхо это бессмысленно так как ты внутри функции сам сможешь изменить данные, лежащие по указателю
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
22.03.2013, 15:14     Написать функцию принимающую массив и возвращающую указатель на динамический массив #9
ashta, ну тогда вот с возвращение

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
// obr.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
 
//ф-я вывод массива
int* show_array(int *arr, int size)
{
    cout << "Array: ";
    for(int i = 0; i < size; ++i)
         cout << arr[i] << ' ';
 
    cout << endl;
    return arr;
}
 
// ф-я поиска наибольшего эл-та
int* max_from_pair(int *arr, int &count, int &size)
{ 
    int kol = 0, tmp;
    int *mas = new int[count];
 
    for(int i = 0; i < size; i += 2){
        if(kol < count){
            if(arr[i] < arr[i + 1])
                tmp = arr[i + 1];
            else
                tmp = arr[i];
 
            mas[kol++] = tmp;
        }
        else
            break;
    }
 
    return mas;
}
 
int main()
{
    srand(time(NULL));
 
    int size;
    cout << "Enter size: ";
        cin >> size;
 
    int *arr = new int[size];
 
    for(int i = 0; i < size; ++i)
         arr[i] = 1 + rand() % 100;
 
    show_array(arr, size);          //выводим массив
 
    int count;                      
    cout << "\nEnter count: ";
        cin >> count;
 
    int *mas_max = new int[count];
    mas_max = max_from_pair(arr, count, size);      //выводим n первых макс эл-ов
                                                    //сравниваем по парам
 
    cout << "first " << count << " maximal elements: ";
    for(int i = 0; i < count; ++i)
        cout << mas_max[i] << ' ';
 
    delete[] mas_max;
    delete[] arr;
 
    cout << "\n\n";
    return 0;
}
Добавлено через 6 минут
igor001, у вас ошибка и в этом месте
Цитата Сообщение от igor001 Посмотреть сообщение
return *max_arr;
вы указали что возвращаете указатель(а мы знаем что массив - указатель на первый элемент) и тут вы разыменовываете его, вылезет ошибка что невозможно преобразовать int в int*... а вообще, можно просто сохранить возвращаемый указатель в другой массив уже в мейне
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
22.03.2013, 15:22     Написать функцию принимающую массив и возвращающую указатель на динамический массив #10
Цитата Сообщение от igor001 Посмотреть сообщение
щерт, извиняюсь за грубую ошибку. создавать указатель на локальную переменную и функцией возвращать указатель на нее нельзя, так как локальные переменные вызванные функцией размещаются в стеке и удаляются из него по завершении работы функции, так что указатель будет указывать хз куда. так что если ты хочешь чтобы функция вернула тебе указатель необходимо заранее его определить и передать в функцию, правда тогда можно его и не возвращать функцией имхо это бессмысленно так как ты внутри функции сам сможешь изменить данные, лежащие по указателю
отбой, тупанул снова, там ведь через new создается элемента, это ж не на переменную указатель, все норм должно быть

Добавлено через 1 минуту
возможно, я не проверял то что написал, главное алгоритм верный но все же извиняюсь, давно с массивами динамическими не работал)

Добавлено через 4 минуты
я сам то кодить начал относительно недавно, месяца 4 всего, сча Страуструпа читаю, там векторы советуют юзать, хотя по началу сам только массивы использовал, теперь стараюсь пользоваться только векторами
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
22.03.2013, 15:28     Написать функцию принимающую массив и возвращающую указатель на динамический массив #11
igor001, я вот занимался по Дейтелям, вот закончил, начал stl для профессионалов читать, хоть и название громкое, очень доступно поясняется все, и тоже думал страуструпа читать, говорят для новичков тяжело сразу начинать...
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
22.03.2013, 15:38     Написать функцию принимающую массив и возвращающую указатель на динамический массив #12
незнаю, вродь норм. я разобрался с указателями, ссылками, классами, а так же основы разработки программ

Добавлено через 2 минуты
я просто до того как после универа на работу не устроился никогда не программировал, а здесь люди тоже не очень хорошо шарят, по началу учили, а сча уже фулл самообучение. я последние 2 месяца за неделю-две делаю план а потом набираюсь ума-разума из книг да инета)

Добавлено через 53 секунды
конечно, смотря на код, который я писал 3 месяца назад появляется желание выдернуть себе руки))
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
22.03.2013, 15:41     Написать функцию принимающую массив и возвращающую указатель на динамический массив #13
igor001, повезло, я сам тоже начал учить, но пока еще учусь, но у нас в городе джуниоры никому не нужны...

Добавлено через 30 секунд
igor001, а что за задания дают?)
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
22.03.2013, 15:47     Написать функцию принимающую массив и возвращающую указатель на динамический массив #14
да я на гос предприятие пошел в СКБ инженером-конструктором (на электронщика) а тут им в сектор прогеры нужны были, а я месяц перед тем как устраивался начал сам с++ пытаться учить, ну мне и дали квест написать прогу, которая читает по СОМ-порту из прибора набор байтов и раскладывает данные в таблицы на ПК

Добавлено через 51 секунду
сейчас я уже основную часть проги реализовал
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2013, 15:48     Написать функцию принимающую массив и возвращающую указатель на динамический массив
Еще ссылки по теме:

C++ Написать функцию, принимающую параметрами 2 целых числа, и возвращающую сумму чисел из диапазона между ними
C++ В функцию передается несколько целых чисел. Создать из всех параметров динамический массив и вернуть указатель
C++ Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)

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

Или воспользуйтесь поиском по форуму:
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
22.03.2013, 15:48     Написать функцию принимающую массив и возвращающую указатель на динамический массив #15
igor001, ну понятно
Yandex
Объявления
22.03.2013, 15:48     Написать функцию принимающую массив и возвращающую указатель на динамический массив
Ответ Создать тему
Опции темы

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