Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.97/413: Рейтинг темы: голосов - 413, средняя оценка - 4.97
0 / 0 / 1
Регистрация: 27.03.2008
Сообщений: 75

Определить количество элементов в массиве

20.03.2009, 17:15. Показов 80515. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста, как определить количество элементов в массиве d_massiv, если он задан следующим образом (язык только СИ):

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    unsigned long *d_massiv;
 
    l=get_l(uroven); 
 
           //get_l(uroven) - определяет l в зависимости от входных данных функции
    
          //функция выделения памяти под массив
          unsigned long* poluchit_massiv(int kolvo_elementov){
    return (unsigned long*) malloc(kolvo_elementov*sizeof(unsigned long));
 
          }
    //выделяем память под массив
           d_massiv=poluchit_massiv(l);
 
           //заполняем его
    d_massiv[0]=1168;
    d_massiv[1]=585;
    d_massiv[2]=293;
    d_massiv[3]=147;
    d_massiv[4]=74;
    d_massiv[5]=38;
    d_massiv[6]=20;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.03.2009, 17:15
Ответы с готовыми решениями:

Определить в массиве количество элементов, равных полусумме первого и последнего элементов
Определить в массиве количество элементов , равных полусумме первого и последнего элементов. На СИ

В массиве определить количество элементов, имеющих четные значения, и сумму этих элементов
решить, используя указатели 1. В массиве A из N элементов определить количество элементов, имеющих четные значения, и сумму этих...

Определить количество элементов в массиве
Определить количество элементов в массиве

34
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
23.03.2009, 20:00
Студворк — интернет-сервис помощи студентам
Code
1
2
3
4
5
    //выделяем память под массив
           d_massiv=poluchit_massiv(l);
 
           //заполняем его
    d_massiv[0]=1168;
Code
1
    nelems = l / sizeof d_massiv[0];
или

Code
1
    nelems = l;
0
0 / 0 / 1
Регистрация: 27.03.2008
Сообщений: 75
24.03.2009, 17:41  [ТС]
accept, Поясните, пожалуйста предложенный код...я что-то торможу и не могу понять, что он дает?
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
24.03.2009, 17:57
количество элементов известно изначально

C
1
    malloc(kolvo_elementov*sizeof(unsigned long))
то есть памяти выделяется под определённое количество элементов размера одного элемента типа unsigned long

Code
1
    d_massiv=poluchit_massiv(l);
в данном случае передаётся l, чтобы выделить память под это количество элементов

Code
1
l=get_l(uroven);
изначально l получает своё значение из функции get_l, в которую передаётся переменная uroven, которая здесь не описана

конкретно: чтобы получить количество элементов, надо написать функцию get_l, которая возвратит число, которое будет количеством элементов, вычислив его с помощью переменной uroven
0
0 / 0 / 1
Регистрация: 27.03.2008
Сообщений: 75
25.03.2009, 10:19  [ТС]
фишка в том, что l - это максимально возможное знаечение соответствующее переменной uroven и оно никак не может быть применено для вычисления того, какое количество переменных было реально введено.

Я так поняла, что выход здесь только один - считать количество элементов при их вводе, а жаль.

Спасибо всем большое за участие!
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.03.2009, 11:17
можно вводить через указатель и продвигать его, количество элементов будет разность этого указателя и адреса начала
0
Заблокирован
25.03.2009, 11:35
Splendid, ты не правильно поняла, написал же для своей динамики выделяй на 1 элемент больше и в нулевую ячейку своего массива записуй число элементов
Например
C++
1
2
3
cin>>nElements;
int *massiv = (int *)malloc((nElements +1)*sizeof(int));
massiv[0] = nElements;
Делов куча))), а потом в функции работающей с массивом прописуй

C++
1
2
3
4
5
6
7
8
void some_fun(int *massiv)
{
     int nElements = massiv[0];
     for(int i = 1; i <= nElements;i++)
     {
            //делай что хочешь
     }
}
Такой вариант даже прикольней, т.к. не надо никаких опереций деления, вычитания и т.д. чтоб вычислить число элементов - сам массив в нулевом элементе содержит их количество,вот
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.03.2009, 12:12
оно должно как-то само вычисляться, потому что, если она захочет дописать элементы, ей придётся переписывать эту инфу (так мало того, ещё и складывать с тем, что там уже есть)
0
Заблокирован
25.03.2009, 13:07
По-моему обратиться к нулевому элементу проще простого...
Например как я вижу слитие двух массивов в один

C++
1
2
3
4
5
6
7
8
void intcat(int *massiv1, int *massiv2)
{
    int nElements = massiv1[0] + massiv2[0];
    massiv1 = (int *)realloc((void *)massiv1, nElements*sizeof(int));
    for(int i = massiv1[0]; i < nElements; i++)
         massiv1[i] = massiv2[i - massiv1[0]];
   massiv1[0] =  nElements;
}
Вообщем это по-моему реализация самого сложного варианта, а ваще если не хватает оригинальности мысли в решении задач то никакое знание числа элементов не поможет...

Добавлено через 1 минуту 44 секунды
На крайняк можно вообще написать свой класс матрица как это я когда-то сделал и не париться каждый с вычислением определителя и прочих заманух...
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
25.03.2009, 13:26
Цитата Сообщение от Humanitis Посмотреть сообщение
C++
1
2
    int* r=(int*)malloc(30*sizeof(int));
    std::cout<<"Size="<<sizeof(r)/sizeof(r[0]);
Size=1
Размер указателя делим на размер элемента =)
Нужно передавать размер массива.
0
 Аватар для Humanitis
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
25.03.2009, 19:57
Dmitriy_M, Сначала,сначала тему читаем,чтобы понять, зачем я такой код привел
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.03.2009, 22:08
Цитата Сообщение от YurA_280784
void intcat(int *massiv1, int *massiv2)
можно структуры передавать, в которых указатель на массив и его размер, тогда массивы сохраняют первоначальный вид
0
 Аватар для kowack
4 / 4 / 0
Регистрация: 03.12.2010
Сообщений: 32
18.11.2011, 19:24
Цитата Сообщение от Humanitis Посмотреть сообщение
C++
1
2
    int* r=(int*)malloc(30*sizeof(int));
    std::cout<<"Size="<<sizeof(r)/sizeof(r[0]);
Size=1
r == r[0] (=

Никак.
По ходу заполнения массива нужно в отдельной переменной хранить количество элементов.

Всегда когда какой-то функции передаётся динамически созданный массив передаётся и количество элементов.

Не по теме:

А можно в отдельном массиве хранить указатели на элементы и считать сколько указателей не равны NULL)))

0
54 / 50 / 9
Регистрация: 16.05.2008
Сообщений: 162
21.11.2011, 11:41
Цитата Сообщение от kowack Посмотреть сообщение
r == r[0] (=

Никак.
По ходу заполнения массива нужно в отдельной переменной хранить количество элементов.

Всегда когда какой-то функции передаётся динамически созданный массив передаётся и количество элементов.

Не по теме:

А можно в отдельном массиве хранить указатели на элементы и считать сколько указателей не равны NULL)))

kowack, ты мне скажи вот люди тему развивают, при этом память выделяют с помощью malloc, а массив элементов типа int, и не кто не задумывается что память то выделена будет а вот ни один элемент типа int создан не будет?
0
 Аватар для kowack
4 / 4 / 0
Регистрация: 03.12.2010
Сообщений: 32
21.11.2011, 14:29
Коль кабы да если... Если уж так хочется сэкономить на памяти - создаёшь массив и при добавлении элемента наращиваешь размер. Если память заранее выделена, то ты не как не узнаешь до каких пор в памяти лежит нужная инфа. Если уж память и так выделил - заполни всё нулями и считай потом сколько нулей нет, если тяжело завести ещё одну переменную для подсчёта количества элементов.
1
54 / 50 / 9
Регистрация: 16.05.2008
Сообщений: 162
21.11.2011, 15:45
kowack, да я тебя то понял и даже полностью согласен, но это с int так все хорошо. А попробуй так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <stdlib.h>
using namespace std;
 
class A
{
public:
    A(){cout << "constructor\n";}
    ~A(){cout << "destructor\n";}
};
 
int main(int argc, char** argv)
{
    A* p = (A*)malloc(sizeof(A));    
    free(p);
 
    return 0;
}
то есть с пользовательским типом так нельзя.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.11.2011, 15:45

Определить количество максимальных элементов в массиве
Постановка задачи: Дан двумерный массив. Определить: а) Количество максимальных элементов в массиве б) Количество минимальных элементов...

Определить количество нечетных элементов в массиве
Программа определяет количество нечетных элементов.. Задана матрица. 1 6 7 2 5 8 3 4 9 #include &lt;stdio.h&gt; int...

Определить в массиве количество четных элементов
задан одномерный целочисленный массив. Составить рекурсивную функцию, которая определяла бы в массиве количество четных элементов и...

Определить количество нечетных элементов в массиве
1) Программа определяет количество нечетных элементов.. 2)Определяет значения и позиции максимального и минимального элемента массива. ...

В одномерном массиве определить количество элементов в диапазоне от А до В
В одномерном массиве определить количество элементов в диапазоне от А до В


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru