Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
ashta
9 / 9 / 4
Регистрация: 28.08.2012
Сообщений: 65
#1

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

21.03.2013, 12:11. Просмотров 1660. Ответов 14
Метки нет (Все метки)

Написать функцию принимающую массив и возвращающую указатель на динамический массив содержащий первые 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;
 
 }

http://www.cyberforum.ru/cpp-beginners/thread1411830.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2013, 12:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Написать функцию принимающую массив и возвращающую указатель на динамический массив (C++):

Написать функцию, принимающую массив структур Student
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; struct...

Написать функцию, принимающую в качестве параметра одномерный массив
Запишите и испытайте функцию. Входными параметрами составляемых функций...

Написать шаблонную функцию, принимающую три параметра и возвращающую их среднее арифметическое как float
Функция f6, которая принимает три аргумента определенного типа (int, double...

Написать функцию, принимающую в качестве параметра массив целых чисел
Написать функцию, принимающую в качестве параметра массив целых чисел а) из 25...

Написать функцию, принимающую параметрами 2 целых числа, и возвращающую сумму чисел из диапазона между ними
Написать функцию, которая получает в качестве параметров 2 целых числа и...

14
yoghurt92
375 / 346 / 113
Регистрация: 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;
}
2
ashta
9 / 9 / 4
Регистрация: 28.08.2012
Сообщений: 65
22.03.2013, 11:56  [ТС] #3
Цитата Сообщение от yoghurt92 Посмотреть сообщение
ashta, вот, вариант такой, отсортировать массив по убыванию и вывести n первых элементов, так как они и будут максимальными
Спасибо большое, Yoghurt92. Хорошая идея с сортировкой, только все равно получается, что не идеальна, т.к. вот например в следующем массиве http://screencast.com/t/uEVucVcYs7p должно по идее было бы вывести 78 95 82 (первые три максимальных элемента). Как это реализовать, не знаете?
0
igor001
8 / 3 / 2
Регистрация: 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;
}
1
yoghurt92
375 / 346 / 113
Регистрация: 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, зачем создавать еще один массив? не легче просто выводить значения? по мне, так это лишнее...
0
igor001
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
22.03.2013, 14:34 #6
задача вернуть указатель на массив с n наибольших элементов, не указано что передаваемый массив нужно изменять так что получаеться нужно создавать новый
0
yoghurt92
375 / 346 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
22.03.2013, 15:01 #7
igor001, не прочитал первую часть, ну тогда да.
0
igor001
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
22.03.2013, 15:05 #8
щерт, извиняюсь за грубую ошибку. создавать указатель на локальную переменную и функцией возвращать указатель на нее нельзя, так как локальные переменные вызванные функцией размещаются в стеке и удаляются из него по завершении работы функции, так что указатель будет указывать хз куда. так что если ты хочешь чтобы функция вернула тебе указатель необходимо заранее его определить и передать в функцию, правда тогда можно его и не возвращать функцией имхо это бессмысленно так как ты внутри функции сам сможешь изменить данные, лежащие по указателю
0
yoghurt92
375 / 346 / 113
Регистрация: 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*... а вообще, можно просто сохранить возвращаемый указатель в другой массив уже в мейне
0
igor001
8 / 3 / 2
Регистрация: 12.02.2013
Сообщений: 68
22.03.2013, 15:22 #10
Цитата Сообщение от igor001 Посмотреть сообщение
щерт, извиняюсь за грубую ошибку. создавать указатель на локальную переменную и функцией возвращать указатель на нее нельзя, так как локальные переменные вызванные функцией размещаются в стеке и удаляются из него по завершении работы функции, так что указатель будет указывать хз куда. так что если ты хочешь чтобы функция вернула тебе указатель необходимо заранее его определить и передать в функцию, правда тогда можно его и не возвращать функцией имхо это бессмысленно так как ты внутри функции сам сможешь изменить данные, лежащие по указателю
отбой, тупанул снова, там ведь через new создается элемента, это ж не на переменную указатель, все норм должно быть

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

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

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

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

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

Добавлено через 51 секунду
сейчас я уже основную часть проги реализовал
0
yoghurt92
375 / 346 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
22.03.2013, 15:48 #15
igor001, ну понятно
0
22.03.2013, 15:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2013, 15:48
Привет! Вот еще темы с решениями:

написать функцию, возвращающую массив
Всем здравствуйте, Вопрос такой: нужно написать функцию, которая...

Написать функцию, принимающую указатель на строку и выполняющую удаление всех букв «а» из строки
Написать функцию, принимающую указатель на строку и выполняющую удаление всех...

Дан массив из прототипов функций или указателей на функцию, сделать функцию, возвращающую этот массив
Не охота создавать лишнею тему извиняюсь заранее Вопрос такой Можете...

Написать объявление функции, возвращающую целое число и принимающую указатель на целое число
объявите функцию f2, возвращающую результат целого типа и передающую указатель...


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

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

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