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

Узнай цену своей работы

Формулировка задачи:

Помогите довести до ума программу, вот сама задача поставленная передо мной: Поменять местами наименьшие из положительных элементов массивов А (55) и В (8х7) 1. Размеры массива/матрицы вводятся с клавиатуры 2. Память под них выделяется автоматически 3. Всё надо решить через функции 4. Обязательно на языке

СИ!

5. Проблема в том, что всю тему проболел и вот, что своими и не своими усилиями насобирал:
#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;
}
Сначала я всё понимал (до ввода вывода двух массивов/матриц), но потом получилась какая-та жесть и я не могу адекватно воспринять код. Помогите пожалуйста собрать код в единую программу. Да, кстати. До этого решил задачу - не выделяя динамически память. Может будет проще исправить этот вариант?
#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;
            }
        }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.455 из 5
Похожие ответы