=Легенда= Дан текст программы на языке С с функциями f и g. Предполагается, что функции f и g могут выполняться параллельно в двух разных потоках управления (процессах) P_f и P_g соответственно. Будем считать состоянием модели значения счётчиков команд c_f и c_g процессов P_f и P_g, значения глобальных и локальных переменных заданной программы. Неинициализированные переменные принимают специальное значение, обозначаемое символом #, лежащее вне диапазона MININT..MAXINT. Требуется: 1. Оценить размер множества потенциальных состояний программы. Ответ обосновать. 2. Оценить размер множества достижимых состояний программы. Ответ обосновать. В обосновании описать множество достижимых состояний с помощью линейных равенств и неравенств на языке C. Например, (c_f == 3 && a < 5) || (c_g == 4 && b > d). 3. Написать программу на языке С, которая вычисляет и записывает в текстовой файл states.txt множество достижимых состояний заданной программы для значений параметров a = 1, b = 2, c = 3, d = 4., а также выводит в стандартный поток вывода количество достижимых состояний. Последний срок сдачи задания -- 1 марта. =Требования к письму, содержащему решение= Письмо с одним архивом в качестве вложения не принимается. В письме должны содержаться ФИО и номер группы автора решения и 3 вложения: 1. Исходная формулировка задачи с именем task.txt 2. Описание решения пп. 1-2 в текстовом вложении с именем solution.txt. Текстовое вложение -- это текстовый файл в одной из кодировок: utf8, cp1251 (Windows), koi8-r. Документ Microsoft Word не является текстовым файлом. 3. Файл task1.c с программой подсчёта состояний. Требования к программе: 3.1 Программа должны вычислять множество достижимых состояний программы, заданной в п.3 задания 1 для значений параметров a = 1, b = 2, c = 3, d = 4. Праграмма должна уметь выводить множество состояний в текстовой файл в формате значение счётчика f, значение счётчика g, значение h, значение f.a, значение f.b, значение g.a, значение а.b, по одному состоянию в строке. Значения счётчиков нумеруются с 0. Первая строка файла должна содержать описание формата вывода, а именно: c_f, c_g, h, f.a, f.b, g.a, g.b 3.1 Программа должны выполняться в консоли, со следующими параметрами: -file имя_файла - запись состояний в указанный файл, -count - вывод общего количества состояний программы в стандартный поток вывода. При запуске без параметров программа должна выводить информацию о программе, авторе, годе написания и параметрах запуска. При запуске с обоими параметрами одновременно программа должна выполнять оба действия. Порядок следования параметров при этом значения не имеет. 3.2 Написана на языке ANSI C либо ANSI/ISO C++. 3.3 Текст программы должен содержаться в единственном файле task1.c. 3.4 Допускается использование только библиотек stdlib, STL, boost. 3.5. Текст программы должен быть снабжён исчерпывающими комментариями. Как минимум, должны быть прокомментированы все объявления функций, операторы ветвления и линейные участки программы. 3.6 Программа должна быть написана самостоятельно. При заимствовании фрагментов кода из open-source проектов должен быть указан автор кода. Если будет обнаружено, что несколько присланных решений написаны одним человеком, оценка будет снижена для всех похожих работ. Для анализа схожести кода будут использованы соответствующие инструментальные средства. =Программа= int h; void f (int a, int b) { 0: int x, y; 1: x = 4; 2: y = 1; 3: h = b; 4: if (y > 6) { 5: y = 2; } 6: if (h < y) { 7: if (h > a) { 8: y = 3; } 9: h = y; } 10: y = 3; } void g (int a, int b) { 0: int x, y; 1: x = 3; 2: y = 0; 3: h = b; 4: if (x < 1) { 5: if (y > 3) { 6: if (x > 6) { 7: x = 2; 8: h = a; } } } else { 9: if (y > 9) { 10: h = b - x; } 11: y = 10; } 12: while (x < 2) { 13: if (h > 0) 14: break; 15: if (y < 3) { 16: y = 6; } 17: if (x < 1) { 18: if (h < b) { 19: if (y < 2) { 20: h = x - y; } 21: y = 9; } } } }