Форум программистов, компьютерный форум 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
05.01.2012, 21:17     указатели и выделение памяти массивам
  #21

Не по теме:

alkagolik, да тут прикол в том чтобы индексация по указателю была

Цитата Сообщение от alkagolik Посмотреть сообщение
arr[ i ][ j ]
- а это прямое обрщние

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
05.01.2012, 21:18     указатели и выделение памяти массивам #22
-=ЮрА=-, не видя Вашу репутацию, подумал бы что новичок. Только легкий пример столько
мусолите.
Вот реализация.

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>
#include <ctime>
 
int main ()
{
   srand (time(NULL));
   int rows = 5;
   int columns = 5;
   int *arr = new int [rows * columns];
   int i, j;
   double *b = new double [rows];
   double mid;
   
   for ( i = 0 ; i < rows ; ++i )
   {
      mid = 0.0;
      for ( j = 0 ; j < columns ; ++j )
      {
         *(arr + i*columns + j) =  rand () % 10;
         mid += *(arr + i*columns + j);
         std::cout <<  *(arr + i*columns + j) << " ";
      }
      *(b + i) = mid / columns;
      std::cout << std::endl;
   }
   
   for ( i = 0 ; i < rows ; ++i )
      std::cout << *(b + i) << " ";
      
   std::cout << std::endl;
   return 0;
}
Добавлено через 12 секунд
http://liveworkspace.org/code/82a9ea...294de890388e89
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.01.2012, 21:32     указатели и выделение памяти массивам #23
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
alkagolik, да тут прикол в том чтобы индексация по указателю была
пусть ТС и занимается разыменовыванием. а еще в нагрузку косвенной адресацией.

Добавлено через 1 минуту
go, по твоему подходу можно вообще так написать
C
1
2
3
4
while ( i < n * m ) {
    *arr++ =  rand () % 10;
    ++i;
}
-=ЮрА=-
Заблокирован
Автор FAQ
05.01.2012, 21:35     указатели и выделение памяти массивам #24
Chif, вот в чём вся загвоздка была, указатель не тот на элемент строки был
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
*((*mat + i) + j)
а выходит вот так надо (*(*mat + i) + j), сейчас исправляю, см скрин дебага что есть что
go, реально отвянь со своей однострочной реализацией, двумерный массив это не одномерный, да можно решить через одномерный но задание стоит совершинно по иному
Цитата Сообщение от Chif Посмотреть сообщение
дана действительная матрица размером m x n
у тебя же вектор из m*n элементов. Не мешай работать
Миниатюры
указатели и выделение памяти массивам  
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
05.01.2012, 21:39     указатели и выделение памяти массивам #25
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
go, реально отвянь со своей однострочной реализацией, двумерный массив это не одномерный, да можно решить через одномерный но задание стоит совершинно по иному
Читайте внимательно. В задании ничего про двумерный массив не говорится. Эх, пустознон.
-=ЮрА=-
Заблокирован
Автор FAQ
05.01.2012, 21:44     указатели и выделение памяти массивам #26
go,
Цитата Сообщение от Chif Посмотреть сообщение
равные соответственно значениям средних арифметических элементов строк.
- это какой такой вектор со строками???
Цитата Сообщение от go Посмотреть сообщение
Эх, пустознон.
- ты сам о себе наверное...
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
05.01.2012, 21:55     указатели и выделение памяти массивам #27
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- это какой такой вектор со строками???
Это матрица, реализованная на одномерном массиве.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а выходит вот так надо (*(*mat + i) + j),
чего-чего? нет не так
Так и быть, чтобы Вы не мучелись
C++
1
*( *(arr + i) + j)
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.01.2012, 21:57     указатели и выделение памяти массивам #28
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Не мешай работать
greeezz
05.01.2012, 22:05
  #29

Не по теме:

go,
alkagolik, это не сам Юра, это кто-то нагло пользуется его экаунтом на форуме.

-=ЮрА=-
Заблокирован
Автор FAQ
05.01.2012, 22:10     указатели и выделение памяти массивам #30
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 <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];//Память под средние арифметические
    for(i = 0; i < m; i++)
    {
        mat[i] = new int[n];//память под эдементы строки
        for(j = 0,b[i] = 0; j < n; j++)
        {
            cout<<"mat["<<i + 1<<"]["<<j + 1<<"] = ";
            cin>>mat[i][j];
            b[i] += (*(*mat + i) + j);//Накпливаем сумму єлементов строки
        }
        b[i] /= 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;
}
К сожалению cin>> ни в какую не хочет воспринимать (*(*mat + i) + j), поэтому ввод у меня всё же с прямой индаксацией cin>>mat[i][j], однако накопление суммы выполнено на базе указателей
b[i] += (*(*mat + i) + j);
Пока я вам не могу ответить почему ввод (*(*mat + i) + j); не поддерживается студией, хотя это тотже самый mat[i][j]
Миниатюры
указатели и выделение памяти массивам  
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.01.2012, 22:12     указатели и выделение памяти массивам #31
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Пока я вам не могу ответить почему ввод (*(*mat + i) + j); не поддерживается студией
это вроде как некорректно, так должно быть
C
1
*( *( mat + i ) +  j );
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
05.01.2012, 22:14     указатели и выделение памяти массивам #32
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
К сожалению cin>> ни в какую не хочет воспринимать (*(*mat + i) + j)
C++
1
cin>>*( *(mat + i) + j);  //работает
з.ы. пока писал товарищ alkagolik ответил
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
05.01.2012, 22:14     указатели и выделение памяти массивам #33
C++
1
(*(*mat + i) + j)
это
C++
1
mat[0][i] + j
-=ЮрА=-
05.01.2012, 22:14
  #34

Не по теме:

greeezz, нет это я сам сижу на форуме не нужно переживать...

go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
05.01.2012, 22:19     указатели и выделение памяти массивам #35
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
К сожалению cin>> ни в какую не хочет воспринимать (*(*mat + i) + j),
Да, ладно. Пробуйте (я же подсказывал Вам как надо, а Вы опять за свое)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
int main ()
{
   int rows = 5;
   int columns = 5;
   int **arr = new int* [rows];
   int i = 1, j = 1; //arr[1][1]
 
   for ( i = 0 ; i < rows ; ++i )
      *(arr + i) = new int [columns];
 
   i = 1;
   j = 1;
   std::cin >> *( *(arr + i ) + j);
 
 
   std::cout << arr[i][j];
 
   std::system("pause");
    return 0;
}

Не по теме:

Потешили меня на славу.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2012, 22:52     указатели и выделение памяти массивам
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Chif
0 / 0 / 0
Регистрация: 04.04.2011
Сообщений: 35
05.01.2012, 22:52  [ТС]     указатели и выделение памяти массивам #36
целые дебаты вышли))

Всем спасибо кто помог, разобрался закомпилил.
Yandex
Объявления
05.01.2012, 22:52     указатели и выделение памяти массивам
Ответ Создать тему
Опции темы

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