- •1.1. Алфавит языка Си
- •1.2. Лексемы
- •1.3. Идентификаторы и ключевые слова
- •1.4. Знаки операций
- •1.5. Литералы (константы)
- •1.6. Комментарии
- •1.7. Общая структура программы на языке Си.
- •1.8. Функциональная и модульная декомпозиции
- •1.9. Этапы обработки программы.
- •1.10. Роль препроцессора.
- •1.11. Ошибки
- •2. Переменные и константы. Типы данных
- •2.1. Основные типы данных
- •2.2. Декларация (объявление) объектов
- •2.3. Константы в программах
- •2.4. Целочисленные константы
- •2.5. Константы вещественного типа
- •2.6. Символьные константы
- •2.7. Строковые константы
- •2.8. Логические константы
- •3. Обзор операций
- •3.1. Операции, выражения
- •3.2. Арифметические операции
- •3.3. Операции сравнения
- •3.4. Логические операции
- •3.5. Операция присваивания
- •Примеры недопустимых выражений:
- •3.6. Сокращенная запись операции присваивания
- •3.7. Операция «,» (запятая)
- •4. Обзор операций (продолжение)
- •4.1. Преобразование типов операндов бинарных операций
- •4.2. Преобразование типов при присваивании.
- •4.3. Операция явного приведения типа
- •4.4. Приоритеты операций
- •5. Стандартная библиотека языка Си
- •5.1. Стандартные математические функции
- •5.2. Потоковый ввод-вывод
- •5.3. Консольные функции вывода данных на экран
- •5.4. Консольные функции ввода информации
- •5.5. Ввод-вывод в оконных приложениях.
- •Советы по программированию
- •6. Операторы языка с.
- •7. Составление разветвляющихся алгоритмов
- •7.1. Условные операторы
- •If (выражение) оператор;
- •If (выражение) оператор 1 ;
- •If (выражение 1) оператор 1;
- •If (выражение 2) оператор 2;
- •If (выражение 3) оператор 3;
- •7.2. Оператор выбора альтернатив (переключатель)
- •Void main(void)
- •7.3. Условная операция «? :»
- •8. Составление циклических алгоритмов
- •8.1. Оператор с предусловием while
- •8.2. Оператор цикла с постусловием do – while
- •Void main(void)
- •8.3. Оператор цикла с предусловием и коррекцией for
- •8.4. Вложенные циклы.
- •Пример 1.
- •Void main(){
- •Пример 2.
- •9. Операторы передачи управления.
- •9.1. Оператор безусловного перехода goto
- •9.2. Операторы continue, break и return
- •10. Массивы
- •10.1. Одномерные массивы
- •10.2. Примеры алгоритмов, использующих одномерные массивы.
- •10.3. Многомерные массивы
- •10.4. Примеры алгоритмов, использующих двумерные массивы.
- •10.5. Компонента StringGrid
- •11. Размещение данных и программ в памяти пэвм
- •11.1. Общие понятия.
- •11.2. Кодирование целых чисел.
- •11.3. Кодирование вещественных чисел.
- •11.4. Кодирование символов.
- •Примеры кодов символов:
- •Стандартная часть таблицы символов (ascii)
- •Дополнительная часть таблицы символов (ascii, кириллица)
- •Дополнительная часть таблицы символов (ansi, кириллица)
- •11.5. Операция sizeof
- •11.6. Кодирование программы.
- •11.8. Регистры
- •12.1. Строки как нуль-терминированные массивы char.
- •Void main(){
- •If (!strcmp(a,b))
- •Itoa(I, s, 10);
- •If (! sscanf(s, "%d", &I))
- •If (!strnicmp(s, "song", 4)) {
- •If (!strnicmp(s, "song", 4)) {
- •12.2. Русификация консольных приложений.
- •Void main(void)
- •12.3. Строки как переменные типа AnsiString.
- •12.4. Преобразования строковых типов.
- •12.5. Тип String в консольных приложениях.
- •Void main(){
- •13. Функции пользователя.
- •13.1. Сущность и предназначение функций.
- •13.2. Определение и вызов функции.
- •Void main(){
- •14. Область видимости и классы памяти
- •14.1. Область видимости.
- •Void fun(void);
- •14.2. Классы памяти объектов в языке Cи.
- •Void f1(int);
- •Void main(void)
- •Void f1(int I)
- •Void st(void){
- •14.3. Разбиение программы на модули.
- •15. Генерация псевдослучайных чисел.
- •16. Отладка и пошаговое выполнение программы
- •17. Указатели
- •17.1. Определение указателей
- •17.2. Связь указателей и массивов.
- •17.3. Операции над указателями (косвенная адресация)
- •17.4. Сравнение указателей
- •17.5. Массивы указателей.
- •17.6. Указатели на указатели.
- •17.7 . Указатели как параметры функций.
- •Void zam(int *X, int *y)
- •Void zam(int &X, int &y)
- •Void zam (int&, int&);
- •Void main (void)
- •17.9. Указатели на функции
- •Void FunOut(double (*p_f )(char, double)){
- •18.2. Создание одномерного динамического массива.
- •18.3. Создание двуxмерного динамического массива.
- •19. Операция typedef
11.3. Кодирование вещественных чисел.
Вещественные числа также хранятся в двоичном представлении. При этом они преобразуются в т.н. нормализованную экспоненциальную форму:
x.xxx∙2P
где x.xxx называется мантиссой числа, а P - его порядком. Нормализованность означает, что величина P подбирается так, чтобы в мантиссе перед точкой осталась лишь одна значащая (ненулевая, если только само число не равно 0) цифра.
Однако для двоичного числа ненулевая цифра может быть только 1, поэтому для ненулевых чисел нормализованная форма имеет вид:
1.xxx∙2P
а для нулевого числа величина P не играет роли.
Нормализованное число хранится в ячейке, занимающей несколько байт. Часть бит отводится на мантиссу, а часть на порядок, которые хранятся аналогично целым числам (знак порядка учитывается при этом несколько по-другому, чем знак целых чисел - к значению порядка (со знаком + или -) прибавляется (2N-1 - 1), где N - число бит для хранения порядка. Например, в типе double порядок +2 хранится как 100000000012, а -2 -как 011111111012).
Типы вещественных чисел, поддерживаемые С++ Builder'ом:
|
Тип |
Точность мантиссы (десятич-ных цифр после запятой) |
Поря-док (деся-тич-ный) |
Байт, всего |
Из них бит на: | ||
|
знак числа |
порядок (с его знаком) |
мантиссу | ||||
|
float |
7 - 8 |
38 |
4 |
1 |
8 |
23* |
|
double |
15 - 16 |
308 |
8 |
1 |
11 |
52* |
|
long double |
19 - 20 |
4932 |
10 |
1 |
15 |
64 |
* В типах float и double для экономии места первый (всегда единичный) бит мантиссы не хранится.
Как можно видеть из приведенных выше таблиц, при одинаковом количестве байт, отводимом, например, под величины типа float и long int, диапазоны их допустимых значений сильно различаются из-за внутренней формы представления значений таких данных.
Программисту почти никогда не приходится непосредственно иметь дело с внутренним представлением вещественных чисел (в отличие от других типов). Однако он должен понимать ограничения, связанные с конечным числом бит, выделяемых под мантиссу и порядок, и вызванной этим конечной точностью хранения таких чисел. Из-за этого возможно появление погрешности, вызванной отбрасыванием "не вмещающихся" младших двоичных разрядов.
Рекомендуется поэтому, как упоминалось выше, вместо проверки двух вещественных величин на равенство (==) или неравенство (!=) вычислять разницу между ними и сравнивать ее с заданным малым числом - допустимой погрешностью, например:
if (fabs(y-z)<0.0000001)
Отметим, что при вычислениях с веществеными числами, в отличие от целых, машина следит, чтобы операнды и результат лежали в допустимых пределах. В противном случае, либо выдается сообщение об ошибке ("Floating point overflow"), либо результату присваивается "недопустимое" значение, соответствующее недопустимому сочетанию значений мантиссы и порядка ("NAN", "INF").
11.4. Кодирование символов.
Символьная переменная занимает в памяти 1 байт и представляется кодом из 8 бит. При этом каждому символу соответствует определенный код:
