
- •Отображает данные, вводимые в ручную, во время обработки с устройств любого типа (клавиатура, переключатели, кнопки, световое перо, полоски со штрих кодом и т.д.).
- •Символ отображает хранимые данные в виде, пригодном для обработки. Носитель данных не определен. В схемах алгоритмов он предназначен для обозначения ввода-вывода данных в случае использования запоминающего устройства, управляемого процесса.
- •Тема 1. Основные этапы решения задач на ЭВМ
- •Постановка задачи разработки программного обеспечения
- •Анализ формальной постановки задачи
- •Выбор или разработка математической модели и метода решения
- •Разработка алгоритма
- •Базовые структуры алгоритма
- •Тема 2. Жизненный цикл программы. Критерии качества программы.
- •Техническое задание и спецификация программы
- •Разработка проекта программной системы
- •Программирование (кодирование) или программная реализация алгоритмов
- •Тестирование и отладка
- •Эксплуатация и сопровождение
- •Критерии качества программного обеспечения
- •Тема 3. Схемы алгоритмов, данных, программ
- •Символы данных
- •Символы процесса
- •Символы линий
- •Специальные символы
- •Правила применения символов в схемах
- •Правила выполнения соединений
- •Специальные условные обозначения
- •Тема 4. Язык программирования высокого уровня Си
- •Общие сведения о языке Си
- •Алфавит языка Си
- •Грамматика для описания языка, синтаксические диаграммы
- •Структура программы на языке Си
- •Имена объектов в программе
- •Выражения, операции и приоритеты
- •Тема 5. Стандартные типы данных
- •Тема 6. Составные типы данных
- •Данные регулярного типа (массивы)
- •Строки
- •Данные комбинированного типа (структуры)
- •Перечисления
- •Объединения
- •Указатели
- •Тема 7. Представление основных управляющих структур программирования
- •Оператор присваивания
- •Составной оператор
- •Оператор перехода Goto
- •Условный оператор If
- •Оператор выбора switch
- •Операторы цикла while, do – while, for
- •Операторы прерывания циклов
- •Форматированный ввод данных
- •Форматированный вывод данных
- •Преобразование типов
- •Инициализация данных
- •Тема 8. Функции
- •Определение функций в языке Си
- •Вызов функций в языке Си
- •Рекурсивные функции
- •Тема 9. Файлы
- •Тема 10. Приемы программирования. Примеры алгоритмов
- •Алгоритмы сортировки
- •Алгоритмы поиска
- •Динамические структуры данных
- •Линейные списки
- •Стек, очередь, дек
- •Деревья
- •Приложение 1. Стандартные библиотеки языка Си
- •Приложение 2. Примеры реализации алгоритмов
- •Не рекурсивный алгоритм решения задачи Ханойская башня.
- •Рекурсивный алгоритм решения задачи Ханойская башня.
- •Приложение 3. Лабораторные работы
- •Лабораторная работа №1
- •Лабораторная работа №2
- •Лабораторная работа №3
- •Лабораторная работа №4
- •Лабораторная работа №5
- •Лабораторная работа №6
- •Лабораторная работа №7
- •Лабораторная работа №8
- •Лабораторная работа №9
- •Лабораторная работа №10
- •Лабораторная работа №11
- •Лабораторная работа №12
- •Список литературы
В операции вычитания могут участвовать два указателя на один и тот же тип. Результат такой операции имеет тип int и равен числу элементов исходного типа между уменьшаемым и вычитаемым, причем если первый адрес младше, то результат имеет отрицательное значение.
int *ptr1, *ptr2, a[10]; |
|
int i; |
|
ptr1 = a+4; |
|
ptr2 = a+9; |
// равно 5 |
i = ptr1-ptr2; |
|
i = ptr2-ptr1; |
// равно -5 |
Значения двух указателей на одинаковые типы можно сравнивать в операциях ==, !=, <, <=, >, >= при этом значения указателей рассматриваются просто как целые числа, а результат сравнения равен 0 (ложь) или 1 (истина).
int *ptr1, *ptr2, a[10]; ptr1 = a+5;
ptr2 = a+7;
if (prt1 > ptr2) a[3] = 4;
В данном примере значение ptr1 меньше значения ptr2 и поэтому оператор a[3] = 4 не будет выполнен.
Тема 7. Представление основных управляющих структур программирования
Оператор присваивания
Оператор присваивания записывается в виде: <переменная> = <выражение>;
Значение выражения из правой части присваивается переменной из левой части оператора присваивания. При присваивании необходимо обеспечивать совместимость типов (иногда говорят – совместимость по присваиванию), т.е. тип, полученный при вычислении выражения, должен быть совместим с типом переменной, которой это значение должно быть присвоено. Значение типа T1 является совместимым по присваиванию с типом T2 (то есть, допустим, оператор T1=T2), если выполняется одно из следующих условий:
∙ T1 и T2 имеют тождественные типы, и ни один из них не является файловым типом или структурным типом, содержащим компонент с файловым типом на одном из своих уровней.
87
∙T1 и T2 являются совместимыми порядковыми типами, и значения типа T2 попадают в диапазон возможных значений T1.
∙T1 и T2 являются вещественными типами, и значения типа T2 попадают в диапазон возможных значений T1.
∙T1 является вещественным типом, а T2 является целочисленным
типом.
∙T1 и T2 являются строковыми типами.
∙T1 является строковым типом, а T2 является символьным типом
(Char).
∙T1 и T2 являются совместимыми множественными типами, и все члены значения типа T2 попадают в диапазон возможных значений T1.
∙T1 и T2 являются совместимыми типами указателей.
∙T1 и T2 являются совместимыми процедурными типами.
∙T1 представляет собой процедурный тип, а T2 – процедура или функция с идентичным типом результата, идентичным числом параметров и соответствием между типами параметров.
На этапе компиляции и выполнения программы выдается сообщение об
ошибке, если совместимость по присваиванию необходима, а ни одно из условий предыдущего списка не выполнено.
Составной оператор
Синтаксис оператора { <операторы> }
Здесь «операторы» – один или несколько любых операторов языка Си, разделенных точкой с запятой. Составной оператор предназначен для объединения нескольких операторов в один, что имеет решающее значение там, где синтаксис языка Си допускает использование только одного оператора.
Оператор перехода Goto
Синтаксис оператора goto <метка>;
88
«Метка» - это любой идентификатор, после которого поставлено двоеточие. Оператор goto указывает на то, что выполнение программы необходимо продолжить, начиная с оператора, перед которым записана метка. Метку можно поставить перед любым оператором в той функции, где находится соответствующий ей оператор goto. Ее не надо объявлять.
Условный оператор If
Всинтаксисе языка Си предусмотрены две конструкции для записи условного оператора: условный оператор с одним вариантом действии (сокращенная форма) и условный оператор с двумя вариантами действии (полная форма).
Синтаксис оператора if можно представить следующим образом: if (<условие>) <оператор1> [else <оператор2>];
Здесь «условие» – логическое выражение. В результате его вычисления должен получаться результат, имеющий стандартный логический тип. Если результатом является значение True (Истина), то выполняется «оператор1». Если логическое выражение принимает значение False, и ключевое слово else отсутствует (сокращенная форма), то управление передается оператору, следующему за оператором if. В полной форме условного оператора в этом случае сначала будет выполнен «оператор2».
Вобщем случае, при наличии множественных вложенных операторов if ключевое слово else связывается с ближайшим ключевым словом if, которое еще не связано с ключевым словом else.
Приведем примеры использования оператора if.
if (A != B) Z = X+Y; else Z = 1;
if (P1 = null)
{
89

} c = –c*b;
}
else d = SQR(d);
}
else d = a*b; else d = a;
Пример 15. Используем оператор if для разработки программы и блоксхемы алгоритма поиска действительных корней квадратного уравнения (рис.31).
|
|
Начало |
a, b, c |
|
|
|
ввести a, b, c |
|
|
|||||||
|
|
|
|
|
f(x) |
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
нет |
a=0 |
да |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D:=b*b-4*a*c |
|
|
|
|
|
|
b=0 |
|
да |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
D=0 |
D |
D>0 |
|
|
|
|
|
|
нет |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
x := – c / b |
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
D<0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x1:=(-b+sqrt(D))/(2*a) |
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
x := -b/(2*a) |
|
|
|
x2:=(-b–sqrt(D))/(2*a) |
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
x |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
x |
|
|
Корней нет |
x1, x2 |
|
|
|
|
Корней нет |
|||||||
|
|
|
|
|
|
|
|
|
Конец
Рис. 31. Алгоритм вычисления корней квадратного уравнения
float a,b,c,z;/*Даны коэффициенты квадратного уравнения*/ float x1,x2; /*Найти и вычислить их корни*/
printf("\nВведите коэффициент а:\n"); scanf("%f",&a);
printf("Введите коэффициент b:\n"); scanf("%f",&b);
printf("Введите коэффициент с:\n"); scanf("%f",&c);
z=b*b-4*a*c; /*Z-дискриминант*/ if(z>=0.0)
{x1=(-b+sqrt(z))/2/a; x2=(-b-sqrt(z))/2/a;
} printf("\nКорни уравнения:x1=%f,\nx2=%f",x1,x2);
else
printf("\nДействительные корни отсутствуют.");
90