Нужно разобраться в коде прогрмаммы - C (СИ)
Формулировка задачи:
Данная программа получает дату в формате "число месяц год" и возвращает дату в формате ЧЧ.ММ.ГГГГ ограничившись 21-м столетием. Например, "двадцать первое декабря двенадцатого года" ⇒ 21.12.2012.
Помогите,пожалуйста, разобраться в коде?
#include "stdafx.h" #include <iostream> #include <string> #include <vector> #include <conio.h> #include "Windows.h" using namespace std; bool was_month; // переменная логического типа? void parse_string(wchar_t* a, int &d, int &m, int &y){ if(!was_month){ // что тут сравнивается? if(wcscmp(a, L"первое") == 0)d += 1; // поняла,что тут сравниваются строки для мультибайтовых символов, но не поняла до конца,что значит "мультибайтовые" и зачем они нужны? if(wcscmp(a, L"второе") == 0)d += 2; if(wcscmp(a, L"третье") == 0)d += 3; if(wcscmp(a, L"четвертое") == 0)d += 4; if(wcscmp(a, L"пятое") == 0)d += 5; if(wcscmp(a, L"шестое") == 0)d += 6; if(wcscmp(a, L"седьмое") == 0)d += 7; if(wcscmp(a, L"восьмое") == 0)d += 8; if(wcscmp(a, L"девятое") == 0)d += 9; if(wcscmp(a, L"десятое") == 0)d = 10; if(wcscmp(a, L"одиннадцатое") == 0)d = 11; if(wcscmp(a, L"двенадцатое") == 0)d = 12; if(wcscmp(a, L"тринадцатое") == 0)d = 13; if(wcscmp(a, L"четырнадцатое") == 0)d = 14; if(wcscmp(a, L"пятнадцатое") == 0)d = 15; if(wcscmp(a, L"шестнадцатое") == 0)d = 16; if(wcscmp(a, L"семнадцатое") == 0)d = 17; if(wcscmp(a, L"восемнадцатое") == 0)d = 18; if(wcscmp(a, L"девятнадцатое") == 0)d = 19; if(wcscmp(a, L"двадцатое") == 0)d = 20; if(wcscmp(a, L"двадцать") == 0)d += 20; if(wcscmp(a, L"тридцатое") == 0)d = 20; if(wcscmp(a, L"тридцать") == 0)d += 30; } else { if(wcscmp(a, L"двадцатого") == 0)y = 2020; if(wcscmp(a, L"двадцать") == 0)y += 20; if(wcscmp(a, L"тридцатого") == 0)y = 2030; if(wcscmp(a, L"тридцать") == 0)y += 30; if(wcscmp(a, L"сорокового") == 0)y = 2040; if(wcscmp(a, L"сорок") == 0)y += 40; if(wcscmp(a, L"пятидесятого") == 0)y = 2050; if(wcscmp(a, L"пятьдесят") == 0)y += 50; if(wcscmp(a, L"шестидесятого") == 0)y = 2060; if(wcscmp(a, L"шестьдесят") == 0)y += 60; if(wcscmp(a, L"семидесятого") == 0)y = 2070; if(wcscmp(a, L"семдесят") == 0)y += 70; if(wcscmp(a, L"восьмидесятого") == 0)y = 2080; if(wcscmp(a, L"восемьдесят") == 0)y += 80; if(wcscmp(a, L"девяностого") == 0)y = 2090; if(wcscmp(a, L"девяносто") == 0)y += 90; } if(wcscmp(a, L"января") == 0){m = 1; was_month = true;} if(wcscmp(a, L"февраля") == 0){m = 2; was_month = true;} if(wcscmp(a, L"марта") == 0){m = 3; was_month = true;} if(wcscmp(a, L"апреля") == 0){m = 4; was_month = true;} if(wcscmp(a, L"мая") == 0){m = 5; was_month = true;} if(wcscmp(a, L"июня") == 0){m = 6; was_month = true;} if(wcscmp(a, L"июля") == 0){m = 7; was_month = true;} if(wcscmp(a, L"августа") == 0){m = 8; was_month = true;} if(wcscmp(a, L"сентября") == 0){m = 9; was_month = true;} if(wcscmp(a, L"октября") == 0){m = 10; was_month = true;} if(wcscmp(a, L"ноября") == 0){m = 11; was_month = true;} if(wcscmp(a, L"декабря") == 0){m = 12; was_month = true;} if(wcscmp(a, L"первого") == 0)y += 2001; if(wcscmp(a, L"второго") == 0)y += 2002; if(wcscmp(a, L"третьего") == 0)y += 2003; if(wcscmp(a, L"четвертого") == 0)y += 2004; if(wcscmp(a, L"пятого") == 0)y += 2005; if(wcscmp(a, L"шестого") == 0)y += 2006; if(wcscmp(a, L"седьмого") == 0)y += 2007; if(wcscmp(a, L"восьмого") == 0)y += 2008; if(wcscmp(a, L"девятого") == 0)y += 2009; if(wcscmp(a, L"десятого") == 0)y = 2010; if(wcscmp(a, L"одиннадцатого") == 0)y = 2011; if(wcscmp(a, L"двенадцатого") == 0)y = 2012; if(wcscmp(a, L"тринадцатого") == 0)y = 2013; if(wcscmp(a, L"четырнадцатого") == 0)y = 2014; if(wcscmp(a, L"пятнадцатого") == 0)y = 2015; if(wcscmp(a, L"шестнадцатого") == 0)y = 2016; if(wcscmp(a, L"семнадцатого") == 0)y = 2017; if(wcscmp(a, L"восемнадцатого") == 0)y = 2018; if(wcscmp(a, L"девятнадцатого") == 0)y = 2019; } int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_ALL, ""); was_month = false; printf("Введите дату: "); char* t = new char[256]; fgets(t, 256, stdin); // что такое stdin и зачем он тут? wchar_t* tw = new wchar_t[256]; // как я поняла — выделение памяти? но что значит wchar_t ? OemToChar(t, tw); //переводит то что введено в консоли в мультибайтовый формат, но опять таки не понятно что это значит и зачем нужно? if(tw[wcslen(tw)-1] != 0)tw[wcslen(tw)-1] = L'\0';// эту строчку не понимаю совсем, что тут проверяется а затем делается? Предположение такое,что,для того,чтобы текст в число перевести,сравнивается введенный текст, если он является записью числа - то записывается соответствующее число,но хотелось бы поподробнее понять всю эту запись? int n = 0; int d=0; int m=0; int y=0; wchar_t* temp = new wchar_t[256]; // тут снова не понятно? int ni = 0; for(int i = 0; i < wcslen(tw); i++){ if( tw[i] == L' '){ // как так L' ' ? запуталась в цикле(( temp[ni] = L'\0'; parse_string(temp, d, m, y); ni = 0; } else { temp[ni] = tw[i]; ni++; } } printf("%d.%02d.%d", d, m, y); getch(); return 0; }
Решение задачи: «Нужно разобраться в коде прогрмаммы»
textual
Листинг программы
#include <stdio.h> #include <string.h> const char *s_day[31] = { "первое", "второе", "третье", "четвертое", "пятое", "шестое", "седьмое", "восьмое", "девятое", "десятое", "одиннадцатое", "двенадцатое", "тринадцатое", "четырнадцатое", "пятнадцатое", "шестнадцатое", "семнадцатое", "восемнадцатое", "девятнадцатое", "двадцатое", "двадцать первое", "двадцать второе", "двадцать третье", "двадцать четвертое", "двадцать пятое", "двадцать шестое", "двадцать седьмое", "двадцать восьмое", "двадцать девятое", "тридцатое", "тридцать первое" }; const char *s_month[12] = { "января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря" }; const char *s_year[100] = { "двухтясячного", "две тысячи первого", "две тысячи второго", "две тысячи третьего", "две тысячи четвертого", "две тысячи пятого", "две тысячи шестого", "две тысячи седьмого", "две тысячи восьмого", "две тысячи девятого", "две тысячи десятого", "две тысячи одиннадцатого", "две тысячи двенадцатого", "две тысячи тринадцатого", "две тысячи четырнадцатого", "две тысячи пятнадцатого", "две тысячи шестнадцатого", "две тысячи семнадцатого", "две тысячи восемнадцатого", "две тысячи девятнадцатого", "две тысячи двадцатого", "две тысячи двадцать первого", "две тысячи двадцать второго", "две тысячи двадцать третьего", "две тысячи двадцать четвертого", "две тысячи двадцать пятого", "две тысячи двадцать шестого", "две тысячи двадцать седьмого", "две тысячи двадцать восьмого", "две тысячи двадцать девятого", "две тысячи тридцатого", "две тысячи тридцать первого", "две тысячи тридцать второго", "две тысячи тридцать третьего", "две тысячи тридцать четвертого", "две тысячи тридцать пятого", "две тысячи тридцать шестого", "две тысячи тридцать седьмого", "две тысячи тридцать восьмого", "две тысячи тридцать девятого", "две тысячи сорокового", "две тысячи сорок первого", "две тысячи сорок второго", "две тысячи сорок третьего", "две тысячи сорок четвертого", "две тысячи сорок пятого", "две тысячи сорок шестого", "две тысячи сорок седьмого", "две тысячи сорок восьмого", "две тысячи сорок девятого", "две тысячи пятидесятого", "две тысячи пятьдесят первого", "две тысячи пятьдесят второго", "две тысячи пятьдесят третьего", "две тысячи пятьдесят четвертого", "две тысячи пятьдесят пятого", "две тысячи пятьдесят шестого", "две тысячи пятьдесят седьмого", "две тысячи пятьдесят восьмого", "две тысячи пятьдесят девятого", "две тысячи шестидесятого", "две тысячи шестьдесят первого", "две тысячи шестьдесят второго", "две тысячи шестьдесят третьего", "две тысячи шестьдесят четвертого", "две тысячи шестьдесят пятого", "две тысячи шестьдесят шестого", "две тысячи шестьдесят седьмого", "две тысячи шестьдесят восьмого", "две тысячи шестьдесят девятого", "две тысячи семидесятого", "две тысячи семьдесят первого", "две тысячи семьдесят второго", "две тысячи семьдесят третьего", "две тысячи семьдесят четвертого", "две тысячи семьдесят пятого", "две тысячи семьдесят шестого", "две тысячи семьдесят седьмого", "две тысячи семьдесят восьмого", "две тысячи семьдесят девятого", "две тысячи восьмидесятого", "две тысячи восемьдесят первого", "две тысячи восемьдесят второго", "две тысячи восемьдесят третьего", "две тысячи восемьдесят четвертого", "две тысячи восемьдесят пятого", "две тысячи восемьдесят шестого", "две тысячи восемьдесят седьмого", "две тысячи восемьдесят восьмого", "две тысячи восемьдесят девятого", "две тысячи девяностого", "две тысячи девяносто первого", "две тысячи девяносто второго", "две тысячи девяносто третьего", "две тысячи девяносто четвертого", "две тысячи девяносто пятого", "две тысячи девяносто шестого", "две тысячи девяносто седьмого", "две тысячи девяносто восьмого", "две тысячи девяносто девятого" }; struct Date { char day[256]; char month[256]; char year[256]; int dd; int mm; int yy; }; Date retDiditalDate(const char*day, const char*month, const char*year) { Date date; for(int i = 0; i < 31; i++) if(strcmp(day, s_day[i])==0) date.dd = i+1; for(int i = 0; i < 12; i++) if(strcmp(month, s_month[i])==0) date.mm = i+1; for(int i = 0; i < 100; i++) if(strcmp(year, s_year[i])==0) date.yy = 2000+i; return date; } int main() { Date d = retDiditalDate("тридцать первое", "декабря", "две тысячи четырнадцатого"); printf("%d.%d.%d\n", d.dd, d.mm, d.yy); }
Объяснение кода листинга программы
- Переменные
s_day
,s_month
иs_year
объявлены как массивы константных указателей на строки, которые содержат названия дней недели, месяцев и годов. - В функции
retDiditalDate
происходит поиск соответствующих значений дня, месяца и года в массивахs_day
,s_month
иs_year
соответственно. - Если найдены все три значения, они присваиваются соответствующим полям структуры
Date
. - В основной функции
main
создается экземпляр структурыDate
с помощью функцииretDiditalDate
. - Значения полей
dd
,mm
иyy
выводятся на экран с помощью функцииprintf
. - В данном случае на экран будет выведено
31.12.2014
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д