Лекция №1. ВЕДЕНИЕ

Лекционный комплекс

Технология программирования

(наименование дисциплины)

 

 

Астана – 2013г

 

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

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

Основные особенности языка С следующие:

1) в нем реализованы некоторые операции низкого уровня;

2) его базовые типы данных совпадают с типами данных языка Ассемблера;

3) несмотря на присутствие таких составных объектов, как массивы и структуры, язык не допускает обращения с ними как с единым циклом;

4) широко использует указатели на переменные и функции;

5) удобным средством для передачи параметров являются ссылки;

6) считается языком для профессионалов, поэтому многое "доверяет" программисту: даже на такие важные действия, как преобразование типов, налагаются лишь незначительные ограничения;

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

Язык С служит базовой платформой для изучения языка С++. Язык С был разработан в США сотрудниками Bell Laboratories Б. Керниганом и Д. Ритчи и использован для создания ОС UNIX. Язык программирования (ЯП) С++ широко использует средства объектно-ориентированного программирования. На его основе построены дополнительные средства для работы под управлением операционной системы Windows. Кроме того, язык С++ служит базой для создания событийно-ориентированной среды программирования Builder C++.

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

Основные определения языка С

Переводом программы с языка, на котором она написана, на машинный и анализом ее синтаксиса занимается программа - компилятор, Иногда компилятор называют более общим термином - транслятор.

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

В ЯП С комментарии обозначаются символами /* */:

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

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

Алфавит языка С (С++) включает:

* прописные латинские буквы А ... Z;

* строчные латинские буквы а. .. z;

* арабские цифры 0 . . . 9;

* разделители:,, ., ;, ?, ', !, |, /, \, ~, _, #, %, &, ^, =, -, +, *, (, ), {, }, [, ], <, >;

* пробельные символы: SP, H_TAB, CR, LF, V_TAB, FF, Ctrl-Z (конец текстового файла);

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

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

\n - новая строка; \t - горизонтальная табуляция;

\r - возврат каретки; \f- новая страница;

\a - звуковой сигнал; \' - апостроф;

\" - двойные кавычки; \\ - обратный слэш.

Компилятор языка С (С++) воспринимает одну и ту же прописную и строчную латинскую букву как различные символы. Другими словами, имена MyProgram, MYPROGRAM и myprogram С - компилятор будет трактовать как три различных имени.

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

Структура программы на языке С

Директива #include подключает заголовочный файл, в данном случае <stdio.h>, содержащий средства поддержки операций стандартного ввода-вывода: main () - имя основной программы, оно всегда присутствует и всегда одинаково. В программе на языке С в скобках стояло бы слово void: main (void); void перед словом main служит признаком того, что программа не возвращает конкретного значения; { } - скобки, ограничивающие тело программы.

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

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

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

Рассмотрим программу, содержащую элементы вычислений, ввод данных и вывод результатов.

#include <stdio.h>

void main( )

{float m, p, q;

printf ("Введите значения p и q ");

scanf("%f,%f",&p,&q);

m = p/q;

printf("m = %f/%f= %f\n ", p, q, m);}

Здесь float m, p, q; - объявление трех переменных вещественного (действительного) типа; scanf ("%f, %f", &p, &q); - способ организовать ввод двух вещественных чисел.

Первое из введенных с клавиатуры чисел будет присвоено переменной p, второе - переменной q. Следует обратить внимание на знак & перед именем переменной.

В примере printf ("m = %f / %f = %f \n", p, q, m); - на место первого %f будет подставлено значение p, на место второго - значение q, на места третьего - значение m.

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

Здесь приведена простейшая программа, однако она позволяет сделать выводы о структуре С -программы:

1) любая программа начинается словом main();

2) перед использованием переменной она объявляется с указанием типа

3) могут содержаться заголовочные файлы, подключенные директивой #include.

Лекция №2. СТАНДАРТНЫЕ ТИПЫ ДАННЫХ

Язык С является типизированным языком с той точки зрения, что каждая используемая переменная должна быть объявлена с указанием типа, чтобы занять для нее достаточно места в ОЗУ ЭВМ. Однако в смысле преобразования типов язык С менее строг, чем другие языки программирования.

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

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

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

Язык С имеет некоторые особенности представления данных и преобразования типов, например для представления маленьких целочисленных значений можно использовать тип char, который, хотя и предназначен для представления символов, может поддерживать целочисленные значения в диапазоне от -128 до 127 или от 0 до 255.

Все целые типы - char, short, int и long - являются знаковыми по умолчанию, но можно объявить их как беззнаковые, которые, занимая тот же объем памяти, что и их знаковые аналоги, представляют только положительные значения, включая нуль. Вследствие этого они могут представлять вдвое больше положительных значений.

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

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

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

double dl=2.35; // представление числа в формате с десятичной точкой;

double d2=2.0E-5; // представление числа в экспоненциальной форме.

Символьные типы, конечно, хранят отдельные символы в кодах ASCII (American Standard Code for Information Interchange), но могут содержать и небольшие целочисленные значения.

Можно объявлять переменные и одновременно присваивать им значения, т. e. инициализировать их. Инициализацией называется присваивание переменным начальных значений.

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

Константы

Данные в языках программирования могут представляться также в виде констант. Константы используются в тех случаях, когда программе запрещено изменять значение какой-либо переменной. В этом случае ее объявляют как константу следующим образом: const int intVal=25;

Символьная константа состоит из одного символа, заключенного апострофы: 'q', '2', '.' и т. д.: const char sym='m';

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

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

Добавление к константам, имеющим тип double буквы f или F приводит к тому, что они приобретают тип float, а буквы l или L - тип long double.

В языке С++, помимо числовых и символьных констант, используются строковые константы. Строковая константа состоит из последовательности символов кода ASCII, заключенной в кавычки.

Выражения

Запись Переменная = Выражение;

интерпретируется как "присвоить Переменной значение Выражения", а выполняется следующим образом: вычисляется значение Выражения стоящего справа от знака присваивания (=), и полученный результат становится значением, которое принимает переменная, стоящая слева от знака присваивания: A=5+2;

Необходимо помнить о том, что знак "=" - это знак присваивания, а не знак равенства. Присваивание является выражением, так как имеет значение, равное присваиваемому результату. Следуя этому правилу, можно заметить, что i=(j=k) тоже является выражением, поскольку j=k - выражение, имеющее конкретный результат, так же, как i=j. Кроме того, скобки можно опустить, тогда выражение i=j=k присваивает значение k переменным i и j, а выражение i=j=k=125252 - значение 125252 всем трем переменным. Это очень удобно при инициализации нескольких переменных одним значением.

Выражение представляет собой объединение операций и операндов. Операндом называется то, над чем выполняется операция. Каждое выражение в языке С имеет значение, которое присваивается переменной, стоящей слева.

Операторы

Типы операций, применяемые при построении выражений: арифметические; отношений; логические и поразрядные; инкремента и декремента; присваивания.

Арифметические операции: * - умножение; / - деление; + - сложение; - - вычитание; % - деление по модулю (взятие остатка от целочисленного деления).

Все перечисленные операции здесь выполняются традиционным образом, кроме операции деления. Особенность операции деления заключается в том, что она дает целый результат, если оба операнда целые. Чтобы получить действительный результат, необходимо иметь хотя бы один действительный операнд. Так, 9/5 даст 1, 9/5.0 будет равно 1.8.

Необходимо помнить, что все операции в языках программирования следует указывать в явном виде. Запись выражения a*b в виде ab приведет к тому, что произведение будет интерпретироваться как идентификатор (имя) ab со всеми вытекающими из этого проблемами.

Операции отношений в языках программирования, как и в математике, используются для сравнений. В языке С++ применяются следующие опера­ции отношений: < - меньше; <= - меньше или равно; > - больше; >= - больше или равно; = -равно; != - не равно.

Не следует путать знак "= =" со знаком "=", так как это приводит к возникновению трудно обнаруживаемых ошибок.

Операции отношения, а также логические и поразрядные (побитовые) операции имеют своим результатом логическое значение. Но в языке С нет встроенного логического типа в привычном понимании, т. e. типа, имеющего два значения: true (истина) и false (ложь). Здесь в качестве логических значений используются целочисленные значения, причем нуль интерпретируется как ложь, а любое ненулевое значение - как истина.

К логическим операциям относятся: логическое "И" (&&), логическое "ИЛИ" (||) и логическое отрицание (!). Логические операции используются в тех случаях, когда необходимо объединить несколько условных выражений.

Логические операции обладают следующими свойствами. Если VI и V2 - два условных выражения, то:

V1 && V2 - истинно, когда истинны оба выражения одновременно;

V1 || V2 - истинно, когда истинно по крайней мере одно из выражений;

! V1 - отрицание истинно, когда V1 ложно;

! V1 - отрицание ложно, когда V1 истинно;

Поразрядные операции или операции с разрядами (битами) нельзя применять к переменным типа float и double. K таким операциям относятся: поразрядное "И" (&), поразрядное "ИЛИ" ( | ), поразрядная инверсия (~), поразрядное "исключающее ИЛИ" (^), сдвиг влево (<<), сдвиг вправо (>>).

В языке С существуют две операции, не встречающиеся в математике: инкремент (++) и декремент (--). Операция инкремента прибавляет к операнду единицу, а операция декремента вычитает из операнда единицу.

i+ + эквивалентно i = i+l; i- - эквивалентно i = i-l.

Выражения, подобные i++ и i- -, имеют значения, которые зависят от расположения знаков ++ и - -.

Запись j = i++ (постфиксная форма записи) эквивалентна j = i; i++;

j = ++i (префиксная форма записи) эквивалентна i++; j = i.

Пример. Запись sum=a+ b++; означает "сложить а и b, присвоить результат sum и увеличить b на единицу", а запись sum=a+ ++b; - "увеличить b на единицу, сложить а и b и присвоить результат sum": а = 2; b = 5; sum = a+ b++; sum = a+ ++b;

Операция присваивания в языке С, помимо привычного вида, имеет нетрадиционное представление. Использование этого представления связано с тем, что, например, выполнение операции A=A+25 приводит к двукратному вычислению адреса переменной А: для нахождения исходного значения и для занесения полученного результата. Можно ликвидировать эту избыточность, записав A+=25.

Символ += также называется операцией присваивания и дает компилятору указание прибавить число 25 к значению А и результат запомнить в А. Полный набор операций присваивания: *=, /=, +=, - =, %=, <<=, >>=, &=, ^=, \=.

Например: cnt+=50; // cnt=cnt+50;

cnt%=2; // cnt=cnt%2;

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