Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
prettynetty
2 / 2 / 1
Регистрация: 09.07.2012
Сообщений: 14
#1

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

09.07.2012, 19:51. Просмотров 1035. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2012, 19:51     Заполнение змейкой
Посмотрите здесь:

Заполнение змейкой, массив не 2D! - C++
Добрый день всем. вот получил задание по С++ заполнение змейкой, но не такое простое как кажется на первый взгляд( искал на форуме не...

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

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

Заполнение двумерного массива змейкой - C++
Добрый вечер, помогите пожалуйста, я написал код заполнения матрицы змейкой начиная от левого верхнего угла, но выдает ошибку Stack...

Заполнение массива змейкой по диагонали - C++
народ можете немного помочь) надо заполнить массив таким способом мне как бы не нужна прям целая программа мне хватит только одного...

заполнение матрицы по диагонали змейкой - C++
будьте добры ,помогите написать програму: заполнение матрицы введенными с клавиатуры числами по диагонали змейкой по принципу 1 3 4 ...

Заполнение матрицы змейкой по диагонали - C++
Дано натуральное N (1&lt;=N&lt;=10). Заполнить матрицу порядка NxN целыми числами 0, 1, 2, 3, …, NxN – 1 по диагонали(из правого верхнего угла...

Заполнение не квадратной матрицы по диагоналям змейкой - C++
Пробовал написать программу, но мой вариант адекватно работает только с квадратными матрицами. Помогите подправить программу. Вот код: ...

Заполнение квадратной матрицы змейкой по горизонтали - C++
помогите пожалуйста Даны числа n и m. Создайте массив A и заполните его змейкой вот код #include &lt;iostream&gt; using namespace std; ...

C++ заполнение квадратной матрицы змейкой по вертикали - C++
помогите пожалуйста!!!!заполнить квадратную матрицу змейкой по вертикали!!! вот так: 1 8 9 2 7 10 3 6 11 4 5 12... зарание...

Заполнение массива "Змейкой" - C++
Спасайте! нужно заполнить массив цифрами 49 48 44 43 35 34 22 47 45 42 36 33 23 21 46 41 37 32 24 20 11 40 38 31 25 19 12 10 39...

Матрица змейкой - C++
Пытаюсь написать решение для задачи, чтобы выводила матрицу в таком виде


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
22434 / 10839 / 1765
Регистрация: 12.02.2012
Сообщений: 17,951
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);
И это все. Только не забудь, что обратные слэши в имени надо удваивать и задавать полные
имена.
prettynetty
2 / 2 / 1
Регистрация: 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))
и получается, что теперь можно только из файла данные брать, а мне надо выбор предоставить
-=ЮрА=-
Заблокирован
Автор 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
Миниатюры
Заполнение змейкой  
Yandex
Объявления
18.07.2012, 17:11     Заполнение змейкой
Ответ Создать тему
Опции темы

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