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


Автор: Totroc 20.5.2012, 16:21
Сильно извиняюсь, за созданную еще раз тему, но в названии темы не указал [C++]

С++(дин массивы, указатели)

Дана матрицы целых чисел, m*n, эл-ты вводятся пользователем. 
Критерий сортировки: расположить строки матрицы в порядке убывания суммы модулей элементов строк 

Функция Summ (считает сумму модулей эл-тов в строке) - ее вызываю в insert_sort, чтобы создать массив сумм строк эл-тов матрицы.
Но вот не могу понять, как в insert_sort, добавить этот критерий (Summ)сортировки, чтобы было так:

Должно выглядеть так:
1 2 3                   7 8 9
4 5 6                   4 5 6
7 8 9   ____>>   1 2 3

Помогите пожалуйста.

Код

#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
int m,n;    // высота и ширина матрицы
//---------------------------------------------------------------------------------------------------------------------------------//
int** input()      // ввод матрицы
{ 
int i = 0, j = 0;
int** matrix;
printf("Введите n(ширину матрицы)\n");
    while((scanf("%ud", &n) !=1) || (n<0))
    {
        printf("Ошибка ввода, введите заново(не корректное или отрицат значение) \n");
                    fflush(stdin);
    }
    printf("Введите m(высоту матрицы): ");
    while((scanf("%ud", &m) != 1) || (m < 0))
    {
       printf("Ошибка ввода, введите заново(не корректное или отрицат значение) \n");
                    fflush(stdin);
    }
matrix = new int*[n];          // дин. амтрица
for(i=0; i < n; i++) 
{
matrix[i] = new int[m];
}
for(i=0; i < n; i++) 
{
for(j=0; j < m; j++) 
{ printf("\n"); 
printf("Введите значение эл-та матрицы matrix[%d,%d]=",i,j);
while (scanf("%d",&matrix[i][j])!=1)
{
    printf("Ошибка ввода\n");
    fflush(stdin);
}
}
}
return matrix;
}
//-----------------------------------------------------------------------------------------------------------------//
void output(int** matrix)          // ф-ия вывода
{
    printf("Вывод матрицы:\n");
for(int i=0; i < n; i++) 
{
printf("\n"); 
for(int j=0; j < m; j++) 
{ 
printf(" %d ",matrix[i][j]);
}
}
}
//-------------------------------------------------------------------------------------------------------------//
int Summ(int* matrstr)    // сумма эл-тов строк матрицы
{ 
int Sum = 0;
for(int j=0; j<m; j++)
{
Sum = Sum + matrstr[j];     // сумма эл-тов в строке
}
return Sum;
} 
//_____________________________Соритровка Вставками___________________________//
void insert_sort(int *a, int** matrix, int N, int M) 
{
    int k;
   
    for (int i = 0; i < n; i++)     // создаем массив из суммы эл-тов строк
    {
        for (int j = 0; j < m; j++)
        {
            k = Summ(*matrix);
        }
        a[i] = k;
    }
    /*for (int i = 0; i < n; i++)
        {
            if (a[i] > a[i + 1])
                {
                            /*int temp = a[i];
                            a[i] = a[i + 1];
                            a[i + 1] = temp; */
                    /*int temp = *matrix[i];
                    *matrix[i] = *matrix[i+1];
                    *matrix[i+1] = temp;
                }  */
            for(int *q=a+1; q<a+N; q++) 
                {
                    int x = *q;          // инициализируем временную переменную текущим значением элемента массива
                    int *p = q-1;      //запоминаем индекс предыдущего элемента массива
                    while(p>=a && *p<x)    // пока индекс не равен 0 и предыдущий элемент массива МЕНЬШЕ(*p<x) текущего
                            
                        *(p+1) = *p--;     // перестановка элементов массива
                            *(++p) = x;
        
                                        
                }
            insert_sort(a,matrix,n,m);
        }
void main()
{ 
    setlocale(LC_ALL, "Russian");
int exit=0,readkey=0;
do 
{
int**matrix=input();
output(matrix);
printf("\nВведите 1 для начала сортировки:");
scanf("%d",&readkey);
insert_sort(*matrix,matrix,n,m);
printf("\n");
output(matrix);
for(int i=0; i < m; i++) 
{
delete[] matrix[i];
}
delete[] matrix;
printf("\n Введите 1 для выхода:");
do 
fflush(stdin);
while (scanf("%d",&exit)!=1);
if (exit) 
return;
}
while (1);
}

Автор: t_gran 21.5.2012, 03:52
Писал на C, но думаю вам подойдёт. Ввод с клавиатуры слишком муторный, поэтому я заменил его на случайную генерацию чисел. В принципе у вас есть функция ввод и, я думаю, вы сможете её прикрутить.
Что косается алгоритма сортировки, признаюсь, немного поленился и в результате на каждом новом проходе поиска максимального числа сумма вычисляется заново, что есть не хорошо. Использовал сортировку выбором.
Код

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//----------------------------------------------//
int** NewArray(int*** arr, size_t m, size_t n)
{
   (*arr) = (int**) malloc(sizeof(int*) * m);
   size_t i;
   for (i=0; i<m; ++i)
   {
      (*arr)[i] = (int*) malloc(sizeof(int) * n);
   }
   return (*arr);
}
//----------------------------------------------//
void FreeArray(int*** arr, size_t m, size_t n)
{
   size_t i;
   for (i=0; i<m; ++i)
   {
      free(&(*arr)[i]);
   }
   free(*arr);

   (*arr) = NULL;
}
//----------------------------------------------//
void Generate(int** arr, size_t m, size_t n)
{
   srand(time(NULL));
   size_t i, j;
   for (i=0; i<m; ++i)
   {
      for (j=0; j<n; ++j)
      {
         arr[i][j] = rand()%100 - 50;
      }
   }
}
//----------------------------------------------//
void Print(int** arr, size_t m, size_t n)
{
   size_t i, j;
   for (i=0; i<m; ++i)
   {
      for (j=0; j<n; ++j)
      {
         printf("%4d", arr[i][j]);
      }
      printf("\n");
   }
}
//----------------------------------------------//
int GetSumm(int* arr, size_t len)
{
   int summ = 0;

   size_t i;
   for (i=0; i<len; ++i)
   {
      summ += arr[i];
   }

   return summ;
}
//----------------------------------------------//
void Swap(int** a, int** b)
{
   int* buff = *a;
   *a = *b;
   *b = buff;
}
//----------------------------------------------//
void Sort(int** arr, size_t m, size_t n)
{
   struct
   {
      int val;
      size_t idx;
   }  max;

   size_t i, j;

   for (i=0; i<m-1; ++i)
   {
      max.idx = i;
      max.val = GetSumm(arr[i], n);

      for (j=i+1; j<m; ++j)
      {
         int summ = GetSumm(arr[j], n);
         if (max.val < summ)
         {
            max.idx = j;
            max.val = summ;
         }
      }

      if (i != max.idx)
      {
         Swap(&arr[i], &arr[max.idx]);
      }
   }
}
//----------------------------------------------//

int main()
{
   size_t m, n;
   printf("input size array (m, n): ");
   scanf("%d %d", &m, &n);

   int** arr = NULL;
   NewArray(&arr, m, n);

   Generate(arr, m, n);
   Print(arr, m, n);

   Sort(arr, m, n);

   printf("\n");
   Print(arr, m, n);

   FreeArray(&arr, m, n);

   return 0;
}

http://s1.ipicture.ru/

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