Поменять местами наименьшие из положительных элементов массивов - C (СИ)

  1. Помогите довести до ума программу, вот сама задача поставленная передо мной: Поменять местами наименьшие из положительных элементов массивов А (55) и В (8х7) 1. Размеры массива/матрицы вводятся с клавиатуры 2. Память под них выделяется автоматически 3. Всё надо решить через функции 4. Обязательно на языке СИ! 5. Проблема в том, что всю тему проболел и вот, что своими и не своими усилиями насобирал: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 75 76 77 78 79 80 81 82 83 #include <stdlib.h> #include <stdio.h> //vvod void vvod(int **p, int na, int nb) {     printf ("\n\nVvedite elementi massiva:\n\n");     for (int i=0; i<na; i++)         for (int j=0; j<nb; j++)         {             printf(" stroka %d, chislo %d = ", i+1, j+1);             scanf("%d", p+i*na+j);         } } //vivod void vivod(int **p, int na, int nb) {     for (int i=0; i<na; i++)     {         for (int j=0; j<nb; j++)             printf("%5d", *((int *)p+i*na+j));         printf("\n");     } }   //Poisk max int* Find_MAX(int *p, int max_i, int max_j) {       int *max = p;       for(int i = 0; i < max_i; i++)           for(int j = 0; j < max_j; j++)               if(*(p+i*max_i + j) > *max) max = (p+i*max_i + j);       return max; } //Smena Max void Swap(int *Arr1, int *Arr2, int max_i1, int max_i2, int i1, int j1, int i2, int j2) {      int a = *(Arr1 + i1 * max_i1 + j1);      *(Arr1 + i1 * max_i1 + j1) = *(Arr2 + i2 * max_i2 + j2);      *(Arr2 + i2 * max_i2 + j2) = a; }   int main() {     int **p, **q;     int na, nb, ma, mb;     int max_i, max_j;     //matrica 1     printf("Razner 1 matrici:\n");     printf("stroki = ");     scanf("%d", &na);     printf("stolbci = ");     scanf("%d", &nb); //videleni pama'ti P        p=(int**)malloc(na*sizeof(int));        for(int i=0; i<nb; i++)                p[i]=(int *)malloc(nb*sizeof(int));         vvod(p, na, nb);     printf("Ishodnaya matrica 1:\n");     vivod(p, na, nb);     Find_MAX(*p,max_i,max_j);     //matrica 2         printf("\n\nRazner 2 matrici:\n");     printf("stroki = ");     scanf("%d", &ma);     printf("stolbci = ");     scanf("%d", &mb); //videleni pama'ti  Q     q=(int**)malloc(ma*sizeof(int));     for(int i=0; i<mb; i++)         q[i]=(int *)malloc(nb*sizeof(int));       vvod(q, ma, mb);     printf("Ishodnaya matrica 2:\n");     vivod(q, ma, mb);     Find_MAX(*p,max_i,max_j);         system("pause");     return 0; }Сначала я всё понимал (до ввода вывода двух массивов/матриц), но потом получилась какая-та жесть и я не могу адекватно воспринять код. Помогите пожалуйста собрать код в единую программу. Да, кстати. До этого решил задачу - не выделяя динамически память. Может будет проще исправить этот вариант?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 75 76 77 #include <iostream> #include <conio.h> #include <stdio.h> using namespace std; //Функция     void vvod(int** x, int *t1, int *t2) {  int i,j;  printf ("vvod n=");  scanf ("%d",t1);  printf ("vvod m=");  scanf ("%d",t2);  for (i=0; i<*t1; i++)     for (j=0; j<*t2; j++) scanf("%d",&x[i][j]);     } void vivod(int** x, int t1, int t2) {   int i,j;    for (i=0; i<t1; i++)   {     for (j=0; j<t2; j++) printf("%5d",x[i][j]);         printf("\n");     }   } void NMmin(int** x, int t1, int t2, int *nmin, int *mmin) {    int i,j;    *nmin=-1;*mmin=-1;    for (i=0;i<t1;i++)    {       for(j=0;j<t2;j++)         if (x[i][j]>0) {*nmin=i;*mmin=j;break;}       if (*nmin!=-1) break;                          }    if (*nmin!=-1)    {    for (i=0; i<t1; i++)    for (j=0; j<t2; j++)         if ((x[i][j]>0)&&(x[i][j]<x[*nmin][*mmin]))         {            *nmin=i;            *mmin=j;         }    }     } void swap(int** x, int y[10][10], int n1, int m1, int n2, int m2) {   int c;   c=x[n1][m1];   x[n1][m1]=y[n2][m2];   y[n2][m2]=c;       }   int main () {  int a[10][10],b[10][10];  int na,ma,nb,mb,nminA,mminA,nminB,mminB;  printf("Vvod matrici A:\n");  vvod(a,&na,&ma);  printf("Vvod matrici B:\n");  vvod(b,&nb,&mb);  printf("Исходная матрица A\n");  vivod(a,na,ma);  printf("Исходная матрица B\n");  vivod(b,nb,mb);  NMmin(a,na,ma,&nminA,&mminA);  printf("Matrica A:        N=%d  M=%d\n",nminA+1,mminA+1);  NMmin(b,nb,mb,&nminB,&mminB);  printf("Matrica B:        N=%d  M=%d\n",nminB+1,mminB+1);  if ((nminA!=-1)&&(nminB!=-1)) swap(a,b,nminA,mminA,nminB,mminB);  printf("Новая матрица A\n");          vivod(a,na,ma);  printf("Новая матрица B\n");          vivod(b,nb,mb);  getch();  return 0; }


textual

Код:

#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
 
void razmer(int &, int &, int);
void mclear(int** , int);
void input(int** , int , int, int);
void print(int** , int , int, int);
void minimum(int** , int, int, int &);
void replace(int** , int, int, int, int);
 
 
int main()
{
    setlocale(LC_ALL,"Rus");
    int ma, na, mb, nb, min_a=-1, min_b=-1;
    int ** a, ** b;
 
    razmer(ma,na,1);
    
        a=(int**)malloc(ma*sizeof(int));
    for(int i=0; i<na; i++){
        a[i]=(int *)malloc(na*sizeof(int));
    }
 
    razmer(mb,nb,2);
 
    b=(int**)malloc(mb*sizeof(int));
    for(int i=0; i<nb; i++){
        b[i]=(int *)malloc(nb*sizeof(int));
    }
 
    input(a, ma, na, 1);
    print(a, ma, na, 1);
 
    input(b, mb, nb, 2);
    print(b, mb, nb, 2);
    system("pause");
 
        minimum(a, ma, na, min_a);
        minimum(b, mb, nb, min_b);
 
    replace(a, ma, na, min_a, min_b);
    replace(b, mb, nb, min_b, min_a);
 
    print(a, ma, na, 1);
    print(b, mb, nb, 2);
    /*
    mclear(a, na);
    mclear(b, nb);
    printf("\nПамять очищена!\n");
    */
    system("pause");
 
    return 0;
}
 
void razmer(int &m, int &n, int num)
{
    printf("\nРазмер матрицы %d:\n", num);
    printf("строки = ");
    scanf("%d", &m);
    printf("столбцы = ");
    scanf("%d", &n);
    system("pause");
}
 
void mclear(int** arr, int n)
{
    for(int i=0; i<n; i++)
        free(arr[i]);
    free(arr);
}
 
void input(int ** arr, int m, int n, int num)
{
    int i=0, j=0;
    printf ("\n\nВведите элементы матрицы %d:\n\n", num);
        for (i=0; i<m; i++)
                for (j=0; j<n; j++)
                {
                        printf(" строка %d, столбец %d = ", i+1, j+1);
                        scanf("%d", &arr[i][j]);
                } 
}
 
void print(int** arr, int m, int n, int num)
{
    printf("\n\nМатрица %d:\n", num);
    for (int i=0; i<m; i++)
        {
                for (int j=0; j<n; j++) 
                        printf("%5d", arr[i][j]); 
                printf("\n"); 
        } 
}
 
void minimum(int** arr, int m, int n, int &min)
{
    for (int i=0; i<m; i++)
        {
            for (int j=0; j<n; j++){
                if(arr[i][j]>0){
                    if(min==-1)
                    {
                        min=arr[i][j];
                    }
                    else if(min>arr[i][j]){
                        min=arr[i][j];
                    }
                }
            }
        }
}
 
void replace(int** arr, int m, int n, int min, int min_m)
{
        for (int i=0; i<m; i++)
        {
            for (int j=0; j<n; j++){
                if(min==arr[i][j])
                    arr[i][j]=min_m;
            }
        }
}


Похожие ответы
  1. Всем доброго времени суток! Смотрите, у меня получился код, который меняет местами (отражает зеркально) элементы, расположенные выше главной и побочной диагоналей и ниже их. Элементы диагоналей не затронуты. А мне нужно чтобы был найден максимальный элемент выше главной диагонали и минимальный – ниже ее, и нужно их поменять местами. У кого какие соображения? Я так понимаю нужно поменять условия, начиная с 3 цикла for. Должно быть как на картинке. Код: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 #include //inclusion of libraries #include #include #include   int main() { int i, j, n, massiv_min, massiv_max,swap;   time_t t;   // actual time for initialization // of random number generator   srand((unsigned) time(&t)); // generator initialization   printf("\nInput the lower border of range:"); scanf("%d", &massiv_min); printf("\nInput the upper border of range:"); scanf("%d", &massiv_max); printf("\nInput number of rows and columns:"); scanf("%d", &n);     int massiv[n][n];   printf("\nSource massive:\n");   for (i=0; i

  1. Как я понял нужно использовать пробел как разделитель слов, но как это реализовать я не знаю.

  1. В каждой строке текста поменять местами самое длинное и самое короткое слово. Максимум находит правильно, но вот я не понимаю, как определить минимум и потом поменять максимум и минимум местами и обратно собрать исходный текст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 #include #include #include   int main () {   const int n=100;     char s[n][n], max_str[n], min_str[n];     char *istr;     int i,j, len, count=0;         printf ("введи текст (Enter - закончить)\n");         for (i=0; i strlen(max_str))                 {                     strcpy (max_str, istr);                 }             if (len

  1. Здравствуйте. Помогите, пожалуйста, составить функцию, которая меняет местами последний и i-й элементы массива. Массив динамический.

  1. Добрый вечер, есть программа она меняет минимальный и максимальный элемент массива. Нужно еще сделать программку которая меняет местами последний элемент массива и максимальный, то есть {1,5,3,7,6,4,9,2} - исходной массив {1,5,3,7,6,4,2,9} - массив после смены. И если максимальных элементов несколько то взять первый из них.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 #include "stdafx.h" #include #include #include #include int main() {     SetConsoleCP(1251);     SetConsoleOutputCP(1251);     int a[100], buf;     int i, n, max, min, n_max, n_min;     printf("Введите число n:");     scanf_s("%d", &n);     if (n <= 5) {         printf("Массив должен состоять из 6 и больше чисел.\n");         scanf_s("%d", &n);     }     srand(time(NULL));     printf("Массив до смены:\n");     for (i = 0; imax)         {             max = a[i];             n_max = i;         }         if (a[i]

  1. Добрый день. Помогите пожалуйста с заданием: Ввести символьную строку. Предпоследнее и последнее слова в строке поменять местами. Без указателей. Как можно проще. Пробовала так: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 #include #include #include   int main() {     long i;     char str[1024] = {0};     printf("\tEnter input string\n");     scanf("%[^\n]",str);     long k;     int a[2];     k=strlen(str);     int j=0;     for(i = k; i != 0;i--){         if(j<=1){             if((str[i] == ' ' || str[i] == '\0') && str[i-1] != ' '){                 a[j]=i;                 j++;             }         }     }         for (i=0; i<2;i++){         printf("%d\n", a[i]);     }     printf("Press any key to continue\n");     getch();     return 0; }

  1. помогите пожалуйста, нужно написать программу, которая нужно ввести текст, ввести 2 словосочетания и в тексте поменять местами словосочетания

  1. мне дана задача: В каждом столбце двумерного массива поменять местами первый отрицательный элемент и последний нулевой. Я написала код, но он не хочет рабоать, я не понимаю почему, найдите пожалуйста ошибку.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 #include #include int main() { int i,j,x,y,q,d,f,g,h,z;      // i j - индексы массива mas[0][2] printf("Vvedite zna4enie strok="); scanf("%d",&x);  while(x<=0)     // на случай, если пользователь введет отрицательное количество строк     {         printf("error, kol-vo elementov >0 ");         scanf("%d", &x);     } printf("\nVvedite zna4enie stolbcov="); scanf("%d",&y);  while(y<=0)     // на случай, если пользователь введет отрицательное количество столбцов     {         printf("error, kol-vo elementov >0 ");         scanf("%d", &y);     } int M[x][y]; for(i=0;i

  1. Дано матрицу 5*5 Поменять местами последнюю строчку и столбик

  1. Здравствуйте, друзья! Пытаюсь решить легкую, на первый взгляд, задачу: "Ввести 2 числа и поменять их местами без использования третьей переменной." Задача рассчитана на слушателя, поверхностно знающего только, что такое переменная, приоритеты операций, типы, ... может вывести "Hellow world!". Короче, я пока не додумался как это можно осуществить.