C/C++

Помогите пожалуйста с Массивами .В языке С .Заполнил 2-мерный массив N и M случайными числами дальше не понимаю.

1.Число N и M вставляет. Заполните 2-мерный массив N и M случайными числами и замените максимальное и минимальное числа в массиве и распечатайте массив на экране.
2.Число N и M вставляет. Заполните 2-мерный массив N и M случайными числами и распечатайте индексы максимального и минимального числа в массиве на экране.
3.Число N и M вставляет. Заполните 2-мерный массив N и M случайными числами и распечатайте максимальное и минимальное числа в массиве на экране.
4.Число N и M вставляет. Заполните 2-мерный массив N и M случайными числами и распечатайте минимальные числа в каждой строке на экране.
5.Число N и M вставляет. Заполните 2-мерный массив N и M случайными числами и распечатайте максимальные числа в каждом столбце на экране.
1)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
int n,m; printf("N M: "); scanf("%d%d",&n,&m); int a[n][m]; srand(time(NULL));
for(int i=0;i<n;i++)for(int j=0;j<n;j++)a[i][j]=rand()%100;
for(int i=0;i<n;i++){for(int j=0;j<n;j++)printf("%3d",a[i][j]); printf("\n");}
int imin=0,imax=0,jmin=0,jmax=0,t; printf("\n");
for(int i=0;i<n;i++)for(int j=0;j<n;j++){
if(a[i][j]>a[imax][jmax])imax=i,jmax=j;
if(a[i][j]<a[imin][jmin])imin=i,jmin=j;}
t=a[imax][jmax]; a[imax][jmax]=a[imin][jmin]; a[imin][jmin]=t;
for(int i=0;i<n;i++){for(int j=0;j<n;j++)printf("%3d",a[i][j]); printf("\n");}}

2)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
int n,m; printf("N M: "); scanf("%d%d",&n,&m); int a[n][m]; srand(time(NULL));
for(int i=0;i<n;i++)for(int j=0;j<n;j++)a[i][j]=rand()%100;
for(int i=0;i<n;i++){for(int j=0;j<n;j++)printf("%3d",a[i][j]); printf("\n");}
int imin=0,imax=0,jmin=0,jmax=0,t; printf("\n");
for(int i=0;i<n;i++)for(int j=0;j<n;j++){
if(a[i][j]>a[imax][jmax])imax=i,jmax=j;
if(a[i][j]<a[imin][jmin])imin=i,jmin=j;}
printf("max=a[%d][%d], min=a[%d][%d]\n",imax,jmax,imin,jmin);}

3)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
int n,m; printf("N M: "); scanf("%d%d",&n,&m); int a[n][m]; srand(time(NULL));
for(int i=0;i<n;i++)for(int j=0;j<n;j++)a[i][j]=rand()%100;
for(int i=0;i<n;i++){for(int j=0;j<n;j++)printf("%3d",a[i][j]); printf("\n");}
int imin=0,imax=0,jmin=0,jmax=0,t; printf("\n");
for(int i=0;i<n;i++)for(int j=0;j<n;j++){
if(a[i][j]>a[imax][jmax])imax=i,jmax=j;
if(a[i][j]<a[imin][jmin])imin=i,jmin=j;}
printf("max=%d, min=%d\n",a[imax][jmax],a[imin][jmin]);}

Уф, надоело...
Cтепан Михайлов
Cтепан Михайлов
84 182
Лучший ответ
Евгений Тришин Спасибо большое
Cтепан Михайлов Вот тебе еще четвертая.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
int n,m; printf("N M: "); scanf("%d%d",&n,&m); int a[n][m]; srand(time(NULL));
for(int i=0;i<n;i++)for(int j=0;j<n;j++)a[i][j]=rand()%100;
for(int i=0;i<n;i++){
int jmin=0; for(int j=0;j<n;j++){if(a[i][j]<a[i][jmin])jmin=j;
printf("%3d",a[i][j]);} printf(" min=%d\n",a[i][jmin]);}}
Cтепан Михайлов Поясняю - при печати строки мы кроме печати элемента сравниваем его с ранее найденным минимальным и если он меньше, заменяем прежний минимальный на него. Это можно делать, запоминая или сам элемент, или его индекс в строке. Я делал поиск минимального, запоминая индекс.
А за первоначальный минимальный в каждой строке принимается ее первый элемент.
Попутно отвечу на твой вопрос о unsigned. В Си много разных типов чисел. int ты знаешь. Переменная объявленная как int, может принимать значения от -2 147 483 648 до 2 147 483 647. Объявленная как unsigned int (можно писать в программе и просто unsigned) - от 0 до 4 294 967 295.
Это чаще всего не имеет значения. Есть и другие типы - long int (можно писать просто long), short int (можно писать просто short) и т.п.
 #include  
#include
#include

void insert(const char c, unsigned * num)
{
do
{
printf("%c = ",c);
scanf("%u",num);
}while(!num);
}

unsigned * * create(unsigned * M, unsigned * N)
{
unsigned * * A = (unsigned**) NULL;

insert('N',N);
insert('M',M);
A = (unsigned**) malloc(sizeof(unsigned*) * *N);
for(unsigned i = 0; i < *N; i++)
*(A + i) = (unsigned*) malloc(sizeof(unsigned) * *M);

srand(time(NULL));

return A;
}

void generate(unsigned * * A, unsigned M, unsigned N)
{
rand();
for(unsigned x = 0; x < N; x++)
for(unsigned y = 0; y < M; y++)
A[x][y] = rand() % 31 + 15; /* [15;45] */
}

void print(unsigned * * A, unsigned N, unsigned M)
{
putchar('\n');
for(unsigned x = 0; x < N; x++)
{
for(unsigned y = 0; y < M; y++)
printf("\t%u",A[x][y]);
putchar('\n');
}
putchar('\n');
}

void f1(unsigned * * A, unsigned N, unsigned M,
unsigned * max_all, unsigned * min_all)
{
printf(" 1 \n");
A = create(&M,&N);
generate(A,M,N);
print(A,N,M);

unsigned x_min, x_max, y_min, y_max, buf;
*max_all = *min_all = A[0][0];
for(unsigned x = 0; x < N; x++)
for(unsigned y = 0; y < M; y++)
{
if(A[x][y] > *max_all)
{
*max_all = A[x][y];
x_max = x;
y_max = y;
}
else if(A[x][y] < *min_all)
{
*min_all = A[x][y];
x_min = x;
y_min = y;
}
}

buf = A[x_max][y_max];
A[x_max][y_max] = A[x_min][y_min];
A[x_min][y_min] = buf;

print(A,N,M);

if(A == (unsigned**) NULL)
exit(1);
for(unsigned i = 0; i < N; i++)
{
if(A[i] == (unsigned*) NULL)
exit(1);
free(A[i]);
A[i] = (unsigned*) NULL;
}
free(A);
A = (unsigned**) NULL;
}

void f2(unsigned * * A, unsigned N, unsigned M,
unsigned * max_all, unsigned * min_all)
{
printf(" 2 \n");
A = create(&M,&N);
generate(A,M,N);
print(A,N,M);

unsigned x_min, x_max, y_min, y_max;
*max_all = *min_all = A[0][0];
for(unsigned x = 0; x < N; x++)
for(unsigned y = 0; y < M; y++)
{
if(A[x][y] > *max_all)
{
*max_all = A[x][y];
x_max = x;
y_max = y;
}
else if(A[x][y] < *min_all)
{
*min_all = A[x][y];
x_min = x;
y_min = y;
}
}

printf("\nMax -- A[%u][%u]\n",x_max,y_max);
printf("Min -- A[%u][%u]\n\n",x_min,y_min);

if(A == (unsigned**) NULL)
exit(1);
for(unsigned i = 0; i < N; i++)
{
if(A[i] == (unsigned*) NULL)
exit(1);
free(A[i]);
A[i] = (unsigned*) NULL;
}
free(A);
A = (unsigned**) NULL;
}

void f3(unsigned * * A, unsigned N, unsigned M,
unsigned * max_all, unsigned * min_all)
{
printf(" 3 \n");
A = create(&M,&N);
generate(A,M,N);
print(A,N,M);

unsigned x_min, x_max, y_min, y_max;
*max_all = *min_all = A[0][0];
for(unsigned x = 0; x < N; x++)
for(unsigned y = 0; y < M; y++)
{
if(A[x][y] > *max_all)
{
*max_all = A[x][y];
x_max = x;
y_max = y;
}
else if(A[x][y] < *min_all)
{
*min_all = A[x][y];
x_min = x;
y_min = y;
}
}

printf("\nMax = %u\n", A[x_max][y_max]);
printf("Min = %u\n\n", A[x_min][y_min]);

if(A == (unsigned**) NULL)
exit(1);
for(unsigned i = 0; i < N; i++)
{
if(A[i] == (unsigned*) NULL)
exit(1);
free(A[i]);
A[i] = (unsigned*) NULL;
}
free(A);
A = (unsigned**) NULL;
}

/* см комменты */
Максим Сидоров
 void f4(unsigned * * A, unsigned N, unsigned M,  
unsigned * min_stroka)
{
printf(" 4 \n");
A = create(&M,&N);
generate(A,M,N);
min_stroka = (unsigned*) malloc (sizeof(char) * N);
print(A,N,M);

for(unsigned x = 0; x < N; x++)
{
min_stroka[x] = A[x][0];
for(unsigned y = 0; y < M; y++)
if(A[x][y] < min_stroka[x])
min_stroka[x] = A[x][y];
printf("Минимальное число в строке %u равно %u\n", x + 1, min_stroka[x]);
}

if(min_stroka == (unsigned*) NULL)
exit(1);
free(min_stroka);
min_stroka = (unsigned*) NULL;

if(A == (unsigned**) NULL)
exit(1);
for(unsigned i = 0; i < N; i++)
{
if(A[i] == (unsigned*) NULL)
exit(1);
free(A[i]);
A[i] = (unsigned*) NULL;
}
free(A);
A = (unsigned**) NULL;
Максим Сидоров
 }   

void f5(unsigned * * A, unsigned N, unsigned M,
unsigned * max_stolb)
{
printf(" 5 \n");
A = create(&M,&N);
generate(A,M,N);
max_stolb = (unsigned*) malloc (sizeof(char) * M);
print(A,N,M);

for(unsigned x = 0; x < M; x++)
{
max_stolb[x] = A[0][x];
for(unsigned y = 0; y < N; y++)
if(A[y][x] > max_stolb[x])
max_stolb[x] = A[y][x];
printf("Максимальное число в строке %u равно %u\n", x + 1, max_stolb[x]);
}

Максим Сидоров
  if(max_stolb == (unsigned*) NULL)    
exit(1);
free(max_stolb);
max_stolb = (unsigned*) NULL;

if(A == (unsigned**) NULL)
exit(1);
for(unsigned i = 0; i < N; i++)
{
if(A[i] == (unsigned*) NULL)
exit(1);
free(A[i]);
A[i] = (unsigned*) NULL;
}
free(A);
A = (unsigned**) NULL;
}

int main()
{
unsigned M,N,**A;
unsigned max_all, * max_stolb;
unsigned min_all, * min_stroka;

f1(A, N, M, & max_all, & min_all);
f2(A, N, M, & max_all, & min_all);
f3(A, N, M, & max_all, & min_all);
f4(A, N, M, min_stroka);
f5(A, N, M, max_stolb);

return 0;
}
Евгений Тришин Спасибо.Сможете 4 и 5ю обяснять. Не могу понять. Unsigned что такое мы еще не прошли эту тему