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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Chif
0 / 0 / 0
Регистрация: 04.04.2011
Сообщений: 35
#1

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

05.01.2012, 18:57. Просмотров 1626. Ответов 35
Метки нет (Все метки)

дана действительная матрица размером 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2012, 18:57     указатели и выделение памяти массивам
Посмотрите здесь:
C++ Указатели (Выделение памяти в куче)
C++ Указатели и динамическое выделение памяти
C++ Указатели С++. Динамическое выделение памяти
C++ Указатели и функции. Динамическое выделение памяти
C++ Указатели на строки. Выделение и освобождение памяти
C++ Указатели, выделение памяти для матрицы
Указатели, динамическое выделение памяти, работа с файлом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1747 / 1090 / 71
Регистрация: 13.09.2011
Сообщений: 3,120
05.01.2012, 19:14     указатели и выделение памяти массивам #2
Цитата Сообщение от Chif Посмотреть сообщение
ввод и вывод с помощью указателей
Точно так же, как с обычными статическими массивами.
C++
1
2
3
int **arr;
...
cin >> arr[4][7];
sandye51
программист С++
682 / 584 / 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++
3586 / 1366 / 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
Псевдослучайный
1747 / 1090 / 71
Регистрация: 13.09.2011
Сообщений: 3,120
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++
3586 / 1366 / 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-цу а затем домножение, расчитывал на деление, спасибо что обратили моё внимание
Миниатюры
указатели и выделение памяти массивам  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2012, 20:48     указатели и выделение памяти массивам
Еще ссылки по теме:
Принцип работы кода: указатели, выделение памяти C++
Вопрос по программе на тему: Массивы и указатели. Динамическое выделение памяти C++
Указатели, Динамическое выделение памяти, Ошибка invalid allocation size C++
Указатели, связной список (Linked List) и динамическое выделение памяти C++
Указатели, функции и динамическое выделение памяти: вывести строки с неповторяющимися данными C++

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

Или воспользуйтесь поиском по форуму:
Chif
0 / 0 / 0
Регистрация: 04.04.2011
Сообщений: 35
05.01.2012, 20:48  [ТС]     указатели и выделение памяти массивам #15
ну всеравно ведь не правильно, даже матрица не та выводится на экран
Yandex
Объявления
05.01.2012, 20:48     указатели и выделение памяти массивам
Ответ Создать тему
Опции темы

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