Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Лекции по C/С++ - файл Л1.doc


Лекции по C/С++
скачать (357.8 kb.)

Доступные файлы (8):

Л1.doc318kb.06.09.2009 15:02скачать
Л2.doc250kb.06.09.2009 14:56скачать
Л3.doc127kb.07.12.2009 15:34скачать
Л4.doc250kb.06.09.2009 14:57скачать
Л5.doc151kb.06.09.2009 14:58скачать
Л6.doc165kb.06.09.2009 14:58скачать
Л7.doc150kb.06.09.2009 14:58скачать
Л8.doc269kb.13.01.2006 20:00скачать

содержание
Загрузка...

Л1.doc

Реклама MarketGid:
Загрузка...

Лекция №1


  1. ВВЕДЕНИЕ В ЯЗЫК С/С++.

ОСНОВНЫЕ ПОНЯТИЯ ЯЗЫКА С/С++

1.1. Введение

Язык программирования служит двум связанным между собой целям: он дает программисту аппарат для задания действий, которые должны быть выполнены, и формирует концепции, которыми пользуется программист, размышляя о том, что делать. Первой цели идеально отвечает язык, который настолько «близок к машине», что всеми основными машинными аспектами можно легко и просто оперировать достаточно очевидным для программиста образом. С таким умыслом первоначально задумывался C. Второй цели идеально отвечает язык, который настолько «близок к решаемой задаче», чтобы концепции ее решения можно было выражать прямо и коротко. С таким умыслом предварительно задумывались средства, добавленные к C для создания С++.
^

Название С++ выдумал Рик Масситти (лето 1983-его). Более ранние версии языка использовались, начиная с 1980-ого, и были известны как «C с Классами».

Язык С++, как и С , удобен для написания операционных систем(ОС), поэтому его называют языком системного программирования. Так, например, операционная система UNIX и ее программное обеспечение написаны на С.


С++ был развит из языка программирования C и за очень немногими исключениями сохраняет C как подмножество. Базовый язык C, подмножество С++, спроектирован так, что имеется очень близкое соответствие между его типами, операциями и операторами и компьютерными объектами, с которыми непосредственно приходится иметь дело: числами, символами и адресами. За исключением операций свободной памяти new и delete, отдельные выражения и операторы С++ обычно не нуждаются в скрытой поддержке во время выполнения или подпрограммах.

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

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



Самостоятельная проработка:



Особое внимание, уделенное при разработке С++ структуре, отразилось на возрастании масштаба программ, написанных со времени разработки C. Маленькую программу (меньше 1000 строк) вы можете заставить работать с помощью грубой силы, даже нарушая все правила хорошего стиля. Для программ больших размеров это не совсем так. Если программа в 10 000 строк имеет плохую структуру, то вы обнаружите, что новые ошибки появляются так же быстро, как удаляются старые. С++ был разработан так, чтобы дать возможность разумным образом структурировать большие программы таким образом, чтобы для одного человека не было непомерным справляться с программами в 25 000 строк. Существуют программы гораздо больших размеров, однако те, которые работают, в целом, как оказывается, состоят из большого числа почти независимых частей, размер каждой из которых намного ниже указанных пределов. Естественно, сложность написания и поддержки программы зависит от сложности разработки, а не просто от числа строк текста программы, так что точные цифры, с помощью которых были выражены предыдущие соображения, не следует воспринимать слишком серьезно.

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

Из всего сказанного следует, что язык программирования C++ - это C*, расширенный введением классов, inline-функций, перегруженных операций, перегруженных имен функций, константных типов, ссылок, операций управления свободной памятью, проверки параметров функций. Коротко различия между С++ и «старым С»:

- Типы параметров функции могут быть заданы и будут проверяться. Могут выполняться преобразования типов;

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

- Имена функций могут быть перегружены;

- Операции могут быть перегружены;

- Может осуществляться inline-подстановка функций;

- Объекты данных могут быть константными (const);

- Могут быть описаны объекты ссылочного типа;

- Операции new и delete обеспечивают свободное хранение в памяти;

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

- Имя класса является именем типа;

  • Любой указатель может присваиваться [указателю] void* без приведения типа.


1.2. ОСНОВНЫЕ ПОНЯТИЯ ЯЗЫКА ПРОГРАММИРОВАНИЯ C/С++
^

1.2.1. АЛФАВИТ ЯЗЫКА


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

В алгоритмическом языке программирования имеются аналогичные структурные элементы:

1) ^ Символы языка - это элементарные знаки, используемые для составления любых текстов. Hабор таких символов называют алфавитом языка.

2)Слово - последовательность символов.

3)Выражение - группа слов.

4)Оператор -определенная комбинация слов и выражений.


Самостоятельная проработка:


Множество символов используемых в языке С++ можно разделить на пять групп.

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

Таблица 1

Прописные буквы латинского алфавита

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Строчные буквы латинского алфавита

a b c d e f g h i j k l m n o p q r s t u v w x y z

Символ подчеркивания

_

2. Группа прописных и строчных букв русского алфавита и арабские цифры (табл.2).

Таблица 2

Прописные буквы русского алфавита

А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Ь Э Ю Я

Строчные буквы русского алфавита

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

Арабские цифры

0 1 2 3 4 5 6 7 8 9

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

Таблица 3

Символ

Наименование

Символ

Наименование

,

запятая

)

круглая скобка правая

.

точка

(

круглая скобка левая

;

точка с запятой

}

фигурная скобка правая

:

двоеточие

{

фигурная скобка левая

?

вопросительный знак

<

меньше

'

апостроф

>

больше

!

восклицательный знак

[

квадратная скобка

|

вертикальная черта

]

квадратная скобка

/

дробная черта

#

номер

\

обратная черта

%

процент



тильда

&

амперсанд

*

звездочка

^

логическое не

+

плюс

=

равно

-

мину

«

кавычки

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

5. Кроме выделенных групп символов в языке С++ широко используются так называемые, управляющие последовательности ( или ESCAPE-последовательности), т.е. специальные символьные комбинации, используемые в функциях ввода и вывода информации. Управляющая последовательность строится на основе использования обратной дробной черты (\) (обязательный первый символ) и комбинацией латинских букв и цифр (табл.4).

Таблица 4

^ Управляющая последовательность

Наименование

Шеснадцатеричная замена

\a

Звонок

007

\b

Возврат на шаг

008

\t

Горизонтальная табуляция

009

\n

Переход на новую строку

00A

\v

Вертикальная табуляция

00B

\r

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

00C

\f

Перевод формата

00D



Кавычки

022

\'

Апостроф

027

\0

Ноль-символ

000

\\

Обратная дробная черта

05C

\ddd

Символ набора кодов ПЭВМ в восьмеричном представлении

 

\xddd

Символ набора кодов ПЭВМ в шестнадцатеричном представлении

 

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

\r - общая управляющая последовательность,

\015 - восьмеричная управляющая последовательность,

\x00D - шестнадцатеричная управляющая последовательность.



^

1.2.2. ДОГОВОРЕННОСТИ О ЛЕКСИКЕ


Когда компилятор обрабатывает программу, он разбивает программу на группы символов, называемых лексемами.

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

Есть шесть классов лексем: идентификаторы(имена), ключевые слова, константы, строки, операторы и прочие разделители(см. табл.3), такие как квадратные скобки ([]), фигурные скобки ({}), угловые скобки (<>),круглые скобки и запятые. Границы лексем определяются пробельными символами и другими лексемами, такими как операции и знаки пунктуации. Чтобы предупредить неправильную работу компилятора, запрещаются пробельные символы между символами идентификаторов, операциями, состоящими из нескольких символов, кроме операции присваивания, и символами ключевых слов. Количество пробелов, являющихся границами лексем, не является значащим, там, где можно поставить один пробел, можно поставить их сколько угодно:

с=2+2; и с= 2 + 2; для компилятора эквивалентны.

1.2.2.1 Комментарии


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

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

Пример: /* Задание1 */ В данном случае комментарий занимает некоторую часть строки ( на этой же строке можно продолжать написание части программы, которая уже не будет относиться к комментариям).

или /* Задание 1 Все, что будет находиться в этой строке, считается комментарием.

Выполнено */ А здесь уже нет.

// Вся строка комментарий.

Допускается вставка комментариев в описания переменных, констант, в выражения и т.д. Пример:

int /*объявление*/ i /* целого типа*/;

При задании комментариев желательно( но не всегда обязательно) ставить пробелы перед или(и) после их написания.

Пример:

int /*объявление*/ k =р//* деление на а*/ а;

+с;

В данном примере знак деления, т.к. он не отделен пробелом от начала комментария вида /*, будет отнесен к началу комментария вида //, и результат примет вид int k =р+с;
^

1.2.2.2 Идентификаторы (имена)


Идентификатор – произвольное имя любой длины, определяемое пользователем. Представляет собой последовательность латинских букв(от А до Z или от a до z), цифр(от 0 до 9) и знака подчеркивания ( _ ). Может начинаться с буквы или знака подчеркивания ; буквы в верхнем и нижнем регистрах являются различными.

Два идентификатора, для образования которых используются совпадающие строчные и прописные буквы, считаются различными. Например: abc, ABC, A128B, a128b .

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

Важной особенностью является то, что компилятор допускает любое количество символов в идентификаторе, хотя значимыми являются первые 32(?) символ.



Самостоятельная проработка:


Число значимых символов не может быть увеличено, но может быть уменьшено при помощи меню или опций командной строки: опция -In TCC или опцией меню O|C|S|Identifier Length (?).

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

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

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



^

1.2.2.3 Ключевые слова


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

asm auto break case char class const

continue default delete do double else enum

extern float for friend goto if inline

int long new operator overload public register

return short sizeof static struct switch this

typedef union unsigned virtual void while

Идентификаторы signed и volatile зарезервированы для применения в будущем.
^

1.2.2.4 Элементы данных

К основным элементам данных относятся константы и переменные.


Они бывают локальные(местные) и глобальные. Переменные и постоянные, описанные внутри функций, называются локальными и существуют только при работе объявляющих их функций. Переменные и константы (постоянные), объявленные вне функций, называются глобальными. Среди глобальных переменных и постоянных не может быть двух с одинаковыми именами, а локальные могут дублировать глобальные имена и имена друг друга(при этом обращение к таким именам внутри подпрограмм соответствуют обращениям к локальным переменным и постоянным, а вне их - к глобальным. Локальные и глобальные переменные и константы хранятся в разных местах и даже при одинаковых значениях не влияют друг на друга. Глобальная переменная хранится в сегменте данных ( размер 63кб). Если этого мало, то используются ссылки и динамические переменные. Локальные переменные существуют только при работе объявляющих функций и хранят свои значения в специальной области памяти – стеке. По умолчанию размер стека = 16кб (это максимальный объем всех локальных переменных, работающих одновременно). После работы подпрограммы ее локальные переменные освобождают стек.

1.2.2.4.1 Константы


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

Константы бывают:

  1. типизированные ( с указанием типа константы);

  2. нетипизированные (без указания типа константы).

Их можно описать двумя способами:

  1. при помощи модификатора const - для типизированных;

  2. при помощи директивы #define( использование макроса, см.#) – для нетипизированных.

^ Форма записи:

Const СпецификаторТипа <ИмяПеременной1=Значение1, …,ИмяПеременнойN=ЗначениеN>;

#define Идентификатор_макроса <Последовательность_лексем> (подробнее см. . #)

В качестве значения может использоваться:

  1. непосредственно число указанного типа;

  2. простое выражение, допустимое для заданного типа данных( допускается использовать в них описанные ранее константы или переменные со стартовым значением (см. #2.2.4.2)).

Примеры:

const int I=6, j=3+2*4, k=I*j+5;

#define h 3;

#define m 3*h+k;

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

Примеры:


const float pi= 3.1415926; //константа плавающего типа

const maxint = 32767; //целочисленная константа

const mas[5]={7,9,3,5,2}; //массив констант

char *const str= “Hello, world!”; // указатель константа

char const *str2= «Hello, world!»; // указатель на константу

и

#define nil “”;

#define n 7*2-2; “”;
С учетом этого, следующие операторы являются недопустимыми:

pi= 3.0; /* присвоение значения константе pi */

i= maxint++; /* инкремент константы maxint*/

str = «Hi, there!»; /* установка указателя str на что-то еще*/

Однако, отметим, что вызов функции strcpy(str,»Hi, there!») является допустимым, поскольку он выполняет посимвольное копирование из строкового литерала «Hi, there!» в адрес памяти, указываемый str.

В С++ const также «скрывает» объект const и предотвращает внешнюю компоновку. При необходимости нужно использовать extern const. Указатель на const не может быть присвоен указателю на не const (в противном случае значению const могло было быть выполнено присвоение при помощи указателя на не const.)

Например,


char str3 = str2 / запрещено */

В зависимости от типов данных константы бывают следующих видов:

  1. целые;

  2. с плавающей точкой;

  3. символьные;

  4. строковые;

  5. перечислимые.

1.2.2.4.2 Переменные


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

Любая переменная, встречающаяся в программе, имеет имя (идентификатор) и должна быть описана. Требования к имени переменной такие же, как и к идентификаторам. Возможно и рекомендуется переменной задавать стартовое значение. Когда программа начинает работать, места под значения отведены, но не очищены. Это означает, что в ячейках памяти может быть все, что угодно (остатки от другой программы или ее следы ). Поэтому важно, чтобы каждая переменная перед использованием была бы заполнена имеющим смысл или хотя бы нулевым (пустым) значением.

Форма записи:

СпецификаторТипа <ИмяПеременной1, …, ИмяПеременнойN>;
^

или для переменных со стартовым значением

СпецификаторТипа <ИмяПеременной1=Значение1, …, ИмяПеременнойN=ЗначениеN>;


Как и для констант в качестве стартового значения могут быть:

  1. непосредственно число указанного типа;

2) простое выражение, допустимое для заданного типа данных( допускается использовать в них описанные ранее константы или переменные со стартовым значением (см. #2.2.4.2)).

^

Примеры:

float X;

double A,B;

int i, j=0,k=7+j, m=k*2+5;

char znak=’=’;




Самостоятельная проработка:


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

Пример:

volatile int ticks;

interrupt timer()

{

ticks++;

}

wait(int interval)

{

ticks=0;

while (ticks<interval);

}

Эти подпрограммы (предполагается, что timer правильно связана с аппаратным прерыванием часов) реализуют выдержку по времени между «тиканьем» часов, заданную аргументом interval. Высоко оптимизированный компилятор не может загружать значение ticks в проверку выхода из цикла while, т.к. цикл не изменяет значение ticks.





^ 2. ПРОСТЫЕ ТИПЫ ДАННЫХ

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

Тип используется для

- определения требуемого количества памяти при ее исходном распределении,

- интерпретации битовых кодов, находимых в объектах при последующих к ним обращениях,

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


^ Таксономия типа
Существует четыре базовые категории типа: void, scalar, function, aggregate. Тип Scalar подразделяется на арифметический, перечислимый, указатель и в С++ ссылки. Тип Aggregate подразделяется на массив, структуру, объединение и класс. Простые типы называют также фундаментальными, а сложные – производными








Самостоятельная проработка:


^

2.1. Целый тип данных


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

Таблица 5

Тип

Размер памяти в байтах

Диапазон значений

Название типа

char

1

от –128 до 127

Символьный

int

Для IBM XT,AT,SX,DX 2

 

Целый

short

2

от -32768 до 32767

Короткий целый

long

4

от -2 147 483 648 до 2 147 483 647

Длинный целый

unsigned сhar

1

oт 0 до 255

Символьный без знака

unsigned int

Для IBM XT,AT,SX,DX 2

 

Целый без знака

unsigned short

2

от 0 до 65535

Короткий целый без знака

unsigned long

4

от 0 до 4 294 967 295

Длинный целый без знака

Отметим, что ключевые слова signed и unsigned необязательны. Они указывают, как интерпретируется нулевой бит объявляемой переменной, т.е., если указано ключевое слово unsigned, то нулевой бит интерпретируется как часть числа, в противном случае нулевой бит интерпретируется как знаковый. В случае отсутствия ключевого слова unsigned целая переменная считается знаковой. В том случае, если спецификатор типа состоит из ключевого типа signed или unsigned и далее следует идентификатор переменной, то она будет рассматриваться как переменная типа int. Целые без знака, описываемые как unsigned, подчиняются правилам арифметики по модулю 2n, где n - число бит в их представлении.

Например:

unsigned int n;

unsigned int b; int c; (подразумевается signed int c );

unsigned d; (подразумевается unsigned int d );

signed f; (подразумевается signed int f ).

Следует сделать следующее замечание: в языке С++ не определено представление в памяти и диапазон значений для идентификаторов с модификаторами типа int и unsigned int. Размер памяти для переменной с модификатором типа signed int определяется длиной машинного слова, которое имеет различный размер на разных машинах. Так, на 16-ти разрядных машинах размер слова равен 2-м байтам, на 32-х разрядных машинах соответственно 4-м байтам, т.е. тип int эквивалентен типам short int, или long int в зависимости от архитектуры используемой ПЭВМ. Таким образом, одна и та же программа может правильно работать на одном компьютере и неправильно на другом. Для определения длины памяти занимаемой переменной можно использовать операцию sizeof языка С++, возвращающую значение длины указанного модификатора-типа.

Например:

a = sizeof(int); b = sizeof(long int);c = sizeof(unsigned long);


Константы целого типа

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

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

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

^ Шестнадцатеричная константа начинается с обязательной последовательности 0х или 0Х и содержит одну или несколько шестнадцатеричных цифр (цифры представляющие собой набор цифр шестнадцатеричной системы счисления: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)

^ Примеры целых констант:

Десятичная Восьмеричная Шестнадцатеричная

константа константа константа

16 020 0x10

127 0117 0x2B

240 0360 0XF0

Если требуется сформировать отрицательную целую константу, то используют знак ‘-‘ перед записью константы (который будет называться унарным минусом). Например: -0x2A, -088, -16 .



Самостоятельная проработка:



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

• десятичные константы рассматриваются как величины со знаком, и им присваивается тип int (целая) или long (длинная целая) в соответствии со значением константы. Если константа меньше 32768, то ей присваивается тип int в противном случае long.

• восьмеричным и шестнадцатеричным константам присваивается тип int, unsigned int (беззнаковая целая), long или unsigned long в зависимости от значения константы согласно табл 6.

Таблица 6

^ Диапазон шестнадцатеричных констант

Диапазон восьмеричных констант

Тип

0x0 - 0x7FFF

0 - 077777

int

^ 0X8000 - 0XFFFF

0100000 - 0177777

unsigned int

0X10000 - 0X7FFFFFFF

0200000 - 017777777777

long

^ 0X80000000 - 0XFFFFFFFF

020000000000 - 037777777777

unsigned long

Для того чтобы любую целую константу определить типом long, достаточно в конце константы поставить букву «l» или «L».

Пример: 5l, 6l, 128L, 0105L, OX2A11L.

Отметим также, что восьмеричные и шестнадцатеричные константы также могут иметь модификатор unsigned. Это достигается указанием префикса u или U после константы, константа без этого префикса считается знаковой. Если Константы с указанным префиксом называются явно заданными.

Например:

const I= 0xA8C; // константа типа int signed

const L= 01786l; // константа типа long signed

int u= 0xF7u; // переменная типа int unsigned




Символьная константа

Символьная константа - представляется символом заключенном в апострофы. Символьные константы имеют тип int и при преобразовании типов дополняются знаком. Некоторые неграфические символы, одиночная кавычка ' и обратная косая \, могут быть представлены в соответствие с таблицей escape-последовательностей (табл.4). Управляющая последовательность рассматривается как одиночный символ, допустимо ее использовать в символьных константах. Значением символьной константы является числовой код символа.

Примеры:

' '- пробел , 'Q'- буква Q , '\n' - символ новой строки ,

'\\' - обратная дробная черта , '\v' - вертикальная табуляция .

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

Например:

символ \h представляется символом h в строковой или символьной константе.

^ Строковая константа

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

Например: “Школа N 35”, “город Тамбов”, “YZPT”.

Строковый литерал имеет тип char[] . Это означает, что строка рассматривается как массив символов. Отметим важную особенность, число элементов массива равно числу символов в строке плюс 1, так как нулевой символ (символ конца строки) также является элементом массива.

Символы строкового литерала сохраняются в области оперативной памяти. В конец каждого строкового литерала компилятором добавляется нулевой символ, представляемый управляющей последовательностью \0.



Самостоятельная проработка:


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

Например:

#include <stdio.h>

main()

{ char *p;

p = “Это пример того, как Turbo C++ “

“автоматически\nвыполняет для вас конкатенацию “

“очень длинных строк,\nчто позволяет получить “

“более красивые программы“;

printf(“%s”,p); }

На выходе программы будет:

Это пример того, как Turbo C++ автоматически

выполняет для вас конкатенацию очень длинных строк,

что позволяет получить более красивые программы.

Для расширения строковой константы за границы строки в качестве символа продолжения можно использовать обратную наклонную черту (\):

printf(“В действительности \

это однострочная строка символов”);

Отметим, что все управляющие символы, кавычка (“), обратная дробная черта (\) и символ новой строки в строковом литерале и в символьной константе представляются соответствующими управляющими последовательностями. Каждая управляющая последовательность представляется как один символ. Например, при печати литерала “Школа \n N 35” его часть “Школа” будет напечатана на одной строке, а вторая часть “N 35” на следующей строке.

Следует отметить, что в строковых константах всегда обязательно задавать все три цифры в управляющей последовательности (см.#2.1). Например, отдельную управляющую последовательность \n (переход на новую строку) можно представить как \010 или \xA, но в строковых константах необходимо задавать все три цифры, в противном случае символ или символы следующие за управляющей последовательностью будут рассматриваться как ее недостающая часть.

Например:

“ABCDE\x009FGH” данная строковая команда будет напечатана с использованием определенных функций языка С++, как два слова ABCDE FGH, разделенные 8-ю пробелами, в этом случае если указать неполную управляющую строку”ABCDE\x09FGH”,то на печати появится ABCDE=|=GH, так как компилятор воспримет последовательность \x09F как символ”=+=”.

printf(«\x0072.1Простая операционная система»);

Предполагается, что эта строка будет интерпретирована как \x007 и «2.1Простая операционная система». Однако, Turbo C++ (и TurboC версии 2.0) компилируют ее как шестнадцатеричное число \x0072 и литеральную строку «.1Простая операционная система».

Чтобы избежать этих проблем, надо переписать ваш код следующим образом:

printf(«\x007» «2.1Простая операционная система»);

Неоднозначность может возникнуть также и в случае, когда за восьмеричной управляющей последовательностью следует невосьмеричная цифра. Например, поскольку 8 и 9не являются допустимыми восьмеричными цифрами, константа \258 будет интерпретирована как двухсимвольная константа, составленная из символов \25 и 8.


^

2.2. Данные плавающего типа


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

  1. с фиксированной точкой ( изображаются десятичным числом с дробной частью, которая может быть и нулевой). Дробная часть отделяется от целой с помощью точки.
Например: 27.3, 5.0, -16.003, 200.59

  1. с плавающей точкой (они имеют вид: mEp - где m - мантисса; Е -признак записи числа с десятичным порядком; р - порядок числа). В качестве m могут быть целые числа и действительные числа с фиксированной точкой (если целая часть мантиссы равна 0, то ее можно опустить, оставив только точку и дробную часть, стоящую после нее) . В качестве р могут быть только целые числа. Как мантисса, так и порядок могут содержать знаки '+' или '-' (знак '+' необязателен).

Например: -7.64Е8, 9.1е-2, .967е+3.



Самостоятельная проработка:



Таблица 7

Тип

Размер памяти в байтах

Диапазон значений

Название типа

Float

4

от 3.4·10-38 до 3.4·1038

С плавающей точкой одинарной точности

double

8

от 1.7·10-308 до 1.7·10308  

С плавающей точкой двойной точности

Long double

10

от 3.4·10-4932 до 1.1·104932

Длинный с плавающей точкой двойной точности

При отсутствии каких-либо суффиксов константы плавающего типа по умолчанию имеют тип данных double. Однако, можно присвоить константе с плавающей точкой тип данных float, добавив к ней суффикс f или F. Аналогичным образом, суффикс l или L присвоит константе тип данных long double. Это относится как к десятичным, так и к восьмеричным или шестнадцатеричным константам. Эти константы называются явно заданными.
^ Внутреннее представление типов данных

Направление возрастания значимости



i
15

0
nt
(дополнение до 2)



unsigned

int


long int (дополнение до 2)


31




float



double


63

0

long

double

s – знаковый бит(0- положительный, 1- отрицательный)

| | - позиция неявной двоичной точки

1- целочисленный бит мантиссы:

записывается в long double

неявно (всегда 1) в float, double

Смещенный порядок (нормализованные значения):

float - 127 (7FH)

double –1023 (3FFH)

long double – 16383 (3FFFH)


Алгоритм и программа

На первом этапе создания программы программист должен определить последовательность действий, которые необходимо выполнить, чтобы решить поставленную задачу, т. е. разработать алгоритм. Алгоритм — это точное предписание, определяющее процесс перехода от исходных данных к результату.

Алгоритм решения задачи может быть представлен в виде словесного описания или графически — в виде блок-схемы. При изображении алгоритма в виде блок-схемы используются специальные символы (рис. 1.1).




Рис. 1.1. Основные символы, используемые для

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







Скачать файл (357.8 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru