Теория к лабораторной работе 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 – это два разных имени.

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

Простые типы данных языка Си

Переменной выделяется ячейка оперативной памяти. В этой ячейке хранится значение. Доступ к значению ячейки по имени переменной. Размер ячейки определяет тип переменной.

Тип определяет:

  1. Размер выделяемой ячейки памяти.
  2. Формат внутреннего представления значения.
  3. Набор операций над значениями этого типа.
  4. Способы изображения констант этого типа.


Простые типы языка С.

Целый тип – определяет множество целых чисел.

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

Имя типа Объем памяти (байт) Внутреннее представление Диапазон значений
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)

Упражнения

  1. Определить порядок выполнения операций в выражении

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)

Тип выражения

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

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

Правила определения типа выражения.

  1. Если все операнды в выражении целого типа, то выражению присваивается тип – целый. Формат хранения в памяти определяется типом старшего операнда. Старший тип тот, множество значений которого больше.

Примеры определения типа выражения

Пусть определены переменные

int x;

short y;

long z;

char a;

Выражение x+y+z целого типа и формат хранения int.

Выражение x/y целого типа и формат хранения int.

Выражение y/a целого типа и формат хранения short.

  1. Если в выражении все операнды вещественного типа, то тип выражения вещественный и формат хранения double.

Пример определения типа выражения

Пусть переменна имеет тип float

float y=123.75;

Выражение у/2.0 вещественного типа и формат хранения double.

  1. Если в выражении хотя бы один операнд вещественного типа, то выражение имеет тип вещественный и формат хранения 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”) – остановка выполнения программы

Примеры записи выражений с использованием функций

Математическая запись Запись на Си
Теория к лабораторной работе 2 - student2.ru Для целых (abs(x)+abs(y))/2 Для вещественных типа double: (fabs(x)+fabs(y))/2
Теория к лабораторной работе 2 - student2.ru Теория к лабораторной работе 2 - student2.ru sqrt(x*x + y*y)
1+log10X 1+log10(x)
Теория к лабораторной работе 2 - student2.ru Pow(x, -3)+pow(x,-10)+ cos(z)

Пример программы вычисления значения выражения Теория к лабораторной работе 2 - student2.ru

#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;

}

Результат

Теория к лабораторной работе 2 - student2.ru

б) Инкремент префиксный

формат

++<имя переменной>

Действие: сначала увеличение значения переменной на 1, а затем используется ее новое значение

int _tmain(int argc, _TCHAR* argv[])

{

double x=123.456;

setlocale(LC_ALL, "rus");

int a=10;

cout<<"Зачение переменной="<<++a<<"\nЗначение переменной после префиксного инкремента="<<a;

}

Теория к лабораторной работе 2 - student2.ru

в) Декремент постфиксный

формат

<имя переменной>--

Действие: используется текущее значение переменной, а затем ее значение уменьшается на 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

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

Программа – это последовательность предложений, описывающих вычислительный процесс, на определенном языке программирования.

Язык программирования – это система правил для записи компьютерных программ. Имеет:

· Алфавит – набор символов для записи слов.

· Синтаксис – набор правил для построения предложений программы (операторов).

· Семантику – совокупность правил по истолкованию языковых конструкций.

Наши рекомендации