Консультация № 187276
13.04.2013, 13:31
100.51 руб.
0 7 1
Здравствуйте! Прошу помощи в следующем вопросе:
помогите дописать программу? задание не сложное, но что-то не получается. задание с массивами (матрицы)
надо найти минимальное число из НЕотсортированных, сортировка происходит по главной диагонали вниз, налево и вверх.
Код:
#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;
}


Спасибо.

Обсуждение

давно
Профессор
399103
482
13.04.2013, 15:11
общий
13.04.2013, 15:14
Найти минимальное число из НЕотсортированных чего? В чём именно возник затык в программе?

Тут с нуля проще написать.
Неизвестный
13.04.2013, 17:23
общий
после запуска программа выдает 2 матрицы, во второй числа идущие по главной диагонали вниз, потом налево и вверх, отсортированны по возрастанию. а минимальное число надо найти из всех остальных
Прикрепленные файлы:
9e6858540cbd83d1e0314b635427245d.png
давно
Профессор
399103
482
13.04.2013, 18:48
общий
13.04.2013, 19:02
Можно задание полностью чётко?

Что, вроде, понятно: вводится матрица; числа в позициях, согласно картинке, сортируются по возрастанию; обработанная матрица, видимо, выводится.

Да, язык -- C или C++?
Неизвестный
13.04.2013, 20:18
общий
Требуется разработать программу, которая:
1) обеспечивает ввод размера квадратной матрицы из диапазона от 1 до 8;
2) обеспечивает ввод пользователем квадратной матрицы, содержащей целые числа, или заполняет матрицу случайными целыми числами, при этом тот или другой вариант формирования матрицы выбирается пользователем по запросу программы (матрица должна быть представлена в виде двумерного массива);
3) выводит на экран сформированную матрицу в табличной форме;
4) выполняет действия согласно варианту задания (см. описание вариантов),
5) выводит на экран результат в виде матрицы (в табличной форме) и других необходимых данных.

Отсортировать числа, находящиеся на ломаной линии в виде прямо-угольного треугольника, гипотенуза которого расположена на главной диагонали.
Вывести минимальное число среди чисел, которые НЕ подвергались сортировке.

Язык C
давно
Профессор
399103
482
14.04.2013, 00:10
общий
это ответ
Здравствуйте, Александра!

Код:

#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;
}
Неизвестный
14.04.2013, 15:09
общий

программа выдает ошибку: 'for' loop initial declarations are only allowed in C99 mode.
подключаю, но выдает еще больше ошибок.

и еще надо найти минимальное из оставшихся
давно
Профессор
399103
482
14.04.2013, 15:32
общий
14.04.2013, 15:36
Цитата: 396896
программа выдает ошибку: 'for' loop initial declarations are only allowed in C99 mode.

Да, эта возможность появилась в C99. Более 10 лет уже как.

Цитата: 396896
подключаю, но выдает еще больше ошибок.

Каких? Вы продолжаете говорить недосказанностями.
Вот результат для gcc-4.7.2: http://ideone.com/lBLFdg
Т.к. conio.h в стандарт не входит, соответствующие две строчки закомментированы. Ваш компилятор, видимо, conio.h содержит, коль скоро getch() в вашем коде есть.

Цитата: 396896
и еще надо найти минимальное из оставшихся

OK, исправил > на <.
Форма ответа