Тема 3.2 Константы и строки. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Тема 3.2 Константы и строки.



Концепция типов данных является важнейшей стороной любого языка программирования. Особенность Паскаля состоит в большом разнообразии типов. Аналогичная схема для языка Си++ представлена на рис. 31.

 Сравнение схем приводит к выводу о том, что разнообразие типов данных в Си++ меньше, чем в Турбо Паскале. 

В Си/Си++ имеется четыре базовых арифметических (числовых) типа данных. Из них два целочисленных — char, int — и два плавающих (вещественных) — float и double. Кроме того, в программах можно использовать некоторые модификации этих типов, описываемых с помощью служебных слов — модификаторов. Существуют два модификатора размера — short (короткий) и long (длинный) — и два модификатора знаков — signed (знаковый) и unsigned (беззнаковый). Знаковые модификаторы при­ меняются только к целым типам. 

Как известно, тип величины связан с ее формой внутреннего представления, множеством принимаемых значений и множеством операций, применимых к этой величине. В табл. 7 перечислены арифметические типы данных Си++, указан объем занимаемой памяти и диапазон допустимых значений. 

  Размер типа int и unsigned int зависит от размера слова операционной системы, в которой работает компилятор Си++. В 16-разрядных ОС (MS DOS) этим типам соответствуют 2 байта, в 32-разрядных (Windows) — 4 байта.

 

 

 

 

 

Анализируя данные табл. 7, можно сделать следующие выводы:

• если не указан базовый тип, то по умолчанию подразумевается int; 

• если не указан модификатор знаков, то по умолчанию подразумевается signed; 

• с базовым типом float модификаторы не употребляются; 

• модификатор short применим только к базовому типу int.

 Программисту, работавшему на Паскале, покажется странным, что тип char причислен к арифметическим типам. Ведь даже его имя указывает на то, что это символьный тип! В Си/Си++ величины типа char могут рассматриваться в программе и как символы, и как целые числа. Все зависит от контекста, т.е. от способа использования этой величины. В случае интерпретации величины типа char как символа ее числовое значение является ASCII- кодом. Следующий пример иллюстрирует сказанное. 

char a=65; 

printf("%c",а);/*На экране появится символ А*/ 

printf("%d",a);/*На экране появится число 65*/ 

   Символы "%с" являются спецификацией формата ввода/вывода символьных данных, a "%d" — спецификацией для целых чисел.

 

    Еще одной особенностью Си, которая может удивить знатоков Паскаля, является отсутствие среди базовых типов логического типа данных. Между тем, как мы дальше увидим, в Си используются логические операции и логические выражения. В качестве логических величин в Си/Си++ выступают целые числа. Интерпретация их значений в логические величины происходит по правилу: равно нулю — ложь (в Паскале — false), не равно нулю — истина (в Паскале — true). В последние версии Си++ добавлен отдельный логический тип с именем bool. Его относят к разновидности целых типов данных.   Описание переменных в программах на Си/Си++ имеет вид: имя_типа список_переменных; Примеры описаний:

 

                                                                                                                      

 

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

 

 

     Константы. Запись целых констант. Целые десятичные числа, начинающиеся не с нуля, например: 4, 356, —128. 

      Целые восьмеричные числа, запись которых начинается с нуля, например: 016, 077. Целые шестнадцатеричные числа, запись которых начинается с символов Ох, например: OxlA, 0x253, OxFFFF. 

     Тип константы компилятор определяет по следующим правилам: если значение константы лежит в диапазоне типа int, то она получает тип int; в противном случае проверяется, лежит ли константа в диапазоне типа unsigned int, в случае положительного ответа она получает этот тип; если не подходит и он, то пробуется тип long и, наконец, unsigned long. Если значение числа не укладывается в диапазон типа unsigned long, то возникает ошибка компиляции.

      Запись вещественных констант. Если в записи числовой константы присутствует десятичная точка (2.5) или экспоненциальное расширение (1Е-8), то компилятор рассматривает ее как вещественное число и ставит ей в соответствие тип double. Примеры вещественных констант: 4 4. 3.14159 44Е0 1.5Е-4. 

       Использование суффиксов. Программист может явно задать тип константы, используя для этого суффиксы. Существуют три вида суффиксов: F(f) -float; U(u) -unsigned; L(l) - long (для целых и вещественных констант). Кроме того, допускается совместное использование суффиксов и и L в вариантах UL или LU. Примеры: 3.14159F — константа типа float, под которую выделяется 4 байта памяти; 3.14L — константа типа long double, занимает 10 байт; 50000U — константа типа unsigned int, занимает 2 байта памяти (вместо четырех без суффикса); 0LU — константа типа unsigned long, занимает 4 байта; 24242424UL — константа типа unsigned long, занимает 4 байта. Запись символьных и строковых констант. Символьные константы заключаются в апострофы. Например:'А','а','5',' + '. Строковые константы, представляющие собой символьные последовательности, заключаются в двойные кавычки. Например: "rezult", "введите исходные данные". Особую разновидность символьных констант представляют так называемые управляющие символы. Их назначение — управление выводом на экран. Как известно, такие символы расположены в начальной части кодовой таблицы ASCII (коды от 0 до 31) и не имеют графического представления. В программе на Си они изображаются парой символов, первый из которых ' \'. Вот некоторые из управляющих символов: ' \п' — переход на новую строку; ' \t' — горизонтальная табуляция; 1 \а' — подача звукового сигнала. Полный список управляющих символьных последовательностей будет дан позднее. 

  Управляющие символьные последовательности являются частным случаем эскейп-последовательностей (ESC-sequence), с помощью которых можно задать символьную константу указанием ее кода. Код символа можно указать в восьмеричном или в шестнадцатеричном представлении. Формат восьмеричного представления:' \ddd'. Здесь d — восьмеричная цифра (от 0 до 7). Формат шестнадцатеричного представления:' \xhh' (или ' \xhh'), где h — шестнадцатеричная цифра (от 0 до F). Например, константа, соответствующая заглавной латинской букве А, может быть представлена тремя способа­ ми: 'А', '\101 ', '\х41'.

 

      Именованные константы (константные переменные). Как и в Паскале, в программе на Си/Си++ могут использоваться именованные константы. Употребляемое для их определения служебное слово const принято называть квалификатором доступа. Квалификатор const указывает на то, что данная величина не может изменяться в течение всего времени работы программы. В частности, она не может располагаться в левой части оператора присваивания. Примеры описания константных переменных:

Определение констант на стадии препроцессорнои обработки программы. Еще одной возможностью ввести именованную константу является использование препроцессорнои директивы #def ine в следующем формате:

   Тип констант явно не указывается и определяется по форме записи. В конце директивы не ставится точка с запятой. 

    На стадии препроцессорнои обработки указанные имена заменяются на соответствующие значения. Например, если в программе присутствует оператор

 

X=iMAX-iMIN; 

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

Х=1000-1; 

При этом идентификаторы iMAX и iMIN не требуют описания внутри программы. Константы перечисляемого типа. Данное средство языка позволяет определять последовательность целочисленных именованных констант. Описание перечисляемого типа начинается со служебного слова enum, а последующий список констант заключается в фигурные скобки. Например:

 enum {A,B,C,D}; 

В результате имени А будет сопоставлена константа 0, имени в — константа 1, с — 2, D — з. По умолчанию значение первой константы равно нулю. Для любой константы можно явно указать значение. Например: enum {A=10,B,C,D};

      В результате будут установлены следующие соответствия: А=10, B=ll, C=12, D=13. Возможен и такой вариант определения перечисления: enum {A=10,B=20,C=35,D=100}; Если перечисляемому типу дать имя, то его можно использовать в описании переменных. Этот вариант аналогичен использованию перечисляемого типа данных в Паскале. Например: enum metal {Fe,Co,Na,Cu,Zn}; metal Metl,Met2; Здесь идентификатор metal становится именем типа. После та­ кого описания в программе возможны следующие операторы: Metl=Na; Met2=Zn; 

 

 

Тема 3.3 Линейные программы на С++. Программирование ветвлений.

  Структура программы. Общая структура программы на Си/Си++ следующая: директивы_препроцессора 

определение_функции_1 

определение_функции_2

 определение_функции_N 

  Среди функций обязательно присутствует главная функция с именем main. Простейшая программа содержит только главную функцию и имеет следующую структуру: директивы_препроцессора void main() { определения_объектов; ислолняемые_операторы; } Пока мы будем составлять только простейшие программы та­ кого вида. Рассмотрим все необходимые средства языка для составления линейных вычислительных программ. В качестве опорного примера рассмотрим программу для вычисления площади треугольника по формуле Герона. Пример 1. Дано: а, Ь, с — стороны треугольника. Вычислить S — площадь треугольника. По формуле Герона:

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

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

 

   Его называют оператором-выражением. Если вычисление выражения заканчивается присваиванием, то его можно назвать оператором присваивания. В рассматриваемой программе присутствуют два оператора присваивания: вычисления полупериметра (р) и вычисления площади треугольника (S). В выражении для вычисления площади используется библиотечная функция sqrt () — квадратный корень (как и в Паскале). Данная функция относится к библиотеке математических функций. Для подключения этой библиотеки к нашей программе используется директива препроцессора #include <math.h>. Здесь math.h — имя заголовочного файла этой библиотеки. В табл. 8 даны описания некоторых наиболее часто используемых функций математической библиотеки Си.

 

      В рассматриваемой программе операторы printf (...); и scanf (...); реализуют соответственно вывод на экран и ввод исходных данных с клавиатуры. Они осуществляют обращение к со­ ответствующим функциям стандартной библиотеки ввода-вывода Си, заголовочный файл которой имеет имя stdio.h. 

      Форматированный вывод на экран. Оператор вызова функции printf () имеет следующую структуру: printf(форматная_строка, список_аргументов); Форматная строка ограничена двойными кавычками (т.е. является текстовой константой) и может включать в себя произвольный текст, управляющие символы и спецификаторы формата. Спи­ сок аргументов может отсутствовать или же состоять из выражений, значения которых выводятся на экран (в частном случае из констант и переменных).

    В примере 1 оператор printf ("\па="); содержит текст ("а=") и управляющие символы ("\п"). Текст выводится на экран в том виде, в котором он записан. Управляющие символы влияют на рас­ положение на экране выводимых знаков. В результате выполнения этого оператора на экран с новой строки выведутся символы а=. Признаком управляющего символа является значок \. Ниже приводится их список: 

\п — перевод строки; 

\t — горизонтальная табуляция; 

\ г — возврат курсора к началу новой строки; 

\а — сигнал-звонок; 

\Ь — возврат на один символ (одну позицию);

 \f — перевод (прогон) страницы;

 \ v — вертикальная табуляция.

    Оператор printf ("ХпПлощадь треугольника=%Ј", s); содержит все виды параметров функции printf. Список аргументов состоит из одной переменной s. Ее значение выводится на экран. Пара символов % f является спецификацией формата выводимого значения переменной s. Значок % — признак формата, а буква f указывает на то, что выводимое число имеет вещественный (плавающий) тип и выводится на экран в форме с фиксированной точкой. Например, если в результате вычислений переменная s получит значение 32,435621, то на экран выведется: Площадь треугольника=32.435621          Спецификатор формата определяет форму внешнего представ ления выводимой величины. Вот некоторые спецификаторы фор­ мата: 

%с — символ;

 %s — строка; 

%d — целое десятичное число (тип int); 192

%u — целое десятичное число без знака (тип unsigned); 

%f — вещественные числа в форме с фиксированной точкой;

 %е — вещественные числа в форме с плавающей точкой (с мантиссой и порядком).

    Например, после выполнения следующих операторов

 float m,p; int k;

 m=84.3;

k=-12;

p=32.15; 

printf("\nm=%f\tk=%d\tp=%e",m, k,p);

 на экран выведется строка: 

m=84.299999 k=-12 p=3.21500e+01 

   Здесь дважды используемый управляющий символ табуляции \t отделил друг от друга выводимые значения. Из этого примера видно, что соответствие между спецификаторами формата и элементами списка аргументов устанавливается в порядке их записи слева направо. К спецификатору формата могут быть добавлены числовые пара­ метры: ширина поля и точность. Ширина — это число позиций, отводимых на экране под величину, а точность — число позиций под дробную часть (после точки). Параметры записываются между значком % и символом формата и отделяются друг от друга точкой. Внесем изменения в оператор вывода для рассмотренного выше примера. printf("\nm=%5.2f\tk=%5d\tp=%8.2e\tp=%ll.4e",m,k,p,p); В результате на экране получим: m=84.30 k= -12 р= 32.15 р= 3.2150е+01 Если в пределы указанной ширины поля выводимое значение не помещается, то этот параметр игнорируется и величина будет выводиться полностью. К спецификаторам формата могут быть добавлены модификаторы в следующих вариантах: %ld — вывод long int; %hu — вывод short unsigned; %Lf — вывод long double. Форматированный ввод с клавиатуры. Оператор вызова функ­ ции scanf () имеет следующую структуру: scanf(форматная_строка, список_аргументов);    Данная функция осуществляет чтение символов, вводимых с клавиатуры, и преобразование их во внутреннее представление в соответствии с типом величин. В функции scanf () форматная строка и список аргументов присутствуют обязательно. В программе из примера 1 имеется оператор:  scanf ("%f",&a); 

       Здесь "%f" - форматная строка; &a — список аргументов, состоящий из одного элемента. Этот оператор производит ввод числового значения в переменную а.  Символьную последовательность, вводимую с клавиатуры и воспринимаемую функцией scanf (), принято называть входным потоком. Функция scanf () разделяет этот поток на отдельные вводимые величины, интерпретирует их в соответствии с указанным типом и форматом и присваивает переменным, содержащимся в списке аргументов. 

       Список аргументов — это перечень вводимых переменных, причем перед именем каждой переменной ставится значок &. Это знак операции «взятие адреса переменной». Подробнее смысл этого действия будет объяснен позже, а пока примем это правило формально. Форматная строка заключается в кавычки (как и для printf) и состоит из списка спецификаций. Каждая спецификация начинается со знака %, после которого могут следовать *ширина_поля модификатор спецификатор Из них обязательным элементом является лишь спецификатор. Для ввода числовых данных используются следующие спецификаторы: 

d — для целых десятичных чисел (тип int); 

и — для целых десятичных чисел без знака (тип unsigned int); 

f — для вещественных чисел (тип float) в форме с фиксированной точкой; 

е — для вещественных чисел (тип float) в форме с плавающей точкой. 

      Звездочка в спецификации позволяет пропустить во входном потоке определенное количество символов. Ширина поля — целое положительное число, позволяющее определить число символов из входного потока, принадлежащих значению соответствующей вводимой переменной. Как и в спецификациях вывода для функции printf {), в спецификациях ввода функции scanf () допустимо использование модификаторов h f 1, L. Они применяются при вводе значений модифицированных типов: hd — для ввода значений типа short int; Id — для ввода значений типа long int; If, le — для ввода значений типа double в форме с фиксированной и плавающей точкой; Lf, Le — для ввода значений типа long double в форме с фиксированной и плавающей точкой. В программе из примера 1 все три величины а, Ь, с можно ввести одним оператором: 194 scanf ("%f%f%f",&a,&b,&c); Если последовательность ввода будет такой: 5 3.2 2.4 <Enter> то переменные получат следующие значения: а = 5,0, 6 = 3,2, с= 2,4. Разделителем в потоке ввода между различными значениями может быть любое количество пробелов, а также другие пробельные символы: знак табуляции, конец строки. Только после нажатия на клавишу Enter вводимые значения присвоятся соответствующим переменным. До этого входной поток помещается в буфер клавиатуры и может редактироваться. Потоковый ввод-вывод в Си++. Программируя на языке Си++, можно пользоваться средствами ввода-вывода стандартной библиотеки Си, подключаемой с помощью заголовочного файла stdio.h, как это делалось выше. Однако в Си++ имеются свои специфические средства ввода-вывода. Это библиотека классов, подключаемая к программе с помощью файла iostream.h. В этой библиотеке определены в качестве объектов стандартные символьные потоки со следующими именами: cin — стандартный поток ввода с клавиатуры; cout — стандартный поток вывода на экран. Ввод данных интерпретируется как извлечение из потока cin и присваивание значений соответствующим переменным. В Си++ определена операция извлечения из стандартного потока, знак которой». Например, ввод значений в переменную х реализуется оператором cin»x; Вывод данных интерпретируется как помещение в стандартный поток cout выводимых значений. Выводиться могут тексты, заключенные в двойные кавычки, и значения выражений. Знак операции помещения в поток «. Примеры использования потокового вывода: cout<<a+b; со1^«"\пРезультат="<<У; cout«"x="«x«" y="«y«" z="«z«endl; Из приведенных примеров видно, что в выходном потоке можно использовать управляющие символы, как и при использовании функции printf (); перед каждым элементом вывода нужно ставить знак операции «. Элемент вывода endl является так называемым манипулятором, определяющим перевод курсора на новую строку (действует аналогично управляющему символу \п). В процессе потокового ввода-вывода происходит преобразование из формы внешнего символьного представления во внутренний формат и обратно. Тип данных и необходимый формат  определяются автоматически. Стандартные форматы задаются специальными флагами форматирования, которые устанавливаются с помощью функции setf О. Кроме того, на формат отдельных выводимых данных можно влиять путем применения специальных манипуляторов. Здесь мы не будем подробно разбирать эти вопросы. Перепишем программу из примера I в варианте с использованием потокового ввода-вывода Си++.

 •include <iostream.h>

 •include <math.h> void main() 

{float a,b,c,p,s; cout«"\na="; cin»a;

 cout«"\nb="; cin»b; cout«"\nc="; cin»c; 

p=(a+b+c) /2; 

s=sqrt(p*(p-a)*(p-b)*(p-c)); 

сои1;«"\пПлощадь треугольника="«з;

 }

 



Поделиться:


Последнее изменение этой страницы: 2021-04-05; просмотров: 272; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.139.72.14 (0.04 с.)