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

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

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

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

09.07.2012, 19:51. Просмотров 1080. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2012, 19:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Заполнение змейкой (C++):

Заполнение массива змейкой - C++
Заполнить массив змейкой; 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 25 28 32 35 16 26 27 33 34 36 ...

Заполнение матрицы змейкой - C++
Подскажите как мне изменить код #include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; int main() { int n; ...

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Catstail
Модератор
22615 / 10976 / 1779
Регистрация: 12.02.2012
Сообщений: 18,118
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
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))
и получается, что теперь можно только из файла данные брать, а мне надо выбор предоставить
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
Миниатюры
Заполнение змейкой  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2012, 17:11
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.07.2012, 17:11
Ответ Создать тему
Опции темы

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