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

Массивы в функциях и заполнение случайными числами - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Voron55555
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 14
10.12.2012, 23:13     Массивы в функциях и заполнение случайными числами #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
[*]#include <iostream.h>
int zapolnenie(int x, int n);
int pokaz(int x, int n);
int summa(int x, int n);
int zapolnenie(int x, int n)
{
for(int i=0;i<n;i++) x[i]=rand()%50;
return 0;
}
int pokaz(int x, int n)
{
for(int i=0;i<n;i++) cout<<"element pod nomerom"<<i<<"="<<x[i]<<"\n";
return 0;
}
int summa(int x, int n)
{
int sum=0;
for(int i=0;i<n;i++) sum+=x[i];
return sum;
}
int main()
{
int n,s;
cin>>n;
int *N=new int [n];
zapolnenie(N,n);
pokaz(N,n);
s=summa(N,n);
cout<<"summa el massiva="<<s;
delete []N;
system("pause");
}
Приветствую всех пользователей форума. Прошу подсказать мне решение основныйх проблем на приведенном выше примере. Задача в том, чтобы посчитать сумму всех элементов массива через функции. 1)Обязательно ли постоянно ставить в самом начале заголовки функций (в некоторых примерах их вообще не было)? 2)В чем ошибка данного примера(скорее ошибки)? 3) В чем суть randomize(), если обращение к rand и так полностью выполняется(говорили что randomize нужен для активации счетчика случайных чисел, но и без него все работает)? Среда - билдер.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2012, 23:13     Массивы в функциях и заполнение случайными числами
Посмотрите здесь:

заполнение случайными числами C++
C++ заполнение случайными числами
C++ Заполнение строки случайными числами
C++ Заполнение массива случайными числами
C++ Заполнение массива случайными числами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ZaMaZaN4iK
Мой лучший друг-отладчик!
 Аватар для ZaMaZaN4iK
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
11.12.2012, 00:00     Массивы в функциях и заполнение случайными числами #2
1)заголовки ставить очень даже желательно.Я всегда пишу перед мейном заголовки, а после мейна уже все функции.
2)Ужаснейшее форматирование кода.я бы ещё добавил после system("pause") return 0 но это необязательно(компилятор сам может добавить)
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
11.12.2012, 00:12     Массивы в функциях и заполнение случайными числами #3
1) Это прототипы функций. Сделано для того, чтобы сообщить компилятору, что реализация функции будет дальше. Удобно, чтобы не нагромождать перед меином кучу места, а также, если в функции используется другая, реализованная уже после.
2) В функции передается число x, а не массив. Для второго надо писать так int *x.
3) randomize - забудь вообще про него, используй rand(), предварительно написав srand (time (0)); (требует хедера ctime). Фактически, randomize подобен srand, инициализирует ГПСЧ начальным числом, дабы его рандом был случайнее.
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
11.12.2012, 01:04     Массивы в функциях и заполнение случайными числами #4
Лучше уже так, такое объявление
C++
1
2
3
void zapolnenie(int *massiv, int razmer);
void pokaz(int *massiv, int razmer);
int summa(int *massiv, int razmer);
называется прототипом функции, оно нужно, чтобы компилятор знал о всех используемых функциях, вне зависимости от того где они буду определяться, перед main или после.
+ переменные лучше как-то называть, а не подной букве, лучше по смыслу, тогда будет ошибки легче ловить.
+ нужно различать по типу Паскаля функции - функции (int, float, ....)и функции - процедуры (void, которые выполняют работу но не возвращают результат, их нельзя писать справа от символа присваивания "=").
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
#include <iostream> // у вас #include <iostream.h>
#include <stdlib.h>
 
void zapolnenie(int *massiv, int razmer);
void pokaz(int *massiv, int razmer);
int summa(int *massiv, int razmer);
 
using namespace std; // это у вас не нужно
 
int main()
{
    int razm,sum;
    cin>>razm;
    int *arr=new int [razm];
    zapolnenie(arr, razm);
    pokaz(arr, razm);
    sum=summa(arr, razm);
    cout<<"summa el massiva="<<sum<<endl;
    delete []arr;
    system("pause");
    return 0;
}
 
void zapolnenie(int *massiv, int razmer)
{
    //эта функция не возвращает результат
    for(int i=0; i<razmer; i++) massiv[i]=rand()%50; // этот rand должен дават ьодну и ту же последовательность, 
    // поэтому генератор случ. чисел нужно иниуиализироват ькаждый раз
    
}
void pokaz(int *massiv, int razmer)
{
    //эта функция не возвращает результат
    //for(int i=0; i<razmer; i++) cout<<"element pod nomerom"<<i<<"="<<massiv[i]<<"\n";
    for(int i=0; i<razmer; i++) cout<< "mas["<<i<<"]= "<<massiv[i]<< " "<<endl;
}
 
int summa(int *massiv, int razmer)
{
    // а эта возвращает
    int sum=0;
    for(int i=0; i<razmer; i++) sum+=massiv[i];
    return sum;
}
Voron55555
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 14
11.12.2012, 20:59  [ТС]     Массивы в функциях и заполнение случайными числами #5
И еще раз благодарю всех ответивших
Voron55555
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 14
14.12.2012, 17:30  [ТС]     Массивы в функциях и заполнение случайными числами #6
Уважаемые посетители форума ответьте пожалуйста, почему предпочтительнее использовать указатели на массивы, а не оригинальные имена при передаче (и создании) в вызванную функцию? Проверял на билдере и все получалось, но при константной размерности (конечно, так же переданной в функцию) Выскочила ошибка, но заполнение и расчеты были произведены.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
14.12.2012, 17:55     Массивы в функциях и заполнение случайными числами #7
Voron55555, в функцию желательно объекты всех типов передавать по константной ссылке, если это возможно (изменять внутри не будет). Если передаете не по ссылке, без указателей, то в вызывающей функции создается копия объекта заданного типа. Лишнее место в памяти.
Voron55555
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 14
14.12.2012, 20:19  [ТС]     Массивы в функциях и заполнение случайными числами #8
BumerangSP Спасибо тебе уважаемый. Второй раз выручаешь.

Добавлено через 12 минут
Но разве сами функции - это не динамические поля, которые удаляются после их расчета (выполнения)? В таком случае и созданные объекты в рамках функций уничтожаются. По идеи не сильно загружаем память. Возможно, по логике вещей, мы таким образом снимаем нагрузку во время выполнения функции, что особенно важно при больших (по количеству расчетов и операций) функциях. Я правильно понял суть?
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
14.12.2012, 21:31     Массивы в функциях и заполнение случайными числами #9
Хм, поля?) Инструкции в стеке.
С отдельной функцией вообще медленней, чем если бы все было в одной. А если объект большого размере? Еще медленней))
Об этом лучше отдельно почитать. Про inline функции тоже полезно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2012, 01:40     Массивы в функциях и заполнение случайными числами
Еще ссылки по теме:

Заполнение матрицы случайными числами C++
заполнение матрицы случайными числами C++
Заполнение массива случайными числами C++

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

Или воспользуйтесь поиском по форуму:
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
15.12.2012, 01:40     Массивы в функциях и заполнение случайными числами #10
Цитата Сообщение от Voron55555 Посмотреть сообщение
Уважаемые посетители форума ответьте пожалуйста, почему предпочтительнее использовать указатели на массивы, а не оригинальные имена при передаче (и создании) в вызванную функцию? Проверял на билдере и все получалось, но при константной размерности (конечно, так же переданной в функцию) Выскочила ошибка, но заполнение и расчеты были произведены.
Массив передается всегда по ссылке, т.е., в функцию всегда передается адрес массива.
При передаче по константной ссылке, объект нельзя изменить внутри функции.
В том примере, что я вам привел, используется понятие "указатель", но никак не ссылка. Указатель - адрес некоторого объекта в памяти.
Здесь можно передавать по константной ссылке,
C++
1
2
void pokaz(int *massiv, int razmer);
int summa(int *massiv, int razmer);
а здесь нет
C++
1
void zapolnenie(int *massiv, int razmer);
и еще, если у вас древний билдер- выкиньте его, стандарт и СИ, и С++ сильно изменился. Лучше пользоваться Visual Studio Express 2008-2010 или gcc, например Qt Creator, CodeLite и т.д.

Добавлено через 5 минут
Цитата Сообщение от Voron55555 Посмотреть сообщение
BumerangSP Спасибо тебе уважаемый. Второй раз выручаешь.

Добавлено через 12 минут
Но разве сами функции - это не динамические поля, которые удаляются после их расчета (выполнения)? В таком случае и созданные объекты в рамках функций уничтожаются. По идеи не сильно загружаем память. Возможно, по логике вещей, мы таким образом снимаем нагрузку во время выполнения функции, что особенно важно при больших (по количеству расчетов и операций) функциях. Я правильно понял суть?
Не сильно, если в ваших больших расчетах не используются большие массивы данных. Вообще почитайте Прату, Шилдта - многое станет ясно.
Yandex
Объявления
15.12.2012, 01:40     Массивы в функциях и заполнение случайными числами
Ответ Создать тему
Опции темы

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