Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.68
andreyich
0 / 0 / 0
Регистрация: 08.08.2010
Сообщений: 16
#1

Размер матрицы - C++

24.08.2010, 01:26. Просмотров 3084. Ответов 39
Метки нет (Все метки)

Люди, помогите пожалуйста!

У меня есть задание: создать библиотеку функций для работы с матрицами.
Можно ли сделать ,так что в параметрах функций были только матрицы , а размеры их программа знала сама???

Объясните пожалуйста новичку! Заранее благодарен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2010, 01:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Размер матрицы (C++):

размер матрицы - C++
#include <iostream> #include <vector> #include <stack> using namespace std; typedef vector<int > T_vec; typedef...

Задать размер матрицы - C++
Здравствуйте. Хочу задать размер матрицы примерно вот так (так нельзя, естественно): #include <iostream> #include <string> #include...

Размер vs. размерность матрицы - C++
Вопрос скорее теоретический. Чем отличается размер матрицы от размерности? И как правильно спрашивать пользователя в программе: "Введите...

Найти среднее арифметическое элементов каждой строки матрицы Q (lm) и отнять его от элементов этой строки. размер матрицы 7х7.заранее спасибо - C++
Найти среднее арифметическое элементов каждой строки матрицы Q (lm) и отнять его от элементов этой строки.. размер матрицы 7х7.заранее...

Найти минимальный размер матрицы размером m x n - C++
Помогите, пожалуйста! Программа считывает размеры матрицы, рандомно генерирует значения ее членов и из них ищет минимальный. В 18-й...

Как задать размер матрицы в конструкторе класса? - C++
Подскажите как задать размер матрицы в конструкторе класса? Решаю задачи из учебника, не могу понять, думаю это невозможно... Р. Лафоре...

39
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.08.2010, 01:29 #2
andreyich, Ага. Макросами.
0
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
24.08.2010, 01:41 #3
andreyich,
Вообще говоря нет, каким-то образом тебе всё же придётся сообщить программе размерность...
0
easybudda
Модератор
Эксперт CЭксперт С++
9916 / 5839 / 975
Регистрация: 25.07.2009
Сообщений: 11,013
24.08.2010, 02:04 #4
Цитата Сообщение от andreyich Посмотреть сообщение
Можно ли сделать ,так что в параметрах функций были только матрицы , а размеры их программа знала сама???
Цитата Сообщение от Lavroff Посмотреть сообщение
Ага. Макросами.
это при условии, что матрица статическая и размеры её известны во время компиляции. В любом случае использование в функциях предопределённых констант - какое-то очень сомнительное решение.
0
Евгений М.
1037 / 978 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
24.08.2010, 03:15 #5
Цитата Сообщение от andreyich Посмотреть сообщение
Можно ли сделать ,так что в параметрах функций были только матрицы , а размеры их программа знала сама???
Можно схитрить, создав класс матрицы, у которого есть элементы отвечающие за размер матрицы.
0
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
24.08.2010, 03:18 #6
Евгений М.,
Мне кажется вопрос был не в том, т.к. в этом случае нам всё равно нужно самим задавать размерность. По-моему, человек хотел узнать, можно ли вообще не задавать размерность, а сделать так, чтобы программа распознавала её сама... Ну а уж если вопрос в том, чтобы не передавать размерность в функцию, то можно банально воспользоваться глобальными переменными...
0
Nameless One
Эксперт С++
5780 / 3429 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
24.08.2010, 03:58 #7
Если матрицы - статические, то сработает такая конструкция:
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
#include <iostream>
 
template<class T, size_t N, size_t M>
void show(T (&matrix)[N][M])
{
    for(size_t i = 0; i < N; ++i, std::cout << std::endl)
        for(size_t j = 0; j < M; ++j)
            std::cout << matrix[i][j] << "\t";
}
 
template<class T, size_t N, size_t M>
void init(T (&matrix)[N][M])
{
    for(size_t i = 0; i < N; ++i)
        for(size_t j = 0; j < M; ++j)
            matrix[i][j] = i + j + i * j;
}
 
int main()
{
    const size_t row = 5;
    const size_t col = 5;
    int imatrix[row][col];
    init(imatrix);
    show(imatrix);
    return 0;
}
Однако, библиотека, работающая со статическими матрицами - бесполезна.
0
easybudda
Модератор
Эксперт CЭксперт С++
9916 / 5839 / 975
Регистрация: 25.07.2009
Сообщений: 11,013
24.08.2010, 04:41 #8
Есть крайне ненадёжный и работающий только в несертифицированных Microsoft операционных системах, но по-своему забавный способ...
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
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
 
void print_sizes(int ** matrix){
    printf("Rows: %d\tColumns: %d\n", malloc_usable_size(matrix) / sizeof(int*),
        malloc_usable_size(*matrix) / sizeof(int));
}
 
int main(void){
    int rows, columns, **matrix, i;
    
    printf("Rows: ");
    scanf("%d", &rows);
    printf("Columns: ");
    scanf("%d", &columns);
    
    if ( ( matrix = (int**)malloc(sizeof(int*) * rows) ) == NULL ){
        perror("malloc");
        exit(1);
    }
    for ( i = 0; i < rows; ++i ){
        if ( ( matrix[i] = (int*)malloc(sizeof(int) * columns) ) == NULL ){
            perror("malloc");
            exit(1);
        }
    }
    
    printf("Created matrix with sizes:\n");
    print_sizes(matrix);
    
    for( i = 0; i < rows; ++i )
        free(matrix[i]);
    free(matrix);
    
    exit(0);
}
Засада в том, что malloc() резервирует памяти не меньше, чем запрошено, но может вернуть больше (из-за заморочек с выравниванием).
2
Nameless One
Эксперт С++
5780 / 3429 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
24.08.2010, 04:45 #9
Также, если массив статический, можно узнать его размер внутри функции с помощью оператора sizeof языка C++ (не помню, но вроде в С это не оператор, а функция):
C++
1
2
3
4
5
void func(int* array)
{
    size_t size = sizeof array / sizeof *array;
    //...
}
0
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
24.08.2010, 04:47 #10
Да, в Си следует писать так
C
1
sizeof (array)
0
Nameless One
Эксперт С++
5780 / 3429 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
24.08.2010, 04:51 #11

Не по теме:

Прикол в том, что в С++ тоже есть функция sizeof, потому что оператор sizeof может работать только с переменными, в то время как функция sizeof может работать и с типами данных, и с переменными


В общем, я считаю, лучше всего для своей библиотеки сделать так, как сказал Eвгений М., т.е. разработать класс "матрица"
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
24.08.2010, 06:39 #12
в C sizeof() - одноместная операция

Добавлено через 1 минуту
C++
1
2
3
4
5
void func(int* array)
{
    size_t size = sizeof array / sizeof *array;
    //...
}
получится sizeof(int *) / sizeof(int)

Добавлено через 3 минуты
а ещё, операцию sizeof можно использовать как со скобками, так и без скобок
когда ищешь размер типа, скобки необходимы, а когда ищешь размер объекта (переменная с таким-то именем, sizeof 0.5 и так далее), скобки необязательны
2
ForEveR
24.08.2010, 07:05
  #13

Не по теме:

accept, 0.5 не самое корректное имя для переменной

0
andreyich
0 / 0 / 0
Регистрация: 08.08.2010
Сообщений: 16
24.08.2010, 10:23  [ТС] #14
Всем спасибо!!!
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
24.08.2010, 11:37 #15
Lavroff, не, сделай sizeof 0.5, а потом sizeof 0.5L, ещё sizeof 'a'
можно узнавать размеры значений, не зная названий их типов
1
24.08.2010, 11:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2010, 11:37
Привет! Вот еще темы с ответами:

помогите сделать: подпрограмма считывает размер матрицы из первого файла и передает его во второй? - C++
не могли бы вы подделиться ссылкой на пример,где подпрограмма считывает размер матрицы из первого файла и передает его во второй? заранее...

С клавиатуры вводится размер матрицы и сама матрица. Найти в матрице строку с максимальной суммой и отсортиров - C++
С клавиатуры вводится размер матрицы и сама матрица. Найти в матрице строку с максимальной суммой и отсортировать

Зачем при передаче матрицы в функцию, передавать вторым аргументом её размер, если в первом он уже указан? - C++
Добрый день господа.Объясните пожалуйста почему при вызове функции f() В левый индекс ничего не засовывается и для чего нужен правый...

Ввести размер массива с клавиатуры и передать этот размер в конструктор - C++
Я создал массив объектов. И я хочу ввести размер этого массива с клавиатуры, и передать этот размер в конструктор, как мне это сделать? ...


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

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

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