Теория к лабораторной работе 2
Теория к лабораторной работе 2
Программирование это процесс подготовки задачи для решения средствами вычислительной техники.
Программа – это последовательность предложений, описывающих вычислительный процесс, на определенном языке программирования.
Язык программирования – это система правил для записи компьютерных программ. Имеет:
· Алфавит – набор символов для записи слов.
· Синтаксис – набор правил для построения предложений программы (операторов).
· Семантику – совокупность правил по истолкованию языковых конструкций.
Структура программы языка Си
Разработанный в начале 1970-х годов сотрудниками компании Bell Labs: Денис Ритчи и Брайан Керниган специально для разработки операционной системы Unix.
1.1. Алфавит языка Си включает:
- буквы: строчные, прописные буквы латинского алфавита (a...z, A...Z) и символ подчеркивания _ (строчные и прописные буквы различаются)
- цифры (0...9)
- специальные знаки: . , ; + - * / = < > % & ! ( ) { } ^ | ? : [ ] ^ ~' " # \
- ключевые слова: char, short, int, long, float, double, enum, struct, union, signed, unsigned, void, auto, extern, register, static, break, case, continue, default, do, else, for, goto, if, return, switch, while, sizeof, typedef.
Ключевые слова— это слова, используемые компилятором, по ним он распознает операторы и другие конструкции языка. Их нельзя использовать в программе в другом качестве.
Простейшей конструкцией является идентификатор. Идентификатор — это последовательность букв латинского алфавита (включая символ подчеркивания) и цифр, которая обязательно начинается с буквы. Идентификаторы используются как имена переменных, функций и типов данных. Идентификатор может быть произвольной длины, но в некоторых ЭВМ не все символы учитываются компилятором и загрузчиком.
Примеры идентификаторов.
Lab1, example_1, lab_12, count, temp.
Идентификаторы: lab1 и Lab1 – это два разных имени.
Описательные (наглядные) имена программных объектов (имена переменных, функций и типов данных) могут значительно улучшить понятность вашей программы и облегчить процесс отладки и модификации программы. Короткие имена переменных не ускорят выполнение программы.
Простые типы данных языка Си
Переменной выделяется ячейка оперативной памяти. В этой ячейке хранится значение. Доступ к значению ячейки по имени переменной. Размер ячейки определяет тип переменной.
Тип определяет:
- Размер выделяемой ячейки памяти.
- Формат внутреннего представления значения.
- Набор операций над значениями этого типа.
- Способы изображения констант этого типа.
Простые типы языка С.
Целый тип – определяет множество целых чисел.
Для определения переменных, которые хранят целые числа, используются:
Имя типа | Объем памяти (байт) | Внутреннее представление | Диапазон значений |
int | Целое со знаком | -231××××231-1 | |
short | Целое со знаком | -215××××215-1 | |
long | Целое со знаком | -231××××231-1 | |
char | Целое со знаком | -27××××27-1 | |
unsigned int | Целое без знака | 0××××232-1 | |
unsigned short | Целое без знака | 0××××216-1 | |
unsigned long | Целое без знака | 0×××232-1 | |
unsigned char | Целое без знака | 0×××28-1 |
Пример определения переменных.
int a, b=-3, c=4;
short x=-2;
char y=65, y1=’A’;
unsigned int z=123;
Переменным a, b, c будут выделены ячейки размером 4 байта. Переменной x будет выделена ячейка размером 2 байта, переменной y выделяется ячейка размером 1 байт и хранит код символа, переменной y1 выделяется ячейка размером 1 байт и тоже для хранения символьного значения (кода символа), переменной z выделяется ячейка размером 4 байта и хранит значение в формате без знака.
4.1. Изображение констант целого типа
- в десятичной системе счисления
-123 123 78
- в восьмеричной системе счисления (константе предшествует цифра нуль)
057 0347 -078
- в шестнадцатеричной системе счисления (константе предшествует цифра нуль и символ х)
0хА7 0ХАА 0хFF
По виду константы компилятор определяет ее тип, т.е. размер ячейки.
Примеры констант и их тип.
Константа 123 входит в диапазон типа unsigned char, поэтому ее тип unsigned char, константа 0хFFFF занимает в памяти 2 байта, без знака, значит ее тип unsigned short.
Чтобы явно указать в программе тип константы используют следующее правило: справа от значения приписывают суффикс:
5l – 5 в формате long
78L – 78 в формате long
897UL – в формате unsigned long
897ul – в формате unsigned long
Самостоятельно. Определите системы счисления, в которых изображены константы и тип константы 128L, 0105L, OX2A11L.
Вещественный тип данных
Используется для определения переменных, значениями которых должны быть дробные числа.
Таблица вещественных типов
Имя типа | Объем памяти | Внутреннее представление | Размер мантиссы | Размер порядка | Диапазон и точность |
float | 4 байта (32 бита) | С плавающей точкой | 23 бита – мантисса; 1 бит – знак. | 8 бит – порядок; | ±3.4Е±38 Точность до 7 знаков после запятой |
Double (с двойной точностью) | 8 байт (64 бита) | С плавающей точкой | 52 бита – мантисса 1 бит – знак | 11 бит – порядок | ±1.7Е±308 Точность до 17 знаков после запятой |
Long double | 8 байт (64 бита) | С плавающей точкой | ±3,4E±4932 |
Выражения
Вычисляемое выражение состоит из операндов , соединенных знаками операций.
Знак операции – это символ или группа символов, сообщающих компилятору о необходимости выполнения арифметических, логических или других действий.
Операнд – это константа, идентификатор, вызов функции, индексное выражение, выражение выбора элемента.
Комбинацию операндов можно также рассматривать как операнд.
В простейшем случае операнд - это переменная или константа.
При вычислении выражения операции выполняются в строгой последовательности, определяемой их приоритетом.
Порядок выполнения операций может регулироваться с помощью круглых скобок.
Операции с более высоким приоритетом выполняются до операций с более низким рангом, если часть выражения заключена в скобки, то вначале вычисляется выражение внутри скобок.
Виды выражений
· Первичные(вызовы функций, индексные выражения и выбор элементов);
sin(x); x[10];
· Унарные (с одним операндом);
-x; &b; !t; *ptr
· Бинарные (с двумя операндами);
A+b;
· Тернарные (с тремя операндами);
x>y:x?y
· Выражения присваивания;
X=10; A=b=c=5
· Выражения приведения типа.
int(7.0/2)
Упражнения
- Определить порядок выполнения операций в выражении
a) x-y*5/3-y+(2+a*b/c)
b) x<<2+y>>3*4
c) –x*5/(3+x*y)
d) x+y=sin(x)+cos(y)
Тип выражения
Так как выражение предназначено для вычисления значения, то по правилам языка программирования это значение должно иметь тип, чтобы сообщить компилятору о формате хранения. Поэтому существуют правила определения типа выражения.
При вычислении значения выражения все промежуточные значения последовательно сохраняются в памяти, специально выделенной для выражения. Эта память должна иметь формат, соответствующий типу выражения.
Правила определения типа выражения.
- Если все операнды в выражении целого типа, то выражению присваивается тип – целый. Формат хранения в памяти определяется типом старшего операнда. Старший тип тот, множество значений которого больше.
Примеры определения типа выражения
Пусть определены переменные
int x;
short y;
long z;
char a;
Выражение x+y+z целого типа и формат хранения int.
Выражение x/y целого типа и формат хранения int.
Выражение y/a целого типа и формат хранения short.
- Если в выражении все операнды вещественного типа, то тип выражения вещественный и формат хранения double.
Пример определения типа выражения
Пусть переменна имеет тип float
float y=123.75;
Выражение у/2.0 вещественного типа и формат хранения double.
- Если в выражении хотя бы один операнд вещественного типа, то выражение имеет тип вещественный и формат хранения double.
Пусть переменная имеет целый тип, а делитель вещественного типа
int x=13,y=5;
Выражение y+x/2.0 имеет вещественный тип double.
Упражнения
1) Определите тип выражения
Выражение | Тип |
2+1e3 | |
2.0*5/3 | |
5%10*2 | |
2.0+5/2 |
2) Вычислите значение выражения
123%100/10
3)5<<2%4*3
Функции библиотеки stdlib.h
Математ. функция | Вызов функции | Тип аргумента | Тип результата функции | Краткое описание | Пример |
|x| | abs(x) | int | int | нахождение абсолютного значения выражения типа int | abs(-5) результат 5 |
|x| | labs(x) | lоng | lоng | нахождение абсолютного значения типа long | long x=-12345; long y=labs(x); |
exit | Прерывает выполнение программы | ||||
atof(s) | s -строка | double | Преобразует строку в вещественное число | ||
atol(s) | s -строка | long | Преобразует строку в целое число типа long | ||
atoi(s) | s - строка | int | Преобразует строку в целое число типа int | ||
ldiv(x,y) | long x,y; | Структура с двумя полями типа long | Деление с остатком Структура, содержащая целую часть и остаток при делении х на у. | ||
div(x,y) | int x,y; | Структура с двумя полями типа long | Деление с остатком. Структура, содержащая целую часть и остаток при делении х на у. | ||
qsort(x, n, int (compare)(void* a, void* b)) | Х – массив любого типа; int n; количество элементов; compare – функция сравнивает значения переменных а и b | Сортирует массив Х | |||
rand() | int | Возвращает число в диапазоне от 0 до Rand_Max | |||
srand( x) | int x; | void | Устанавливает начальное число в последовательности псевдослучайных чисел | srand( 10); int x=rand(); | |
system(s) | Выполнение командным процессором ОС программы или утилиты согласно параметру s | System(“PAUSE”) – остановка выполнения программы |
Примеры записи выражений с использованием функций
Математическая запись | Запись на Си |
Для целых (abs(x)+abs(y))/2 Для вещественных типа double: (fabs(x)+fabs(y))/2 | |
sqrt(x*x + y*y) | |
1+log10X | 1+log10(x) |
Pow(x, -3)+pow(x,-10)+ cos(z) |
Пример программы вычисления значения выражения
#include "stdafx.h"
#include "math.h"
#include "stdio.h"
int main()
{
double x, y, z;
printf("Введите х=");
scanf("%lf", &x);
printf("Введите y=");
scanf("%lf", &y);
z=(abs(x)+abs(y))/2;
printf(" Результат = %f", z);
getchar();getchar();
}
Операция присваивания
Предназначена для присваивания переменной нового значения.
Инкремент и декремент
а) Инкремент постфиксный
формат
<имя переменной>++
Действие: использование текущего значения переменной, а после этого увеличение значения переменной на 1.
#include "stdafx.h"
#include "iostream"
#include "locale.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "rus");
int a=10;
cout<<"Текущее значение переменной="<<a++<<"\nЗначение переменной после постфиксного инкремента="<<a;
getchar(); getchar();
return 0;
}
Результат
б) Инкремент префиксный
формат
++<имя переменной>
Действие: сначала увеличение значения переменной на 1, а затем используется ее новое значение
int _tmain(int argc, _TCHAR* argv[])
{
double x=123.456;
setlocale(LC_ALL, "rus");
int a=10;
cout<<"Зачение переменной="<<++a<<"\nЗначение переменной после префиксного инкремента="<<a;
}
в) Декремент постфиксный
формат
<имя переменной>--
Действие: используется текущее значение переменной, а затем ее значение уменьшается на 1.
г) Декремент префиксный
формат
<имя переменной>--
Действие: сначала уменьшается значение переменной на 1, а затем ее значение используется в выражении.
8. Поразрядные операции в С++
Могут применяться только к данным в формате целого без знака
1. Сдвиг влево двоичного кода (умножение на 2)
формат операции
x<<n
где х - значение, код которого должен быть изменен
n – Количество разрядов, на который должен быть сдвинут код
Пример. Сдвиг влево двоичного кода числа 5 на два разряда.
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int x=5, n=2;
x=x<<n;
cout<<x; //результат 20
cin.get();
return 0;
}
2. Сдвиг вправо двоичного кода (деление на 2)
формат операции
x>>n
где х - значение, код которого должен быть изменен
n – Количество разрядоd, на который должен быть сдвинут код
Пример. Сдвиг влево двоичного кода числа 20 на два разряда.
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int x=20, n=2;
x=x>>n;
cout<<x; //результат 5
cin.get();
return 0;
}
3. Поразрядное сложение
Используется для установки в 1 заданного бита
Формат
X|Y
X и Y переменные одной разрядности
Таблица битового сложения
0|1=1
0|0=0
1|0=1
1|1=1
Пример установки в бит с номером 5 двоичного кода х значения 1.
Модель решения
Пусть х=1, то его двоичный код в формате одного байта 00000001
Чтобы установить пятый бит х в 1 к нему надо прибавить число с двоичным кодом 00100000 т.е. десятичное 32.
Представим решение в форме
Х : 00000001
|
32: 00100000
00100001 в десятичной системе это число 33
Реализация примера
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char x=1;
x=x|32;
cout<<x; //результат 33
cin.get();
return 0;
}
4. Поразрядное умножение
Используется для обнуления заданного бита
Формат
X & Y
Таблица битового сложения
0&1=0
0&0=0
1&0=0
1&1=1
Пример установки в бит с номером 5 двоичного кода х значения 0.
Модель решения
X: 11111111
&
Y: 11011111
X&Y= 11011111
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char x=255; // 11111111
unsigned char maska =0xEF; //239 =11101111
x=x& maska;
cout<<(int)x; //результат 239
cin.get();
return 0;
}
5. Исключающее ИЛИ (только один из операндов 1)
Используется для проверки соответствующих битов двух переменных, если они имеют разные значения, то результат 1, а если равны , то 0.
Формат
X ^ Y
Таблица битового сложения
0^ 1=1
0^ 0=0
1^ 0=1
1^ 1=0
Пример, проверить, в каких битах Х и У имеют равные хначения.
Модель решения
Z=X^Y
X | ||||||||
Y | ||||||||
Z |
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char x=255; // 11111111
unsigned char maska =0xEF; //239 =11101111
x=x& maska;
cout<<(int)x; //результат 239
cin.get();
return 0;
}
6. Инвертирование
Замена бита 0 на значение 1 и наоборот.
Применяется при проведении операций, требующих инвертирования разрядв
Формат: ~X
Пример. Создать обратный код целого числа.
Пусть Х=11011011, тогда Х=~Х. Результат: 00100100
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char x=20, n=2;
x= ~x;
cout<<(int)x; //результат 235
cin.get();
return 0;
}
Пример. Инвертирование маски перед умножением. Установить пятый бит в 0
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char x=255;
unsigned char maska =0x01; //1=00000001
x=x&(~ (maska<<4));
cout<<(int)x; //результат 239
cin.get();
return 0;
}
Самостоятельно.
1. Х=5. Установить 7 бит в 1.
2. Х=255. Установить 5 и 3 биты в 0.
3. Инвертировать 5 бит переменной х.
4. Вывести все биты значения переменной Х. Размер переменной неизвестен.
Теория к лабораторной работе 2
Программирование это процесс подготовки задачи для решения средствами вычислительной техники.
Программа – это последовательность предложений, описывающих вычислительный процесс, на определенном языке программирования.
Язык программирования – это система правил для записи компьютерных программ. Имеет:
· Алфавит – набор символов для записи слов.
· Синтаксис – набор правил для построения предложений программы (операторов).
· Семантику – совокупность правил по истолкованию языковых конструкций.