Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Динамический массив


Автор: Russian 8.4.2007, 16:18
Помогите заполнить динамический двумерный массив размерностью N x M и вывести его на печать? А также затем найти  номера последних отрицательных элементов каждой строки и каждого столбца. Заранее всем огромное спасибо!!!

Автор: Xenon 9.4.2007, 14:40
Номер в столбце? Тогда так:
Код

#include <iostream>

int main(int argc, char* argv[])
{
    int n = 0; //Количество рядов
    int m = 0; //Количество столбцов
    std::cout << "Enter n: ";
    std::cin >> n;
    std::cout << "Enter m: ";
    std::cin >> m;
    //Создаем массив
    int** arr = new int*[n];
    for (int i = 0; i < n; ++i) arr[i] = new int[m];
    //Заполняем массив
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)
        {
            std::cout << i << ' ' << j << ": ";
            std::cin >> arr[i][j];
        }
    }
    //Поиск отрицательных чисел в столбце
    std::cout << "In column:\n";
    for (int i = 0, index = - 1; i < m; ++i)
    {
        for (int j = 0; j < n; ++j) if (arr[j][i] < 0) index = j;
        if (index != - 1) std::cout << i << ") " << index << std::endl;
    }
    //Поиск отрицательного числа в строке
    std::cout << "In a row:\n";
    for (int i = 0, index = - 1; i < m; ++i)
    {
        for (int j = 0; j < n; ++j) if (arr[i][j] < 0) index = j;
        if (index != - 1) std::cout << i << ") " << index << std::endl;
    }
    //Удаляем массив
    for (int i = 0; i < n; ++i) delete [] arr[i];
    delete [] arr;
    _flushall(); 
    getchar();
    return 0;
}

[UPDATE] По ряды забыл

Автор: GIK 9.4.2007, 22:20
Вот еще вариан, програмулька выводит и сохраняет индексы последних отрицательных чисел в столбце:

Код

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

int main()
{  int i, j, n, m;
   cout<<"Vvedite kol-vo strok :";
   cin>>n;
   cout<<"Vvedite kol-vo stolbcov :";
   cin>>m;

   int **mas = new int*[n];
   for(i=0; i<n; i++)
     mas[i]=new int[m];

   cout<<"Vvedite znachenia massivov:"<<endl;
   for(i=0; i<n; i++){
     for(j=0; j<m; j++){
      cin>>mas[i][j];

     }
     cout<<endl;
   }
   cout<<"Vash massiv imeet vid:"<<endl;
   for(i=0; i<n; i++){
     for(j=0; j<m; j++){
      cout<<" "<<mas[i][j]<<" ";
     }  cout<<endl;
   }

   int *indBegin = new int[m]; 
   int *indEnd = new int[m]; 

    for(j=0; j<m; j++){
      indBegin[j]=-1;
      indEnd[j]=-1;
    }

   bool go=false;
   for(i=0; i<m; i++){
    for(j=0; j<n; j++)
    {
      if(mas[j][i]<0 && !go)
       {
         indBegin[i]=j; 
         indEnd[i]=j; 
         go=true;

       } else 
      if(mas[j][i]<0 && go)
       {
         indEnd[i]=j;
       }
      else
       { 
         go=false;
       }
   }
    go=false;
  }


   for(i=0; i<m; i++){
    cout<<"Poslednie otricatelnie ellementi stroki "<< i+1 <<" ";
    for(j=indBegin[i]; j<=indEnd[i]; j++){ 
     if(j!=-1) 
       cout<<" "<<mas[j][i];
    }
    cout<<endl;
   }

   for(i=0; i<n; i++){
    delete [] mas[i];
  }
    delete [] mas;
    delete indBegin;
    delete indEnd;

   getch();

    return 0;
}

Автор: Night_xxx 9.4.2007, 22:41
А вот и мой вариантик прилетает:

Код

#include "stdafx.h"
#include "iomanip.h"
#include "iomanip.h"
#include "stdlib.h"

void main()
{
    int N,M,i,j,l,stroca,stolbec;
    
    cout<<"N= "; cin>>N;
    cout<<"M= "; cin>>M;
    cout<<endl;
    
    int **mas=new int*[N];
    
    for (i = 0; i < N; i++)
    {
        mas[i] = new int[M];
    }
    
    for(i=0;i<N;i++)
    {
        for(j=0;j<M;j++)
        {
            cout<<"Enter mas# "<<i<<" "<<j<<"  "; 
            cin>>mas[i][j];
        }
        cout<<endl;
    }
    system("cls");
    
    cout<<"\t\t\t         mas\n\n";
    for(i=0;i<N;i++)
    {
        cout<<"\n\t\t\t";
        for(j=0;j<M;j++)
        {
            cout<<mas[i][j]<<"   ";
        }
        cout<<endl;
    }
    
    cout<<"\n------------------------------------------------------------------------------\n";
    
    for(i=0;i<N;i++)
    {
        for(j=0;j<M;j++)
        {
            if(mas[i][j]<0)
            {
                l=0; l=j+1;
            }
        }
        if(l!=0){cout<<"\nV stroce nomer "<<i+1<<" poslednii otricatelinii element imeet nomer "<<l;}
        cout<<endl;
    }
    
    cout<<"\n------------------------------------------------------------------------------\n";
    
    for(j=0;j<M;j++)
    {
        for(i=0;i<N;i++)
        {
            if(mas[i][j]<0)
            {
                l=0;l=i+1;
            }
        }
        if(l!=0){cout<<"\nV stolbce nomer "<<j+1<<" poslednii otricatelinii element imeet nomer "<<l;}
        cout<<endl;
    }
    cout<<endl;
    
    delete [] mas;
}


Добавлено через 1 минуту и 31 секунду
Приветик 
Xenon, 
Как жизнь?

Автор: GIK 9.4.2007, 22:54
Night_xxx, 
проверял хоть нет? smile
У меня вот совсем не то выдает... smile

Автор: Night_xxx 9.4.2007, 23:02
GIK, 

Конечно проверял и все правильно, а что не так???????????????????????????????

Автор: Xenon 9.4.2007, 23:11
Night_xxx, как минимум в цикле
Код

for(i=0;i<N;i++)
{
    for(j=0;j<M;j++)
    {
        if(mas[i][j]<0)
        {
            l=0; l=j+1;
        }
    }
    if(l!=0){cout<<"\nV stroce nomer "<<i+1<<" poslednii otricatelinii element imeet nomer "<<l;}
    cout<<endl;
}


При проверке условия
Код

if(l!=0){cout<<"\nV stroce nomer "<<i+1<<" poslednii otricatelinii element imeet nomer "<<l;}

Переменная l может быть не иницилизированна, что приведет совсем не к тому результату, что ты ожидаешь.

Автор: Night_xxx 9.4.2007, 23:17
Ну фигли ну тогда просто проинициализировать вначале нулем и все. Делов то господа!!!!!!!!

Код

#include "stdafx.h"
#include "iomanip.h"
#include "iomanip.h"
#include "stdlib.h"

void main()
{
    int N,M,i,j,l=0,stroca,stolbec;       //вот тут подправляем и все
    
    cout<<"N= "; cin>>N;
    cout<<"M= "; cin>>M;
    cout<<endl;
    
    int **mas=new int*[N];
    
    for (i = 0; i < N; i++)
    {
        mas[i] = new int[M];
    }
    
    for(i=0;i<N;i++)
    {
        for(j=0;j<M;j++)
        {
            cout<<"Enter mas# "<<i<<" "<<j<<"  "; 
            cin>>mas[i][j];
        }
        cout<<endl;
    }
    system("cls");
    
    cout<<"\t\t\t         mas\n\n";
    for(i=0;i<N;i++)
    {
        cout<<"\n\t\t\t";
        for(j=0;j<M;j++)
        {
            cout<<mas[i][j]<<"   ";
        }
        cout<<endl;
    }
    
    cout<<"\n------------------------------------------------------------------------------\n";
    
    for(i=0;i<N;i++)
    {
        for(j=0;j<M;j++)
        {
            if(mas[i][j]<0)
            {
                l=0; l=j+1;
            }
        }
        if(l!=0){cout<<"\nV stroce nomer "<<i+1<<" poslednii otricatelinii element imeet nomer "<<l;}
        cout<<endl;
    }
    
    cout<<"\n------------------------------------------------------------------------------\n";
    
    for(j=0;j<M;j++)
    {
        for(i=0;i<N;i++)
        {
            if(mas[i][j]<0)
            {
                l=0;l=i+1;
            }
        }
        if(l!=0){cout<<"\nV stolbce nomer "<<j+1<<" poslednii otricatelinii element imeet nomer "<<l;}
        cout<<endl;
    }
    cout<<endl;
    
    delete [] mas;
}

Автор: GIK 9.4.2007, 23:18
Может у меня компилер старый, но булдер 6 выдает не корректные результаты.
К примеру если вводить не отрицательные числа, то выдает
V stroce nomer poslednii otricatelinii element imeet nomer :1223213123
т.е. многозначное число.
И если вводить отрицательные числа, то выдает тоже не корректный результат.
Может я что-то не првильно делаю, но я вставил в код только  
getch();
чтобы проверить что выдает.

Автор: Xenon 9.4.2007, 23:23
Night_xxx, ты уверен? Тестил? А вот это все что?
Цитата

                        4   5   -4

                        5   6   -4

                        3   2   5

                        -2   5   4
---------------------------------------------------------------------------
V stroce nomer 1 poslednii otricatelinii element imeet nomer 3
V stroce nomer 2 poslednii otricatelinii element imeet nomer 3
V stroce nomer 3 poslednii otricatelinii element imeet nomer 3?
V stroce nomer 4 poslednii otricatelinii element imeet nomer 1
---------------------------------------------------------------------------
V stolbce nomer 1 poslednii otricatelinii element imeet nomer 4
V stolbce nomer 2 poslednii otricatelinii element imeet nomer 4?
V stolbce nomer 3 poslednii otricatelinii element imeet nomer 2


Цитата

                        1   2   -4

                        1   2   4

                        1   3   -5

---------------------------------------------------------------
V stroce nomer 1 poslednii otricatelinii element imeet nomer 3
V stroce nomer 2 poslednii otricatelinii element imeet nomer 3 ?
V stroce nomer 3 poslednii otricatelinii element imeet nomer 3
---------------------------------------------------------------
V stolbce nomer 1 poslednii otricatelinii element imeet nomer 3 ?
V stolbce nomer 2 poslednii otricatelinii element imeet nomer 3 ?
V stolbce nomer 3 poslednii otricatelinii element imeet nomer 3

Автор: Night_xxx 9.4.2007, 23:34
Да вы меня поражаете господа из-за такой мелочи подняли кипиш : "АААААААА караул ошибка!!!!!!!!!"
Смотрите только что вписать и все!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Код

#include "stdafx.h"
#include "iomanip.h"
#include "iomanip.h"
#include "stdlib.h"

void main()
{
    int N,M,i,j,l=0,stroca,stolbec;     
    
    cout<<"N= "; cin>>N;
    cout<<"M= "; cin>>M;
    cout<<endl;
    
    int **mas=new int*[N];
    
    for (i = 0; i < N; i++)
    {
        mas[i] = new int[M];
    }
    
    for(i=0;i<N;i++)
    {
        for(j=0;j<M;j++)
        {
            cout<<"Enter mas# "<<i<<" "<<j<<"  "; 
            cin>>mas[i][j];
        }
        cout<<endl;
    }
    system("cls");
    
    cout<<"\t\t\t         mas\n\n";
    for(i=0;i<N;i++)
    {
        cout<<"\n\t\t\t";
        for(j=0;j<M;j++)
        {
            cout<<mas[i][j]<<"   ";
        }
        cout<<endl;
    }
    
    cout<<"\n------------------------------------------------------------------------------\n";
    
    for(i=0;i<N;i++)
    {
        for(j=0;j<M;j++)
        {
            if(mas[i][j]<0)
            {
                l=0; l=j+1;
            }
        }
        if(l!=0){cout<<"\nV stroce nomer "<<i+1<<" poslednii otricatelinii element imeet nomer "<<l; l=0;}
        cout<<endl;
    }
    
    cout<<"\n------------------------------------------------------------------------------\n";
    
    for(j=0;j<M;j++)
    {
        for(i=0;i<N;i++)
        {
            if(mas[i][j]<0)
            {
                l=0;l=i+1;
            }
        }
        if(l!=0){cout<<"\nV stolbce nomer "<<j+1<<" poslednii otricatelinii element imeet nomer "<<l; l=0;}     //l=0
        cout<<endl;
    }
    cout<<endl;
    
    delete [] mas;
}


Добавлено через 2 минуты
Да увидеть эту мелочь проще простого. Ну а Xenon аж не потрудился выделить. Да ну даете!!!!!!! smile 

Автор: Xenon 9.4.2007, 23:37
Ну, просто существует такая традиция - код сначала отлаживают локально, потом выкладывают рабочую версию, а не исправляют по ходу действия. Человеку эту задачу сдавать же.

Автор: Night_xxx 9.4.2007, 23:42
Так я говору про то что вот например посмотрели вы сразу написанную мною программку.
И вот увидели вы сразу ошибочку, точнее недочет и нет чтобы дописать дескать вот ещё вот это надо дописать вы начали ААААА
да тут вот же какая ошибка!!!!!!
  
Ну ведь секундное исправление и все!!!!  Я вас не понимаю

Автор: Xenon 9.4.2007, 23:52
Night_xxx, я тебе на одну ошибку указал. К тому же не всем хочется рыться в чужом коде, поэтому тебя просто проинформировали, мол, ошибка у тебя, чувак - ищи.

Автор: Night_xxx 9.4.2007, 23:55

А что у меня код непонятно написан?
Xenon, 

Автор: Xenon 10.4.2007, 00:03
Night_xxx, обижайся не обижайся но, если честно, не самым разумным образом (эти определения/объявления переменных в стиле Паскаль и транслит). Но суть отчасти не в этом, а просто банально в том, что лень копаться. Никто из твоей ошибки трагедии не делает.

Автор: Night_xxx 10.4.2007, 00:08
Уфффффффф да не было у меня ОШИБКИ 
У меня был НЕ-ДОЧЕТ И БСЕ

Автор: popovda 10.4.2007, 14:13
На деле недочет опаснее - его найти труднее.

Самые лучшие ошибки - это синтаксические. Их компилятор ловит smile 

Автор: Night_xxx 10.4.2007, 18:45
Это не тот случай, сделай найти мелкий недочет можно одним взглядом.

Автор: Xenon 10.4.2007, 19:48
Night_xxx, что ты все отмазываешься? Признал бы ошибку и все.

Автор: Night_xxx 10.4.2007, 20:04
Бл...................... ты 
Xenon, 
походу вообще не знаешь че такое ошибка если считаешь что в моей задачке я допустил ошибку не обнулив переменную l.
Да если это по-твоему мнению ошибка, то я тебе сочувствую.

Автор: Alexeis 10.4.2007, 21:04
Модератор: прекращайте оффтоп.
  Старайтесь быть взаимовежливыми.

Автор: Russian 13.4.2007, 21:36
А что делать, если надо массив заполнить в главной функции, затем передать его в другую функцию, которая уже и считает последние отрицательные элементы?

Автор: Xenon 14.4.2007, 00:57
Код

void count_in_col(int** arr, int n, int m)
{
    for (int i = 0, index = - 1; i < m; ++i) // index = -1 заведомо неверно, так как отрицательных индексов у массивов нет. Если index будет равен -1 после цикла, значит не нашли отрицательных чисел
    {
        for (int j = 0; j < n; ++j) if (arr[j][i] < 0) index = j;
        if (index != - 1) std::cout << i << ") " << index << std::endl;
        index = -1;
    }
}

void count_in_row(int** arr, int n, int m)
{
    for (int i = 0, index = - 1; i < n; ++i)
    {
        for (int j = 0; j < m; ++j) if (arr[i][j] < 0) index = j;
        if (index != - 1) std::cout << i << ") " << index << std::endl;
        index = -1;
    }
}
int main(int argc, char* argv[])
{
    int n = 0; //Количество рядов
    int m = 0; //Количество столбцов
    std::cout << "Enter n: ";
    std::cin >> n;
    std::cout << "Enter m: ";
    std::cin >> m;
    //Создаем массив
    int** arr = new int*[n];
    for (int i = 0; i < n; ++i) arr[i] = new int[m];
    //Заполняем массив
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)
        {
            std::cout << i << ' ' << j << ": ";
            std::cin >> arr[i][j];
        }
    }
    std::cout << "Matrix:\n";
    //Наглядно покажем матрицу
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)    std::cout << arr[i][j] << ' ';
        std::cout << std::endl;
    }
    //Поиск отрицательных чисел в столбце
    std::cout << "In column:\n";
    count_in_col(arr,n,m);
    //Поиск отрицательного числа в строке
    std::cout << "In a row:\n";
    count_in_row(arr,n,m);
    //Удаляем массив
    for (int i = 0; i < n; ++i) delete [] arr[i];
    delete [] arr;
    getchar();
    return 0;
}

Автор: qqqq20007 16.4.2007, 17:50
 smile HELP!!
функция которая находит сумму элементов динамического массива.

Автор: Xenon 16.4.2007, 18:41
Код

#include <iostream>

int summ(int arr[], int size, int sum = 0 )
{
    if(size == 0) return sum;
    sum += arr[size-1];
    summ(arr, --size, sum);
}

int main(int argc, char* argv[])
{
    int size = 0;
    std::cout << "Enter size of array: ";
    std::cin >> size;
    int* arr = new int[size];
    for (int i = 0; i < size; ++i)
    {
        std::cout << i << ") ";
        std::cin >> arr[i];
    }
    std::cout << "Sum of all elements is " << summ(arr, size);
    delete [] arr;
    _flushall();
    getchar();
    return 0;
}


Автор: qqqq20007 16.4.2007, 19:08
 smile  smile Спасиба!!!   smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)