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

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

Восстановить пароль Регистрация
 
prettynetty
2 / 2 / 1
Регистрация: 09.07.2012
Сообщений: 14
09.07.2012, 19:51     Заполнение змейкой #1
заполнение матрицы по диагонали змейкой по принципу
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21445 / 10230 / 1667
Регистрация: 12.02.2012
Сообщений: 17,105
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     Заполнение змейкой
Ответ Создать тему
Опции темы

Текущее время: 17:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru