Дана матрица M*N. Сортировка положительных элементов по убыванию, остальных - по возрастанию. Нули в конце - C (СИ)

  1. Добрый вечер! Дан массив M*N. Необходимо отсортировать ее по строкам так, чтобы вначале шли все положительные элементы, отсортированные по убыванию, а затем все остальные, отсортированные по возрастанию (если в строке имеются нули - переставить их в конец строки). Вывести получившуюся матрицу. У меня проблема с перестановкой нулей. C1 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 74 #include <stdio.h>     int main()     {   int N, M,t, i,j,k, mas[10][10]={0}, q;         printf("VVEDITE N,M \n");     scanf("%d%d", &N,&M);     printf("VVEDITE MASSIV \n");       for (i=0; i < N; i++)        for (j=0; j < M; j++)            scanf ("%d", &mas[i][j]);       for(k = 0; k < N; k++){     for(i = 0 ; i < M; i++){         for(j = i + 1; j < M; j++){               if((mas[k][i] < mas[k][j]) && (mas[k][i]!=0)){                       t = mas[k][i];                     mas[k][i] = mas[k][j];                     mas[k][j] = t;               }         }     } }   if (mas[i][j]<0) {     } {   for(k = 0; k < N; k++){         for(i = 0 ; i < M; i++){             for(j = i + 1; j < M; j++){                   if(mas[k][i] < mas[k][j]) {                       t = mas[k][i];                     mas[k][i] = mas[k][j];                     mas[k][j] = t;               }         }     } } } for(i = 0 ; i < M; i++)     {         for(j = 0; j < M; j++)             if (mas[i][j]==0)         {                 for ( q = j; q < N-1 ; q++)                 {                     mas[i][q] = mas[i][q + 1];                 }                 mas[N-1][M-1] = 0;           }     }   for (i=0; i < N; i++)        {for (j=0; j < M; j++)               printf ("%d\t", mas[i][j]);        printf (" \n");}   getch();}


textual

Код к задаче: «Дана матрица M*N. Сортировка положительных элементов по убыванию, остальных - по возрастанию. Нули в конце - C (СИ)»

#include <stdio.h>
#include <stdlib.h>
#define NUM 10
int* part_bsort(int* a, int* b, int (*isval)(int), int (*cmp)(int,int));
void val_swap(int* a, int *b);
 
int val_uns(int n) { return (n > 0); }
int val_sig(int n) { return (n < 0); }
 
int cmp_desc(int a, int b)  { return (a > b); }
int cmp_asc(int a, int b) { return (a < b); }
 
int main(void){
    int i, j, *m, mas[NUM][NUM];
 
    //для примера заполним случайными числами
    for(i = 0; i < NUM; ++i){
        for(j = 0; j < NUM; ++j)
            mas[i][j] = -5 + rand() % 11;
    }
 
    //сортируем по заданию
    for(i = 0; i < NUM; ++i){
        m = part_bsort(mas[i], mas[i] + NUM, &val_uns, &cmp_desc);
        part_bsort(m, mas[i] + NUM, &val_sig, &cmp_asc);
    }
 
    //вывод
    for(i = 0; i < NUM; ++i){
        for(j = 0; j < NUM; ++j)
            printf("% d ", mas[i][j]);
        putchar('\n');
    }
    getchar();
    return 0;
}
 
//сортировка с перестановкой
int* part_bsort(int* a, int* b, int (*isval)(int), int (*cmp)(int,int)){
    int* i, *p = a, *o = a;
    for(; a < b; ++a){
        if((*isval)(*a)){
            for(i = a; i > p; --i)
                val_swap(i, i - 1);
 
            for(i = p; i > o; --i){
                if((*cmp)(*i, *(i - 1)))
                    val_swap(i, i - 1);
            }
            ++p;    
        }
    }
    return p;
}
 
void val_swap(int* a, int *b){
    int t = *a;
    *a = *b;
    *b = t;
}

СДЕЛАЙТЕ РЕПОСТ

6   голосов, оценка 4.167 из 5



Похожие ответы
  1. Помогите пожалуйсто решить, но желательно в такой студенческой форме: 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 #include "stdafx.h" #include #include #include #include #include #include   void main() {     int otv, h;     float x, z;     setlocale(LC_ALL, "Rus");     while (true)     {         system("cls");         printf("Программа которая вычисляет выражение в зависимости от константы");         printf("\n Вырожение:");         printf("\n        __");         printf("\n       |Inx-tg3x+1, при h=2");         printf("\n       |");         printf("\n     z=|");         printf("\n       |       ____");         printf("\n       |(x^4)+V4x+2|, при h=1");         printf("\n        ——");         printf("\n Введите h:");         scanf_s("\n %d", &h);         printf("\n Введите x:");         scanf_s("\n %d", &x);         switch (h)         {         case 0: {z = (log(x) - tan(3 * x) + 1); printf("z=%4.2f", z); } break;         case 1: {z = ((pow(x, 4) + sqrt(4 * x + 2))); printf("z=%4.2f", z); } break;         default: printf("\n Неверное значение");         }         printf("\n Продолжить работу?(0/1)");         scanf_s("\n %d", &otv);         if (otv = 0) break;     }     _getch(); }

  1. Нужно создать квадратную матрицу по рисунку. По стрелочке расположить натуральный ряд. Остальные элементы равны нулю. Заранее спасибо! P.S. gcc

  1. Решите задачи данной группы, оформив решение в виде процедур генерации, вывода и обработки массивов. Предусмотрите в процедуре генерации массива ввод границ диапазона случайных чисел. Дана целочисленная матрица размера n × m. Найти количество ее строк, все элементы которых различны.

  1. Дана прямоугольная матрица. Найти столбец с наибольшей и наименьшей суммой элементов. Вывести на печать найденные столбцы и суммы их элементов.

  1. Дана матрица A(n*m). Получить вектор b1, b2, ..., bn, где bi равно наибольшему значению в строке.

  1. Определить, является ли данная целая квадратная матрица 9-го порядка, магическим квадратом, то есть такой в которой суммы элементов во всех скобках, во всех столбцах и в обеих диагоналях одинаковы.

  1. Дано натуральное число n. Выяснить, сколько положительных эле- ментов содержит матрица a[i,j]i,j=1,...,n, если

  1. Дан табель отметок. Нужно посчитать количество хорошистов. (Отметки >=6 && <=8)C1 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 #include #include #include #include   int main() {       setlocale(LC_ALL, "Rus");     int **mas,i,j,n,m,k=0,k1=0;     printf("Введите количество студентов: ");     scanf("%d",&n);     printf("Введите количество отметок: ");     scanf("%d",&m);     mas=(int**)calloc(n,sizeof(int*));     for(i=0;i=6 && (mas[i][j])<=8);         k1++;         if(k1==m)             k++;         k1=0;     }     }     printf("Количество хорошистов: %d",k);     for(i=0;i=6 && <=8. k1 - левый счетчик, в который заносил количество подходящих элементов. Потом сравнивал с общим количеством. Если совпадал, то заносится в k, который потом отображает количество нужных строк.