Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2 / 2 / 0
Регистрация: 09.07.2012
Сообщений: 14
1

Заполнение змейкой

09.07.2012, 19:51. Просмотров 1752. Ответов 3
Метки нет (Все метки)

заполнение матрицы по диагонали змейкой по принципу
1 3 4 10
2 5 9 11
6 8 12 15
7 13 14 16.
Программа работает при вводе данных с клавиатуры. А мне нужно, чтобы можно было данные брать и из файла. не могу под файл сделать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.07.2012, 19:51
Ответы с готовыми решениями:

Заполнение матрицы змейкой
Дано натуральное N (1&lt;=N&lt;=10). Заполнить матрицу размера N*N целыми числами 0, 1, 2, 3, …, N^2–1 в...

Заполнение матрици змейкой
Как заполнить квадратную матрицу змейкой.1234 ...

Заполнение массива змейкой
Нужно найти ошибку в коде Задача:вводится число N, нужно сформировать двумерный массив из n*n...

Заполнение массива змейкой
Пожалуйста, отредактируйте код, чтобы вывело так же (см. вложение): void print_array2(int** Arr,...

3
Модератор
Эксперт Python
26625 / 13880 / 2638
Регистрация: 12.02.2012
Сообщений: 22,751
Записей в блоге: 1
09.07.2012, 19:59 2
Если код отлажен, нет ничего проще!


C++
1
2
3
4
5
6
7
int getnumber(FILE *inp)
{
    int n;
 
    fscanf(inp, "%d", &n);
    return n;
}

А а начало кода вставить:

#include <stdio.h>

C++
1
FILE *inp;
В main:

C++
1
2
3
4
5
6
7
8
9
10
11
   int **m, ord, i, j;
 
   if ((inp=fopen("Имя_файла","r")) == NULL)
   {
      printf("Error by open\n");
      return -1 ;
   }
 
// перед return 0;
 
   fclose(inp);
И это все. Только не забудь, что обратные слэши в имени надо удваивать и задавать полные
имена.
0
2 / 2 / 0
Регистрация: 09.07.2012
Сообщений: 14
09.07.2012, 20:30  [ТС] 3
Цитата Сообщение от Catstail Посмотреть сообщение
Если код отлажен, нет ничего проще!


C++
1
2
3
4
5
6
7
int getnumber(FILE *inp)
{
    int n;
 
    fscanf(inp, "%d", &n);
    return n;
}

А а начало кода вставить:

#include <stdio.h>

C++
1
FILE *inp;
В main:

C++
1
2
3
4
5
6
7
8
9
10
11
   int **m, ord, i, j;
 
   if ((inp=fopen("Имя_файла","r")) == NULL)
   {
      printf("Error by open\n");
      return -1 ;
   }
 
// перед return 0;
 
   fclose(inp);
И это все. Только не забудь, что обратные слэши в имени надо удваивать и задавать полные
имена.
использование глобальной переменной нежелательно
непонятно как тут менять
C++
1
int **snake_fill(int **m, int ord,int direction, int (*gen)(void))
и получается, что теперь можно только из файла данные брать, а мне надо выбор предоставить
0
Заблокирован
Автор FAQ
18.07.2012, 17:11 4
prettynetty, как я и говорил делаю всё всегда по своему
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <string>
#include <fstream>
#include <iomanip>
#include <iostream>
using namespace std;
 
//Функция возвращает число строк считанных из потока ifstream
int getLines(ifstream &ifs);
//Функция загружает матрицу размером n x n из потока ifstream
double **LoadArr (ifstream &ifs, int n);
//Функция заполняет змейкой матрицу размером n x n
double **FillArr (int n);
//Функции вывод на экран
void Show(int n, double * vec);//Вектора
void Show(int n, double **arr);//Матрицы
//Очистка памяти
void Free(int n, double **arr);
 
 
int main()
{
    bool bMenu    = true;//Флаг отображения меню
    int iChoise   = 0;//Отвечает за выбор пользоваателя
    int n         = 0;//Будет содержать размерность матрицы
    double ** arr = NULL;//Указатель на вещественную матрицу
    ifstream ifs;
    while(bMenu)
    {
        cout<<"\t***MENU***\n";
        cout<<"1 - Load from file\n";
        cout<<"2 - Program fill\n";
        cout<<"0 - Exit\n";
        cout<<"Choise : ";cin>>iChoise;
        switch(iChoise)
        {
        case 1:
            ifs.open("matrix.txt");
            if(!ifs.is_open())
                cout<<"Error open matrix.txt\n";
            else
            {
                //Определили размер матрицы
                n   = getLines(ifs);
                arr = LoadArr (ifs, n);//Загрузили
                Show(n, arr);//Напечатеали
                Free(n, arr);//Вытерли из памяти
                ifs.close();
            }
            break;
        case 2:
            cout<<"Enter size of matrix : ";cin>>n;
            arr  = FillArr (n);//Сформировали
            Show(n, arr);//Напечатеали
            Free(n, arr);//Вытерли из памяти
            break;
        case 0:
            bMenu = false;
            break;
        };
    }
    return 0;
}
 
int getLines(ifstream &ifs)
{
    int n =0;//Будет содержать размер матрицы
    int i, j;//Счётчики
    string line;//Будет содержать элементы строки из файла
    while(getline(ifs,line))
        n = n + 1;
    ifs.clear();//Сбрасываем флаг EOF
    ifs.seekg(0,ios::beg);//Возвращаем поток вначало файла
    return n;
}
 
double **LoadArr (ifstream &ifs, int n)
{
    int i, j;//Счётчики
    //Выделяем память под указатели на стркои матрицы
    double ** arr = new double *[n];
    for(i = 0; i < n && !ifs.eof(); i++)
    {
        //Выделяем память под элементы i-й стркои матрицы
        arr[i] = new double [n];
        for(j = 0; j < n && !ifs.eof(); j++)
            ifs>>arr[i][j];
    }
    ifs.clear();//Сбрасываем флаг EOF
    ifs.seekg(0,ios::beg);//Возвращаем поток вначало файла
    return arr;
}
 
double **FillArr (int n)
{
    int i, j, k = 0;//Счётчики
    //Выделяем память под указатели на стркои матрицы
    double ** arr = new double *[n];
    for(i = 0; i < n; i++)
    {
        //Выделяем память под элементы i-й стркои матрицы
        arr[i] = new double [n];
    }
    //Собственно само заполнение змейкой по диагонали
    int diag = 0;
    for(diag = 0; diag < 2*n; diag++)
    {
        for(i = 0; i < n; i++)
        for(j = 0; j < n; j++)
        {
            if(diag + 1 == (i + 1) + (j + 1))
            {
                if(diag % 2)
                    arr[i][j] = k + 1;
                else
                    arr[j][i] = k + 1;
                k = k + 1;
            }
        }
    }
    return arr;
}
 
void Show(int n, double * vec)
{
    for(int i = 0; i < n; i++)
    {
        if(0 <= vec[i])
            cout<<" ";
        cout<<setprecision(3)
            <<setw(3)<<setfill(' ')
            <<vec[i]<<" ";
    }
    cout<<endl;
}
 
void Show(int n, double **arr)
{
    for(int i = 0; i < n; i++)
        Show(n, arr[i]);
}
 
void Free(int n, double **arr)
{
    for(int i = 0; i < n; i++)
        free((void *)arr[i]);
    arr = NULL;
}
Содержимое matrix.txt
1 3 4 10
2 5 9 11
6 8 12 15
7 13 14 16
1
Миниатюры
Заполнение змейкой  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.07.2012, 17:11

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Заполнение матрицы змейкой
Дано натуральное N (1&lt;=N&lt;=10). Заполнить матрицу размера N*N целыми числами 0, 1, 2, 3, …, N^2–1 ...

Заполнение массива змейкой
Заполнить массив змейкой; 1 3 4 10 11 21 2 5 9 12 20 22 6 8 13 19 23 30 7 14 18 24 29 31 15 17...

Заполнение матрицы змейкой
Здравствуйте, нужно заполнить матрицу змейкой(картинка змейки вложена). Матрица NxN (1&lt;=N&lt;=10),...

Заполнение матрицы змейкой
Дано натуральное N (1&lt;=N&lt;=10). Заполнить матрицу размера N*N целыми числами 0, 1, 2, 3, …, N^2–1 в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.