WWW.DISS.SELUK.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА
(Авторефераты, диссертации, методички, учебные программы, монографии)

 

Московский государственный университет им. М.В. Ломоносова

Факультет вычислительной математики и кибернетики

Руденко Т.В.

Сборник задач и упражнений по языку Си.

( учебное пособие для студентов II курса )

Москва

1999

УДК 519.682

Представлены задачи и упражнения по языку Си и программированию на

нем. Рассматриваемая версия Си соответствует международному и ANSIстандарту этого языка.

Сборник составлен как дополнение к учебнику Б. Кернигана, Д. Ритчи «Язык программирования Си» (М., «Финансы и статистика», 1992) и с учетом опыта преподавания программирования на факультете вычислительной математики и кибернетики МГУ.

Для студентов факультета ВМК в поддержку основного лекционного курса “Системное программное обеспечение” и для преподавателей, ведущих практические занятия по этому курсу.

Автор выражает благодарность сотрудникам кафедры алгоритмических языков за помощь и поддержку при создании этого сборника.

Рецензенты:

доц. Машечкин И.В.

доц. Терехин А.Н.

Руденко Т.В. “Сборник задач и упражнений по языку Си (учебное пособие для студентов II курса)”.

Издательский отдел факультета ВМиК МГУ (лицензия ЛР №040777 от 23.07.96), 1999.-80 с.

Печатается по решению Редакционно-издательского Совета факультета вычислительной математики и кибернетики МГУ им. М.В. Ломоносова ISBN 5-89407-048- © Издательский отдел факультета вычислительной математики и кибернетики МГУ им. М.В.Ломоносова, 1. ПРЕДИСЛОВИЕ Сборник задач составлен как дополнение к учебнику Б. Кернигана и Д.

Ритчи «Язык программирования Си» [1], поэтому в нем сохранен такой же порядок разделов. Однако предполагается, что некоторое минимальное представление о структуре программы на Си и простейшем вводе-выводе у читателя имеется (в объеме разделов 1.7 и 1.8 первой главы учебника по Си [1]). Сборник может быть использован и независимо от учебника Б. Кернигана и Д. Ритчи;

рассматриваемая версия Си соответствует стандарту ANSI (X3.159 - 1989) [2].

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

Значительную часть сборника составляют приложения, где описана библиотека стандартных функций языка Си, некоторые системные функции ОС UNIX и фрагменты стандарта языка Си, связанные с правилами приведения типов и адресной арифметикой.

2. ТИПЫ, ОПЕРАЦИИ, ВЫРАЖЕНИЯ 2.1. Верно ли записаны константы, представляющие целочисленные значения? Для верно записанных констант определить их значение, тип.

123 1E6 123456789LU -5 0XFUL ‘0’ 058 ‘\x7’ 0X-1AD ‘\122’ x 00123 0xffffffL 01A -‘x’ ‘a’U 0731UL ‘\n’ +0xaf 0X 2.2. Верно ли записаны константы с плавающей точкой? Для верно записанных констант определить их значение, тип.

1.71 1E-6 0.314159E1F. 0051E- 5.E+2 0e0 0x1A1.5 05.5 0X1E6 0F 1234.56789L 1.0E-10D 3.1415U 1e-2f -12.3E-6 +10e6 123456L E- 2.3. Верно ли записаны выражения? Для верно записанных выражений вычислить их значения ( операции + - * / % = ):

int a, b, c, d, e;

a = 2; b = 13; c = 7; d = 19; e = -4;

-e % a + b / a -5+ b/a/c d/a%c c % d-e 2.4. Верно ли решена задача: «значение целочисленной переменной с увеличить на 1; целочисленной переменной а присвоить значение, равное удвоенному значению переменной с ».

2.5. Верно ли решена задача: «значение целочисленной переменной с уменьшить на 1; целочисленной переменной а присвоить значение, равное частному от деления переменной с на 2».

e). a = c -= 1/2; f). a = (c = c - 1)/2; g). a = (c -= 1)/2; h). a=(c-= 1)/2.0;

2.6. Эквивалентны ли выражения?

Замечание: здесь E1, E2 - выражения допустимого в этом случае типа ;

op - операция (одна из + - * / % >> = k+ m=3= 2 ); одиночные ‘’ копировать в выходной поток без изменения;

h) удалить из каждой группы подряд идущих цифр все начальные незначащие нули (если группа состоит только из нулей, то заменить эту группу одним нулем);

i) удалить все комбинации символов the;

j) оставить только те группы цифр, которые составлены из подряд идущих цифр с возрастающими значениями; все остальные цифры и группы цифр удалить ( другие символы копировать в выходной поток без изменения);

k) заменить все комбинации символов child комбинациями символов children;

l) удалить группы символов, расположенные между фигурными скобками { и }. Скобки тоже должны быть удалены. Предполагается, что скобки сбалансированы, и внутри каждой пары скобок других фигурных скобок нет.

3.50. Пусть во входном потоке находится последовательность литер, заканчивающаяся маркером конца $ (кодировка ASCII). Вывести в выходной поток последовательность литер, измененную следующим образом:

a) удалить из каждой группы подряд идущих цифр, в которой более двух цифр и которой предшествует точка, все цифры, начиная с третьей (например, a+12.3456-b-0.456789+1.3-45678 преобразуется в a+12.34-b-0.45+1.3b) удалить из каждой группы цифр, которой не предшествует точка, все начальные нули (кроме последнего, если за ним идет точка либо в этой группе нет других цифр, кроме нулей ; например, a-000123+bc+0000.0008-0000+0001. преобразуется в a-123+bc+0.0008-0+1.07).



4. ФУНКЦИИ И СТРУКТУРА ПРОГРАММЫ

4.1. Перечислите все существенные изменения, внесенные стандартом ANSI в правила объявления и описания функций. Какова цель этих изменений?

4.2. Перечислить все случаи, когда в Си используется тип void. Дать определение этого типа.

4.3. Перечислить классы памяти, определенные в Си. Что определяет класс памяти? В каких случаях и каким образом класс памяти определяется по умолчанию? Привести примеры.

4.4. Определен ли в Си класс памяти для функций? Если определен, то каким образом; если нет, то почему.

4.5. Допустима ли в Си вложенность функций? Можно ли в Си какимто образом управлять видимостью функций?

4.6. Объяснить, чем различаются описание ( объявление, declaration ) и определение ( definition) – по терминологии Б. Кернигана и Д. Ритчи [1, см.

стр.71]. Привести примеры.

4.7. Эквивалентны ли следующие объявления функций:

4.8. Определить, какие конструкции являются определениями, а какие описаниями; где они могут располагаться и что обозначают:

static int j; register int b; double g( ) { return 3.141592; };

extern long k; int h ( int i ); static char q( int, double );

4.9. Верны ли следующие утверждения:

a) «тип выражения в операторе return должен совпадать с типом результата функции»

b) «функция, которая не возвращает результата (тип результата void), может не содержать оператор return;»

c) «функция, которая возвращает результат, может не содержать оператор return E; но вызывает другую функцию, которая содержит такой оператор»

d) «функция, которая возвращает результат, может содержать несколько операторов return E; »

e) «в Си аргументы функции всегда передаются по значению»

f) «в теле одной функции могут находиться два разных оператора, помеченных одинаковыми метками, если эти операторы находятся в разных блоках»; например, g) «в Си нельзя использовать две (или более) взаимно рекурсивных функций»; например, если есть void f(void){... g();...} и void g(void){...f();...}, то программа, использующая такие функции, будет ошибочной.

h) «в Си можно войти в блок, минуя его заголовок; при этом память под локальные переменные, описанные в этом блоке, будет отведена, но инициализация (если она есть) выполняться не будет»

i) «любая функция, описанная в каком-либо файле, входящем в состав программы, может быть использована в этом и любом другом файле этой программы»

j) «в этом фрагменте программы нет ошибок »

4.10. В каких случаях в Си возможна инициализация переменных? Когда она происходит? Как определяется инициализация по умолчанию?

4.11. Допустимо ли в Си? Если "да" - опишите семантику этих действий; если "нет" - объясните почему.

d) struct point create_point ( int a, int b) pp = (struct point ) malloc(sizeof(struct point));

6.13. Пусть точка на плоскости описана следующим образом:

Описать функцию, которая по трем точкам, являющимися вершинами некоторого прямоугольника, определяет его четвертую вершину;

6.14. Описать в виде структуры Разработать совокупность операций для данных этого типа; реализовать каждую из них в виде функции.

6.15. Пусть «целочисленная» окружность на плоскости описана следующим образом:

struct circle { int radius; struct point center;};

Пусть есть массив struct circle plane [50], содержащий информацию об окружностях на плоскости. Описать функцию, определяющую a) есть ли среди этих окружностей хотя бы две концентрические окружности;

b) есть ли среди этих окружностей хотя бы две вложенные (не обязательно концентрические) окружности;

c) есть ли среди этих окружностей три попарно пересекающихся окружности;

d) есть ли среди этих окружностей хотя бы одна «уединенная», т.е. не имеющая общих точек ни с какой другой окружностью массива plane.

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

#define LENGHT 20 / максимальная длина слова / struct info { int count; / количество повторений слова в данном Каждое слово (word) встречается в словаре только один раз; синонимы (alias) могут быть одинаковыми у разных слов.

Описать функцию, определяющую a) встречается ли данное слово в этом словаре: результат – указатель на соответствующий элемент либо NULL:

b) какое слово чаще других встречается в анализируемом тексте; если таких слов несколько, то взять первое по алфавиту; результат работы функции – указатель на соответствующий элемент:

c) на каждую ли букву латинского алфавита в этом словаре найдется хотя бы одно слово:

d) на какие буквы (букву) латинского алфавита в этом словаре больше всего слов; результат работы функции – указатель на строку, составленную из этих букв, перечисленных в алфавитном порядке:

e) есть ли в словаре различные слова, имеющие одинаковые синонимы.

6.17. Пусть результаты анализа некоторого текста содержатся в частотном словаре (см. предыдущую задачу).

a) struсt elem add_word ( char word, char alias), вставляющую новое слово и информацию о нем в словарь dictionary (предполагается, что такого слова в словаре еще нет, оно первый раз встретилось в тексте);

Результат работы функции – указатель на вставленный элемент.

b) struсt elem update_word ( char word, char alias), изменяющую значение синонима для данного слова (предполагается, что такое слово в словаре обязательно есть);

Результат работы функции – указатель на элемент словаря, где изменено значение синонима.

c) struct elem delete_word ( char word), удаляющую данное слово из словаря; результат работы функции – указатель на структуру, содержащую информацию об удаленном слове либо NULL, если такого слова нет в словаре;

6.18. Программа. Определить число вхождений каждого служебного слова в данную программу на Си. Тщательно продумать способ представления информации о служебных словах.

6.19. Допустимо ли в Си? Если "да" - опишите семантику этих действий, объясните, что будет напечатано; если "нет" - объясните почему.

struct data { char s; int i; struct data dp; };

{ static struct data a[ ] = { { "abcd", 1, a+1 }, printf("a[0].s=%s p -> s=%s a[2].dp -> s=%s\n", for ( i = 0; i < 2; i++ ) printf("--a[i].i=%d ++a[i].s[3]=%c\n", printf("++(p->s)=%s\n", ++(p->s) );

printf("a[(++p) -> i].s=%s\n", a[(++p) -> i].s);

printf("a[--(p -> dp -> i)].s=%s\n", a[--(p -> dp -> i)].s);

Верно ли присвоено значение переменной ps и всем объектам, с ней связанным:

ps = (struct s ) malloc(sizeof(struct s));

ps -> f = (float ) malloc(sizeof(float)); (ps -> f) = 3.1415;

(ps).p[0] = (char) malloc(5sizeof(char));

(ps).p[1] = (char) malloc(10sizeof(char));

6.21. Присвоить значение переменной q и всем объектам, с ней связанstruct data { double p; char s; int a[2]; };

ным:

6.22. Присвоить значение переменной a и всем объектам, с ней связанstruct b { double q; int (p)[2]; };

ным:

6.23. Присвоить значение переменной x и всем объектам, с ней связанstruct r { double a[3]; char s;

ным:

6.24. Присвоить значение переменной x и всем объектам, с ней связанstruct a { char s;

ным:

6.25. Присвоить значение переменной pt и всем объектам, с ней связанstruct t { int pi;

ным:

6.26. Присвоить значение переменной a и всем объектам, с ней связанstruct data { int i; int (f)(int); char s; };

ным:

6.3 Структуры со сылками на себя Замечание: в задачах 6.27 – 6.40 речь идет об однонаправленных списках без заглавного звена (если не сказано особо в постановке задачи);

struct lnode { type data;

Здесь struct lnode определяет структуру звена списка. Термин “элемент” будем использовать и для звена, и для поля данных в звене, если это не приводит к неоднозначности. Тип данных type уточняется в каждой задаче.

6.27. Описать функцию, которая a) находит сумму всех элементов списка;

b) находит максимальный элемент в заданном непустом списке;

c) проверяет, упорядочены ли по возрастанию элементы списка.

d) находит сумму минимального и максимального элементов в списке ;

6.28. Описать функцию, которая a) меняет местами первый и последний элементы списка;

b) удаляет из списка первое вхождение элемента с заданным значением (если оно есть);

c) удаляет из списка все вхождения элемента с заданным значением (если они есть);

d) после каждого звена с заданным значением вставляет еще одно звено с таким же значением.

Тип данных - double, анализируются вещественные числа.

6.29. Описать функцию, которая определяет, есть ли в заданном списке хотя бы два одинаковых элемента. Тип данных – int.

6.30. Описать функцию, которая печатает в обратном порядке значения элементов списка. Тип данных - double.

6.31. Описать функцию, которая заменяет в списке все вхождения данного слова на удвоенное. Тип данных - char.

6.32. Описать функцию, которая строит список L2 - копию списка L1.

6.33. Описать функцию, которая переворачивает список, изменяя ссылstruct lnode { struct data p;

ки.

6.34. Описать функцию, которая проверяет, входит ли список L1 в список L2. Тип данных - char, анализируются строки, указатели на которые хранятся в звеньях списка.

6.35. Описать функцию, которая выполняет слияние двух упорядоченных по возрастанию списков L1 и L2, строя третий список L3:

a) список L3 состоит из звеньев списков L1и L2;

b) список L3 строится из копий звеньев списков L1 и L2; списки L1 и L2 не изменяются.

6.36. Описать функцию, которая после последнего вхождения элемента E (структуры типа data) в список L1 вставляет список L2, изменяя ссылки.

struct lnode { struct data dtpr; struct lnode next; };

6.37. Описать функцию, которая в упорядоченный по возрастанию список вставляет элемент, сохраняя упорядоченность. Тип данных - char.

6.38. Описать функцию, которая формирует список L3, включая в него элементы списка L1, которые не входят в список L2.

a) список L3 состоит из звеньев списка L1;

b) список L3 строится из копий звеньев списка L1; список L1 не изменяется.

6.39. Описать функцию, которая формирует список L3, включая в него в одном экземпляре элементы, входящие в список L1 и в список L2. Список L формируется из копий звеньев списков L1 и L2; списки L1 и L2 не изменяются.

6.40. Описать функцию, которая формирует список L3, включая в него элементы, которые входят в один из списков (L1 или L2), но при этом не входят в другой. Список L3 формируется из копий звеньев списков L1 и L2; списки L и L2 не изменяются.

Замечание: в задачах 6.41 – 6.44 требуется разработать и реализовать несколько абстрактных типов данных (АТД). Абстрактный тип данных – это тип, определяемый программистом, для которого он описывает структуру значений этого типа и множество операций с такими данными. Детали реализации АТД по возможности максимально скрыты от пользователя, и оперировать с такими данными можно только с помощью предоставленных операций (аналогично тому, как пользователь работает с предопределенными в языке типами данных). Поэтому, создавая АТД, надо тщательно продумать, какие операции предоставить пользователю, чтобы их было достаточно для выполнения традиционных действий с этими типами данных.

6.41. Разработать способ представления «разреженных» многочленов (многочленов с целыми коэффициентами, большинство из которых равно нулю). Продумать набор операций для работы с данными такого типа (создание такого многочлена, вычисление значения многочлена в некоторой точке, сложение двух многочленов с приведением подобных членов, дифференцирование многочлена и т.п.). Каждую из этих операций реализовать в виде функции.

6.42. Описать эффективный способ представления АТД «очередь»: описать структуру этого типа данных, разработать и реализовать набор операций для данных этого типа (в частности, позаботиться о действиях при переполнении очереди).

6.43. Описать способ представления АТД «стек»: описать структуру этого типа данных, разработать и реализовать набор операций для данных этого типа.

6.44. Описать способ представления АТД «набор» Набор – это аналог множества, но в наборе (в отличие от множества) может содержаться несколько экземпляров одного элемента. Разработать и реализовать набор операций для данных этого типа.

Замечание: в задачах 6.45 – 6.47 речь идет о двоичных деревьях;

struct tnode { type data;

Здесь struct tnode определяет структуру узла дерева. Термин “элемент” будем использовать и для узла, и для поля данных в узле, если это не приводит к неоднозначности. Тип данных type уточняется в каждой задаче.

6.45. Используя определенные в задачах 6.42 и 6.43 АТД «очередь» и «стек», описать нерекурсивную функцию, которая a) определяет число вхождений данного элемента в двоичное дерево;

b) вычисляет сумму элементов двоичного дерева;

c) находит длину (количество узлов) на пути от корня дерева до ближайшего узла, содержащего данный элемент (если такого узла в дереве нет, то считать результат равным -1);

d) определяет, является ли данное дерево деревом двоичного поиска (т.е. по отношению к любому узлу в этом дереве его левое поддерево содержит только те данные, значения которых меньше значения данного узла, а его правое поддерево содержит только те данные, значения которых больше значения данного узла);

e) подсчитывает количество узлов на N-ом уровне непустого двоичного дерева (корень считать узлом нулевого уровня);

f) печатает все элементы двоичного дерева по уровням, начиная с корня, на каждом уровне – слева направо.

6.46. Описать рекурсивную функцию, которая a) определяет число вхождений данного элемента в двоичное дерево;

b) вычисляет сумму элементов двоичного дерева;

с) определяет, входит ли данный элемент в двоичное дерево;

d) печатает значения данных из всех узлов дерева, не являющихся e) проверяет, идентичны ли два двоичных дерева;

6.47. Описать функцию, которая в дерево двоичного поиска вставляет новый элемент (определение дерева двоичного поиска см. задачу 6.45(d)).

6.48. Программа. Упорядочить по алфавиту и распечатать все слова входного текста.

7. ВВОД-ВЫВОД 7.1 Стандартный ввод-вывод 7.1. Программа. Даны натуральные числа i, n (i n), вещественные числа a1, a2, …,an. Найти среднее арифметическое всех чисел, кроме ai.

7.2. Программа. Даны вещественные числа a1, a2, …,a50. Распечатать “сглаженные” значения a1, a2, …,a50, заменив в исходной последовательности все члены, кроме первого и последнего, по формуле считая, что a) после того, как получено новое значение некоторого члена последовательности, оно используется для вычисления нового значения следующего за ним члена последовательности;

b) при “сглаживании” используются лишь старые члены последовательности.

7.3. Программа. Даны вещественные числа a1, a2, … Известно, что a1 > и что среди a2, a3, … есть хотя бы одно отрицательное число. Пусть a1, a2, …,an члены данной последовательности, предшествующие первому отрицательному члену ( n заранее неизвестно ). Распечатать c) среднее арифметическое a1, a2, …,an 7.4. Программа. Даны целые положительные числа n, a1, a2, …, an (n 4). Считать, что a1, a2, …, an - это измеренные в сотых долях секунды результаты n спортсменов в беге на 100 метров. По этим результатам составить команду из четырех лучших бегунов для участия в эстафете 4100, т.е. распечатать номера спортсменов, имеющих четыре лучших результата.

7.5. Верно ли решена следующая задача: «читать символы из стандартного входного потока, пока код каждого следующего символа больше кода предыдущего; определить, сколько символов было прочитано»

i) pr1 arg1 < f.dat; pr2 | pr3 >>f.res 8.19. Написать программу, моделирующую команду SHELL pr1&&pr (выполнить pr1; в случае успешного завершения pr1 выполнить pr2, иначе завершить работу). Имена процессов задаются в командной строке.

8.20. Написать программу, моделирующую команду SHELL pr1 || pr (выполнить pr1; в случае неудачного завершения 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 из 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+ih, 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. Что делает программа?

void Start ( char *name, int in, int out) main(int argc, char *argv[]) 8.2.2 Сигналы. Фоновые процессы.

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 строками. Аргументы (имя файла, количество строк N и строка-заполнитель) задаются в командной строке. Обеспечить возможность работы программы в фоновом режиме и в обычном (с обработкой прерываний по Ctrl+C: при каждом нажатии этих клавиш программа должна выдавать промежуточный результат - количество строк, записанных в файл к этому моменту).

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 задаются в командной строке.

9. ЗАДАНИЯ ПРАКТИКУМА

9.1 Свойства транслятора 1. Выяснить, сколько байт отведено для хранения данных типа short, int, long, float, double и long double.

2. Выяснить способ представления типа char: signed- или unsignedвариант.

3. Проконтролировать, все ли способы записи констант допустимы:

• целых (обычная форма записи, u/U, l/L, их комбинации, восьмеричная и шестнадцатиричная системы счисления ) • вещественных (обычная форма записи, в экспоненциальном виде, f/F, • символьных и строковых (в частности, происходит ли конкатенация рядом расположенных строковых констант ) 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. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование знаковых целых (M-битовое представление ) к знаковым целым (N-битовое представление ) при 15. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование беззнаковых целых (M-битовое представление ) к знаковым целым (N-битовое представление ) при 16. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование вещественных чисел ( X ) к знаковым целым ( N-битовое представление ) при | X | < 2N-1, | X | >= 2N-1.

17. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование знаковых целых X (M-битовое представление ) к беззнаковым целым ( N-битовое представление ) 18. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование беззнаковых целых (M-битовое представление ) к беззнаковым целым ( N-битовое представление ) 19. Определите, каким образом при выполнении операции присваивания и явном приведении происходит преобразование вещественных чисел ( X ) к беззнаковым целым (N-битовое представление ) при 0= 2N.

Калькулятор – это программа, вычисляющая значения выражений, вводимых с клавиатуры. Ввод выражений и значений переменных, входящих в выражение, осуществляется по запросу программы.

Требуется контролировать правильность записи выражений. Минимальный набор диагностических сообщений:

- нарушен баланс скобок ( с указанием – открывающих / закрывающих) - отсутствует операнд - пропущена операция - недопустимая операция - неверный операнд (ошибочно записана константа или имя переменной).

Выражение содержит знаки операций +, -,, / ; круглые скобки без ограничения уровней вложенности; операнды – константы (целые и вещественные) и переменные. Имя переменной – идентификатор, его максимальная длина – 6 символов; в вещественных константах порядок не используется, т.е. числа имеют вид целая_часть.дробная_часть, где либо одно, либо другое может быть опущено. Целочисленные константы записываются в десятичной форме (восьмеричное и шестнадцатиричное представление не используется).

Старшинство операций и правила приведения типов аналогичны правилам Си. Тип переменной определяется по виду константы – инициализатора.

Некоторые рекомендации:

- если синтаксический анализ реализован методом рекурсивного спуска, то для выхода из «глубокой» рекурсии удобны функции setjmp и longjmp.

- в функции метода рекурсивного спуска можно вставить действия по переводу анализируемого выражения в польскую инверсную запись (ПОЛИЗ). Это позволит за один просмотр провести анализ исходного выражения и генерацию его польской записи; при использовании алгоритма Дейкстры может потребоваться еще один просмотр.

- выражения в ПОЛИЗе можно интерпретировать многократно при разных значениях переменных (если пользователь потребует этого в процессе диалога).

- таблицу переменных удобно представлять с использованием объединений, т.к. для переменных разных типов придется хранить значения типа int и типа double.

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

9.3 Моделирование работы интерпретатора SHELL Входной язык: подмножество командного языка SHELL (определяется вариантом).

1. командный файл, т.е. каждая строка файла - это отдельная команда, которая должна быть выполнена интерпретатором (имя файла - аргумент в командной строке при вызове интерпретатора);

2. стандартный входной поток команд;

3. для исполнения каждой команды требуется запуск программы ВНИМАНИЕ!!! "побочный" эффект выполнения уже обработанных команд (например, перенаправление ввода-вывода) не должен влиять на выполнение последующих команд.

Входной язык (варианты):

Общая часть (одинаковая для всех вариантов):

• # конвейер pr1 | pr2 |... | prN для произвольного N>=2; считать, что аргументов у prI (1 (в том числе для В каждый вариант входит (как минимум) один из подпунктов каждого пункта, отмеченного римской цифрой. Звездочкой отмечены более сложные подпункты. Части подпунктов, содержащие слово «возможно», могут быть опущены при выборе варианта; их реализация усложняет вариант. Вариант определяет преподаватель.

результат: filename строк слов символов (возможен список имен файлов; в этом случае подобная информация выдаются о каждом результат: строки файла filename, содержащие substring как подстроку (возможен флаг -v; в этом случае результат - это строки, которые не содержат substring как подстроку) результат: информация о первом различии в содержимом двух файлов Например, filename1 differs from filename2: line 5 char сортировка строк файла в соответствии с кодировкой ASCII вывод содержимого файла по 10 символов в строке с указанием номера первого символа в каждой десятке ВНИМАНИЕ !!! приоритет операции | выше, чем приоритет операции ; однако, возможно использование скобок: напрмер, ( pr1; pr2 ) | pr3, что приведет к конкатенации результатов работы pr1 и pr2, которые будут переданы процессу pr3 как входные данные.

10. ПРИЛОЖЕНИЯ Здесь приводится краткое описание некоторых библиотечных функций, утвержденных в качестве ANSI-стандарта языка Cи. Более подробное и полное описание этой библиотеки можно найти в [1] и [2].

Эти функции определены в головном файле. Если копирование имеет дело с объектами, перекрывающимися по памяти, то поведение функций не определено. Функции сравнения рассматривают аргументы как массивы элементов типа unsigned char.

char *strcpy(char *s, const char *ct) копирует строку ct в строку s, включая ‘\0’; возвращает s.

char *strcat (char *s, const char *ct) приписывает ct к s; возвращает s.

char strcmp(const char *cs, const char *ct) сравнивает cs с ct; возвращает значение меньшее 0, если csct.

char *strchr(const char *cs, char c) возвращает указатель на первое вхождение c в cs или, если такового не char *strrchr(const char *cs, char c) возвращает указатель на последнее вхождение c в cs или, если такового char *strstr(const char *cs, const char *ct) возвращает указатель на первое вхождение ct в cs или, если такового не size_t strlen(const char *cs) возвращает длину cs (без учета ‘\0’).

char *strtok(char *s, const char *ct) ищет в s лексему, ограниченную литерами из ct.

Последовательные вызовы функции strtok разбивают строку s на лексемы. Ограничителем лексемы может быть любая литера, входящая в строку ct. В первом вызове функции указатель s не равен NULL. Функция находит в строке s первую лексему, состоящую из литер, не входящих в ct; работа этого вызова завершается тем, что поверх следующей литеры пишется ‘\0’ и возвращается указатель на выделенную лексему.

Каждый последующий вызов функции strtok, в котором указатель s равен NULL, выдает указатель на следующую лексему, которую функция будет искать сразу за концом предыдущей. Функция возвращает NULL, если далее никакой лексемы не обнаружено. Параметр ct от вызова к вызову может варьироваться.

void *memcpy(void *s, const void *ct, size_t n) копирует n литер из ct в s и возвращает s.

void *memset(void *s, char c, size_t n) размещает литеру c в первых n позициях строки s и возвращает s.

Головной файл предоставляет функции, которые позволяют определить, принадлежит ли литера определенному классу. Параметр каждой из этих функций имеет тип int и должен быть либо значением unsigned char, приведенным к int, либо значением EOF; возвращаемое значение тоже имеет тип int.

Функции возвращают ненулевое значение (“истину”), если аргумент принадлежит указанному классу литер, и нуль (“ложь”) – в противном случае.

int isupper (int c) буква верхнего регистра int isalpha (int c) isupper(c) или islower(c) истины int isalnum (int c) isalpha (c) или isdigit (c) истины int isxdigit (int c) шестнадцатиричная цифра int isspace (int c) пробел, новая-строка, возврат-каретки, табуляция int isgraph (int c) печатаемая литера, кроме пробела int isprint (int c) печатаемая литера, включая пробел Кроме этих функций в файле есть две функции, выполняющие преобразование букв из одного регистра в другой.

int tolower (int c) если с – буква верхнего регистра, то tolower(c) выдаст эту букву на нижнем регистре; в противном случае она вернет c.

int toupper (int c) если с – буква нижнего регистра, то toupper(c) выдаст эту букву на верхнем регистре; в противном случае она вернет c.

Поток - это источник или получатель данных; его можно связать с диском или каким-либо другим внешним устройством. Библиотека поддерживает два вида потоков: текстовый и бинарный.

Текстовый поток - это последовательность строк. Каждая строка имеет нуль или более литер и заканчивается литерой ‘\n’.

Бинарный поток - это последовательность не преобразуемых байтов, представляющих собой некоторые промежуточные данные, которые обладают тем свойством, что, если их записать, а затем прочитать той же системой вводавывода, то мы получим информацию, совпадающую с исходной.

В UNIXе эти виды потоков не различаются.

Поток соединяется с файлом или устройством посредством его открытия; эта связь разрывается при закрытии потока. Открытие файла возвращает указатель на объект типа FILE, который содержит всю информацию, необходимую для управления этим потоком. Если не возникает двусмысленности, далее будем использовать термины «файловый указатель» и «поток» как равнозначные.

Когда программа начинает работу, уже открыты три потока: stdin, stdout и stderr.

Все приведенные ниже функции, связанные с вводом-выводом, определены в головном файле.

FILE *fopen ( const char *filename, const char* mode ) функция fopen открывает файл с заданным именем и возвращает указатель на файл или NULL, если файл не удалось открыть.

«r» текстовый файл открывается для чтения «w» текстовый файл создается для записи; старое содержимое (если «a» текстовый файл открывается или создается для записи в конец «r+» текстовый файл открывается для исправления (т.е. для чтения и «a+» текстовый файл создается или открывается для исправления уже существующей информации и добавления новой в конец Режим «исправления» позволяет читать и писать в один и тот же файл; при переходах от операции чтения к операции записи и обратно нужно вызывать функцию fflush либо функцию позиционирования файла. Если значение режима дополнить буквой b (например, «rb» или «a+b»), то это будет означать, что файл бинарный.

FILE *freopen ( const char *filename, const char* mode, FILE *stream) функция freopen открывает файл с указанным режимом и связывает его с потоком stream. Она возвращает stream или, в случае ошибки, NULL.

Обычно функция freopen используется для замены файлов, связанных с stdin, stdout или stderr, другими файлами.

int fflush ( FILE *stream) если функцию fflush применить к потоку вывода, то происходит дозапись всех оставшихся на буфере (еще не записанных ) данных. Для потока ввода эта функция не определена. Функция возвращает EOF, если во время записи возникла ошибка, и нуль в противном случае. Обращение вида fflush (NULL) выполняет указанные операции для всех потоков вывода.

int fclose ( FILE *stream) функция fclose производит дозапись еще не записанных буферизованных данных, сбрасывает непрочитанный буферизованный ввод, освобождает все автоматически запрошенные буфера, после чего закрывает поток. Возвращает EOF в случае ошибки и нуль в противном случае.

int remove(const char *filename) функция remove удаляет файл с указанным именем; последующая попытка открыть файл с таким именем вызовет ошибку. Возвращает ненулевое значение в случае неудачной попытки.

int rename(const char *oldname, const char* newname) функция rename заменяет старое имя файла oldname новым newname;

если попытка изменить имя оказалась неудачной, то возвращает ненулевое значение, в противном случае - нуль.

Функции форматного вывода осуществляют вывод информации в соответствии с форматом.

int fprintf ( FILE* stream, const char* format,...) функция преобразует и пишет вывод в поток stream под управлением формата format. Возвращаемое значение - число записанных литер или, в случае ошибки, отрицательное значение.

Строка формата может содержать обычные литеры, которые копируются в выводной поток, и спецификации преобразования, которые вызывают преобразование и печать значений других аргументов в том порядке, как они перечислены. Каждая спецификация преобразования начинается символом % и заканчивается литерой-спецификатором преобразования. Между % и литеройспецификатором могут быть расположены символы управления печатью ( в том порядке, в каком они перечислены ниже):

- указывает, что преобразованное значение аргумента должно быть прижато к левому краю поля;

пробел если первая литера - не знак, то числу должен предшествовать пробел;

0 указывает, что числа должны дополняться ведущими нулями до всей ширины поля;

# указывает на одну из следующих форм вывода: для о первой цифрой должен быть 0; для х или Х ненулевому результату должны предшествовать 0х или 0Х; для e, E, f, g и G вывод всегда должен содержать десятичную точку; для g и G хвостовые нули не отбрасываются.

• число, определяющее минимальную ширину поля. Преобразованный аргумент будет напечатан в поле, размер которого не меньше указанной ширины. Если число литер, необходимых для представления значения аргумента, больше указанной ширины поля, то значение будет напечатано в поле большего размера; если меньше - поле будет дополнено слева (или справа, если число прижимается к левому краю). Поле дополняется пробелами (или нулями, если присутствует флаг дополнения нулями).

• точка, отделяющая указатель ширины поля от указателя точности.

• число, задающее точность, которое определяет максимальное количество литер, печатаемых из строки, или количество цифр после десятичной точки в преобразованиях e, E или f, или количество значащих цифр для g- или Gпреобразования, или минимальное количество цифр при печати целого (до необходимой ширины поля число дополняется ведущими нулями).

• модификаторы h, l или L. Литера h указывает, что соответствующий аргумент должен печататься как short или unsigned short; литера l - как long или unsigned long; литера L - как long double.

------------------------------------------------------------------------------------------------------литера тип аргумента; вид печати ------------------------------------------------------------------------------------------------------d,i int; знаковая десятичная запись.

о int; беззнаковая восьмеричная запись ( без ведущего 0).

x,X int; беззнаковая шестнадцатиричная запись ( без ведущих 0x или 0X), в качестве цифр от 10 до 15 используются abcdef для x и ABCDEF u int; беззнаковое десятичное целое.

c int; единичная литера после преобразования в unsigned char.

s char *; литеры строки печатаются, пока не встретится ‘\0’ или не будет напечатано количество литер, указанное точностью.

f double; десятичная запись вида [-]mmm.ddd, где количество d специфицируется точностью. По умолчанию точность равна 6; нулевая точность подавляет печать десятичной точки.

e,E double; десятичная запись вида [-]m.dddddde±xx или вида [-]m.ddddddE±xx, где d специфицируется точностью. По умолчанию точность равна 6; нулевая точность подавляет печать десятичной g,G double; используется %e и %E, если экспонента меньше 4 или больше или равна точности; в противном случае используется %f. Хвостовые нули и точка в конце не печатаются.

p void*; печатает в виде указателя ( представление зависит от реализации).

% никакие аргументы не преобразуются; печатается % int printf ( const char* format,...) семантика функции полностью эквивалентна fprintf (stdout, const char* int sprintf (char *s, const char* format,...) sprintf действует так же, как и printf, только вывод осуществляется в строку s, которая завершается литерой ‘\0’. Строка s должна быть достаточно большой, чтобы вместить результат вывода. Возвращает количество записанных литер (без учета ‘\0’).

Функции форматного ввода осуществляют ввод информации в соответствии с форматом.

int fscanf (FILE* stream, const char* format,...) функция читает данные из потока stream под управлением формата format. Введенные данные присваиваются аргументам, следующим за аргументом format. Все эти аргументы должны быть указателями.

Функция завершает работу, если исчерпался формат или возникла ошибка преобразования. Возвращает EOF, если исчерпан файл или возникла ошибка; в остальных случаях - количество введенных и преобразованных значений.

Строка формата обычно содержит спецификации преобразования, которые используются для управления вводом. Каждая спецификация преобразования начинается символом % и заканчивается литерой-спецификатором преобразования. Между % и литерой-спецификатором могут быть расположены символы управления вводом ( в том порядке, в каком они перечислены ниже):

• символ *, который подавляет присваивание;

• число, определяющее максимальную ширину поля ввода;

• модификаторы h, l или L. Литерам-спецификаторам d, i, o, u, x может предшествовать литера h, если соответствующий аргумент является указателем на short (а не на int), или литера l, если аргумент - указатель на long. Литерамспецификаторам e, f, g может предшествовать литера l, если аргумент - указатель на double (а не на float), или литера L, если аргумент - указатель на long double.

Кроме спецификаций преобразования, в строку-формат могут входить пробелы и табуляции, которые игнорируются, а также обычные литеры (но не %), которые ожидаются в потоке ввода среди литер, отличных от пробельных.

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

Спецификация преобразования определяет способ интерпретации очередного поля ввода. Поле ввода определяется как строка непробельных литер;

при этом ввод строки прекращается, если встретилась пробельная литера либо исчерпана ширина поля ввода. Полученное значение присваивается переменной, на которую указывает соответствующий аргумент. Если присваивание подавляется при помощи *, то поле ввода пропускается, но никакого присваивания не происходит.

------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------d десятичное целое; int *.

i целое; int *. Целое может быть восьмеричным (с ведущим нулем) или шестнадцатиричным (с ведущими 0х или 0Х).

о восьмеричное целое (с ведущим 0 или без него); int *.

x шестнадцатиричное целое (с ведущими 0x или 0X или без них); int *.

u беззнаковое десятичное целое; unsigned int *.

c литеры; char *. Литеры ввода размещаются в указанном массиве в количестве, заданном шириной поля; по умолчанию это значение равно 1. Литера ‘\0’ не добавляется. Пробельные литеры здесь рассматриваются как обычные литеры и поступают в аргумент. Чтобы прочитать следующую непробельную литеру, используйте %1s.

s строка непробельных литер (записывается без кавычек); char*, указывающий на массив размера, достаточного, чтобы вместить строку e,f,g число с плавающей точкой; float *. Число содержит необязательный знак, непустую последовательность цифр ( возможно, с десятичной точкой) и необязательную экспоненту, состоящую из E или e и целого (возможно, со знаком).

p значение указателя в виде, в котором его бы напечатала функция printf со спецификацией %p (представление зависит от реализации);

% обычная литера %; присваивание не происходит.

int scanf ( const char* format,...) семантика функции полностью эквивалентна fscanf (stdin, const char* int sscanf (char *s, const char* format,...) sscanf действует так же, как и scanf, только ввод литер осуществляет из int fgetc (FILE *stream) fgetc возвращает очередную литеру из потока stream в виде unsigned char, переведенной в int, или EOF, если исчерпан файл или обнаружена char *fgets (char *s, int n, FILE *stream) fgets читает не более n-1 литер в массив s, прекращая чтение, если встретилась литера новая-строка, которая включается в массив; кроме того, записывает в массив литеру ‘\0’. Функция fgets возвращает s или NULL, если исчерпан файл или обнаружена ошибка.

int fputc ( int c, FILE * stream) fputc пишет литеру c, переведенную в unsigned char, в stream. Возвращает записанную литеру или EOF в случае ошибки.

int fputs (const char *s, FILE * stream) fputs пишет строку s, которая может не иметь ‘\n’, в stream. Возвращает неотрицательное целое или EOF.

int getc (FILE *stream) getc делает то же, что и fgetc, но в отличие от нее может быть макросом;

в этом случае stream может быть вычислен более одного раза.

int getchar (void) getchar() делает то же, что и getc(stdin).

char *gets (char *s) gets читает следующую строку ввода в массив s, заменяя литеру новаястрока на ‘\0’. Возвращает s или NULL, если исчерпан файл или обнаружена ошибка.

int putc (int c, FILE *stream) putc делает то же, что и fputc, но в отличие от нее может быть макросом; в этом случае stream может быть вычислен более одного раза.

int putchar (int c) putchar(c) делает то же, что и putc(c,stdout).

int puts (const char *s) puts пишет строку s и литеру новая-строка в stdout. В случае ошибки возвращает EOF; если запись прошла нормально - неотрицательное значение.

int ungetc (int c, FILE *stream) ungetc отправляет литеру c (переведенную в unsigned char) обратно в stream; при следующем чтении из stream она будет получена снова. Для каждого потока можно вернуть не более одной литеры. Нельзя возвращать EOF. В качестве результата ungetc выдает отправленную назад литеру или, в случае ошибки, EOF.

int fseek (FILE *stream, long offset, int origin) fseek устанавливает позицию для stream; последующее чтение или запись будет производиться с этой позиции. Новая текущая позиция устанавливается со смещением offset относительно положения, заданного значением origin. Если origin равно 0 то смещение производится относительно начала файла; если origin равно 1, то относительно прежней текущей позиции; и относительно конца файла, если origin равно 2.

Значение offset должно быть равно нулю или значению, полученному при помощи функции ftell. Это единственный надежный способ получения величины offset для функции fseek.

long ftell (FILE *stream) ftell возвращает текущее значение смещения в байтах относительно начала потока stream или -1L, в случае ошибки.

void rewind (FILE *stream) rewind(fp) делает то же, что и fseek(fp,0L,SEEK_SET); clearerr(fp).

int fgetpos (FILE *stream, fpos_t *ptr) fgetpos записывает текущую позицию потока stream в *ptr для последующего использования ее в fsetpos. Тип fpos_t позволяет хранить значения такого рода. В случае ошибки fgetpos возвращает ненулевое значение.

int fsetpos (FILE *stream, const fpos_t *ptr) fsetpos устанавливает позицию в stream, читая ее из *ptr, куда она была ранее записана с помощью fgetpos. В случае ошибки fsetpos возвращает int feof (FILE *stream) feof возвращает ненулевое значение, если для потока stream установлен void clearerr (FILE stream) clearerr очищает индикаторы конца файла и ошибки потока stream.

В головном файле описываются следующие математические функции:

double asin(double x) арксинус x; x[-1,+1] double acos(double x) арккосинус x; x[-1,+1] double atan(double x) арктангенс x double sinh(double x) гиперболический синус x double cosh(double x) гиперболический косинус x double tanh(double x) гиперболический тангенс x double exp(double x) double log(double x) натуральный логарифм ln(x), x> double log10(double x) десятичный логарифм log10(x), x> double sqrt(double x) double fabs(double x) double pow(double x, double y) double ldexp(double x, int n) Функции этого раздела предназначены для преобразования чисел и запроса памяти; они описаны в головном файле.

double atof(const char *s) atof переводит строку s в значение double. В случае переполнения выдает HUGE_VAL - некоторое положительное double-значение, определенное в головном файле ; при исчезновении порядка - нуль.

int atoi(const char *s) atoi переводит строку s в значение int. В случае переполнения выдает (int)HUGE_VAL - некоторое положительное double-значение, определенное в головном файле, преобразованное в int; при исчезновении порядка - нуль.

void *calloc(size_t nobj, size_t size) calloc возвращает указатель на место в памяти, отведенное для массива nobj объектов, каждый из которых имеет размер size. Выделенная область памяти обнуляется. Если память отвести не удалось, то результат работы функции - NULL.

void *malloc(size_t size) malloc возвращает указатель на место в памяти для объекта размера size. Выделенная память не инициализируется. Если память отвести не удалось, то результат работы функции - NULL.

void free(void *p) free освобождает область памяти, на которую указывает p; если p равно NULL, то функция ничего не делает. Значение p должно указывать на область памяти, ранее выделенную с помощью функций calloc или Головной файл предоставляет средства для изменения обычной последовательности обработки вызовов функций: «вызов – возврат в точку вызова». Типичная ситуация, когда требуется отказаться от этой стратегии – необходимость вернуться из «глубоко вложенного» вызова функции на верхний уровень, минуя промежуточные возвраты.

int setjmp (jmp_buf env) setjmp сохраняет контекст вызова в env для последующего его использования в longjmp. Возвращает нуль, если возврат осуществляется непосредственно из setjmp, и значение val (которое должно быть отличным от нуля), если возврат произошел из последующего вызова longjmp. Обращение к setjmp разумно только в определенных ситуациях: в основном, это проверки в if, swith и циклах в выражениях отношения вида void longjmp (jmp_buf env, int val) longjmp восстанавливает контекст, сохраненный в env при последнем вызове setjmp. Счет возобновляется, как если бы функция setjmp только что отработала и вернула ненулевое значение val. При этом переменныеимеют те значения, которые они имели в момент обращения к longjmp; функция setjmp значений объектов не сохраняет. Результат непредсказуем, если в момент обращения к longjmp, функция, содержащая вызов setjmp, уже завершила свою работу стандартным образом, вернув управление в точку вызова.

типы ::= типы_данных | функциональные_типы | неполные_типы типы_данных ::= скалярные_типы | нескалярные_типы скалярные_типы ::= арифметические типы | указатели арифметические_типы ::= целочисленные_типы | плавающие_типы целочисленные_типы ::= char| signed char | unsigned char | short | unsigned short | int | unsigned int | long | unsigned long | перечислимые типы | плавающие_типы ::= float | double | long double указатели ::= указатели_на_данные | указатели_на_функции | указатели_на_неполные_типы нескалярные_типы ::= структуры | массивы | объединения неполные_типы ::= неполные_структуры | неполные_массивы | неполные_объединения | void 10.2.2 Приоритеты и порядок выполнения операций ------------------------------------------------------------------------------------------------------постфиксные ++ и - - слева направо ( ) Несмотря на строго определенный приоритет операций, при вычислении выражения существует некоторая свобода в выборе порядка вычисления его подвыражений.

Например, y = *p++; может быть вычислено как Порядок вычислений важен для понимания того, когда проявляется побочный эффект. Побочный эффект при вычислении выражения - это занесение в память значений объектов, изменение состояния файла либо доступ к volatile объектам.

Точка последовательных вычислений ( sequence point ) - это точка в программе, где можно точно определить, какие из побочных эффектов уже проявились, а какие - еще нет.

Если выражение является частью оператора, то точкой, где заведомо выполнились все побочные эффекты его вычисления - это конец этого оператора. Например, в y = 37; x += y; можно быть уверенным, что 37 будет занесено в y раньше, чем значение y будет извлечено из памяти при вычислении суммы x + Кроме того, точки последовательных вычислений могут быть расположены внутри самого выражения:

при выполнении операции x, y такая точка находится между вычислением x и y;

при выполнении операции z ? x : y такая точка находится между при вызове функции все побочные эффекты вычисления значений ее аргументов проявятся перед выполнением ее тела;

при выполнении операций x && y и x || y такая точка находится между вычислением x и вычислением y.

Например, в if ( ( c = getchar() ) != EOF && isprint(c) ) вызов функции isprint(c) произойдет только после того, как переменная c получит новое значение.

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

Например, верно val = 10 * val + (c - ‘0’); но неверно i = ++i + 2;

Выражение может содержать точки последовательных вычислений, и тем не менее, порядок вычислений не будет однозначным. Например, f(x) + g(x) содержит такие точки, однако операция + допускает произвольный порядок вычисления ее операндов.

10.2.3 Арифметические преобразования при выполнении 1. если есть операнд типа short или signed char, то он преобразуется к int; если есть операнд типа char, unsigned char или unsigned short, и все значения этого типа могут быть представлены как int, то он преобразуется к int; иначе - к unsigned int. Это преобразование называется «целочисленное расширение»

(promoting ).

2. если после выполнения п.1 операнды имеют различные типы, то осуществляется их приведение к общему типу. Общим для двух типов ( кроме случая «unsigned int - long» ) является тот, который расположен позже в последовательности int, unsigned int, long, unsigned long, float, double, long double.

Если операнды имеют типы unsigned int и long, и все значения типа unsigned int могут быть представлены как long, то общим типом является long;

иначе - unsigned long. Это преобразование называют «согласование типов»

(balansing).

3. после этого выполняется арифметическая операция; тип результата это тип, к которому были приведены оба операнда.

10.2.4 Арифметические преобразования при выполнении M-битового представления величины X к N-битовому представлению ------------------------------------------------------------------------------------------------------знаковое целое отсечение значение значение ------------------------------------------------------------------------------------------------------если x 0,знач.сохр.

------------------------------------------------------------------------------------------------------- ------



Похожие работы:

«ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего профессионального образования ШУЙСКИЙ ГОСУДАРСТВЕННЫЙ ПЕДАГОГИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра спортивных дисциплин УЧЕБНО–МЕТОДИЧЕСКИЙ КОМПЛЕКС по дисциплине БИОМЕХАНИКА для специальности 050720.65 - Физическая культура со специализацией Физическое воспитание в дошкольных учреждениях Составитель: Правдов М.А., доктор педагогических наук, профессор Шуя, 2010 Учебно-методический комплекс дисциплины обсужден и...»

«Муниципальное бюджетное общеобразовательное учреждение Средняя общеобразовательная школа №7 УТВЕРЖДЕНА приказом МБОУ СОШ №7 от 30.08.2013г. № 235 РАБОЧАЯ ПРОГРАММА по химии основное общее образование Программа составлена учителем химии Коломиец Викторией Игоревной г.Черногорск, 2013 2 1. Пояснительная записка 1.1. Рабочая программа по химии составлена в соответствии с нормативно-правовыми документами: Федеральным законом Российской Федерации от 29 декабря 2012 г. № 273-ФЗ Об образовании в...»

«ГОСУДАРСТВЕННОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ БЕЛОРУССКО-РОССИЙСКИЙ УНИВЕРСИТЕТ Кафедра Оборудование и технология сварочного производства ТЕХНОЛОГИЯ И ОБОРУДОВАНИЕ СВАРКИ ДАВЛЕНИЕМ Методические указания к курсовой работе для студентов специальности 1-36 01 03 Оборудование и технология сварочного производства Могилев 2011 УДК 621.791.7 ББК 30.61 Рекомендовано к опубликованию учебно-методическим управлением ГУ ВПО Белорусско-Российский университет Одобрено кафедрой Оборудование...»

«Государственное бюджетное образовательное учреждение высшего профессионального образования Московской области Международный университет природы, общества и человека Дубна Институт системного анализа и управления Кафедра устойчивого инновационного развития Заведующий кафедрой доктор технических наук, профессор, действительный член РАЕН руководитель Научной школы устойчивого развития Большаков Борис Евгеньевич Дубна, 2012 г. 1 КАФЕДРА УСТОЙЧИВОГО ИННОВАЦИОННОГО РАЗВИТИЯ входит в число лучших...»

«Уважаемые выпускники! В перечисленных ниже изданиях содержатся методические рекомендации, которые помогут должным образом подготовить, оформить и успешно защитить выпускную квалификационную работу. Рыжков, И. Б. Основы научных исследований и изобретательства [Электронный ресурс] : [учебное пособие для студентов вузов, обучающихся по направлению подготовки (специальностям) 280400 — Природообустройство, 280300 — Водные ресурсы и водопользование] / И. Б. Рыжков.— Санкт-Петербург [и др.] : Лань,...»

«Проект Формирование системы инновационного образования МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ им.М.В.Ломоносова ФАКУЛЬТЕТ НАУК О МАТЕРИАЛАХ Магистерская программа Химия, физика и механика функциональных материалов направление 511700 (020900 по ОКСО) Содержание магистерской программы Блок гуманитарный, социальный и экономический цикл включает в себя дисциплины: История и методология наук о материалах; Методика преподавания естественно-научных дисциплин; Английский язык; Философские проблемы...»

«Рекомендовано УМО по образованию в области финансов, учета и мировой экономики в качестве учебного пособия для студентов, обучающихся по специальности Бухгалтерский учет, анализ и аудит Второе издание, стереотипное УДК 336.14(075.8) ББК 65.261.3я73 Б98 Рецензенты: М.В. Мельник, проф. кафедры экономического анализа и аудита ФГОБУ ВПО Финансовый университет при Правительстве Российской Федерации, др экон. наук, Ю.Р Туманян, проф. кафедры экономической теории ГОУ ВПО СевероКавказский....»

«Авангардизм в изобразительном искусстве - выставки Аварийно-спасательные бригады - организация работы Аварийно-спасательные работы - технические средства Авиадвигателестроительные заводы - Пермь - история Авиаконструкторы русские зарубежные Авиаприборостроение Авиаприборостроительные заводы - экономика Авиастроение - автоматизация Авиационная промышленность - предприятия Авиационная техника - производство - ремонт - рынок - статистические методы изучения Авиационная экология...»

«Министерство сельского хозяйства Российской Федерации Федеральное государственное образовательное учреждение высшего профессионального образования Московский государственный агроинженерный университет имени В.П.Горячкина Кафедра Информационно-управляющие системы Андреев С.А., Судник Ю.А., Юсупов Р.Х. ДИПЛОМНОЕ ПРОЕКТИРОВАНИЕ Методические указания для студентов факультета заочного образования по специальностям Электрификация и автоматизация сельского хозяйства и Профессиональное обучение со...»

«Министерство образования Республики Беларусь Учреждение образования Белорусский государственный университет информатики и радиоэлектроники Кафедра философии Философия в исторической динамике культуры Методическое пособие для семинарских занятий студентов дневного отделения всех специальностей БГУИР Под редакцией зав. кафедрой Г. И. Малыхиной Минск БГУИР 2010 УДК 1(091)(076) ББК 87.3я7 Ф56 С о с т а в и т е л и: Г. И. Малыхина, И. Ф. Габрусь, М. Р. Дисько-Шуман, Т. А. Пушкина, В. В. Шепетюк, И....»

«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ имени М.В. Ломоносова ФАКУЛЬТЕТ ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ И КИБЕРНЕТИКИ VIII Международная научно-практическая конференция Современные информационные технологии и ИТ-образование СБОРНИК НАУЧНЫХ ТРУДОВ Под редакцией проф. В.А. Сухомлина Москва 2013 УДК [004:377/378](063) ББК 74.5(0)я431+74.6(0)я431+32.81(0)я431 С 56 Издание осуществлено при финансовой поддержке Российского фонда фундаментальных исследований (проект № 13-07-06076 _г) Печатается по решению...»

«Министерство образования и науки Российской Федерации Псковский государственный университет А.В. Стрикунов, И.П. Войку ПРОГРАММА И МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ПРЕДДИПЛОМНОЙ ПРАКТИКЕ Для студентов специальности Управление инновациями Рекомендовано кафедрой Менеджмент организации Псков Издательство ПсковГУ 2012 УДК 338.2 ББК 65.29 С 85 Рекомендовано кафедрой Менеджмент организации Рецензенты: – В.В. Шевельков, канд. техн. наук, декан механикомашиностроительного факультета Псковского государственного...»

«Учреждение образования БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ А. К. Гармаза, И. Т. Ермак, Б. Р. Ладик ОХРАНА ТРУДА Рекомендовано учебно-методическим объединением по образованию в области природопользования и лесного хозяйства учреждений высшего образования в качестве учебно-методического пособия для студентов учреждений высшего образования по специальностям 1-75 01 01 Лесное хозяйство, 1-46 01 01 Лесоинженерное дело, 1-46 01 02 Технология деревообработки, 1-36 05 01 Машины и...»

«Министерство образования Республики Беларусь Учреждение образования БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ Кафедра производственной и экологической безопасности МЕТОДИЧЕСКИЕ УКАЗАНИЯ, ЗАДАНИЯ ДЛЯ КОНТРОЛЬНОЙ РАБОТЫ И ПРОГРАММА ИЗУЧЕНИЯ ДИСЦИПЛИНЫ ОСНОВЫ ПСИХОЛОГИИ И ПЕДАГОГИКИ для студентов всех специальностей БГУИР заочной формы обучения Минск 2002 УДК 15 + 37(075.8) ББК 88 + 74.00 я 7 М 54 Составители: И. Г. Шупейко, А.Ю. Борбот Методические указания, задания...»

«Московский физико-технический институт Кафедра системной интеграции и менеджмента Прикладной текст Научная публикация Электронный документ Методическое пособие Отредактировано 20.01.2011 Леонов Андрей Владимирович к.ф.-м.н., доцент МФТИ © 2006-2010 1. ПРИКЛАДНОЙ ТЕКСТ 5 1.1. Что такое прикладной текст 5 1.1.1. Функция текста 5 1.1.2. Ремесло и искусство: прикладной текст и литература 6 1.1.3. Жанры прикладного текста 7 1.1.4. Подготовка прикладного текста как предмет обучения 1.2. Структура...»

«Учебное пособие для 10 класса учреждений, обеспечивающих получение общего среднего образования, с русским языком обучения с 12летним сроком обучения Под редакцией доктора исторических наук, профессора Г. А. Космача Допущено Министерством образования Республики Беларусь 2е издание Минск Издательский центр БГУ 2006 УДК 94(100)1945/2005(075.3=161.1) ББК 63.3(0)6я72 В84 А в т о р ы: Г. А. Космач — Введение, § 2, 18—26, разделы по истории культуры к § 4—8; Г. Г. Лазько — § 1, 3—10; В. В. Тугай — §...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ ТОРГОВО-ЭКОНОМИЧЕСКИЙ УНИВЕРСИТЕТ ОМСКИЙ ИНСТИТУТ (ФИЛИАЛ) Метелв И.С., Калинина Н.М., Елкин С.Е. ЭКОНОМИКА НЕДВИЖИМОСТИ Электронное учебно-практическое пособие Печатный аналог электронного учебно-практического пособия издан при поддержке гранта ректора Российского государственного торгово-экономического университета (решение...»

«Английский язык: лучшее качество в вашем вузе Москва, РЕЛОД, 2014 г. Акция Сезонный заказ: учебники в срок и со скидками! Уважаемые руководители и преподаватели учебных заведений! Спешите запастись учебниками на будущий учебный год заранее! Вовремя. Удобно. Выгодно. Успейте воспользоваться привлекательными условиями на приобретение учебной литературы по английскому, французскому и испанскому языкам! Наши учебные пособия – отличные результаты обучения иностранному языку в вашем вузе! Сезонный...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ НЕФТИ И ГАЗА им. И.М. ГУБКИНА УНЦ ГАЗОХИМИЯ ИОХ им. Н.Д.ЗЕЛИНСКОГО РАН – РГУ НЕФТИ И ГАЗА им. И.М. ГУБКИНА В.С.Арутюнов, А.Л.Лапидус ВВЕДЕНИЕ В ГАЗОХИМИЮ МОСКВА-2004 УДК 622.276.53 Г 13 Арутюнов В.С., Лапидус А.Л. Введение в газохимию. Учебное пособие. Учебное пособие является вводной частью цикла Основы газохимии. В нем рассматривается значение природных газов в экономике и энергетике, генезис и...»

«ВСЕРОССИЙСКАЯ ОЛИМПИАДА ШКОЛЬНИКОВ ПО ФИЗИЧЕСКОЙ КУЛЬТУРЕ МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ по разработке заданий для школьного и муниципального этапов всероссийской олимпиады школьников по физической культуре в 2012/2013 учебном году Москва 2012 Методические рекомендации по разработке заданий для школьного и муниципального этапов всероссийской олимпиады школьников по физической культуре в 2012/2013 учебном году Оглавление: С тр. Введение.. 3 Организация и проведения школьного и муниципального этапа....»






 
2014 www.av.disus.ru - «Бесплатная электронная библиотека - Авторефераты, Диссертации, Монографии, Программы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.