Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двумерный массив, как ввести 
V
    Опции темы
Palladin
Дата 23.1.2007, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: нет
Всего: 17



Как вести\вывести\работать с двумерным\n-мерным массивом через указатели?????

Borland C++ Builder 6-консольные приложения


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
nworm
Дата 23.1.2007, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: 1
Всего: 8



 smile  Да как обычно, например, в help.

Код

// ALLOCATE A TWO-DIMENSIONAL SPACE, INITIALIZE, AND DELETE IT.

#include <exception>
#include <iostream>

using std::cout;
using std::endl;
void display(long double **);
void de_allocate(long double **);

int m = 3;                               // THE NUMBER OF ROWS.
int n = 5;                               // THE NUMBER OF COLUMNS.

int main(void) {
   long double **data;

   try {                                 // TEST FOR EXCEPTIONS.
      data = new long double*[m];        // STEP 1: SET UP THE ROWS.
      for (int j = 0; j < m; j++)

          data[j] = new long double[n];  // STEP 2: SET UP THE COLUMNS
      }
   catch (std::bad_alloc) {  // ENTER THIS BLOCK ONLY IF bad_alloc IS THROWN.
      // YOU COULD REQUEST OTHER ACTIONS BEFORE TERMINATING
      cout << "Could not allocate. Bye ...";
      exit(-1);
      }

   for (int i = 0; i < m; i++)
      for (int j = 0; j < n; j++)
          data[i][j] = i + j;            // ARBITRARY INITIALIZATION

   display(data);
   de_allocate(data);
   return 0;

   }

void display(long double **data) {
   for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++)
             cout << data[i][j] << " ";
       cout << "\n" << endl;
       }
   }

void de_allocate(long double **data) {
   for (int i = 0; i < m;  i++)
       delete[] data[i];                 // STEP 1: DELETE THE COLUMNS

   delete[] data;                        // STEP 2: DELETE THE ROWS

   }

PM MAIL WWW   Вверх
_hunter
Дата 23.1.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



точно так же как и одномерный не через указатели (только для каждой строки массива операцию ввода придется повторить).
в чем проблема-то?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Palladin
Дата 23.1.2007, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: нет
Всего: 17



Проблема с указателями, чет я их туго понимаюsmile и хелп этот тож чето не катит, короче плз решите здесь оч легкую задача, скажем дана матрица посчитать сумму элиментов главной диагонали и поменять местами  эллименты a[0][0] c a[n][m] к примеру конечно, можно любую другую, просто хочу задача в которой был бы ввод\вывод\и какоенить взаимодействие с таким массивом.... smile  


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
S.A.G.
Дата 23.1.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



RooR, загляни в любую книгу или справку. То что мы напишем тебе здесь не сильно будет отличаться от того что написали тебе там.


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Palladin
Дата 23.1.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: нет
Всего: 17



ну вообще то я уже заглядывал в различные методички и книги(2) и там примеры только с одномерными.... вообщем еси б поиск такой литературы был бы для меня простым делом я б здесь не писал


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Rockie
Дата 23.1.2007, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Код

#include <iostream>

using std::cin;
using std::cout;


void DisplayArray(int **mas, int rows, int cols)
{
    for(int i = 0;i<rows;i++)
    {
        for(int j=0;j<cols;j++)
         cout<<mas[i][j]<<' ';
        cout<<'\n';
    }
}


int main()
{
    int rows = 0, cols = 0, **mas;

    cout<<"Enter rows ";          // строки
    cin>>rows;
    cout<<"Enter cols ";          // колонки
    cin>>cols;

    mas = new int* [rows];        // память под массив указателей на строки
    for(int i=0;i<rows;i++)
          {  mas[i] = new int[cols];  // на каждый указатель выделяем память под столбцы
          }

    for(int i=0;i<rows;i++)     // заполним для приличия
         for(int j=0;j<cols;j++)
           mas[i][j]= 3;

       DisplayArray(mas, rows, cols);  // передаем уазатель на массив и его размеры на "распечатку"


    for(int i=0;i<rows;i++)       // убиваем память под столбцы
      delete [] mas[i];
        // но у нас еще осталась линейка указателей на строки, ее тоже удаляем
    delete [] mas;

        // занавес :)
    return 0;
}


Добавлено @ 20:46 
то есть в памяти нечто наподобие:
**mas -> [*int ]->[int][int][int]
                [*int ]->[int][int][int]
                [*int ]->[int][int][int]





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Palladin
Дата 23.1.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: нет
Всего: 17



О вот эт более менее, сенкс есть над чем работать,у мя 7 программ сделать надо на матрциы с указателями, ща буду разбиратся, сенкс ещё раз


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Palladin
Дата 24.1.2007, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: нет
Всего: 17



Вот моя "программа":

Код

#include<iostream>
#include<conio.h>
using namespace std;

int vvod(int **a,int n);
int raschet(int **a,int n);
int vivod(int **a,int n);

int main()
{
int n,**a;
vvod(a,n);
raschet(a,n);
vivod(a,n);
}


int vvod(int **a,int n)
{
int i,j;
cout<<"Vvedite razmernost: ";
cin>>n;
a=new int*[n];
for(i=0;i<n;i++)
a[i]=new int(n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cout<<"A["<<i<<"]["<<j<<"]= ";
cin>>a[i][j];
}
return(a,n);
}

int raschet(int **a,int n)
{
int t,y,r,p;
int i,j;
t=0;y=0;r=0;p=0;

for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
p+=a[i][j]*a[i][j];
}
if(p==1){y++; p=0;}else{p=0;}
}

for(i=0;i<n-1;i++)
{
for(j=0;j<n;j++)
{
p+=a[i][j]*a[i+1][j];
}
if(p==0){p=0;r++;}else p=0;
}
if(r==n-1)y=(y+n);
if(y==2*n){cout<<"Matrica ortonormirovannaya!!!! "<<endl;}else{cout<<"Matrica ne ortonormirovannaya!!!!"<<endl;}
return(a,n);
}


int vivod(int **a,int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<a[i][j];
cout<<endl;
}
}
for(int i=0;i<n;i++)
delete [] a[i];
delete [] a;

getch();
return 0;
}



при работе после ввода массива выдает ошибку и указывает на эту строку:
Код

p+=a[i][j]*a[i][j];


чет не пойму в чем проблема, может я из функции возвращаю не так массив????

вообщем хелп smile  smile  smile 


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
zkv
Дата 24.1.2007, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



не вдумывался в логику, просто синтаксис:
Код

//форматированный код легче читается, так на всякий случай...
#include<iostream>
#include<conio.h>
using namespace std;
//параметры в вашем случае следует передавать по ссылке, а не по значению
void vvod(int **&a,int &n);
void raschet(int **&a,int &n);
void vivod(int **&a,int &n);

int main()
{
    int n = 0,**a = NULL;
    vvod(a,n);
    raschet(a,n);
    vivod(a,n);
}


void vvod(int **&a,int &n)
{
    int i,j;
    cout<<"Vvedite razmernost: ";
    cin>>n;
    a=new int*[n];
    for(i=0;i<n;i++)
        a[i]=new int[n];
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
            cout<<"A["<<i<<"]["<<j<<"]= ";
            cin>>a[i][j];
        }
}

void raschet(int **&a,int &n)
{
    int t,y,r,p;
    int i,j;
    t=0;
    y=0;
    r=0;
    p=0;

    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
            p+=a[i][j]*a[i][j];
        if(p==1)
        {
            y++; 
            p=0;
        }
        else
            p=0;
    }

    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n;j++)
            p+=a[i][j]*a[i+1][j];
        if(p==0)
        {
            p=0;
            r++;
        }
        else 
            p=0;
    }
    if(r==n-1)
        y=(y+n);
    if(y==2*n)
        cout<<"Matrica ortonormirovannaya!!!! "<<endl;
    else
        cout<<"Matrica ne ortonormirovannaya!!!!"<<endl;
}


void vivod(int **&a,int &n)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            cout<<a[i][j];
            cout<<"\t";
        }
        cout<<"\n";
    }
    for(int i=0;i<n;i++)
        delete [] a[i];
    delete [] a;
    getch();
}

PM MAIL   Вверх
Partizan
Дата 24.1.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



в чём прикол передавать двумерный массив так int **&a??? 


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
zkv
Дата 24.1.2007, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Partizan @  24.1.2007,  10:48 Найти цитируемый пост)
в чём прикол передавать двумерный массив так int **&a??? 

я был немного неточен, по ссылке нужно передавать двумерный массив только в первую функцию void vvod(int **&a,int &n); в остальные можно по значению, спросите "почему?", думаю поймете сами если повнимательней посмотрите в код.
те прототипы могут быть такими:
Код

void vvod(int **&a,int &n);
void raschet(int **a,int n);
void vivod(int **a,int n);


Это сообщение отредактировал(а) zkv - 24.1.2007, 11:18
PM MAIL   Вверх
Palladin
Дата 24.1.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: нет
Всего: 17



Угу, вот теперь норм, сенкс smile 


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
threef
Дата 24.1.2007, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



еще у тебя была ошибка в 25-й строке:
Цитата

Код

a[i]=new int(n);// нужно  int[n]


PM MAIL   Вверх
Palladin
Дата 24.1.2007, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: нет
Всего: 17



[censored 2] раз я написал что все уже пашет значит ошибок нет или я исправил ошибкиsmile)) но ты прав такая форма записи не верная smile 


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1094 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.