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


Автор: ldsdilim 19.4.2007, 23:16
Люди кто сможет переделать сортировку в моей проге как в одномерном массиве, например
Исходный массив :
2 6 4
5 3 1
8 9 2
Конечный массив :
1 2 2
3 4 5
6 8 9
а то у меня никак не выходит.
Код

#include <iostream.h>
#include <conio.h>
#include<stdlib.h>
void main(void)
{
   clrscr();
   //создание
int r, c;
cout << "Введите количество строк массива";
cin >> r;
cout << "Введите количество столбцов массива";
cin >> c;
   int **a = new int *[r];
   for (int i = 0; i < r; i++)
      a[i] = new int[c];
   //заполнение
   for (i = 0; i < r; i++)
      for (int j = 0; j < c; j++)
     a[i][j] = random(3) + 2 ;
   //вывод
   for (i = 0; i < r; i++)
   {
      for (j = 0; j < c; j++)
     cout << a[i][j] << " ";
      cout << "\n";
   }
   //сортировка
   int elem, bufelem;
   for (i = 0; i < r; i++)
      for (j = 0; j < c; j++)
      {
     elem = a[i][j];
     bufelem = a[i][j+1];
     if(elem > bufelem)
     {
           int temp ;
           temp = a[i][j];
           a[i][j]=a[i][j+1];
           a[i][j+1]=temp;
     }
      }
      cout << "\n-----------------------\n";
    //вывод
   for (i = 0; i < r; i++)
   {
      for (j = 0; j < c; j++)
     cout << a[i][j] << " ";
      cout << "\n";
   }
   getch();
}


Автор: Maxx 20.4.2007, 04:33
А разве пузырек за один проход сортируется? Максимум, в твоем случа r+c. Минимум - смотри были ли обмены, если не было, прекращай сортировку.

Автор: ldsdilim 20.4.2007, 07:41
Да конечно за один проход пузырек не прокатит. 
Максимум, в твоем случа r+c. Минимум - смотри были ли обмены, если не было, прекращай сортировку.
Можешь написать это кодом?

Автор: ldsdilim 20.4.2007, 08:33
У меня вот че получилось,  но не выводит результат, а ошибку найти не могу :
Код

#include <iostream.h>
#include <conio.h>
#include<stdlib.h>
void zapolnenie(int **a, int nrow, int ncol)
   {
   for (int i = 1; i <= nrow; i++)
        for (int j = 1; j <= ncol; j++)
        a[i][j] = random(3) - 2 ;
   }
void main(void)
{
   
   int r = 200, c = 100;
   //память
   int **a = new int *[r];
   for (int i = 0; i < r; i++)
   a[i] = new int[c];
   zapolnenie(a, r, c);
   [color=blue]/*-----------------------------------------------------------*/
   int i1, j1, pr1, pr2, ik, jk, min,mn, bf;
   for(i = 0; i < r; i++)
   {
      for(int j = 0; j < c; j++)
      {
     ik = 0;
     jk = 0;
     min = a[i][j];
     j1 = j + 1;
     for(j1 = 1; j1 < 100; j1++)
     {
        if (min>a[i][j1])
        {
           min = a[i][j1];
           pr1 = j1;
        }
     }
     a[i][pr1] = a[i][j];
     a[i][j]=min;
      }

   }
   for(i = 0; i < r; i++)
   {
      mn = *a[i];
      min=a[i][1];
      i1 = i+1;
      for(int i1 = 0; i1 < r; i++)
      {
     if (min>a[i1][1])
     {
        mn = *a[i1];
        min = a[i1][1];
        pr1 = i1;
     }

      }
      a[pr1] = a[i];
      *a[i] = mn;
   }
   /*-----------------------------------------------------------*/[/color]   
for (i = 0; i < 10; i++)
   {
      for (int j = 0; j < 20; j++)
     cout << a[i][j] << " ";
      cout << "\n";
   }  
   while (!kbhit()) ;
}

И если понадобиться полное задание :
С помощью динамических переменных реализуйте вещественную матрицу размером
100 на 200.  Отсортируйте элементы массива по сквозному порядку их
размещения в матрице как в одномерном массиве. Выдайте на экран первую
подматрицу размером 10 на 20. Для сортировки используйте метод пузырька.

Автор: betal 20.4.2007, 11:49
Цитата(Maxx @  20.4.2007,  04:33 Найти цитируемый пост)
А разве пузырек за один проход сортируется? 

то скорее всего он хотел показать примеры на разных массивах )))

Добавлено @ 11:58
Цитата(ldsdilim @  19.4.2007,  23:16 Найти цитируемый пост)
Люди кто сможет переделать сортировку в моей проге как в одномерном массиве, например
Исходный массив :
2 6 4
5 3 1
8 9 2
Конечный массив :
1 2 2
3 4 5
6 8 9
а то у меня никак не выходит.

погодь ты могешь нормально сказать ? Те нужна функция сортирующяя методом пузырька по возростанию 2х мерный массив ???


если я тя прально понял то оть
Код

#include <conio.h>
# include <stdio.h>
#include <time.h>
#include <iostream.h>
#include <windows.h>
int Sozd(int **B,int n,int m)
{

for (int i=0; i<n; i++)
  {for (int j=0; j<m; j++)
{ B[i][j]=rand()%25;

}
}return **B;
}

int zamena(int **A,int n,int *B)
{
int k=0;
for (int i=0; i<n; i++)
  {for (int j=0; j<n; j++)
{  B[k]=A[i][j];
          k++;}
}return *B;
}



int sort(int c[],int n)
{ int hold;
//----------=)
for (int pass = 1; pass <=n - 1; pass++)
            for (int i=0; i<=n - 2; i++)

    if(c[i] > c[i + 1])
        {
            hold = c[i];
            c[i]=c[i + 1];
            c[i + 1]=hold;
        }

return *c;
}

void vuvod(int **B,int n,int m)
{


for (int i=0; i<n; i++)
{
    printf("\n");
for (int j=0; j<m; j++)
{printf("%5.1d",B[i][j]);
    
}}
cout<< "\n";
}
void main() 
{
 int i;
  int n=0;



int **A = new int *[5];
if (A!=NULL)
for ( i=0; i<5; i++)
    {
        A[i] = new int[5];
    if(A[i]==NULL)
        {    
            cout<<"exit "<<i;exit(1);
        }
    }

srand((unsigned)time(NULL));

    **A=Sozd(A,5,5);

    vuvod(A,5,5);

cout<<"\n";

int k=0;
int *B = new int [5*5];
    for ( i=0; i<5; i++)
        {
            for (int j=0; j<5; j++)
            {B[k]=A[i][j];k++;}
                                
                        
                    
        }

 cout<<"\n";
     printf("\t\n\n Vector B\n");
 
    printf("\t\n\n Vector B otsortirovan\n");
*B=sort(B,5*5);
int h=0;
for ( i=0; i<5; i++)
        
            for (int j=0; j<5; j++)
            {A[i][j] =B[h];
            h++;
            }
                vuvod(A,5,5);

cout<<"\n";

 delete []A;
delete []B;
}


 smile 

Автор: Валерия 20.4.2007, 22:39
Код
#include <stdio.h>
#include <conio.h>

void main(){
    int m[][3]={{2,6,4},{5,3,1},{8,9,2}};
    int i, j, temp;

    clrscr();

    for (i=0;i<3;i++){
        for (j=0;j<3;j++){
            printf("%d ", m[i][j]);
        }
        printf("\n");
    }

    for (i=0;i<9;i++){
        for (j=0;j<9;j++){
            if (m[0][i]<m[0][j]){
                temp=m[0][i];
                m[0][i]=m[0][j];
                m[0][j]=temp;
            }
        }
    }

    printf("\n");

    for (i=0;i<3;i++){
        for (j=0;j<3;j++){
            printf("%d ", m[i][j]);
        }
        printf("\n");
    }

    getch();
}


Под досовским компилером 3.0 точно работает smile

Автор: ldsdilim 22.4.2007, 09:25
Я вчера сделал эту задачу, но написать не мог инет-карта закончилась, всем кто помог спасибо. Вот код:

Код

# include <iostream.h>
# include <conio.h>
# include <stdio.h>
# include <stdlib.h>
# include <dos.h>
int** sort(int** ms)

int prv=1; int buf=0;
int ik=0; int jk=0;
while (prv)

prv=0;
for (int i=0; i<200; i++)

for (int j=0; j<100; j++)

if ((i==199)&&(j==99)) break;
if (j!=99) ik=i; jk=j+1;
else ik=i+1; jk=0;
if (ms[i][j]>ms[ik][jk])

    buf=ms[i][j];
    ms[i][j]=ms[ik][jk];
    ms[ik][jk]=buf;
    prv=1;




return ms;

void main (void)

clrscr();
randomize();
int** mas = new int*[200];
for (int i=0;i<200;i++)

mas[i]=new int[100];
for (int j=0;j<100;j++) mas[i][j]=random(999);

cout<<"\nИсходная подматрица\n"; for (i=0; i<20; i++)

    for (int j=0; j<10; j++)    printf("%4d|",mas[i][j]);    cout<<"\n";

    cout<<"\n";
    mas=sort(mas);
    getch();
    cout<<"\nПодматрица после сортировки\n";    for (i=0; i<20; i++)
    
    for (int j=0; j<10; j++)    printf("%4d|",mas[i][j]);
    cout<<"\n";
    
    delete[]mas; 
getch();

 

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