Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
StaD
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 11
1

Отсортировать элементы строк матрицы в порядке возрастания, а строки - в порядке возрастания сумм элементов

30.06.2015, 14:30. Просмотров 2870. Ответов 20
Метки нет (Все метки)

Задать с клавиатуры количество целочисленных матриц. Данные получить с помощью датчика случайных чисел RANDOM. Отсортировать элементы каждой строки матрицы в порядке возрастания, а сами строки в порядке возрастания сумм их элементов.

Собственно, как сортировать - понятно. Но как задать с клавиатуры кол-во целочисленных матриц а потом еще и каждую отсортировать, не очень представляю. И вообще это без динамики реально?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2015, 14:30
Ответы с готовыми решениями:

Отсортировать строки матрицы в порядке возрастания сумм их элементов
Впрочем, пишу программу. Что там у меня, уже не важно. Сейчас пытаюсь написать функцию сортировки...

Отсортировать четные строки матрицы Q(10х10) в порядке убывания, а нечетные – в порядке возрастания
Написать программу на си, задание: Отсортировать четные строки матрицы Q(10х10) в порядке убывания,...

Отсортировать строки матрицы в порядке возрастания
1. Упорядочить массив А(50) в порядке убывания методом попарно-обменной перестановки. 2....

Отсортировать строки матрицы в порядке возрастания
Отсортировать строки матрицы М (8х5) в порядке возрастания. Вот код#include<stdio.h>...

Отсортировать четные строки матрицы X (10x9) в порядке убывания, а не четные в порядке возрастания
Отсортировать четные строки матрицы X (10x9) в порядке убывания, а не четные в порядке возрастания....

20
Sn1p3rOk
282 / 169 / 86
Регистрация: 19.04.2014
Сообщений: 1,100
Завершенные тесты: 2
30.06.2015, 18:28 2
Цитата Сообщение от StaD Посмотреть сообщение
И вообще это без динамики реально?
Для статического массива нельзя задать размерность с клавиатуры, так как она должна быть константой.
Честно, я даже понять не могу как это вообще задать количество целочисленных матриц не динамические.

Добавлено через 2 минуты
Может Вам нужно присвоить значения для матриц с клавиатуры, а не количество ввести?
0
Ethereal
5847 / 2002 / 264
Регистрация: 17.02.2013
Сообщений: 2,987
30.06.2015, 18:51 3
Цитата Сообщение от StaD Посмотреть сообщение
И вообще это без динамики реально?
У тебя задание немного коряво написано. Было бы написано нормально стояло бы "Отсортировать элементы каждой строки каждой матрицы в порядке возрастания". Или речь шла наоборот только об одной матрице.

Добавлено через 6 минут
Но если исполнять задание формально, то можно и без динамики. Сказано X матриц, а ты все сделай в одной, только последовательно X раз, X раз ее заполняя, сортируя и выводя результаты.
1
StaD
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 11
30.06.2015, 20:55  [ТС] 4
Ну, там был еще вариант "Задать с клавиатуры количество целых чисел". Это логичнее? Мне кажется нет. То что я поставил в шапке - это измененный вариант. Изначальный - как я написал строчкой выше.
0
30.06.2015, 20:55
lfo
1 / 1 / 4
Регистрация: 01.03.2015
Сообщений: 15
30.06.2015, 22:11 5
2 Sn1p3rOk

Для статического массива нельзя задать размерность с клавиатуры, так как она должна быть константой.
Честно, я даже понять не могу как это вообще задать количество целочисленных матриц не динамические.
Эм. инициализируем переменную, затем скэнфим её, затем инициализируем массив размерностью этой переменной. Всё должно получиться.
0
Sn1p3rOk
282 / 169 / 86
Регистрация: 19.04.2014
Сообщений: 1,100
Завершенные тесты: 2
30.06.2015, 23:45 6
Цитата Сообщение от lfo Посмотреть сообщение
Эм. инициализируем переменную, затем скэнфим её, затем инициализируем массив размерностью этой переменной. Всё должно получиться.
Ну ок... Приведи пример кода.
0
lfo
1 / 1 / 4
Регистрация: 01.03.2015
Сообщений: 15
01.07.2015, 11:44 7
2 Sn1p3rOk

Как вариант.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
int i;
int n;
 
printf("Enter array's size \n");
scanf("%i",&n);
 
int m[n];
 
for(i = 0; i < n; i++)
{
    m[i] = 0;
}
 
for(i = 0; i < n; i++)
{
    m[i] = rand() % 100;
    
}
 
for(i = 0; i < n; i++)
{
    printf("%i \n", m[i]);
    
}
 
}
0
Sn1p3rOk
282 / 169 / 86
Регистрация: 19.04.2014
Сообщений: 1,100
Завершенные тесты: 2
01.07.2015, 19:03 8
Цитата Сообщение от lfo Посмотреть сообщение
Как вариант.
Код не рабочий и без запуска вижу. Размер статического массива должен быть константой, иначе выдаст ошибку.
Вы вообще его проверяли? В итоге запустив, разумеется как я и говорил, выдает ошибку: "expression must have a constant value", проще говоря выражение должно иметь константное значение.
0
lfo
1 / 1 / 4
Регистрация: 01.03.2015
Сообщений: 15
01.07.2015, 19:22 9
2 Sn1p3rOk

Отсортировать элементы строк матрицы в порядке возрастания, а строки - в порядке возрастания сумм элементов


Всё прекрасно работает.

Версия gcc - 4.9.2

OS - OS X 10.10
0
Sn1p3rOk
282 / 169 / 86
Регистрация: 19.04.2014
Сообщений: 1,100
Завершенные тесты: 2
01.07.2015, 19:42 10
Цитата Сообщение от lfo Посмотреть сообщение
Всё прекрасно работает.

Версия gcc - 4.9.2

OS - OS X 10.10
Ну может у Вас на Apple и работает каким-то образом, но на Windows у всех будет выдавать это...
0
Миниатюры
Отсортировать элементы строк матрицы в порядке возрастания, а строки - в порядке возрастания сумм элементов  
Sn1p3rOk
282 / 169 / 86
Регистрация: 19.04.2014
Сообщений: 1,100
Завершенные тесты: 2
01.07.2015, 19:53 11
Я нашел в чем причина. В стандарте C99 введены массивы переменной длины, по этому размерность может быть не константной.
0
lfo
1 / 1 / 4
Регистрация: 01.03.2015
Сообщений: 15
01.07.2015, 22:06 12
2 Sn1p3rOk

Да-да. Увидел ваше сообщение, но уходил в зал, поэтому не смог ответить.

На самом деле моя ошибка. А вы правы. Статичные массивы != массивы переменной длины. Статичные массивы задаются только константой.

Керниган и Ричи - сила
0
StaD
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 11
02.07.2015, 23:26  [ТС] 13
В общем оказывается матрица одна, но размер динамический. Что ж. Матрицу я сделал. А как дальше отсортировать ее? Не выходит у меня применить сортировку пузырьком или шейкер-сортировку к данной матрице.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
    srand(time(NULL));
    int n, m, i, j, l, buf;
    int  ** arr; // Указатель на строку
    printf("Enter the number of rows: ");
    scanf("%d",&n);
    printf("Enter the number of columns: ");
    scanf("%d",&m);
    printf("\n");
    arr = (int **)malloc(n*sizeof(int *)); // Выделение памяти под указатели на строки
    for (i = 0;i < n;i++) // Цикл по строкам
    {
        arr[i] = (int *)malloc(m*sizeof(int)); // Выделение памяти под хранение строк (выделяем память под i-ю строку)
        for (j = 0;j < m;j++) // цикл по столбцам
        {
            arr[i][j] = rand() % 10;
        }
    }
    printf("Matrix: \n");
    for (i = 0;i < n;i++)
    {
        for (j = 0;j < m;j++)
        {
            printf("%2d ", arr[i][j]);
        }
        printf("\n");
        free(arr[i]); // Освобождение памяти под строку (освобождаем память i-й строки)
    }
    free(arr); // Освобождаем память массива
}
0
Sn1p3rOk
282 / 169 / 86
Регистрация: 19.04.2014
Сообщений: 1,100
Завершенные тесты: 2
03.07.2015, 01:27 14
Попробуйте так...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for (int i = 0; i < n; i ++)
{
    for (iny j = 0; j < n; j ++)
    {
        for (int a = 0; a < n; a ++)
        {
            for (int b = 0; b < n; b ++)
            {
                if (array[a][b] > array[i][j])
                {
                     int temp = array[a][b];
                     array[a][b] = array[i][j];
                     array[i][j] = temp;
                }
            }
        }
    }
}
0
StaD
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 11
03.07.2015, 09:36  [ТС] 15
А чтобы отсортировать сами строки в порядке возрастания сумм их элементов, нужно для суммы создавать одномерный динамический массив?
0
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10297 / 6179 / 1555
Регистрация: 25.07.2009
Сообщений: 11,762
03.07.2015, 10:50 16
Цитата Сообщение от StaD Посмотреть сообщение
А чтобы отсортировать сами строки в порядке возрастания сумм их элементов, нужно для суммы создавать одномерный динамический массив?
Можно, но не обязательно.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void fill_row(int * row, size_t size, int minval, int maxval) {
    while ( size-- )
        *row++ = rand() % (maxval - minval + 1) + minval;
}
 
void dump_row(const int * row, size_t size, const size_t width) {
    while ( size-- )
        printf("%*d%c", width, *row++, ( size ) ? ' ' : '\n');
}
 
int sum_row(const int * row, const size_t size) {
    return ( size ) ? *row + sum_row(row + 1, size - 1) : 0;
}
 
int compare_values(const void * a, const void * b) {
    return *(int*)a - *(int*)b;
}
 
size_t row_length;
 
int compare_rows(const void * a, const void * b) {
    return sum_row(*(int**)a, row_length) - sum_row(*(int**)b, row_length);
}
 
#define MIN_VAL (0)
#define MAX_VAL (10)
#define FIELD_WIDTH (2)
 
int main(void) {
    int **matrix, rows, columns, i;
    
    srand(time(NULL));
    
    printf("Rows: ");
    if ( scanf("%d", &rows) != 1 || rows < 1 )
        return 1;
    
    printf("Columns: ");
    if ( scanf("%d", &columns) != 1 || columns < 1 )
        return 1;
    
    if ( ! ( matrix = malloc(sizeof(int*) * rows) ) ) {
        perror("Memory error!\n");
        return 1;
    }
    for ( i = 0; i < rows; ++i ) {
        if ( ! ( matrix[i] = malloc(sizeof(int) * columns) ) ) {
            perror("Memory error!\n");
            return 1;
        }
    }
    
    printf("Unsorted:\n");
    for ( i = 0; i < rows; ++i ) {
        fill_row(matrix[i], columns, MIN_VAL, MAX_VAL);
        dump_row(matrix[i], columns, FIELD_WIDTH);
        qsort(matrix[i], columns, sizeof(int), compare_values);
    }
    row_length = columns;
    qsort(matrix, rows, sizeof(int*), compare_rows);
    printf("Sorted:\n");
    for ( i = 0; i < rows; ++i ) {
        dump_row(matrix[i], columns, FIELD_WIDTH);
        free(matrix[i]);
    }
    free(matrix);
    
    return 0;
}
Код
~/cpp/numbers $ gcc -o StaD_matrix StaD_matrix.c 
~/cpp/numbers $ ./StaD_matrix 
Rows: 3
Columns: 5
Unsorted:
 7  9  5  5  2
 0  7  8  7  2
 7  6  6  5  7
Sorted:
 0  2  7  7  8
 2  5  5  7  9
 5  6  6  7  7
~/cpp/numbers $
Адский быдлокод и на достаточно больших матрицах обязательно грохнется, а на недостоточно, но больших будет тормозным, но как учебный пример, вполне сойдёт.
1
StaD
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 11
03.07.2015, 12:24  [ТС] 17
Блин, очень стремный код как-то без комментариев вообще непонятно, еще библиотека для работы с датой и временем сюда затесалась. Мне бы какой-нибудь попонятнее пример, как отсороировать строчки по сумме их элементов, или алгоритм.
0
StaD
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 11
09.07.2015, 00:49  [ТС] 18
Пытаюсь сделать функцию сортировки строк в порядке возрастания сумм их элементов.
На данный момент остановился на этом, завершить все это не получается.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void sumSort(int ** arr, int n, int m)
{
    int sum[n], i, j, l, s, temp;
    for (i = 0;i < n;i++)
    {
        s = 0;
        for (j = 0;j < m;j++)
        {
            s += arr[i][j];
        }
        sum[i] = s;
        printf ("%d ", sum[i]);
    }
    printf ("\n");
    for(i = 0; i < n; i++)
    {
            for(j = 0; j < n - 1; j++) // Перестановка элементов
            {
                    if (sum[j] > sum[j + 1])
                        {
                            temp = sum[j];
                            sum[j] = sum[j + 1];
                            sum[j + 1] = temp;
                        }
            }
    }
}
Помогите доработать функцию сортировки.
0
Sn1p3rOk
282 / 169 / 86
Регистрация: 19.04.2014
Сообщений: 1,100
Завершенные тесты: 2
09.07.2015, 01:41 19
StaD, я не проверял ваш код на правильность, просто внес поправку на сортировку, так как у вас она не правильная.
C++
1
2
3
4
5
6
7
8
9
10
11
12
for(i = 0; i < n; i++)
{
    for(j = i + 1; j < n; j++) // Перестановка элементов
    {
         if (sum[i] > sum[j])
         {
              temp = sum[j];
              sum[j] = sum[i];
              sum[i] = temp;
         }
    }
}
0
StaD
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 11
09.07.2015, 09:57  [ТС] 20
Sn1p3rOk, результат выполнения программы от этого не поменялся, + это только сортировка массива сумм, а мне нужно отсортировать сами строки в основном массиве в порядке возрастания сумм их элементов
0
09.07.2015, 09:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2015, 09:57

Отсортировать элементы матрицы, лежащие на главной диагонали, в порядке возрастания
Здравствуйте. Подскажите, пожалуйста, как можно выделить память по - другому? Препод не хочет...

Элементы строк матрицы с n-ой суммой, расположить в порядке возрастания
Вот собственно и задание: &quot;Элементы строк с «–»ой суммой, расположить в порядке возрастания.&quot; Ввод...

Расположить элементы столбцов матрицы в порядке возрастания в четных столбцах, в порядке убывания - в нечетных
Расположить элементы столбцов матрица А(4,5) в порядке возрастания, если номера столбцов четные, в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru