Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
1

Массив теряет значения:/

18.04.2013, 08:17. Показов 970. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <audiere.h>
 
using namespace std;
using namespace audiere;
 
void sound_func(char **text_sound, int kol_symb_text, int sum_words);
 
int InitialAudiere(){
    AudioDevicePtr device = OpenDevice();
    if(!device) {
        cout << "OpenDevice() failed!\n";
        return 1;
    };
}
 
void PlaySymbols(char symbol, int softness){
    char SoundFileName[6];
    SoundFileName[2] = '.';
    SoundFileName[3] = 'w';
    SoundFileName[4] = 'a';
    SoundFileName[5] = 'v';
    
    if(softness == '1') SoundFileName[1] = '\'';
    if(softness == '0') SoundFileName[1] = '$';
    
    SoundFileName[0] = symbol;
}
 
int main()
{
    char text_string[] = "";
    cout << "Please, enter text for the voice: \n";
    gets(text_string);
    int kol_symb = strlen(text_string);
    int spaces = 0;
 
    for(int i = 0; i < kol_symb; i++) {if(text_string[i] == ' ') spaces++;}
 
    int sum_words = spaces + 1;
    char **strip_words = new char* [sum_words];
    for(int i = 0; i <= sum_words; i++)
        strip_words[i] = new char [30];
    int symb_beg_word = 0;
    int p = 0; int sum_spaces = 0;
    
    for(int i = 0; i < sum_words; i++){
        int g = 0;
        for(int j = symb_beg_word; j < kol_symb; j++){
            if(text_string[j] != ' ')
            {
               strip_words[i][g] = text_string[j];
               g++;
            }
            else{
                p = j; sum_spaces = 0;
                symb_beg_word = j + sum_spaces;
                break;
            }
 
        }
    }
    sound_func(strip_words, kol_symb, sum_words);
 
    getch();
    return 0;
}
 
void sound_func(char **text_sound, int kol_symb_text, int sum_words)
{
    InitialAudiere();
    
    for(int j = 0; j < sum_words; j++){
        for(int i = 0; i < kol_symb_text; i++){
            cout << text_sound[j][i];
            switch(text_sound[j][i]){
                case 'а':
                    break;
                case 'б': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;
                case 'в': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;
                case 'г': 
                    if(text_sound[j][i++] == text_sound[j][i])
                    break;
                case 'д': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;          
                case 'е': 
                    if((i == 0) || (text_sound[j][i--] == ' ') || (text_sound[j][i--] == 'ъ') || (text_sound[j][i--] == 'ь') ||
                      (text_sound[j][i--] == 'а' || text_sound[j][i--] == 'А' || text_sound[j][i--] == 'е' || text_sound[j][i--] == 'Е' ||
                       text_sound[j][i--] == 'ё' || text_sound[j][i--] == 'Ё' || text_sound[j][i--] == 'и' || text_sound[j][i--] == 'И' ||
                       text_sound[j][i--] == 'о' || text_sound[j][i--] == 'О' || text_sound[j][i--] == 'у' || text_sound[j][i--] == 'У' ||
                       text_sound[j][i--] == 'ы' || text_sound[j][i--] == 'Ы' || text_sound[j][i--] == 'э' || text_sound[j][i--] == 'Э' ||
                       text_sound[j][i--] == 'ю' || text_sound[j][i--] == 'Ю' || text_sound[j][i--] == 'я' || text_sound[j][i--] == 'Я')){
                        kol_symb_text++;
                        text_sound[j][i] = 'й';
                        for(int k = i; k < kol_symb_text; k++)
                            text_sound[j][k++] = text_sound[j][k];
                        text_sound[j][i++] = 'э';
                    }
                    break;  
                case 'ё': 
                    if((i == 0) || (text_sound[j][i--] == ' ') || (text_sound[j][i--] == 'ъ') || (text_sound[j][i--] == 'ь') ||
                      (text_sound[j][i--] == 'а' || text_sound[j][i--] == 'А' || text_sound[j][i--] == 'е' || text_sound[j][i--] == 'Е' ||
                       text_sound[j][i--] == 'ё' || text_sound[j][i--] == 'Ё' || text_sound[j][i--] == 'и' || text_sound[j][i--] == 'И' ||
                       text_sound[j][i--] == 'о' || text_sound[j][i--] == 'О' || text_sound[j][i--] == 'у' || text_sound[j][i--] == 'У' ||
                       text_sound[j][i--] == 'ы' || text_sound[j][i--] == 'Ы' || text_sound[j][i--] == 'э' || text_sound[j][i--] == 'Э' ||
                       text_sound[j][i--] == 'ю' || text_sound[j][i--] == 'Ю' || text_sound[j][i--] == 'я' || text_sound[j][i--] == 'Я')){
                        kol_symb_text++;
                        text_sound[j][i] = 'й';
                        for(int k = i; k < kol_symb_text; k++)
                            text_sound[j][k++] = text_sound[j][k];
                        text_sound[j][i++] = 'о';
                    }
                    break;          
                case 'ж': 
                    if(text_sound[j][i++] == text_sound[j][i])
                    break;      
                case 'з': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;      
                case 'и': 
                    break;      
                case 'й': 
                    break;      
                case 'к': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;                       
                case 'л': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;      
                case 'м': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;                       
                case 'н': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;  
                case 'о':
                    break;  
                case 'п': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;  
                case 'р': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;      
                case 'с': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;
                case 'т': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;  
                case 'у':
                    break;      
                case 'ф': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;      
                case 'х': 
                    if(text_sound[j][i++] == text_sound[j][i]){}
                    if(text_sound[j][i++] == 'ь'){}
                    break;                       
                case 'ц': 
                    if(text_sound[j][i++] == text_sound[j][i])
                    break;
                case 'ч': 
                    if(text_sound[j][i++] == text_sound[j][i])
                    break;
                case 'ш': 
                    if(text_sound[j][i++] == text_sound[j][i])
                    break;                      
                case 'щ': 
                    if(text_sound[j][i++] == text_sound[j][i])
                    break;          
                case 'ъ':
                    break;                               
                case 'ы': 
                    if(text_sound[j][i++] == text_sound[j][i])
                    break;      
                case 'ь':
                    break;
                case 'э':
                    break;      
                case 'ю':
                    if((i == 0) || (text_sound[j][i--] == ' ') || (text_sound[j][i--] == 'ъ') || (text_sound[j][i--] == 'ь') ||
                      (text_sound[j][i--] == 'а' || text_sound[j][i--] == 'А' || text_sound[j][i--] == 'е' || text_sound[j][i--] == 'Е' ||
                       text_sound[j][i--] == 'ё' || text_sound[j][i--] == 'Ё' || text_sound[j][i--] == 'и' || text_sound[j][i--] == 'И' ||
                       text_sound[j][i--] == 'о' || text_sound[j][i--] == 'О' || text_sound[j][i--] == 'у' || text_sound[j][i--] == 'У' ||
                       text_sound[j][i--] == 'ы' || text_sound[j][i--] == 'Ы' || text_sound[j][i--] == 'э' || text_sound[j][i--] == 'Э' ||
                       text_sound[j][i--] == 'ю' || text_sound[j][i--] == 'Ю' || text_sound[j][i--] == 'я' || text_sound[j][i--] == 'Я')){
                        kol_symb_text++;
                        text_sound[j][i] = 'й';
                        for(int k = i; k < kol_symb_text; k++)
                            text_sound[j][k++] = text_sound[j][k];
                        text_sound[j][i++] = 'у';
                    }
                    break;  
                case 'я':
                    if((i == 0) || (text_sound[j][i--] == ' ') || (text_sound[j][i--] == 'ъ') || (text_sound[j][i--] == 'ь') ||
                      (text_sound[j][i--] == 'а' || text_sound[j][i--] == 'А' || text_sound[j][i--] == 'е' || text_sound[j][i--] == 'Е' ||
                       text_sound[j][i--] == 'ё' || text_sound[j][i--] == 'Ё' || text_sound[j][i--] == 'и' || text_sound[j][i--] == 'И' ||
                       text_sound[j][i--] == 'о' || text_sound[j][i--] == 'О' || text_sound[j][i--] == 'у' || text_sound[j][i--] == 'У' ||
                       text_sound[j][i--] == 'ы' || text_sound[j][i--] == 'Ы' || text_sound[j][i--] == 'э' || text_sound[j][i--] == 'Э' ||
                       text_sound[j][i--] == 'ю' || text_sound[j][i--] == 'Ю' || text_sound[j][i--] == 'я' || text_sound[j][i--] == 'Я')){
                        kol_symb_text++;
                        text_sound[j][i] = 'й';
                        for(int k = i; k < kol_symb_text; k++)
                            text_sound[j][k++] = text_sound[j][k];
                        text_sound[j][i++] = 'а';
                    }
                    break;              
            }
    }
}
}
Знаю, что много, но сам не разберусь, в чем проблема:\ В общем в функцию передаю массив динамический, а после в цикле пытаюсь его напечатать, но если в массиве будет "просто", то печатает "прос". Если убрать switch{}, то все нормально.... Подскажите, в чем проблема??
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2013, 08:17
Ответы с готовыми решениями:

Половина двумерного массива теряет значения
Тут код: //заголовок #ifndef MATRIX_H #define MATRIX_H #include &lt;iostream&gt; using...

Почему указатель теряет свои значения после выхода с метода, память выделена динамически
#include &lt;iostream&gt; using namespace std; void sqr( int* a, int length ); int main() {...

Ассоциативный массив из php при преобразовании в json теряет порядок элементов
Ассоциативный массив из php при преобразовании в json теряет порядок элементов В js прилетает...

Переписать в массив С все значения матрицы D, меньше заданного значения Y
Вот что написал, а дальше как ни крутил не смог придумать #include&lt;iostream&gt; using namespace...

18
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.04.2013, 11:51 2
angryjack93, я думаю, у Вас проблема с регулярным декрементом/инкрементом во втором индексе text_sound. Вы понимаете, что значит запись i++, i-- ?
0
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
18.04.2013, 14:25  [ТС] 3
Цитата Сообщение от Tulosba Посмотреть сообщение
angryjack93, я думаю, у Вас проблема с регулярным декрементом/инкрементом во втором индексе text_sound. Вы понимаете, что значит запись i++, i-- ?
Ну вроде i = 1;
а text_sound[j][1+1] тогда
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.04.2013, 14:40 4
Цитата Сообщение от angryjack93 Посмотреть сообщение
Ну вроде i = 1;
а text_sound[j][1+1] тогда
i++; равнозначно i = i+1; т.е. i меняется. А теперь посмотрите сколько изменений происходит в какой-нибудь case 'ю'.
1
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
18.04.2013, 15:00  [ТС] 5
Цитата Сообщение от Tulosba Посмотреть сообщение
i++; равнозначно i = i+1; т.е. i меняется. А теперь посмотрите сколько изменений происходит в какой-нибудь case 'ю'.
хм) походу я сглупил сильно)))

Добавлено через 3 минуты
А каким образом мне тогда обратиться к следующему элементу?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.04.2013, 15:02 6
Цитата Сообщение от angryjack93 Посмотреть сообщение
А каким образом мне тогда обратиться к следующему элементу?
можно просто i+1, т.е. без присваивания. Или завести временную переменную и использовать ее уже:
C++
1
2
int nexti = i+1;
text_sound[j][nexti] ...
1
19 / 19 / 2
Регистрация: 30.03.2013
Сообщений: 35
18.04.2013, 15:03 7
Цитата Сообщение от angryjack93 Посмотреть сообщение
А каким образом мне тогда обратиться к следующему элементу?
Вместо text_sound[j][i--] пишите text_sound[j][i - 1], аналогично для +. Не совмещайте обращение к элементам массива и изменение счетчика в одной инструкции.
1
Tulosba
18.04.2013, 15:05
  #8

Не по теме:

Цитата Сообщение от shuffle Посмотреть сообщение
Не совмещайте обращение к элементам массива и изменение счетчика в одной инструкции.
Иногда это удобно и более лаконично. Просто надо понимать что делаешь.

0
shuffle
18.04.2013, 15:11
  #9

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Иногда это удобно и более лаконично. Просто надо понимать что делаешь.
Согласен с вами. Совет относится к новичку. Особенно в подобном коде, в котором на результат влияет семантика ленивых вычислений оператора ||.

1
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
19.04.2013, 08:11  [ТС] 10
хм, а почему у меня при замене на такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for(int i = 0; i < kol_symb_text; i++){
        cout << text_sound[j][i];
            switch(text_sound[j][i]){
                case 'а':
                    cout << "\n" << text_sound[j][i];
                    break;
                case 'б': 
                    cout << "\n" << text_sound[j][i];
                    if(text_sound[j][i+1] == text_sound[j][i]){}
                    if(text_sound[j][i+1] == 'ь'){}
                    break;
                case 'в': 
                    cout << "\n" << text_sound[j][i];
                    if(text_sound[j][i+1] == text_sound[j][i]){}
                    if(text_sound[j][i+1] == 'ь'){}
                    break;
Тут в общем при любых буквах пробегает по всем ветвям case. В общем снова ввожу "просто", а выводит:
"пр
рос
ст
то"

Должно же только по определенной ветви идти? ИЛи я не прав?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
19.04.2013, 08:42 11
Цитата Сообщение от angryjack93 Посмотреть сообщение
Тут в общем при любых буквах пробегает по всем ветвям case. В общем снова ввожу "просто", а выводит:
"пр
рос
ст
то"

Должно же только по определенной ветви идти? ИЛи я не прав?
Чего вообще Вы хотите добиться? Если не понятно как ветвится программа - запустите под отладчиком.
0
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
19.04.2013, 09:05  [ТС] 12
Цитата Сообщение от Tulosba Посмотреть сообщение
Чего вообще Вы хотите добиться? Если не понятно как ветвится программа - запустите под отладчиком.
Я хочу, чтобы от одной буквы шло по ветви с той же буквой, а не чтобы у меня при "р" шло по ветке "а":\
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
19.04.2013, 09:33 13
Цитата Сообщение от angryjack93 Посмотреть сообщение
Я хочу, чтобы от одной буквы шло по ветви с той же буквой, а не чтобы у меня при "р" шло по ветке "а":\
Я имел в виду логику более высокого уровня. Что должна делать программа? Приведите итоговый код, где ветвление идет не так, как Вам хочется.
0
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
20.04.2013, 12:28  [ТС] 14
Первый пост - вся программа. Суть ее работы: помещаем в двумерный массив разбитый на слова другой, одномерный массив. Передаем двумерный в функцию, где Каждый элемент проверяется (какая буква этот элемент) и в зависимости от буквы идет по определенной ветви. Сами ветки ничего пока что не делают...
Если это не то, что вам надо, то я не в курсе, что еще написать:\

Вся конструкция switch идет неправильно.

Добавлено через 20 часов 46 минут
Похоже, что идей ни у кого нет(

Добавлено через 11 минут
Хм, оказывается дело в кодировке:\ НО! Если я ставлю system("chcp 1251"), то вся кириллица выводиться непонятными иероглифами, но работает правильно... идет по нужной ветке. Пробовал ставить chcp 65001, но тогда русские буквы вообще не выводит. Какую кодировку ставить не пойму:/
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.04.2013, 14:12 15
Цитата Сообщение от angryjack93 Посмотреть сообщение
Первый пост - вся программа.
В строке 34 не выделена память, надо хотя бы так:
C++
1
char text_string[100] = "";
Отсюда возможны разные нюансы поведения.
1
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
20.04.2013, 14:27  [ТС] 16
Цитата Сообщение от Tulosba Посмотреть сообщение
В строке 34 не выделена память, надо хотя бы так:
C++
1
char text_string[100] = "";
Отсюда возможны разные нюансы поведения.
Соглашусь, но мне неизвестно количество элементов, пока пользователь их не введет
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.04.2013, 14:32 17
Цитата Сообщение от angryjack93 Посмотреть сообщение
Соглашусь, но мне неизвестно количество элементов, пока пользователь их не введет
Используйте std::string тогда. Просто писать в массив, под который не выделена память нельзя.
1
7 / 3 / 2
Регистрация: 04.11.2012
Сообщений: 218
20.04.2013, 18:06  [ТС] 18
Но проблема с кодировкой все равно не решена:\
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.04.2013, 23:47 19
Цитата Сообщение от angryjack93 Посмотреть сообщение
Но проблема с кодировкой все равно не решена:\
По кодировке в консоле много тем. Смотрите в ВАЖНЫХ для начала.
1
20.04.2013, 23:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.04.2013, 23:47
Помогаю со студенческими работами здесь

Переписать в массив все значения матрицы меньшие заданного значения
Переписать в массив С все значения матрицы D, меньше заданного в, найти произведение этих элементов...

Сформировать двумерный массив содержащий значения аргумента и значения функции
по заданным функцией у = f (x), промежутком и шагом сформировать двухмерный массив значений функции...

Создать новый массив из элементов исходного, значения которых больше среднего значения
Добрый вечер! Подскажите, пожалуйста, что нужно исправит, чтобы заработало... Создать новый...

Массив: Заменить значения всех элементов главной диагонали массива на значения, противоположные им по знаку.
Дан двухмерный массив целых чисел размерностью 10х10. Заменить значения всех элементов главной...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru