Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Конвейер, перенаправление ввода-вывода
8.18. Написать программу, моделирующую команду SHELL: (здесь pri - имена процессов, argj - аргументы процессов, f.dat - файл входных данных, f.res - файл результатов; в каждом из процессов pri использован стандартный ввод-вывод). Аргументы, необходимые этой программе, задаются в командной строке. a) pr1 | pr2 | pr3 b) pr1 | pr2 > f.res c) pr1 arg11 arg12 < f.dat | pr2 arg21 agr22 d) pr1 < f.dat > f.res e) pr1 < f.dat | pr2 | pr3 > f.res f) pr1 | pr2 >> f.res g) pr1; pr2 | pr3 > f.res h) ((pr1 | pr2); pr3) | pr4 i) pr1 arg1 < f.dat; pr2 | pr3 >>f.res j) pr1 arg1 < f.dat | pr2 | pr3 >f.res & k) pr1 arg1 > f.res; pr2 | pr3 >> f.res l) pr1 < f.dat | pr2 arg2; pr3 > f.res m) pr1; pr2;...; prn n) pr1; pr2;...; prn & o) pr1 | pr2 |... | prn p) pr1 | pr2 |... | prn &
8.19. Написать программу, моделирующую команду SHELL pr1&&pr2 (выполнить pr1; в случае успешного завершения pr1 выполнить pr2, иначе завершить работу). Имена процессов задаются в командной строке.
8.20. Написать программу, моделирующую команду SHELL pr1 || pr2
8.21. Написать программу, моделирующую выполнение команды (pr1;pr2) | pr3 > f.res (конкатенация результатов работы процессов pr1 и pr2 передается в качестве входных данных процессу pr3; результаты его работы перенаправляются в файл f.res; в процессах pr1, pr2 и pr3 использован стандартный ввод-вывод). a) аргументы задаются в командной строке в виде pr1 pr2 pr3 f.res b) команда (pr1;pr2) | pr3>f.res вводится как строка во время работы программы. Подсказка: для разбиения строки на лексемы удобно использовать функцию strtok из <string.h>
8.22. Написать программу, реализующую конвейер из n процессов. Информация, необходимая для запуска каждого процесса, задается в командной строке: имя_процесса количество_аргументов аргументы Например, pr1 3 a1 a2 a3 pr2 0 pr3 2 b1 b2 означает, что программа должна выполнить команду pr1 a1 a2 a3 | pr2 | pr3 b1 b2.
8.23. Пусть есть исполняемый файл exp_x со стандартным вводом-выводом, вычисляющий значение exp(x). Результат работы exp_x - значения x и exp(x). Написать программу, использующую этот файл для нахождения таблицы значений exp(xi) на отрезке [a,b] в точках xi=a+i*h, i = 0, 1,..., n; h = (b-a)/n. Значения a, b и n вводятся с клавиатуры. Таблица выводится в стандартный поток вывода.
8.24. Пусть есть исполняемый файл func со стандартным вводом-выводом, вычисляющий значение функции f в точке x. Результат работы - значения x и f(x). Написать программу, использующую этот файл для нахождения таблицы значений f(x) на отрезке [a,b] в точках xi =a+i*h, i = 0,1,...,n; h = (b-a)/n. Значения a, b и n задаются в командной строке. Таблица записывается в файл f.tab.
8.25. Пусть есть исполняемый файл modify, который удаляет в текстовом файле все четные строки (строки нумеруются с единицы; пустые строки тоже анализируются). Имя файла задается в командной строке при вызове modify. Написать программу, использующую modify для обработки файлов, имена которых задаются в командной строке. Если первая строка файла совпадает со второй его строкой, то в файле оставить только нечетные строки; иначе файл не изменять. Анализ файлов выполняет основной процесс, изменения в фоновом режиме осуществляет modify (для каждого файла – свой экземпляр modify).
8.26. Пусть есть исполняемый файл modify, который удаляет в текстовом файле все четные строки (строки нумеруются с единицы; пустые строки тоже анализируются). Имя файла задается в командной строке при вызове modify. Написать программу, использующую modify для обработки файлов, имена которых задаются в командной строке. Если после сортировки файла, состоящего из нечетных строк исходного файла, оказалось, что каждая очередная строка начинается со следующей по алфавиту буквы (начиная с буквы ‘a’ до буквы ‘z’ и далее циклически), то имя этого файла выдать на экран, иначе - файл удалить. Для сортировки использовать команду sort.
8.27. Написать программу, определяющую количество литер, слов и строк в тексте, состоящем из нечетных N-ок байт заданного файла. Для подсчета количества литер, слов и строк использовать команду wc. Результаты поместить в файл. Имена файлов и величина N задаются в командной строке.
8.28. Написать программу, сортирующую по алфавиту строки текста, состоящего из четных строк данного файла. Для сортировки использовать команду sort. Результаты сортировки поместить в файл. Имена файлов задаются в командной строке.
8.29. Написать программу, определяющую количество литер, слов и строк в тексте, состоящем из тех строк заданного файла, которые содержат данную строку-шаблон в качестве подстроки. Используйте команды wc и grep. Результаты поместить в файл. Имена файлов и строка-шаблон задаются в командной строке.
8.30. Написать программу, которая выводит на экран имена файлов fk, содержащих не менее nk строк, включающих заданную строку strk в качестве подстроки. Имена файлов fk, величины nk и строки-шаблоны strk задаются в командной строке в виде f1 n1 str1 f2 n2 str2... fk nk strk. Использовать команды grep и wc.
8.31. Пусть есть исполняемый файл file_dbl, который удваивает в обрабатываемом файле каждую очередную порцию из 128 байт. Имя файла задаётся в командной строке при запуске file_dbl. Написать программу, использующую file_dbl для обработки файлов, имена которых задаются в командной строке. Если длина файла меньше 1024 байт, то увеличить его размер с помощью file_dbl, иначе оставить без изменения. Анализ файлов выполняет основной процесс, изменения в фоновом режиме осуществляет file_dbl (для каждого файла свой экземпляр file_dbl).
8.32. Пусть файл содержит текст и команды форматирования. Эти команды располагаются на отдельных строках и начинаются символами ./. Написать программу для подсчета символов в тексте (без учета символов форматирующих команд). Головной процесс анализирует содержимое файла и передает вспомогательному процессу текст без форматирующих команд. Вспомогательный процесс подсчитывает количество символов в получаемом тексте и возвращает полученный результат головному процессу. Имя файла головной процесс получает из командной строки.
8.33. Что делает программа?
#include <stdio.h> void Start (char *name, int in, int out) { if (fork() == 0) { dup2(in,0); dup2(out,1); close(in); close(out); execlp(name,name,0); } } main(int argc, char *argv[]) { int i, fd[2], in=0, out; for (i = 1; i < argc-1; i++) { pipe(fd); out=fd[1]; Start(argv[i], in, out); close(in); close(out); in = fd[0]; } out = 1; Start(argv[ i ], in, out); }
Сигналы. Фоновые процессы.
8.34. Написать программу игры в "пинг-понг" двух процессов через два канала. Первый процесс посылает второму 1, второй первому – 2, первый второму – 3, второй первому – 4 и т.д. Игра завершается при нажатии клавиш Ctrl+C.
8.35. Написать программу игры в "пинг-понг" двух процессов (см. предыдущую задачу) через один канал. Для синхронизации использовать сигнал. Игра завершается при нажатии клавиш Ctrl+C.
8.36. Написать программу игры в "волейбол" трех процессов: первый посылает второму "1", второй третьему - "2", третий первому - "3", первый второму - "4" и т.д. Игра завершается при нажатии клавиш Ctrl+C. Работу процессов синхронизировать с помощью сигналов.
8.37. Написать программу игры в "волейбол" трех процессов (см. предыдущую задачу). Игра завершается при нажатии клавиш Ctrl+C. Работу процессов синхронизировать с помощью канального чтения.
8.38. Написать программу игры одного процесса с двумя другими: первый процесс посылает второму 1, затем третьему 'a'; после этого он получает от второго 2, затем от третьего - 'b.' На следующем шаге первый посылает второму 3, третьему - 'c'; получает от второго 4, от третьего - 'd' и т.д. именно в такой последовательности с увеличением числа и изменением символа от 'a' до 'z' циклически. Игра завершается при нажатии клавиш Ctrl+C. Для синхронизации использовать сигналы.
8.39. Написать программу, определяющую самую длинную строку в заданном файле. Если таких строк несколько, то в качестве результата выдать первую из них. Обеспечить возможность работы программы в фоновом режиме и в обычном (с обработкой прерываний по Ctrl+C: при каждом нажатии этих клавиш программа должна выдавать промежуточный результат - самую длинную из уже просмотренных строк). Имя файла задается в командной строке.
8.40. Написать программу, заполняющую файл N строками. Аргументы
8.41. В файле записана непустая последовательность целых чисел (целое число – это непустая последовательность десятичных цифр, возможно начинающаяся знаком + или -). Написать программу для нахождения наибольшего из этих чисел. Во время ее работы каждую секунду выдается промежуточный результат - наибольшее из уже просмотренных чисел. Имя файла задается в командной строке.
8.42. Даны два файла, строки в которых упорядочены по алфавиту. Написать программу, осуществляющую слияние этих двух файлов в третий, строки которого тоже упорядочены по алфавиту. Имена всех трех файлов задаются в командной строке. Обеспечить возможность работы программы в фоновом и в обычном режиме (с обработкой прерываний по Ctrl+C: первое нажатие этих клавиш не влияет на работу программы; все последующие нажатия вызывают печать количества литер, слов и строк в частично сформированном файле-результате. Для подсчета количества литер, слов и строк использовать команду wc).
8.43. Написать программу слияния двух файлов в третий. Файл -результат формируется чередованием N-ок символов первого и второго файлов (если один из файлов длиннее другого, то его оставшаяся часть приписывается в конец файла-результата). Имена файлов и величина N задаются в командной строке. Исходные файлы читаются разными процессами; эти же процессы по очереди записывают по N байт из обрабатываемых ими файлов в файл-результат. Синхронизацию их работы организовать с помощью сигналов.
8.44. Написать программу нахождения корня уравнения f(x) = 0 с точностью eps > 0 на некотором отрезке [a,b] (любым известным Вам методом: деления отрезка пополам, хорд, касательных, комбинированным), которая после каждого нажатия клавиш Ctrl+C выдает очередное приближение и запрос о дальнейших действиях:
C - продолжать вычисления; A - закончить работу программы; R - начать поиск корня этого же уравнения на другом отрезке (новые значения a и b вводятся с клавиатуры). Затем выполняет эти действия. Если корень был найден (с заданной точностью eps) до нажатия клавиш Ctrl+C, то выдается соответствующее сообщение, печатается результат и программа прекращает работу.
8.45. Написать программу вычисления определенного интеграла функции f(x) на отрезке [a,b] с точностью eps (любым известным Вам методом: прямоугольников, трапеций, Симпсона), которая при возникновении сигнала SIGFPE (арифметическая ошибка: деление на 0 или переполнение) выдает значение частичной суммы, количество точек разбиения и запрос о дальнейших действиях: A - закончить работу программы; R - вычислять значение интеграла на другом отрезке (новые значения a и b вводятся с клавиатуры; реакция на сигнал SIGFPE сохраняется). Затем выполняет эти действия. Если вычисление интеграла (с заданной точностью) успешно завершилось, то выдается соответствующее сообщение, печатается результат и программа прекращает работу.
8.46. Написать программу копирования содержимого одного файла в другой. Копирование осуществляет вспомогательный процесс. Если во время копирования считывается строка, длина которой больше N, то этот процесс сообщает процессу-родителю о возникшей ситуации. Головной процесс спрашивает пользователя о том, что делать с этой строкой: D - не записывать строку в формируемый файл C - записать только первые N символов A - прекратить копирование и сообщает вспомогательному процессу о принятом пользователем решении. Головной процесс ждет, когда вспомогательный закончит свою работу, сообщает пользователю о том, что копирование завершено и завершается сам. Имена файлов и величина N задаются в командной строке.
8.47. Написать программу копирования из одного файла в другой только тех восьмерок байт, в которых первый символ равен заданному. Использовать низкоуровневый ввод/вывод. Все аргументы (файлы и символ) задаются в командной строке. Программа в ответ на первые два нажатия клавиш Ctrl+C выдает количество восьмерок байт, записанных в файл-результат к этому моменту, после третьего нажатия - прекращает работу, выдав содержимое сформированного к этому моменту файла. Если не было третьего (второго, первого) Ctrl+C, то работа продолжается до тех пор, пока не будет проанализирован исходный файл и создан файл-результат.
8.48. Написать программу, выдающую на экран содержимое файла порциями по N строк: каждая последующая порция выдается после нажатия клавиш Ctrl+C. Имя файла и величина N задаются в командной строке.
ЗАДАНИЯ ПРАКТИКУМА Свойства транслятора
1. Выяснить, сколько байт отведено для хранения данных типа short, int, long, float, double и long double.
2. Выяснить способ представления типа char: signed- или unsigned- вариант. 3. Проконтролировать, все ли способы записи констант допустимы: · целых (обычная форма записи, u/U, l/L, их комбинации, восьмеричная и шестнадцатиричная системы счисления) · вещественных (обычная форма записи, в экспоненциальном виде, f/F, l/L, e/E) · символьных и строковых (в частности, происходит ли конкатенация рядом расположенных строковых констант)
4. Выяснить, как упорядочены коды символов '0'-'9', 'a'-'z', 'A'- 'Z', пробел (между собой и относительно друг друга).
5. Проверить наличие и качество диагностических сообщений при неверной записи констант: · целых и вещественных · символьных и строковых
6. Проконтролировать, допускается ли инициализация переменных при описании; происходит ли инициализация по умолчанию.
7. Проверить, реагирует ли компилятор на попытку изменить константу (внешнюю, автоматическую, статическую; арифметических типов, строковую).
8. Исследовать особенности выполнения операции % с отрицательными операндами.
9. Проверьте, действительно ли операции отношения == и!= имеют более низкий приоритет, чем все другие операции отношения.
10. Проверьте, выполняется ли правило "ленивых вычислений" выражений в Си, т.е. прекращается ли вычисление выражений с логическими операциями, если возможно "досрочно" установить значение результата.
11. Проверьте, все ли виды операнда операции sizeof, определяемые стандартом для арифметических типов, допускаются компилятором; действительно ли аргумент-выражение не вычисляется.
12. Определите, каким образом "малое" целое расширяется до int (старшие разряды int заполняются нулями или знаковым разрядом "малого" целого).
13. Определите, каким образом расширяются unsigned- варианты "малых" целых (до unsigned int как в "классическом" Си или сначала делается попытка расширить до int, и только в случае неудачи - до unsigned int).
14. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование знаковых целых
15. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование беззнаковых целых
16. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование вещественных чисел (X) к знаковым целым (N-битовое представление) при | X | < 2N-1, | X | >= 2N-1.
17. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование знаковых целых X
18. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование беззнаковых целых
19. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование вещественных чисел (X) к беззнаковым целым (N-битовое представление) при 0<=X< 2N, X < 0, X >= 2N.
Калькулятор
Калькулятор – это программа, вычисляющая значения выражений, вводимых с клавиатуры. Ввод выражений и значений переменных, входящих в выражение, осуществляется по запросу программы. Требуется контролировать правильность записи выражений. Минимальный набор диагностических сообщений: - нарушен баланс скобок (с указанием – открывающих / закрывающих) - отсутствует операнд - пропущена операция - недопустимая операция - неверный операнд (ошибочно записана константа или имя переменной). Выражение содержит знаки операций +, -,*, /; круглые скобки без ограничения уровней вложенности; операнды – константы (целые и вещественные) и переменные. Имя переменной – идентификатор, его максимальная длина – 6 символов; в вещественных константах порядок не используется, т.е. числа имеют вид целая_часть. дробная_часть, где либо одно, либо другое может быть опущено. Целочисленные константы записываются в десятичной форме (восьмеричное и шестнадцатиричное представление не используется). Старшинство операций и правила приведения типов аналогичны правилам Си. Тип переменной определяется по виду константы – инициализатора.
Некоторые рекомендации: - если синтаксический анализ реализован методом рекурсивного спуска, то для выхода из «глубокой» рекурсии удобны функции setjmp и longjmp. - в функции метода рекурсивного спуска можно вставить действия по переводу анализируемого выражения в польскую инверсную запись (ПОЛИЗ). Это позволит за один просмотр провести анализ исходного выражения и генерацию его польской записи; при использовании алгоритма Дейкстры может потребоваться еще один просмотр. - выражения в ПОЛИЗе можно интерпретировать многократно при разных значениях переменных (если пользователь потребует этого в процессе диалога). - таблицу переменных удобно представлять с использованием объединений, т.к. для переменных разных типов придется хранить значения типа int и типа double. Приведенный здесь вариант калькулятора можно упростить: реализовать только целочисленную либо только вещественную арифметику.
|
|||||||||
Последнее изменение этой страницы: 2017-02-05; просмотров: 397; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.122.195 (0.06 с.) |