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

Объясните строки кода - C++

Восстановить пароль Регистрация
 
vladislavka_kh
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 34
12.06.2013, 23:21     Объясните строки кода #1
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
#include <iostream>
#include <string>
#include <string.h>
#include <Windows.h>
using namespace std;
 
void RMes(char *message)//функция для выводла русского текста
{
    [B]char rmessage[256];[/B]
    CharToOem(message,rmessage);
    cout<<rmessage;
}
//////////////////////////////////////////////
// переводим дни в текст                    //
//////////////////////////////////////////////
void DaysToText(int days)//функция преобразет день в текст
{
 
    [B]char digits_twelve[][20][/B]={" первое"," второе"," третье"," четвертое"," пятое"," шестое"," седьмое"," восьмое"," девятое"," десятое"," одинадцатое"," двенадцатое"," тринадцатое"," четырнадцатое"," пятнадцатое"," шестнадцатое"," семнадцатое"," восемнадцатое"," девятнадцатое"};
    char digits_des[][20]={"десять"," двадцать"," тридцать"," сорок"," пятьдесят"," шестьдесят"," семьдесят"," восемьдесят"," девяносто"};
    char digits_des_only[][20]={" десятое"," двадцатое"," тридцатое"};
    //все возможные числда в текстовом эквавиленте
 
    char day_res[50]={0};//результат который потом выводится
    
    [B]int  value = days;[/B]//значение с которым работаем
    int amount;//колличество вхождений определенного числа
        
        while(value)//цыкл пока наше значение ( то есть дни )
        {       
                if(value >= 20 && value < 100)//если число между 20 и ста ( 20 включительно)
                {
                    amount=value/10;//делим значение на 10 и узнаем колличество десятков 
                    value-=10*amount;//отнимаем от текущего значения колличество вхождений умноженое на 10
                    if(value == 0)//если число например 20 или 30 то есть после отимания остается 0
                    {
                        [B]strcat(day_res,digits_des_only[amount-1])[/B];//то к результату добавляем элемент из 3 массива(-1 потому что амаунт начинается с единицы, а в массиве с 0)
                        break;//прерываем если не написать то будет полная фигня, то есть он ещё раз пройдет и что то допишет
                    }
                    else [B]strcat(day_res,digits_des[amount-1])[/B];//если не равен 0 то дописуем к результату из массива
                    
                    
                }
                if (value < 20)//если меньше 20 то просто выбираем из массива в котором хранятся числа от 1 до 19
                {   
                    strcat(day_res,digits_twelve[value-1]);
                    value=0;//значение присваиваем 0 чтоб закончить цикл
                }
                             
        }
        RMes("\t");//табуляция
        RMes(day_res);//вывыодим на экран день в тексте
}
//////////////////////////////////////////////
// переводим месяц в текст                  //
//////////////////////////////////////////////
void MounthToText(int mounth)
{
    char mounth_text[][10]={" января"," февраля"," марта"," апреля"," майя"," июня"," июля"," августа"," сентября"," октября"," ноября"," декабря"};
    char mounth_res[10]={0};//результирующий месяц
    int value = mounth;//значение присваиваем введеныый месяц 
    [B]strcat(mounth_res,mounth_text[value-1])[/B];//добавляем к результир. мес. значение из массива, то есть мессяц к пример если число было введено 12( значит 12 - 1 = эллемент 11 - декабрь)
    RMes(mounth_res);//выводим на экран месяц
}
//////////////////////////////////////////////
// переводим год в текст                    //  
//////////////////////////////////////////////
void YearToText(int year)
{
    char digits[][10]={" одна"," две"," три"," четыри"," пять"," шесть"," семь"," восемь"," девять"};
    char digits_only[][10]={" одна"," двух"," трьох"," четырьох"," пяти"," шести"," семи"," восеми"," девяти"};
        
    char digits_twelve[][20]={" первого"," второго"," третьего"," четвертого"," пятого"," шестого"," седьмого"," восьмого"," девятого"," десятого"," одинадцатого"," двенадцатого"," тринадцатого"," четырнадцатого"," пятнадцатого"," шестнадцатого"," семнадцатого"," восемнадцатого"," девятнадцатого"};
    
    char digits_des[][20]={" десять"," двадцать"," тридцать"," сорок"," пятьдесят"," шестьдесят"," семьдесят"," восемьдесят"," девяносто"};
    char digits_des_only[][20]={" десятого"," двадцатого"," тридцатого"," сорокового"," пятьдисятого"," шестидесятого"," семидесятого"," восьмидесятго"," девяностого"};
    
    char digits_sot[][20]={" сто"," двести"," триста"," четыриста"," пятьсот"," шестьсот"," семьсот"," восемьсот"," девятьсот",};
    char digits_sot_only[][20]={" сотого"," двухсотого"," трьохсотого"," четырьохсотого"," пятьсотого"," шестьсотого"," семьсотого"," восемьсотого"," деветьсотого",};
 
    char digits_thousand[][10]={" тысяча"," тысячи"," тысяч","тысячного"};
    //ну как тебе, тут проверь на ошибки имеено в самих словах, а так все правильно :)
    char year_res[100]={0};//результирующий год
 
    int amount=0,value=0;//колличество и значение
    
        value = year;//значение присваиваем год
        
        while(value)//цикл пока значение не станет 0 
        {
                if(value >= 1000 && value < 10000)//если между 1000 и 10000 (10000 не включительно
                {
                    amount=value/1000; //так жеш само считаем колличество
                    value-=1000*amount;//отнимаем от значениея колличество вхождений тисяч
                    if(value == 0)//если 0 то
                    {
                        if(amount == 1)strcat(year_res,digits_thousand[3]);//если 1 и 0 то есть введен год 1000 то будет тысячного
                        else//если ноль но не 1 то есть 7000  или 8000 или 4000 ровное то
                        {
                        strcat(year_res,digits_only[amount-1]);//добавляем к результату колличество  двух трьох четырьох т.д
                        strcat(year_res,digits_thousand[3]);//и добавляем "тысячного"
                        }
                        break;//прерываем обязательно что не добавило лишнего
                    }
                    else //если не ровное например 7686 или 4567
                    {
                        strcat(year_res,digits[amount-1]);//добавляем колличество одна две три четыри
                        if(amount == 1)strcat(year_res,digits_thousand[0]);//если 1 "тысяча"
                        if(amount == 2 || amount == 3 || amount == 4)strcat(year_res,digits_thousand[1]);//если 2 3 4 то тысячи
                        if(amount == 5 || amount == 6 || amount == 7 || amount == 8 || amount == 9)strcat(year_res,digits_thousand[2]);// 6 7 8 9 "тысяч"
                    }
 
                }
 
                if(value >= 100 && value < 1000)//между 100 и 1000( 1000 не включительно)
                {
                    amount=value/100; //колличество вхождений
                    value-=100*amount;//отнимаем это число например если вадуе было 757 значит отнимаем 700 останется 57
                    if(value == 0)//если 200 300 400 то есть ровные
                    {
                        strcat(year_res,digits_sot_only[amount-1]);//добавляем к результату сотого двухсотого
                        break;//прерываем обязательно
                    }
                    else //если 234 456 то есть не ровное
                    {
                        strcat(year_res,digits_sot[amount-1]);//добавляем к результату двести триста в зависимости от амаунт
                    }
 
                }
 
                if(value >= 20 && value < 100)//ну это было описано раньше тут так жешь само только добавляем к году а не ко дню
                {
                    amount=value/10; 
                    value-=10*amount;
                    if(value == 0)
                    {
                        strcat(year_res,digits_des_only[amount-1]);
                        break;
                    }
                    else strcat(year_res,digits_des[amount-1]);
                    
                    
                }
                if (value < 20)
                {   
                    strcat(year_res,digits_twelve[value-1]);
                    value=0;
                }
                             
        }
        strcat(year_res," года");//добавляем к результату слово "года" с пробелом заметь там все сразу с пробелами
        RMes(year_res);//выводим год
        
    
}
//////////////////////////////////////////////
//меню                                      //  
//////////////////////////////////////////////
void Menu()
{
    RMes( "\tВведите дату формата дд мм гг( например 03 11 1991 ):\n");//просто вывыоди такое вот сообщение
}
//////////////////////////////////////////////
//продолжить/выход                                      //  
//////////////////////////////////////////////
void Vubor(int *choise)//в зависимости от пользователя выходит или продолжает работать
{
    RMes( "\tДля продолжения нажмите (1)\n\tДля выхода нажмите (2)\n\tВаш выбор:");
    int help;// вспомогательная
    cin>>help;
    *choise = help;//выбор равняется 1 или 2
    cout<<endl;
 
}
//////////////////////////////////////////////
//формат                                    //  
//////////////////////////////////////////////
void Format()//основная функция
{
    int i;//счетчик
    int date[3];//массив даты в нем хранятся дни месяца и годы
 
    RMes("\tвведите дату ( 03 11 1991 ): ");
 
    for(i=0;i<3;i++)cin>>date[i];//вводим дату с пробелами или ентарами
 
    if(date[0] > 31 || date[0] <= 0) RMes("\tВы ввели не существующий день\n\n");//если день больше 31 или равен 0 вывыодим сообщение
    else
    {
        if(date[1] > 12 || date[1] <= 0) RMes("\tВы ввели не существующий месяц\n\n");//проверяем на корректность месяц
        else
        {
            if(date[2] > 9999 || date[2] <= 0) RMes("\tВы ввели слишком большой год (или год до н.э.)\n\n");//проверяем на корректность год
            else//а вот теперь вся предыдущая "мочь" вытикает в 5 основных строк
            {
                RMes("\tКонвертированая дата:\n");//сообщение
                DaysToText(date[0]);//подставляем в функцию день ( то есть первый элемент массива) она же выведет его на жкран
                MounthToText(date[1]);//так жеш само месяц
                YearToText(date[2]);//и год
                cout<<endl<<endl;//все выводится только если все условия редыдущие были правдой, если хотя бы одно из них ложь то  ( то есть белым)
            }
        }
    }
 
}
 
 
//////////////////////////////////////////////
// главная функция                          //  
//////////////////////////////////////////////
void main()//ну и главная фнкция очень простая
{
    int choise = 0;//выбор
    RMes("\t\t\tЗдраствуйте!\n");//приветствие
    Menu();//вызываем меню
    Format();//вызываем функцию ковертации
    while (true)//делаем бесконечный цикл
    {
    Vubor(&choise);//вводим выбор
 
    if(choise==1)//если выбор был 1 то опять конвертируем дату
    {
        Menu();
        Format();
    }
    if(choise==2)exit(1);//если два то выходим с программы ( в скобка должно быть exit(1) чтоб вышло с программы а не с цикла
    
    }
    //дальше она говорит молодец  мужик и ставить тебе не меньше 85 :)
//для дальнейших вопросах пишите мне в асю или на мыло, приятно с вами работать !
    
}
Добавлено через 1 минуту
char rmessage[256] - почему 256
char digits_twelve[][20] - почему пустые первые и почему 20
strcat(day_res,digits_des_only[amount-1]) - что делает функция и её тип?
int value = days; - чтоделает
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2013, 23:21     Объясните строки кода
Посмотрите здесь:

Объясните часть кода программы C++
C++ Объясните кусок кода
C++ Объясните работу кода
C++ Объясните пожалуйста участок кода
Объясните фрагмент кода! C++
C++ Объясните участок кода
Объясните фрагменты кода C++
Объясните, пожалуйста, фрагмент кода C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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