- •1.Основные компоненты программного обеспечения и их связь с аппаратурой. Ретроспектива развития программирования.
- •2 Этапы решения задач на эвм
- •3 Основные типы данных и структуры данных в программировании
- •3.1.1 Арифметические типы
- •3.1.2 Логический тип
- •3.1.3 Символьный тип
- •4 Методы решения задач программирования
- •5 Разработка алгоритмов Пример 5.8
- •Пример 5.9
- •Пример 5.10
- •6 Кодирование алгоритмов на языке си
- •- Семантические;
- •Тело директивы
- •Имя аргумента
- •Оператор
- •6.4.1 Имена переменных Имена переменных могут состоять из букв (только из латинского алфавита), цифр и символа подчеркивания, приравненного к букве. Начинаться имя должно с буквы.
- •Пример 6.3:
- •6.4.2 Типы и размеры данных
- •6.4.3 Константы
- •Пример 6.4:
- •Пример 6.5:
- •Пример 6.6:
- •Пример 6.7:
- •Пример 6.8:
- •7 Декларации в си
- •8 Операторы в языке си
- •9 Управление в си
- •10 Указатели и массивы
- •Литерные указатели
- •11 Структуры в языке си
- •Структуры, вложенные друг в друга
- •Пример 11.10
- •12 Функции и структура программы
- •Аппарат формальних і фактичних аргументів Приклад 12.4
- •Опис прототипу функції
- •Приклад 12.5
- •13 Передача аргументов
9 Управление в си
Управление – определенный порядок выполнения вычислений в программе.
Инструкции и блоки
Если в конце выражения поставить ‘ ; ’, то выражение становится инструкцией.
<инструкция>::=<выражение>;
Пример 9.1:
x=0 j++ /* выражения */
x=0; j++; /* инструкции */
Составная инструкция ( блок ).
<блок>::={ [<декларация>]
<инструкция1>;
………………….
<инструкция n> ;
}
Внутри блока разрешены как операторы декларации так и исполнимые операторы.
Инструкция if – else
Синтаксис
if(<выражение>) либо if (<выражение>)
<инструкция1> <инструкция1>
else <инструкция2>
Семантика
Вычисляется значение выражения, если значение выражения истинно, то выполняется <инструкция1>, если ложно то <инструкция2>
Пример 9.2:
int a,b,c; /* исходные данные */
int x; /* результат */
……..
if(a>b) /* вариант 1 */
if(a>c) x=a;
else x=c;
else if(b>c) x=b;
else x=c;
/* вариант 2 */
………………………..
x=a;
if (b>x) x=b;
if(c>x) x=c;
9.3Переключатель switch
Используется для разветвления алгоритма более чем на 2 направления.
Синтаксис
Switch(<выражение>)
{ case <константное выражение1>:<инструкции 1>
case< константное выражение n>:< инструкции n>
default:<инструкции>
}
Семантика
Каждая ветвь case помечена одной или несколькими целочисленными константами или константными выражениями.
Исполнение всей конструкции switch начинается с той ветви case, в которой константное выражение совпадает со значением выражения записанного после слова switch. Если не одна из констант не подходит, то выполняется ветвь помеченная default.Ветвь default необязательна, и если ее нет, то ничего не вычисляется. Ветви case и default можно размещать в любом порядке. Поскольку выбор любой из ветвей case выполняется как переход на метку, то после выполнения одной ветви case, программа переходит к выполнению следующей ветви. Если этот переход не устраивает, то ветвь case нужно завершить оператором break.
Пример 9.3:
/* kd – количество дней месяца */
if (j==1|| j==3|| j==5|| j==7|| j==8|| j==10|| j==12) kd=31;
else if(j==2) kd=28;
else kd=30;
Пример 9.4:
………………………………..
switch (j)
{
case 1: kd=31; break;
case 2: kd=28;break;
case 3: kd=31;break;
…………………………….
case 12: kd=31;break;
default:printf(”Ошибка”);break;}
Пример 9.5:
switch (j)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12: kd=31; break;
case 4 :case 6: case 9: case 11: kd=30;break;
default: if (j==2) kd=28;
else printf(”Ошибка”);break; }
9.6 Цикл while
Синтаксис:
While (<выражение>)
<инструкция>
Аналог ”пока” языка алгоритмов. Это цикл с неизвестным количеством повторений, с предусловием.
Семантика:
Вычисляется выражение, если оно отлично от 0 (истинно),
то выполняется инструкция и снова переход на проверку выражения.
Как только выражение станет равным 0 цикл while завершается. Если необходимо в теле цикла выполнить больше чем 1 инструкцию, то надо взять в { }
Пример 9.6:
/* е в степени х (с точностью eps ) */
float y,s,,eps,x;
int i,n;
………………………………………… /* Ввод х */
y=1; n=1; i=1; S=x;
while (s/n>eps)
{
y+=s/n;
i++;
n*=i;
s*=x;
}
9.7 Цикл for
Синтаксис
For (<выражение 1>;<выражение 2>;<выражение 3>)
<инструкция>
Это цикл с известным числом повторений.
Семантика
< выражение 1>
while(<выражение 2>)
{< инструкция >;
< выражение 3>;
}
<выражение 1> - инициализация
<выражение 2> - условие завершения цикла
<выражение 3> - изменение
Любое из этих 3 выражений может отсутствовать, но ‘;’ обязательно!!!
Пример 9.7:
/* бесконечный цикл */
for( ; ;)
{……...}
Если опущены <выражение1> и <выражение3> - они не используются.
<выражение1> берется до цикла.
<выражение3> изменяется внутри цикла
Пример 9.8-9.9
#define N 10
float X[N]
int i;
float s;
………………………………..
s=0;
for(i=0;i<N;i++)
s+=X[i];
Либо:
for(s=0,i=0;i<N;i++)
s+=X[i];
Особенности цикла for в языке С:
Переменная цикла и ее предельное значение могут изменятся внутри цикла. По завершению цикла переменная цикла определена. В выражениях 1, 2 и 3 может быть использовано более одного выражения, разделенных оператором ‘,’
‘,’- бинарный, инфиксный, левоассоциативный оператор.
Приммер 9.10 Реверсировать массив.
0 1 2 3 4
1 |
2 |
3 |
4 |
5 |
|
5 |
4 |
3 |
2 |
1 |
#define N 10
…………….
float x[N];
int i, j;
float r;
…………….
For( i=0 , j=N-1; i<j ;i++ , j--)
{
r=x[i];
x[i]=x[j];
x[j]=r;
}
9.6 Цикл do while
Синтаксис: do <инструкция> while (<выражение>)
- цикл с неизвестным числом повторений.
Семантика: 1.выполняется <инструкция>
2.вычисляется значение <выражения>
3.если <выражение> истинно(не равно 0), то снова переходим на пункт 1. Если <выражение> равно 0 (ложно) – конец цикла.
Инструкция break и continue
Break используется в циклах while, for, do while и в конструкции zwitch. В циклах использование break приводит к немедленному их завершению (до достижения предельного значения переменной цикла for или до достижения условия завершения цикла в while или do while).
Пример 9.11 Определить, является ли матрица А положительно определенной (все элементы больше 0).
Aij>0 , i принадлежит [1,m], j принадлежит [1,n]
#define N 10
#define M 15
float a[M][N];
int i,j;
int pr=1;
…
for (i=0; i<=M-1;i++)
for(j=0; j<N; j++)
if (a[i][j]<=0 )
{ pr=0; break; }
if (pr) printf(“A - положительно определенная ”);
else printf(“A – не положительно определенная ”);
! Break завершает немедленно ближайший , охватывающий его цикл.
Continue вызывает переход к следующей итерации цикла : в for изменяет переменную цикла согласно закона , указанного в шапке цикла, в while , do while приводит к вычислению выражения , которое является условием продолжения цикла.
Пример 9.12 . Найти сумму S отрицательных элементов массива x[N]
#define N 5
float x[N] ;
int i;
float s=0;
…
for(i=0;i<=N-1;i++) или for(i=0;i<N;i++)
if (x[i]<0) s+=x[i]; {if (x[i]>=0 )continue;
s+=x[i];}