Посчитать количество столбцов матрицы, в которых все элементы отличаются - 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;
}