Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmirovanie_Lektsii.doc
Скачиваний:
21
Добавлен:
21.09.2019
Размер:
227.84 Кб
Скачать

Лекция 1.

План

  1. Определение алгоритма

  2. Классификация языков

  3. Блоки

  4. Применение языка С

  5. Типичный вид С-программ

  6. Основные термины

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

Как правило, для данного алгоритма можно выделить 7 характеризующих его параметров:

  1. совокупность возможных исходных данных;

  2. совокупность возможных результатов;

  3. совокупность возможных промежуточных результатов;

  4. правило начала;

  5. правило непосредственной переработки;

  6. правило окончания;

  7. правило извлечения результата.

Высокий уровень

Ада

Модула-2

Паскаль

COBOL

Фортран

Бейсик

Средний уровень

С++

С

FORTH

Макро Ассемблер

Низкий уровень

Ассемблер

Структурированные

Паскаль

Ада

С++

С

Модула-2

Неструктурированные

Фортран

Бейсик

COBOL

Блоки

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

if (x<10) {

printf(“too low, try again”);

count++;

}

Применение языка С

  • Операционные системы

  • Интерпретаторы

  • Редакторы

  • Ассемблерные программы

  • Компиляторы

  • Процессоры баз данных

Типичный вид С-программ

глобальные объявления

возвращаемый_тип main(список параметров)

{

последовательность операторов

}

возвращаемый_тип f1(список параметров)

{

последовательность операторов

}

.

.

.

возвращаемый_тип fN(список параметров)

{

последовательность операторов

}

Обозрение терминов

Исходный код

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

Объектный код

Результат перевода исходного кода в машинный. Объектный код вводится в компоновщик.

Компоновщик

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

Библиотека

Файл, содержащий стандартные функции, которые могут использоваться программой. Данные функции содержат все операции ввода-вывода, а также другие полезные подпрограммы.

Время компиляции

События, возникающие при компиляции программы

Время выполнения

События, возникающие при выполнении программы

Идентификаторы

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

Корректные

Некорректные

count

test23

high_balance

1count

hi!there

high..balance

Типы данных

char

int

float

double

void

Модификаторы типов

signed

unsigned

long

short

Объявление переменных

Все переменные должны объявляться перед использованием.

тип список_переменных;

Локальные переменные

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

Формальные параметры

/* возвращает 1, если с является частью строки s; в противном случае – 0 */

int is_in(char *s, char c)

{

while(*s)

if(*s==c) return1;

else s++;

return 0;

}

Константы

Тип данных

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

char

int

long int

short int

float

double

‘a’ ‘\n’ ‘9’

1 123 21000 -234

35000L -34L

10 -12 90

123.23F 4.34e-3F

123.23 12312.333 -0.987654

Лекция 2.

План

  1. Глобальные переменные

  2. Модификаторы доступа

  3. Спецификаторы хранения

  4. Оператор присваивания

  5. Инициализация переменных

  6. Константы

Глобальные переменные

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

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

#include <stdio.h>

void func1(void), func2(void);

int count;

int main(void)

{

count = 100;

func1();

return 0;

}

void func1(void)

{

func2();

printf(“count is %d”, count); /* выведет 100 */

}

void func2(void)

{

int count;

for(count=1; count<10; count++)

putchar(‘ ‘);

}

Хотя ни main(), ни func1() не объявляют переменную count, но они оба могут её использовать, func2() объявляет локальную переменную count. Когда func2() обращается к count, она обращается только к локальной переменной, а не к глобальной.

Модификаторы доступа

С имеет 2 типа модификаторов, которые используются для контроля за способом доступа или модификации переменных. Эти модификаторы называются const и volatile.

Переменные типа const не могут изменяться операторами программы. Например:

const int a;

создаст целочисленную переменную, называемую а, которая не может быть модифицирована в программе. Она может использоваться в других типах выражений. Переменная с модификатором const получает своё значение или при инициализации, или каким-либо аппаратно-зависимым способом. Например, нижеприведённая строка присваивает count значение 100:

const int count = 100;

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

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

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

const volatile unsigned char *port = 0x30;

Спецификаторы хранения

Имеется 4 спецификатора хранения, поддерживаемые в С. Это

extern

static

register

auto

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

спецификатор_хранения тип имя_переменной;

extern

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

Файл 1

Файл 2

int x, y;

char ch;

int main(void)

{

}

void func1(void)

{

x = 23;

}

extern int x, y;

extern char ch;

void func22(void)

{

x = y/10;

}

void func23(void)

{

y = 10;

}

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

static

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

Статические локальные переменные

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

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

int series(void)

{

static int series_num;

series_num = series_num+23;

return(series_num);

}

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

Статические глобальные переменные

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

auto

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

register

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

Нельзя применять register к глобальным переменным. Также, поскольку регистровая переменная может быть сохранена в регистре процессора, нельзя получить адрес регистровой переменной. (Данное ограничение присутствует только в С, но не в С++.)

Оператор присваивания

Общий вид оператора присваивания следующий:

имя_переменной = выражение;

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

Многочисленное присваивание

С позволяет присваивать нескольким переменным одни и те же значения путём использования многочисленных присваиваний в одном операторе. Например, данный фрагмент программы присваивает переменным x, y, z значение 0:

x = y = z = 0;

В профессиональных программах переменным часто присваиваются стандартные значения с использованием данного метода.

Преобразование типов при присваивании

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

Инициализация переменных

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

тип имя_переменной = константа;

Ниже приведено несколько примеров

char ch = ‘a’;

int first = 0;

float balance = 123.23;

Глобальные и статические глобальные переменные инициализируются только при запуске программы. Локальные переменные инициализируются каждый раз при входе в блок, где они были объявлены. Статические локальные переменные инициализируются только один раз, а не каждый раз при входе в блок. Глобальные и статические локальные переменные инициализируются 0, если не указано инициализационное значение. Неинициализированные нестатические локальные и регистровые переменные будут иметь неопределённое значение.

Строковые константы

C поддерживает ещё один тип констант в дополнение к предопределённым типам данных. Это строковые константы. Все строковые константы заключаются в двойные кавычки, например: “this is a test”. Не следует путать строковые константы с символами. Одиночный символ заключается в одинарные кавычки, как например: 'a'. Строки мы рассмотрим позже.

Символьные константы с обратным слэшем

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

Код

Значение

\b

Забой

\f

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

\n

Новая строка

\r

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

\t

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

\”

Двойная кавычка

\’

Одинарная кавычка

\0

Нулевой символ

\\

Обратный слэш

\v

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

\a

Звонок

\N

Восьмеричная константа (N – значение)

\xN

Шестнадцатеричная константа (N – значение)

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

Лекция 3.

План

  1. Арифметические операторы

  2. Операторы отношения и логические операторы

  3. Битовые операторы

  4. Операторы указания

  5. Выражения

  6. Операторы управления программой

Операторы

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

Арифметические операторы

Приоритет выполнения арифметических операций следующий:

высший +(унарный плюс) – (унарный минус) ++  * / %

низший +  (бинарные операторы)

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

Операторы отношения и логические операторы

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

Операция

Значение

Пример

!

Логическое НЕ

!EOF

= =

Равно

value==0

!=

Не равно

value!=0

<

Меньше

i<count

>

Больше

i>count

> =

Больше или равно

i>=count

< =

Меньше или равно

i<=count

||

Логическое ИЛИ

!a || b

&&

Логическое И

a>8 && c<5

Таблица истинности для логических операторов образована с использованием на входах 1 и 0:

P

q

p&&q

p||q

!p

0

0

0

0

1

0

1

0

1

1

1

0

0

1

0

1

1

1

1

0

Как операторы отношения, так и логические операторы имеют более низкий приоритет по сравнению с арифметическими операторами. Это означает, что выражение 10 > 1 + 12 вычисляется как 10 > (1 + 12). Результатом будет ложь.

Ниже показаны приоритеты выполнения операторов отношения и логических операторов

высший !

> >= < <=

== !=

&&

низший ||

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

!1 && 0

даст в результате 0, поскольку ! вычисляется первым, а затем вычисляется &&. Если расставить скобки следующим образом:

!(1 && 0)

то получится истина.

Надо помнить, что все выражения с операторами отношения и логическими операторами дают в результате 0 или 1. Поэтому следующий фрагмент программы не только корректен, но и печатает число 1:

int x;

x =100;

printf(“%d”, x > 1);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]