Посчитать количество столбцов матрицы, в которых все элементы отличаются - C (СИ)

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

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

помогите пжлста разобраться с массивами, в си новичок, на форуме похожие задачки не нашла. задание следующее:программа должна состоять из главной функции и двух подпрограмм(функций). каждая функция должна выполнять обработку одного и того же массива, одна функция должна использовать индексы, другая указатели. Необходимо посчитать кол-во столбцов, в которых все элементы отличаются. В главной программе предусмотерть заполнение( рандомно или с клавиатуры) и вывод массива. Для проверки программы использовать два массива.(5x10, 7x11). Мне непонятно начиная с главной программы, вот что получилось:
/*pos4itatj koli4estvo stolbcov s raznimi elementami*/
# include <stdio.h>
# include <conio.h>
# define m1 5
# define m2 10
 
main()
{  int masivs[m1][m2],i,j ;
   float raznie1(int mas[m1][m2],int,int);
   float raznie2(int*,int,int);
   
    for (i=0;i<m1; ++i)
      for (j=0;j<m2; ++j)
      {   
          
       scanf ("%d",&masivs[i][j]);
      }
    printf("s indeksami:\n");
    raznie1(masivs,m1,m2);
    printf("\nS ukazateljami:\n");
    raznie2(*masivs,m1,m2);
    getch();
}
с подпрограммами вообще не могу разобраться(

Решение задачи: «Посчитать количество столбцов матрицы, в которых все элементы отличаются»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int** mat_alloc(const int, const int);
void  mat_free(int**, const int);
int   mat_unique_index(int**, const int, const int);
int   mat_unique_ptr(int**, const int, const int);
 
int main(){
   // по такой аналогии сделаешь матрицу 7x11 прсто изменив кол-во строк и столбцов
   int r, c1, rows  = 5,   // 7
              cols  = 10;  // 11
   int** mat;
   if((mat = mat_alloc(rows, cols)) == NULL)
        return 1;
   
   // заполняем матрицу случайными числами
   srand(time(NULL));
   for(r = 0; r < rows; r++) {
        for(c1 = 0; c1 < cols; c1++)
             mat[r][c1] = 10 + rand() % 20;
   }
   // подсчёт уникальных столбцов(индексацией)
   printf("count index unique columns: %d\n", mat_unique_index(mat, rows, cols));
 
   // подсчёт уникальных столбцов(адресно-указательным)
   printf("count ptr unique   columns: %d\n", mat_unique_ptr(mat, rows, cols));
 
   // для резульирующего примера вывести в консоль
   for(r = 0; r < rows; r++) {
       for(c1 = 0; c1 < cols; c1++)
            printf("%d  ", mat[r][c1]);
       putchar('\n');
   }
   // в конце нужно освободить память занимаемой матрицой
   mat_free(mat, rows);
   getchar();
   return 0;
}
 
// подсчёт уникальных столбцов(индексированный пример)
int   mat_unique_index(int** mat, const int rows, const int cols) {
   int ts, ir, r, c1, cnt = 0;
   for(c1 = 0; c1 < cols; c1++) {
        for(r = 0; r < rows; r++) {
             for(ts = 0, ir = 0; ir < rows; ir++) {
                 if(mat[r][c1] == mat[ir][c1]) {
                       if(++ts > 1) 
                           goto _abort;
                 }
             }
         }
         cnt++;
_abort: ;
  }
   return cnt;
}
 
// подсчёт уникальных столбцов(адресно-указательный пример)
int   mat_unique_ptr(int** mat, const int rows, const int cols) {
   int c = 0, ts, cnt = 0;
   int **aptr, **bptr, *a, *b;
   for(c = 0; c < cols; c++) {
          for(aptr = mat; aptr != mat + rows; ++aptr) {
               a = *aptr + c;
               for(ts = 0, bptr = mat; bptr != mat + rows; ++bptr) {
                       b = *bptr + c;
                       if( *b == *a ) {
                            if(++ts > 1) 
                                goto _abort;
                       }
                }
          }
          cnt++;
_abort: ;
   }
   return cnt;
}
 
// выделение памяти из кучи для 2D-матриц
int** mat_alloc(const int rows, const int cols) {
   int r;
   int** mat = (int**) malloc(sizeof(int)*rows);
   if(mat == NULL)
          return NULL;
   for(r = 0; r < rows; r++)
          *((mat)+r) = (int*) malloc(sizeof(int)*cols);
   return mat;
}
 
// удаление памяти занимаемой 2D-матрицой
void  mat_free(int** mat, const int rows) {
   int r;
   for(r = 0; r < rows; r++) {
       free( *((mat)+r) );
       *((mat)+r) = NULL;
   }
   free(mat);
   mat = NULL;
}

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


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

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

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