
- •Содержание
- •Введение
- •История развития компьютера
- •Типы и назначение компьютеров
- •Классы программного обеспечения (ПО) ЭВМ
- •Операционная система персонального компьютера (ПК)
- •Основы информатики
- •Информационные процессы
- •Информационная деятельность человека
- •Технические средства хранения информации
- •Кодирование информации
- •Системы счисления
- •Представление информации в компьютере
- •Представление текстовых данных
- •Представление изображений
- •Представление звуковой информации
- •Представление видео
- •Введение в программирование на языке Си
- •Этапы решения задачи на ЭВМ
- •Графический способ описания алгоритмов
- •Структура программы на языке С++
- •Описание переменных
- •Функции ввода-вывода
- •Условный оператор
- •Составной оператор
- •Операция условия
- •Оператор выбора
- •Циклические программы
- •Оператор цикла с постусловием
- •Оператор цикла с предусловием
- •Оператор цикла со счетчиком
- •Обработка массивов
- •Обработка одномерных массивов
- •Обработка двумерных массивов
- •Массивы и указатели
- •Пользовательские функции
- •Решение нелинейных уравнений
- •Нелинейные уравнения
- •Исследование уравнений и отделение корней
- •Методы поиска корней уравнения
- •Модификация табличного способа
- •Метод Ньютона (метод касательных)
- •Метод секущих
- •Файлы
- •Файлы данных и каталоги. Внутренняя организация и типы файлов
- •Текстовые файлы
- •Строки символов
- •Заключение
- •Список источников

Рис. 14
Рассмотрим подробнее описания переменных и операторы, необходимые для написания линейной программы.
Описание переменных
В языке С++ обрабатываются переменные различных типов. Тип любого объекта определяет множество допустимых значений и множество допустимых операций над этими значениями.
ТИП ДАННЫХ -- форма представления данных, которая характеризуется способом организации данных в памяти, множеством допустимых значений и набором операций.
Иначе говоря, тип данных -это «идея» определенного вида переменных, заложенная в транслятор. Сама переменная - это не что иное как область памяти программы, в которой размещены данные в соответствующей форме представления, то есть определенного типа.
52

Поэтому любая переменная в языке имеет раз и навсегда заданный тип. Область памяти всегда ассоциируется в трансляторе с именем переменной.
ПЕРЕМЕННАЯ -- именованная область памяти программы, в которой размещены данные с определенной формой представления (типом).
Для того, чтобы воспользоваться переменной, необходимо произвести некоторые предварительные действия - выполнить ОПРЕДЕЛЕНИЕ ПЕРЕМЕННОЙ. Только при наличии такого определения транслятор будет знать ее имя, тип данных и, возможно, начальные значения. Любой идентификатор, используемый в исполняемых операторах, должен быть предварительно описан в любом месте программы, но обязательно до начала применения.
Рис. 15
В этом строгом требовании языка С++ проявляется тенденция развития языков программирования в сторону повышения надежности создаваемых программ. При описании переменные можно инициализировать. На рис.5 приведено «дерево» типов данных С++. В этой лекции мы рассмотрим целые и вещественные типы данных.
Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать один, два или четыре байта. В табл. 2 приводятся названия целых типов, их длина в байтах и диапазон возможных значений. Целые типы относят порядковым типам.
53

Для порядковых типов характерно то, что такие типы имеют конечное число возможных значений, их можно каким-либо образом упорядочить и каждому поставить в соответствие целое число.
Таблица 2
Длина, |
Название |
Назначение типа |
Диапазон |
|
байт |
типа |
|
значений |
|
1 |
unsigned |
Небольшие целые |
от 0 до 255 |
|
char |
числа и коды |
|||
|
символов |
|
||
|
|
|
||
1 |
char |
Очень малые целые |
от -128 до 127 |
|
числа и ASCII-коды |
||||
2 |
unsigned |
Большие целые и |
от 0 до 65535 |
|
int |
счетчики циклов |
|||
|
|
|||
2 |
int |
Небольшие целые |
от -32768 до |
|
32767 |
||||
|
|
|
||
2 |
short int |
Небольшие целые |
от -32768 до |
|
32767 |
||||
|
|
|
||
4 |
unsigned |
Астрономические |
от 0 до |
|
long |
расстояния |
4294967295 |
||
|
||||
4 |
long |
Большие числа |
от -2147483648 |
|
до 2147483647 |
||||
|
|
|
Описание переменных целого типа может выглядеть так: int a, b=0;
long c; unsigned int d;
Переменная b инициализирована при описании. Основные операции над целыми числами:
"+» — сложение; «*» — умножение; « / « — деление; "-» — вычитание; «%» - получение остатка от целочисленного
деления.
Порядок выполнения операций такой же, как в математике.
В языке С++ специальной операции целочисленного деления нет, поэтому тип операции определяется типами операндов. Если оба операнда целые, то операция деления выполняется как операция целочисленного деления. Если хотя бы один из операндов вещественный, то операция деления выполняется не как целочисленная. Например:
5/2 =2 5%2 = 1 6/2 = 3 6%3= 0 5./2 = 2.5
54

Под данными вещественного типа понимаются числа, записанные с десятичной точкой. Значение числа вещественного типа представляется в ЭВМ лишь с некоторой конечной точностью, которая зависит от внутреннего формата вещественного числа. В табл. 3 приведены названия вещественных типов, их длина в байтах, а также диапазон возможных значений. Существует две формы представления вещественных чисел: с фиксированной и с плавающей точками. Примеры записи вещественных чисел с фиксированной точкой приведены в первом столбце, а с
плавающей — во втором: |
|
|
|
|||
1.36 |
|
1.36e0 |
|
|
|
|
0.0013 |
1.3e-3 |
|
|
|
||
123.123 |
1.23123e2 |
|
|
|
||
Переменные вещественного типа можно описать так: |
||||||
float a, b; |
|
|
|
|
|
|
double c, d; |
|
|
|
|
|
|
long double l, m, n; |
|
Таблица 3 |
||||
|
|
|
|
|
||
|
Длина, |
|
|
Диапазон |
Количество |
|
|
|
Название |
абсолютных |
|
||
|
байт |
|
значащих цифр |
|
||
|
|
|
|
величин |
|
|
|
4 |
|
float |
от 3.4e-38 до 3.4e |
от 7 до 8 |
|
|
|
|
|
+38 |
|
|
|
8 |
|
double |
от 1.7e -308 до 1.7e |
от 15 до 16 |
|
|
|
|
|
+308 |
|
|
|
10 |
|
long |
от 3.4e -4932 до |
от 19 до 20 |
|
|
|
double |
3.4e +4932 |
|
||
|
|
|
|
|
В табл. 4 приведены наиболее часто используемые функции для обработки данных вещественного типа. Этими функциями можно пользоваться только после подключения файла math.h с помощью директивы препроцессора include. Для вычисления модуля целого числа используется функция abs(x).
Таблица 4
Обращение |
Реализуемое действие |
fabs(x) |
Модуль аргумента |
atan(x) |
Aрктангенс (радианы) |
floor(x) |
Целая часть числа в форме double |
log(x) |
Натуральный логарифм |
pow(x,y) |
Вычисляет значение x в степени y |
sqrt(x) |
Корень квадратный |
sin(x) |
Синус (радианы) |
сos(x) |
Косинус (радианы) |
exp(x) |
Экспонента |
55
Оператор присваивания.
Оператор присваивания является самым важным оператором в любом языке программирования. Этот оператор служит для изменения областей памяти. Оператор присваивания заменяет значение переменной, идентификатор которой стоит в левой части оператора, значением выражения, стоящего в правой части, и имеет следующую форму:
идентификатор переменной = выражение.
Необходимо учесть, что переменная и выражение должны быть согласованы по типам. Например, если переменные описаны следующим образом:
int x, y ; float a, b;
то можно записать операторы присваивания x = 2;
x = x+5; y = x;
a = b = 3.1;
b = 5.33*x+y/2;
Что происходит со старым значением переменной, когда ей присваивается новое значение? Оно просто стирается. Поскольку переменная может хранить только одно число, то выполнение оператора присваивания приводит к потере предыдущего значения переменной. Переменная всегда содержит результат последнего оператора присваивания.
Как отмечалось, тип переменной позволяет не только устанавливать длину ее внутреннего представления, но и контролировать те действия, которые осуществляются над ней в программе. Ниже приведены схемы преобразования типов, гарантирующие сохранение точности и неизменность численного значения:
signed char ==> short ==> int ==> long float ==> double ==> long double
unsigned char ==> unsigned short ==> unsigned int ==> unsigned long
Для описанных выше переменных оператор x = a будет неверным, так как невозможно точно преобразовать вещественный тип к целому, а оператор a = x будет верным. При этом сообщение об ошибке выдаваться не будет, так как язык С++ относится менее жестко, чем скажем Паскаль, к соответствию типов.
Вязыке С считается, что все арифметические операции выполняются
сдвойной точностью. Поэтому всякий раз, когда в выражении появляются значение с плавающей точкой, его «удлиняют» до удвоенной точности, добавляя к дробной части нули. При преобразовании значения с двойной точностью к одинарной, например, при присваивании, прежде чем отбросить лишни для обычной точности разряды, происходит округление.
56
Кроме автоматических преобразований типов, существуют явные преобразования типов. Синтаксис использования явного преобразования типов имеет две различные формы:
(имя_типа) операнд
или
имя_типа (операнд).
Во второй форме не может использоваться составное наименование типа (например, unsigned short). Как и при автоматическом преобразовании типов, ответственность за сохранение значения и точности результата лежит на разработчике программы.
Пример pr2 демонстрирует, какие последствия можно иметь от преобразования типов:
//Пример pr2 #include <stdio.h> #include <conio.h> void main ()
{
long a=123456789; float b; int result1, result2; result1=1.6+1.7;
result2 = (int)1.6+(int)1.7; printf("\nresult1=%d»,result1);//Печатает result1=3 printf("\nresult2=%d»,result2);//Печатает result2=2 b = (float)a;
printf ("\n a=%ld»,a); //Печатает a=123456789 printf ("\n b=%e»,b); //Печатает b=1.2345689e+08 a = (long)b;
printf ("\n a=%ld»,a); //Печатает a=123456792 b = 2.222222e+2;
result1 = (int)b;
printf ("\n b=%f», b); //Печатает b=222.222198 printf("\nresult1=%d»,result1);//Печатает result1=222 b = (float)result1;
printf ("\n b=%f», b); //Печатает result1=222.000000 getch();
}
Кроме классической записи оператора присваивания, в языке С++ используются операции увеличения ++ и уменьшения --. Операция увеличения увеличивает свой операнд на 1, а операция уменьшения уменьшает свой операнд на 1. Существует две формы этих операций: постфиксная и префиксная. Разница между ними заключается в том, что они показывают, в какой момент осуществляется увеличение или уменьшение операнда:
x++, x-- постфиксная запись;
57
++x, --x префиксная запись.
Вданных примерах форма записи никак не отражается на результате,
апример pr3 иллюстрирует разницу:
//Пример pr3 #include <stdio.h> #include <conio.h> void main()
{
int a, b, x; x = 0;
a = 5+x++; b = 5+ ++x;
printf ("a = %d\n b = %d», a, b); getch();
}
Результатом работы этой программы будет вывод значений: a = 5
b = 7
При вычислении а к числу 5 добавляется х равное нулю, а потом х увеличивается на единицу. При вычислении b сначала х увеличивается на 1 и становится равным 2, а затем значение х добавляется к числу 5.
В операторах присваивания можно использовать укороченную форму записи, например, запись a+=5 эквивалентна записи a=a+5:
//Пример pr4 #include <stdio.h> #include <conio.h> void main ()
{
float a, b, x; a = b = x = 1;
a+ = 5; //Эквивалентно a = a+5
b/ = 5+x; //Эквивалентно b = b/(5+x) printf ("\na=%f\n b=%f», a, b);
a- = 5; //Эквивалентно a = a-5
b* = 5+x; //Эквивалентно b = b*(5+x) printf ("\n a = %f\n b = %f», a, b); getch();
}
Применение укороченной формы записи в операторах присваивания с небольшими выражениями делает их более «прозрачными», а операторы со сложными выражениями становятся более запутанными. Поэтому рекомендуется использовать эту возможность осторожно.
58