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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод матрицы на экран по заданой характеристике, Сортировка вставками 
:(
    Опции темы
Totroc
Дата 20.5.2012, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

Функция Summ (считает модули эл-тов в строке).
Но вот не могу понять, как в 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 Summ=0;
for(int i=0; i<m; i++)
{
Summ = Summ + abs(matrstr[i]);     // сумма эл-тов в строке
}
return Summ;
} 

//_____________________________Соритровка Вставками___________________________//
void insert_sort(int *a, int **matrix, int N, int M) 
{
    
        int i,j;    
        for (int i = 0; i < n; i++)
        {
            for(int j =0; j <m; j++)
            {
        if (Summ(matrix[j]) > Summ(matrix[j]))
        {
            int i =j; 
            int j = j ++;
        }
        else
        {
            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;
        
            int* temp = *(matrix+i-1);
            *(matrix+i-1) = *(matrix+i);
            *(matrix+i) = temp;
        }
            }
        }
        }
        }
}

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");

// Обмениваем строки матрицы по суммам эл-тов строк
/*for (int i = 0; i < n; i++)
        {
        for (int j = 0; j < m; j++)
        {
            if (Summ(matrix[i]) > Summ(matrix[j]))
            {
                
                    int * p = matrix[j];
                matrix[j]   = matrix[j];
                matrix[j]   = p;

                
            }
        }
        }*/
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);

}




Это сообщение отредактировал(а) Totroc - 20.5.2012, 10:12
PM MAIL   Вверх
Totroc
Дата 20.5.2012, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Переписал 2е функции, вроде бы дожно быть так, но все равно не работает( Помогите пожалуйста.

Код

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 *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);
        }

PM MAIL   Вверх
leniviy
Дата 20.5.2012, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Totroc @  20.5.2012,  14:16 Найти цитируемый пост)
Переписал 2е функции, вроде бы дожно быть так

нет. Первый вариант был лучше.

Во-первых, все эти функции уже есть в интернете, можно скопировать.

Если не хочешь, идёшь в Википедию/Сортировка вставками
Там берешь код
Код

Вход: массив A, состоящий из элементов A[1], A[2], ..., A[n]

for i = 2, 3, ..., n:  
    key := A[i]
    j := i - 1
    while j > 0 and A[j] > key:
        A[j + 1] := A[j]
        j := j - 1
    A[j + 1] := key

и переделываешь под C, то есть:
'=' вместо ':='
' <= n ' вместо '..., n'
[i -1] вместо [i]


+ вместо "A[j] > key" пишешь "Summ(A[j -1]) < Summ(key)"
В функцию insert_sort() тебе нужен только 1 параметр "int **A", остальные не нужны

Это сообщение отредактировал(а) leniviy - 20.5.2012, 18:32
PM MAIL   Вверх
Totroc
Дата 20.5.2012, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



leniviy, Спасибо) 

но теперь выдает ошибку, прав доступа, и указывает на ф-ию суммы.
 
Код

#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("%d", &n) !=1) || (n<0))
    {
        printf("Ошибка ввода, введите заново(не корректное или отрицат значение) \n");
                    fflush(stdin);
    }
    printf("Введите m(высоту матрицы): ");
    while((scanf("%d", &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 Summ=0;
for(int i=0; i<m; i++)
{
Summ = Summ + abs(matrstr[i]);     // сумма эл-тов в строке
}
return Summ;
} 



//_____________________________Соритровка Вставками___________________________//
void insert_sort(int **a) 
{
    for (int i = 0; i < n; i++)
    {
         int* key = a[i];
         int j = i - 1;
         while ((j > 0) & (Summ(a[j-1]) > Summ(key)))
         {
             a[j + 1] = a[j];
             j = j -1;
             a[j + 1] = key;
         }

    }
        }

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);
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);

}


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

Код

int Summ(int* matrstr)    // сумма эл-тов строк матрицы
{ 
    int Summ=0;
for(int i=0; i<m; i++)
{
Summ = Summ + abs(matrstr[i]);     // сумма эл-тов в строке
}
return Summ;
}

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


Опытный
**


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

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



ошибки следующие:
  •  В псевдокоде было for i = 2,..., 
    это означает, что начинать надо со второй строки
    а у тебя for (int i = 0; ...
    надо
    for (int i = 2; i <= n; i++) {
  •  вместо [i] надо [i -1] по аналогии с j
    и там, где в псевдокоде было [j + 1], надо [j + 1 -1]

    А уже потом можно сократить, пригладить.

  • Вместо 
    Summ(a[j-1]) > Summ(key) 
    надо
    Summ(A[j -1]) < Summ(key)
    потому что сортировка обратная

  • Вместо & по правилам надо &&, хотя здесь это не влияет


Это сообщение отредактировал(а) leniviy - 20.5.2012, 20:19
PM MAIL   Вверх
Totroc
Дата 20.5.2012, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



leniviy, Вот, уже работает, компилируется, с вывод конечной матрицы, но опять же криво. 

Строки матрицы не меняются вообще.

а код стал такой:
Код

#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("%d", &n) !=1) || (n<0))
    {
        printf("Ошибка ввода, введите заново(не корректное или отрицат значение) \n");
                    fflush(stdin);
    }
    printf("Введите m(высоту матрицы): ");
    while((scanf("%d", &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 Summ=0;
for(int i=0; i<m; i++)
{
Summ = Summ + abs(matrstr[i]);     // сумма эл-тов в строке
}
return Summ;
} 
//_____________________________Соритровка Вставками___________________________//
void insert_sort(int **a) 
{
    for (int i = 2; i <= n; i++)
    {
         int* key = a[i - 1];
         int j = i;
         while ((j > 0) && (Summ(a[j-1]) < Summ(key)))
         {
             a[j] = a[j - 1];
             j = j - 1;
             a[j] = key;
                     }

    }
}

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);
printf("\n");
output(matrix);

for(int i=0; i < n; i++) 
{
delete[] matrix[i];
}
delete[] matrix;
printf("\n Введите 1 для выхода:");
do 
fflush(stdin);
while (scanf("%d",&exit)!=1);
if (exit) 
return;
}
while (1);
}



Это сообщение отредактировал(а) Totroc - 20.5.2012, 21:25
PM MAIL   Вверх
leniviy
Дата 20.5.2012, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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




  • Зачем поменял "int j = i - 1;" на "int j = i;"? Надо было оставить

  • "a[j] = key;" Надо вынести за фигурную скобку. Видишь, тут без отступа:
    Код

            j := j - 1
        A[j + 1] := key
Конечный вариант:
Код

void insert_sort(int **a)
{
    for (int i = 2; i <= n; i++) {
        int* key = a[i -1];
        int j = i - 1;
        while(j > 0 && Summ(a[j -1]) < Summ(key)) {
            a[j] = a[j -1];
            j = j - 1;
        }
        a[j] = key;
    }
}



Это сообщение отредактировал(а) leniviy - 20.5.2012, 21:59
PM MAIL   Вверх
Totroc
Дата 21.5.2012, 03:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



leniviy, Спасибо огромное, вы очень помогли)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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