Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Исходный код программы.

ПРИБОРОСТРОЕНИЯ И ИНФОРМАТИКИ

Кафедра ИТ-6 «Управление и моделирование систем»

Отчет о выполнении

Домашней работы №1 по предмету

Теории языков программирования и методы трансляции».

Выполнил:

студент 3 курса,

Группы ИТ-6

Студ. билета 100104

Васильев А.С.

 

 

Москва, 2012

Задание.

Написать программу, которая переводит введённые пользователем числа английского языка прописью на цифры, принятые в древней Руси и на арабские цифры. Учесть возможные ошибки пользователя.

 

 

Анализ исходного кода.


Использован язык программирования C#. Программа представляет собой конечный детерминированный автомат, таблица переходов которого содержится в виде массива в классе CAutomat.

Проверка строки происходит по нажатию кнопки: сначала строка разбивается на отдельные слова, затем начинаются переходы по массиву автомата вместе с проверкой на правильность написания слов.

При обнаружении неизвестного слова, проверяется правописание – возможно, пользователь всего лишь не дописал букву или ошибся, и в таком случае указывается слово, которое пользователь мог иметь ввиду.

 

 

Исходный код программы.

Класс 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;

}

<== предыдущая лекция | следующая лекция ==>
К итоговой аттестации по дисциплине (ЗАЧЕТ) | Конкурслар.




© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.