Циклы в c++
Содержание:
Строковые типы данных
Тип данных | Объем памяти | Максимальный размер | Описание |
CHAR (M) | M символов | М символов | Позволяет хранить строку фиксированной длины М. Значение М — от 0 до 65535.Примеры: CHAR (8) — хранит строки из 8 символов и занимает 8 байтов. Например, любое из следующих значений: », ‘Иван’,’Ирина’, ‘Сергей’ будет занимать по 8 байтов памяти. А при попытке ввести значение ‘Александра’, оно будет усечено до ‘Александ’, т.е. до 8 символов. |
VARCHAR (M) | L+1 символов | М символов | Позволяет хранить переменные строки длиной L. Значение М — от 0 до 65535.Примеры: VARCHAR (3) — хранит строки максимум из 3 символов, но пустая строка » занимает 1 байт памяти, строка ‘a’ — 2 байта, строк ‘aa’ — 3 байта, строка ‘aaa’ — 4 байта. Значение более 3 символов будет усечено до 3. |
BLOB, TEXT | L+2 символов | 216-1 символов | Позволяют хранить большие объемы текста. Причем тип TEXT используется для хранения именно текста, а BLOB — для хранения изображений, звука, электронных документов и т.д. |
MEDIUMBLOB, MEDIUMTEXT | L+3 символов | 224-1 символов | Аналогично предыдущему, но с большим размером. |
LONGBLOB, LONGTEXT | L+4 символов | 232-1 символов | Аналогично предыдущему, но с большим размером. |
ENUM (‘value1’, ‘value2′, …,’valueN’) | 1 или 2 байта | 65535 элементов | Строки этого типа могут принимать только одно из значений указанного множества.Пример: ENUM (‘да’, ‘нет’) — в столбце с таким типом может храниться только одно из имеющихся значений. Удобно использовать, если предусмотрено, что в столбце должен храниться ответ на вопрос. |
SET (‘value1’, ‘value2′, …,’valueN’) | до 8 байт | 64 элемента | Строки этого типа могут принимать любой или все элементы из значений указанного множества.Пример: SET (‘первый’, ‘второй’) — в столбце с таким типом может храниться одно из перечисленных значений, оба сразу или значение может отсутствовать вовсе. |
Что сейчас пишут на C++
На C++ пишут то же, что и на C — системные приложения, драйверы, операционные системы и софт для встраиваемых систем. Но благодаря ООП область применения C++ получилась немного шире, чем у С. Вот что написано на C++ :
- почти все продукты Adobe (Photoshop, Illustrator, inDesign, Acrobat и так далее);
- почти все главные продукты Microsoft (Windows, Office, IE, Visual Studio, SQL);
- большая часть MacOS (включая интерфейс Finder);
- интерфейс iPod;
- приложения Autodesk для проектировщиков;
- высоконагруженные компоненты платформы Facebook;
- поиск Google, движок Chromium;
- Havoc — реалистичный физический движок, который используется в играх;
- софт для бортовых компьютеров самолётов Lockheed (Стелс, например);
- прошивки для двигателей MAN — тягачей;
- большая часть медицинского софта компании Siemens.
А вот часть игр, которая тоже написана на C++ (или на C++ написаны движки для этих игр):
- Doom III engine;
- Football Pro;
- Kings Quest;
- Antara;
- SWAT;
- StarCraft;
- Diablo II: Lord of Destruction;
- Warcraft III;
- World of Warcraft.
World of Warcraft написан на C++
Движок Doom3 — тоже на C++ …
…как и Finder — ключевой элемент интерфейса MacOS
Инициализация полей структуры
Инициализация полей структуры может осуществляться двумя способами:
- присвоение значений элементам структуры в процессе объявления переменной, относящейся к типу структуры;
- присвоение начальных значений элементам структуры с использованием функций ввода-вывода (например, printf() и scanf()).
В первом способе инициализация осуществляется по следующей форме:
struct ИмяСтруктуры ИмяПеременной={ЗначениеЭлемента1, ЗначениеЭлемента_2, . . . , ЗначениеЭлементаn};
Пример
struct date bd={8,»июня», 1978};
ИмяПеременной.ИмяЭлементаСтруктуры
printf(«%d %s %d»,bd.day, bd.month, bd.year);
Пример
1234567891011121314151617181920212223242526272829303132
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>struct date { int day; char month; int year;};struct persone { char firstname; char lastname; struct date bd;};int main() { system(«chcp 1251»); system(«cls»); struct persone p; printf(«Введите имя : «); scanf(«%s», p.firstname); printf(«Введите фамилию : «); scanf(«%s», p.lastname); printf(«Введите дату рождения\nЧисло: «); scanf(«%d», &p.bd.day); printf(«Месяц: «); scanf(«%s», p.bd.month); printf(«Год: «); scanf(«%d», &p.bd.year); printf(«\nВы ввели : %s %s, дата рождения %d %s %d года», p.firstname, p.lastname, p.bd.day, p.bd.month, p.bd.year); getchar(); getchar(); return 0;}
Имя структурной переменной может быть указано при объявлении структуры. В этом случае оно размещается после закрывающей фигурной скобки }. Область видимости такой структурной переменной будет определяться местом описания структуры.
struct complex_type // имя структуры{ double real; double imag;} number; // имя структурной переменной
Поля приведенной структурной переменной: number.real, number.imag .
Другие подходы
Существуют и другие ОС-специфичные способы получить процессорное время. На Linux, Solarisи некоторых BSD, можно парсить /proc//stat, чтобы получить статистику процесса. На OSX, приватная функция API в возвращает информацию о процессе. Также существуют открытые библиотеки, такие как libproc, procps и Sigar.
На UNIX существует несколько утилит позволяющих отобразить процессорное время процесса, включая ps, top, mpstat и другие. Можно также использовать утилиту time, чтобы отобразить время, потраченное на команду.
На Windows, можно использовать диспетчер задач, чтобы мониторить использование CPU.
На OSX, можно использовать , чтобы мониторить использование CPU. Утилита для профайлинга Instruments поставляемая в комплекте с Xcode может мониторить использование CPU, а также много других вещей.
Примеры
Теперь несколько примеров работы с указателями
1. Пройдём по массиву и найдём все чётные элементы.
#include <conio.h> #include <stdio.h> void main() { int A = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int even; int evenCounter = 0; int *iter, *end; //iter хранит адрес первого элемента массива //end хранит адрес следующего за последним "элемента" массива for (iter = A, end = &A; iter < end; iter++) { if (*iter % 2 == 0) { even = *iter; } } //Выводим задом наперёд чётные числа for (--evenCounter; evenCounter >= 0; evenCounter--) { printf("%d ", even); } getch(); }
2. Когда мы сортируем элементы часто приходится их перемещать. Если объект занимает много места, то операция обмена местами двух элементов будет дорогостоящей. Вместо этого можно создать массив указателей на исходные элементы и отсортировать его. Так как размер указателей меньше, чем размер элементов целевого массива, то и сортировка будет происходить быстрее
Кроме того, массив не будет изменён, часто это важно.
#include <conio.h> #include <stdio.h> #define SIZE 10 void main() { double unsorted = {1.0, 3.0, 2.0, 4.0, 5.0, 6.0, 8.0, 7.0, 9.0, 0.0}; double *p; double *tmp; char flag = 1; unsigned i; printf("unsorted array\n"); for (i = 0; i < SIZE; i++) { printf("%.2f ", unsorted); } printf("\n"); //Сохраняем в массив p адреса элементов for (i = 0; i < SIZE; i++) { p = &unsorted; } do { flag = 0; for (i = 1; i<SIZE; i++) { //Сравниваем СОДЕРЖИМОЕ if (*p < *p) { //обмениваем местами АДРЕСА tmp = p; p = p; p = tmp; flag = 1; } } } while(flag); printf("sorted array of pointers\n"); for (i = 0; i < SIZE; i++) { printf("%.2f ", *p); } printf("\n"); printf("make sure that unsorted array wasn't modified\n"); for (i = 0; i < SIZE; i++) { printf("%.2f ", unsorted); } getch(); }
3. Более интересный пример. Так как размер типа char всегда равен 1 байт, то с его помощью можно реализовать операцию swap – обмена местами содержимого двух переменных.
#include <conio.h> #include <conio.h> #include <stdio.h> void main() { int length; char *p1, *p2; char tmp; float a = 5.0f; float b = 3.0f; printf("a = %.3f\n", a); printf("b = %.3f\n", b); p1 = (char*) &a; p2 = (char*) &b; //Узнаём сколько байт перемещать length = sizeof(float); while (length--) { //Обмениваем местами содержимое переменных побайтно tmp = *p1; *p1 = *p2; *p2 = tmp; //не забываем перемещаться вперёд p1++; p2++; } printf("a = %.3f\n", a); printf("b = %.3f\n", b); getch(); }
В этом примере можно поменять тип переменных a и b на double или любой другой (с соответствующим изменением вывода и вызова sizeof), всё равно мы будет обменивать местами байты двух переменных.
#include <conio.h> #include <stdio.h> void main() { char buffer; char *p; unsigned length = 0; scanf("%127s", buffer); p = buffer; while (*p != '\0') { p++; length++; } printf("length = %d", length); getch(); }
Обратите внимание на участок кода
while (*p != '\0') { p++; length++; }
его можно переписать
while (*p != 0) { p++; length++; }
while (*p) { p++; length++; }
или, убрав инкремент в условие
while (*p++) { length++; }
Q&A
Всё ещё не понятно? – пиши вопросы на ящик
Символьные константы
Символьная константа — это один символ, например: ‘z’. В качестве символьных констант также могут использоваться управляющие коды, не имеющие графического представления. При этом код управляющего символа начинается с символа ‘\’ (обратный слеш).
Код | Обозначение | Описание |
0x00 | ‘\0’ | Нуль-символ, NULL |
0x07 | ‘\a’ | Звуковой сигнал. |
0x08 | ‘\b’ | Возврат на 1 шаг (Backspace) |
0x09 | ‘\t’ | Горизонтальная табуляция (Tab) |
0x0A | ‘\n’ | Перевод строки (Enter) |
0x0B | ‘\v’ | Вертикальная табуляция (в консоли аналогична переводу строки) |
0x0C | ‘\f’ | Смена страницы |
0x0D | ‘\r’ | Возврат каретки |
Как правило, нажатие клавиши Enter генерирует сразу два управляющих символа — перевод строки (0x0A) и возврат каретки (0x0D).
Все символьные константы имеют тип char и занимают в памяти 1 байт. Значением символьной константы является числовое значение её внутреннего кода.
Основные единицы
В таблице представлены все основные единицы СИ вместе с их определениями, российскими и международными обозначениями, физическими величинами, к которым они относятся, а также с кратким обоснованием их происхождения.
Единица | Обозначение | Величина | Определение | Историческое происхождение, обоснование |
---|---|---|---|---|
Секунда | сs | Время | Величина секунды устанавливается фиксацией численного значения частоты сверхтонкого расщепления основного состояния атома цезия-133 при температуре 0 К равным в точности 9 192 631 770, когда она выражена единицей СИ с−1, что эквивалентно Гц. | Солнечные сутки разбиваются на 24 часа, каждый час разбивается на 60 минут, каждая минута разбивается на 60 секунд.Секунда — это 1⁄(24 × 60 × 60) часть солнечных суток.Современное определение принято на XIII Генеральной конференции по мерам и весам (ГКМВ) в 1967 году. |
Метр | мm | Длина | Величина метра устанавливается фиксацией численного значения скорости света в вакууме равным в точности 299 792 458, когда она выражена единицей СИ м·с−1. | 1⁄10 000 000 расстояния от экватора Земли до северного полюса на меридиане Парижа.Современное определение установлено XVII ГКМВ в 1983 г. |
Килограмм | кгkg | Масса | Величина килограмма устанавливается фиксацией численного значения постоянной Планка h равным в точности 6,626 070 15 × 10−34, когда она выражена в Дж⋅с. | Масса одного кубического дециметра (литра) чистой воды при температуре 4 °C и стандартном атмосферном давлении на уровне моря. В течение более чем двухсот лет эталоном килограмма служили материальные образцы — Архивный килограмм, затем Международный прототип килограмма. |
Ампер | АA | Сила электрического тока | Величина ампера устанавливается фиксацией численного значения элементарного заряда e равным 1,602 176 634 × 10−19, когда он выражен в кулонах. | Предыдущее определение, восходящее к изначальному: ампер есть сила не изменяющегося тока, который при прохождении по двум параллельным прямолинейным проводникам бесконечной длины и ничтожно малой площади кругового поперечного сечения, расположенным в вакууме на расстоянии 1 м один от другого, вызвал бы на каждом участке проводника длиной 1 м силу взаимодействия, равную 2⋅10−7ньютонов. |
Кельвин | КK | Термодинамическая температура | Величина кельвина устанавливается фиксацией численного значения постоянной Больцмана k равным в точности 1,380 649 × 10−23, когда она выражена в Дж/К. | В 1967—2019 годах определялся как 1/273,16 части тройной точки воды. Шкала Кельвина использует тот же шаг, что и шкала Цельсия, но 0 кельвинов — это температура абсолютного нуля, а не температура плавления льда. Согласно современному определению ноль шкалы Цельсия установлен таким образом, что температура тройной точки воды равна 0,01 °C. В итоге шкалы Цельсия и Кельвина сдвинуты на 273,15: T = T − 273,15. |
Моль | мольmol | Количество вещества | Один моль содержит ровно 6,022 140 76 × 1023 элементов. Это число — фиксированное значение постоянной Авогадро NA, выраженной в единицах моль−1, и называется числом Авогадро. | Атомный вес или молекулярный вес, деленный на постоянную молярной массы, 1 г/моль. В 1971—2019 годах определялся как количество вещества системы, содержащей столько же структурных элементов, сколько содержится атомов в углероде-12 массой 12 г. |
Кандела | кдcd | Сила света | Величина канделы устанавливается фиксацией численного значения световой эффективности монохроматического излучения частотой 540·1012 Гц равным в точности 683, когда она выражена единицей СИ м−2·кг−1·с3·кд·ср или кд·ср·Вт−1, что эквивалентно лм·Вт−1. | Сила света (англ. Candlepower, устар. Британская единица силы света), испускаемая горящей свечой.Современное определение установлено XVI ГКМВ в 1979 г. |
Наименования и обозначения основных единиц, так же как и всех других единиц СИ, пишутся маленькими буквами (например, метр и его обозначение м). У этого правила есть исключение: обозначения единиц, названных фамилиями учёных, пишутся с заглавной буквы (например, ампер обозначается символом А).
Определение
Указатель – это переменная, которая хранит адрес области памяти. Указатель, как и переменная, имеет тип.
Синтаксис объявления указателей
<тип> *<имя>;
Например
Два основных оператора для работы с указателями – это оператор & взятия адреса, и оператор * разыменования. Рассмотрим простой пример.
#include <conio.h> #include <stdio.h> void main() { int A = 100; int *p; //Получаем адрес переменной A p = &A; //Выводим адрес переменной A printf("%p\n", p); //Выводим содержимое переменной A printf("%d\n", *p); //Меняем содержимое переменной A *p = 200; printf("%d\n", A); printf("%d", *p); getch(); }
Рассмотрим код внимательно, ещё раз
int A = 100;
Была объявлена переменная с именем A. Она располагается по какому-то адресу в памяти. По этому адресу хранится значение 100.
int *p;
Создали указатель типа int.
p = &A;
Теперь переменная p хранит адрес переменной A. Используя оператор * мы получаем доступ до содержимого переменной A.
Чтобы изменить содержимое, пишем
*p = 200;
После этого значение A также изменено, так как она указывает на ту же область памяти.
Ничего сложного.
Теперь другой важный пример
#include <conio.h> #include <stdio.h> void main() { int A = 100; int *a = &A; double B = 2.3; double *b = &B; printf("%d\n", sizeof(A)); printf("%d\n", sizeof(a)); printf("%d\n", sizeof(B)); printf("%d\n", sizeof(b)); getch(); }
Будет выведено
Несмотря на то, что переменные имеют разный тип и размер, указатели на них имеют один размер. Действительно, если указатели хранят адреса, то они
должны быть целочисленного типа. Так и есть, указатель сам по себе хранится в переменной типа size_t (а также ptrdiff_t),
это тип, который ведёт себя как целочисленный, однако его размер зависит от разрядности системы. В большинстве
случаев разницы между ними нет. Зачем тогда указателю нужен тип?