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

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

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

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

05.01.2012, 18:57. Просмотров 1714. Ответов 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 заранее спасибо
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2012, 18:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос указатели и выделение памяти массивам (C++):

Указатели и динамическое выделение памяти - C++
Нужно заполнить массив из 200 элементов числами на промежутке , и найти последовательность из 10 элементов у которых наибольшее срееднее...

Указатели (Выделение памяти в куче) - C++
Чтобы создать в динамически распределяемой памяти переменную типа unsigned short необходимо написать следующее: unsigned short...

Указатели С++. Динамическое выделение памяти - C++
Не пойму, почему перед квадратными скобками нужна звездочка? int **memoryAddr = new int *; Звездочка при работе с указателями несет смысл...

Указатели, выделение памяти для матрицы - C++
Ребята , nомогите nожалуйста , что означают эти заnиси, nросто не могу ни где найти обьяснения. Знаю что 1-е это выделяет nамять для...

Указатели на строки. Выделение и освобождение памяти - C++
Всем добрый день. Есть два указателя на char. Для первого выделяется память а у второго просто делаем копию с первого. Для 1-го...

Указатели и функции. Динамическое выделение памяти - C++
1) Напишите программу, которая позволяет вводить динамический одно-мерный целочисленный массив и посредством вызова функции опреде-лять...

35
-=ЮрА=-
Заблокирован
Автор 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;
}
1
NoMasters
Псевдослучайный
1899 / 1110 / 74
Регистрация: 13.09.2011
Сообщений: 3,158
05.01.2012, 20:51 #17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
C++
1
b[i] = (sum/(1.0*n));
C++
1
b[i] = sum/(float)n;
0
go
05.01.2012, 21:00
  #18

Не по теме:

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

0
-=ЮрА=-
Заблокирован
Автор FAQ
05.01.2012, 21:03 #19
Chif, я понял такое ощущение что строки со столбцами перевернулись сейчас, я сам только увидел
0
alkagolik
Заблокирован
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;
}
0
-=ЮрА=-
05.01.2012, 21:17
  #21

Не по теме:

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

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

1
go
Эксперт С++
3586 / 1366 / 129
Регистрация: 16.04.2009
Сообщений: 4,527
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/82a9ea5c347311f4a6294de890388e89
1
alkagolik
Заблокирован
05.01.2012, 21:32 #23
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
alkagolik, да тут прикол в том чтобы индексация по указателю была
пусть ТС и занимается разыменовыванием. а еще в нагрузку косвенной адресацией.

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

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

Не по теме:

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

1
-=ЮрА=-
Заблокирован
Автор 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]
1
Миниатюры
указатели и выделение памяти массивам  
05.01.2012, 22:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2012, 22:10
Привет! Вот еще темы с ответами:

Указатели, динамическое выделение памяти, работа с файлом - C++
Программа должна предоставлять возможность нескольким пользователям работать с числовыми данными. Сведения о пользователях должны храниться...

Принцип работы кода: указатели, выделение памяти - C++
Объясните мне что делает этот код: p = new int ; И вот этот, пожалуйста: struct DList{ int m; DList *p};

Указатели, связной список (Linked List) и динамическое выделение памяти - C++
Я вообще не понимаю как сделать. Ребят! Помогите, как сможете! /* Написать связной список используя структуры и функции Позволить...

Вопрос по программе на тему: Массивы и указатели. Динамическое выделение памяти - C++
народ, очень прошу! пожалуйста! Помогите решить задачку на тему: Массивы и указатели. Динамическое выделение памяти Вот задача. ...


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

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

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