Ntfs


Сжатие файлов, папок и программ позволяет сократить их размер и уменьшить объем пространства, занимаемого ими на дисках или устройствах со съемными носителями. Сжатие диска приводит к уменьшению объема пространства, занимаемого всеми файлами и папками на этом диске.

Windows поддерживает два типа сжатия: Сжатие NTFS и сжатие путем создания сжатых ZIP-папоk


Арифметические операции с указателями. Операции сравнения указателей



Название Знак Пояснение

Присваивание = Присвоить указателю адрес переменной или 0

Инкремент ++ Увеличить указатель на целое значение (на след. элемент массива)

Декремент -- Уменьшить указатель на целое значение (на пред. элемент массива)

Сложение + Увеличить указатель на целое значение и присвоить другому указателю

Сложение с замещением += Увеличить существующий указатель на целое значение

Вычитание – Уменьшить указатель на целое значение или на значение другого

указателя, если оба указывают на один и тот же массив, и присвоить

третьему указателю.

Вычитание с замещением – Уменьшить указатель на целое значение или на значение другого

указателя, если оба указывают на один и тот же массив.

Отношения == !=

< <=

> >= Сравнение указателей – истина или ложь


Указатели и строки


Строки интерпретируются как обычные массивы с размером каждого элемента в 1 символ (1 байт). Имя строки – это адрес. Длина строки – до 0-символа

Вывод такого же строкового массива:

char s[10] = "irina";

char *p = s;

while (*p) // очень удобно – до

cout << *(p++) << endl;

i

r

i

n

a



Но если убрать разыменование:



char s[10] = "irina";

char *p = s;

while (*p)cout << p++ << endl;

irina

rina

ina

na

a


Основные этапы и лексемы решения задач на языке СИ

. Основные элементы программирования
Большинство программ предназначено для решения прикладных задач. В программах это выполняется путем обработки информации. Для решения задачи программа должна выполнить следующие действия:
- ввести информацию в программу;
- запомнить введенную информацию;
- задать команды для обработки информации;
- передать информацию из программы пользователю,
Команды в программе должны быть организованы таким образом, чтобы:
- некоторые из них выполнялись только при истинном значении заданного условия (или набора условий);
- другие команды выполнялись многократно;
- отдельные команды разделены на части, и выполняемые из разных участков программы.
Итак, из выше описанных действий можно выделить семь основных элементов программирования: ввод, типы данных, операции, вывод, условное выполнение, циклы и подпрограммы ( функции для языка Си).
Синтаксис языка C
Есть шесть классов лексем: идентификаторы, ключевые слова, константы, строки, операторы и разделители.
Идентификаторы: последовательность букв и цифр произвольной длины. Первый символ-буква, например, NAME1, name 1, Name 1, name_1…
Ключевые слова: Они зарезервированы для языка и не могут использоваться другим образом. Список ключевых слов языка представлен в табл.
Ключевые слова языка
Типы данных Операторы
Eng Рус Eng Рус
Сhar Символ Asm
Class Класс Break Прерывание
Double Двойной Case Выбор
Enum Перечень Continue Продолжение
Float Плавающий Default По молчанию
Int Целый Delete Удалять
Long Длинное целое Do Делать
Short Короткое целое Else Иначе
Struct Структура For Для
Union Объединение Go to Идти (переход)
Unsigned Беззнаковый If Если
Void Пустой New Новый
Return Возврат Switch Прерывать
Extern Внешняя Inline В линию
Register Регистр Const Постоянный
Overload Переопределение Typedef Тип переменной
Auto Автоматически While Пока
Static Статический Public Открытый
Константы
Константа - значение, которое не можетбыть изменено. Пять типов констант:
–символы (символ - лексема, которая состоит изизображения символа и ограничивающихапострофов), например, 'А', 'а', 'В', '8', '0','+', ';'
–константы перечисляемого типа,
–вещественные числа,
–целые числа,
–нулевой указатель ("null-указатель")
Строки.
Строка – это последовательность символов, заключенная в двойные кавычки “…”. Строка имеет тип char, а класс памяти static. Она инициализируется заданными символами. Все строки, даже если они занесены одинаково, различны. Компилятор располагает в конце каждой строки нулевой (пустой) байт O с тем, чтобы сканирующая строку программа могла найти ее конец. В строке перед символом двойной кавычки должна стоять обязательно . Кроме того, могут использоваться те же обозначения, что были описаны для символьных констант. Примеры: “Это строковая константа”, “A”
Разделители
Разделители с C++ имеют синтаксическое и семантическое значение.
! % ^ & * ( ) - + = { } | ~ [ ] ; ' : " < > ? , . / #

2. Динамические массивы
Динамическим считается массив, который способен в любой момент изменять свой размер. Эта возможность обеспечивается за счет динамического выделения памяти под массив. При этом удобно создать класс, который является оболочкой для данного массива, отвечает за выделение и освобождение памяти под массив, а также обеспечивает доступ к элементам массива.
Когда пользователь создает объект класса-оболочки, конструктор класса выделяет память под массив, который имеет либо указанный пользователем размер, либо размер, заданный по умолчанию. Если по мере заполнения массива вся выделенная память окажется занятой, то при добавлении очередного элемента выделенная ранее память освобождается, все хранящиеся в массиве значения сохраняются во временном массиве. Затем выделяется память под массив большего размера и в него помещаются сохраненные значения. Таким образом, изменение размера массива происходит автоматически, невидимо для пользователя.

В настоящее время практически отпала необходимость использовать подобные динамические массивы, поскольку такие структуры данных, называемые контейнерами, в большом ассортименте представлены в стандартной библиотеке шаблонов С++ - Standard template library (STL), которая поддерживается практически всеми компиляторами. Наиболее типичным примером является класс vector, который содержит все необходимые функции и итераторы. Также полезными являются такие классы-контейнеры, как map, multymap,queue, deque, list, set, multyset.
Краткое описание:
map - ассоциативный массив, который содержит пары "ключ - значение", обеспечивает доступ к значению по ключу.
multymap -ассоциативный массив, в котором могут встречаться одинаковые по значению ключи.
queue - очередь, т.е. массив, организованный по принципу FIFO ("first in first out")
deque - очень напоминает vector; также как и vector поддерживает произвольный доступ к элементам, но не поддерживает некоторые функции, которые присутствуют в классе vector.
list - список, которые не поддерживает доступ к элементу по индексу; вместо этого осуществляется поиск элемента по значению.
set - множество (или простой ассоциативный массив), которое отличается от ассоциативного массива тем, что в нем ключ является одновременно и значением (имеет интерфейс, напоминающий интерфейс map, что позволяет безболезненно их чередовать)
multyset - множество, в котором могут встречаться одинаковые по значению ключи.
#include <vector>
std::vector
#include <map>
std::map
#include <list>
std::list
#include <set>
std::set
также malloc/calloc/realloc/free


Стандартные математические функции.

Стандартные математические функции
В языке Си для математических вычислений используются стандартные математические функции,
double cos(double x); - косинус;
double sin(double x); - синус;
double tan(x) - тангенс;
Возвращает синус, косинус или тангенс угла. Величина угла должна быть задана в радианах
double asin(duble x); - арксинус;
double atan(duble x); - арктангенс;
double acos(double x); - арккосинус;
Возвращает выраженную в радианах величину угла, косинус, синус или тангенс которого передан соответствующей функции в качестве аргумента. Аргумент функции должен находиться в диапазоне от -1 до 1.
double log(double x); - логарифм натуральный;
double sqrt(double x); - корень квадратный;
double floor(double x); - ближайшее меньшее целое;
double ceil(double x); - ближайшее большее целое;
int abs(int i); - модуль целого числа;
Возвращает целое (abs) или дробное (fabs) абсолютное значение аргумента, в качестве которого можно использовать выражение соответствующего типа.
double fabs(duble x); - модуль числа с плавающей точкой;
srand (seed) int seed; - инициализация генератора случайных чисел <ГСЧ)
rand() и int rand( ); - ГСЧ;
long int tirae(p), longint p - время в секундах, отсчитываемое от '1:01.1970 г. (0.00 по Гринвичу).
delay(t); - задержка во времени на t микросекунд; (9)
double pow (double x, double у) и
long double pow (long double x, long double у) - возвращает значение, равное ху.
double exp(double x) и long double exp (long double x) - возвращает значение ехр(х).
2Динамическое распределение памяти. Оператор Sizeof.
оперделение размера выделяемой памяти.
С помощью этой операции можно определить в байтах размер памяти, которая соответствует идентификатору или типа. Выражение с операцией sizeof имеет следующий формат
sizeof (выражение)
Выражение – это либо идентификатор, либо имя типа, заключенной в круглые скобки. Идентификатор не может относиться к полю битов или быть именем функции. Если имя типа описывает массив, то результатом является размер всего массива, а не размер указателя, соответстующий имени массива.
#include <stdio.h>
#include <conio.h>
void main (void)
{
float mas[100];
clrscr();
printf (“Размер одного элемента массива в байтах %d”, sizeof (mas [20]));
printf (“Размер массива в байтах %d”, sizeof (mas));
getch();
}
Результат выполнения программы
Размер одного элемента в байтах – 4 байта
Размер всего массива – 300 байт
Динамическое выделение памяти
Язык Си позволяет выделять память динамически, то есть во время работы программы. Как было показано ранее, по области видимости переменные могут быть глобальными и локальными. Для глобальных переменных отводится фиксированная часть памяти на все время работы программы. Локальные переменные хранятся в стеке. Между ними находится область свободной памяти для динамического распределения во время работы программы. Наиболее важными функциями распределения памяти являются malloc() и free(). Прототипы этих функции хранятся в заголовочном файле alloc.h Выделение памяти размером size байт осуществляется функцией malloc(). Функция malloc() возвращает указатель на первый байт выделенного блока памят либо NULL, если нет места. free() тоже самое только наоборот.



Переменные, константы, строки

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

Определение переменных
Каждая переменная перед ее использованием в программе должна быть определена. При определении для переменной выделяется память. Размер участка памяти, выделяемой для переменной, и интерпретация содержимого зависят от типа, указанного в определении переменной.
Форма определения переменных:
Тип <список имен переменных>;
Здесь
Тип – спецификатор типа,
<список имен переменных> - идентификаторы имен переменных(возможно с инициализацией), разделенные запятыми.
Инициализация означает, что переменной присваивается некоторое значение в соответствии с определением.

Примеры определения переменных
char symbol, ее;
unsigned char code;
int number, row;
unsigned long long_number;
float x, X, ссЗ=5.6, pot_8;
double e, Stop, B4;
float pi=3.1415, сс=1.23;
unsigned int year=1997;

Константы
Константа - значение, которое не может быть изменено.
Пять типов констант:
–символы (символ - лексема, которая состоит из изображения символа и ограничивающих апострофов), например, 'А', 'а', 'В', '8', '0','+', ';'
–константы перечисляемого типа,
–вещественные числа,
–целые числа,
–нулевой указатель ("null-указатель")

Константы целые
Десятичные целые определены как последовательности десятичных цифр, начинающиеся не с нуля (если это не число нуль), например, 44 684 0 1024.
Последовательность цифр, начинающаяся с 0 и не содержащая десятичных цифр старше 7,воспринимается как восьмеричная константа, например, 016 .
Последовательность шестнадцатеричных цифр (О, 1,...,9 ,А, В, С, D, Е, F), перед которой записаны символы 0хили 0Х, считается шестнадцатеричной константой, например, 0x16, OXFF -

Вещественные константы
Каждая вещественная константа состоит из следующих частей:
целая часть (десятичная целая константа);
десятичная точка;
дробная часть (десятичная целая константа);
признак показателя "е" или "Е";
показатель десятичной степени (десятичная целая константа, возможно, со знаком). При записи констант с плавающей точкой могут опускаться целая или дробная часть (но не одновременно); десятичная точка или символ экспоненты с показателем степени (но не одновременно).Примеры констант с плавающей точкой:
44. 3.14159 44е0 .314159Е1 0.0
Константы перечисляемого типа
-Целочисленные именованные константы можно вводить с помощью перечисления:
-enum тип_перечисления{список_именовапных_констант};
где enum - служебное слово, вводящееперечисление;
-тип_перечисления - его название -необязательный произвольный идентификатор;
-список_именованных_констант - разделеннаязапятыми последовательность идентификаторов или именованных констант вида: имякопстанты=значение константы
Примеры констант перечисляемого типа
enum {ONE=1, TWO, THREE, FOUR};
enum DAY {SUNDAY, MONDAY, TUESDAY,WEDNESDAY, THURSDAY, FRIDAY, SATURDAY);enum BOOLEAN {NO, YES};Замечание. Если в списке нет ни одного элемента со знаком '=', то значения констант начинаются с 0и увеличиваются на 1 слева направо. Таким образом, NO равно 0, YES равно 1, SUNDAY имеет значение 0 и FRIDAY имеет значение 5.
Строковые константы
Строковая константа определяется как последовательность символов (включая эскейп-последовательности), заключенная в двойные кавычки. Например:
"Образец строки"
или
"
Текст
разместится
в 3-х строках дисплея"
Определение именованных констант
Три способа определения именованных констант
с помощью enum;
const тип имя_константы=значение_константы;
const double Е=2.718282;
const long М=99999999;
const P=765;
#define имя_константы значение_константы
#define EULER 2.718282
Препроцессор заменит текст
double mix = EULER; d = alfa*EULER;
на
double mix = 2.718282; d = alfa*2.718282;
Строки.
Строка – это последовательность символов, заключенная в двойные кавычки “…”. Строка имеет тип char, а класс памяти static. Она инициализируется заданными символами. Все строки, даже если они занесены одинаково, различны. Компилятор располагает в конце каждой строки нулевой (пустой) байт O с тем, чтобы сканирующая строку программа могла найти ее конец. В строке перед символом двойной кавычки должна стоять обязательно . Кроме того, могут использоваться те же обозначения, что были описаны для символьных констант.
Примеры:
“Это строковая константа”
“A”

2. Организация работы с файлами: Открытие и закрытие.
Организация работы с файлами
Язык Си, кроме стандартного ввода данных с клавиатуры и вывода результатов на экран, предоставляет также возможность обмена при операциях ввода/вывода с внешними устройствами, в том числе, с файлами на диске.
В Си не предусмотрены никакие предопределенные структуры файлов (такие как последовательного или прямого доступа). Все файлы рассматриваются как последовательности, потоки байтов.
Поток- это источник или приемник данных. Его можно связать с каким- либо внешним устройством, например, с принтером, клавиатурой, диском и т.д.
В языке Си определены два вида потоков: текстовый и бинарный.
Текстовый поток - это последовательность строк. Каждая строка содержит нуль и более символов и обязательно заканчивается символом – терминатором новая строка '
'.
Бинарный или двоичный поток - это последовательность двоичных кодов (байтов), как правило, используемая для запоминания кодов машинного языка.
Когда программа начинает работу, то автоматически открываются три потока: stdin, stdout, stderr.
STDIN –стандартный входной поток (по умолчанию связан с клавиатурой).
STDOUT – стандартный выходной поток (по умолчанию связан с экраном монитора).
STDERR – поток стандартных ошибок (связан с экраном монитора).


Открытие файла
Для того, чтобы связать программу с файлом на диске, необходимо определить в программе переменную типа указатель на файл: FILE *fp;
где FILE – это структура, определённая в <stdio.h> с помощью средства typedef и содержащая некоторую информацию о файле.
После того, как указатель на файл описан, его можно связать с конкретным файлом в момент открытия данного файла. Открыть файл можно с помощью следующей конструкции:
fp = fopen (“ имя_ файла”, “ режим_ доступа”);
Константы в круглых скобках имеют следующий смысл:
имя_файла – это параметр, характеризующий имя и тип используемого файла на диске, например, “test.txt”;
режим доступа – это параметр, характеризующий как должен использоваться данный файл. Этот параметр может принимать следующие значения:
’r’ -файл открывается для чтения (файл должен существовать на диске);
’w’ - файл открывается для записи; если файла с указанным именем нет, то он создаётся; если файл существует, то старое содержимое файла уничтожается;
’а’ - файл открывается, либо создаётся для дозаписи в конец файла;
’r+’ – файл открывается для чтения и записи (файл должен существовать).
’w+’ – файл открывается для чтения и записи; старое содержимое, если файл существовал, теряется.
’а+’ – файл открывается, либо создаётся для чтения уже существующей информации и добавления новой в конец файла.
Обычно по умолчанию файл считается текстовым, однако можно явно указать с каким файлом будет работать программа: текстовым (t) или бинарным (b), например:
r + t, w + b, at, wt +, и т. д.
Операцию открытия файла можно записать и так:
FILE *fp = fopen (‘test. txt’, ‘w’);
Теперь указатель fp будет связан с файлом на диске с именем ‘test.txt’. Во всех операциях с файлом теперь следует указывать fp.
Закрытие файла
После того, как работа с файлом закончена, его следует закрыть. Операция закрытия файла имеет вид:
fclose (имя файла), например: fclose (fp);
Так как операции с файлами осуществляются посредством промежуточной буферизации, то операция закрытия осуществляет выталкивание содержимого буфера.
Если операции закрытия файла в программе нет, то по окончанию программы все открытые файлы будут закрыты автоматически. Следует, однако, помнить, что настройка среды ограничивает число одновременно открытых файлов, поэтому следует явно определять операцию их закрытия.




Имена и типы, область видимости.

Имена и типы. Имя обозначает объект, функцию, тип, значение или метку. Имя может использоваться только внутри части текста программы, называемой его областью видимости. Имя имеет тип, определяющий его использование. Объект - это область памяти. Объект имеет класс памяти, определяющий время его жизни. Область видимости? Существует четыре ее вида: локальная, файл, программа и класс. Локальная область- имя, описанное в блоке, локально в этом блоке и может использоваться только в нем. Исключения составля¬ют метки, которые могут использоваться в любом месте функции, в которой они описаны. Файл - имя, описанное вне любого блока. Программа - имя, описанное в файле, может использоваться в любом другом файле. Класс - имя члена класса, локально для его класса и может ис¬пользоваться только в функции-члене этого класса. Область видимости - это часть текста программы, в которой может быть использован данный объект. Объект считается видимым в блоке или в исходном файле, если в этом блоке или файле известны имя и тип объекта. Объект может быть видимым в пределах блока, исходного файла или во всех исходных файлах, образующих программу. Это зависит от того, на каком уровне объявлен объект: на внутреннем, т.е. внутри некоторого блока, или на внешнем, т.е. вне всех блоков. Видимость переменных и функций в программе определяется следующими правилами. 1. Переменная, объявленная или определенная глобально, видима от точки объявления или определения до конца исходного файла. Можно сделать переменную видимой и в других исходных файлах, для чего в этих файлах следует ее объявить с классом памяти extern. 2. Переменная, объявленная или определенная локально, видима от точки объявления или определения до конца текущего блока. Такая переменная называется локальной. 3. Переменные из объемлющих блоков, включая переменные объявленные на глобальном уровне, видимы во внутренних блоках. Эту видимость называют вложенной. Если переменная, объявленная внутри блока, имеет то же имя, что и переменная, объявленная в объемлющем блоке, то это разные переменные, и переменная из объемлющего блока во внутреннем блоке будет невидимой. 4. Функции с классом памяти static видимы только в исходном файле, в котором они определены. Всякие другие функции видимы во всей программе. Метки в функциях видимы на протяжении всей функции. Имена формальных параметров, объявленные в списке параметров прототипа функции, видимы только от точки объявления параметра до конца объявления функции.
2 Назначение и синтаксис функций malloc() и calloc().
Malloc()
Функция Выделяет память.
Синтаксис #include<stdlib.h> #include<alloc.h> void *malloc(size_t size);
Файл, содержащий stdlib.h и alloc.h прототип Описание: Функция обеспечивают выделение блока памяти, размером size байт. Она позволяет программе выделять память по необходимости и столько, сколько нужно. Динамическая область памяти доступна для динамического размещения блоков памяти переменной длины. Многие структуры данных, такие как "деревья" или "списки" - естественным образом используют динамическое распределение памяти. В малых моделях памяти, вся область памяти между концом сегмента данных и вершиной программного стека доступна для использования, за исключением 256-байтовой границы, находящейся непосредственно перед вершиной стека. Данная граница предназначена для наращивания стека прикладной программы (плюс небольшое количество, требуемое для DOS). В больших моделях памяти все пространство после программного стека до конца физической памяти доступно для динамической области. Возвращаемое значение. Функция malloc возвращает указатель на блок выде- ленной памяти. Если для размещения блока недостаточно памяти, функция malloc возвращает NULL.Содержимое блока остается неизменным. Если аргумент size равен 0, то функция возвращает NULL. Переносимость. Функция доступна в системах UNIX и поддерживается стандартом ANSI C.
Calloc()
Функция - Выделяет оперативную память.
Синтаксис #include <stdlib.h>
void * calloc(size_t nitems, size_t size);
Файл, содержащий прототип stdlib.h,alloc.h
Описание : calloc обеспечваеит доступ к динамической области памяти. Динамическая область памяти доступна для динамического распределения блоков памяти переменной длины. Многие структуры данных, например, деревья и списки, используют распределение динамической области памяти. Все пространство памяти между концом сегмента данных и верхушкой программного стека доступно для использования в моделях памяти small (tiny, small, medium), кроме небольшой области в самой верхней части стека. Это пространство необходимо для роста стека прикладной программы и плюс небольшая часть, используемая DOS. В моделях памяти типа large (compact, large, huge) все пространство за границей программного стека до конца физической памяти доступно для динамической области памяти.
Блок обнуляется. Если вы хотите выделить блок, размер которого превышает 64К то нужно использовать функцию farcalloc.
Возвращаемое значение - calloc возвращает указатель на выделенный блок. calloc возвращает NULL, если недостаочно памяти для выделения нового блока, или nitems или size равны 0.
Переносимость - Поддерживается в системах UNIX и определена в ANSI C.
Стек (англ. stack — стопка) — структура данных с методом доступа к элементам LIFO (англ. Last In — First Out, «последним пришел — первым вышел»). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.

shpora.net