Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2012, 19:52   #1
prettynetty
Пользователь
 
Регистрация: 03.03.2012
Сообщений: 11
Вопрос С++ заполнение змейкой

заполнение матрицы по диагонали змейкой по принципу
1 3 4 10
2 5 9 11
6 8 12 15
7 13 14 16.
Программа работает при вводе данных с клавиатуры. А мне нужно, чтобы можно было данные брать и из файла. не могу под файл сделать
Код:
#include <stdio.h>
#include <stdlib.h>
 
int **allocate_matrix(int nrow, int ncol)
{
    int **p, i;
 
    if ((p = 
        (int **) malloc(nrow * sizeof(int *))) == NULL)
            return NULL;
    for (i = 0; i < nrow; i++)
        if ((p[i] =
            (int *) malloc(ncol * sizeof(int))) == NULL) {
                while (--i >= 0)
                    free(p[i]);
                free(p);
                return NULL;
        }
    return p;
}
 
void free_matrix(int **m, int nrow)
{
    while (--nrow > 0)
        free(m[nrow]);
    free(m);
}
 
int **snake_fill(int **m, int ord,
    int direction, int (*gen)(void))
{
    int i, j;
    
    /*
     * direction == 1  means direction from  
     * the left bottom corner to the right top one.
     * ... == 0  means the opposite.
     * Function parameter of the same name sets
     * the direction to be started from.
     */
    i = j = 0;
    /* 
     * First cycle fills the first part which
     * includes diagonal:
     *
     *      * * * *
     *      * * *
     *      * *
     *      *
     */
    for (;;) {
        if (direction == 0) {
            do {                   
                m[i++][j--] = gen();
            } while (j >= 0);
            j++;
            direction ^= 1;
            if (i == ord)
                break;
        } else { /* from the right top to the left bottom */
            do { 
                m[i--][j++] = gen();
            } while (i >= 0);
            i++;
            direction ^= 1;
            if (j == ord)
                break;
        } /* end of else block */
    } /* end of cycle for */
 
    if (direction == 0) {
        i = 1;
        j = ord - 1;
    } else {
        i = ord - 1;
        j = 1;
    }
 
    /* 
     * Second cycle fills the second part:
     *
     *             *
     *          * *
     *       * * *
     */
    while (i != ord && j != ord) {
        if (direction == 0) {
            do {                   
                m[i++][j--] = gen();
            } while (i < ord);
            i--;
            j += 2;
        } else {
            do {
                m[i--][j++] = gen();
            } while (j < ord);
            j--;
            i += 2;
        } /* end of else block */
        direction ^= 1;
    } /* end of cycle for */
    return m;
}
 
int getnumber(void)
{
    int n;
 
    scanf("%d", &n);
    return n;
}
 
int main()
{
    int **m, ord, i, j;
 
    printf("enter a size of the square matrix:\n");
    scanf("%d", &ord);
    m = allocate_matrix(ord, ord);
 
    printf("enter the elements:\n");
    snake_fill(m, ord, 0, getnumber);
    
    putchar('\n');
    for (i = 0; i < ord; i++) {
        for (j = 0; j < ord; j++)
            printf("%2d ", m[i][j]);
        putchar('\n');
    }
    free_matrix(m, ord);
    return 0;
}
prettynetty вне форума Ответить с цитированием
Старый 10.07.2012, 04:20   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

задавать свой вопрос сразу на всех форумах не обязательно, я вам уже ответил и исправленный код привел.
rrrFer вне форума Ответить с цитированием
Старый 10.07.2012, 09:56   #3
prettynetty
Пользователь
 
Регистрация: 03.03.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
задавать свой вопрос сразу на всех форумах не обязательно, я вам уже ответил и исправленный код привел.
может это значит, что код не совсем тот?
prettynetty вне форума Ответить с цитированием
Старый 10.07.2012, 16:25   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Может быть и не совсем тот, но тогда надо, как минимум, пояснить чем не подошел предложенный вариант. У меня работает )
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Матрица змейкой Axrik Общие вопросы C/C++ 0 17.12.2011 01:40
заполнение змейкой массива artemjke Помощь студентам 4 22.09.2011 17:16
Проблема со змейкой Walker32 C++ Builder 0 15.05.2011 17:38
помогите с диагональной змейкой Слон Паскаль, Turbo Pascal, PascalABC.NET 2 07.06.2008 11:19