#include <stdio.h>
#include <stdlib.h>
int
max(const int a, const int b)
{
return (a > b) ? a : b;
}
int
min(const int a, const int b)
{
return (a < b) ? a : b;
}
int*
get(const int *a, const int n, const int k)
{
int r = min(min(k, 3 * n - 3 - k), n - 1);
int c = max(min(k, 2 * n - 2 - k), 0);
return (a + n * r + c);
}
int
main()
{
int n, i, j;
printf("vvedite razmer massiva: ");
scanf("%d", &n);
int a[n][n];
FILL:
srand(time(NULL));
printf("Заполнить массив автоматически(0) или вручную(1)?\n");
scanf("%i", &i);
printf("\n");
if (i!=0 && i!=1)
{
printf("Ошибка. Неверное значение. Повторите.\n");
goto FILL;
} else if (i==0)
{
for(i=0; i<n; i++){
for(j=0; j<n; j++) {
a[i][j]=rand()%100-rand()%100;
}}
} else {
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("[%i][%i]=", i, j);
scanf("%i", &a[i][j]);
}
printf("\n");
}
}
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
printf("%3d ", a[i][j]);
}
printf("\n");
}
//3*n-3 количество сортируемых элементов
for (i = 0; i < 3 * n - 3 - 1; ++i) {
for (j = i + 1; j < 3 * n - 3; ++j) {
int *p1 = get(a, n, i);
int *p2 = get(a, n, j);
if (*p1 > *p2) {
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
}
}
printf("Sorted array:\n");
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
printf("%3d ", a[i][j]);
printf(" "); }
printf("\n");
}
getch();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//#include <conio.h>
const int MAX_SIZE = 8;
void matrix_print(int M[MAX_SIZE][MAX_SIZE], int N)
{
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
{
printf("%5i", M[i][j]);
}
printf("\n");
}
}
void matrix_enter(int M[MAX_SIZE][MAX_SIZE], int N)
{
// Ввод элементов матрицы
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
{
printf("(%i,%i): ", i, j);
scanf("%i", &M[i][j]);
}
}
void matrix_random(int M[MAX_SIZE][MAX_SIZE], int N, int max_abs)
{
srand(time(0));
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
M[i][j] = 2*(rand() % (max_abs+1)) - max_abs;
}
int* matrix_get_at_queer(int M[MAX_SIZE][MAX_SIZE], int N, int i)
{
// индексы ключевых точек
const int right_bottom = N-1;
const int left_bottom = right_bottom + N-1;
if (i <= right_bottom)
return &M[i][i];
if (i < left_bottom)
return &M[N-1][N-1 - (i % right_bottom)];
return &M[N-1 - (i % left_bottom)][0];
}
void matrix_sort_queer(int M[MAX_SIZE][MAX_SIZE], int N)
{
const int ceil = N > 1 ? N + N-1 + N-2 : 1;
// вывод "гнутой диагонали"
//for (int i = 0; i < ceil; ++i)
// printf("%i ", *matrix_get_at_queer(M, N, i));
//printf("\n");
// сортируем не мудрствуя, пузырьком
for (int i = 0; i < ceil; ++i)
for (int j = i+1; j < ceil; ++j)
if (*matrix_get_at_queer(M, N, i) > *matrix_get_at_queer(M, N, j))
{
int tmp = *matrix_get_at_queer(M, N, i);
*matrix_get_at_queer(M, N, i) = *matrix_get_at_queer(M, N, j);
*matrix_get_at_queer(M, N, j) = tmp;
}
}
int matrix_min_queer(int M[MAX_SIZE][MAX_SIZE], int N)
{
int min = M[0][1];
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
{
// главную диагональ, низ и левую сторону пропускаем
if (i == j || i == N-1 || j == 0)
continue;
int cur = M[i][j];
if (cur < min)
min = cur;
}
return min;
}
int main()
{
int N; // размер матрицы
printf("Enter matrix size: ");
scanf("%i", &N);
int M[MAX_SIZE][MAX_SIZE]; // матрица
char manual_char;
printf("Would you like to enter it manually? (y/n): ");
do
{
scanf("%c", &manual_char);
}
while (!(manual_char == 'y' || manual_char == 'n'));
// Ввод элементов матрицы
if (manual_char == 'y')
matrix_enter(M, N);
else
matrix_random(M, N, 100);
// Вывод исходной матрицы
printf("Initial matrix:\n");
matrix_print(M, N);
// Сортировка
matrix_sort_queer(M, N);
// Вывод
printf("Sorted matrix:\n");
matrix_print(M, N);
// Минимальное из оставшихся
if (N > 1)
printf("Min of the others: %i", matrix_min_queer(M, N));
else
printf("There is no elements exept on the main diagonal\n");
//getch();
return 0;
}
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.