153
ФЕДЕРАЛЬНОЕ АГЕНТСТВО МОРСКОГО И РЕЧНОГО ТРАНСПОРТА ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ВОДНЫХ КОММУНИКАЦИЙ» В.В. Фомин Д.В. Сикулер И.К. Фомина МЕТОДЫ ПРОГРАММИРОВАНИЯ СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ НА АЛГОРИТМИЧЕСКОМ ЯЗЫКЕ СИ 1

МЕТОДЫ ПРОГРАММИРОВАНИЯ

  • Upload
    opl3d

  • View
    36

  • Download
    0

Embed Size (px)

DESCRIPTION

СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ НА АЛГОРИТМИЧЕСКОМ ЯЗЫКЕ СИ

Citation preview

Page 1: МЕТОДЫ ПРОГРАММИРОВАНИЯ

ФЕДЕРАЛЬНОЕ АГЕНТСТВО МОРСКОГО И РЕЧНОГО ТРАНСПОРТА

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТВОДНЫХ КОММУНИКАЦИЙ»

В.В. Фомин Д.В. Сикулер И.К. Фомина

МЕТОДЫ ПРОГРАММИРОВАНИЯ

СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ НА АЛГОРИТМИЧЕСКОМ ЯЗЫКЕ СИ

Санкт-Петербург2006

1

Page 2: МЕТОДЫ ПРОГРАММИРОВАНИЯ

УДК 681.3.068ББК 32.98 Ф762

Рецензент:Доктор технических наук, профессор кафедры «Морские

информационные технологии» Российского государственного гидрометеорологического университета П. П. Бескид

Фомин В. В., Сикулер Д. В., Фомина И. К.Ф762 Методические указания по выполнению практических работ

дисциплины «Методы программирования» Структурное программирование на алгоритмическом языке СИ. - СПб.: СПГУВК, 2006. – 110 с.

В учебно-методическом пособии излагаются основы языка программирования Си от алгоритмической версии, до объектно-ориентированного С++. Рассмотрены базовые принципы представления информации в ЭВМ. Раскрываются академические подходы к принципам программной обработки. В пособии представлены типовые задачи по программированию на языке программирования С/С++ – управление вычислительным процессом, работа с массивами, поиск и сортировка, файловый доступ и др. Структура пособия включает в себя большое количество практических заданий и ориентировано на использование в качестве методического указания на выполнения лабораторных работ.

Данное пособие ориентировано на студентов специальностей «Прикладная математика и информатика», «Комплексное обеспечение информационной безопасности автоматизированных систем», «Информационные системы и технологии», а также может быть полезным для специалистов в области разработки прикладных программ.

ISBN

УДК 681.3.068ББК 32.98

ISBN © Санкт-Петербургский государственный университет водных коммуникаций, 2006

© Фомин В. В., Сикулер Д. В., Фомина И. К., 2006

2

Page 3: МЕТОДЫ ПРОГРАММИРОВАНИЯ

СОДЕРЖАНИЕВВЕДЕНИЕ................................................................................................................................41. ОСНОВЫ АЛГОРИТМИЧЕСКОГО ЯЗЫКА СИ..............................................................5

1.1. ГРАММАТИКА.............................................................................................................51.2. СТРУКТУРА ПРОГРАММЫ.......................................................................................81.3. ТИПЫ ДАННЫХ.........................................................................................................111.4. ПРЕОБРАЗОВАНИЕ ТИПОВ.................................................................................121.5. АДРЕСА И ССЫЛКИ..................................................................................................141.6. ОПЕРАТОРЫ...............................................................................................................161.6.1. ОПЕРАЦИИ...............................................................................................................161.6.2. ОПЕРАТОРЫ ВВОДА/ВЫВОДА...........................................................................211.6.3. ОРГАНИЗАЦИЯ РАБОТЫ С ФАЙЛАМИ............................................................261.6.4. ОПЕРАТОР АЛЬТЕРНАТИВЫ...............................................................................291.6.5. ОПЕРАТОР ВЫБОРА..............................................................................................321.6.6. ЦИКЛ С <ПРЕДУСЛОВИЕМ>...............................................................................341.6.7. ЦИКЛ <С ПОСТУСЛОВИЕМ>...............................................................................381.6.8. ЦИКЛ <АРИФМЕТИЧЕСКИЙ>.............................................................................401.6.9. ОПЕРАТОР ПРОДОЛЖЕНИЯ............................................................................471.6.10. ОПЕРАТОР ПЕРЕХОДА.......................................................................................481.6.11. МАССИВЫ..............................................................................................................481.6.12. СОРТИРОВКА МАССИВА...................................................................................521.6.13. СТРОКИ...................................................................................................................56

2. ТЕМЫ И ЗАДАНИЯ ПО ВЫПОЛЕНЕНИЮ ЛАБОРАТОРНЫХ РАБОТ...................60ЛАБОРАТОРНАЯ РАБОТА № 1..........................................................................................60ЛАБОРАТОРНАЯ РАБОТА № 2..........................................................................................62ЛАБОРАТОРНАЯ РАБОТА № 3..........................................................................................66ЛАБОРАТОРНАЯ РАБОТА № 4..........................................................................................69ЛАБОРАТОРНАЯ РАБОТА № 5..........................................................................................72ЛАБОРАТОРНАЯ РАБОТА № 6..........................................................................................753. КОНТРОЛЬ И ПРЕДСТАВЛЕНИЯ ЛАБОРАТОРНЫХ РАБОТ...................................79ПРИЛОЖЕНИЕ 1....................................................................................................................81ПРИЛОЖЕНИЕ 2....................................................................................................................84СПИСОК ЛИТЕРАТУРЫ....................................................................................................109

3

Page 4: МЕТОДЫ ПРОГРАММИРОВАНИЯ

ВВЕДЕНИЕ

На современном уровне развития вычислительной техники можно по

пальцам пересчитать алгоритмические языки практического использования:

ФОРТРАН, БЭЙСИК, ПАСКАЛЬ, АДА, Си, ФОРТ и др. Однако наиболее

ярким представителем из класса «системных» языков является

алгоритмический язык Си. Си – язык написания трансляторов, язык,

обеспечивающий доступ к самым сокровенным особенностям машины.

Когда мы говорим о каком то языке вообще, и о конкретном языке

программирования в частности, то необходимо понимать, что в он находится

в постоянном развитии, трансформируясь от примитивных трансляторов до

многофункциональных инструментальных систем. В основу данного пособия

положен алгоритмический язык Си в его развитии: базовый Си, С++, Borland

C Builder. При работе над материалами данного пособия использовался

компилятор, входящий в состав интегрированной среды разработки

приложений Borland C Builder 5.0. Его следует воспринимать исключительно

как одно из множества инструментальных средство поддерживающих

концепцию языка Си. Выбор транслятора для реализации большинства задач

этой книги абсолютно не принципиален. Следует лишь иметь в виду, что

выполнение примеров, которые приводятся в этой книге, в других

инструментальных средах в ряде случаев может привести к иным

результатам. Это связано с тем, что многие свойства языка C++ (размеры

данных основных типов, способы их размещения в различных сегментах

памяти и т.д.) зависят от конкретной реализации языка. Однако это

нисколько не противоречит тому, о чём говорится в пособии.

4

Page 5: МЕТОДЫ ПРОГРАММИРОВАНИЯ

1. ОСНОВЫ АЛГОРИТМИЧЕСКОГО ЯЗЫКА СИ

1.1. ГРАММАТИКА

Алфавит. Алфавит (или множество литер) языка программирования Cи

основывается на множестве символов таблицы кодов ASCII. Алфавит Cи

включает:

строчные и прописные буквы латинского алфавита (мы их будем

называть буквами),

цифры от 0 до 9 (назовём их буквами-цифрами),

символ '_' (подчеркивание - также считается буквой),

набор специальных символов:

" { } , | [ ] + - % / \ ; ' : ? < > = ! & # ~ ^ . * ( )

пробельные символы (пробел, табуляция, переход на новую строку).

Алфавит Си служит для построения слов называемых лексемами.

Различают пять типов лексем: идентификаторы, ключевые

(зарезервированные) слова, знаки операций, константы, разделители.

Идентификаторы. Правила построения идентификаторов из букв

алфавита:

Первым символом идентификатора Cи может быть только буква.

Следующими символами идентификатора могут быть буквы, буквы-

цифры и буквы-подчерки.

Длина идентификатора неограниченна (фактически же длина зависит

от реализации системы программирования).

Прописные и строчные буквы различаются.

Особенности реализации словообразования в Си делают

нежелательными для использования идентификаторы, которые начинаются с

небуквенных символов.

При выборе идентификатора необходимо иметь в виду следующее:

5

Page 6: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Идентификатор не должен совпадать с ключевыми словами и

именами используемых стандартных объектов языка.

Не рекомендуется начинать идентификатор с символа

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

переменных.

Ключевые (зарезервированные) слова. Часть идентификаторов C++

входит в фиксированный словарь ключевых слов. Ключевые слова - это

идентификаторы, которые имеют специальное значение для компилятора.

Прочие идентификаторы после специального объявления становятся

именами.

Список ключевых слов:

asm auto break case catch char class const continue default do double else enum extern float for friend goto if in-line int long new operator private protected public register return short signed sizeof static struct switch template this throw try typedef typeid union void unsigned virtual volatile while.

Знаки операций. Множество лексем, соответствующее множеству

символов операций и разделителей строится на основе набора специальных

символов алфавита. Правило словообразования для этих категорий лексем

заключается в задании фиксированного множества символов операций и

разделителей. Знак операции – это один или более символов, определяющих

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

Следующие последовательности специальных символов и букв алфавита

образуют множество символов операций (часть из них в зависимости от

контекста может быть использована в качестве разделителей):

6

Page 7: МЕТОДЫ ПРОГРАММИРОВАНИЯ

“,”, “!”, “!=”, “|”, “||”, “|=”, “%”, “%=”,“&”, “&&”, “()”, “*”, “*=”,“+”,“+

+”,“+=”, “-”, “--”, “-=”, “>=”, “>>=” ,==” ,“<<=”, “<=”, “<”, “>”,“>>”, “<<”,

“?”, “~”, “^”, “^=”, “#”, “##”.

Константы. Константами называют неизменяемые величины.

Различаются целые, вещественные, символьные и строковые константы.

Компилятор, выделив константу в качестве лексемы, относит ее к одному из

типов по ее внешнему виду или по типу, заданному программистом.

Форматы констант, соответствующие каждому типу, приведены в табл.1.1.

Таблица 1.1.

Форматы констант

Константа Формат Примеры

Целая Десятичный: последовательность десятичных цифр, начинающаяся не с нуля, если это не число нуль.Восьмеричный: нуль, за которым следуют восьмеричные цифры.Шестнадцатеричный: 0x или 0X, за которым следуют шестнадцатеричные цифры.

8, 0, 5864

020, 01, 05423

0xA, 0x1F8, 0X00BB

Вещественная Десятичный:[цифры].[цифры]или целая, или дробная часть могут быть опущены.Экспоненциальный:[цифры][.][цифры]{Е|е}[+|-][цифры]или целая, или дробная часть могут быть опущены

1.7, .547, 89.

0.2Е6, .22е-3, 7Е8

Символьная Один или два символа, заключенных в апострофы

’А’, ’ю’, ’*’, ’\о’, ’+’, ’\n’, ’\012’, ’\x07\x07’

Строковая Последовательность символов, заключенная в кавычки.

“ввод X,b”“\t сумма s = \0x5F\n”

Разделители. К числу разделителей относятся следующие

последовательности специальных символов: “…”, “;”, “{}”, “//”

7

Page 8: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Почти все типы лексем (кроме ключевых слов и идентификаторов)

имеют собственные правила словообразования, включая собственные

подмножества алфавита. Лексемы разделяются разделителями. Этой же цели

служит множество пробельных символов, к числу которых относятся пробел,

символы горизонтальной и вертикальной табуляции, символ новой строки,

перевода формата и комментарии.

1.2. СТРУКТУРА ПРОГРАММЫ

Программы на языке Си имеют «пофайловую организацию». Текст

программы может содержаться в одном файле или может быть распределен

по нескольким файлам.

Обобщенная структура программы на языке Си:

<Область описания препроцессора>

<Область описания функций>

Область описания препроцессора. – набор операторов обрабатываемых,

так называемым препроцессором. Препроцессор обеспечивает две важные

возможности – позволяет «включить» в текст программы внешние файлы и

«задать» текст с помощью макроподстановок. В языке Си базовыми

командами препроцессора являются два оператора: #INCLUDE и #DEFINE

Оператор #INCLUDE (включить). Его синтаксис:

#INCLUDE <имя_файла>

Обычно имя файла заключается в угловые скобки < >, если считается,

что вызываемый файл находится в отдельном каталоге и в двойные кавычки,

если файл содержится в текущем каталоге.

Практически каждая система, реализующая тот или иной язык

программирования (транслятор, компоновщик и прочее программное

8

Page 9: МЕТОДЫ ПРОГРАММИРОВАНИЯ

окружение) имеет набор готовых к использованию фрагментов программного

кода. Этот код может находиться в разной степени готовности. Это могут

быть фрагменты текстов программ, но, как правило, это объектный код,

располагаемый в особых файлах. Такие файлы называются библиотечными

файлами.

Для использования библиотечного кода программисту бывает

достаточно указать в программе требуемый файл и обеспечить вызов

соответствующих функций. Для использования библиотечного кода бывает

достаточно стандартного набора языковых средств. Решение всех остальных

проблем транслятор и компоновщик берут на себя. Разумеется,

программисту должно быть известно о существовании подобных библиотек

и о содержании библиотечных файлов.

Оператор #DEFINE (определить). Его синтаксис:

#DEFINE <имя_макроподстановки> <значение макроподстановки>

Имя макроподстановки фактически - имя константы и препроцессор

будет заменять в тексте программы имя_макроподстановки на ее значение.

Возможность макроподстановок в некотором смысле сопоставима с разделом

констант, поскольку позволяет вынести все явные константы из теста

программы и вместо них использовать их символические имена.

Область описания функций – множество операторов и описателей,

структурированных по функциям.

Функции. Язык Си – алгоритмический, функциональный язык. Любая

программа на Си состоит из одной или более функций. Одна из этих функций

должна иметь имя main. Именно с этой функции начинает выполняться

программа. Функцию main нельзя вызвать изнутри программы, и ее

параметры, если они существуют, задаются операционной системой.

Обычно, но не обязательно, main() ставится первой функцией в программе.

9

Page 10: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Имя функции – попросту не что иное, как коллективное имя некоторой

группы операторов, заключенных в операторные скобки – { }. Синтаксис

функции в языке Си:

<имя_функции> (<список формальных параметров>)

<область описания формальных параметров>

{

<область локальных переменных>

<операторы>

}

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

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

функция не должна возвращать значение, указывается тип void. Тело

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

Функции не могут быть вложенными. Программа может состоять из

нескольких модулей. Все директивы имеют вид:

# include<имя_файла> и вставляют содержимое указанного файла в ту

точку исходного файла, где она записана. Поиск файла ведется в

стандартных каталогах включаемых файлов.

Пример 1. Структура программы, содержащей функции main, f1,f2.

директивы

int main()

{

операторы главной функции

}

int f1()

{

операторы функции f1

}

int f2()

10

Page 11: МЕТОДЫ ПРОГРАММИРОВАНИЯ

{

операторы функции f2

}

1.3. ТИПЫ ДАННЫХ

В языке Си, как и в большинстве других алгоритмических языков, все

данные должны быть определены перед тем, как ими можно будет

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

поразному. Тип данных определяет:

Занимаемый объем данных в памяти компьютера.

Множество значений (диапазон), которые могут принимать

значения переменных этого типа.

Операции и функции, которые можно применять к величинам

этого типа.

Фактически все алгоритмические языки, и язык Си не исключение,

манипулируют следующими наборами типов:

Наборы типов, описывающие числовые данные. К ним относятся типы:

int – так называемый тип описания целых чисел (от английского Integer)

и его аналог увеличенной размерности – long. (Пример представления чисел:

15523, -857, 3681279).

float – тип описания дробных чисел и его аналог увеличенной

размерности – double. (Пример представления чисел: -12474.568, 985.01,

478.00)

Наборы типов, описывающие символьные данные. В базовом языке Си к

такому типу относить тип char (от английского Character). Тип char позволяет

определять данные символьного типа. (Пример представления символа:

"s","б","5","7","*","”").

11

Page 12: МЕТОДЫ ПРОГРАММИРОВАНИЯ

bool – логический тип, величины которого могут принимать только

значения true и false.

Расширение типов данных шло последовательно с эволюцией самого

языка. С расширенными типами данных познакомимся в других главах

данного пособия.

Таблица 1.2.

Типы данных

Тип Примечаниясhar Единственный символshort Целое со знакомint Целое со знакомlong Длинное целое со знакомfloat Дробное со знакомdouble Удвоенное дробное со знакомbool Логическое

1.4. ПРЕОБРАЗОВАНИЕ ТИПОВ

Имена типов удобно перечислять в таком порядке: char, short, int, long,

float, double, bool.

Здесь типы .представлены в порядке увеличения их «размера памяти».

Речь идет об объеме памяти, необходимой для хранения значения некоторого

типа. Этот список помогает освоиться с неявными правилами

преобразования типов, приведенными ниже.

Для выражений, включающих одну бинарную операцию (т. е. операцию

с двумя операндами), например,

а+b

тип результата определяется по типам операндов. Действует такое правило:

значения типов char и short преобразуются в int, a float преобразуется в

double. Если в результате преобразования любой из операндов (а или b)

оказывается типа double, то второй так же преобразуется в double. После

12

Page 13: МЕТОДЫ ПРОГРАММИРОВАНИЯ

этого либо оба операнда будут типа duble, в таком случае результат будет

типа double, либо один или оба операнда будут типа int или long. Если один

из операндов - long, то другой преобразуется к long и результат - long. Если

оба операнда - int, то результат - также int. Поэтому можно говорить, что

неявные преобразования всегда идут от «меньших» объектов к «большим».

Результаты преобразований типов суммированы в табл. 1.3. Для явных же

преобразований используется операция «приведение» (cast).

Таблица 1.3.

Результаты преобразования типов

а b Результат

char char

short short int

int int

char

short long long

int

char float

short double double

int

long long long

long float double

double

float float double

double double

Если перед любым выражением поставить в скобках имя одного из

упомянутых типов, то мы заставим выражение дать результат, приведенный

к этому указанному типу. Поэтому выражение

(long) 2+3

13

Page 14: МЕТОДЫ ПРОГРАММИРОВАНИЯ

дает в качестве результата значение 5 типа long. Приведение может

оказаться полезным, если нужно преобразовывать фактический параметр к

типу соответствующего формального параметра. Функции exp, log и sqrt,

находящиеся в библиотеке математических функций, рассчитаны на параметр

типа double и дают результат типа double. Если нам нужно получить

натуральный логарифм от значения переменной х типа float, то мы должны

написать:

log ( (double) x )

Операция присваивания трактуется отличным от других операций

способом. Тип значения выражения в правой части преобразуется к типу

идентификатора в левой части. Поэтому правая часть типа double иногда

преобразуется к float, иногда float «обрезается» до int, a int переходит в char,

причем старшие разряды просто игнорируются.

1.5. АДРЕСА И ССЫЛКИ

В языках высокого уровня обычно нет необходимости знать адреса

памяти, где находятся данные, которыми манипулирует программа, и

заботиться о них. Вследствие этого в некоторых языках нам приходится

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

ячейкам памяти. В случае другой крайности, если доступ и изменение ячеек

памяти делается слишком просто, может оказаться, что программа,

использующая эту особенность, станет трудно читаемой. В Си

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

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

Адрес любого элемента данных получается при указании перед именем

префикса & (амперсенда); т.е. &х есть адрес х.

14

Page 15: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Адрес Содержимое

&i iadr *adr

Для манипуляции адресами надо иметь возможность определять

величины значения которых - ссылки или адреса. Это делается следующим

образом:

int i; /* представляет значение целого типа */

int *adr; /* хранит адрес величины */

/* целого типа */

/* другое возможное описание */

/* дающее тот же эффект */

int i, *adr;

С помощью введенных понятий теперь можно обеспечить связь любой

функции с вызвавшей ее программой. Ведь если вызвавший передает

функции адреса некоторых величин, то именно эти адреса и сохраняются в

локальной области функции. Адрес величин функция изменить не может, но

она может изменить содержимое этого адреса, а именно это нам и нужно.

Пример 2. Вычисление площади параллелепипеда.

main ( )

{ int length, width, depth, area;

length = 10; width = 16; depth = 4;

surface (length, width, depth, &area);

printf ("surface area = %f\n", area) ;

/* четвертый параметр - адрес /*

/*к его содержимому доступ через *addr */

surface (len, wid, dep, addr)

int len, wid, dep, *addr;

{ *addr = 2 * (len*wid + wid*dep + dep*len); }

15

Page 16: МЕТОДЫ ПРОГРАММИРОВАНИЯ

В функции surface для передачи вычисленной площади поверхности в

вызывающую программу используется формальный параметр addr. Чтобы

это можно было делать, содержимое addr, т.е. *addr, описывается

как относящееся к целому типу. Поэтому вызывающая программа

должна в качестве четвертого параметра задать адрес переменной целого

типа. В примере это адрес переменной area, т.е. &агеа. Поскольку внутри

функции оператор возврата не употребляется, то с именем функции и не

связывается какая-либо величина. Соответственно и обращение к функции в

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

Если функция должна возвращать обратившемуся к ней только одно

значение, то обычно удобнее передавать его с помощью оператора возврата,

сопоставляя его с именем функции. Если же связь осуществляется через

несколько величин, то можно воспользоваться как механизмом возврата, так

и списком параметров. Можно ограничиться только одним списком

параметров. Далее, по мере введения других конструкций языка, мы приведем

и примеры функций, где используются все эти механизмы.

1.6. ОПЕРАТОРЫ

1.6.1. ОПЕРАЦИИ

Операции присваивания.

Мы уже в некоторых местах приведенных программ ввели несколько

таких операций. Например, операция += дала нам возможность написать

sum+=i;

В языке Си операция присваивания трактуется так же, как и другие

операции, т. е. кроме того, что она выполняет присваивание, в качестве

результата она поставляет присвоенное значение. И его можно снова

использовать в других целях. Так, выражение

16

Page 17: МЕТОДЫ ПРОГРАММИРОВАНИЯ

(sum+=i) >max

добавляет к sum значение i и сравнивает присвоенное значение с max.

Поэтому вполне допустимо писать и кратные присваивания.

sum=total=start=0;

Полный список операций присваивания:

+=, -=, *=, %=, <<=, >>=, ^=, /=, &=, |=

Смысл этих различных присваиваний станет очевидным при описании

различных классов операций.

Арифметические операции.

Введем различные операции на примерах простых выражений.

- 8 -8 (унарный минус)

6 + 4 10 сложение

6 - 4 2 вычитание

6 * 4 24 умножение

6 / 4 1 деление

6 % 4 2 остаток

За исключением операции «остаток», тип результата таких выражений,

как правило, определяется ранее упомянутыми правилами преобразования. В

приведенных примерах все результаты относятся к типу int. Если делятся два

элемента типа int, то дли того, чтобы получить результат типа int, дробная

часть частного отбрасывается. Операция «остаток» дает остаток от деления

одного целого на другое. Результат — типа int. Эту операцию нельзя

применять с операндами типа double или float.

Поразрядные операции.

Язык Си заслужил обоснованную популярность как язык «реализаций». В

основном это объясняется той легкостью, с которой пользователь может

17

Page 18: МЕТОДЫ ПРОГРАММИРОВАНИЯ

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

Предусмотрены такие операции:

7<<5 224 сдвиг влево

7>>5 0 сдвиг вправо

7|5 7 поразрядная дизъюнкция (ИЛИ)

7^5 2 поразрядное исключающее ИЛИ

7&5 5 поразрядная конъюнкция (И)

~5 -6 поразрядное отрицание

Работа с разрядами, обычно свойственная программистам, работающим на

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

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

или передаче информации.

Логические операции.

Такие операции в комбинации с одним или несколькими сравнениями

используются в управляющих выражениях условных операторов,

операторов циклов.

7&&5 1 логическое И

7||0 1 логическое ИЛИ

!0 1 логическое отрицание

Важно отметить, что в отличие от поразрядных операций указанные

операции трактуют любые отличные от нуля операнды как 1 (истина).

Нулевой же операнд считается ложью. Результат операции — это 0 или 1 в

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

Выражения, включающие && и ||, вычисляются слева направо, и процесс

заканчивается, как только выясняется истинность или ложность выражения.

Операции отношения.

18

Page 19: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Примеры таких операций в тексте встречались в нескольких местах. В Си есть

такие операции:

> больше

>= больше или равно

= = равно

! = не равно

<= меньше или равно

< меньше

Вот, например, проверка, является ли символ цифрой или нет. Здесь есть две

операции отношения и одна логическая операция:

digit= (ch> = '0') && (ch< = '9');

Увеличение и уменьшение.

Операция уменьшения действует аналогичным образом операции

увеличения. Например,

countdown - - ;

уменьшает значение countdown на единицу.

Обе эти операции можно записывать как перед операндом, так и после него.

Поэтому можно написать:

- - countdown; ++count;

Такие простые примеры этих операций тем не менее не позволяют уяснить

отличие префиксного их употребления от постфиксного. Разницу же можно

показать на таком примере:

р=0;

printf ("%2d\n", p++);

printf ("%2d\n",++p);

После инициации первый оператор напечатает нуль и затем увеличит р.

Во втором операторе печати сначала p увеличится (станет равным двум), а

затем его значение будет напечатано. Префиксное употребление

19

Page 20: МЕТОДЫ ПРОГРАММИРОВАНИЯ

подразумевает увеличение (уменьшение) соответствующего значения, а затем

его использование, в то время как постфиксное употребление соответствует

использованию и последующему увеличению (уменьшению).

Старшинство операций.

Выражения на любом языке программирования должны быть записаны

понятно. (Помните, что другие так же пожелают прочитать и понять ваши

программы.) Для того чтобы достичь этого и создавать синтаксически и

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

выражения и как они интерпретируются.

Т а б л и ц а 1.4.Старшинство операций

Приоритет Операция Название Порядок вычислений

высший ( ) Скобки слева направо

[ ] Квадратные скобки слева направовысший - 1 ++ Увеличение справа налево

-- Уменьшение справа налево(тип) Приведение справа налево* Содержимое справа налево& Адрес справа налево- Унарный минус справа налево~ Обращение справа налево! Логическое НЕ справа налево

высший - 2 Умножение слева направо/ Деление слева направо% Остаток слева направо

высший - 3 + Сложение слева направо- Вычитание слева направо

высший - 4 >> Сдвиг вправо слева направо<< Сдвиг влево слева направо

высший - 5 > Больше слева направо> = Больше или равно слева направо< = Меньше или равно слева направо< Меньше слева направо= Равно слева направо!= Не равно слева направо

низший +5 & Поразрядное И слева направо

20

Page 21: МЕТОДЫ ПРОГРАММИРОВАНИЯ

низший +4 ^ Исключающее ИЛИ слева направонизший +3 1 Поразрядное ИЛИ слева направонизший +2 &&. Логическое И слева направонизший +1 II Логическое ИЛИ слева направонизший = Присваивание справа налево

+ = Присваивание со сложением справа налево- = И т. д. справа налево* = справа налево/ - справа налево%= справа налево>> = справа налево<< = справа налево& = справа налево^= справа налево1 = справа налево

Операнды должны разделяться операциями, они обычно выполняются

слева направо. В таком, например, выражении а + b*с операнды

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

умножение b на с выполняется ранее прибавления а.

Формально в этом случае мы говорим, что умножение имеет больший

приоритет, чем сложение. Для введения принудительного приоритета всегда

можно использовать скобки. В Си же, однако, существуют ситуации, в

которых даже эти правила применять не так легко, как хотелось бы. Кроме

того, другим возможным источником ошибок и неприятностей являются

некоторые операции, например * и &, выполняющие более чем одну функцию.

Рассмотрим такой пример:

*pint++

Это не часть умножения. Его можно понять как увеличение ссылки (адреса)

pint на единицу и получение содержимого памяти по этому адресу, а

иногда - и как увеличение на единицу значения *pint. Фактически же все

унарные операции выполняются справа налево, И так что наше выражение

увеличивает ссылку pint, а не то, на что она указывает. Если нам нужно

именно это, то следует написать:

(*pint)++

21

Page 22: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Поэтому необходимо знать и старшинство операций, и порядок, в котором они

выполняются. Вся подобная информация сосредоточена в табл.1.4. Операции,

имеющие одинаковый приоритет, помещены в последовательных строках, но

это отнюдь не означает их упорядоченности.

1.6.2. ОПЕРАТОРЫ ВВОДА/ВЫВОДА

Язык Си изначально не предполагал специальных операторов

ввода/вывода данных. Предполагалось, что соответствующий транслятор

будет дополнен специальной библиотекой с необходимыми функциями,

выполняющими различные действия по вводу/выводу данных.

Базовые функции ввода/вывода данных getchar, putchar. В изначальных

версиях трансляторов языка Си данные функции стали «фундаментальными»

операторами ввода/вывода данных и, поэтому, как правило поддерживаются

любым инструментарием базирующимся на языке Си.

getchar() – функция считывания с клавиатуры одного символа.

putchar() – функция вывода на дисплей одного символа.

Оператор расширенного вывода данных printf .

Общий вид обращения к функции printf можно представить так:

printf (управляющая строка [, список аргументов])

В квадратные скобки помещаются элементы, которых может и не быть.

Управляющая строка может содержать символы, которые следует

напечатать, управляющие символы, перед которыми стоит обратная косая

черта, и спецификации преобразования.

Спецификации преобразования. Каждой спецификации преобразования

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

«Минимальный» вид спецификации – знак процента, за которым следует

один из нескольких вполне определенных символов.

22

Page 23: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Общий вид спецификации таков:

%[-][fw][.][pp]C

где C – символ или пара символов, определяющих преобразование;

- означает, что выдаваемое значение должно быть в поле выровнено

влево. По умолчанию оно выравнивается вправо;

fw – строка цифр (число), задающая минимальный размер поля, т.е.

общее число позиций, занимаемых печатаемым материалом. В избыточных

позициях поля по умолчанию «печатается» пробел. Если первая цифра

размера есть ноль, то поле должно дополняться нулями. Если величина

слишком велика для заданного спецификацией поля, то она тем не менее

будет полностью напечатана. Если вместо строки цифр стоит «звездочка», то

это означает, что размер поля задается целым значением – константой или

переменной – в соответствующей позиции списка аргументов. Компонента

fw от pp отделяется пробелом;

pp – строка цифр, указывающая для величины типа float или double,

сколько будет напечатано цифр после десятичной точки. Если речь идет о

строках, то pp задает число печатаемых из строки символов.

Примеры спецификаций преобразования даются в таблице 1.5.

Таблица 1.5.

Спецификации преобразования

Символы спецификаци

и

Тип аргумента Примечания

C char Единственный символD int Десятичное со знаком (если

отрицательное)ld или D long Десятичное со знаком (если

отрицательное)U int Десятичное без знакаlu или U long Десятичное без знака

O int Восьмеричное без знака, бн

23

Page 24: МЕТОДЫ ПРОГРАММИРОВАНИЯ

lo или O long Восьмеричное без знака, бнX int Шестнадцатеричное без знака, бнlx или X long Шестнадцатеричное без знака, бн

(бн – начальные нули не печатаются)F float или double Десятичная записьE float или double «Научная» нотация (с порядком)G float или double Наиболее короткое представление из %e и

%fS строка Множество символов

Существуют символы, меняющие свой смысл, если перед ними стоит

обратная дробная черта; их полный список приводится в таблице 1.6.

Таблица 1.6.

Модификации символов с /

\b Шаг назад\f Новая страница\n Новая строка\r Возврат каретки

\t табуляция

\ddd Восьмеричный код ASCII

\" "

\\ \

Оператор расширенного ввода данных scanf.

Синтаксис оператора scanf имеет следующий общий вид обращения к

функции:

scanf (управляющая строка [, список аргументов])

Внутри управляющей строки пробелы, символы табуляции и переходы

на новую строку игнорируются. Если в управляющей строке появляется

какой-либо символ, кроме тех, которые относятся к спецификации

преобразования, то считается, что он должен совпадать с первым непустым

символом из входного потока.

24

Page 25: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Примеры спецификаций преобразования даются в таблице 1.7.

Для scanf общий вид спецификации преобразования таков:

%[*][dd]C

где C – символ преобразования;

* - допустимый признак гашения присваивания;

dd – цифровая строка, задающая максимальный размер поля.

Преобразование строк.

В языке С строковая константа – это последовательность символов,

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

читать, записывать, обрабатывать и печатать.

Таблица 1.7.

Спецификации преобразования

Символы преобразования

Тип аргумента

C Ссылка на charH Ссылка на shortD Ссылка на intld или D Ссылка на longO Ссылка на intlo или O Ссылка на longX Ссылка на intlx или X Ссылка на longF Ссылка на floatlf или F Ссылка на doubleE Ссылка на floatle или E Ссылка на doubleS Ссылка на массив char[……………] Ссылка на массив char

В языке Си строковые константы хранятся как массивы символов.

Ссылаются на них с помощью адреса первого символа. Общая форма

обращения к версии scanf, работающей со строками такова:

sscanf (строка-источник, управляющая строка [, список аргументов])

25

Page 26: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Пытаясь опознать данные, охарактеризованные в управляющей строке,

sscanf просматривает строку-источник. При успешном отождествлении

происходит присваивание элементу из списка аргументов. Соответственно

обращение вида

sprintf (строка-приемник, управляющая строка [, список аргументов])

приводит к записи аргументов, указанных в списке аргументов, в

строку – приемник с преобразованием, заданным управляющей строкой.

1.6.3. ОРГАНИЗАЦИЯ РАБОТЫ С ФАЙЛАМИ

Для любой программы в системах с Си всегда доступны три файла:

stdin – файл стандартного ввода, stdout – файл стандартного вывода, stderr –

файл стандартных сообщений об ощибках. Файлы открываются при входе в

программу и закрываются при выходе из нее. Если программисту требуется

использовать другие файлы, то создавать их, открывать и закрывать он

должен самостоятельно. Для упрощения таких операций предусмотрен набор

функций по работе с файлами и специальный тип данных FILE.

Открытие файла fopen.

Синтаксис оператора:

<имя_ссылки>=fopen(<имя_файла>, <тип_открытия>)

Функция возвращает некоторую ссылку на только что открытый файл,

поэтому необходимо идентифицировать эту ссылку, путем ее описания как

файлового типа данных:

FILE *<имя_ссылки>

С понятием ссылки на файл связывают служебное слово EOF (end of file)

и ряд соответствующих ему функций.

Аргументы функции fopen():

26

Page 27: МЕТОДЫ ПРОГРАММИРОВАНИЯ

<имя_файла> - аргумент, имеющий строковое значение и

представляющий собою имя открываемого файла.

<тип_открытия> - строка, указывающая с какой целю открывается

данный файл. В языке Си аргумент может принимать три значения (в языке

С++ больше):

"r" – файл открывается только для чтения.

"w" – файл открывается для записи (перезаписи).

"а" – файл открывается для добавления информации.

Попытка открыть несуществующий файл с аргументом "w" или "а"

приводит в результате к созданию такого файла. Попытка открыть

несуществующий файл с аргументом "r" приводит к выдаче функцией fopen()

значения NULL.

Закрытие файла fclose.

Синтаксис оператора:

fclose(<имя_файла>)

Если файл больше не требуется, а только мешает программированию то

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

открытые файлы автоматически закрываются.

Инструментальная система, под управлением которой выполняется

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

число открытых одновременно файлов. Разработчик должен знать –

существует ли в его системе такой предел и каков он. Превышение данного

предела приводит к ошибке.

Ввод и вывод информации обеспечивают взаимодействие программы с

пользователем и периферийными устройствами. Создатели

инструментальных средств и трансляторов в основе которых лежит язык Си

понимали, что реализация функций ввода/вывода настолько специфична и

27

Page 28: МЕТОДЫ ПРОГРАММИРОВАНИЯ

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

особенности.

Поэтому каждый инструментарий обладает своей библиотекой программ,

реализующий ту или иную концепцию операторов ввода/вывода. Программист должен

исследовать данные библиотеки на предмет расширенных возможностей. В табл. 1.8.

представлены базовые функции как правило входящие в библиотеку ввода/вывода.

Пример 3. Организуем ввод текста в файл и зашифруем текстовый файл

RIM1.TXT c помощью операции инверсии, результат шифровки

проанализируем в файле RIM2.TXT, и дешифруем файл RIM2.TXT в файл

RIM3.TXT. Сравним тексты, содержащиеся в файлах RIM1.TXT и

RIM3.TXT.

Таблица 1.8.

Базовые функции библиотеки ввода/вывода

printf Выводит строку параметров в определенном форматеscanf Вводит строку параметров в определенном форматеputchar Выводит символ на стандартное устройство выводаgetchar Читает символ из стандартного вводаsprintf Выводит строку параметров в определенном форматеsscanf Вводит данные из строкиfprintf Записывает данные в потокfscanf Вводит из файла форматированные данныеputc Записывает символ в потокgetc Читает символ из потокаfputs Записывает строку символов в потокfgets Читает из потока строку в n символовfputc Записывает символ в потокfgetc Читает из потока символfeof Проверяет достижение конца файлаfclose Закрывает поток ввода/выводаfopen Открывает поток ввода/вывода

{FILE *ing, *bob, *out;

unsigned char sim,kod;

28

Page 29: МЕТОДЫ ПРОГРАММИРОВАНИЯ

if ((ing = fopen("RIM1.TXT", "rb"))== NULL)

{ printf(“\nФайл отсутствует”);}

else

{bob=fopen("RIM2.TXT","wb");

out=fopen("RIM3.TXT","wb");

while (!feof(ing))

{sim=fgetc(ing);

kod=~sim;

fputc(kod, bob);

sim=~kod;

fputc(sim, out);

}

}

fclose(ing);

fclose(bob);

}

1.6.4. ОПЕРАТОР АЛЬТЕРНАТИВЫ

Как и любой алгоритмический язык программирования, язык Си

предоставляет средства выбора различных направлений продвижения от

одного оператора к следующему. В Си для этого служат два оператора :

оператор альтернативы и оператор выбора.

Оператор альтернативы имеет две синтаксические формы.

1) if (<лог_выражение>) <набор_операторов1>;

2) if (<лог_выражение>)

<набор_операторов1>;

else

29

Page 30: МЕТОДЫ ПРОГРАММИРОВАНИЯ

<набор_операторов2>;

Операторы в программе могут быть следующих видов:

1) оператор присваивания;

2) обращение к функции;

3) оператор цикла;

4) оператор принятия решения;

5) оператор безусловного перехода;

6) составной оператор;

Составной оператор – это группа операторов заключенная в

операторные скобки {}. Все перечисленные выше операторы

заканчиваются ;.

<лог_выражение> - так называемое логическое выражение, которое

будет определено в дальнейшем. Значение данного выражения принадлежит

к логическому типу (истина/ложь).

Логика работы. Если <лог_выражение> истинно выполняется

<набор_операторов1>, а затем управление передается следующему после if

оператору. Если <лог_выражение> ложно выполняется

<набор_операторов2>, а затем управление также передается следующему

после if оператору.

Пример 4. Написать программу, которая вычисляет, является ли год,

введенный пользователем, високосным.

#include <stdio.h>

#include <conio.h>

void main()

{

int year;

int r; //остаток от деления year на 4

printf(“введите год и нажмите <Enter> ”);

30

Page 31: МЕТОДЫ ПРОГРАММИРОВАНИЯ

scanf(“%i”, &year);

r=year%4;

if (r)

printf(“%i год невисокосный\n”, year);

else

printf(“%i год високосный\n”, year);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

Пример 5. Разработать программу вычисления стоимости

междугороднего разговора по телефону с учетом 20% скидки,

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

рублей.

#include <stdio.h>

#include <conio.h>

void main()

{

int time; //длительность разговора

int day; //день недели

float cost; //стоимость разговора

printf(“введите длительность разговора – целое количество минут”);

scanf(“%i”, &time);

printf(“введите день недели: 1-понедельник, и т.д.”);

scanf(“%i”, &day);

cost=time*21,5; //цена минуты 21,5 рублей

if (day == 6 || day == 7)

{

31

Page 32: МЕТОДЫ ПРОГРАММИРОВАНИЯ

printf(“Предоставлена скидка 20%\n”);

соst=соst*0,8;

}

printf(“Стоимость разговора:%3,2f руб.\n”, cost);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

Пример 6. Для заданного с клавиатуры значения x вычислить y по

формуле

2*x, если x < 0

Y= x2, если 0 ≤ x < 1

-x, если x ≥ 1

#include <stdio.h>

#include <conio.h>

void main()

{

float x,y;

printf(“введите значение аргумента”);

scanf(“%f”, &x);

if (x<0)

y=2*x;

else if (x>=0 && x<1)

y=x*x;

else y=-x;

printf(“Значение функции:%3,2f\n”, н);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

32

Page 33: МЕТОДЫ ПРОГРАММИРОВАНИЯ

1.6.5. ОПЕРАТОР ВЫБОРА

Общий вид оператора переключателя таков:

switch (выражение) <оператор>;

Значение вычисленного выражения должно быть целого типа (или

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

используется для выбора одного из нескольких операторов, которые нужно

выполнить. Оператор, следующий за switch выражением (если, конечно,

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

или более операторов. Перед каждым из них стоит конструкция

case <константное_выражение>: <оператор>

Константное выражение можно осмыслить как метку у оператора, перед

которым оно стоит. Выполняется именно тот оператор, у которого константное

выражение совпадает со значением вычисленного switch выражения. Внутри

любого оператора переключателя каждое константное выражение, метящее

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

программы определения по оценке отметки должна еще более прояснить вид

и «логику» оператора переключателя.

Пример 7. Составить программу, которая вычисляет стоимость

междугороднего телефонного разговора. Исходными данными являются

длительность разговора и код города.

Город Код Цена минуты (руб)

Москва 095 10,2

Екатеринбург 3432 20,5

Ставрополь 8652 13,45

Тамбов 0752 8,74

33

Page 34: МЕТОДЫ ПРОГРАММИРОВАНИЯ

#include <stdio.h>

#include <conio.h>

void main()

{

int kod; //код города

int time; //длительность разговора

float cost; //стоимость разговора

float tarif; //цена минуты

printf(“введите длительность разговора – целое количество минут”);

scanf(“%i”, &time);

printf(“введите код города”);

scanf(“%i”, &kod);

switch (kod)

{

case 095: tarif=10,2;

break;

case 3432: tarif=20,5;

break;

case 8652: tarif=13,45;

break;

case 0752: tarif=8,74;

break;

default: printf(“Код города введен не верно”);

tarif=0;

}

if (tarif !=0)

{

соst= tariff* time;

printf(“Стоимость разговора:%3,2f руб.\n”, cost);

34

Page 35: МЕТОДЫ ПРОГРАММИРОВАНИЯ

}

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

1.6.6. ЦИКЛ С <ПРЕДУСЛОВИЕМ>

В языке Си существуют три оператора соответствующие организации

трех видов циклов: цикл «с предусловием», цикл «с постусловием»,

«арифметический» цикл. Рассмотрим первый из них.

Данный вид цикла реализуется с помощью оператора while. Его

синтаксис:

while (<лог_выражение>) <тело цикла>

<тело цикла> - набор операторов

Логика работы. До тех пор пока <лог_выражение> истинно выполняется

набор операторов (тело цикла). Если <лог_выражение> ложно цикл

прекращается и управление передается следующему оператору.

Цикл носит название «с предусловием», поскольку логика работы

такова, что сначала анализируется условие – <лог_выражение>, и только

затем выполняется тело цикла.

Пример 8. Написать программу, которая вычисляет наибольший общий

делитель двух целых чисел.

#include <stdio.h>

#include <conio.h>

void main()

{

35

Page 36: МЕТОДЫ ПРОГРАММИРОВАНИЯ

int a,b; //числа, НОД которых необходимо вычислить

int nod; //наибольший общий делитель

int r; //остаток от деления a на b

printf(“введите числа a и b”);

scanf(“%i%i”, &a, &b);

printf(“НОД чисел %i и %i - это”, a,b);

while (a%b)

{

r=a%b //остаток от деления

a=b;

b=r;

}

nod=b;

printf(“%i\n”, nod);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

Пример 9. Составить программу для вычисления суммы бесконечного

ряда с точностью до ε. Из постановки задачи видно, что

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

слагаемого близко к 0, т.к. его добавление к сумме уже не влияет на

результат.

#include <stdio.h>

#include <conio.h>

void main()

{

int n; //номер текущего слагаемого

36

Page 37: МЕТОДЫ ПРОГРАММИРОВАНИЯ

float eps; //значение ε=0,001

float s=0; //сумма

printf(“введите величину точности расчетов”);

scanf(“%f”, &eps);

n=1;

while ((2*n-1)/(n*n*n)>eps)

{

s+=(2*n-1)/(n*n*n);

n++;

}

printf(“сумма равна %3,2f\n”, s);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

Пример 10. Составить программу для вычисления предела

последовательности c точностью до ε. Из постановки задачи

видно, что расчет предела следует прекратить, когда разница между текущим

и последующим значениями близка к 0.

#include <stdio.h>

#include <conio.h>

void main()

{

int n; //номер итерации

float eps; //значение ε=0,001

float lim; //предел последовательности

printf(“введите величину точности расчетов”);

scanf(“%f”, &eps);

37

Page 38: МЕТОДЫ ПРОГРАММИРОВАНИЯ

n=1;

lim=(n*n+5)/(2*n*n*n+n*n+1);

while (lim – ((n+1)*(n+1)+5)/(2*(n+1)*(n+1)*(n+1)+(n+1)*(n+1)+1)>eps)

{

n++;

lim=(n*n+5)/(2*n*n*n+n*n+1);

}

printf(“значение предела равно %3,2f\n”, lim);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

1.6.7. ЦИКЛ <С ПОСТУСЛОВИЕМ>

Данный вид цикла реализуется с помощью оператора do…while. Его

синтаксис:

do <тело цикла> while (<лог_выражение>)

<тело цикла> - набор операторов.

Логика работы. До тех пор пока <лог_выражение> истинно выполняется

набор операторов (тело цикла). Если <лог_выражение> ложно цикл

прекращается и управление передается следующему оператору.

Цикл носит название «с постусловием», поскольку логика работы

такова, что сначала выполняется тело цикла, и только затем анализируется

условие – <лог_выражение>.

В ряде задач условия сформулированы таким образом, что можно

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

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

38

Page 39: МЕТОДЫ ПРОГРАММИРОВАНИЯ

отражено. Однако необходимо знать, что в зависимости от постановки,

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

помощью одного итерационного цикла.

Пример 11. Составить программу для вычисления суммы бесконечного

ряда с точностью до ε. Из постановки задачи видно, что

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

слагаемого близко к 0, т.к. его добавление к сумме уже не влияет на

результат.

#include <stdio.h>

#include <conio.h>

void main()

{

int n; //номер текущего слагаемого

float eps; //значение ε=0,001

float s=0; //сумма

printf(“введите величину точности расчетов”);

scanf(“%f”, &eps);

n=1;

do

{

s+=(2*n-1)/(n*n*n);

n++;

} while ((2*n-1)/(n*n*n)>eps);

printf(“сумма равна %3,2f\n”, s);

printf(“\nДля завершения нажмите <Enter>”);

getch();

39

Page 40: МЕТОДЫ ПРОГРАММИРОВАНИЯ

}

Пример 12. Составить программу для вычисления предела

последовательности c точностью до ε. Из постановки задачи

видно, что расчет предела следует прекратить, когда разница между текущим

и последующим значениями близка к 0.

#include <stdio.h>

#include <conio.h>

void main()

{

int n; //номер итерации

float eps; //значение ε=0,001

float lim; //предел последовательности

float lim1;

printf(“введите величину точности расчетов”);

scanf(“%f”, &eps);

n=1;

do

{

lim=(n*n+5)/(2*n*n*n+n*n+1);

lim1=((n+1)*(n+1)+5)/(2*(n+1)*(n+1)*(n+1)+(n+1)*(n+1)+1);

n++;

} while (lim –lim1>eps);

printf(“значение предела равно %3,2f\n”, lim);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

40

Page 41: МЕТОДЫ ПРОГРАММИРОВАНИЯ

1.6.8. ЦИКЛ <АРИФМЕТИЧЕСКИЙ>

Данный вид цикла реализуется с помощью оператора for. Его синтаксис:

for (<выражение1>; <лог_выражение>; <выражение2>) <тело цикла>

<выражение1> - инициация счетчика (присвоение начального значения);

<лог_выражение> - логическое выражение (условие) продолжения

выполнения цикла;

<выражение2> - изменения счетчика.

Логика работы. При активизации оператора for выполняется

<выражение1>, далее, до тех пор пока <лог_выражение> истинно

выполняется сначала тело цикла, а затем <выражение2>. Как только

<лог_выражение> становиться ложно цикл прекращает работать и

управление передается следующему оператору.

Пример 13. Суммировать первые N натуральных чисел.

sum=0

for (i=1; I<=N; i=i +1) sum=sum+i;

или, если предпочтительнее считать в убывающем порядке,

sum=0;

for (i=N; i>=1; i=i -1) sum=sum+i;

В языке Си оператор for реализован так, что его можно использовать

неожиданным образом. Например, фрагмент

for (; ; ) k=0;

представляет собою бесконечный цикл. В языке считается, что если

пропускается второе выражение, т. е. управляющее условие, то это

эквивалентно тому, что там стояло бы значение истина. Наиболее

41

Page 42: МЕТОДЫ ПРОГРАММИРОВАНИЯ

существенное отличие нашего оператора цикла с for от аналогичных

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

изменяющее выражение вычисляются при каждой итерации. Это означает,

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

вычислениях, внутри цикла изменяется, то могут постоянно изменяться при

прохождении тела цикла и условие окончания, и шаг цикла. Рассмотрим,

например, такой цикл:

for ( p=1; p<=4096; p=2*p) printf ("%4d\n", p);

где печатается небольшой список степеней двойки. Степени образуются

путем умножения на двойку «приращения» при каждом проходе через цикл.

Условие окончания цикла не обязательно должно включать «счетчик»,

хотя обычно бывает именно так. Цикл из примера 13 можно было бы

переписать, употребив оператор со словом for в таком виде:

for ( count=0; getchar () I = '\п'; count ++ );

В этом цикле сама операторная часть отсутствует, поскольку вся

необходимая работа выполняется внутри управляющего выражения.

Обратите внимание, условие окончания от count не зависит. Изменение

условия окончания цикла в самом цикле надо делать крайне осторожно,

если вообще это стоит делать. Опасность заключается в том, что можно

сделать и такие изменения, что цикл вообще никогда не окончится.

Циклические конструкции языка Си соответствуют тем, которые обычно

есть и в других языках высокого уровня. Детерминированные циклы, где

заранее известно число итераций, лучше всего реализовывать с помощью

оператора цикла со словом for. Недетерминированные циклы, окончание

которых зависит от выполнения некоторого условия, лучше организовывать

через циклы while или do. Но это лишь общие правила.

Пример 14. По введенным с клавиатуры значениям A,B,n,m и X

вычислить сумму S:

42

Page 43: МЕТОДЫ ПРОГРАММИРОВАНИЯ

S=B+

// Вычисление суммы ряда от минимального члена ряда версия 1

#include <stdio.h>

#include <conio.h>

void main()

{

int m; //значение нижней границы суммы

int n; //значение верхней границы суммы

int i; //счетчик циклов

float S=0;

float A, B, X;

printf(“введите значения переменных A, B, X n,m ”);

scanf(“%f%f%f%i%i”, &A, &B, &X, &n, &m);

for (i=m; i<=n; i++)

{

S+=X+A/i);

}

S=S+A;

printf(“Сумма равна”,n,S);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

// Вычисление суммы ряда начиная от наибольшего члена версия 2

#include <stdio.h>

#include <conio.h>

void main()

{

43

Page 44: МЕТОДЫ ПРОГРАММИРОВАНИЯ

int m;

int n;

int i;

float S=0;

float A, B, X;

printf(“введите значения переменных A, B, X n,m ”);

scanf(“%f%f%f%i%i”, &A, &B, &X, &n, &m);

for (i=n; i>=m; i=i-1)

{

S+=X+A/i;

}

S=S+A;

printf(“Сумма равна”,n,S);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

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

функции y=-2,4x2+8x-13 в диапазоне от A= –5 до B=5, с шагом h=0,5.

Количество точек вычислите по формуле n=(B-A)/h+1. Для организации

таблицы использовать ASCII коды 196, 179.

//Построение таблицы версия 1.

#include <stdio.h>

#include <conio.h>

void main()

{

int n,i;

float A, B, X, Y, h;

printf(“введите значения переменных A, B, h ”);

scanf(“%f%f%f”, &A, &B, &h);

44

Page 45: МЕТОДЫ ПРОГРАММИРОВАНИЯ

printf(“-------------------------------------\n”);

printf(“¦ X ¦ Y ¦\n”);

printf(“-------------------------------------\n”);

X=A;

n=(B-A)/h+1;

for (i=1; i<=n; i=i+1)

{

Y=-2,4*X*X+8*X-13;

Printf(“¦ %6,2f ¦ %6,2f ¦\n”, X,Y);

X+=h;

}

printf(“-------------------------------------\n”);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

//Построение таблицы версия 2.

#include <stdio.h>

#include <conio.h>

void main()

{

float A, B, X, Y, h, n;

printf(“введите значения переменных A, B, h ”);

scanf(“%f%f%f”, &A, &B, &h);

printf(“-------------------------------------\n”);

printf(“¦ X ¦ Y ¦\n”);

printf(“-------------------------------------\n”);

for (X=A; X<=B; X=X+h)

{

45

Page 46: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Y=-2,4*X*X+8*X-13;

Printf(“¦ %6,2f ¦ %6,2f ¦\n”, X,Y);

}

printf(“-------------------------------------\n”);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

Пример 16. Для заданного с клавиатуры значения N вычислить N!!,

рассчитываемое по формуле:

2*4*6*…*(N-2)*N, если N четное

N!!=

1*3*5*…*(N-2)*N, если N нечетное

// Вычисление дважды факториала версия 1

#include <stdio.h>

#include <conio.h>

void main()

{

int n; // значение, факториал которого находим

int i; // счетчик цикла

printf(“введите значение N ”);

scanf(“%i”, &n);

n=1;

if (n%2==0)

for (i=2; i<=n; i=i+2)

n=n*i;

else

for (i=1; i<=n; i=i+2)

46

Page 47: МЕТОДЫ ПРОГРАММИРОВАНИЯ

n=n*i;

printf(“факториал равен”, n, n);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

// Вычисление дважды факториала версия 2

#include <stdio.h>

#include <conio.h>

void main()

{

int n=1; // значение, факториал которого находим

int i; // счетчик цикла

int N=1; //временная переменная, для хранения

//факториала нечетного n

printf(“введите значение n ”);

scanf(“%i”, &n);

for (i=1; i<=n; i++)

if (i%2==0)

n=n*i;

else

N=N*i;

if (n%2==1)

n=N;

printf(“факториал равен”, n, n);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

47

Page 48: МЕТОДЫ ПРОГРАММИРОВАНИЯ

1.6.9. ОПЕРАТОР ПРОДОЛЖЕНИЯ

Оператор разрыва break приводит к немедленному выходу из

операторов переключателя и циклов. Кроме того, в любых упомянутых

циклах можно употреблять и оператор продолжения continue. Этот

оператор вызывает лишь окончание текущей итерации данного цикла.

Если при выполнении циклов с while или do встречается continue, то

происходит переход на проверку условия окончания цикла. Если же он

попадается в цикле с for, то сначала выполняется «изменяющее»

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

итерацию.

1.6.10. ОПЕРАТОР ПЕРЕХОДА

Включенные в язык операторы цикла таковы, что если их употреблять

надлежащим образом, то пользователю редко (если вообще понадобится)

приходится использовать оператор перехода. В частности, оператор перехода

никогда не нужно употреблять для построения цикла. Однако может

случиться, что в некоторых ошибочных ситуациях оператор перехода делает

окончание программы более «прозрачным». Любой оператор можно пометить,

поставив перед ним некоторый идентификатор, а следом —двоеточие. После

этого такую метку можно ставить для указания места, куда надо выполнить

переход.

Например,

goto abort;

abort: printf (" abnormal termination \n" );

48

Page 49: МЕТОДЫ ПРОГРАММИРОВАНИЯ

1.6.11. МАССИВЫ

В приведенных ранее примерах любой элемент данных, если мы хотели

им манипулировать, получал некоторое имя - идентификатор. С каждым

идентификатором ассоциировался некоторый тип, и он, кроме того, относился

к определенному классу памяти. Такое сопоставление делалось явно, при

помощи описания. Так что до сих пор любой идентификатор представлял

некоторое числовое значение того или иного типа или же некоторый символ.

Вместо того чтобы давать определенный идентификатор каждой отметке,

что затрудняет работу с ними как с целым объектом, может быть, полезно для

всех отметок выделить некоторое коллективное имя и общий метод доступа

к каждой из них. Коллективное Имя для нескольких элементов данных

одного типа - имя массива. Каждый элемент для ссылок имеет уникальный

номер, его называют индексом массива.

Синтаксис описания массива:

<тип_значения> <имя_массива> [<индекс1>][<индекс2>]…[<индексN>]

В языке Си индексация начинается с нуля. Поэтому ссылаются таким

образом:

grade [0], grade [1], grade [2], grade [3], grade [4]

В Си возможен и другой способ обращения к элементам массива. Имя

массива всегда трактуется как ссылка или адрес. Ссылка указывает на первый

элемент массива. Если, скажем, мы сделаем копию такой ссылки, то,

увеличивая или уменьшая значение ссылки, мы сможем ссылаться на

отдельные элементы массива. Рассмотрим пример 17.

Пример 17.

49

Page 50: МЕТОДЫ ПРОГРАММИРОВАНИЯ

int grades [5], *gptr;

gptr=grades; /* gptr указывает на grades [0] */

gptr++; /* gptr указывает на grades [1] */

gptr++; /* gptr указывает на grades [2] */

Самый обычный способ ссылаться на некоторый элемент внутри массива -

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

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

как правило, в реализациях Си более экономичным.

Запишем теперь с помощью массивов пример 17 таким образом:

int grades [5],*gptr, s:

/* инициация элементов массива */

gptr=grades;

for (s=0; s<5; s++) *gptr++=0;

/* есть функция getmark, дающая */

/* очередную оценку, если их больше */

/* нет, то она дает - 1 */

while((mark=getmark() ) != -1)

s=mark/20;

if ( (s>0) && (s<5) ) grades [s] ++;

В этом примере интересны некоторые моменты. Во-первых, обратите

внимание, что константа 5, число элементов в массиве, в тексте программы

встречается три раза. Следовало бы определить с помощью #define

символическое имя для этого значения, что позволит легко изменять размер

массива. Во-вторых, посмотрите, как с помощью ссылки gptr «обнуляются»

элементы массива. И заметим, наконец, что операцию увеличения можно

применять к элементу массива точно так же, как и к обычной переменной.

50

Page 51: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Пример 18. В массиве из 10 целых чисел вычислить среднее

арифметическое и поставить его на место десятого элемента.

#include <stdio.h>

#include <conio.h>

void main()

{

int a[10]; //задание целого массивa из 10 элементов

int i; //счетчик циклов

float SA=0;

printf(“\nВвод элементов массива”\n);

for(i=0;i<=9;i++)

scanf(“%i”, &a[i]);

for(i=0;i<=9;i++)

SA+=a[i]/10;

a[9]=SA;

printf(“Итоговый массив \n”);

for(i=0;i<=9;i++)

printf(“%i”, a[i]);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

Пример 19. В массиве из 10 целых чисел определить минимальный и

максимальный элементы и поменять их местами.

#include <stdio.h>

#include <conio.h>

void main()

51

Page 52: МЕТОДЫ ПРОГРАММИРОВАНИЯ

{

int a[10]; //задание целого массивa из 10 элементов

int i; //счетчик циклов

int max, min, k,p;

printf(“\nВвод элементов массива”\n);

for(i=0;i<=9;i++)

scanf(“%i”, &a[i]);

max=a[1];

for(i=0;i<=9;i++)

if (max<a[i])

{

max=a[i];

k=i;

}

min=a[1];

for(i=0;i<=9;i++)

if (min>a[i])

{

min=a[i];

p=i;

}

a[k]=min;

a[p]=max;

printf(“Итоговый массив \n”);

for(i=0;i<=9;i++)

printf(“%i”, a[i]);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

52

Page 53: МЕТОДЫ ПРОГРАММИРОВАНИЯ

1.6.12. СОРТИРОВКА МАССИВА

Суть метода заключается в рассмотрении попарно соседних элементов

масс ива, если элемент массива с большим индексом меньше по значению, то

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

Вертикальное расположение сортируемого массива наглядно иллюстрирует

«всплывание легких элементов вверх» по мере сортировки массива.

Например, если необходимо отсортировать массив из 8 целых чисел по

возрастанию, то модель метода можно представить в виде следующей

таблицы 1.9

Элементы всплывают вверх к поверхности и соответствии с их весами

пока не встретят элемент с более малым весом. С каждым проходом наиболее

легки элемент, из оставшихся, поднимается на свое место, выделенное

жирным в таблице 1.9 . Таким образом нет необходимости проверять

элементы стоящие выше выделенных, т.к. они уже отсортированы ранее.

Если состояние массива больше не изменяется на данном проходе, то

причина в начальной упорядоченности исходного массива.

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

последнего элемента, возможны различные версии программы.

Таблица 1.9.Сортировка массива

Индекс элемента массива

(K)

Номер прохода сортировки (I)

1 2 3 4 5 6 7 81 94 06 06 06 06 06 06 062 55 94 06 06 06 06 06 063 06 55 94 18 18 18 18 184 42 06 55 94 40 40 40 405 40 42 18 55 94 42 42 42

53

Page 54: МЕТОДЫ ПРОГРАММИРОВАНИЯ

6 18 40 42 40 55 94 55 557 06 18 40 42 42 55 94 678 67 67 67 67 67 67 67 94

Пример 20. Написать программу, которая методом «пузырька» сортирует по

возрастанию введенный с клавиатуры одномерный массив, состоящий из

восьми целых элементов.

// Сортировка массива методом «пузырька» версия 1

#include <stdio.h>

#include <conio.h>

void main()

{

int a[8]; //задание целого массивa из 8 элементов

int i; //счетчик циклов

int k; //текущий индекс элемента массива

int vrp; //временная переменная, для замены элементов друг на друга

printf(“\nСортировка массива методом «пузырька»”\n);

printf(“\nВвод элементов массива”\n);

for(k=0;k<=7;k++)

scanf(“%i”, &a[k]);

for(i=0;i<7;i++)

{

for(k=0;k<7;k++)

{

if (a[k]>a[k+1])

{

//обменяем k-й и k+1-й элементы через временную

//переменную vrp

vrp=a[k];

a[k]=a[k+1];

54

Page 55: МЕТОДЫ ПРОГРАММИРОВАНИЯ

a[k+1]=vrp;

}

}

//Отладочная печать – состояние массива после очередного

//цикла сортировки

for(k=0;k<=7;k++)

printf(“%i”, a[k]);

printf(“\n”);

}

printf(“Массив отсортирован\n”);

for(k=0;k<=7;k++)

printf(“%i”, a[k]);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

// Сортировка массива методом «пузырька» версия 2

#include <stdio.h>

#include <conio.h>

void main()

{

int a[8]; //задание целого массивa из 8 элементов

int i; //счетчик циклов

int k; //текущий индекс элемента массива

int vrp; //временная переменная, для замены элементов друг на друга

printf(“\nСортировка массива методом «пузырька»”\n);

printf(“\nВвод элементов массива”\n);

for(k=0;k<=7;k++)

scanf(“%i”, &a[k]);

55

Page 56: МЕТОДЫ ПРОГРАММИРОВАНИЯ

for(i=1;i<=7;i++)

{

for(k<=7;k=i;k--)

{

if (a[k-1]>a[k])

{

//обменяем k-й и k-1-й элементы через временную

//переменную vrp

vrp=a[k];

a[k]=a[k-1];

a[k-1]=vrp;

}

}

//Отладочная печать – состояние массива после очередного

//цикла сортировки

for(k=0;k<7;k++)

printf(“%i”, a[k]);

printf(“\n”);

}

printf(“Массив отсортирован\n”);

for(k=0;k<7;k++)

printf(“%i”, a[k]);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

1.6.13. СТРОКИ

56

Page 57: МЕТОДЫ ПРОГРАММИРОВАНИЯ

В предыдущем разделе мы пользовались массивом символов, причем из-

за природы выбранного примера всегда перебирали все элементы нашего

массива. В случае же строк, хранящихся как массивы символов, было бы

неэффективно предполагать, что строки занимают все элементы массивов, где

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

хранится ее размер, либо конец строки обозначается некоторым особым

символом. В Си принято соглашение, что в конце любой строки находится

символ NULL—'\0' или нуль-символ.

Пример 21.

define WIDTH 80

char mess [WIDTH];

mess [0] = 'I';

mess [1] = 'n';

mess [2] = 'g';

mess [3] = 'a';

mess [4] = '\0/;

После выполнения довольно очевидных операторов из примера 21 в mess

хранятся шесть символов. Так как последний символ — NULL, мы говорим,

что массив mess хранит некоторую строку.

В приведенных примерах, к сожалению, приходится иметь дело с каждым

отдельным символом. Хотя иногда это и необходимо, хотелось бы

обрабатывать строки как нечто целое. Мы уже привыкли записывать строки

как последовательности символов в двойных кавычках, например, так:

" C-ing is believing "

Поэтому вполне естественно предположить, что мы можем присваивать

строки целиком некоторому идентификатору, а не делать это символ за

символом. Такое присваивание делается следующим образом:

char *sptr;

sptr=" C-ing is believing ";

57

Page 58: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Из описания sptr следует, что это ссылка на символ. После присваивания

ссылка, в данном случае sptr, будет указывать на первый символ нашей

строки. Важно обратить внимание, что присваивание не копирует саму строку

символов. Описание для sptr не предполагает выделения какой-либо памяти

для размещения символов. Сама строка хранится где-то, мы даже не знаем,

где, известно только, что sptr — ссылка на ее первый символ. Обычно этого

бывает достаточно. Если же по некоторым причинам необходимо

скопировать строку в локальную память, то это нужно делать с помощью

какой-либо функции, вроде strcpy, копирующей любую строку из одного

места памяти в другое. В примере 21, когда мы засылали в mess символ за

символом, мы сами отвечали за то, что последним символом будет записан

символ NULL. Если же, как это проделывалось выше, строка присваивается

ссылке, то NULL в конец последовательности символов добавляется

автоматически. Ссылки на строки в Си считаются наиболее общим и удобным

способом работы со строками. В любой реализации языка предусматриваются

какие-то функции, облегчающие работу со строками: сравнение строк,

нахождение их длины, поиск символа в строке и т. д. Все они требуют от

пользователя передачи ссылки как параметра.

Пример 22. Напишите программу, которая выводит код введенного

пользователем символа, и завершает работу в результате ввода точки.

#include <stdio.h>

#include <conio.h>

void main()

{

unsigned char ch; // если объявить как char, то буквы русского

//алфавита будут отрицательными числами

printf(“\nВведите символы с точкой в конце \n”);

do {

ch=getch();

58

Page 59: МЕТОДЫ ПРОГРАММИРОВАНИЯ

printf(“символ: %с код: %i\n”, ch,ch);

}while (ch !=’.’);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

Пример 23. Написать программу, которая здоровается с пользователем,

запросив его имя.

#include <stdio.h>

#include <conio.h>

void main()

{

char name[40]; // имя и отчество пользователя

char ch;

int i;

printf(“\nВведите свое имя и отчество и нажмите <Enter>”);

i=0;

while ((ch=getch()) !=13 && i<40) //пока не нажата клавиша <Enter>

{putch(ch);

name[i++]=ch;

}

name[i]=’\0’;

printf(“\nЗдравствуйте, %s!\n”, name);

printf(“\nДля завершения нажмите <Enter>”);

getch();

}

59

Page 60: МЕТОДЫ ПРОГРАММИРОВАНИЯ

2. ТЕМЫ И ЗАДАНИЯ ПО ВЫПОЛЕНЕНИЮ ЛАБОРАТОРНЫХ

РАБОТ

ЛАБОРАТОРНАЯ РАБОТА № 1

Тема: « Линейный вычислительный процесс»

Варианты

1. По введенным с клавиатуры значениям сторон прямоугольника a и b

вычислить значение площади: S=a*b.

2. Вычислить площадь треугольника S=a*h/2, где а – длина основания, h –

высота треугольника, введенные с клавиатуры.

3. Вычислите значение функции y=-5,4x3-7.8x+12.

4. Вычислите площадь трапеции по формуле S=(a+b)/2*h, где a и b – длины

оснований, h – высота, введенные с клавиатуры.

5. Вычислите площадь круга, введя радиус с клавиатуры, по формуле S=π*r2.

6. Вычислите площадь поверхности цилиндра по формуле S=2*π*r*(h+r),

введя значение радиуса и высоты с клавиатуры.

7. Вычислите объем цилиндра по формуле v= π*r2*h, введя значение радиуса

и высоты с клавиатуры.

8. Вычислите объем параллелепипеда, введя значения сторон с клавиатуры.

9. Вычислите значение функции y=-5*x2+5.

10. Объявите необходимые переменные и вычислите объем шара по формуле

v=3/4*π*r3.

11. Объявите необходимые переменные и вычислите площадь поверхности

шара по формуле s=4*π*r2.

12. Вычислите объем полого цилиндра по формуле v=π*h*(r12-r2

2), где r1 –

радиус цилиндра, r2 – радиус отверстия, h – высота цилиндра.

13. Вычислите объем конуса по формуле s=1/3*π*r2*h.

14. Вычислите значение функции y=5,7*x3+5*x -9.

60

Page 61: МЕТОДЫ ПРОГРАММИРОВАНИЯ

15. Вычислите объем параллелепипеда со сторонами a и b, и высотой h из

которого вырезан куб со стороной с.

16. Вычислить объем цилиндра с радиусом r и высотой h, из которого

вырезан конус такого же радиуса и высоты.

17. Вычислите значение силы тока, по введенным с клавиатуры значениям

напряжения и сопротивления.

18. . Вычислите значение сопротивления, по введенным с клавиатуры

значениям напряжения и силы тока.

19. Вычислите значение функции y=7,2*x3+5*x2 –9*x.

20. Вычислите значение сопротивления электрической цепи, состоящей из

трех последовательно соединенных резисторов (r1, r2, r3).

21. Вычислите значение сопротивления электрической цепи, состоящей из

двух параллельно соединенных резисторов r=r1*r2/(r1+r2).

22. Запрограммируйте формулу пересчета сопротивления электрической

цепи из омов в кило омы.

23. Вычислите площадь параллелограмма, задав необходимые переменные.

24. Вычислите площадь поверхности параллелепипеда, введя значения

сторон с клавиатуры.

25. Вычислите значение функции y=-x3+5,3*x2 –9*x.

26. Вычислите объем куба, объявив необходимые переменные.

27. Вычислите площадь поверхности куба, объявив необходимые

переменные.

28. Запрограммируйте формулу пересчета веса из фунтов в килограммы

(один фунт - -405,9 кг).

29. Запрограммируйте формулу пересчета расстояния из километров в

версты ( одна верста – это 1066,8 м)

30. Вычислите значение функции y=-5,3*x2 –9,7*x +3,1.

61

Page 62: МЕТОДЫ ПРОГРАММИРОВАНИЯ

ЛАБОРАТОРНАЯ РАБОТА № 2

Тема: «Разветляющийся вычислительный процесс»

Цель работы: реализовать программу в двух вариантах, с использованием

операторов альтернативы и выбора.

Варианты

1. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

2. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

3. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

4. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

5. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

6. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

62

Page 63: МЕТОДЫ ПРОГРАММИРОВАНИЯ

7. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

8. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

9. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

10. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

11. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

12. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

63

Page 64: МЕТОДЫ ПРОГРАММИРОВАНИЯ

13. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

14. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

15. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

16. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

17. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

18. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

19. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

20. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

64

Page 65: МЕТОДЫ ПРОГРАММИРОВАНИЯ

21. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

22. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

23. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

24. Для заданных с клавиатуры значений переменных a,k и b вычислить

25. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

26. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

27. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

65

Page 66: МЕТОДЫ ПРОГРАММИРОВАНИЯ

28. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

29. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

30. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:

ЛАБОРАТОРНАЯ РАБОТА № 3

Тема: « Язык Си: арифметический цикл».

Варианты

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

дающих при делении на 8 в остатке 5.

2. Напишите программу приближенного вычисления определенного

интеграла методом трапеций f(x)=-4,25x3+2,73x2-1,66.

3. Написать программу, вычисляющую произведение элементов

одномерного массива 100, находящихся после элемента равного нулю.

4. Написать программу, которая преобразует десятичное число,

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

5. По введенным с клавиатуры значениям x,m вычислить s:

66

Page 67: МЕТОДЫ ПРОГРАММИРОВАНИЯ

s= .

6. Написать программу, вычисляющую произведение элементов

одномерного массива размерностью 100, находящихся после первого

нулевого элемента, кратных 5.

7. Написать программу, которая выводит на экран таблицу умножения на

7.Для организации вывода таблицы использовать ASCII.

8. Найти произведение квадратных корней всех целых чисел кратных 4 из

отрезка [a,b].

9. Написать программу, вычисляющую произведение элементов

одномерного массива 100, находящихся между максимальным и

минимальным элементами массива.

10. Напишите программу приближенного вычисления определенного

интеграла методом левых прямоугольников f(x)=9,145x3-8,351x+0,925.

11. По введенным с клавиатуры значениям x,m,n,a,b вычислить s:

s=-a+ .

12. Написать программу, вычисляющую сумму элементов одномерного

массива 100, расположенных после первого отрицательного элемента

массива.

13. Разработать программу, вычисляющую квадраты первых 10 целых

положительных нечетных чисел. Результат вывести в виде таблицы,

использовать ASCII.

14. Найти произведение кубов всех чисел из отрезка [a,b] кратных 3.

15. Напишите программу, генерирующую последовательность из 10

случайных чисел от 1 до 10, и вычисляет их среднее арифметическое.

16. Написать программу, вычисляющую произведение элементов

одномерного массива 100, находящихся между первым и последним

отрицательными элементами массива.

67

Page 68: МЕТОДЫ ПРОГРАММИРОВАНИЯ

17. Напишите программу приближенного вычисления определенного

интеграла методом правых прямоугольников f(x)=-1,576x3-0,394x2+3,574.

18. По введенным с клавиатуры значениям x,m,n,a,b вычислить s:

s=b+ .

19. Написать программу, вычисляющую произведение нечетных элементов

одномерного массива 100, находящихся после минимального значения

массива.

20. Напишите программу приближенного вычисления определенного

интеграла методом средних прямоугольников f(x)=9,541x3-0,958x-5,377.

21. Написать программу, которая вычисляет среднее арифметическое

последовательности вещественных чисел, количество чисел в

последовательности введите с клавиатуры.

22. Написать программу, вычисляющую сумму элементов одномерного

массива 100, находящихся между первым и вторым нулевыми элементами

массива.

23. Вычислить среднее арифметическое всех целых чисел кратных5 из

отрезка [a,b].

24. Вычислить среднее арифметическое дробных чисел

последовательности вводимой с клавиатуры. Количество чисел в

последовательности введите с клавиатуры.

25. По введенным с клавиатуры значениям x,m,а вычислить s:

s=m+

26. Написать программу, вычисляющую факториал введенного с

клавиатуры числа.

27. Написать программу, вычисляющую сумму первых членов ряда:1,3,5,7,

… Количество членов ряда ввести с клавиатуры.

68

Page 69: МЕТОДЫ ПРОГРАММИРОВАНИЯ

28. В одномерном массиве 100 вычислить сумму элементов стоящих

между первым и последним элементами равными нулю.

29. Написать программу, вычисляющую произведение четных элементов

одномерного массива 100, находящихся после максимального элемента

массива.

30. По введенным с клавиатуры значениям x,m,а вычислить s:

s=a2- .

ЛАБОРАТОРНАЯ РАБОТА № 4

Тема: «Язык Си: массивы».

В данной лабораторной работе необходимо составить три программы,

которые должны реализовывать задание с помощью одного из трех циклов

языка Си.

Варианты

1. Задать: матрица М размерностью 1010, вектор В размерностью 10.

Умножить поэлементно главную диагональ матрицы на вектор. Подсчитать

количество отрицательных элементов в полученной матрице.

2. Задать: матрица А размерностью 88, вектор В размерностью 8.

Умножить поэлементно диагональ матрицы на вектор. Подсчитать

количество отрицательных элементов в полученной диагонали.

3. Задать: матрица А размерностью 1515, вектор В размерностью 15.

Умножить поэлементно главную диагональ матрицы на вектор. Подсчитать

сумму элементов в полученной диагонали.

4. Задать: матрица А размерностью 1515, вектор В размерностью 15.

Умножить главную диагональ матрицы на вектор. Подсчитать сумму

полученной матрицы.

69

Page 70: МЕТОДЫ ПРОГРАММИРОВАНИЯ

5. Задать: матрица А размерностью 1010, вектор В размерностью 10.

Умножить поэлементно каждый столбец матрицы на вектор. Подсчитать

количество положительных элементов в полученной матрице.

6. Задать: матрица М размерностью 66, вектор В размерностью 6.

Умножить поэлементно каждую строку матрицы на вектор . Подсчитать

сумму положительных элементов в полученной матрице.

7. Задать: матрица М размерностью 68, вектор В размерностью 8.

Сложить поэлементно строки матрицы с вектором. Найти количество

положительных элементов в полученной матрице.

8. Задать: матрица М размерностью 86, вектор В размерностью 8.

Сложить поэлементно столбцы матрицы с вектором. Найти сумму

положительных элементов в полученной матрице.

9. Задать: матрица М размерностью 1015, вектор В размерностью 15.

Сложить поэлементно строки матрицы с вектором. Найти количество

положительных элементов в полученной матрице.

10. Задать: матрица М размерностью 1015, вектор В размерностью 15.

Найти поэлементную разность строк матрицы и вектора. Найти сумму

отрицательных элементов в полученной матрице.

11. Задать: матрица М размерностью 66, вектор В размерностью 6 .

Сложить поэлементно 4-ую строку матрицы с 5-ым столбцом, результат

сложения занести в вектор В. Найти количество положительных элементов в

векторе В.

12. Задать: матрица М размерностью 99, вектор В размерностью 9 .

Сложить поэлементно 5-ую строку матрицы с 8-ым столбцом, результат

сложения занести в вектор В. Найти сумму положительных элементов в

векторе В.

13. Задать: матрица М размерностью 1010, вектор В размерностью 10 .

Перемножить поэлементно 7-ую строку матрицы с 5-ым столбцом, результат

70

Page 71: МЕТОДЫ ПРОГРАММИРОВАНИЯ

произведения занести в вектор В. Найти количество отрицательных

элементов в векторе В.

14. Задать: матрица М размерностью 66. Суммировать поэлементно

строки матрицы в первую строку. Найти количество положительных

элементов в первой строке матрицы.

15. Задать: матрица М размерностью 810. Суммировать поэлементно

строки матрицы в первую строку. Найти количество отрицательных

элементов в первой строке матрицы.

16. Задать: матрица М размерностью 810. Найти произведение

положительных элементов матрицы.

17. Задать: матрица М 810. Найти произведение отрицательных

элементов матрицы.

18. Задать: матрица М 1510. Найти сумму положительных элементов

матрицы.

19. Задать: матрица М 1510. Найти сумму отрицательных элементов

матрицы.

20. Задать: матрица М 1515. Найти сумму положительных элементов

главной диагонали матрицы.

21. Задать: матрица М 1212. Найти произведение отрицательных

элементов главной диагонали матрицы.

22. Задать: матрица М 1010. Если в процессе поэлементного

суммирования значений 5-ог и 8-ого столбца встретится нулевая сумма

выдавать на экран сообщение.

23. Задать: два вектора А и В размерностью 10. Составить новый вектор С

из отрицательных элементов поэлементного произведения.

24. Задать: две матрицы М и К размерностью 1010. Заменить значения

положительных элементов матрицы М на соответствующие элементы

матрицы К.

71

Page 72: МЕТОДЫ ПРОГРАММИРОВАНИЯ

25. Задать: две матрицы М и К размерностью 88. Суммировать

поэлементно матрицы. Найти число отрицательных и нулевых элементов.

26. Задать: две матрицы М и К размерностью 1010. Найти поэлементную

разность матриц. Найти сумму положительных элементов результирующей

матрицы.

27. Задать: две матрицы М и К размерностью 1212. Найти сумму

матрицы М и сумму матрицы К. Если суммы совпадают знаком (их

произведение больше нуля) то найти произведение сумм, а иначе их общую

сумму.

28. Задать: две матрицы М и К размерностью 1010. Найти сумму

отрицательных элементов матрицы М и положительных элементов матрицы

К.

29. Задать: две матрицы М и К размерностью 1010. Найти сумму

положительных элементов матрицы М и отрицательных элементов матрицы

К.

30. Задать: матрица М 1010. Составить вектор из отрицательных

элементов матрицы.

ЛАБОРАТОРНАЯ РАБОТА № 5

Тема «Язык Си: манипуляции символьными данными».

Варианты

1. Написать программу, которая выводит на экран кодировку символов

введенной строки и подсчитывает их сумму.

2. Написать программу, которая преобразует строчные буквы в

прописные в введенной строке.

3. Написать программу, которая преобразует прописные буквы в

строчные в введенной строке.

4. Написать программу, которая в введенной с клавиатуры строке

преобразует строчные буквы русского алфавита в прописные.

72

Page 73: МЕТОДЫ ПРОГРАММИРОВАНИЯ

5. Написать программу, которая удаляет начальные пробелы из

введенной строки.

6. Написать программу, которая проверяет, является ли введенная строка

целым числом.

7. Написать программу, которая проверяет, является ли введенная

строка двоичным числом.

8. Написать программу, которая проверяет, является ли введенная

строка шестнадцатеричным числом.

9. Написать программу, которая проверяет, является ли введенная с

клавиатуры строка дробным числом.

10. Написать программу, которая преобразует введенное с клавиатуры

двоичное число в десятичное.

11. Написать программу, которая преобразует введенное с клавиатуры

шестнадцатеричное число в десятичное.

12. Напишите программу, которая вычисляет длину введенной с

клавиатуры строки.

13. Написать программу, которая запрашивает у пользователя имя и

отчество, затем здоровается с ним.

14. Напишите программу, которая выводит на экран введенную строку

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

15. Напишите программу, которая циклически выводит код введенного

пользователем символа. Программа должна завершать работу в результате

ввода, например, точки.

16. Написать программу, которая выведет на экран заданный

пользователем текст в обратном порядке.

17. Написать программу, которая в введенной с клавиатуры строке

подсчитает количество гласных букв.

18. Написать программу, которая преобразует введенное пользователем

дробное число в формате плавающей запятой в число в двоичной системе

73

Page 74: МЕТОДЫ ПРОГРАММИРОВАНИЯ

счисления (0.1236+E02= 0.1236*102= 12.36).

19. Написать программу, которая подсчитает количество символов во

введенном пользователем предложении и, если оно нечетное, то удалить средний

символ из текста.

20. Написать программу, которая подсчитает количество символов во

введенном пользователем предложении и, если оно четное, то добавить

восклицательный знак после «половинного символа» и вывести текст на экран.

21. Написать программу, которая ищет номер символа строки первого

вхождения подстроки в строке.

22. Написать программу, которая ищет количество вхождений подстроки

в строке.

23. Написать программу, которая ищет количество вхождений символов

одной строки во второй строке и выдает статистику по каждому символу.

24. Написать программу, которая подсчитывает количество строк массива

размерностью 10 строк, которые удовлетворяют равенству на введенный

шаблонный текст.

25. Написать программу, которая в введенной с клавиатуры строке

подсчитает количество гласных букв.

26. Написать программу, которая в введенной с клавиатуры строке

подсчитает количество букв A и Б. Если букв А окажется в тексте больше, то

удалить их.

27. . Написать программу, которая переведет введенное с клавиатуры

число в восьмеричной системе счисления в десятичную, и проверить на

четность.

28. Написать программу, которая по введенной с клавиатуры строке

сформирует первую строку, состоящую из гласных букв исходной, вторую

строку, состоящую из всех остальных.

29. Написать программу, которая в введенной с клавиатуры строке,

состоящей из букв латинского и русского алфавитов, подсчитает количество

74

Page 75: МЕТОДЫ ПРОГРАММИРОВАНИЯ

латинских букв.

30. Написать программу, которая в введенной с клавиатуры строке

отсортирует ее по возрастанию

ЛАБОРАТОРНАЯ РАБОТА № 6

Тема «Язык Си: Файлы».

Варианты

1. Зашифровать текстовый файл, выполнив операцию инверсии над

четными символами текста. Дешифровать его и просмотреть результат

шифровки и дешифровки в редакторе текста Блокнот.

2. Напишите программу, которая вычисляет среднее арифметическое

чисел, находящихся в файле на диске А.

3. Зашифровать текстовый файл, прибавив число 6 к нечетным символам

текста. Дешифровать его и просмотреть результат шифровки и дешифровки в

редакторе текста Блокнот.

4. Зашифровать текстовый файл, прибавив букву В к каждой букве

исходного текста. Дешифровать его и просмотреть результат шифровки и

дешифровки в редакторе текста Блокнот.

5. Напишите программу, которая добавляет в находящийся на диске А

файл ФИО и телефон. Если файла на диске нет, необходимо его создать.

6. Зашифровать текстовый файл, прибавляя цифры 1,2,3 к символам

текста последовательно. Дешифровать его и просмотреть результат

шифровки и дешифровки в редакторе текста Блокнот.

7. Зашифровать текстовый файл, прибавив цифры 2,5 к символам текста

последовательно. Дешифровать его и просмотреть результат шифровки и

дешифровки в редакторе текста Блокнот.

8. Напишите программу, которая позволяет найти в находящемся на

диске А файле телефон по введенному пользователем ФИО. Если файла на

75

Page 76: МЕТОДЫ ПРОГРАММИРОВАНИЯ

диске нет, необходимо его создать. Если в файле несколько человек с

одинаковыми данными – вывести на экран все телефоны.

9. Зашифровать текстовый файл, прибавляя к каждой его букве букву из

другого файла, вводимого с клавиатуры. Если второй файл короче, то

кодирование продолжить вернувшись в начало второго файла Дешифровать

его и просмотреть результат шифровки и дешифровки в редакторе текста

Блокнот.

10. Зашифровать текстовый файл, вводимый с клавиатуры, прибавляя к

каждой его букве букву из другого файла, находящегося на диске А. Если

второй файл короче, то кодирование продолжить, вернувшись в начало

второго файла. Дешифровать его и просмотреть результат шифровки и

дешифровки в редакторе текста Блокнот.

11. Зашифровать текстовый файл, вводимый с клавиатуры, прибавляя к

каждой его букве элемент массива [3], находящейся в файле на диске А.

Дешифровать его и просмотреть результат шифровки и дешифровки в

редакторе текста Блокнот.

12. Напишите программу, которая позволяет за один сеанс добавить

сведения о нескольких людях: ФИО, номер телефона; в файл, хранящийся на

диске А.

13. Зашифровать текстовый файл, находящийся на диске А, прибавляя к

каждой его букве элемент массива [4], введенного с клавиатуры.

Дешифровать его и просмотреть результат шифровки и дешифровки в

редакторе текста Блокнот.

14. Зашифровать текстовый файл, находящийся на диске А, прибавляя

букву О к символам текста, кратным по номеру 3, к остальным А.

Дешифровать его и просмотреть результат шифровки и дешифровки в

редакторе текста Блокнот.

15. Зашифровать текстовый файл, находящейся в файле на диске А,

прибавляя к четным символам текста букву А, к символам кратным 3 – О, к

76

Page 77: МЕТОДЫ ПРОГРАММИРОВАНИЯ

кратным 2 и 3 одновременно Е, к остальным - М . Дешифровать его и

просмотреть результат шифровки и дешифровки в редакторе текста Блокнот.

16. Зашифровать текстовый файл, прибавляя элементы массива [2] к

символам текста последовательно. Дешифровать его и просмотреть результат

шифровки и дешифровки в редакторе текста Блокнот.

17. Зашифровать текстовый файл, находящийся на диске А, прибавляя

букву А к нечетным символам текста, букву Б к четным. Дешифровать его и

просмотреть результат шифровки и дешифровки в редакторе текста Блокнот.

18. Зашифровать текстовый файл, прибавляя цифру 3 к четным символам

текста, применить инверсию к нечетным. Дешифровать его и просмотреть

результат шифровки и дешифровки в редакторе текста Блокнот.

19. Напишите программу, которая добавляет в находящийся на диске А

файл ФИО и адрес, вводимые с клавиатуры. Если файла на диске нет,

необходимо его создать.

20. Зашифровать текстовый файл, находящийся на диске А, прибавляя три

символа, заданные с клавиатуры , последовательно к каждой букве файла.

Дешифровать его и просмотреть результат шифровки и дешифровки в

редакторе текста Блокнот.

21. Зашифровать текстовый файл, выполнив операцию инверсии над

нечетными символами текста. Дешифровать его и просмотреть результат

шифровки и дешифровки в редакторе текста Блокнот.

22. Зашифровать текстовый файл, прибавив число 9 к четным символам

текста. Дешифровать его и просмотреть результат шифровки и дешифровки в

редакторе текста Блокнот.

23. Зашифровать текстовый файл, находящийся на диске А, прибавляя

букву А к нечетным символам текста, вычитая 1 из четных. Дешифровать его

и просмотреть результат шифровки и дешифровки в редакторе текста

Блокнот.

77

Page 78: МЕТОДЫ ПРОГРАММИРОВАНИЯ

24. Зашифровать текстовый файл, находящийся на диске А, прибавляя 1 к

символам текста кратным 10, букву О к остальным. Дешифровать его и

просмотреть результат шифровки и дешифровки в редакторе текста Блокнот.

25. Зашифровать текстовый файл, находящийся на диске А, прибавляя к

символам текста кратным по номеру 7 букву О, к остальным 2. Дешифровать

его и просмотреть результат шифровки и дешифровки в редакторе текста

Блокнот.

26. Зашифровать текстовый файл, находящийся на диске А, прибавляя

букву О к символам текста, кратным по номеру 5, к остальным применить

операцию инверсии. Дешифровать его и просмотреть результат шифровки и

дешифровки в редакторе текста Блокнот.

27. Напишите программу, которая позволяет найти в находящемся на

диске А файле адрес, по введенному пользователем ФИО. Если файла на

диске нет, необходимо его создать. Если в файле несколько человек с

одинаковыми данными – вывести на экран все адреса.

28. Зашифровать текстовый файл, находящийся на диске А, прибавляя

прописные буквы алфавита к символам текста. Дешифровать его и

просмотреть результат шифровки и дешифровки в редакторе текста Блокнот.

29. Зашифровать текстовый файл, находящийся на диске А, прибавляя как

заглавные, так и прописные буквы алфавита к символам текста.

Дешифровать его и просмотреть результат шифровки и дешифровки в

редакторе текста Блокнот.

30. Зашифровать текстовый файл, находящийся на диске А, прибавляя

цифры к символам текста. Дешифровать его и просмотреть результат

шифровки и дешифровки в редакторе текста Блокнот.

78

Page 79: МЕТОДЫ ПРОГРАММИРОВАНИЯ

3. КОНТРОЛЬ И ПРЕДСТАВЛЕНИЯ ЛАБОРАТОРНЫХ РАБОТ

Преподаватель регулярно проверяет ход выполнения лабораторных

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

семестра и разделения на три вида проведения занятий: введение в тему

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

коллоквиумы (защита работ). Руководитель указывает сроки проведения

колоквиума во время выдачи задания на текущую лабораторную работу.

В обязанности студента входит:

Подготовительный этап. Студент должен понять поставленную задачу,

определить состав и характер исходных данных для решения задачи,

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

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

соответствующие конструкции языка Си.

Целью проверки является оценка степени теоретической и практической

подготовленности студентов, правильность понимания ими поставленной

задачи разработки СУБД, уровня изучения научно-технической литературы и

умения проводить анализ различных вариантов задания.

Этап разработки программы. На этом этапе студент должен

рассмотреть различные пути решения поставленной задачи, разработать

алгоритм решения задачи , путем установления зависимости всех искомых

результатов от исходных данных. Разработать систему тестирования.

Провести программирование и отладку алгоритмов. Отладка программы

включает в себя синтаксический контроль, направленный на устранение

формальных ошибок, допущенных при вводе текста программы; отладку

каждой процедуры и функции в отдельности, проверку правильности

выполняемых ими вычислений; отладку всей программы в целом. Особое

внимание необходимо обратить на соответствие результатов тестирования

поставленной задаче.

79

Page 80: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Целью проверки является оценка правильности выбранных

алгоритмических решений и возможностей программной реализации на ПК.

Оформительский этап. Студент обязан оформить пояснительную

записку и графический материал в соответствии с предъявленными

требованиями.

Защита лабораторной работы. На этом этапе проводится защита

лабораторной работы. Студент обязан представить руководителю

окончательно оформленную пояснительную записку к лабораторной работе и

подготовить доклад (5-7 минут). В докладе в сжатой и четкой форме следует

представить поставленную задачу, основное содержание работы,

иллюстрируя принципиальные положения материалом пояснительной

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

теме защищаемой работы. При необходимости студент должен быть готов

продемонстрировать программу, находящуюся на внешнем магнитном

носителе, на ПК.

80

Page 81: МЕТОДЫ ПРОГРАММИРОВАНИЯ

ПРИЛОЖЕНИЕ 1

Расширение функциональных возможностей языка C++.

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

Кризис программного обеспечения привел к необходимости создания нового способа создания программ, который снижал бы общие затраты на протяжении всего цикла программы, — от замысла до завершения эксплуатации. Такая технология появилась в начале 70-х годов и была названа структурным программированием. В его основе лежит сочетание теории программирования и личного опыта высококвалифицированных программистов, а также учет современных требований к программам и промышленного характера их производства.

Главное требование, которому должна удовлетворять программа, — работать в полном соответствии со спецификацией и адекватно реагировать на любые действия пользователя. Кроме этого, программа должна быть выпущена точно к заявленному сроку, и допускать оперативное внесение необходимых изменений и дополнений. Объем занимаемой памяти и эффективность алгоритмов при этом, к сожалению, отходят на второй план. Иными словами, современные критерии качества программы — это, прежде всего, надежность, а также возможность точно планировать производство программы и ее сопровождение. Для достижения этих целей программа должна иметь простую структуру, быть хорошо читаемой и легко модифицируемой. Структурное программирование — это технология создания программ, позволяющая путем соблюдения определенных правил уменьшить время разработки количество ошибок, а также облегчить возможность модификации программы. Структурный подход охватывает все стадии разработки проекта: спецификацию, проектирование, собственно программирование и тестирование.

Особенно важно придерживаться определенной дисциплины при программировании на C++. Этот язык обладает настолько большой гибкостью и широкими возможностями, что, если не поставить себя в жесткие рамки с самого начал программа быстро превратится в огромного неуправляемого монстра, не поддающегося отладке.

Структурный подход к программированию позволил успешно создавать достаточно крупные проекты, но сложность программного обеспечения продолжает возрастать, и требовались все более развитые средства ее преодоления. Идеи структурного программирования получили свое дальнейшее развитие в объектно-opиентированном программировании (ООП) — технологии, позволяющей достичь простоты структуры и управляемости очень крупных программных систем.

Не существует единственного самого лучшего способа создания программ. Для решения задач разного рода и уровня сложности требуется применять разные технологии программирования. В простейших случаях достаточно освоить азы структурного написания программ. Для создания же сложных проектов требуется не только свободно владеть языком в полном объеме, но и иметь представление о принципах проектирования и отладки программ, возможностях стандартной и других библиотек и т. д. Как правило, чем сложнее задача, тем больше времени требуется на освоение инструментов, необходимых для ее решения.

81

Page 82: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Алфавит и лексемы языка те же, что и в С. Однако список ключевых слов обширней:asm auto dool breakcase catch char classconst const_cast continue defaultdelete do double dynamic_castelse enum explicit exportextern false float forfriend goto if inlineint long mutable namespacenew operator private protectedpublic register reinterpret_cast returnshort signed sizeof staticstatic_cast struct swich templatethis throq true trytypedef typeid typename unionunsigned using virtual voidvolatile wchar_t while

Основные типы данныхТип является основной характеристикой объекта и функции. Тип определяет, что и

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

Поскольку конкретное значение может быть зафиксировано в области памяти, которая соответствует объекту определённого типа, можно также говорить о типе значения. Значения представляются выражениями. Поэтому имеет смысл также говорить и о типе выражения. Таким образом, тип оказывается важнейшей характеристикой языка.

Основные {стандартные) типы данных часто называют арифметическими, поскольку их можно использовать в арифметических операциях. Для описания основных типов определены следующие ключевые слова:

int (целый);char (символьный);wchar_t (расширенный символьный);bool (логический);float (вещественный);double (вещественный с двойной точностью).Первые четыре типа называют целочисленными (целыми), последние два — типами

с плавающей точкой. Код, который формирует компилятор для обработки целых величин, отличается от кода для величин с плавающей точкой.

Существует четыре спецификатора типа, уточняющих внутреннее представление и диапазон значений стандартных типов:

short (короткий);long (длинный); signed (знаковый);unsigned (беззнаковый).Арифметические функции. Чтобы воспользоваться встроенными арифметическими функциями необходимо

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

82

Page 83: МЕТОДЫ ПРОГРАММИРОВАНИЯ

#include <stdio.h>#include <math.h>#include < Math.hpp>#include <stdlib.h>#include <time.h>

Функция Содержаниеаbs(x) Вычисление абсолютной (модуля) величины x целочисленного

типа (integer).fabs(x) fabsl(x) Вычисление абсолютной (модуля) величины x вещественного

типа (float, double, long double). math.hlog(x) Натуральный логарифм x (double). math.h

log10(x) Вычисление десятичного логарифма x (double). math.hlog10l(x) Вычисление десятичного логарифма x (long double). math.hlogN(x) Вычисление логарифма x (double) по основанию N. math.hlog2(x) Вычисление логарифма x (double) по основанию 2. Math.hppexp(x) Вычисление экспоненты от x (double, long double). math.hsin(x), sinl(x) Синус от x (double, long double), заданного в радианах. math.htan(x), tanl(x) Тангенс от x (double, long double), заданного в радианах. math.hcos(x), cosl(x) Косинус от x (double, long double), заданного в радианах. math.hacos(x), asin(x) Вычисление арккосинуса и арксинуса соответственно от x.

math.hsqrt(x), sqrtl(x) Вычисление квадратного корня из x (double, long double). math.h

pow(x, y), powl(x, y) Возведение x в степень y (double, long double). math.hrandom (n) Генерация случайных целых чисел от0 до n. stdlib.h, time.hdiv(a,b) Целочисленное деление a(integer) на b(integer). stdlib.h,. stdio.h LnXP1 Натуральный логарифм (X + 1), используют когда значение Х

близко к 0. Math.hpp

fmod(x,y) fmodl(x,y) Остаток от целочисленного деления x(float, double, long double) на y(float, double, long double). math.h, stdio.h

83

Page 84: МЕТОДЫ ПРОГРАММИРОВАНИЯ

ПРИЛОЖЕНИЕ 2

Функции стандартной библиотеки.

Этот раздел содержит две части. В первой части функции сгруппированы по заголовочным файлам, в которых они описаны, во второй части приведен алфавитный перечень функций с описанием.Состав заголовочных файловЗаголовочный файл <ctype.h> (<cctype>) - функции классификации и преобразования символовisalnum Проверяет, является ли символ буквой или цифрой

isalpha Проверяет, является ли символ буквойiscntrl Проверяет, является ли символ управляющимisdigit Проверяет, является ли символ цифройisgraph Проверяет, является ли символ видимымislower Проверяет, является ли символ буквой нижнего регистраisprint Проверяет, является ли символ печатаемымispunct Проверяет, является ли символ символом пунктуацииisspace Проверяет, является ли символ разграничительнымisupper Проверяет, является ли символ буквой верхнего регистраiswalnum Проверяет, является ли символ буквой или цифройiswa1pha Проверяет, является ли символ буквойiswcntrl Проверяет, является ли символ управляющимiswctype Проверяет многобайтный символiswdigit Проверяет, является ли символ цифройiswgraph Проверяет, является ли символ видимымiswlower Проверяет, является ли символ буквой нижнего регистраiswprint Проверяет, является ли символ печатаемымiswpunct Проверяет, является ли символ символом пунктуацииiswspace Проверяет, является ли символ разграничительнымiswupper Проверяет, является ли символ буквой верхнего регистраiswxdigit Проверяет, является ли символ символом шестнадцатеричной

цифрыisxdigit Проверяет, является ли символ символом шестнадцатеричной

цифрыtolower Возвращает символ в нижнем регистре toupper Возвращает символ в верхнем регистреtowlower Возвращает символ в нижнем регистреtowupper Возвращает символ в верхнем регистре

Заголовочный файл <locale.h> (<с1осаlе>) — функции локализацииlocaleconv Возвращает описание установок локальной средыsetlocale Устанавливает новую локализацию

Заголовочный файл <math.h> (<cmath>) — математические функцииacos Возвращает арккосинус аргументаasin Возвращает арксинус аргументаatan Возвращает арктангенс аргумента

84

Page 85: МЕТОДЫ ПРОГРАММИРОВАНИЯ

atan2 Возвращает арктангенс отношения аргументовceil Округляет вверхcos Вычисляет косинусcosh Вычисляет гиперболический косинусexp Возвращает степень числа еtabs Возвращает модуль числаfloor Округляет внизfmod Возвращает остаток от деления х на у.frexp Выделяет из числа мантиссу и экспоненциальную часть ldexp Преобразует мантиссу и показатель степени в числоlog Вычисляет натуральный логарифмlog10 Вычисляет логарифм по основанию 10modf Разбивает число на целую и дробную частиpow Возводит число в степеньsin Вычисляет синусsinh Вычисляет гиперболический синусsqrt Вычисляет квадратный кореньtan Возвращает тангенс аргументаtanh Возвращает гиперболический тангенс аргумента

Заголовочный файл <signal.h> (<csignal>) — функции обработки сигналовraise Прерывает выполнение программыsignal Регистрирует обработчик сигналов

Заголовочный файл <stdio.h> (<cstdio>) — функции ввода/вывода в стиле Сclearerr Очищает флаги ошибок при работе с потокомfclose Закрывает поток ввода/выводаfeof Проверяет достижение конца файлаferror Возвращает код ошибки при работе с потокомfflush Записывает данные из буфераfgetc Читает из потока символfgetpos Возвращает текущую позицию в файлеfgets Читает из потока в строку п символовfgetwc Читает из потока символfgetws Читает из потока в строку п символовfopen Открывает поток ввода/выводаfprintf Записывает данные в потокfputc Записывает символ в потокfputs Записывает строку символов в потокfputwc Записывает символ в потокfputws Записывает строку символов в потокfread Читает данные из потока вводаfreopen Открывает поток ввода/выводаfscanf Вводит из файла форматированные данныеfseek Перемещает позицию в файле относительно текущейfsetpos Перемещает текущую позицию в файле относительно его началаftell Возвращает текущую позицию в файлеfwprintf Записывает данные в потокfwrite Записывает данные из заданного буфера в поток

85

Page 86: МЕТОДЫ ПРОГРАММИРОВАНИЯ

fwscanf Читает из потока данные и пишет их по заданным адресамgetc Читает символ из потокаgetchar Читает символ из стандартного вводаgets Читает символы с клавиатуры до появления символа новой строкиgetwc Читает из потока символgetwchar Возвращает очередной символ с клавиатурыperror Печатает строку вида «s: error сообщение»printf Выводит строку параметров в определенном форматеputc Записывает символ в потокputchar Выводит символ на стандартное устройство выводаputs Выводит строку на стандартное устройство выводаputwc Записывает символ в потокputwchar Выводит символ на стандартное устройство выводаremove Удаляет файлrename Переименовывает файлrewind Очищает флаги ошибок при работе с потоком и переходит к началу файлаscanf Вводит строку параметров в определенном форматеsetbuf Устанавливает буферизацию потока ввода/выводаsetvbuf Преобразует строки на основе текущей локализацииsprintf Выводит строку параметров в определенном форматеsscanf Вводит данные из строкиswprintf Выводит строку параметров в определенном форматеswscanf Вводит данные из строкиtmpfile Открывает поток двоичного ввода/вывода во временный файлtmpnam Создает уникальное имя файлаungetc Возвращает символ в потокungetwc Возвращает символ в потокvfprintf Посылает отформатированный вывод в потокvfwprlntf Посылает отформатированный вывод в потокvprintf Посылает отформатированный вывод в стандартный поток выводаvsphntf Выводит строку параметров в определенном форматеvswprintf Выводит строку параметров в определенном форматеvwprintf Посылает отформатированный вывод в стандартный поток выводаwprintf Выводит строку параметров в определенном форматеwscanf Вводит строку параметров определенном формате

Заголовочный файл <stdlib.h> (<cstdlib>) — различные функции в стиле Сabort Прерывает выполнение программы

abs Возвращает модуль числа

atexit Регистрирует функцию, вызываемую при завершении работы программыatof Преобразует строку в вещественное числоatoi Преобразует строку в целое числоatol Преобразует строку в длинное целое числоbsearch Ищет элемент в отсортированном массивеcalloc Выделяет блок памятиdiv Делит с остаткомexit Прерывает выполнение программы

86

Page 87: МЕТОДЫ ПРОГРАММИРОВАНИЯ

free Освобождает блок памятиgetenv Возвращает значение переменной окруженияlabs Возвращает модуль числаldiv Делит с остаткомmal1oc Выделяет блок памятиmblen Определяет размер многобайтных символовmbstowcs Преобразует строку многобайтных символов в массив из wchar_tmbtowc Преобразует многобайтный символ в wchar_tqsort Сортирует заданный массивrand Генерирует случайные числаrealloc Изменяет размеры ранее выделенного блока памятиsrand Устанавливает начальное псевдослучайное числоstrtod Преобразует строку в числоstrtol Преобразует строку в число с учетом системы счисленияstrtoul Преобразует строку в число с учетом системы счисленияsystem Передает строку командному процессору ОСwcstod Преобразует строку в числоwcstol Преобразует строку в число с учетом системы счисленияwcstombs Преобразует wchar_t в строку многобайтных символовwcstoul Преобразует строку в число с учетом системы счисленияwctomb Преобразует wchar_t в многобайтный символ

Заголовочный файл <string.h> (<cstring>) — функции работы со строками в стиле Сmemchr Ищет первое вхождение символа в блок памятиmemcmp Сравнивает блоки памятиmemcpy Копирует блок памятиmemmove Переносит блок памятиmemset Заполняет блок памяти символомstrcat Складывает строкиstrchr Ищет символ в строкеstrcmp Сравнивает строкиstrcoll Сравнивает строки с учетом установленной локализацииstrcpy Копирует одну строку в другуюstrcspn Ищет один из символов одной строки в другойstrerror Возвращает указатель на строку с описанием ошибкиstrlen Возвращает длину строкиstrncat Складывает одну строку с п символами другойstrncmp Сравнивает одну строку с п символами другойstrncpy Копирует первые п символов одной строки в другуюstrpbrk Ищет один из символов одной строки в другойstrrchr Ищет символ в строкеstrspn Ищет символ одной строки, отсутствующий в другойstrstr Ищет подстроку в строкеstrtok Выделяет из строки лексемыstrxfrm Преобразует строки на основе текущей локализацииwcscat Складывает строкиwcschr Ищет символ в строкеwcscmp Сравнивает строкиwcscoll Сравнивает строки с учетом установленной локализации

87

Page 88: МЕТОДЫ ПРОГРАММИРОВАНИЯ

wcscpy Копирует одну строку в другуюwcscspn Ищет один из символов одной строки в другойwcslen Возвращает длину строкиwcsncat Складывает одну строку с п символами другойwcsncmp Сравнивает одну строку с п символами другойwcsncpy Копирует первые п символов одной строки в другуюwcspbrk Ищет один из символов одной строки в другойwcsrchr Ищет символ в строкеwcsspn Ищет символ одной строки, отсутствующий в другойwcsstr Ищет подстроку в строкеwcstok Выделяет из строки лексемыwcstrxfrm Преобразует строки на основе текущей локализацииwmemcpy Копирует блок памятиwmemmove Переносит блок памятиwmemset Заполняет блок памяти символом

Заголовочный файл <time.h> (<ctime>) — функции для работы с датой и временем в стиле Сasctime Преобразует дату/время в строкуclock Возвращает время исполнения программыctime Преобразует время в строкуdifftime Возвращает разницу временgmtime Инициализирует структуру tm на основе time_tlocaltime Инициализирует структуру tm на основе time_tmktime Заполняет поля дня недели и дня годаstrftime Преобразует время в формате fmt в формат tmtime Возвращает текущие дату /время в виде time_twcsftime Преобразует время в формате fmt в формат tm

Заголовочный файл <wchar.h> (<cwchar>) — функции для работы с многобайтными символами в стиле СиbtowcПреобразует символ в Длинное целое числоfwide Определяет вид потокаwmemchr Ищет первое вхождение символа в блок памятиwmemcmp Сравнивает блоки памяти

Алфавитный перечень функцийabort Прерывает выполнение программы <std1ib.h>

void abort(void);Функция выводит сообщение «abnormal program termination» и прерывает выполнение программы. При этом буферы не выгружаются и потоки не закрываются. Предпочтительней использовать exit. Функция не возвращает управление в вызывающую программу, она возвращает код завершения программы, по умолчанию равный 3.

abs Возвращает модуль числа <std1ib.h>int abs(int num); Функция возвращает абсолютное значение числа num.

acos Возвращает арккосинус аргумента <math.h>double acos(double x); Функция возвращает значение арккосинуса аргумента х в радианах.

88

Page 89: МЕТОДЫ ПРОГРАММИРОВАНИЯ

asctime Преобразует дату/время в строку <time.h>char *asctime(const struct tm *ctm);Функция возвращает строку, представляющую символьное представление даты и времени из структуры типа tm.asin Возвращает арксинус аргумента <math.h>

double asirKdouble x); Функция возвращает значение арксинуса аргумента х в радианах.atan Возвращает арктангенс аргумента <math.h>

double atan(double x); Функция возвращает значение арктангенса аргумента х в радианах.atan2 Возвращает арктангенс отношения аргументов <math.h>

double atan2(double у, double x); Функция возвращает значение арктангенса отношения параметров у/х в радианах.atexit Регистрирует функцию, вызываемую при завершении

работы программы<stdlib.h>

void atexit(void (*func)(vo1d));Функция регистрирует функцию func, которая будет вызываться при нормальном завершении программы. Она не должна иметь ни параметров, ни возвращаемого значения. Повторные вызовы atexit формируют стек функций.atof Преобразует строку в вещественное число <stdlib.h>

double atof(const char *str);Функция преобразует строку, содержащую символьное представление целого или вещественного числа, в соответствующее вещественное число с двойной точностью. В качестве признака конца числа служит первый символ, который не может быть интерпретирован как принадлежащий числу. Если преобразование не удалось, возвращает 0.0.atoi Преобразует строку в целое число <stdlib.h>

int atoi(const char *str);Функция преобразует строку, содержащую символьное представление целого числа, в соответствующее целое число. В качестве признака конца числа служит первый символ, который не может быть интерпретирован как принадлежащий числу. Если преобразование не удалось, возвращает 0.atol Преобразует строку в длинное целое число <stdlib.h>

long atol(const char *str);Функция преобразует строку, содержащую символьное представление целого числа, в соответствующее длинное целое число. В качестве признака конца числа служит первый символ, который не может быть интерпретирован как принадлежащий числу. Если преобразование не удалось, возвращает 0L.bsearch Ищет элемент в отсортированнлм массиве <stdlib.h>

void bsearch(const void *key, const void *buf, size_t num. size_t size, int e(*compare)(const void *, const void *) );Функция производит дихотомический поиск в упорядоченном массиве buf элемента, совпадающего с тем, на который указывает key, и возвращает указатель на найденный элемент, num - количество элементов в массиве buf, size — размер элемента массива в байтах.Функция соmраге() должна выполнять сравнение двух элементов массива и возвращать одно из трех значений -1,0 или 1 в зависимости от того, меньше, равен или больше первый

89

Page 90: МЕТОДЫ ПРОГРАММИРОВАНИЯ

элемент в сравнении со вторым. Несмотря на.то, что оба параметра функции compare определены как void*, реально параметрами функции являются указатели на элементы, и она должна приводить их к соответствующему типу перед разыменованием (получением значений по адресу).Если функция bsearch нашла искомый элемент, то она возвращает указатель на него, в противном случае возвращается NULL.btowc Преобразует символ в длинное целое число <wchar.h>

wint_t btowc(int c);Функция возвращает WEOF, если с равно EOF, иначе преобразует символ с в многобайтный аналогично функции mbrtowc. Если преобразование не удалось, возвращает WEOF.callос Выделяет блок памяти <stdlib.h>void *calloc(size_t num, size_t size);Функция выделяет блок памяти (num элементов по size байт) и возвращает указатель на него. Каждый элемент полученного массива инициализируется нулевым значением (в отличие от функции mallос). Если выделить блок памяти не удалось, возвращается NULL.ceil Округляет вверх <math.h>

double ceil(double x);Функция округляет вещественное значение х до ближайшего большего целого и возвращает его как вещественное.clearerr Очищает флаги ошибок при работе с потоком <stdlib.h>

void clearerr(FILE *f):Функция очищает флаги ошибок для потока f (флаги ошибок не сбрасываются, пока не будет вызвана одна из функций clearerr, fseek, fsetpos или rewind).clock Возвращает время исполнения программы <time.h>

clock_t clock(void);Функция возвращает время исполнения программы как значение типа clock_t (это значение может быть переведено в секунды делением его на определенную в файле time.h константу CLOCK_PER_SEC).cos Вычисляет косинус <math . h>

double cos(double x); Функция возвращает значение косинуса угла, равного х радиан.cosh Вычисляет гиперболический косинус <math.h>

double cosh(double x);Функция возвращает значение гиперболического косинуса угла, равного х радиан. Если значение функции окажется вне представимого диапазона, то функция возвращает значение HUGEVAL, а глобальная переменная еггno получает значение ERANGE.ctime Преобразует время в строку <time.h>

char *ctime(time_t *t);Функция возвращает строку, представляющую символьное представление даты и времени параметра типа time_t.difftime Возвращает разницу времен <time.h>

double d1fft1me(time_t t2, t1me_t tl); Функция возвращает разницу времен (t2-tl) в секундах.div Делит с остатком <stdlib.h>

div_t div(int numerator, int denominator);

90

Page 91: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Функция делит целое numerator на целое denominator, возвращая результат в структуре, содержащей частное и остаток:struct div_t{int quot; //частноеint rem; //остатокexit Прерывает выполнение программы <stdlib.h>

void exit(int exit_code);Функция вызывает нормальное завершение программы, записывая все буферы в соответствующие файлы, закрывая потоки и вызывая функции, зарегистрированные с помощью atexit, в обратном регистрации порядке.ехр Возвращает степень числа е <math.h>

double exp(double x); Функция возвращает результат возведения числа е в указанную степень.fabs Возвращает модуль числа <math . h>

double fabs(double x); Функция возвращает абсолютное значение числа num.fclose Закрывает потокввода/вывода <stdio.h>

int fclose(FILE *f); Функция закрывает поток ввода/вывода f.feof Проверяет достижение конца файла <stdio.h>

int feof(FILE *f);Функция возвращает EOF или значение, отличное от 0, если достигнут конец файла, в противном случае возвращает 0.ferror Возвращает код ошибки при работе с потоком <stdio.h>

int ferror(FILE *f); Функция возвращает целое, означающее код ошибки; 0 — отсутствие ошибки.fflush Записывает данные из буфера <stdio.h>

int fflush(FILE *f);Функция очищает буфер вывода посредством немедленной посылки данных для записи на физическое устройство. При успешном завершении возвращает значение 0, иначе возвращается значение EOF.fgetc Читает из потока символ <stdio.h>

int fgetc(FILE *f);Функция возвращает очередной символ в форме int из потока f. Если символ не может быть прочитан, то возвращается значение EOF.fgetpos Возвращает текущую позицию в файле <stdio.h>

int fgetpos(FILE *f, fpos_t *pos);Функция возвращает текущую позицию в файле, связанном с потоком f, и копирует значение по адресу pos. Это значение позднее может использоваться функцией fsetpos. Возвращаемое значение имеет тип fpos_t.fgets Читает из потока в строку n символов <stdio.h>

char *fgets(char *s, int n, FILE *f);Функция читает не более п-1 байт из потока f в строку s, прекращая чтение при обнаружении символа новой строки или конца файла. Символ новой строки при чтении не отбрасывается, а помещается в конец строки. Прочитанная строка дополняется

91

Page 92: МЕТОДЫ ПРОГРАММИРОВАНИЯ

ограничителем строки ('\0'). При обнаружении ошибки или конца файла возвращается NULL, в противном случае — указатель на строку s.fgetwc Читает из потока символ <stdio.h>

wint_t *fgetwc(FILE *f);Функция возвращает очередной символ в форме wint_t из потока f. Если символ не может быть прочитан, то возвращается значение WEOF. Является аналогом функции fgetc для многобайтных символов.fgetws Читает из потока строку n символов <stdio.h>

wchar_t *fgetws(wchar_t *s, int n, FILE *f);Функция читает не более п-1 символов из потока f в строку s, прекращая чтение при обнаружении символа новой строки или конца файла. Символ новой строки при чтении не отбрасывается, а помещается в конец строки. Прочитанная строка дополняется ограничителем строки ('\0'). При обнаружении ошибки или конца файла возвращается NULL, в противном случае — указатель на строку s. Является аналогом функции fgets для многобайтных символов.floor Округляет вниз <math.h>

double floor(double x);Функция округляет вещественное значение х до ближайшего меньшего целого и возвращает его как вещественное.fmod Возвращает остаток от деления x на y <math.h>

double fmod(double x, double y);Функция возвращает остаток от деления х на у. Аналогична операции %, но работает с вещественными числами.fopen Открывает поток ввода/вывода <stdio.h>

FILE *fopen(const char *fname, const char *mode);Функция открывает файл с именем fname для работы в режиме, указанном строкой mode. При успешном открытии возвращается указатель на поток (таким образом, полученный поток связывается с файлом), в противном случае — NULL.fprintf Записывает данные в поток <stdio.h>

int fprintfCFILE *f, const char *fmt, ...);Функция записывает в поток f переменные, список которых обозначен многоточием (...), в формате, указанном строкой fmt. Возвращает число записанных символов.fputc Записывает символ в поток <stdio.h>

int fputc(int ch, FILE *f);Функция записывает символ ch в поток f. При ошибке возвращает значение EOF, иначе — записанный символ.fputs Записывает строку символов в поток <stdio.h>

int fputs(const char *s, FILE *f);Функция записывает строку символов s в поток f. Символ конца строки в файл не записывается. При ошибке возвращает значение EOF, иначе — неотрицательное число.fputwc Записывает символ в поток <stdio.h>

w_int fputwc(w_шnt ch, FILE *f);Функция записывает символ ch в поток f. При ошибке возвращает значение WEOF, иначе — записанный символ. Является аналогом функции fputc для многобайтных символов.fputws Записывает строку символов в поток <stdio.h>

int fputs(const wchar_t *s, FILE *f);

92

Page 93: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Функция записывает строку символов s в поток f. Символ конца строки в файл не записывается. При ошибке возвращает значение WEOF, иначе — неотрицательное число. Является аналогом функции fputs для многобайтных символов.free Освобождает блок памяти <stdio.h>

void free(void *pointer);Функция освобождает блок памяти, полученный ранее одной из функций malloc, calloc или realloc.fread Читает данные из потокаввода <stdio.h>

size_t fread(void *buffer, size_t size, size_t count, FILE *stream);Функция возвращает количество прочитанных элементов, которое может быть меньше count, если при чтении произошла ошибка или встретился конец файла.freopen Открывает поток ввода/вывода <stdio.h>

FILE *freopen(const char *fname, const char *mode, FILE *f);Функция работает аналогично fopen, но предварительно закрывает поток f, если тот был ранее открыт.fгехр Выделяет из числа мантиссу и экспоненциальную часть <stdio.h>

double frexp(double x, int *expptr);Функция выделяет мантиссу и показатель степени числа х. Возвращает значение мантиссы и копирует экспоненциальную часть по адресу expptr.fscanf Вводит из файла форматированные данные <stdio.h>

int fscanf (FILE *f, const char *fmt [,parl, par2, ...]);Функция вводит строку параметров paг 1, par2 и т. д. в формате, определенном строкой fmt, из файла f. Возвращает число переменных, которым присвоено значение.fseek Перемещает позицию в файле относительно текущей <stdio.h>

Int fseek(FILE *f, long off, int org);Функция перемещает текущую позицию в файле, связанном с потоком f, на позицию off, отсчитываемую от значения org, которое должно быть равно одной из трех констант, определенных в <stdio.h>:SEEK_CUR — от текущей позиции указателя;SEEK_END — от конца файла; SEEK_SET — от начала файла.fsetpos Перемещает текущую позицию в файле относительно его

начала<stdio.h>

int fsetpos(FILE *f, const fpos_t *pos);Функция перемещает текущую позицию в файле, связанном с потоком f, на позицию *pos, предварительно полученную с помощью функции fgetpos.ftell Возвращает текущую позицию в файле <stdio.h>

long int ftell(FILE *f); Функция возвращает текущую позицию в файле, связанном с потоком f, какдлинное целое.fwide Определяет вид потока <wchar.h>

int fwide(FILE *stream, int mode);Функция определяет в зависимости от mode вид потока — байт-ориентированный (mode < 0) или поток из многобайтных символов (mode > 0). Возвращает текущий вид потока.fwprintf Записывает данные в поток <stdio.h>

int fwprintf(FILE *f, const wchar_t *fmt, ...);

93

Page 94: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Функция записывает в поток f переменные, список которых обозначен многоточием, в формате, указанном строкой fmt. Возвращает число записанных символов. Является аналогом функции fprintf для многобайтных символов.fwrlte Записывает данные из заданного буфера в поток <stdio.h>

s1ze_t fwrite(const void *p, s1ze_t size, s1ze_t n, FILE *f);Функция записывает n элементов длиной size байт из буфера, заданного указателем р, в поток f. Возвращает число записанных элементов.fwscanf Читает из потока данные и пишет их по заданным адресам <stdio.h>

int fwscanf(FILE *f, const wchar_t *fmt, ...);Функция в соответствии с форматом, указанным строкой fmt, читает из потока f переменные, список адресов которых обозначен многоточием. Возвращает число прочитанных элементов или WEOF, в случае неудачного чтения. Является аналогом функции f scant для многобайтных символов.getc Читает символ из потока <stdio.h>

int getc (FILE *f);Функция возвращает очередной символ в форме int из потока f. Если символ не может быть прочитан, то возвращается значение EOF.getchar Читает символ из стандартного ввод <stdio.h>

int getchar(void):Функция возвращает очередной символ в форме int из стандартного ввода. Если символ не может быть прочитан, то возвращается значение EOF.getenv Возвращает значение переменной окружения <stdio.h>

int getenv(const char *var_name);Функция возвращает указатель на строку, которая содержит описание указанной переменной окружения.gets Читает символы с клавиатуры до появления символа новой

строки<stdio.h>

char *gets(char *s);Функция читает символы с клавиатуры до появления символа новой строки и помещает их в строку s (сам символ новой строки в строку не включается). Возвращает указатель на s.getwc Читает из потока символ <stdio.h>

wint_t getwc(FILE *f);Функция возвращает очередной символ в форме wint_t из потока f. Если символ не может быть прочитан, то возвращается значение WEOF. Является аналогом функции getc для многобайтных символов.getwchar Возвращает очередной символ с клавиатуры <stdio.h>

wint_t getwchar(vold);Функция возвращает очередной символ из стандартного потока ввода (обычно клавиатура). Является аналогом функции getchar для многобайтных символов.gmtime Инициализирует структуру tm на основе time_t <time.h>

const struct tm gmtime(const time_t *t);Функция возвращает указатель на временную структуру типа tm, инициализированную на основе даты/времени из t. Время устанавливается по Гринвичу.isalnum Проверяет, является ли символ буквой или цифрой <ctype . h>

int isalnum(int ch);

94

Page 95: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является буквой или цифрой, или false в противном случае.isalpha Проверяет, является ли символ буквой <ctype.h>

int isalpha(int ch);Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является буквой, или false в противном случае.iscntrl Проверяет, является ли символ управляющим <ctype.h>

int iscntrl(int ch);Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является управляющим символом (типа line feed, del, табуляции и тому подобных, большинство из которых находятся в диапазоне 0x01-0x1F (для кодировки ASCII)), или false в противном случае.isdigit Проверяет, является ли символ цифрой <ctype.h>

int isdigit(int ch);Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является цифрой, или false в противном случае.isgraph Проверяет, является ли символ видимым <ctype.h>

int isgraph(int ch);Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является видимым (то есть он не является символом пробела, табуляции и т. д.) или false в противном случае.islower Проверяет, является ли символ буквой нижнего регистра <ctype.h>

int islower(int ch);Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является буквой нижнего регистра, или false в противном случае.isprint Проверяет, является ли символ печатаемым <ctype.h>

int isprint (int ch);Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является печатаемым (isgraph + пробел), или false в противном случае.ispunct Проверяет, является ли символ символом пунктуации <ctype . h>

int ispunct(int ch); Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является символом пунктуации (то есть печатаемым, но не буквой, не цифрой, не пробелом), или false в противном случае.isspace Проверяет, является ли символ разграничительным <ctype.h>

int isspace(int ch);Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является символом пробела или табуляцией, или символом новой строки, или символом новой страницы (символом перевода формата), или false в противном случае.isupper Проверяет, является ли символ буквой верхнего регистра <ctype.h>

int isupper(int ch);Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является буквой верхнего регистра, или false в противном случае.iswalnum Проверяет, является ли символ буквой или цифрой <ctype.h>

int iswalnum(wint_t ch);

95

Page 96: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Функция возвращает значение true, если символ ch является буквой или цифрой, или false в противном случае. Является аналогом функции isalnum для многобайтных символов.iswalpha Проверяет, является ли символ буквой <ctype.h>

int iswalpha(wint_t ch);Функция возвращает значение true, если символ ch является буквой, или false в противном случае. Является аналогом функции isalpha для многобайтных символов.iswcntrl Проверяет, является ли символ управляющим <ctype.h>

int iswcntrl(wint_t ch);Функция возвращает значение true, если символ ch является управляющим символом (типа line feed, del, табуляции и тому подобных, большинство из которых находятся в диапазоне OxOl-OxlF (для кодировки ASCII)), или false в противном случае. Является аналогом функции iscntrl для многобайтных символов.iswctype Проверяет многобайтный символ <ctype.h>

int iswctype(wint_t c, wctype_t desc);Функция возвращает ненулевое значение, если символ с обладает свойством desc, или нулевое в противном случае.iswdigit Проверяет, является ли символ цифрой <ctype.h>

int iswdigit(wint_t ch);Функция возвращает значение true, если символ ch является цифрой, или false в противном случае. Является аналогом функции isdigit для многобайтных символов.iswgraph Проверяет, является ли символ видимым <ctype.h>

int iswgraph(wint_t ch);Функция возвращает значение true, если символ ch является видимым (то есть он не является символом пробела, табуляции и т. д.) или false в противном случае. Является аналогом функции isgraph для многобайтных символов.iswlower Проверяет, является ли символ буквой нижнего регистра <ctype.h>

int iswlower(wint_t ch);Функция возвращает значение true, если символ ch является буквой нижнего регистра, или false в противном случае. Является аналогом функции islower для многобайтных символов.iswprint Проверяет, является ли символ печатаемым <ctype . h>

int iswprint(wint_t ch);Функция возвращает значение true, если символ ch является печатаемым (iswgraph + пробел), или false в противном случае. Является аналогом функции isprint для многобайтных символов.ispunct Проверяет, является ли символ символом пунктуации <ctype . h>

int iswpunct(wint_t ch);Функция возвращает значение true, если символ ch является символом пунктуации (то есть печатаемым, но не буквой, не цифрой, не пробелом), или false в противном случае. Является аналогом функции ispunct для многобайтных символов.iswspace Проверяет, является ли символ разграничительным <ctype.h>

int iswspace(wint_t ch);Функция возвращает значение true, если символ ch является символом пробела или табуляцией, или символом новой строки, или символом новой страницы (символом перевода формата), или false в противном случае. Является аналогом функции isspace для многобайтных символов.

96

Page 97: МЕТОДЫ ПРОГРАММИРОВАНИЯ

iswupper Проверяет, является ли символ буквой верхнего регистра <ctype.h>

int iswupper(w1nt_t ch);Функция возвращает значение true, если символ ch является буквой верхнего регистра, или false в противном случае. Является аналогом функции isupper для многобайтных символов.iswxdigit Проверяет, является ли символ символом шестнадцатеричной

цифры<ctype . h>

int iswxdigit(wint_t ch); Функция возвращает значение true, если символ ch является символом шестнадцатеричной цифры (цифры, а также буквы от А до F в нижнем или верхнем регистрах), или false в противном случае. Является аналогом функции isxdigit для многобайтных символов.isxdigit Проверяет, является ли символ символом шестнадцатеричной

цифры<ctype.h>

int isxdigit(int ch);Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является символом шестнадцатеричной цифры (цифры, а также буквы от А до F в нижнем или верхнем регистрах), или false в противном случае.labs Возвращает модуль числа <stdlib.h>

long int labs(long Int num);Функция возвращает абсолютное значение числа num.ldexp Преобразует мантиссу и показатель степени в число <math.h>

double ldexp(double x, int exp);Функция получает мантиссу х и показатель степени exp и возвращает число, равное произведению мантиссы на 2 в степени показатель степени. Противоположна функции fгехр.ldiv Делит с остатком <stdlib.h>

ldiv_t ldiv(long numerator, long denominator);Функция делит длинное целое numerator на длинное целое denominator, возвращая результат в структуре, содержащей частное и остаток.localeconv Возвращает описание установок локальной среды <locale.h>

struct lconv *localeconv(vo1d);Функция возвращает структуру, которая содержит детальное описание текущих установок локальной среды, то есть информацию, зависящую от страны.localtime Инициализирует структуру tm на основе time_t <time.h>

struct tm localtime(time_t *t);Функция возвращает указатель на временную структуру типа tm, инициализированную на основе даты/времени из t. Время устанавливается локальное (в отличие от gmtime, где время устанавливается по Гринвичу).log Вычисляет натуральный логарифм <math.h>

double log(double x); Функция возвращает значение натурального логарифма х.Logl0 Вычисляет логарифм по основанию 10 <math.h>

double logl0(double x); Функция возвращает значение логарифма х по основанию 10.mallос Выделяет блок памяти <stdlib.h>

97

Page 98: МЕТОДЫ ПРОГРАММИРОВАНИЯ

void *malloc(size_t size);Функция выделяет блок памяти размером size байт и возвращает указатель на него. В случае неудачи возвращаемым значением будет NULL. Предпочтительней вместо mа11ос использовать операцию new.mblen Определяет размер многобайтных символов <std1ib.h>

int mb1en(const char *s, s1ze_t n); Функция возвращает размер символа *s, если s не NULL.mbstowcs Преобразует строку многобайтных символов в массив из

wchar t<stdio.h>

size_t mbstowcs(wchar_t *pwcs, const char *s, s1ze_t n);Функция преобразует строку многобайтных символов в массив из wchar_t. Если встретился недопустимый символ, функция возвращает -1. В противном случае функция возвращает количество преобразованных символов.mbtowc Преобразует многобайтный символ в wchar__t <stdlib.h>

int mbtowc(wchar_t *pwc, const char *s, s1ze_t n);Функция преобразует многобайтный символ в wchar_t. Если s указывает на не-многобайтный символ, функция возращает -1. Если s указывает на NULL, возвращаемое значение равно 0. В противном случае функция возвращает длину символа в байтах.memchr Ищет первое вхождение символа в блок памяти <string.h>

void *memchr(const void *p, int ch, s1ze_t n);Функция возвращает указатель на первое вхождение байта, представленного младшим байтом аргумента ch в блоке памяти р длиной n.memcmp Сравнивает блоки памяти <string.h>

Int memcmpCconst void *pl, const void *p2, size_t n);Функция сравнивает два блока памяти и возвращает значение: меньше нуля, равное нулю или больше нуля — аналогично кодам возврата функции strcmp.memcpy Копирует блок памяти <string.h>

void *memcpy(void *dest, const void *src, size_t n); Функция копирует блок памяти длиной n байт из адреса src по адресу dest.memmove Переносит блок памяти <string.h>

void *memmove( void *dest, const void *src, size_t n); Функция аналогична memcpy, но блоки dest и src могут перекрываться.memset Заполняет блок памяти символом <string.h>

void *memset(const void *p, int ch., size_t n); Функция заполняет блок памяти символом, взятым из младшего байта ch.mktime Заполняет поля дня недели и дня года <time.h>

struct tm mktime(time_t *t);Функция заполняет поля дня недели и дня года структуры tm на основе имеющейся в t информации.modf Разбивает число на целую и дробную части <math.h>

double modf(double x, double *intptr);Функция разбивает х на целую и дробную части, причем дробную часть числа возвращает, а целую часть числа помещает по адресу, определяемому указателем intptr.реггог Печатает строку вида "s:error сообщение" <stdio.h>

void perror(const char *s);

98

Page 99: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Функция печатает строку вида «s: error сообщение», в которой сообщение определяется на основе значения глобальной переменной еггnо. Если значением s является NULL, то печатается только сообщение об ошибке. Вывод производится в стандартный поток ошибок stderr, обычно назначенный на монитор.pow Возводит число в степень <math.h>

double pow(double x, double y);Функция вычисляет значение числа х в степени у.printf Выводит строку в определенном формате <stdio.h>

int printf (const char *fmt, ...);Функция выводит на стандартное устройство вывода значения переменных, перечисленных в списке, обозначенном многоточием, в формате, определенном строкой format. putc Записывает символ в поток <stdio.h>

int putc(int ch. FILE *f);Функция записывает символ ch в поток f. При ошибке возвращает значение EOF, иначе — записанный символ. Работает полностью аналогично fputc.putchar Выводит символ на стандартное устройство вывода <stdio.h>

int putchar(int ch);Функция выводит символ ch на стандартное устройство вывода. Если вывод успешен, возвращается значение ch, иначе возвращается значение EOF.puts Выводит строку на стандартное устройство вывода <stdio.h>

int puts(char *s);Функция выводит строку s на стандартное устройство вывода, добавляя в конце символ новой строки. Возвращает неотрицательное значение при успехе или EOF — при ошибке.putwc Записывает символ в поток <stdio.h>

wint_t putwc(wint_t ch, FILE *f);Функция записывает символ ch в поток f. При ошибке возвращает значение WEOF, иначе — записанный символ. Является аналогом функции putc для многобайтных символов.putwchar Выводит символ на стандартное устройство вывода <stdio.h>

wint_t putwchar(wint_t ch);Функция выводит символ ch на стандартное устройство вывода. Если вывод успешен, возвращается значение ch, иначе возвращается значение WEOF. Является аналогом функции putchar для многобайтных символов.qsort Сортирует заданный массив <stdlib.h>

void qsort(void *buf, size_t num, size_t size,int (compare)(const void *, const void *));Функция выполняет сортировку массивов любых размеров и типов. Сортируемый массив: buf — указатель на массив, num — число элементов, size — размер каждого элемента. Аргумент compare — адрес функции, которая должна сравнить два значения, переданных ей функцией qsort, и возвратить соответствующий код: меньше нуля (если первый аргумент меньше второго), нуль (если аргументы рацны) или больше нуля (если первый аргумент больше второго). Аргументы, передаваемые ей, определены как void*, то есть внутри функции они должны приводиться к нужному типу.raise Прерывает выполнение программы <signal.h>

int raise(int signal);

99

Page 100: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Функция посылает сигнал программе, идентифицируя ошибку во время ее выполнения. Эта функция устарела и оставлена только для совместимости с С, так как в C++ для таких целей используется механизм исключений. Возвращает нулевое значение в случае успеха и ненулевое — в противном случае.rand Генерирует случайные числа <stdlib.h>

int rand(void);Функция возвращает очередное псевдослучайное число в диапазоне от 0 доRAND_MAX.realloc Изменяет размеры ранее выделенного блока памяти <stdlib.h>

void *realloc(void *memblock, size_t size);Функция получает блок памяти (выделенный ранее одной из функций mа11ос, callос или reallос), при необходимости перемещает его так, чтобы он соответствовал новому размеру. При этом ранее размещенные в нем данные не теряются. Большинство правил, относящихся к mallос, действительны и для realloc.Значение, возвращаемое функцией, является указателем на новое положение блока памяти. Оно отличается от старого значения (memblock) только в том случае, если real 1 ос пришлось переместить блок памяти. Если не удалось увеличить блок памяти, то возвращаемое значение равно NULL, причем значение memblock остается доступным программе.remove Удаляет файл <stdio.h>

int remove(const char *filename);Функция удаляет существующий файл. В случае успеха возвращает нулевое значение, иначе — ненулевое.rename Переименовывает файл <stdio.h>

int rename(const char *oldname, const char *newname);Функция переименовывает существующий файл или папку. В случае успеха возвращает нулевое значение, иначе — ненулевое.rewind Очищает флаги ошибок при работе с потоком и переходит к

началу файла<stdio.h>

void rewind(FILE *f);Функция очищает флаги ошибок в потоке f и устанавливает текущую позицию на начало файла.scanf Вводит строку параметров в определенном формате <stdio.h>

int scanf (const char *fmt [,parl. par2, ...]);Функция вводит строку параметров parl, par2 и т. д. в формате, определенном строкой fmt, со стандартного устройства ввода (обычно с клавиатуры). Возвращает число переменных, которым присвоено значение.setbuf Устанавливает буферизацию потока ввода/вывода <stdio.h>

void setbuf(FILE *fб char *p);Функция устанавливает буфер ввода/вывода, заданный указателем р. Размер буфера должен быть длиной BUFSIZ. Если р равен nul1, то буферизация отменяется.setlocale Устанавливает новую локализацию <locale.h>

char *setlocale(int type, const char *1ocale); Функция устанавливает новую локализацию программы.setvbuf Преобразует строки на основе текущей локализации <stdio.h>

void setvbuf(FILE *f, char *p, int mode. size_t size);

100

Page 101: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Функция устанавливает буфер ввода/вывода, заданный указателем р. Параметр mode указывает режим, a size — размер буфера. Возвращается значение 0 при успешном завершении и ненулевое значение в случае ошибки. Параметр mode является целым, принимающим одно из значений: _IOFBF (полная буферизация), _IONBF (запрет буферизации) и _IOLBF (для вывода — построчная буферизация, то есть опустошение буфера при записи в буфер символа новой строки).signal Регистрирует обработчик сигналов <signal .h>

void (*signal(int signum, void (*func)(int)))(int);Функция регистрирует обработчик сигналов. Несмотря на то, что обработчики исключений C++ обеспечивают лучший механизм управления ошибками, функции signal и raise включены в библиотеку для совместимости с С.sin Вычисляет синус <math.h>

double sin(double х); Функция возвращает значение синуса угла, равного х радиан.sinh Вычисляет гиперболический синус <math . h>

double sinh(double x);Функция возвращает значение гиперболического синуса угла, равного х радиан. Если значение функции окажется вне представимого диапазона, то функция возвращает значение HUGEVAL, а глобальная переменная егrnо получает значение ERANGE. sprintf Выводит строку параметров в определенном формате <stdio.h>

int sprintf(char *buffer, const char *format[, argument,]);Функция выводит в строку buffer значения переменных, перечисленных в списке, обозначенном многоточием, в формате, определенном строкой format.sqrt Вычисляет квадратный корень <math . h>

double sqrt(double x); Функция возвращает квадратный корень из числа х.srand Устанавливает начальное псевдослучайное число <std1ib.h>

void srand(unsigned int seed);Функция устанавливает начальное значение последовательности псевдослучайных чисел.sscanf Вводит данные из строки <std1o.h>

int sscanf(const char *buf, const char *format [,parl, par2, j]);Функция аналогично функции scanf вводит данные, но не с клавиатуры, а из строки символов, переданной ей первым параметром. Аргумент buf — строка символов, из которой вводятся значения, format — строка формата, в соответствии с которой происходит преобразование данных, а многоточие указывает на наличие необязательных аргументов, соответствующих адресам вводимых значений.strcat Складывает строки <string.h>

char *strcat(char *sl, char *s2);Функция добавляет s2 к s1 и возвращает s1. В конец результирующей строки добавляется нуль-символ.strchr Ищет символ в строке <string.h>

char *strchr(char *s, int ch);Функция возвращает указатель на первое вхождение символа ch в строку s, если его нет, то возвращается NULL.strcmp Сравнивает строки <string.h>

int *strcmp(char *sl, char *s2);

101

Page 102: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Функция сравнивает строки и возвращает отрицательное (если s1 меньше s2), нулевое (если s1 равно s2) или положительное (если s1 больше s2) значение.strcoll Сравнивает строки с учетом установленной локализации <string.h>

char *strcoll(char *sl, char *s2);Функция сравнивает строки аналогично strcmp, но учитывает установки локализации.strcpy Копирует одну строку в другую <string.h>

char *strcpy(char *sl, char *s2); Функция копирует s2 в s1 и возвращает s1.strcspn Ищет один из символов одной строки в другой <string.h>

size_t strcspn(char *sl, char *s2); Функция возвращает значение индекса любого из символов из s2 в строке s1.strerror Возвращает указатель на строку с описанием ошибки <string.h>

char * strerror(size_t n),Функция возвращает указатель на строку с описанием ошибки номер n.strftime Преобразует время в формате fmt в формат tm <time.h>

struct tm strftime(char *s,size_t size, fmt, const struct tm *ctm);Функция возвращает отформатированную строку с датой и временем на основе формата fmt. Значение функции имеет тип time_t, соответствующий типу tm.strlen Возвращает длину строки <string.h>

size_t strlen(char *s); Функция возвращает длину строки (без учета символа завершения строки).strncat Складывает одну строку с n символами другой <string.h>

char *strncat(char *sl, char *s2, size_t n);Функция добавляет не более n символов из s2 к s1 и возвращает s1. Первый символ s2 пишется на место завершающего нуль-символа строки s1. Если длина строки s2 меньше n, переписываются все символы s2. К строке s1 добавляется нуль-символ. Если строки перекрываются, поведение не определено.strncmp Сравнивает одну строку с n символами другой <string.h>

int strncmp(char *sl, char *s2, size_t n);Функция сравнивает первую строку и первые n символов второй строки и возвращает отрицательное (если s1 меньше s2), нулевое (если s1 равно s2) или положительное (если s1 больше s2) значение.strncpy Копирует первые n символов одной строки в другую <string.h>

char *strncpy(char *sl, char *s2, s1ze_t n);Функция копирует не более n символов из s2 в s1 и возвращает s1. Если длина исходной строки превышает или равна n, нуль-символ в конец строки s1 не дoбавляется. В противном случае строка дополняется нуль-символами до n-го символа. Если строки перекрываются, поведение не определено,strpbrk Ищет один из символов одной строки в другой <string.h>

char *strpbrk(char *sl, char *s2);Функция возвращает указатель на символ, являющийся первым вхождением любого из символов из s2 в строку si, если его нет, возвращается NULL.strrchr Ищет символ в строке <string.h>

char *strrchr(char *s,int ch);

102

Page 103: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Функция возвращает указатель на первое вхождение символа ch в строку s справа, если его нет, возвращает NULL.strspn Ищет символ одной строки, отсутствующий в другой <string.h>

s1ze_t strspn(char *sl. char *s2); Функция возвращает индекс первого символа в s1, отсутствующего в s2.strstr Ищет подстроку в строке <string.h>

char *strstr(char *sl, char *s2);Функция выполняет поиск первого вхождения подстроки s2 в строку s1. В случае удачного поиска, возвращает указатель на элемент из s1, с которого начинается s2, и NULL в противном случае.strtod Преобразует строку в число <stdlib.h>

double strtod(const char *str, char **end);Функция преобразует строку символов в числовое значение и возвращает его. При переполнении возвращает +/-HUGE_VAL. При невозможности выполнить преобразование или исчезновении порядка возвращает 0. В обоих последних случаях еггnо устанавливается в ERANGE.end указывает на символ, на котором преобразование завершается.strtok Выделяет из строки лексемы <string. h>

char *strtok(char *sl, char *s2);Функция возвращает следующую лексему из s1, отделенную любым из символов из набора s2.strtol Преобразует строку в число с учетом системы cчисления <stdlib.h>

double strtol(const char *str, char **end, int radix);Функция преобразует строку символов в числовое значение с учетом указанной системы счисления radix и возвращает полученное число. Функция пропускает возможные начальные пробелы и заканчивает преобразование на первом символе, который не может появиться в образе числа. Параметр end является адресом указателя типа char*; этот указатель будет содержать адрес первого непреобразованного символа.При переполнении возвращает LONG_MAX или LONG_MIN, При невозможности выполнить преобразование возвращает 0. В обоих последних случаях errno устанавливается в ERANGE.strtoul Преобразует строку в число с учетом системы счисления <stdlib.h>

double strtoul(const char *str, char **end, int radix);Функция работает аналогично strtol, но работает с беззнаковым длинным целым. При переполнении возвращает ULONG_MAX.strxfrm Преобразует строки на основе текущей локализации <string.h>

size_t strxfrm(char *sl, char *s2, size_t n);Функция преобразует строку из s2 и помещение ее в s1 на основе текущей локализации. Преобразуется не более n символов.swprintf Выводит строку параметров в определенном формате <stdio.h>

int swprintf(wchar_t *buffer, const wchar_t *format[, argument, ...]);Функция выводит в строку buffer значения переменных, перечисленных в списке, обозначенном многоточием, в формате, определенном строкой format. Является аналогом функции sprintf для многобайтных символов.swscanf Вводит данные из строки <stdio.h>

int swscanf(const wchar_t *buf, const wchar_t *format, ...);

103

Page 104: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Функция аналогично функции scanf вводит данные, но не с клавиатуры, а из строки символов, переданной ей первым параметром. Аргумент buf — строка символов, из которой вводятся значения, format — строка формата, в соответст-вии с которой происходит преобразование данных, а многоточие указывает на наличие необязательных аргументов, соответствующих адресам вводимых значений. Является аналогом функции sscanf для многобайтных символов.system Передает строку командному процессору ОС <stdlib.h>

int system(const char *command);Функция передает строку командному процессору операционной системы. Это позволяет исполнить другую программу или утилиту. Возвращаемое значение зависит от реализации, но, как правило, значение 0 указывает на успешное завершение.tan Возвращает тангенс аргумента <math . h>

double tan(double x); Функция возвращает значение тангенса аргумента х.tanh Возвращает гиперболический тангенс аргумента <math . h>

double tanh(double x); Функция возвращает значение гиперболического тангенса аргумента х.time Возвращает текущие дату/время в виде time_t <time.h>

time_t time(time_t *t);Функция возвращает текущие дату/время в виде time_t. Если *t не равно NULL, то значение заносится и по этому адресу.tmpfi1е Открывает поток двоичного ввода/вывода во временный файл <stdio.h>

FILE *tmpfile(void):Функция открывает временный файл в режиме двоичного ввода/вывода и возвращает указатель на поток.tmpnam Создает уникальное имя файла <stdio.h>

char *tmpnam(char *s);Функция создает уникальное имя файла, которое может быть успешно использовано как имя временного файла. Различные строки генерируются ТМР_МАХ раз. ТМР_МАХ определена в <stdiо. h> и равна 65535. Параметр s - либо 0, либо указатель на массив, состоящий не менее, чем из L_tmpnam символов. L_tmpnam определено в <stdio.h>. Если s — ноль, tmpnam оставляет имя генерированного временного файла во внутреннем статическом объекте и возвращает указатель на этот объект.Если s не ноль, tmpnam помещает свой результат в указанный массив, который должен быть длиной не менее L_tmpnam символов, и возвращает s.tolower Возвращает символ в нижнем регистре <ctype.h>

int tolower(int ch);Функция получает параметр ch и возвращает его в нижнем регистре. В параметре ch используется только младший байт.toupper Возвращает символ в верхнем регистре <ctype.h>

int toupper(int ch);Функция получает параметр ch и возвращает его в верхнем регистре. В параметре с h используется только младший байт.towlwer Возвращает символ в нижнем регистре <ctype.h>

int tolower(wint_t ch);

104

Page 105: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Функция получает символ ch и возвращает его в нижнем регистре. Является аналогом функции tolower для многобайтных символов.towupper Возвращает символ в верхнем регистре <ctype.h>

int towupper(wint_t ch);Функция получает символ ch и возвращает его в верхнем регистре. Является аналогом функции toupper для многобайтных символов.ungetc Возвращает символ в поток <stdio.h>

int ungetc(int ch, FILE *f);Функция возвращает символ ch обратно во входной поток f. Возвращает EOF в случае ошибки, в противном случае возвращает ch. Гарантируется возвращение только одного символа.ungetwc Возвращает символ в поток <stdio.h>

wint_t ungetwc(wint_t ch, FILE *f);Функция возвращает символ ch обратно во входной поток f. Возвращает WEOF в случае ошибки, в противном случае возвращает ch. Гарантируется возвращение только одного символа. Является аналогом функции ungetc для многобайтных символов.vfprintf Посылает отформатированный вывод в поток <stdio.h>

int vfpnntf(FILE *stream, char *format, va_list arglist);Функция аналогична функции fprintf, но имеет доступ к указателю на список аргументов, а не к самому списку.vfwphntf Посылает отформатированный вывод в поток <stdio.h>

int vfwprintf(FILE *stream, wchar_t *format, va_list arglist);Функция аналогична функции fprintf, но имеет доступ к указателю на список аргументов, а не к самому списку, а также работает с многобайтными символами.vprintf Посылает отформатированный вывод в стандартный поток

вывода<stdio.h>

int vprintf(const char *format, va_list arglist);Функция аналогична функции printf, но имеет доступ к указателю на список аргументов, а не к самому списку.vsprintf Выводит строку параметров в определенном формате <stdio.h>

int vsprintf(char *string, const char *format, va_list arglist);Функция аналогична функции sprintf, но имеет доступ к указателю на список аргументов, а не к самому списку.vswprintf Выводит строку параметров в определенном формате <stdio.h>

int vswprintf(wchar_t *string, const wchar_t *format, va_list arglist);Функция аналогична функции sprintf, но имеет доступ к указателю на список аргументов, а не к самому списку, а также работает с многобайтными символами.vwprintf Посылает отформатированный вывод в стандартный поток

вывода<stdio.h>

int vwprintf (const wchar_t *format, va_list arglist);Функция аналогична функции printf, но имеет доступ к указателю на список аргументов, а не к самому списку, а также работает с многобайтными символами.wcscat Складывает строки <string.h>

wchar_t *wcscat(wchar_t *sl, wchar_t *s2);Функция добавляет s2 к s1 и возвращает s1. Является аналогом функции strcat для многобайтных символов.

105

Page 106: МЕТОДЫ ПРОГРАММИРОВАНИЯ

wcschr Ищет символ в строке <string.h>

Wchar_t *wcschr(wchar_t *s, int ch);Функция возвращает указатель на первое вхождение символа ch в строку s,если его нет, то возвращается NULL. Является аналогом функции strchr для многоб ных символов.wcscmp Сравнивает строки <string.h>

int *wcscmp(wchar_t *s1, wchar_t *s2);Функция сравнивает строки и возвращает отрицательное (если s1 меньше s2 нулевое (если s1 равно s2) или положительное (если s1 больше s2) значение.wcscoll Сравнивает строки с учетом установленной локализации <string.h>

wchar_t *wcsco11(wchar_t *sl, wchar_t *s2);Функция сравнивает строки аналогично strcmp, но учитывает установки локализации). Является аналогом функции strcoll для MHOI байтных символов.wcscpy Копирует одну строку в другую <string.h>

wchar_t *wcscpy(wchar_t *slб wchar_t *s2);Функция копирует s2 в s1 и возвращает s1. Является аналогом функции str для многобайтных символов.wcscspn Ищет один из символов одной строки в другой <string,h>

size_t wcscspn(wchar_t *sl, char *s2);Функция возвращает значение индекса любого из символов из s2 в строке s1, является аналогом функции strcspn для многобайтных символов.wcsftime Преобразует время в формате fmt в формат tm <time.h>

struct tm wcsftime(wchar_t *s,size_t size, fmt, const struct tm *ctm);Функция возвращает отформатированную строку с датой и временем на основе формата fmt. Значение функции имеет тип time_t, соответствующий типу tm. Является аналогом функции strftime для многобайтных символов.wcslen Возвращает длину строки <string.h>

size_t wcslen(wchar_t *s);Функция возвращает длину строки (без учета символа завершения строки). Является аналогом функции strlen для многобайтных символов.wcsncat Складывает одну строку с п символами другой <string.h>

Wchar_t *wcsncat(wchar_t *sl, wchar_t *s2, size_t n);Функция добавляет s2 к s1, но не более n символов, и возвращает s1. Является аналогом функции strncat для многобайтных символов.wcsncmp Сравнивает одну строку с п символами другой <string.h>

int wcsncmp(wchar_t *sl. wchar_t *s2, size_t n);Функция сравнивает первую строку и первые n символов второй строки, и возвращает отрицательное (если si меньше s2), нулевое (если s1 равно s2) или положительное (если s1 больше s2) значение. Является аналогом функции strncmp для многобайтных символов.wcsncpy Копирует первые n символов одной строки в другую <str1ng.h>

wchar_t *wcsncpy(wchar_t *sl, wchar_t *s2, size_t n); Функция копирует s2 в s1, но не более n символов, и возвращает s1. Является аналогом функции strncpy для многобайтных символов.wcspbrk Ищет один из символов одной строки в другой <string.h>

wchar_t *wcspbrk(wchar_t *sl, wchar_t *s2);

106

Page 107: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Функция возвращает указатель на символ, являющийся первым вхождением любого из символов из s2 в строку s1, если его нет, то возвращается NULL. Является аналогом функции strpbrk для многобайтных символов.wcsrchr Ищет символ в строке <string . h>

char *wcsrchr(wchar_t *s. wchar_t ch);Функция возвращает указатель на первое вхождение символа ch в строку s справа, если его нет, то возвращает NULL. Является аналогом функции strrchr для многобайтных символов.wcsspn Ищет символ одной строки, отсутствующий в другой <string.h>

size_t wcsspn(wchar_t *sl, wchar_t *s2);Функция возвращает индекс первого символа в s1, отсутствующего в s2. Является аналогом функции strspn для многобайтных символов.wcsstr Ищет подстроку в строке <string.h>

wchar_t *wcsstr(wchar_t *sl, wchar_t *s2);Функция выполняет поиск первого вхождения подстроки s2 в строку s1. В случае удачного поиска, возвращает указатель на элемент из s1, с которого начинается s2, и NULL в противном случае. Является аналогом функции strstr для многобайтных символов.wcstod Преобразует строку в число <stdlib.h>

double wcstod(const wchar_t *str, wchar_t **end);Функция преобразует строку символов в числовое значение и возвращает его. Является аналогом функции strtod для многобайтных символов.wcstok Выделяет из строки лексемы <string.h>

wchar_t *wcstok(wchar_t *sl, wchar_t *s2);Функция возвращает следующую лексему из s1, отделенную любым из символов из набора s2. Является аналогом функции strtok для многобайтных символов.wcstol Преобразует строку в число с учетом системы счисления <stdlib.h>

double wcstol(const wchar_t *str, wchar_t **end, int radix);Функция преобразует строку символов в числовое значение с учетом указанной системы счисления radix и возвращает полученное число. Функция пропускает возможные начальные пробелы и заканчивает преобразование на первом символе, который не может появиться в образе числа. Параметр end является адресом указателя типа char*; этот указатель будет содержать адрес первого непреобразованного символа. Является аналогом функции strtol для многобайтных символов.wcstombs Преобразует wchar_t в строку многобайтных символов <std1ib.h>

size_t wcstombs(char *s, const wchar_t *pwcs, size_t n);Функция преобразует wchar_t в строку многобайтных символов. Если s указывает на немногобайтный символ, функция возвращает -1. В противном случае функция возвращает количество преобразованных байт.wcstoul Преобразует строку в число с учетом системы cчисления <stdlib.h>

double wcstoul(const wchar_t *str, wchar_t **end, int radix);Функция работает аналогично strtol, но с беззнаковым длинным целым. Являеся аналогом функции strtoul для многобайтных символов.wcstrxfrm Преобразует строки на основе текущей локализации <sthng.h>

size_t wcstrxfrm(wchar_t *sl, wchar_t *s2, size_t n);

107

Page 108: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Функция преобразует строку из s2 и помещает ее в s1 на основе текущей локализации. Преобразуется не более n символов. Является аналогом функции strxfrm для многобайтных символов.wctomb Преобразует wchar_t в многобайтный символ <std1ib.h>

int wctomb(char *s, wchar_t wc);Функция преобразует wchar_t в многобайтный символ. Если указатель s не NULL, функция возвращает ненулевое значение, если многобайтный символ имеет регионно-зависимое соответствие, ноль в противном случае. Если указатель NULL, wctomb возвращает -1.wmemchr Ищет первое вхождение символа в блок памяти <string.h>

<wchar.h>wchar_t *wmemchr(wchar_t *p, wchar_t c, size_t n);Функция возвращает указатель на первое вхождение аргумента с в блоке памяти р длиной п. Является аналогом функции memchr для многобайтных символов.wmemcmp Сравнивает блоки памяти <wchar.h>

int wmemcmp(const wchar_t *sl, const wchar_t *s2, size_t n);Функция сравнивает два блока памяти и возвращает значение: меньше нуля, равное нулю или больше нуля — аналогично кодам возврата функции strcmp. Является аналогом функции memcmp для многобайтных символов.wmemcpy Копирует блок памяти <string.h>

wchar_t *wmemcpy(wchar_t *sl, const wchar_t *s2, size_t n);Функция копирует блок памяти длиной n байт из адреса s2 по адресу s1. Является аналогом функции memcpy для многобайтных символов.wmemmove Переносит блок памяти <string.h>

wchar_t *wmemmove(wchar_t *sl, const wchar_t *s2, size_t n):Функция аналогична wmemcpy, но блоки s1 и s2 могут перекрываться. Является аналогом функции memmove для многобайтных символов.wmemset Заполняет блок памяти символом <string.h>

wchar_t *wmemset(wchar_t *s, wchar_t с, size_t n);Функция заполняет блок памяти символом с. Является аналогом функции memset для многобайтных символов.wprintf Выводит строку параметров в определенном формате <stdio.h>

int printf(const wchar_t *fmt, ...);Функция выводит на стандартное устройство вывода значения переменных, перечисленных в списке, обозначенном многоточием, в формате, определенном строкой format. Является аналогом функции printf для многобайтных символов.wscanf Вводит строку параметров в определенном формате <stdio.h>

int wscanf (const wchar_t *fmt [,parl, par2, ...]);Функция вводит строку параметров parl, par2 и т. д. в формате, определенном строкой fmt, со стандартного устройства ввода (обычно с клавиатуры). Возвращает число переменных, которым присвоено значение. Является аналогом функции scanf для многобайтных символов.

108

Page 109: МЕТОДЫ ПРОГРАММИРОВАНИЯ

СПИСОК ЛИТЕРАТУРЫ

1. Р.Берри, Б.Микинз. Язык Си. Введение для программистов. – М.:

Финансы и статистика, 1988. -190с.

2. Буч Г. Объектно-ориентированный анализ и проектирование с

примерами приложений на С++. /Пер. с англ. -М.: Издательство Бином, СПб:

Невский диалект, 1998. - 560 с.

3. Ирэ Пол. Объектно-ориентированное программирование с

использованием С++. Киев: Diasoft Ltd, 1995. - 480 с.

4. Йодан Э. Структурное проектирование и конструирование

программ: Пер. с англ. В.В. Фролова и Л.А. Теплицкого /Под ред. А.Н.

Королева. М.: Мир, 1979. - 415 с.

5. Павловская Т.А. С/С++ Программирование на языке высокого

уровня. Учебник для вузов. СПб.: Питер, 2002. – 464с.

6. Галявов И.Р. Borland C++ 5 для себя. – М.: ДМК Пресс, 2001. – 432с.

7. Культин Н. С/С++ в задачах и примерах. СПб.: БХВ Петербург,

2001. -288с.

8. Уинтер Р. Язык Turbo Си. –М.: Мир, 1991. –384 с.

109

Page 110: МЕТОДЫ ПРОГРАММИРОВАНИЯ

Фомин Владимир Владимирович

Сикулер Денис Валерьевич

Фомина Инга Константиновна

МЕТОДИЧЕСКОЕ ОБЕСПЕЧЕНИЕ ДИСЦИПЛИНЫ«ЯЗЫКИ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ»

Учебное пособие

Издается в авторской редакции

Подписано в печать Сдано в производство

Лицензия № Формат 60х84 1/16 Усл.-печ.л.

Уч.-изд.л. Тираж экз. Заказ №

____________________________________________________________

Отпечатано в ИИЦ Ф ГОУ ВПО СПГУВК198035, Санкт-Петербург, Межевой канал, д. 2

110