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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]Вывод матрицы по заданой характеристике, Матрицы, указатели, сотрировка 
:(
    Опции темы
Totroc
Дата 20.5.2012, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сильно извиняюсь, за созданную еще раз тему, но в названии темы не указал [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);
}

PM MAIL   Вверх
t_gran
Дата 21.5.2012, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 33
Всего: 37



Писал на 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;
}

user posted image

Это сообщение отредактировал(а) t_gran - 21.5.2012, 05:11

Присоединённый файл ( Кол-во скачиваний: 0 )
Присоединённый файл  archive.7z 1,68 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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