Символьные константы. Строковые константы

Для Windows 14.05.2019

    Целые Константы

    Константы с Плавающей Точкой

    Символьные Константы

    Строки

    Ноль

    Const

    Перечисления

C++ дает возможность записи значений основных типов: символьных констант, целых констант и констант с плавающей точкой. Кроме того, ноль (0) может использоваться как константа любого указательного типа, и символьные строки являются константами типа char. Можно также задавать символические константы. Символическая константа - это имя, значение которого не может быть изменено в его области видимости. В C++ имеется три вида символических констант:

    любому значению любого типа можно дать имя и использовать его как константу, добавив к его описанию ключевое слово const;

    множество целых констант может быть определено как перечисление;

    любое имя вектора или функции является константой.

Целые Константы

Ц елые константы предстают в четырех обличьях: десятичные, восьмеричные, шестнадцатиричные и символьные константы. Десятичные используются чаще всего и выглядят так, как можно было бы ожидать:

их десятичные эквиваленты - это 0, 2, 63, 83. В шестнадцатиричной записи эти константы выглядят так:

0x0 0x2 0x3f 0x53

Б уквы a, b, c, d, e и f, или их эквиваленты в верхнем регистре, используются для представления чисел 10, 11. 12, 13, 14 и 15, соответственно. Восьмеричная и шестнадцатиричная записи наиболее полезны для записи набора битов; применение этих записей для выражения обычных чисел может привести к неожиданностям. Например, на машине, где int представляется как двоичное дополнительное шестнадцатеричное целое, 0xffff является отрицательным десятичным числом -1; если бы для представления целого использовалось большее число битов, то оно было бы числом 65535.

Константы с Плавающей Точкой

К онстанты с плавающей точкой имеют тип double. Как и в предыдущем случае, компилятор должен предупреждать о константах с плавающей точкой, которые слишком велики, чтобы их можно было представить. Вот некоторые константы с плавающей точкой:

1.23 .23 0.23 1. 1.0 1.2e10 1.23e-15

З аметьте, что в середине константы с плавающей точкой не может встречаться пробел. Например, 65.43 e-21 является не константой с плавающей точкой, а четырьмя отдельными лексическими символами (лексемами):

65.43 e - 21

и вызовет синтаксическую ошибку.
Е сли вы хотите иметь константу с плавающей точкой типа float, вы можете определить ее так:

Const float pi = 3.14159265;

Символьные Константы

Х отя в C++ и нет отдельного символьного типа данных, точнее, символ может храниться в целом типе, в нем для символов имеется специальная и удобная запись. Символьная константа - это символ, заключенный в одинарные кавычки; например, "a" или "0". Такие символьные константы в действительности являются символическими константами для целого значения символов в наборе символов той машины, на которой будет выполняться программа (который не обязательно совпадает с набором символов, применяемом на том компьютере, где программа компилируется). Поэтому, если вы выполняетесь на машине, использующей набор символов ASCII, то значением "0" будет 48, но если ваша машина использует EBCDIC, то оно будет 240. Употребление символьных констант вместо десятичной записи делает программу более переносимой. Несколько символов также имеют стандартные имена, в которых обратная косая \\ используется как escape-символ:

В опреки их внешнему виду каждое является одним символом. Можно также представлять символ одно-, дву- или трехзначным восьмеричным числом (символ \\, за которым идут восьмеричные цифры), или одно-, дву- или трехзначным шестнадцатиричным числом (\\x, за которым идут шестнадцатиричные цифры). Например:

"\\6" "\\x6" 6 ASCII ack
"\\60" "\\x30" 48 ASCII "0"
"\\137" "\\x05f" 95 ASCII "_"

Э то позволяет представлять каждый символ из машинного набора символов, и в частности вставлять такие символы в символьные строки. Применение числовой записи для символов делает программу непереносимой между машинами с различными наборами символов.

Строки

С троковая константа - это последовательность символов, заключенная в двойные кавычки:

"это строка"

К аждая строковая константа содержит на один символ больше, чем кажется; все они заканчиваются пустым символом "\\0" со значением 0.

Например:

Sizeof("asdf")==5;

С трока имеет тип "вектор из соответствующего числа символов", поэтому "asdf" имеет тип char. Пустая строка записывается "" (и имеет тип char). Заметьте, что для каждой строки s strlen(s)==sizeof(s)-1, поскольку strlen() не учитывает завершающий 0.
Соглашение о представлении неграфических символов с обратной косой можно использовать также и внутри строки. Это дает возможность представлять в строке двойные кавычки и escape-символ \\. Самым обычным символом этого рода является, безусловно, символ новой строки "\\n".

Например:

Cout << "гудок в конце сообщения\\007\\n"

Где 7 - значение ASKII символа bel (звонок).

В строке невозможно иметь "настоящую" новую строку:

"это не строка,
а синтаксическая ошибка"

О днако в строке может стоять обратная косая, сразу после которой идет новая строка; и то, и другое будет проигнорировано.

Например:

Cout << "здесь все \\
ok"

Напечатает

Здесь все ok

Н овая строка, перед которой идет escape (обратная косая), не приводит к появлению в строке новой строки, это просто договоренность о записи.

В строке можно иметь пустой символ, но большинство программ не будет предполагать, что есть символы после него. Например, строка "asdf\\000hjkl" будет рассматриваться стандартными функциями, вроде strcpy() и strlen(), как "asdf".

В ставляя численную константу в строку с помощью восьмеричной или шестнадцатиричной записи благоразумно всегда использовать число из трех цифр. Читать запись достаточно трудно и без необходимости беспокоиться о том, является ли символ после константы цифрой или нет. Разберите эти примеры:

Char v1 = "a\\x0fah\\0129"; // "a" "\\xfa" "h" "\\12" "9"
char v2 = "a\\xfah\\129"; // "a" "\\xfa" "h" "\\12" "9"
char v3 = "a\\xfad\\127"; // "a" "\\xfad" "\\127"

И мейте в виду, что двузначной шестнадцатиричной записи на машинах с 9-битовым байтом будет недостаточно.

Ноль

Н оль (0) можно употреблять как константу любого целого, плавающего или указательного типа. Никакой объект не размещается по адресу 0. Тип нуля определяется контекстом. Обычно (но не обязательно) он представляется набором битов все-нули соответствующей длины.

Const

К лючевое слово const может добавляться к описанию объекта, чтобы сделать этот объект константой, а не переменной.

Например:

Const int model = 145;
const int v = { 1, 2, 3, 4 };

П оскольку константе ничего нельзя присвоить, она должна быть инициализирована. Описание чего-нибудь как const гарантирует, что его значение не изменится в области видимости:

Model = 145; // ошибка
model++; // ошибка

З аметьте, что const изменяет тип, то есть ограничивает способ использования объекта, вместо того, чтобы задавать способ размещения константы. Поэтому например вполне разумно, а иногда и полезно, описывать функцию как возвращающую const:

Const char* peek(int i)
{
return private[i];
}

Ф ункцию вроде этой можно было бы использовать для того, чтобы давать кому-нибудь читать строку, которая не может быть затерта или переписана (этим кем-то).

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

И спользование указателя вовлекает два объекта: сам указатель и указываемый объект. Снабжение описания указателя "префиксом" const делает объект, но не сам указатель, константой.

Например:

Const char* pc = "asdf"; // указатель на константу
pc = "a"; // ошибка
pc = "ghjk"; // ok

Ч тобы описать сам указатель, а не указываемый объект, как константный, используется операция const*.

Например:

Char *const cp = "asdf"; // константный указатель
cp = "a"; // ok
cp = "ghjk"; // ошибка

Ч тобы сделать константами оба объекта, их оба нужно описать const.

Например:

Const char *const cpc = "asdf"; // const указатель на const
cpc = "a"; // ошибка
cpc = "ghjk"; // ошибка

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

Например:

Char* strcpy(char* p, const char* q); // не может изменить q

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

Например:

Int a = 1;
const c = 2;
const* p1 = &c; // ok
const* p2 = &a; // ok
int* p3 = &c; // ошибка
*p3 = 7; // меняет значение c

К ак обычно, если тип в описании опущен, то он предполагается int.

Перечисления

Е сть другой метод определения целых констант, который иногда более удобен, чем применение const.

Например:

Enum { ASM, AUTO, BREAK };

Определяет три целых константы, называемы перечислителями, и присваивает им значения. Поскольку значения перечислителей по умолчанию присваиваются начиная с 0 в порядке возрастания, это эквивалентно записи:

Const ASM = 0;
const AUTO = 1;
const BREAK = 2;

П еречисление может быть именованным.

Например:

Enum keyword { ASM, AUTO, BREAK };

И мя перечисления становится синонимом int, а не новым типом. Описание переменной keyword, а не просто int, может дать как программисту, так и компилятору подсказку о том, что использование преднамеренное.

Например:

Keyword key;
switch (key) {
case ASM:
// что-то делает
break;
case BREAK:
// что-то делает
break;
}

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

М ожно также задавать значения перечислителей явно.

Например:

Enum int16 {
sign=0100000, // знак
most_significant=040000, // самый значимый
least_significant=1 // наименее значимый
};

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

В программе строки, или строковые константы, представляются последовательностью изображений символов, заключенной в кавычки (не в апострофы), например “любые символы”. Среди символов строки могут быть эскейп-последовательности, соответствующие кодам не изображаемых (специальных) символьных констант.

Примеры:

“1234567890”

“\t состав президиума”

“начало строки \t и конец строки”.

В качестве терминирующего символа выбран символ с кодом 0 (не путайте его с символом "0"). Таким образом, определение

char HelloStr = "Hello, world";

фактически интерпретируется как

char HelloStr = {"H", "e", "l", "l", "o", " ", ",", "w", "o", "r", "l", "d", "\0"};

Это происходит при инициализации массива строкой. Во всех остальных случаях встретившаяся строка интерпретируется как еще не созданный безымянный массив соответствующей длины. То есть выражение

printf ("Hello, world\n");

на самом деле интерпретируется как

char str1 = "Hello, world\n";

При размещении строки в памяти транслятор автоматически добавляет в ее конец символ ‘\0’, т.е. нулевой байт.

Количество элементов в таком массиве на 1 больше, чем в изображении соответствующей строковой константы, т.к. в конец строки добавили нулевой байт ‘\0’.

У строк есть еще особенность: транслятор отводит каждой строке отдельное место в памяти ЭВМ даже в тех случаях, когда несколько строк полностью совпадают (стандарт языка СИ предполагает, что в конкретных реализациях это правило может не выполняться).

Присвоить значение массиву символов (т.е. строке) с помощью обычного оператора присваивания нельзя. Поместить строку в массив можно либо с помощью инициализации (при определении символьного массива), либо с помощью функций ввода. В функции scanf () или printf () для символьных строк используется спецификация преобразования % s .

Пример:

/*печать символьной строки*/

#include

{ char B=”Cезам, откройся!”;

printf(“%s”,B); } /*конец программы*/

Результат выполнения программы: Сезам, откройся!

В программе длина массива В – 17 элементов, т.е. длина строки, помещаемой в массив (16 символов), плюс нулевой байт окончания строки. Именно 17 байтов выделяется при инициализации массива в приведенном примере. Инициализация массива символов с помощью строковой константы представляет собой сокращенный вариант инициализации массива и введена в язык для упрощения. Можно воспользоваться обычной инициализацией, поместив начальные значения элементов массива в фигурные скобки и не забыв при этом поместить в конце списка начальных значений специальный символ окончания строки ‘\0’. Таким образом, в программе была допустима такая инициализация массива В:

char B = {‘C’,’е’,’з’,’а’,’м’,’,’,’ ’,’о’,’т’,’к’,’р’,’о’,’й’,’с’,’я’,’!’,’\0’};

Как вводить строки или выводить их на экран?

Выводиться строка может или уже известной вам функцией printf() со спецификатором ввода "%s ", либо специальной функцией int puts (char *string), которая выводит строку string на экран и возвращает некоторое ненулевое значение в случае успеха.

Зачем нужен спецификатор "%s "? Это делается для того, чтобы можно было выводить строки с любыми символами. Сравните:

Пример:

char str = "Захотелось мне вывести %d...";

printf ("%s", str); /* Правильный вариант */

printf ("\n"); /* Разделитель новой строки */

printf (str); /* Неправильный вариант */

В первом случае функция напечатает именно то, что от нее требуется. А вот во втором случае printf() , встретив в строке str спецификатор "%d" (ведь теперь эта строка – первая, значит, она задает формат вывода), сделает вывод, что за ней должно следовать число. А так как оно не следует, то вместо "%d " будет напечатан некоторый мусор – число, находящееся в тот момент в стеке.

Последствия могут быть и более серьезными, если в строке находится последовательность "%s", то сочтет ее за строку, и будет выводить ее до тех пор, пока не встретит нулевой символ. А где она его встретит, сколько успеет напечатать и не crash"нется ли из-за обращения не к своей памяти – не знает никто.

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

/*чтение строки с терминала*/

int getline(char s , / *введенная строка*/

int lim) /*ее максимальная длина*/

{ int c, i; /* с – вводимый символ*/

for (i=0; i

s[i] = ’\0’;

      Ввод–вывод строк. Основные функции работы со строками

Одной из наиболее популярных операций ввода-вывода является операция ввода-вывода строки символов. В библиотеку языка СИ для обмена данными через стандартные потоки ввода-вывода включены функции ввода-вывода строк gets () и puts (), которые удобно использовать при создании диалоговых систем.

Для ввода строки существует функция с прототипом

char *gets (char *string),

которая считывает строку с клавиатуры и помещает ее в буфер string , указатель на который и возвращает. Если произошла ошибка, то возвращается EOF.

Функция имеет только один аргумент – указатель s < stdio . h >.

Функция gets() завершает свою работу при вводе символа ‘\ n , который автоматически передается с клавиатуры в ЭВМ при нажатии клавиши . При этом сам символ ‘\ n во вводимую строку не записывается. Вместо него в строку помещается нуль–символ ‘\0’ . Таким образом, функция gets () производит ввод “правильной” строки , а не просто последовательности символов.

Здесь следует обратить внимание на следующую особенность ввода данных с клавиатуры. Функция gets () начинает обработку информации от клавиатуры только после нажатия клавиши < Enter >. Таким образом, она “ожидает”, пока не будет набрана нужная информация и нажата клавиша <Enter >. Только после этого начинается ввод данных в программу.

Пример: #include

int main (void) {

printf ("Input a string:");

printf ("The string input was: %s\n", string);

Функция puts () (вывод строки на экран) в случае успешного завершения возвращает последний выведенный символ, который всегда является символом ‘\ n " , если произошла ошибка, то возвращается из функции EOF. Прототип этой функции имеет следующий вид:

int puts (char*s); /*функция вывода строки*/

Функция имеет только один аргумент – указатель s на массив символов. Прототип функции описан в файле < stdio . h >.

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

#include

char strl = ”введите фамилию сотрудника:”;

Напомним, что любая строка символов в языке СИ должна заканчиваться нуль–символом ‘\0’ . В последний элемент массива strl нуль–символ будет записан автоматически во время трансляции при инициализации массива. Для функции puts() наличие нуль-символа в конце строки является обязательным.

В противном случае, т.е. при отсутствии в символьном массиве символа ‘\0’ , программа может завершиться аварийно, т.к. функция puts () в поисках нуль-символа будет перебирать всю доступную память байт за байтом, начиная, в нашем примере, с адреса strl . Об этом необходимо помнить, если в программе происходит формирование строки для вывода ее на экран дисплея.

Пример : #include

int main (void) {

char string = "This is an example output string\n";

      Функции манипуляции со строками

Так как в Cи нет предопределенного типа для строки, то нет и столь привычных многим операций, как сравнения и склеивания строк, реализованных во многих языках как операторы сложения и сравнения. Здесь сложение массивов недопустимо, а при сравнении будут сравниваться не сами строки, а только указатели на них, что нам, конечно же, неинтересно.

Для манипуляций со строками существует набор функций, объявленных в файле (те, кто пишет под Windows, могут включать вместо него файл <windows.h >).

Наиболее важные функции:

    int strcmp (char *string1, char *string2)

осуществляет сравнение двух строк . Возвращает отрицательное число, если первая строка меньше второй, 0, если строки равны и положительное число, если первая строка больше второй. Более детально, функция возвращает разницу между кодами первых встретившихся неодинаковых символов (если строки неодинаковы по длине, то когда-то ненулевой символ будет сравниваться с нулем).

Пример :

#include

#include

int main (void) {

char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc";

ptr = strcmp (buf2, buf1);

if (ptr > 0)

printf("buffer 2 is greater than buffer 1 \n");

printf("buffer 2 is less than buffer 1 \n");

ptr = strcmp(buf2, buf3);

printf("buffer 2 is greater than buffer 3\n");

printf("buffer 2 is less than buffer 3\n");

На экране появится:

buffer 2 is greater than buffer 1

buffer 2 is less than buffer 3

    char *strcpy (char *dest, char *source)

осуществляет копирование строки source на место строки dest . Опять-таки позаботьтесь о том, чтобы вся строка поместилась в отведенном для нее месте. Функция возвращает указатель на строку-приемник.

Пример: #include

#include

int main (void) {

char *str1 = "a b c d e f g h i";

strcpy (string, str1);

printf("%s \n", string);

На экране появится: a b c d e f g h I

    char *strcat (char *string1, char *string2)

осуществляет склеивание двух строк . Вторая строка добавляется в конец первой. Функция не проверяет (да и не может проверять технически) наличие необходимого количества памяти в конце первой строки – об этом должны позаботиться вы. Функция возвращает указатель на первую строку.

Пример:

#include

#include

int main(void) {

char destination;

char *blank = " ", *c = "C++", *turbo = "Turbo";

strcpy (destination, turbo); //Копирование строки "turbo"

на место destination

strcat (destination, blank); // Склеивание destination …

strcat (destination, c); // сначала с blank , потом с c

printf("%s\n", destination);

На экране появится: Turbo C ++

    int strlen (char *string)

возвращает длину строки string (не считая нулевого символа).

    char *strdup (char *string)

создает дубликат строки string и возвращает указатель на него. Учтите, что в отличие от остальных функций, strdup сама создает строку и поэтому после того, как она стала вам не нужна, не забывайте ее освободить.

    char *strncpy (char *dest, char *source, int count)

    char *strncat (char *string1, char *string2, int count)

аналогично strcpy и strcat , но копируются только первые count символов. Функции не добавляют к строке завершающего нуля – вам придется сделать это самим.

    char *strchr (char *string, int c)

    char *strstr (char *string, char *substring)

ищут первое вхождение в строку string соответственно символа c и подстроки substring . Обе функции возвращают адрес первого вхождения или NULL , если такового не найдено.

Пример :

int main (void) {

char *ptr, c = "r";

//Создаем строку

strcpy (string, "This is a string");

ptr = strchr(string, c);

printf("The character %c is at position: %d\n", c, ptr-string);

printf("The character was not found\n");

В языке Си символы заключаются в апострофы. Поэтому, когда мы присваиваем какое-то значение переменной broiled типа char , мы должны писать

broiled = " Т "; /* ПРАВИЛЬНО */,

broiled = Т; /* НЕПРАВИЛЬНО */

Если апострофы опущены, компилятор "считает", что мы используем переменную с именем Т , которую забыли описать.

В стандарте языка Си принято правило, согласно которому значениями переменной или константы типа char могут быть только одиночные символы. В соответствии с этим последовательность операторов, указанная ниже, является недопустимой, поскольку там делается попытка присвоить переменной bovine значение, состоящее из двух символов:

ehar bovine;

bovine = " ox "; /*НЕПРАВИЛЬНО */

Если вы посмотрите на таблицу кода ASCII, то увидите, что некоторые из "символов" в ней не выводятся на печать. Например, при использовании в программе символа номер 7 терминал компьютера издает звуковой сигнал. Но как использовать символ, который невозможно набрать на клавиатуре? В языке Си для этого имеются два способа.

В первом способе используется сам код ASCII. Вы должны только указать номер символа вместе с предшествующим знаком "обратная косая черта". Мы уже делали это в нашей программе "золотой эквивалент". Вот эта строка

beep = " 07 ";

Здесь имеются два важных момента, которые вы должны отчетливо представлять себе. Первый - это то, что последовательность знаков заключается в апострофы точно так же, как это делается с обычным символом. Второе - то, что номер символа должен быть записан в восьмеричном виде. При записи последовательности знаков мы можем случайно пропустить нули в первых позициях; в этом случае для представления кода "сигнал" мы могли бы использовать "7" или даже "7" . Но ни в коем случае не опускайте в записи последние нули! Последовательность символов "20" можно записать в виде "20" , но не "2" .

При использовании кода ASCII необходимо отметить различие между числами и символами, обозначающими числа. Например, символу "4" соответствует код ASCII, равный 52. Это символ "4" а не число 4.

РИС. 3. 4. Формы записи констант целых типов

Во втором способе представления "неудобных" знаков используются специальные последовательности символов. Они называются управляющими последовательностями и выглядят следующим образом:

n новая строка

t табуляция

b шаг назад

r возврат каретки

f подача бланка

обратная косая черта ()

" апостроф (")

" кавычки (")

При присваивании символьной переменной эти последовательно сти тоже должны быть заключены в апострофы. Например, мы могли бы написать оператор

nerf = " n ";

а затем вывести на печать переменную nerf; это приведет к продвижению на одну строку вперед на печатающем устройстве или на экране дисплея.

Первые пять управляющих последовательностей являются общепринятыми символами, предназначенными для управления работой печатающего устройства:

символ "новая строка" вызывает переход к новой строке;

символ "табуляция" сдвигает курсор или печатающую головку на некоторое фиксированное число позиций 5 или 8;

символ "шаг назад" производит сдвиг назад на одну позицию;

символ "возврат каретки" осуществляет возврат к началу строки;

символ "подача бланка" вызывает протяжку бумаги на одну страницу.

В последних трех управляющих последовательностях символы , " , " можно считать символьными константами [поскольку они служат для определения символьных констант и непосредственно используются в операторе printf() , применение их самих в качестве символов могло бы привести к ошибке]. Если вы хотите вывести на печать строку.

Запомните, " символ называется обратная косая черта".

оператор будет выглядеть так:

printf(" Запомните, " символ называется обратная косая черта. " n");

Здесь у вас могут возникнуть два вопроса. Во-первых, почему мы не заключили управляющие последовательности в апострофы? Во-вторых, в каких случаях необходимо использовать код ASCII и когда управляющие последовательности, которые мы только что обсуждали? (Мы надеемся, что у вас возникли как раз эти вопросы, ПОТОМУ что мы собираемся отвечать именно на них.)

Лабораторная работа №1

Знакомство с языком программирования С++

Цель работы:

1. Изучение интерфейса программной оболочки Visual C++;

2. Компиляция и создание исполняемых файлов.

3. Изучение основных типов данных языка С++;

Базовые типы данных;

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

4. Изучение операторов:

Арифметических;

Логических;

Сравнения;

Побитовых;

Ввода и вывода.

5. Приобретение навыков работы в ИСП Microsoft Visual C++ 5.0.

Используемое оборудование:

Персональная ЭВМ, совместимая с IBM PC.

Используемое программное обеспечение:

Операционная система Windows;

Интегрированная среда программирования Microsoft Visual C++ 5.0 (ИСП Microsoft Visual C++ 5.0).

Задание по работе

1.1. Загрузить ИСП Microsoft Visual C++ 5.0.

1.2. Изучить команды ИСП Microsoft Visual C++ 5.0.

1.3. Изучить основные типы данных ИСП Microsoft Visual C++ 5.0.

1.4. Выполнить пример 1, пример 2, пример 3 и задание преподавателя.

1.5. Записать протокол работы с интегрированной средой.

Порядок выполнения работы

2.1. Запустить Microsoft Visual C++ 5.0.

2.2. Создать *.cpp файл в рабочем каталоге.

2.3. Выполнить пример 1, пример 2, пример 3 и задание преподавателя.

2.4. Составить схему алгоритма и написать программу (по заданию преподавателя). Записать протокол работы с интегрированной средой.

2.5. Закончить работу с Microsoft Visual C++ 5.0 и запустить программу.

3.1. Наименование лабораторной работы.

3.2. Цель работы.

3.3. Теоретическую часть.

3.4. Алгоритмы выполненных программ.

3.5. Текст выполненных программ.

3.6. Вывод.

Краткое описание работы

4.1. Запуск и работа в ИСП Microsoft Visual C++ 5.0.

Для запуска ИСП Microsoft Visual C++ 5.0 необходимо запустить меню Пуск - Microsoft Visual C++ 5.0 - Microsoft Visual C++ 5.0.

Что бы начать работать в C++ сначала необходимо создать простое консольное приложение, для этого нужно выполнить следующие действия:

Ø Запустить Visual C++ (Пуск®Программы® Microsoft Visual C++ 5.0.® Microsoft Visual C++ 5.0. );

Ø Выбрать "New" в меню "File". Проверить, что бы в диалоговой панеле "New" была выбрана закладка "Projects". В списке типов проектов выберите "Win32 Console Application";

Ø Выбрать каталог для проекта ‘Location’ (С:\students\’группа*) и имя проекта ‘Project name’, например, "First" и нажмите кнопку "OK". У вас создадутся "First classes";

Ø После этого выберите опять "New", но с закладкой "Files" и выберите "C++ Source File". В списке ‘File name’ задайте имя например, "First" Далее нажмите "OK" и создастся файл "First.cpp".

Общая структура программы.

Наша задача – рассмотреть общую структуру программы написанной на языке С/С++, то есть весь исходный текст размещается в одном файле:

Ø Область директив препроцессора (include, define..);

Ø Описание пользовательских типов данных;

Ø Неполные объявления функций;

Ø Описание глобальных переменных;

Ø Объявление функции 1;

Ø Объявление функции 2;

Ø Объявление функции main().

Данная схема не имеет такого жесткого порядка как в Паскале, однако, она считается традиционной.

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

Минимальная программа выглядит следующим образом:

Void main(void)

Она состоит из функции main, не принимающей и не возвращающей параметров (void). Тело функции, заключенное в фигурные скобки, также не содержит никаких полезных операторов.

Переменные могут быть объявлены как внутри тела функции, так и вне тела. В первом случае доступ к ним может осуществляться только из тела данной функции (локальные объявления), а во втором – из любой функции (глобальные объявления).

Выполнение программы начинается с тела функции main, которая может принимать набор значений из командной строки. В теле main содержатся вызовы других функций, как из стандартных библиотек, так и определенных пользователем в тексте программы.

Выполнение программы по умолчанию заканчивается при завершении работы main, но может прерваться в любом месте при возникновении критической ошибки, или в предусмотренном случае. Для этого обычно используют функцию exit() из библиотеки stdlib.

Вывод строки на экран

Прежде всего, давайте напишем программу, выводящую строку на экран.

Программа должна содержать функцию с именем main(). Ей приписывается роль начала программы. Эта функция не является предопределенной для транслятора, она не может быть перегружена, а ее тип зависит от реализации. Функция main может определяться так:

Пример 1:

// Первая программа на С++

#include

Void main ()

cout << “Thise is my first program\n” << endl;

Для того, чтобы выполнить программу надо ее вначале сохранить. Зайдите в меню File и там нажмите на Save All . Затем надо ее построить (скомпилировать) для этого нужно выполнить следующие действия:

Ø Зайдем в меню (Build®Build *.exe) или сочетание клавиш (F7), начнется построение программы. Если компилятор не выдал сообщение об ошибке, которые можно посмотреть в появившемся внизу окошке, то можно смело запускать программу;

Ø Теперь вам осталось только выполнить программу, для этого зайдите в меню (Build®Execute *.exe.) или сочетание клавиш (Ctrl+F5);

Ø Ваша программа запущенна.

Строка #include сообщает компилятору, чтобы он включил стандартные возможности потока ввода и вывода, находящиеся в файле iostream.h. Без этих описаний выражение cout << "Thise is my first program " не имело бы смысла. Основные стандартные библиотеки приведены в таблице 1.

Таблица 1.

Основные стандартные библиотеки С/С++

Операция << ("поместить в") пишет свой первый аргумент во второй (в данном случае, строку "Thise is my first program " в стандартный поток вывода cout). Строка – это последовательность символов, заключенная в двойные кавычки. В строке символ обратной косой \, за которым следует другой символ, обозначает один специальный символ; в данном случае, \n является символом новой строки. Таким образом, выводимые символы состоят из "Thise is my first program " и перевода строки, которые определяют функцию, названную main . Каждая программа должна содержать функцию с именем main , и работа программы начинается с выполнения этой функции.

Ввод с клавиатуры

Следующая (довольно многословная) программа предлагает вам ввести число дюймов. После того, как вы это сделаете, она напечатает соответствующее число сантиметров.

Пример 2:

#include

Void main()

int inch = 0; // inch - дюйм

cout << "inches";

cin >> inch;

cout << inch;

cout << " in = ";

cout << inch*2.54;

cout << " cm\n";

Первая строка функции main() описывает целую переменную inch . Ее значение считывается с помощью операции >> ("взять из") над стандартным потоком ввода cin .

В этом примере на каждую команду вывода приходится один оператор; это слишком длинно. Операцию вывода << можно применять к ее собственному результату, так что последние четыре команды вывода можно было записать одним оператором:

cout << inch << " in = " << inch*2.54 << " cm\n";

Комментарии

Часто бывает полезно вставлять в программу текст, который предназначается в качестве комментария только для читающего программу человека и игнорируется компилятором в программе. В C++ это можно сделать одним из двух способов.

Символы /* начинают комментарий, заканчивающийся символами */. Вся эта последовательность символов эквивалентна символу пропуска (например, символу пробела). Это наиболее полезно для многострочных комментариев и изъятия частей программы при редактировании, однако следует помнить, что комментарии /* */ не могут быть вложенными.

Символы // начинают комментарий, который заканчивается в конце строки, на которой они появились. Опять, вся последовательность символов эквивалентна пропуску. Этот способ наиболее полезен для коротких комментариев. Символы // можно использовать для того, чтобы закомментировать символы /* или */, а символами /* можно закомментировать //.

4.6. Типы данных в C++

Перед тем, как писать программу, необходимо задать типы данных. В C++ существуют несколько часто используемых типов данных (не все):

Ø Численные знаковые целые (int, short, char);

Ø Численные знаковые дробные (float, double, long (в С), long double (в С);

Ø Численные без знаковые - все перечисленные выше типы с добавлением Unsigned;

Ø Char так же может использоваться как символьный тип .

Стандартные типы и размеры соответствующих ячеек приведены ниже.

Диапазон Размер (Бт)
char -128..127;
unsigned char 0..255;
int -32 768.. 32 767;
unsigned int 0..65535;
long -2 147 483 648..2 147 483 647;
unsigned long 0..4 294 967 295;
float 3.4e-38..3.4e+38;
double 1.7e-308..1.7e+308;
long double 3.4e-4932..3.4e+4932.

Переменная в C/C++ объявляется следующим образом:

Int iMyVariable;

В приведенном операторе iMyVariable объявлена как целая переменная. А вот объявление переменной типа char :

Char cMyChar;

Такие типы данных, как int , float , char и long , являются неотъемлемой частью C/C++ и вам не нужно писать никакого кода, чтобы сообщить компилятору о том, что означают эти слова. C/C++ позволяет вам также объявлять свои собственные, специальные типы данных.

В примере 3 представлена программа, которая будет выводить размер типов данных в байтах. Пример 3:

#include

Void main(void)

cout << " (unsigned)int = " << sizeof(int) << endl;

cout << " (unsigned)short = " << sizeof(short) << endl;

cout << " (unsigned)char = " << sizeof(char) << endl;

cout << " (unsigned)float = " << sizeof(float) << endl;

cout << " (unsigned)double = " << sizeof(double) << endl;

cout << " (unsigned)long = " << sizeof(long) << endl;

cout << " (unsigned)long double = " << sizeof(long double) << endl;

Для того, чтобы узнать размер ячейки соответствующего типа достаточно написать в программе sizeof (тип). Дело в том, что для различных операционных систем размеры ячейки одного типа может отличаться (например тип int в 16-ти и 32-х разрядных ОС, 1 байт и 2 байта соответственно).

Оператор sizeof вычисляет размер своего операнда в байтах. Операнд должен быть или выражением, которое не вычисляется, или именем типа в скобках. Оператору sizeof нельзя применять к функции, битовому полю, неопределенному классу, типу void или к массиву с неуказанными границами индексов. Байт никак не определяется языком, кроме как результата операции sizeof , именно sizeof (char) есть 1.

4.7. Переменные

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

Если данные могут меняться в процессе работы, то говорят об использовании переменных, если не могут – то констант. Для доступа к переменной или константе необходимо использовать имя или адрес.

Переменная - это именованная область памяти, значение которой может изменяться в процессе выполнения программы.

Все переменные должны быть объявлены для своего использования, для того чтобы компилятор смог выделить статическую память, поэтому ему требуется знать ее точный размер. Для того чтобы объявить переменную, необходимо указать: имя, адрес, размер (определяемый типом), значение .

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

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

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

В языке С++ существуют два классификатора, управляющих доступом и модификацией: const и volatile .

Константа – это именованная область памяти, значение которой не может изменяться в процессе выполнения программы. Константам всегда присваивается некоторое значение при объявлении, и оно не может быть изменено в дальнейшем. Переменные типа const не могут изменяться, однако их можно инициализировать.

Квалификатор volatile сообщает компилятору, что значение переменной может изменяться неявно. Например , адрес глобальной переменной передать таймеру операционной системы и использовать его для отсчета реального времени. В этом случае содержимое переменной изменяется без явного выполнения какого-либо оператора присваивания.

В языке С/С++ предусмотрены управляющие символьные константы , которые приведены в таблице 2.

Таблица 2.

Управляющие символьные константы

Самые знаменитые служебные символы: перевод строки (код 13), возврат каретки (код 10), табуляция (код 9). Для задания их в программе в виде символьных констант используется сочетание двух видимых символов, а именно “\n”, “\r”, “\t” соответственно. Для представления символа “слэш“ используется конструкция “\\”

В языке С существуют четыре спецификатора хранения: extern, static, register, auto.

Эти спецификаторы сообщают компилятору, как хранить объявленную переменную. Общий вид объявления, использующего эти спецификаторы:


Похожая информация.




Рекомендуем почитать

Наверх