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

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

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

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

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

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

Выполнил:

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

Группы ИТ-6

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

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

Москва, 2012

Задание.

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

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


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

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

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

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

Класс CAutomat:

class CAutomat

{

public List words = new List();

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;

}


6959542406182869.html
6959611328459094.html
    PR.RU™