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

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

Войти
Регистрация
Восстановить пароль
 
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
#1

Логическая ошибка инициализации двумерного массива - C++

19.03.2014, 02:40. Просмотров 217. Ответов 2
Метки нет (Все метки)

Если массив statistics инициализировать
C++
1
 statistics[21][2] = {0};
, то столбцы массива statistics (те, которых 2, т.е. statistics[строка][столбец]) после прохождения цикла for (строка 26) меняются местами. Почему?

Рабочий вариант без инициализации:
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 1000
 
/* Prototypes */
int roll( void );
int rollDice( void );
int summarize( const int b[], int p );
void craps(int result[]);
 
/* enumerated constants representing the status of the game*/
enum Status { CONTINUE, WON, LOST };
 
/* Function main begins program execution */
int main( void )
{
    int i; /* counter */
    int results[ SIZE ][ 2 ];
    int wins [ 21 ] = {0};
    int loses [ 21 ] = {0};
    int statistics [ 21 ][ 2 ]; /* [i][0] loses in i games; [i][1] wins in i games */
 
    srand( time( NULL ) ); /* use time as a seed */
 
    for ( i = 0; i < SIZE; i++ ){
        craps( results[i] );
 
        if ( results[i][1] <= 20 )
            statistics[ results[ i ][ 1 ] ][ results[ i ][ 0 ] ]++;
        else
            statistics[ 0 ][ results[ i ][ 0 ] ]++;
    }
 
    printf("Win statistics:\n");
    printf("%5s%5s%5s\n","throws","wins","loses");
 
    for ( i = 1; i < 21; i++ )
    {
        printf("%5d%5d%5d\n", i, statistics[i][1], statistics[i][0] );
 
        if (i == 20 )
            printf("%5s%5d%5d\n", ">20", statistics[0][1], statistics[0][0] );
    }
 
 
    printf( "\nWin chance is %.2f", (float)summarize(wins, 21)/SIZE);
 
    return 0; /* indicates successful completion of the program */
} /* End main */
 
/* Functions */
int rollDice( void )
{
    int die1; /* first die */
    int die2; /* second die */
    int workSum; /* sum of dies */
 
    die1 = roll(); /* select a random value */
    die2 = roll(); /* select a random value */
    workSum = die1 + die2;/* summarize first and second die */
 
    /*printf("Player rolled %d + %d = %d\n", die1, die2, workSum ); /* display the result */
 
    return workSum; /* return the sum of dies */
}
 
int roll( void )
{
    return (1 + ( rand() % 6 ));
}
 
void craps (int result[])
{
    static int sum; /* sum of dies */
    static int myPoint; /* player's point */
    int iterations = 1; /* number of dice roll */
 
    enum Status gameStatus; /* contains CONTINUE, WON or LOST */
 
    sum = rollDice(); /* first cast of dies */
 
    /* determine the status of the game */
    switch( sum )
    {
        /* winning on the first roll */
        case 7:
        case 11:
            gameStatus = WON;
            break;
 
        /* lose on the first roll */
        case 2:
        case 3:
        case 12:
            gameStatus = LOST;
            break;
 
        /* remember point */
        default:
            gameStatus = CONTINUE;
            myPoint = sum;
            /*printf( "Point is %d\n", myPoint );*/
            break; /* not required */
    } /* end switch */
 
    /* while the game goes on */
    while ( gameStatus == CONTINUE )
    {
        iterations++ ;
        sum = rollDice(); /* cast dies again */
 
        /* determine the status of the game */
        if ( sum == myPoint ) /* winning by the point throw */
            gameStatus = WON;
        else
            if ( sum == 7 ) /* lose - player threw 7 */
                gameStatus = LOST;
    }
 
    /* Display the message about winning or losing */
    if ( gameStatus == WON )
        result[0] = 1;
    else
        result[0] = 0;
 
    result[ 1 ] = iterations;
}
 
int summarize( const int b[], int p )
{
    /* base case */
    if ( p == 1 )
        return b[ 0 ];
    else
        return b[ p - 1] + summarize( b, p - 1);
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2014, 02:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Логическая ошибка инициализации двумерного массива (C++):

Ошибка инициализации двумерного массива - C++
//Нужен массив 3х3; enum colorMap {null = 0, yellow, green, blue, violet, red }; class Foo { int map; Foo() { ...

Ошибка инициализации двумерного массива в классе - C++
Ошибка инициализации двумерного массива в классе Текст ошибки: Error 13 error C2536: 'Polibiy::Polibiy::a' : cannot specify explicit...

Шаблонная функция для инициализации двумерного массива - C++
Вот так можно сделать функцию для иниц. двумерного массива типа int. int** CreateArray(int row,int column) { int** arr =...

Функция инициализации двумерного массива нулевыми элементами - C++
написать функцию инициализации двумерного массива нулевыми элементами использовать функцию для двух массивов A(10*10) B(2*50)

Дописать программу инициализации двумерного массива в классе заданными элементами - C++
Добрый день!!! Уже третий день не могу инициализировать ДВУМЕРНЫЙ массив в классе ЗАДАННЫМИ ЭЛЕМЕНТАМИ, буду очень признателен за любую...

Создание функции инициализации двумерного массива строк через указатель - C++
Здравствуйте,имеется двумерный массив: in_data_up=_T(&quot;00&quot;); in_data_up=_T(&quot;01&quot;); ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.03.2014, 05:54 #2
Цитата Сообщение от satisfactor Посмотреть сообщение
столбцы массива statistics (те, которых 2, т.е. statistics[строка][столбец]) после прохождения цикла for (строка 26) меняются местами.
Это как видите?
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
19.03.2014, 09:26  [ТС] #3
уже понял свою ошибку...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2014, 09:26
Привет! Вот еще темы с ответами:

Ошибка при инициализации массива - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;fstream&gt; #include &lt;string&gt; using namespace std; const int MEMORY = 10000; ...

Ошибка при инициализации массива - C++
Не понимаю, почему не работает. Массив создается после введения количества его элементов, но все равно компилятор ругается. Код работать...

Ошибка при инициализации массива - C++
В примере есть массив: sf::String TileMap = { &quot; &quot;, &quot; ...

Ошибка при инициализации массива - C++
Что делать? Так как я понимаю, точку с запятой вообще в помине не должно здесь быть!о_О


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

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

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