МЕТОДЫ ПРОГРАММИРОВАНИЯ
СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ НА
АЛГОРИТМИЧЕСКОМ ЯЗЫКЕ СИ
Санкт-Петербург
2006
1
УДК 681.3.068
ББК 32.98
Ф762
Рецензент:
Доктор технических наук, профессор кафедры «Морские
информационные технологии» Российского государственного
гидрометеорологического университета П. П. Бескид
УДК 681.3.068
ББК 32.98
2
СОДЕРЖАНИЕ
ВВЕДЕНИЕ................................................................................................................................4
1. ОСНОВЫ АЛГОРИТМИЧЕСКОГО ЯЗЫКА СИ..............................................................5
1.1. ГРАММАТИКА..................................................................................................................5
1.2. СТРУКТУРА ПРОГРАММЫ............................................................................................8
1.3. ТИПЫ ДАННЫХ..............................................................................................................11
1.4. ПРЕОБРАЗОВАНИЕ ТИПОВ.........................................................................................12
1.5. АДРЕСА И ССЫЛКИ.......................................................................................................14
1.6. ОПЕРАТОРЫ....................................................................................................................16
1.6.1. ОПЕРАЦИИ...................................................................................................................16
1.6.2. ОПЕРАТОРЫ ВВОДА/ВЫВОДА................................................................................22
1.6.3. ОРГАНИЗАЦИЯ РАБОТЫ С ФАЙЛАМИ.................................................................26
1.6.4. ОПЕРАТОР АЛЬТЕРНАТИВЫ...................................................................................29
1.6.5. ОПЕРАТОР ВЫБОРА...................................................................................................33
1.6.6. ЦИКЛ С <ПРЕДУСЛОВИЕМ>....................................................................................35
1.6.7. ЦИКЛ <С ПОСТУСЛОВИЕМ>....................................................................................38
1.6.8. ЦИКЛ <АРИФМЕТИЧЕСКИЙ>..................................................................................41
1.6.9. ОПЕРАТОР ПРОДОЛЖЕНИЯ.....................................................................................47
1.6.10. ОПЕРАТОР ПЕРЕХОДА............................................................................................48
1.6.11. МАССИВЫ...................................................................................................................49
1.6.12. СОРТИРОВКА МАССИВА........................................................................................53
1.6.13. СТРОКИ........................................................................................................................56
2. ТЕМЫ И ЗАДАНИЯ ПО ВЫПОЛЕНЕНИЮ ЛАБОРАТОРНЫХ РАБОТ...................60
ЛАБОРАТОРНАЯ РАБОТА № 1..........................................................................................60
ЛАБОРАТОРНАЯ РАБОТА № 2..........................................................................................62
ЛАБОРАТОРНАЯ РАБОТА № 3..........................................................................................66
ЛАБОРАТОРНАЯ РАБОТА № 4..........................................................................................69
ЛАБОРАТОРНАЯ РАБОТА № 5..........................................................................................72
ЛАБОРАТОРНАЯ РАБОТА № 6..........................................................................................75
3. КОНТРОЛЬ И ПРЕДСТАВЛЕНИЯ ЛАБОРАТОРНЫХ РАБОТ...................................80
ПРИЛОЖЕНИЕ 1....................................................................................................................82
ПРИЛОЖЕНИЕ 2....................................................................................................................85
СПИСОК ЛИТЕРАТУРЫ....................................................................................................110
3
ВВЕДЕНИЕ
На современном уровне развития вычислительной техники можно по
пальцам пересчитать алгоритмические языки практического использования:
ФОРТРАН, БЭЙСИК, ПАСКАЛЬ, АДА, Си, ФОРТ и др. Однако наиболее
ярким представителем из класса «системных» языков является
алгоритмический язык Си. Си – язык написания трансляторов, язык,
обеспечивающий доступ к самым сокровенным особенностям машины.
Когда мы говорим о каком то языке вообще, и о конкретном языке
программирования в частности, то необходимо понимать, что в он находится
в постоянном развитии, трансформируясь от примитивных трансляторов до
многофункциональных инструментальных систем. В основу данного пособия
положен алгоритмический язык Си в его развитии: базовый Си, С++, Borland
C Builder. При работе над материалами данного пособия использовался
компилятор, входящий в состав интегрированной среды разработки
приложений Borland C Builder 5.0. Его следует воспринимать исключительно
как одно из множества инструментальных средство поддерживающих
концепцию языка Си. Выбор транслятора для реализации большинства задач
этой книги абсолютно не принципиален. Следует лишь иметь в виду, что
выполнение примеров, которые приводятся в этой книге, в других
инструментальных средах в ряде случаев может привести к иным
результатам. Это связано с тем, что многие свойства языка C++ (размеры
данных основных типов, способы их размещения в различных сегментах
памяти и т.д.) зависят от конкретной реализации языка. Однако это
нисколько не противоречит тому, о чём говорится в пособии.
4
1. ОСНОВЫ АЛГОРИТМИЧЕСКОГО ЯЗЫКА СИ
1.1. ГРАММАТИКА
цифры и буквы-подчерки.
• Длина идентификатора неограниченна (фактически же длина зависит
5
• Идентификатор не должен совпадать с ключевыми словами и
именами используемых стандартных объектов языка.
• Не рекомендуется начинать идентификатор с символа
подчеркивания, т.к. они могут совпадать с именами системных функций или
переменных.
Ключевые (зарезервированные) слова. Часть идентификаторов C++
входит в фиксированный словарь ключевых слов. Ключевые слова - это
идентификаторы, которые имеют специальное значение для компилятора.
Прочие идентификаторы после специального объявления становятся
именами.
Список ключевых слов:
asm auto break case
catch char class const
continue default do double
else enum extern float
for friend goto if
inline 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
“,”, “!”, “!=”, “|”, “||”, “|=”, “%”, “%=”,“&”, “&&”, “()”, “*”, “*=”,“+”,“+
+”,“+=”, “-”, “--”, “-=”, “>=”, “>>=” ,==” ,“<<=”, “<=”, “<”, “>”,“>>”, “<<”,
“?”, “~”, “^”, “^=”, “#”, “##”.
Константы. Константами называют неизменяемые величины.
Различаются целые, вещественные, символьные и строковые константы.
Компилятор, выделив константу в качестве лексемы, относит ее к одному из
типов по ее внешнему виду или по типу, заданному программистом.
Форматы констант, соответствующие каждому типу, приведены в табл.1.1.
Таблица 1.1.
Форматы констант
Константа Формат Примеры
Целая Десятичный: последовательность 8, 0, 5864
десятичных цифр, начинающаяся не с
нуля, если это не число нуль.
Восьмеричный: нуль, за которым следуют 020, 01, 05423
восьмеричные цифры.
Шестнадцатеричный: 0x или 0X, за 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
Почти все типы лексем (кроме ключевых слов и идентификаторов)
имеют собственные правила словообразования, включая собственные
подмножества алфавита. Лексемы разделяются разделителями. Этой же цели
служит множество пробельных символов, к числу которых относятся пробел,
символы горизонтальной и вертикальной табуляции, символ новой строки,
перевода формата и комментарии.
8
окружение) имеет набор готовых к использованию фрагментов программного
кода. Этот код может находиться в разной степени готовности. Это могут
быть фрагменты текстов программ, но, как правило, это объектный код,
располагаемый в особых файлах. Такие файлы называются библиотечными
файлами.
Для использования библиотечного кода программисту бывает
достаточно указать в программе требуемый файл и обеспечить вызов
соответствующих функций. Для использования библиотечного кода бывает
достаточно стандартного набора языковых средств. Решение всех остальных
проблем транслятор и компоновщик берут на себя. Разумеется,
программисту должно быть известно о существовании подобных библиотек
и о содержании библиотечных файлов.
Оператор #DEFINE (определить). Его синтаксис:
#DEFINE <имя_макроподстановки> <значение макроподстановки>
Имя макроподстановки фактически - имя константы и препроцессор
будет заменять в тексте программы имя_макроподстановки на ее значение.
Возможность макроподстановок в некотором смысле сопоставима с разделом
констант, поскольку позволяет вынести все явные константы из теста
программы и вместо них использовать их символические имена.
Область описания функций – множество операторов и описателей,
структурированных по функциям.
Функции. Язык Си – алгоритмический, функциональный язык. Любая
программа на Си состоит из одной или более функций. Одна из этих функций
должна иметь имя main. Именно с этой функции начинает выполняться
программа. Функцию main нельзя вызвать изнутри программы, и ее
параметры, если они существуют, задаются операционной системой.
Обычно, но не обязательно, main() ставится первой функцией в программе.
9
Имя функции – попросту не что иное, как коллективное имя некоторой
группы операторов, заключенных в операторные скобки – { }. Синтаксис
функции в языке Си:
<имя_функции> (<список формальных параметров>)
<область описания формальных параметров>
{
<область локальных переменных>
<операторы>
}
Как правило, функция используется для вычисления какого либо
значения, поэтому перед именем функции указывается его тип. Если
функция не должна возвращать значение, указывается тип void. Тело
функции является блоком и, следовательно, заключается в фигурные скобки.
Функции не могут быть вложенными. Программа может состоять из
нескольких модулей. Все директивы имеют вид:
# include<имя_файла> и вставляют содержимое указанного файла в ту
точку исходного файла, где она записана. Поиск файла ведется в
стандартных каталогах включаемых файлов.
Пример 1. Структура программы, содержащей функции main, f1,f2.
директивы
int main()
{
операторы главной функции
}
int f1()
{
операторы функции f1
}
int f2()
10
{
операторы функции f2
}
11
bool – логический тип, величины которого могут принимать только
значения true и false.
Расширение типов данных шло последовательно с эволюцией самого
языка. С расширенными типами данных познакомимся в других главах
данного пособия.
Таблица 1.2.
Типы данных
Тип Примечания
сhar Единственный символ
short Целое со знаком
int Целое со знаком
long Длинное целое со знаком
float Дробное со знаком
double Удвоенное дробное со знаком
bool Логическое
Имена типов удобно перечислять в таком порядке: char, short, int, long,
float, double, bool.
Здесь типы .представлены в порядке увеличения их «размера памяти».
Речь идет об объеме памяти, необходимой для хранения значения некоторого
типа. Этот список помогает освоиться с неявными правилами
преобразования типов, приведенными ниже.
Для выражений, включающих одну бинарную операцию (т. е. операцию
с двумя операндами), например,
а+b
тип результата определяется по типам операндов. Действует такое правило:
значения типов char и short преобразуются в int, a float преобразуется в
double. Если в результате преобразования любой из операндов (а или b)
оказывается типа double, то второй так же преобразуется в double. После
12
этого либо оба операнда будут типа 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
13
дает в качестве результата значение 5 типа long. Приведение может
оказаться полезным, если нужно преобразовывать фактический параметр к
типу соответствующего формального параметра. Функции exp, log и sqrt,
находящиеся в библиотеке математических функций, рассчитаны на параметр
типа double и дают результат типа double. Если нам нужно получить
натуральный логарифм от значения переменной х типа float, то мы должны
написать:
log ( (double) x )
Операция присваивания трактуется отличным от других операций
способом. Тип значения выражения в правой части преобразуется к типу
идентификатора в левой части. Поэтому правая часть типа double иногда
преобразуется к float, иногда float «обрезается» до int, a int переходит в char,
причем старшие разряды просто игнорируются.
14
Адрес Содержимое
&i i
adr *adr
15
В функции surface для передачи вычисленной площади поверхности в
вызывающую программу используется формальный параметр addr . Чтобы
это можно было делать, содержимое addr , т.е. * addr , описывается
как относящееся к целому типу. Поэтому вызывающая программа
должна в качестве четвертого параметра задать адрес переменной целого
типа. В примере это адрес переменной area, т.е. &агеа. Поскольку внутри
функции оператор возврата не употребляется, то с именем функции и не
связывается какая-либо величина. Соответственно и обращение к функции в
основном сегменте выглядит как оператор.
Если функция должна возвращать обратившемуся к ней только одно
значение, то обычно удобнее передавать его с помощью опера тора возврата,
сопоставляя его с именем функции. Если же связь осуществляется через
несколько величин, то можно воспользоваться как механизмом возврата, так
и списком параметров. Можно ог раничиться только одним списком
параметров. Далее, по мере введения других конструкций языка, мы приведем
и примеры функ ций, где используются все эти механизмы.
1.6. ОПЕРАТОРЫ
1.6.1. ОПЕРАЦИИ
Операции присваивания.
Мы уже в некоторых местах приведенных программ ввели несколько
таких операций. Например, операция += дала нам возможность написать
sum+=i;
В языке Си операция присваивания трактуется так же, как и другие
операции, т. е. кроме того, что она выполняет присваивание, в качестве
результата она поставляет присвоенное значение. И его можно снова
использовать в других целях. Так, выражение
16
(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
обращаться к двоичным «образам» значений и манипулировать ими.
Предусмотрены такие операции:
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 логическое отрицание
Операции отношения.
18
Примеры таких операций в тексте встречались в нескольких местах. В Си есть
такие операции:
> больше
>= больше или равно
== равно
! = не равно
<= меньше или равно
< меньше
Вот, например, проверка, является ли символ цифрой или нет. Здесь есть две
операции отношения и одна логическая операция:
digit= (ch> = '0') && (ch< = '9');
Увеличение и уменьшение.
Операция уменьшения действует аналогичным образом операции
увеличения. Например,
countdown - - ;
уменьшает значение countdown на единицу.
Обе эти операции можно записывать как перед операндом, так и после него.
Поэтому можно написать:
- - countdown; ++count;
Такие простые примеры этих операций тем не менее не позволяют уяснить
отличие префиксного их употребления от постфиксного. Разницу же можно
показать на таком примере:
р=0;
printf ("%2d\n", p++);
printf ("%2d\n",++p);
После инициации первый оператор напечатает нуль и затем увеличит р.
Во втором операторе печати сначала p увеличится (станет равным двум), а
затем его значение будет напечатано. Префиксное употребление
19
подразумевает увеличение (уменьшение) соответствующего значения, а затем
его использование, в то время как постфиксное употребление соответствует
использованию и последующему увеличению (уменьшению).
Старшинство операций.
Выражения на любом языке программирования должны быть записаны
понятно. (Помните, что другие так же пожелают прочитать и понять ваши
программы.) Для того чтобы достичь этого и создавать синтаксически и
логически правильные программы, необходимо понимать, как записываются
выражения и как они интерпретируются.
Т а б л и ц а 1.4.
Старшинство операций
Приоритет Операция Название Порядок вычислений
высший ( ) Скобки слева направо
[ ] Квадратные скобки слева направо
высший - 1 ++ Увеличение справа налево
-- Уменьшение справа налево
(тип) Приведение справа налево
* Содержимое справа налево
& Адрес справа налево
- Унарный минус справа налево
~ Обращение справа налево
! Логическое НЕ справа налево
высший - 2 Умножение слева направо
/ Деление слева направо
% Остаток слева направо
высший - 3 + Сложение слева направо
- Вычитание слева направо
высший - 4 >> Сдвиг вправо слева направо
<< Сдвиг влево слева направо
высший - 5 > Больше слева направо
>= Больше или равно слева направо
<= Меньше или равно слева направо
< Меньше слева направо
= Равно слева направо
!= Не равно слева направо
низший +5 & Поразрядное И слева направо
низший +4 ^ Исключающее ИЛИ слева направо
20
низший +3 1 Поразрядное ИЛИ слева направо
низший +2 &&. Логическое И слева направо
низший +1 II Логическое ИЛИ слева направо
низший = Присваивание справа налево
+= Присваивание со сложением справа налево
-= И т. д. справа налево
*= справа налево
/- справа налево
%= справа налево
>> = справа налево
<< = справа налево
&= справа налево
^= справа налево
1= справа налево
Операнды должны разделяться операциями, они обычно выполняются
слева направо. В таком, например, выражении а + b*с операнды
действительно разделены операциями, но по привычке мы считаем, что
умножение b на с выполняется ранее прибавления а.
Формально в этом случае мы говорим, что умножение имеет больший
приоритет, чем сложение. Для введения принудительного приоритета всегда
можно использовать скобки. В Си же, однако, существуют ситуации, в
которых даже эти правила применять не так легко, как хотелось бы. Кроме
того, другим возможным источником ошибок и неприятностей являются
некоторые операции, например * и &, выполняющие более чем одну функцию.
Рассмотрим такой пример:
*pint++
Это не часть умножения. Его можно понять как увеличение ссылки (адреса)
pint на единицу и получение содержимого памяти по этому адресу, а
иногда - и как увеличение на единицу значения * pint. Фактически же все
унарные операции выполняются справа налево, И так что наше выражение
увеличивает ссылку pint, а не то, на что она указывает. Если нам нужно
именно это, то следует написать:
(*pint)++
21
Поэтому необходимо знать и старшинство операций, и порядок, в котором они
выполняются. Вся подобная информация сосредоточена в табл.1.4. Операции,
имеющие одинаковый приоритет, помещены в последовательных строках, но
это отнюдь не означает их упорядоченности.
22
Общий вид спецификации таков:
%[-][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
lo или O long Восьмеричное без знака, бн
X int Шестнадцатеричное без знака, бн
lx или X long Шестнадцатеричное без знака, бн
(бн – начальные нули не печатаются)
F float или double Десятичная запись
E float или double «Научная» нотация (с порядком)
G float или double Наиболее короткое представление из %e и
%f
S строка Множество символов
Таблица 1.6.
Модификации символов с /
\b Шаг назад
\f Новая страница
\n Новая строка
\r Возврат каретки
\t табуляция
\ddd Восьмеричный код ASCII
\" "
\\ \
24
Примеры спецификаций преобразования даются в таблице 1.7.
Для scanf общий вид спецификации преобразования таков:
%[*][dd]C
где C – символ преобразования;
* - допустимый признак гашения присваивания;
dd – цифровая строка, задающая максимальный размер поля.
Преобразование строк.
В языке С строковая константа – это последовательность символов,
заключенная в двойные кавычки. Подобно другим данным строки можно
читать, записывать, обрабатывать и печатать.
Таблица 1.7.
Спецификации преобразования
Символы Тип аргумента
преобразования
C Ссылка на char
H Ссылка на short
D Ссылка на int
ld или D Ссылка на long
O Ссылка на int
lo или O Ссылка на long
X Ссылка на int
lx или X Ссылка на long
F Ссылка на float
lf или F Ссылка на double
E Ссылка на float
le или E Ссылка на double
S Ссылка на массив char
[……………] Ссылка на массив char
25
Пытаясь опознать данные, охарактеризованные в управляющей строке,
sscanf просматривает строку-источник. При успешном отождествлении
происходит присваивание элементу из списка аргументов. Соответственно
обращение вида
sprintf (строка-приемник, управляющая строка [, список аргументов])
приводит к записи аргументов, указанных в списке аргументов, в
строку – приемник с преобразованием, заданным управляющей строкой.
26
<имя_файла> - аргумент, имеющий строковое значение и
представляющий собою имя открываемого файла.
<тип_открытия> - строка, указывающая с какой целю открывается
данный файл. В языке Си аргумент может принимать три значения (в языке
С++ больше):
"r" – файл открывается только для чтения.
"w" – файл открывается для записи (перезаписи).
"а" – файл открывается для добавления информации.
27
разнообразна, что трудно предусмотреть в определении самого языка все их
особенности.
Поэтому каждый инструментарий обладает своей библиотекой программ,
реализующий ту или иную концепцию операторов ввода/вывода. Программист должен
исследовать данные библиотеки на предмет расширенных возможностей. В табл. 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 Открывает поток ввода/вывода
28
{ 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);
}
29
Операторы в программе могут быть следующих видов:
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> ”);
scanf(“%i”, &year );
30
r=year%4;
if (r)
printf(“%i год невисокосный\n”, year);
else
printf(“%i год високосный\n”, year);
printf(“\nДля завершения нажмите <Enter>”);
getch();
}
#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)
{
printf(“Предоставлена скидка 20%\n”);
31
со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
1.6.5. ОПЕРАТОР ВЫБОРА
#include <stdio.h>
33
#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
printf(“\nДля завершения нажмите <Enter>”);
getch();
}
#include <stdio.h>
#include <conio.h>
void main()
{
int a,b; //числа, НОД которых необходимо вычислить
35
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. Составить программу для вычисления суммы бесконечного
∞ 2 * n −1
ряда ∑ с точностью до ε. Из постановки задачи видно, что
n =1 n3
вычисление суммы необходимо прекратить, когда значение текущего
слагаемого близко к 0, т.к. его добавление к сумме уже не влияет на
результат.
#include <stdio.h>
#include <conio.h>
void main()
{
int n; //номер текущего слагаемого
float eps; //значение ε=0,001
36
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. Составить программу для вычисления предела
n2 + 5
последовательности lim c точностью до ε. Из постановки
n −>∞ n2 +1 + 2 * n3
задачи видно, что расчет предела следует прекратить, когда разница между
текущим и последующим значениями близка к 0.
#include <stdio.h>
#include <conio.h>
void main()
{
int n; //номер итерации
float eps; //значение ε=0,001
float lim; //предел последовательности
printf(“введите величину точности расчетов”);
scanf(“%f”, &eps );
n=1;
37
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();
}
38
существуют задачи, программу для которых можно реализовать только с
помощью одного итерационного цикла.
∞ 2 * n −1
ряда ∑ с точностью до ε. Из постановки задачи видно, что
n =1 n3
#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
Пример 12. Составить программу для вычисления предела
n2 + 5
последовательности lim c точностью до ε. Из постановки
n −>∞ n2 +1 + 2 * n3
задачи видно, что расчет предела следует прекратить, когда разница между
текущим и последующим значениями близка к 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
1.6.8. ЦИКЛ <АРИФМЕТИЧЕСКИЙ>
41
изменяющее выражение вычисляются при каждой итерации. Это означает,
что если некоторый идентификатор, использованный в упомянутых
вычислениях, внутри цикла изменяется, то могут постоянно изменяться при
прохождении тела цикла и условие окончания, и шаг цикла. Рассмотрим,
например, такой цикл:
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:
n
S=B+ ∑(X + A/i)
m
42
#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();
}
43
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 );
printf(“-------------------------------------\n”);
printf(“¦ X ¦ Y ¦\n”);
printf(“-------------------------------------\n”);
44
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();
}
45
printf(“-------------------------------------\n”);
printf(“\nДля завершения нажмите <Enter>”);
getch();
}
46
getch();
}
47
Оператор разрыва break приводит к немедленному выходу из
операторов переключателя и циклов. Кроме того, в любых упомянутых
циклах можно употреблять и оператор продолжения continue. Этот
оператор вызывает лишь окончание текущей итерации данного цикла.
Если при выполнении циклов с while или do встречается continue, то
происходит переход на проверку условия окончания цикла. Если же он
попадается в цикле с for, то сначала выполняется «изменяющее»
выражение, а потом уже проверка, нужно ли выполнять очередную
итерацию.
48
1.6.11. МАССИВЫ
49
gptr++; /* gptr указывает на grades [1] */
gptr++; /* gptr указывает на grades [2] */
50
#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();
}
#include <stdio.h>
#include <conio.h>
void main()
{
int a[10]; //задание целого массивa из 10 элементов
int i; //счетчик циклов
51
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
1.6.12. СОРТИРОВКА МАССИВА
53
8 67 67 67 67 67 67 67 94
54
}
}
//Отладочная печать – состояние массива после очередного
//цикла сортировки
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();
}
55
{
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
В предыдущем разделе мы пользовались массивом символов, причем из-
за природы выбранного примера всегда перебирали все элементы нашего
массива. В случае же строк, хранящихся как массивы символов, было бы
неэффективно предполагать, что строки занимают все элементы массивов, где
они хранятся. Мы должны быть готовыми к тому, что либо вместе со строкой
хранится ее размер, либо конец строки обозначается некоторым особым
символом. В Си принято соглашение, что в конце любой строки находится
символ 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
Из описания 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
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
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-r22), где r1 –
радиус цилиндра, r2 – радиус отверстия, h – высота цилиндра.
13. Вычислите объем конуса по формуле s=1/3*π*r2*h.
14. Вычислите значение функции y=5,7*x3+5*x -9.
60
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
ЛАБОРАТОРНАЯ РАБОТА № 2
Тема: «Разветляющийся вычислительный процесс»
Цель работы: реализовать программу в двух вариантах, с использованием
операторов альтернативы и выбора.
Варианты
62
sin(b2)/ ab +ln(2b)- log2(a); k=5
Y= cos2(k)+sin3(a+2b); k=2 или k=4
2*arcsin(a*ek); при остальных значениях k
63
13. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:
(3a − b 2 ) /ln(2b)+lg(3b); k= 1,5
Y= 3sin3(3*arctg(π )a)-cos(b2); k= 6,12
3*ek; k>12
64
(2a+b)3 +ln(a2/b)-3* ab ; k=1 или k=4
Y= sin3(X+2ab)+e2b; k=2 или k=3 или k=6
7-arccos(2a+4k); при остальных значениях k
21. Для заданных с клавиатуры значений переменных a,k и b вычислить Y:
2k+arcsin(2a3+ b )-1/ln(ab); k=1 или k=5
Y= lg(2a2)-e ak; k=2 или k=3
cos -1(π/3+45°); при остальных значениях k
65
3* (3a +b5 ) +ln(2b+k); 3<k<12
Y= kb -sin(2π)+e(a+b); k=3
arcsin(2*a-k); k=1 или k=2
ЛАБОРАТОРНАЯ РАБОТА № 3
Тема: « Язык Си: арифметический цикл».
Варианты
1. Составить программу для вычисления суммы кубов всех целых чисел,
дающих при делении на 8 в остатке 5.
2. Напишите программу приближенного вычисления определенного
интеграла методом трапеций f(x)=-4,25x3+2,73x2-1,66.
3. Написать программу, вычисляющую произведение элементов
одномерного массива 100, находящихся после элемента равного нулю.
4. Написать программу, которая преобразует десятичное число,
введенное пользователем с клавиатуры, в двоичное.
5. По введенным с клавиатуры значениям x,m вычислить s:
66
2*m +1
s= ∑ i * 2 * x .
2
i =1,3,5,...
67
17. Напишите программу приближенного вычисления определенного
интеграла методом правых прямоугольников f(x)=-1,576x3-0,394x2+3,574.
18. По введенным с клавиатуры значениям x,m,n,a,b вычислить s:
m a − x *i
s=b+ ∑ .
i =n i * i + x * x
68
28. В одномерном массиве 100 вычислить сумму элементов стоящих
между первым и последним элементами равными нулю.
29. Написать программу, вычисляющую произведение четных элементов
одномерного массива 100, находящихся после максимального элемента
массива.
30. По введенным с клавиатуры значениям x,m,а вычислить s:
m a −i*x
s=a2- ∑ .
i =1 i * x2
ЛАБОРАТОРНАЯ РАБОТА № 4
Тема: «Язык Си: массивы».
В данной лабораторной работе необходимо составить три программы,
которые должны реализовывать задание с помощью одного из трех циклов
языка Си.
Варианты
1. Задать: матрица М размерностью 10× 10, вектор В размерностью 10.
69
5. Задать: матрица А размерностью 10× 10, вектор В размерностью 10.
70
13. Задать: матрица М размерностью 10× 10, вектор В размерностью 10 .
матрицы.
19. Задать: матрица М 15× 10. Найти сумму отрицательных элементов
матрицы.
20. Задать: матрица М 15× 15. Найти сумму положительных элементов
71
24. Задать: две матрицы М и К размерностью 10× 10. Заменить значения
элементов матрицы.
ЛАБОРАТОРНАЯ РАБОТА № 5
Тема «Язык Си: манипуляции символьными данными».
Варианты
1. Написать программу, которая выводит на экран кодировку символов
72
прописные в введенной строке.
3. Написать программу, которая преобразует прописные буквы в
целым числом.
7. Написать программу, которая проверяет, является ли введенная
клавиатуры строки.
13. Написать программу, которая запрашивает у пользователя имя и
73
16. Написать программу, которая выведет на экран заданный
пользователем текст в обратном порядке.
17. Написать программу, которая в введенной с клавиатуры строке
в строке.
23.Написать программу, которая ищет количество вхождений символов
одной строки во второй строке и выдает статистику по каждому
символу.
24. Написать программу, которая подсчитывает количество строк массива
74
27. . Написать программу, которая переведет введенное с клавиатуры
отсортирует ее по возрастанию
ЛАБОРАТОРНАЯ РАБОТА № 6
Тема «Язык Си: Файлы».
Варианты
1. Зашифровать текстовый файл, выполнив операцию инверсии над
75
6. Зашифровать текстовый файл, прибавляя цифры 1,2,3 к символам
76
Дешифровать его и просмотреть результат шифровки и дешифровки в
редакторе текста Блокнот.
14. Зашифровать текстовый файл, находящийся на диске А, прибавляя
77
21. Зашифровать текстовый файл, выполнив операцию инверсии над
78
просмотреть результат шифровки и дешифровки в редакторе текста
Блокнот.
29. Зашифровать текстовый файл, находящийся на диске А, прибавляя как
79
3. КОНТРОЛЬ И ПРЕДСТАВЛЕНИЯ ЛАБОРАТОРНЫХ РАБОТ
80
Целью проверки является оценка правильности выбранных
алгоритмических решений и возможностей программной реализации на ПК.
Оформительский этап. Студент обязан оформить пояснительную
записку и графический материал в соответствии с предъявленными
требованиями.
Защита лабораторной работы. На этом этапе проводится защита
лабораторной работы. Студент обязан представить руководителю
окончательно оформленную пояснительную записку к лабораторной работе и
подготовить доклад (5-7 минут). В докладе в сжатой и четкой форме следует
представить поставленную задачу, основное содержание работы,
иллюстрируя принципиальные положения материалом пояснительной
записки. Студент также обязан быть готовым к теоретическому опросу по
теме защищаемой работы. При необходимости студент должен быть готов
продемонстрировать программу, находящуюся на внешнем магнитном
носителе, на ПК.
81
ПРИЛОЖЕНИЕ 1
82
Алфавит и лексемы языка те же, что и в С. Однако список ключевых слов обширней:
asm auto dool break
case catch char class
const const_cast continue default
delete do double dynamic_cast
else enum explicit export
extern false float for
friend goto if inline
int long mutable namespace
new operator private protected
public register reinterpret_cast return
short signed sizeof static
static_cast struct swich template
this throq true try
typedef typeid typename union
unsigned using virtual void
volatile wchar_t while
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.h
log(x) Натуральный логарифм x (double). math.h
log10(x) Вычисление десятичного логарифма x (double). math.h
log10l(x) Вычисление десятичного логарифма x (long double). math.h
logN(x) Вычисление логарифма x (double) по основанию N. math.h
log2(x) Вычисление логарифма x (double) по основанию 2. Math.hpp
exp(x) Вычисление экспоненты от x (double, long double). math.h
sin(x), sinl(x) Синус от x (double, long double), заданного в радианах. math.h
tan(x), tanl(x) Тангенс от x (double, long double), заданного в радианах. math.h
cos(x), cosl(x) Косинус от x (double, long double), заданного в радианах. math.h
acos(x), asin(x) Вычисление арккосинуса и арксинуса соответственно от x.
math.h
sqrt(x), sqrtl(x) Вычисление квадратного корня из x (double, long double). math.h
pow(x, y), powl(x, y) Возведение x в степень y (double, long double). math.h
random (n) Генерация случайных целых чисел от0 до n. stdlib.h, time.h
div(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
84
ПРИЛОЖЕНИЕ 2
Функции стандартной библиотеки.
85
cos Вычисляет косинус
cosh Вычисляет гиперболический косинус
exp Возвращает степень числа е
tabs Возвращает модуль числа
floor Округляет вниз
fmod Возвращает остаток от деления х на у.
frexp Выделяет из числа мантиссу и экспоненциальную часть
ldexp Преобразует мантиссу и показатель степени в число
log Вычисляет натуральный логарифм
log10 Вычисляет логарифм по основанию 10
modf Разбивает число на целую и дробную части
pow Возводит число в степень
sin Вычисляет синус
sinh Вычисляет гиперболический синус
sqrt Вычисляет квадратный корень
tan Возвращает тангенс аргумента
tanh Возвращает гиперболический тангенс аргумента
86
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 Вводит строку параметров определенном формате
87
labs Возвращает модуль числа
ldiv Делит с остатком
mal1oc Выделяет блок памяти
mblen Определяет размер многобайтных символов
mbstowcs Преобразует строку многобайтных символов в массив из wchar_t
mbtowc Преобразует многобайтный символ в wchar_t
qsort Сортирует заданный массив
rand Генерирует случайные числа
realloc Изменяет размеры ранее выделенного блока памяти
srand Устанавливает начальное псевдослучайное число
strtod Преобразует строку в число
strtol Преобразует строку в число с учетом системы счисления
strtoul Преобразует строку в число с учетом системы счисления
system Передает строку командному процессору ОС
wcstod Преобразует строку в число
wcstol Преобразует строку в число с учетом системы счисления
wcstombs Преобразует wchar_t в строку многобайтных символов
wcstoul Преобразует строку в число с учетом системы счисления
wctomb Преобразует wchar_t в многобайтный символ
88
wcslen Возвращает длину строки
wcsncat Складывает одну строку с п символами другой
wcsncmp Сравнивает одну строку с п символами другой
wcsncpy Копирует первые п символов одной строки в другую
wcspbrk Ищет один из символов одной строки в другой
wcsrchr Ищет символ в строке
wcsspn Ищет символ одной строки, отсутствующий в другой
wcsstr Ищет подстроку в строке
wcstok Выделяет из строки лексемы
wcstrxfrm Преобразует строки на основе текущей локализации
wmemcpy Копирует блок памяти
wmemmove Переносит блок памяти
wmemset Заполняет блок памяти символом
Заголовочный файл <time.h> (<ctime>) — функции для работы с датой и временем в стиле С
asctime Преобразует дату/время в строку
clock Возвращает время исполнения программы
ctime Преобразует время в строку
difftime Возвращает разницу времен
gmtime Инициализирует структуру tm на основе time_t
localtime Инициализирует структуру tm на основе time_t
mktime Заполняет поля дня недели и дня года
strftime Преобразует время в формате fmt в формат tm
time Возвращает текущие дату /время в виде time_t
wcsftime Преобразует время в формате fmt в формат tm
89
Функция возвращает строку, представляющую символьное представление даты и времени
из структуры типа 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 в зависимости от того, меньше, равен или больше первый
элемент в сравнении со вторым. Несмотря на.то, что оба параметра функции compare
определены как void*, реально параметрами функции являются указатели на элементы, и
90
она должна приводить их к соответствующему типу перед разыменованием (получением
значений по адресу).
Если функция 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);
Функция делит целое numerator на целое denominator, возвращая результат в структуре,
содержащей частное и остаток:
struct div_t{
91
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, прекращая чтение при
обнаружении символа новой строки или конца файла. Символ новой строки при чтении не
отбрасывается, а помещается в конец строки. Прочитанная строка дополняется
ограничителем строки ('\0'). При обнаружении ошибки или конца файла возвращается
NULL, в противном случае — указатель на строку s.
fgetwc Читает из потока символ <stdio.h>
wint_t *fgetwc(FILE *f);
92
Функция возвращает очередной символ в форме 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);
Функция записывает строку символов s в поток f. Символ конца строки в файл не
записывается. При ошибке возвращает значение WEOF, иначе — неотрицательное число.
Является аналогом функции fputs для многобайтных символов.
free Освобождает блок памяти <stdio.h>
93
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>
94
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);
Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch
является буквой или цифрой, или false в противном случае.
isalpha Проверяет, является ли символ буквой <ctype.h>
int isalpha(int ch);
95
Функция выделяет младший байт параметра 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);
Функция возвращает значение true, если символ ch является буквой или цифрой, или false
в противном случае. Является аналогом функции isalnum для многобайтных символов.
iswalpha Проверяет, является ли символ буквой <ctype.h>
int iswalpha(wint_t ch);
96
Функция возвращает значение 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 для
многобайтных символов.
iswupper Проверяет, является ли символ буквой верхнего регистра <ctype.h>
int iswupper(w1nt_t ch);
97
Функция возвращает значение 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>
void *malloc(size_t size);
98
Функция выделяет блок памяти размером size байт и возвращает указатель на него. В
случае неудачи возвращаемым значением будет NULL. Предпочтительней вместо mа11ос
использовать операцию new.
mblen Определяет размер многобайтных символов <std1ib.h>
int mb1en(const char *s, s1ze_t n);
Функция возвращает размер символа *s, если s не NULL.
mbstowcs Преобразует строку многобайтных символов в массив из <stdio.h>
wchar t
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>
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);
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);
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);
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>
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, ...);
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);
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 для
многобайтных символов.
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);
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);
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 для многобайтных
символов.
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 с.
110
Фомин Владимир Владимирович
Сикулер Денис Валерьевич
Фомина Инга Константиновна
Учебное пособие
111