![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Исходный код программы.
ПРИБОРОСТРОЕНИЯ И ИНФОРМАТИКИ Кафедра ИТ-6 «Управление и моделирование систем» Отчет о выполнении Домашней работы №1 по предмету Теории языков программирования и методы трансляции». Выполнил: студент 3 курса, Группы ИТ-6 Студ. билета 100104 Васильев А.С.
Москва, 2012 Задание. Написать программу, которая переводит введённые пользователем числа английского языка прописью на цифры, принятые в древней Руси и на арабские цифры. Учесть возможные ошибки пользователя.
Анализ исходного кода.
Проверка строки происходит по нажатию кнопки: сначала строка разбивается на отдельные слова, затем начинаются переходы по массиву автомата вместе с проверкой на правильность написания слов. При обнаружении неизвестного слова, проверяется правописание – возможно, пользователь всего лишь не дописал букву или ошибся, и в таком случае указывается слово, которое пользователь мог иметь ввиду.
Исходный код программы. Класс CAutomat: class CAutomat { public List< string> words = new List< string> (); public int wc = 0; // кол-во слов public struct elem { public string cur, term, rus, hrus; // term - слово, cur и next - названия вершин графа, rus - в русских символах, hrus - сотни в русских символах public string[] next; // Вариантов next иногда может быть несколько public int num; // само число public bool begin, end; // Может ли предложение начинаться и заканчиваться этим словом } public elem[] elems = new elem[37]; public void clear(){ words.Clear(); } public CAutomat() { elems[0].cur = " U1"; elems[0].num = 1; elems[0].term = " one"; elems[0].rus = " а"; elems[0].hrus = " р"; elems[0].next = new string[1]; elems[0].next[0] = " H"; elems[0].begin = true; elems[0].end = true; elems[1].cur = " U2"; elems[1].num = 2; elems[1].term = " two"; elems[1].rus = " В"; elems[1].hrus = " с"; elems[1].next = new string[1]; elems[1].next[0] = " H"; elems[1].begin = true; elems[1].end = true; elems[2].cur = " U3"; elems[2].num = 3; elems[2].term = " three"; elems[2].rus = " Г"; elems[2].hrus = " т "; elems[2].next = new string[1]; elems[2].next[0] = " H"; elems[2].begin = true; elems[2].end = true; elems[3].cur = " U4"; elems[3].num = 4; elems[3].term = " four"; elems[3].rus = " Д"; elems[3].hrus = " ɤ "; elems[3].next = new string[1]; elems[3].next[0] = " H"; elems[3].begin = true; elems[3].end = true; elems[4].cur = " U5"; elems[4].num = 5; elems[4].term = " five"; elems[4].rus = " Є"; elems[4].hrus = " ф"; elems[4].next = new string[1]; elems[4].next[0] = " H"; elems[4].begin = true; elems[4].end = true; elems[5].cur = " U6"; elems[5].num = 6; elems[5].term = " six"; elems[5].rus = " S"; elems[5].hrus = " х"; elems[5].next = new string[1]; elems[5].next[0] = " H"; elems[5].begin = true; elems[5].end = true; elems[6].cur = " U7"; elems[6].num = 7; elems[6].term = " seven"; elems[6].rus = " З"; elems[6].hrus = " ψ "; elems[6].next = new string[1]; elems[6].next[0] = " H"; elems[6].begin = true; elems[6].end = true; elems[7].cur = " U8"; elems[7].num = 8; elems[7].term = " eight"; elems[7].rus = " И"; elems[7].hrus = " w"; elems[7].next = new string[1]; elems[7].next[0] = " H"; elems[7].begin = true; elems[7].end = true; elems[8].cur = " U9"; elems[8].num = 9; elems[8].term = " nine"; elems[8].rus = " ϴ "; elems[8].hrus = " ц"; elems[8].next = new string[1]; elems[8].next[0] = " H"; elems[8].begin = true; elems[8].end = true;
elems[9].cur = " H"; elems[9].num = 100; elems[9].term = " hundred"; elems[9].rus = " "; elems[9].next = new string[27]; elems[9].next[0] = " T1"; elems[9].next[1] = " T2"; elems[9].next[2] = " T3"; elems[9].next[3] = " T4"; elems[9].next[4] = " T5"; elems[9].next[5] = " T6"; elems[9].next[6] = " T7"; elems[9].next[7] = " T8"; elems[9].next[8] = " T9"; elems[9].next[9] = " D2"; elems[9].next[10] = " D3"; elems[9].next[11] = " D4"; elems[9].next[12] = " D5"; elems[9].next[13] = " D6"; elems[9].next[14] = " D7"; elems[9].next[15] = " D8"; elems[9].next[16] = " D9"; elems[9].next[17] = " SU1"; elems[9].next[18] = " SU2"; elems[9].next[19] = " SU3"; elems[9].next[20] = " SU4"; elems[9].next[21] = " SU5"; elems[9].next[22] = " SU6"; elems[9].next[23] = " SU7"; elems[9].next[24] = " SU8"; elems[9].next[25] = " SU9"; elems[9].next[26] = " T0"; elems[9].begin = false; elems[9].end = true;
elems[10].cur = " T1"; elems[10].num = 11; elems[10].term = " eleven"; elems[10].rus = " aI"; /*automat[10].next = new string[1]; automat[10].next[0] = " H"; */ elems[10].begin = true; elems[10].end = true; // Нет next elems[11].cur = " T2"; elems[11].num = 12; elems[11].term = " twelve"; elems[11].rus = " вI"; elems[11].begin = true; elems[11].end = true; elems[12].cur = " T3"; elems[12].num = 13; elems[12].term = " thirteen"; elems[12].rus = " гI"; elems[12].begin = true; elems[12].end = true; elems[13].cur = " T4"; elems[13].num = 14; elems[13].term = " fourteen"; elems[13].rus = " дI"; elems[13].begin = true; elems[13].end = true; elems[14].cur = " T5"; elems[14].num = 15; elems[14].term = " fifteen"; elems[14].rus = " ЄI"; elems[14].begin = true; elems[14].end = true; elems[15].cur = " T6"; elems[15].num = 16; elems[15].term = " sixteen"; elems[15].rus = " SI"; elems[15].begin = true; elems[15].end = true; elems[16].cur = " T7"; elems[16].num = 17; elems[16].term = " seventeen"; elems[16].rus = " ЗI"; elems[16].begin = true; elems[16].end = true; elems[17].cur = " T8"; elems[17].num = 18; elems[17].term = " eighteen"; elems[17].rus = " ИI"; elems[17].begin = true; elems[17].end = true; elems[18].cur = " T9"; elems[18].num = 19; elems[18].term = " nineteen"; elems[18].rus = " ϴ I"; elems[18].begin = true; elems[18].end = true;
elems[19].cur = " D2"; elems[19].num = 20; elems[19].term = " twenty"; elems[19].rus = " K"; elems[19].next = new string[9]; elems[19].next[0] = " SU1"; elems[19].next[1] = " SU2"; elems[19].next[2] = " SU3"; elems[19].next[3] = " SU4"; elems[19].next[4] = " SU5"; elems[19].next[5] = " SU6"; elems[19].next[6] = " SU7"; elems[19].next[7] = " SU8"; elems[19].next[8] = " SU9"; elems[19].begin = true; elems[19].end = true; elems[20].cur = " D3"; elems[20].num = 30; elems[20].term = " thirty"; elems[20].rus = " Л"; elems[20].next = new string[9]; elems[20].next[0] = " SU1"; elems[20].next[1] = " SU2"; elems[20].next[2] = " SU3"; elems[20].next[3] = " SU4"; elems[20].next[4] = " SU5"; elems[20].next[5] = " SU6"; elems[20].next[6] = " SU7"; elems[20].next[7] = " SU8"; elems[20].next[8] = " SU9"; elems[20].begin = true; elems[20].end = true; elems[21].cur = " D4"; elems[21].num = 40; elems[21].term = " fourty"; elems[21].rus = " М"; elems[21].next = new string[9]; elems[21].next[0] = " SU1"; elems[21].next[1] = " SU2"; elems[21].next[2] = " SU3"; elems[21].next[3] = " SU4"; elems[21].next[4] = " SU5"; elems[21].next[5] = " SU6"; elems[21].next[6] = " SU7"; elems[21].next[7] = " SU8"; elems[21].next[8] = " SU9"; elems[21].begin = true; elems[21].end = true; elems[22].cur = " D5"; elems[22].num = 50; elems[22].term = " fifty"; elems[22].rus = " Н"; elems[22].next = new string[9]; elems[22].next[0] = " SU1"; elems[22].next[1] = " SU2"; elems[22].next[2] = " SU3"; elems[22].next[3] = " SU4"; elems[22].next[4] = " SU5"; elems[22].next[5] = " SU6"; elems[22].next[6] = " SU7"; elems[22].next[7] = " SU8"; elems[22].next[8] = " SU9"; elems[22].begin = true; elems[22].end = true; elems[23].cur = " D6"; elems[23].num = 60; elems[23].term = " sixty"; elems[23].rus = " з"; elems[23].next = new string[9]; elems[23].next[0] = " SU1"; elems[23].next[1] = " SU2"; elems[23].next[2] = " SU3"; elems[23].next[3] = " SU4"; elems[23].next[4] = " SU5"; elems[23].next[5] = " SU6"; elems[23].next[6] = " SU7"; elems[23].next[7] = " SU8"; elems[23].next[8] = " SU9"; elems[23].begin = true; elems[23].end = true; elems[24].cur = " D7"; elems[24].num = 70; elems[24].term = " seventy"; elems[24].rus = " О"; elems[24].next = new string[9]; elems[24].next[0] = " SU1"; elems[24].next[1] = " SU2"; elems[24].next[2] = " SU3"; elems[24].next[3] = " SU4"; elems[24].next[4] = " SU5"; elems[24].next[5] = " SU6"; elems[24].next[6] = " SU7"; elems[24].next[7] = " SU8"; elems[24].next[8] = " SU9"; elems[24].begin = true; elems[24].end = true; elems[25].cur = " D8"; elems[25].num = 80; elems[25].term = " eighty"; elems[25].rus = " П"; elems[25].next = new string[9]; elems[25].next[0] = " SU1"; elems[25].next[1] = " SU2"; elems[25].next[2] = " SU3"; elems[25].next[3] = " SU4"; elems[25].next[4] = " SU5"; elems[25].next[5] = " SU6"; elems[25].next[6] = " SU7"; elems[25].next[7] = " SU8"; elems[25].next[8] = " SU9"; elems[25].begin = true; elems[25].end = true; elems[26].cur = " D9"; elems[26].num = 90; elems[26].term = " ninety"; elems[26].rus = " Ч"; elems[26].next = new string[9]; elems[26].next[0] = " SU1"; elems[26].next[1] = " SU2"; elems[26].next[2] = " SU3"; elems[26].next[3] = " SU4"; elems[26].next[4] = " SU5"; elems[26].next[5] = " SU6"; elems[26].next[6] = " SU7"; elems[26].next[7] = " SU8"; elems[26].next[8] = " SU9"; elems[26].begin = true; elems[26].end = true;
elems[27].cur = " SU1"; elems[27].num = 1; elems[27].term = " one"; elems[27].rus = " а"; elems[27].begin = true; elems[27].next = new string[0]; elems[27].end = true; elems[28].cur = " SU2"; elems[28].num = 2; elems[28].term = " two"; elems[28].rus = " В"; elems[28].begin = true; elems[28].next = new string[0]; elems[28].end = true; elems[29].cur = " SU2"; elems[29].num = 3; elems[29].term = " three"; elems[29].rus = " Г"; elems[29].begin = true; elems[29].next = new string[0]; elems[29].end = true; elems[30].cur = " SU4"; elems[30].num = 4; elems[30].term = " four"; elems[30].rus = " Д"; elems[30].begin = true; elems[30].next = new string[0]; elems[30].end = true; elems[31].cur = " SU5"; elems[31].num = 5; elems[31].term = " five"; elems[31].rus = " Є"; elems[31].begin = true; elems[31].next = new string[0]; elems[31].end = true; elems[32].cur = " SU6"; elems[32].num = 6; elems[32].term = " six"; elems[32].rus = " S"; elems[32].begin = true; elems[32].next = new string[0]; elems[32].end = true; elems[33].cur = " SU7"; elems[33].num = 7; elems[33].term = " seven"; elems[33].rus = " З"; elems[33].begin = true; elems[33].next = new string[0]; elems[33].end = true; elems[34].cur = " SU8"; elems[34].num = 8; elems[34].term = " eight"; elems[34].rus = " И"; elems[34].begin = true; elems[34].next = new string[0]; elems[34].end = true; elems[35].cur = " SU9"; elems[35].num = 9; elems[35].term = " nine"; elems[35].rus = " ϴ "; elems[35].begin = true; elems[35].next = new string[0]; elems[35].end = true; elems[36].cur = " T0"; elems[36].num = 10; elems[36].term = " ten"; elems[36].rus = " I"; elems[36].begin = true; elems[36].next = new string[0]; elems[36].end = true;
} public void getWords(string s) { int pos = 0; int letts = 0; this.wc = 0; string word = " "; s += " "; while (pos! = s.Length) { char let = s[pos]; if (let! = ' ') { word += let; letts++; } else { if (letts! = 0) { this.words.Add(word); this.wc++; word = " "; letts = 0; } } pos++; } } }
Функция getWords разделяет строку на слова. Функция обработки строки (при нажатии кнопки): private void button1_Click(object sender, EventArgs e) { string str = textBox1.Text; int res = 0; // число в результате string strNow = " "; // Строка во время сканирования string rus = " "; // В русских символах int wn = 0; // индекс текущего слова int i = 0; // индекс автомата int iprev = 0; // индекс предыдущего значения автомата bool found = false; bool exac = false; bool ok = true; bool writeRes = true; // Выводить ли результат int[] checking; // Массив (будет из двух эл-тов) для функции проверки int unitsEnd = 9; // Точка, откуда сканировать, чтобы не попасть на первые единицы - они приведут к беконечным повторениям hundred automat.clear(); automat.getWords(str); int wc = automat.wc; // Изначальное кол-во слов if (automat.wc > 0) { string word = automat.words[wn]; // текущее слово. для удобства checking = check(word, exac); if (checking[1] == 1) { i = checking[0]; if (automat.elems[i].begin) { while (automat.wc > 0) { if (ok) { if (automat.elems[i].term! = " hundred") { res += automat.elems[i].num; rus = rus + automat.elems[i].rus; } else { res = res * automat.elems[i].num; rus = automat.elems[iprev].hrus; } strNow += automat.elems[i].term + " "; iprev = i; ok = false;
if (automat.wc > 1 & & wn < wc) { wn++; word = automat.words[wn]; checking = check(word, exac, unitsEnd); if (checking[1] == 1) { i = checking[0]; for (int n = 0; n < automat.elems[iprev].next.Length; n++) { if (automat.elems[iprev].next[n] == automat.elems[i].cur) { ok = true; break; } } } else { label1.Text = " Неизвестное слово - '" + word + " '"; if (checking[0]! = -1) label1.Text = " Неизвестное слово - '" + word + " ', возможно, вы имели в виду '" + automat.elems[checking[0]].term + " '"; writeRes = false; label2.Text = " "; break; } } automat.wc--; } else { label1.Text = " После '" + strNow.Trim() + " ' не может идти '" + automat.elems[i].term + " '"; label2.Text = " "; writeRes = false; break; } } if (writeRes) // Результат { label2.Text = Convert.ToString(res).Trim(); label1.Text = rus; } } else { label1.Text = " Нельзя начинать со слова '" + automat.elems[i].term + " '"; label2.Text = " "; writeRes = false; } } else { label1.Text = " Неизвестное слово - '" +word+" '"; if(checking[0]! =-1) label1.Text = " Неизвестное слово - '" + word + " ', возможно, вы имели в виду '" + automat.elems[checking[0]].term + " '"; label2.Text = " "; } } else { label1.Text = " Введите число прописью на английском"; label2.Text = " "; writeRes = false; }
} Функция проверки правописания: private int[] check(string word, bool exac, int k = 0) { string mb = " "; int i; int[] ret = new int[2]; // 0 - number, 1 - exactly found (0 or 1) for (i = k; i < automat.elems.Length; i++) // Ищем слово прямым сравнением { if (word == automat.elems[i].term) { ret[0] = i; ret[1] = 1; return ret; // Нашли слово - выходим из функции } } // Не вышли - значит не нашли, смотрим % совпадений int max = 0; int maxn = -1; // Индекс максимума совпадений int onel = 0; // Сколько % одна буква, назначается в цикле int perc = 0; string tmp = " -"; for (i = k; i < automat.elems.Length; i++) { perc = 0; string astr = automat.elems[i].term; string str = word; if (astr.Length > str.Length) onel = 100 / astr.Length; else onel = 100 / str.Length; for (int n = 0; n < word.Length; n++) { for (int c = 0; c < automat.elems[i].term.Length; c++) { if (astr[c] == str[n] & & str[n]! = tmp[0]) { perc += onel; str = str.Remove(n, 1); str = str.Insert(n, " -"); astr = astr.Remove(c, 1); astr = astr.Insert(c, " -"); } } } if (perc > = 70 & & perc > max) { max = perc; maxn = i; exac = false; } } ret[0] = maxn; ret[1] = 0; return ret; }
|