Циклы в 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. 110 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),
это тип, который ведёт себя как целочисленный, однако его размер зависит от разрядности системы. В большинстве
случаев разницы между ними нет. Зачем тогда указателю нужен тип?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector