Лекция №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;
Операторы служат основными элементами, из которых строится программа на языке С++. Каждый оператор в языке С++ заканчивается точкой с запятой, являющейся составной частью оператора, а не разделителем между ними.