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

указатели и выделение памяти массивам - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Chif
0 / 0 / 0
Регистрация: 04.04.2011
Сообщений: 35
05.01.2012, 18:57     указатели и выделение памяти массивам #1
дана действительная матрица размером m x n. Определить числа b1, b2, b3.... bn равные соответственно значениям средних арифметических элементов строк. Матрица размещается в динамической памяти, а все операции обработки выполняются через указатели.

мой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int _tmain(int argc, _TCHAR* argv[])
{
    int m,n,i,j;
    //double mas[100];
 
    cout<<"vvedite razmernost' matrici: ";
    cin>>n>>m;
 
 
    int *mat=new int[n*m];                                        // правильно ?
 
    for (i=0;i<n;i++)                              
     for (j=0;j<m;j++)
      cin<<*(*(mat+i)+j);                                    // как сдесь поставить указатель на массив?    
 
    for (i=0;i<n;i++)
     for (j=0;j<m;j++)
     // a[i][j]
 
 
    return 0;
}

мне бы узнать как произвести ввод и вывод с помощью указателей, а остальное уж сам как-нибудь.

P.S хотелось бы и большую часть кода

P.S.S заранее спасибо
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
05.01.2012, 19:14     указатели и выделение памяти массивам #2
Цитата Сообщение от Chif Посмотреть сообщение
ввод и вывод с помощью указателей
Точно так же, как с обычными статическими массивами.
C++
1
2
3
int **arr;
...
cin >> arr[4][7];
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
05.01.2012, 19:15     указатели и выделение памяти массивам #3
Chif, тебе бы хоть узнать как ввод данных правильно сделать) потому что ты написал полный ужас.
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
#include <cstdlib>
#include <iostream>
 
int main()
{
    unsigned int m, n;
 
    std::cout << "Enter m, n" << std::endl;
    std::cin >> m >> n;
 
    int** matrix = new int*[m];
    for (unsigned int i = 0; i < m; ++i)
    {
        matrix[i] = new int[n];
        for (unsigned int j = 0; j < n; ++j)
            std::cin >> matrix[i][j];
    }
 
    double* vector = new double[m];
    for (unsigned int i = 0; i < m; ++i)
    {
        vector[i] = 0;
        for (unsigned int j = 0; j < n; ++j)
            vector[i] += matrix[i][j];
        vector[i] /= n;
    }
 
    std::cout << "Result" << std::endl;
    for (unsigned int j = 0; j < m; ++j)
        std::cout << vector[j] << " ";
    std::cout << std::endl;
 
    system("Pause");
 
    for (unsigned int i = 0; i < m; ++i)
        delete[]matrix[i];
    delete[]matrix;
    delete[]vector;
 
    return EXIT_SUCCESS;
}
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
05.01.2012, 19:23     указатели и выделение памяти массивам #4
C++
1
2
3
4
int *arr = new int [rows*columns];
for ( int i = 0 ; i < rows ; ++i )
    for ( int j = 0 ; j < columns; ++j )
        std::cin >> *(arr + i * columns + j );
Chif
0 / 0 / 0
Регистрация: 04.04.2011
Сообщений: 35
05.01.2012, 19:25  [ТС]     указатели и выделение памяти массивам #5
Спасибо.
Я набрасал ужас, потому что знал что вы поймете что я имел ввиду. НО часть проблемы не осталась решена: и менно в операторе ввода нужно использовать указатели
C++
1
cin<<*(mas +i)                     // пример для одномерного,а нужно для двумерного
вот через такую белеберду.

как сделать даже не представляю)
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
05.01.2012, 19:29     указатели и выделение памяти массивам #6
Но зачем? С адресной арифметикой знакомы? *(mas +i) == mas[i]
Chif
0 / 0 / 0
Регистрация: 04.04.2011
Сообщений: 35
05.01.2012, 19:47  [ТС]     указатели и выделение памяти массивам #7
чем отличается
C++
1
2
3
4
5
6
7
     int **mat=new int*[m];                                 // этот код не работает
     for(i=0;i<m;j++)                                            //этот код не работает
      mat[i]=new int[n];                                       //этот код не работает
 
      for ( int i = 0 ; i < n ; ++i )                           //этот код не работает
       for ( int j = 0 ; j < m; ++j )                          //этот код не работает
        cin >> *(mat + i * m + j );                         //этот код не работает  (ругается на >>)
от
C++
1
2
3
4
int *mat = new int [n*m];
for ( int i = 0 ; i < n ; ++i )
    for ( int j = 0 ; j < m; ++j )
       cin >> *(mat + i * m + j );
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
05.01.2012, 19:51     указатели и выделение памяти массивам #8
Цитата Сообщение от Chif Посмотреть сообщение
чем отличается
тем, что первый вариант не верный.
-=ЮрА=-
Заблокирован
Автор FAQ
05.01.2012, 19:58     указатели и выделение памяти массивам #9
Цитата Сообщение от Chif Посмотреть сообщение
дана действительная матрица размером m x n. Определить числа b1, b2, b3.... bn равные соответственно значениям средних арифметических элементов строк. Матрица размещается в динамической памяти, а все операции обработки выполняются через указатели.
- всё довольно просто
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
#include <iostream>
#include <iomanip> //setw
#include <cstdlib> //ввёл лишь для переносимости кода и на CodeBlocks
using namespace std;
 
int main()
{
    int i,j,m,n;
    //Вводим размерность матрицы mat
    cout<<"Enter number of rows : ";cin>>m;
    cout<<"Enter number of cols : ";cin>>n;
 
    int ** mat = new int * [m];//память под указатели на строки матрицы
    double * b = new double[m];//Память под средние арифметические
    double sum;
    for(i = 0; i < m; i++)
    {
        mat[i] = new int[n];//память под эдементы строки
        for(j = 0,sum = 0; j < n; j++)
        {
            cout<<"mat["<<i + 1<<"]["<<j + 1<<"] = ";
            cin>>*((*mat + i) + j);//вот он mat[i][j] == *((*mat + i) + j)
            sum += *((*mat + i) + j);//Накпливаем сумму єлементов строки
        }
        b[i] = (sum/1.0*n);//Вот тут и рассчитываем средние арифметические
    }
    //Вывод исходной матрицы и вектора ср арифметических на экран
    cout<<"Input matrix\n";
    for(i = 0; i < m; i++)
    {
        for(j = 0; j < n; j++)
            cout<<setw(3)<<*((*mat + i) + j)<<" ";
        cout<<endl;
    }
    cout<<"Vector b :\n";
    for(i = 0; i < m; i++)
        cout<<"b["<<i + 1<<"] = "
            <<(*b + i)
            <<endl;
    system("pause");
    return 0;
}
Миниатюры
указатели и выделение памяти массивам  
Chif
0 / 0 / 0
Регистрация: 04.04.2011
Сообщений: 35
05.01.2012, 20:00  [ТС]     указатели и выделение памяти массивам #10
а как его сделать рабочим, чтобы ввод и выделение памяти матрицы были такими
-=ЮрА=-
Заблокирован
Автор FAQ
05.01.2012, 20:02     указатели и выделение памяти массивам #11
Chif, вы кое кого зря поблагодарили
Цитата Сообщение от Chif Посмотреть сообщение
int *mat = new int [n*m];
- это одномерный массив

Цитата Сообщение от Chif Посмотреть сообщение
int **mat=new int*[m];
- это двумерный

Chif, не позволяйте чтобы вас водили за нос. Вам подсказали на мой взгляд от незнания индексации указателей в 2Д массиве не жуйте всё что вам вчухивают

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
*((*mat + i) + j)
- это верная индексация для двумерного массива а не бред который приведен
Цитата Сообщение от go Посмотреть сообщение
*(arr + i * columns + j );
Chif
0 / 0 / 0
Регистрация: 04.04.2011
Сообщений: 35
05.01.2012, 20:15  [ТС]     указатели и выделение памяти массивам #12
в вашей программе неправильно считается среднее арифмитическое строк (посмотрите скрин), сама матрица выводится неверно
-=ЮрА=-
Заблокирован
Автор FAQ
05.01.2012, 20:36     указатели и выделение памяти массивам #13
Цитата Сообщение от Chif Посмотреть сообщение
в вашей программе неправильно считается среднее арифмитическое строк (посмотрите скрин), сама матрица выводится неверно
- сейчас посмотрю, возможно что то упустил при беглом тестировании!Подождите пару минут
-=ЮрА=-
Заблокирован
Автор FAQ
05.01.2012, 20:42     указатели и выделение памяти массивам #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
b[i] = (sum/1.0*n);//Вот тут и рассчитываем средние арифметические
* * * * }
- правильно записать так
C++
1
b[i] = (sum/(1.0*n));
- правво даже не ожидал что будет деление на 1-цу а затем домножение, расчитывал на деление, спасибо что обратили моё внимание
Миниатюры
указатели и выделение памяти массивам  
Chif
0 / 0 / 0
Регистрация: 04.04.2011
Сообщений: 35
05.01.2012, 20:48  [ТС]     указатели и выделение памяти массивам #15
ну всеравно ведь не правильно, даже матрица не та выводится на экран
-=ЮрА=-
Заблокирован
Автор FAQ
05.01.2012, 20:50     указатели и выделение памяти массивам #16
Chif, ещё раз весь код, чтобы вы не путались
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
#include <iostream>
#include <iomanip> //setw
#include <cstdlib> //ввёл лишь для переносимости кода и на CodeBlocks
using namespace std;
 
int main()
{
    int i,j,m,n;
    //Вводим размерность матрицы mat
    cout<<"Enter number of rows : ";cin>>m;
    cout<<"Enter number of cols : ";cin>>n;
 
    int ** mat = new int * [m];//память под указатели на строки матрицы
    double * b = new double[m];//Память под средние арифметические
    double sum;
    for(i = 0; i < m; i++)
    {
        mat[i] = new int[n];//память под эдементы строки
        for(j = 0,sum = 0; j < n; j++)
        {
            cout<<"mat["<<i + 1<<"]["<<j + 1<<"] = ";
            cin>>*((*mat + i) + j);//вот он mat[i][j] == *((*mat + i) + j)
            sum += *((*mat + i) + j);//Накпливаем сумму єлементов строки
        }
        b[i] = (sum/(1.0*n));//Вот тут и рассчитываем средние арифметические
    }
    //Вывод исходной матрицы и вектора ср арифметических на экран
    cout<<"Input matrix\n";
    for(i = 0; i < m; i++)
    {
        for(j = 0; j < n; j++)
            cout<<setw(3)<<*((*mat + i) + j)<<" ";
        cout<<endl;
    }
    cout<<"Vector b :\n";
    for(i = 0; i < m; i++)
        cout<<"b["<<i + 1<<"] = "
            <<b[i]
            <<endl;
    system("pause");
    return 0;
}
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
05.01.2012, 20:51     указатели и выделение памяти массивам #17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
C++
1
b[i] = (sum/(1.0*n));
C++
1
b[i] = sum/(float)n;
go
05.01.2012, 21:00
  #18

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
int **mat=new int*[m];
- это двумерный
Это массив указателей пока что

-=ЮрА=-
Заблокирован
Автор FAQ
05.01.2012, 21:03     указатели и выделение памяти массивам #19
Chif, я понял такое ощущение что строки со столбцами перевернулись сейчас, я сам только увидел
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2012, 21:15     указатели и выделение памяти массивам
Еще ссылки по теме:

C++ Указатели (Выделение памяти в куче)
Указатели, Динамическое выделение памяти, Ошибка invalid allocation size C++
C++ Указатели С++. Динамическое выделение памяти

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

Или воспользуйтесь поиском по форуму:
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.01.2012, 21:15     указатели и выделение памяти массивам #20
вариант
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void *create ( size_t num, size_t size ) {
    void *t;
 
    if ( (t = malloc( num * size ) ) == NULL )
        exit ( 1 );
    else
        return t;
}
 
void init ( int **arr, float *vector, size_t n, size_t m ) {
    int i = 0, j, sum;
 
    while ( i < n ) {
        j = 0; sum = 0;
        while ( j < m ) {
            arr[ i ][ j ] = rand() % (n * m + 1);
            sum += arr[ i ][ j++ ];
        }
        *vector = ( (float) sum ) / n;
        ++i; ++vector;
    }
}
 
void print ( int *arr, size_t size ) {
    int i = 0;
    while ( i < size )
        printf("%2i ", arr[ i++ ] );
    puts("");
}
 
int main( void )
{
    const size_t n = 5, m = 5;
    size_t i = 0;
    int **matr;
    float *vec;
    srand( time ( NULL ) );
 
    vec = (float*) create( n, sizeof ( float ) );
    matr = (int**) create( n, sizeof( int* ) );
    while ( i++ < n )
        matr[ i - 1 ] = (int*) create( m, sizeof(int) );
 
    init ( matr, vec, n, m );
    puts("исходная матрица");
    for ( i = 0; i < n; ++i )
        print( matr[ i ], m );
    for ( i = 0; i < n; ++i )
        printf( "среднее арифметическое %f\n", vec[ i ] );
    i = 0;
    while ( i < n ) {
        free( matr[ i ] );
        ++i;
    }
    free( matr );
    free( vec );
 
    return 0;
}
Yandex
Объявления
05.01.2012, 21:15     указатели и выделение памяти массивам
Ответ Создать тему
Опции темы

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