Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 10962
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Советник
Рейтинг: 3992
∙ повысить рейтинг »
CradleA
Статус: Бакалавр
Рейтинг: 2050
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1785
Дата выхода:16.04.2013, 14:00
Администратор рассылки:Киселёва Алёна aka Verena (Академик)
Подписчиков / экспертов:87 / 61
Вопросов / ответов:1 / 1

Консультация # 187276: Здравствуйте! Прошу помощи в следующем вопросе: помогите дописать программу? задание не сложное, но что-то не получается. задание с массивами (матрицы) надо найти минимальное число из НЕотсортированных, сортировка происходит по главной диагонали вниз, налево и вверх.

Код :
...

Консультация # 187276:

Здравствуйте! Прошу помощи в следующем вопросе:
помогите дописать программу? задание не сложное, но что-то не получается. задание с массивами (матрицы)
надо найти минимальное число из НЕотсортированных, сортировка происходит по главной диагонали вниз, налево и вверх.

Код :
#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;
}


Спасибо.

Дата отправки: 13.04.2013, 13:31
Вопрос задал: Александра (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Александр Чекменёв (Профессор):

Здравствуйте, Александра!

Код :
#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, 00:10
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное