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

Програма неадекватно себя ведет - C++

Восстановить пароль Регистрация
 
nikitos9305
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 44
11.07.2011, 14:18     Програма неадекватно себя ведет #1
Доброго время суток , помогите пожалуйста с кодом...
Тут такое дело - програма запрашивает длинну и высоту стены( ширина 2 едигицы )
Выводи на екран "полотно" + стили оформления (собственно вариации укладки кирпича)
Выбираем стиль и дальше начинаються вещи порой неподдающиеся обьяснению ( почему и пишу меседж )
Вот сам код:

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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
[CPP]
 
#include <iostream>
#include <cstdlib>
#include <cmath>
 
using namespace std;
 
const int AR_MAX=300;
//const int AR_MAX_H=200;
 
int def_type (int k_1, int k_2)
{
    if(k_1%2==0 && k_2%2==0) return 1;
    if(k_1%2!=0 && k_2!=0) return 2;
    if(k_1%2!=0 && k_2==0) return 3;
    if(k_1%2==0 && k_2!=0) return 4;
}
 
 
 
 
 
 
 
int main()
{   const int AR_MAX=300;
    int w,h;
    here:
    cout<< "Enter please massive parameters:\n";\
    cin>>w>>h;
    if(w>AR_MAX) w=AR_MAX;
const int wide=w;
const int high=h;                          //  ~const
    int i=0,n=0;
    char pole[high+2][wide+3];
 
//INITIALIZE MAIN FIELD (this is our future wall)
 
    while (n<high+2)
          { i=0;
             while (i<wide+2)
                {
                  pole[n][i]=(char)177;
                  pole[0][i]=pole[high+1][i]=(char)205;
                  pole[n][0]=pole[n][wide+1]=(char)186;
                  pole[0][0]=(char)201;
                  pole[0][wide+1]=(char)187;
                  pole[high+1][wide+1]=(char)188;
                  pole[high+1][0]=(char)200;
 
                  i++;
 
                }
          n++;
 
         }
 
n=0;i=0;
 
// DISPLAY
 
cout<<"Here is the field...\n";
 
 
// SHOW THE FIELD
 
while(n<high+2)
{i=0;
    while(i<wide+2)
    {
        cout<<pole[n][i];
        i++;
    }
cout<<'\n';
n++;
}
 
 
//================================================================================================
 
 
cout<<"Here are the examples of styles you can see your wall in:\n";
//SAMPLES
 
//#1
char sample_1[2][4];
char sample_2[2][4];
 
char sample_3[2][3]={{(char)177,(char)177},{(char)177,(char)177}};
char sample_4[2][3]={{(char)176,(char)176},{(char)177,(char)177}};
char sample_5[2][3]={{(char)177,(char)177},{(char)176,(char)176}};
 
char helping_fragment_1=(char)177;
char helping_fragment_2=(char)176;
 
int _i,_n;
_i=0;
_n=0;
 
while (_n<2)
{
    _i=0;
    while(_i<3)
    {
     sample_1[_n][_i]=(char)176;
     sample_1[0][0]=sample_1[1][2]=(char)177;
     _i++;
    }
 
    _n++;
 
}
 
_i=0;
_n=0;
 
//____________________________________________HARD STYLES( 2 штуки ) ____________________________________________________
 
cout<<"Style #1\n\n";
while(_n<2)
{   _i=0;
    while(_i<3){ cout<< sample_1[_n][_i];_i++;}
    cout<<'\n';
    _n++;
}
 
 
//#2
 
_i=0;
_n=0;
 
while (_n<2)
{
    _i=0;
    while(_i<3)
    {
     sample_2[_n][_i]=(char)176;
     sample_2[0][2]=sample_2[1][0]=(char)177;
     _i++;
    }
 
    _n++;
 
}
_i=0;
_n=0;
 
 
cout<<"Style #2\n\n";
while(_n<2)
{   _i=0;
    while(_i<3){ cout<< sample_2[_n][_i];_i++;}
    cout<<'\n';
    _n++;
}
 
 
//______________________________________________________________HARD STYLES(end)  _____________________________________________
 
_i=0;
_n=0;
 
cout<<"Style #3\n\n";
 
while(_n<2)
{   _i=0;
    while(_i<2){ cout<< sample_3[_n][_i];_i++;}
    cout<<'\n';
    _n++;
}
 
_i=0;
_n=0;
 
cout<<"Style #4\n\n";
while(_n<2)
{   _i=0;
    while(_i<2){ cout<< sample_4[_n][_i];_i++;}
    cout<<'\n';
    /*while(i<6)
    {   t=0;
        while(t<2){m[i][t]=(char)178;t++;}
        i++;
    }*/
    _n++;
}
 
_i=0;
_n=0;
 
cout<<"Style #5\n\n";
 
while(_n<2)
{   _i=0;
    while(_i<2){ cout<< sample_5[_n][_i];_i++;}
    cout<<'\n';
    _n++;
}
 
cout<<"Helping fragment\n\n";
cout<<helping_fragment_1<<'\n';
 
 
//==================================================================================================
 
here_1:
cout<<"Choose your style(imput digits 1->5):\n\n";
 
char style_;
cin>>style_;
 
 
int high_1,wide_1;
 
int m=def_type(high,wide);
 
switch (m)
{
    case 1:break;
    case 2:high_1=high-1;wide_1=wide-1;break;
    case 3:high_1=high-1;break;
    case 4:wide_1=wide-1;break;
}
 
int s_1,s_2;
 
if(style_=='1')
{
 
            for(s_1=1;s_1<=high_1;s_1++)
                 for(s_2=1;s_2<=wide_1;s_2=s_2+3)
                      {
                          if(s_1%2==1)
                              {
                                       pole[s_1][s_2]=sample_1[0][0];
                                       pole[s_1][s_2+1]=sample_1[0][1];
                                       pole[s_1][s_2+2]=sample_1[0][2];
                              }
                          if(s_1%2==0)
                              {
                                  pole[s_1][s_2]=sample_1[1][0];
                                  pole[s_1][s_2+1]=sample_1[1][1];
                                  pole[s_1][s_2+2]=sample_1[1][2];
 
                              }
                      }
 
 
 
 
 
}
 
 
if(style_=='2')
{
             for(s_1=1;s_1<=high_1;s_1++)
                 for(s_2=1;s_2<=wide_1;s_2=s_2+3)
                      {
                          if(s_1%2==1)
                              {
                                       pole[s_1][s_2]=sample_2[0][0];
                                       pole[s_1][s_2+1]=sample_2[0][1];
                                       pole[s_1][s_2+2]=sample_2[0][2];
                              }
                          if(s_1%2==0)
                              {
                                  pole[s_1][s_2]=sample_2[1][0];
                                  pole[s_1][s_2+1]=sample_2[1][1];
                                  pole[s_1][s_2+2]=sample_2[1][2];
 
                              }
                      }
 
}
 
// STYLE #3 DOES NOT CHANGE the field
 
if(style_=='4')
{
 
              for(s_1=1;s_1<=high_1;s_1++)
                 for(s_2=1;s_2<=wide_1;s_2=s_2+2)
                      {
                          if(s_1%2==1)
                              {
                                       pole[s_1][s_2]=sample_4[0][0];
                                       pole[s_1][s_2+1]=sample_4[0][1];
                              }
                          if(s_1%2==0)
                              {
                                  pole[s_1][s_2]=sample_4[1][0];
                                  pole[s_1][s_2+1]=sample_4[1][1];
                              }
                      }
 
 
 
}
 
 
if(style_=='5')
{
 
              for(s_1=1;s_1<=high_1;s_1++)
                 for(s_2=1;s_2<=wide_1;s_2=s_2+2)
                      {
                          if(s_1%2==1)
                              {
                                       pole[s_1][s_2]=sample_5[0][0];
                                       pole[s_1][s_2+1]=sample_5[0][1];
                              }
                          if(s_1%2==0)
                              {
                                  pole[s_1][s_2]=sample_5[1][0];
                                  pole[s_1][s_2+1]=sample_5[1][1];
                              }
                      }
 
 
}
 
if(style_!='1' && style_!='2' && style_!='3' && style_!='4' && style_!='5') goto here_1;
 
 
 
n=0;i=0;
 
 
while(n<high+2)
{i=0;
    while(i<wide+2)
    {
        cout<<pole[n][i];
        i++;
    }
cout<<'\n';
n++;
}
 
 
 
//===================================================================================================
// REPEAT PEQUEST :
 
cout<<"Would you like to try again(Y/N)? \n";
char y_n;
cin>>y_n;
switch (y_n)
{
    case 'y': goto here;break;
    default: system("pause");break;
}
 
    system("pause");
    return 0;
}
[/CPP]

Знаю что код коряво написан ( очень коряво ) - мои попытки передать масив ( 2х мерный) функции не увенчались успехом - расскажите как это сделать можно ...

Спасибо всем хто уделит внимание моему детищу )
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,691
11.07.2011, 14:31     Програма неадекватно себя ведет #2
Такой пример -
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
void fill (int **MAS, int Rows, int Columns) {
    for (int i = 0; i < Rows; i++)
        for (int j = 0; j < Columns; j++)
             MAS[i][j] = i + j;   
}
 
int main() {
    int Rows = 5, Columns = 6;
    int **MAS;
 
    MAS = new int *[Rows];
    for (int i = 0; i < Rows; i++)
        MAS[i] = new int [Columns];
 
    func (MAS, Rows, Columns);
 
    for (int i = 0; i < Rows; i++) {
        for (int j = 0; j < Columns; j++) {
            std::cout << std::setw(3) << MAS[i][j]; // + include iomanip
        }
        std::cout << std::endl;
    }
 
    for (int i = 0; i < Rows; i++)
        delete []MAS[i];
    delete []MAS;
 
    return 0;
}
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
11.07.2011, 14:31     Програма неадекватно себя ведет #3
Цитата Сообщение от nikitos9305 Посмотреть сообщение
мои попытки передать масив
Вот, например, так можно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
void PrintArray(int* arr, int size)
{
   for (size_t i = 0; i < size; i++)
      for (size_t j = 0; j < size; j++)
         std::cout << *(arr + (i * size + j));
}
 
int main()
{
   int arr[2][2] = { { 1, 2 },
                     { 3, 4 } };
 
   PrintArray(&arr[0][0], 2);
   
   return 0;
}
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
11.07.2011, 14:42     Програма неадекватно себя ведет #4
Цитата Сообщение от nameless Посмотреть сообщение
PrintArray(&arr[0][0], 2);
PrintArray(arr[0], 2);
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
11.07.2011, 15:13     Програма неадекватно себя ведет #5
Так, правильно было бы потребовать у тебя данные, на которых прокалываешься. Ввожу 2, 2 потом 4. Программа вылетает. Должна работать корректно при таких данных?

Добавлено через 13 минут
Подожди с массивом, будем последовательны.
Короче, ввод данных 2, 2, 4 вызывает ошибку. Напиши так:
C++
1
2
3
4
if(style_=='4')
{
printf ("high_1= %d\n", high_1);
getchar ();
И ты увидишь что high_1 у тебя не определена. А потому не определена, что чуть выше напишем:

C++
1
2
3
4
5
6
7
8
9
10
printf ("m= %d\n", m);
getchar ();
 
switch (m)
{
    case 1:break;
    case 2:high_1=high-1;wide_1=wide-1;break;
    case 3:high_1=high-1;break;
    case 4:wide_1=wide-1;break;
}
Ага, видим, что при m== 1 high_1 не определяется. Нехорошо! Нигде у тебя не указаны ограничения на ввод! ТО же наблюдаем при вводе данных 4, 4, 4 или 2, 4, 4

Вот отсюда
C++
1
2
3
4
5
6
7
int def_type (int k_1, int k_2)
{
    if(k_1%2==0 && k_2%2==0) return 1;
    if(k_1%2!=0 && k_2!=0) return 2;
    if(k_1%2!=0 && k_2==0) return 3;
    if(k_1%2==0 && k_2!=0) return 4;
}
Возвращается единица и пошло- поехало, ужне знаю,что это ты так невзлюбил когда длина и ширина кратны двум... Короче, предупреждать надо.
nikitos9305
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 44
11.07.2011, 15:36  [ТС]     Програма неадекватно себя ведет #6
45X56 попробуй ввести - с первой попытки выбьет ошибку и прога аварийно закроеться
Закрываем окно - > Снова открываем ехе

Вводим 33х33 - все хорошо заполняеться
Затем жмем y (тобишь продолжить) и вводим 45х56 - заполняет только половину поля...


+ Покажите пожалуйста как передать именно символьный масив ( 2 размерный ) функции...

Спасибо Neske за подсказку ) а без использования динамичной памяти ?
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
11.07.2011, 15:39     Програма неадекватно себя ведет #7
Цитата Сообщение от nikitos9305 Посмотреть сообщение
мои попытки передать масив ( 2х мерный) функции не увенчались успехом - расскажите как это сделать можно ...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void print(int *a[], int m,int n)
{
    for (int i=0;i<m;i++)
     for (int j=0;j<n;j++)
      cout<<a[i][j]<<'\t';
}
int main ()
{
    int m,n;
    cin>>m>>n;
    int *a[m];
    for (int i=0;i<m;i++)
    {
        a[i]=new int [n];
        for (int j=0;j<n;j++)
         a[i][j]=i*j;
    }
    print (a,m,n);
}
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
11.07.2011, 15:42     Програма неадекватно себя ведет #8
Цитата Сообщение от Gepar Посмотреть сообщение
int *a[m];
надо только предупреждать, что это для с99 совместимых компиляторов, вдруг человек в студии работает
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
11.07.2011, 15:49     Програма неадекватно себя ведет #9
nikitos9305,45Х56 всё корректно сработало, видать разные компиляторы у нас действительно
nikitos9305
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 44
11.07.2011, 16:09  [ТС]     Програма неадекватно себя ведет #10
Я работаю в Code Blocks ...

По поводу масивов и функции - интересует не масив целых или даблов , а именно символьный масив !!!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2011, 16:17     Програма неадекватно себя ведет
Еще ссылки по теме:

C++ Работаю с файлом *.txt. Прога ведет себя странно если последняя строка файла пуста. Почему так?
класс string. Программа странно себя ведет C++
Почему программа себя странно ведет: зацикливается после ввода значений? C++

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

Или воспользуйтесь поиском по форуму:
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
11.07.2011, 16:17     Програма неадекватно себя ведет #11
Цитата Сообщение от nikitos9305 Посмотреть сообщение
По поводу масивов и функции - интересует не масив целых или даблов , а именно символьный масив !!!
Собственно разницы нет, меняйте int, double на char, и работайте с массивом символов. В чем проблема?
Yandex
Объявления
11.07.2011, 16:17     Програма неадекватно себя ведет
Ответ Создать тему
Опции темы

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