Операторы реализующие алгоритм.

В

111 | 011 11 | 1011

12 1

Морфологические нормы глагол

Местоимения

Местоимения вызывают трудность:

1) в склонении личных местоимений. Добавляется после простых предлогов (к, в, над, под).

2) После производных предлогов в родительном падеже (возле, вокруг, около, напротив, мимо, сзади и т.д.).

3) Н не добавляется внутри «не». После производных предлогов, управляющих дательным падежом (вследствие). Кроме того личные местоимения третьего лица могут порождать двусмысленность. Подобной двусмысленности надо избегать.

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

 

59 |16

48 3

 

59 |_8

56 7

Выделенные цифры размещаются в обратном порядке, 11 изображается в шестнадцатиричной системе символом В. Индексы означают - основание системы счисления.

===

Проверим правильность перевода:

 

 

 

 

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

 

АЛГОРИТМ.

 

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

Алгоритм кипячения чайника.

  1. Налить в чайник воды.
  2. Поставить на включенную плиту.
  3. Если закипел, то выключить и снять с плиты.

Иначе ждать пока закипит.

 

Алгоритм решения квадратного уравнения.

1. Ввести a, b, c.

2. Вычислить D=.

3. Если D>=0 , то вычислить , .

Иначе «нет действительных корней».

 

Такое представление алгоритма очень близко к записи на языке программирования.

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

 

 

 

ЛОГИЧЕСКАЯ СХЕМА ЭВМ.

 

 

 

Любой современный компьютер имеет ОП – оперативную память, ЦП – центральный процессор, ВП – внешнюю память и У В/В – устройства ввода вывода.

ОП – хранит информацию в процессе выполнения задачи.

ЦП – выполняет действия.

ВП – долговременно хранит информацию (жесткие диски, гибкие диски).

У В/В – сервисные устройства для ввода и вывода информации ( клавиатура, монитор, принтер).

 

СТРУКТУРА ПАМЯТИ.

 

Наименьшая единица памяти 1 бит – один двоичный разряд.

8 бит=1Б (байт) самая маленькая единица обмена памяти, которую можно достать.

1 ячейка (машинное слово) – 4Б для 32-х разрядного компьютера.

- 2Б для 16-ти разрядного компьютера.

Память ЭВМ можно представить как вытянутую в ленту последовательность ячеек, перенумерованных подряд. Каждый байт имеет свой адрес. В памяти хранятся программы и данные. Объем ОП измеряется в КБ (килобайтах) и МБ (мегабайтах).

1КБ=1024Б

1МБ=1024КБ

 

 

ВИДЫ И ТИПЫ ДАННЫХ.

 

Виды данных – константы, переменные, структуры данных ( массивы, списки, структуры).

Константачасть памяти, иногда именованная, не изменяющая свое значение.

Переменнаяименованная часть памяти способная изменять свое значение.

Любая переменная имеет кроме имени еще и адрес.

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

Примеры правильных имен переменных: adc a11 Get Key a_a.

Венгерская анатация – правило, по которому переменная содержит префикс, определяющий ее тип.

Примеры: cname – имя класса.

Тип переменной определяет ее внутреннее представление в памяти.

 

ТАБЛИЦА ОСНОВНЫХ ТИПОВ ДАННЫХ.

 

Ключевое слово Тип Внутреннее представление Длина
Int Long Short Unsigned   Char   Float Double Целый Целый длинный Целый короткий Целый без знака   Текстовый или символьный     Вещественный Вещественный длинный     0 32 +         0 7   + мантисса + порядок     4Б 4Б 2Б 4Б     1Б     4Б 8Б  

 

 

Описание типов переменных производится с помощью оператора описания типа:

 

int a, b ;

char tt ;

 

Тип явно указанных констант определяется по их записи:

5 -273 2Е10 - целые константы, последняя означает , если к записи константы добавляется символ L, то она целая длинная. Например 123567L.

В записи вещественных констант присутствует «точка» - 5.012 134.99 -5.5Е-12, последняя означает -.

Восьмеричные константы всегда начинаются с 0 – 0537, шестнадцатиричные начинаются с 0х – 0х12FE1. Текстовые константы изображаются явно в апострофах – ‘s’ ‘1’.

 

 

ОПЕРАТОРЫ ЯЗЫКА С.

 

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

 

 

ОПЕРАТОР ПРИСВАИВАНИЯ.

 

Общий вид оператора присваивания а=в ; где а – переменная или элемент массива, в – выражение. Оператор присваивания работает строго справа на лево, то есть вычисляется выражение справа и его значение присваивается переменной стоящей слева. На пример

А=250 ;

m=2+3/b ;

d=m=b+s ;

Выражения справа состоят из операндов – переменные и константы и операций.

Операции:

+ - сложение,

- - вычитание,

* - умножение,

/ - деление,

% - взятие остатка ( только для целых),

++ - увеличение на единицу,

-- - уменьшение на единицу,

(тип) – преобразование типа.

Операция деления для объектов целого и вещественного типа производится по разному.

int f ; float s ;

f=10/3 ; s= 10./3. ;

переменная f будет равна 3, а переменная s – 3.333, то есть в первом случае остаток будет отброшен. При целочисленном делении нужно быть очень осторожным, так как 1/3 даст 0, остаток отбросится, целое число не может стать дробным.

Оператор i=i+1 ; можно записать короче i++ ;

В языке С принята укороченная запись операторов переприсваивания:

a=a+i ; a+=i ;

a=a-i ; a-=i ;

a=a*i ; a*=i ;

a=a/i ; a/=i ;

 

Рассмотрим решение задачи – задано двухзначное число, получить его цифры.

int a=57, b, c ;

b=a/10 ; // старшая цифра числа а.

c=a%10 ; // младшая цифра числа а.

 

Комментарии в языке C пишутся двумя способами:

// любой текст до конца строки, не будет восприниматься транслятором.

/* любые слова на произвольное

количество строк, не воспринимаются транслятором

до следующей */

 

 

УСЛОВНЫЙ ОПЕРАТОР.

Для записи условия используются операции отношения:

== проверка равенства;

!= не равны;

> больше;

< меньше;

>= больше и равно;

<= меньше и равно.

Значение логического выражения ИСТИНА или ЛОЖЬ.

Логические выражения можно объединять используя логические связки && логичесое И, || логическое ИЛИ. Логическое выражение, объединенное связкой || истино, когда истино хотя бы одно из выражений. Логическое выражение, объединенное связкой && истино, когда истино каждое из логических выражений. Например, математическая запись a<b<c, запишется

(a<b)&&(b<c).

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

if( условие) оператор ;

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

if (a>0) b=10 ; Если а положительное b будет присвоено 10.

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

if ( условие) оператор1 ;

else оператор2 ;

Работает он следующим образом, если истинно условие в скобках, то выполняется оператор1, в противном случае выполняется оператор2.

Рассмотрим пример:

 

Записать фрагмент программы на языке С можно несколькими различными способами.

Самый простой:

if (x<=a) x=a ;

if ( x>=b) x=b ;

if ( (a<x)&&(x<b)) x=0 ;

еще один способ:

if (x<= a) x=a ;

else if ( x>=b) x=b ;

else x=0 ;

Наиболее интересен такой способ:

x=0 ;

if (x<=a) x=a ;

if (x>=b) x=b ;

Внимание: при неправильной записи условия не будет сообщения об ошибке, а и d не будут сравниваться.

If( a=d) b=10 ; должно быть так if ( a==d) b=10 ;

 

При сравнении с нулем можно не писать знаки сравнения:

If (a) b=0 ; Что означает, если а равно 0, то b присвоить 0. Используя это свойство, можно писать всегда истинные, (любое не нулевое выражение в скобках), или всегда ложные условные операторы.

If ( -100) a=100; всегда истина, все равно, что написать а=100 ;

If ( 0) a=100 ; всегда ложь, а=100 никогда не присвоится.

 

Рассмотрим еще несколько примеров с использованием условного оператора.

 

Задано целое число, определить делится ли оно на 5.

int a ;

Ввод а ;

if (a%5==0) вывод «число делится на 5» ;

еlse вывод « число не делится на 5» ;

 

Из трех заданных чисел определить максимальное.

Int a, b, c, max ;

Ввод a, b, c ;

max=a ;

if (b>max) max=b ;

if (c>max) max=c ;

вывод max ;

без ввода дополнительной переменной max алгоритм будет менее наглядным и более трудным.

int a, b, c ;

Ввод a, b, c ;

if ((a>=b)&&(a>=c)) вывод а ;

if ((b>=a)&&(b>=c)) вывод b ;

if ((c>=a)&&(c>=b)) вывод с ;

Примечание. В случае равенства двух или трех переменных результат будет печататься несколько раз.

 

МНОЖЕСТВЕННЫЙ ВЫБОР switch.

 

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

switch(i)

{

case 1 : вывод « понедельник » ; break ;

case 2 : вывод « вторник » ; break ;

case 3 : вывод « среда » ; break ;

case 4 : вывод « четверг » ; break ;

case 5 : вывод « пятница » ; break ;

case 6 : вывод « суббота » ; break ;

case 7 : вывод « воскресенье » ; break ;

default : вывод « ошибка » ; break ;

}

Примечание. Оператор break нужно использовать, если после соответствующего выбора нужно прекратить проверять и закончить ближайший внешний оператор. Когда нужен один и тот же результат на разных «ветках» выбора запишется так:

case ‘E’ :

case ‘e’ : a=’e’ ; break ;

 

Задание: i – номер месяца, вывести время года.

 

ОПЕРАТОРЫ ЦИКЛА.

 

ОПЕРАТОР while ( с предусловием).

Общий вид оператора:

while ( условие ) оператор ;

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

Примеры.

Бесконечный цикл – while(1) ;

 

Задано а, найти количество слагаемых, при которых сумма превысит это число.

float a, sum=0 ;

int i=1 ;

ввод а ;

while (sum<a)

{

sum=sum+ 1/i ;

i++ ;

}

вывод i ;

Задание: найти две ошибки.

 

ОПЕРАТОР do … while ( с постусловием ).

 

Общий вид оператора :

do оператор ;

while ( условие ) ;

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

Рассмотрим предыдущий пример с суммой .

 

float a, sum=0 ;

int i=0 ;

ввод а ;

do

{

i++ ;

sum=sum+1./(float) i ;

}

while ( sum<a) ;

вывод i ;

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

 

 

ОПЕРАТОР ЦИКЛА for.

 

Общий вид оператора:

for ( выражение1 ; выражение2 ; выражение3 ) оператор ;

выражение1 – инициализация цикла;

выражение2 – условие его завершения;

выражение3 – шаг цикла, вычисляется после каждой итерации.

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

Любое из выражений может отсутствовать.

for ( ; ; ) ; - бесконечный цикл, так как отсутствующее условие всегда истинно.

И еще раз пример с суммой .

float a, sum ;

int i ;

for ( i=1, sum=0 ; sum<a ; i++)

sum+=1./(float)i ;

вывод i-1 ;

можно написать этот цикл, вообще, без тела:

for ( i=1, sum=0 ; sum<a ; i++, sum+=1./(float)i)

В языке С цикл for наиболее широк, можно записать любой цикл через него.

Рассмотрим еще несколько примеров:

Найти сумму 100 первых натуральных чисел.

int i, sum ;

for ( i=1, sum=0 ; i<100 ; i++)

sum+=i ;

Найти сумму 100 первых четных чисел.

for ( i=2, sum=0 ; i<200 ; i+=2)

sum+=i ;

Возвести , b - целое, a- любое.

float a, step=1 ;

int b, i ;

for ( i=1 ; i<=b ; i++) step*=a ;

вывод step ;

ИСПОЛЬЗОВАНИЕ ОПЕРАТОРОВ break и continue в циклах.

 

Оператор break – прекращает выполнение цикла и переходит на оператор следующий за ним.

Оператор continue – прекращает выполнение шага цикла и переходит к следующей итерации (шагу) цикла.

Придумать простой и разумный пример трудно, рассмотрим довольно искусственный:

Просуммировать все числа до 10, а от 10 до 100 все удвоенные числа, если сумма будет равна 500, прекратить процесс суммирования.

for (int i=1, sum=0 ; i<100 ; i++)

{

if ( i<=10) { sum+=i ; continue ; }

if ( i==500) break ;

sum+=i*2 ;

}

Использование этих операторов не обязательно и даже не нужно при правильной логике. Единственный случай – это когда вы специально хотите выделить аварийный случай оператором break.

Предыдущий пример запишем иначе.

for ( int i=1, sum=0 ; (i<=100)&&(sum!=500) ; i++)

if ( i<= 10) sum+=i ;

else sum+=2*i ;

 

 

ФУНКЦИИ ВВОДА-ВЫВОДА.

 

В языке С для ввода и вывода используются стандартные функции printf и scanf из библиотеки подключенной следующим образом:

#include <stdio.h>

Рассмотрим общий вид функции printf .

printf ( “управляющая строка” , аргумент1, …, аргументК) ;

пример:

printf (“\n количество людей - %d их масса -%f“, n , m ) ;

на экране увидим следующее:

количество людей - 10 их масса – 752.562007

 

Основные cпецификации преобразования при вводе и выводе:

%d – десятичное целое со знаком;

%c – один текстовый символ;

%s – строка символов;

%e – число с плавающей точкой, запись мантиссы и порядка;

%f - число с плавающей точкой, десятичная запись;

\n - переход на новую строку.

Для вывода в форматах d и f можно регулировать количество знаков

%3d – цифра означает количество позиций на число, без ее указания берется стандартное количество позиций на число любой длины.

%5.2f – вещественному числу отводится 5 знаков всего из них 2 после точки, без указания цифр берется стандартное количество позиций на число любой длины.

Пример:

printf (“\n количество людей - %3d их масса -%5.1f“, n , m ) ;

на экране увидим следующее:

количество людей - 10 их масса – 752.6

 

Рассмотрим общий вид функции scanf .

scanf ( “управляющая строка” , &аргумент1, …, &аргументК) ;

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

Пример:

scanf ( “%d %f” , &n , &m ) ;

 

Правильная последовательность ввода требует диалога при помощи следующего набора операторов.

printf (“\nвведите количество людей n=”);

scanf ( “ %d” , &n) ;

printf (“\nвведите массу людей m=”);

scanf ( “ %f” , &m) ;

На экране появится строка:

введите количество людей n=

После чего рядом со знаком равенства нужно набрать необходимое число, например 10 и нажать кнопку <enter>.

Далее появится строка:

введите массу людей m=

После чего рядом со знаком равенства нужно набрать необходимое число, например 750.5 и нажать кнопку <enter>.

 

ОБЩИЙ ВИД ПРОГРАММЫ.

 

Программа на экране компонуется следующим образом:

#include <stdio.h>

main()

{

}

 

Пример: Написать программу, вычисляющую 50 значений функции sin(x). Начальное значение - x и шаг - h заданы с экрана.

#include <stdio.h> // библиотека ввода-вывода

#include <math.h> // библиотека стандартных математических функций

main()

{

float x , h ;

int i ;

printf (“\nначальное значение аргумента функции x=”);

scanf ( “ %f” , &x) ;

printf (“\nвведите шаг h=”);

scanf ( “ %f” , &h) ;

for ( i=1 ; i<=50 ; i++ ) // цикл вычисляющий значения функции с шагом h.

{

printf (“\nx=%f y=%f”, x , sin(x)) ;

x+=h ;

}

}

 

ВЛОЖЕННЫЕ ЦИКЛЫ.

 

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

Построим все возможные перестановки из трех цифр.

123 566 070 379 999

 

#include <stdio.h>

main()

{

int i , j, k ;

for ( i=0 ; i<=9 ; i++ )

for ( j=0 ; j<=9 ; j++ )

for ( k=0 ; k<=9 ; k++ )

printf ( “ \n%d %d %d” , i ,j , k ) ; // распечатываются все возможные

// перестановки

}

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

#include <stdio.h>

main()

{

int i , j, k ;

for ( i=0 ; i<=9 ; i++ )

{

for ( j=0 ; j<=9 ; j++ )

{

for ( k=0 ; k<=9 ; k++ )

{

printf ( “ \n%d %d %d” , i ,j , k ) ;

}

}

}

}

В программировании есть негласное правило: каждый вложенный оператор пишется с отступом, а открывающаяся и закрывающаяся скобки друг под другом. Так проще понять программу и искать в ней ошибки.

 

Изменим условие предыдущей задачи: Найти такие перестановки, чтобы все цифры были различны.

 

#include <stdio.h>

main()

{

int i , j, k ;

for ( i=0 ; i<=9 ; i++ )

for ( j=0 ; j<=9 ; j++ )

if (j!=i)

for ( k=0 ; k<=9 ; k++ )

if (( i!=k)&&(j!=k))

printf ( “ \n%d %d %d” , i ,j , k ) ; // распечатываются все возможные

// перестановки без повторов.

}

 

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

123 321 231 132 - из таких перестановок будем учитывать только одну с возрастающим порядком цифр 123.

 

#include <stdio.h>

main()

{

int i , j, k ;

for ( i=0 ; i<=7 ; i++ )

for ( j=i+1 ; j<=8 ; j++ )

for ( k=j+1 ; k<=9 ; k++ )

printf ( “ \n%d %d %d” , i ,j , k ) ; // распечатываются все возможные

// перестановки c различным порядком цифр.

}

 

Решим еще одну интересную задачу.

Задано с экрана произвольное целое число являющееся первым членом последовательности. Найти 5 членов этой последовательности, вычисляющейся по формуле:

, где - количество цифр числа .

 

#include <stdio.h>

main()

{

int a , x, k, i=1 ;

printf(“введите первый член последовательности ”) ;

scanf (“%d” , &a) ;

printf ((“\n%d – й член последовательности %d”, i , a) ;

for (i=2 ; i<=5 ; i++ ) // цикл вычисляющий члены последовательности

{

x=a ; k=0 ; // обнуление счетчика количества цифр в числе а

while ( x>0 ) // цикл по подсчету цифр числа пока оно не превратится в 0

{

k++ ; // подсчет цифр

x=x/10 ; // уменьшение числа на один разряд

}

a=a*k ; // вычисление следующего члена последовательности

printf ((“\n%d – й член последовательности %d”, i , a) ;

 

}

}

 

АДРЕСА И УКАЗАТЕЛИ.

 

Главным объектом нашей работы на этом этапе является переменная. Перед работой с ней определяем ее имя и тип, можем сразу и проинициализировать ее, т. е. задать ей начальное значение. Все это выполняет оператор описания:

int m=10 ;

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

По имени переменной можно извлечь адрес, используя операцию адресации:

&m – адрес переменной m, целочисленная константа без знака. Символическое изображение этого адреса &m - является константой типа указатель. Опишем переменную типа указатель:

int *pm , k ; // описание типа переменной pm означает, если взять значение расположенное по

// этому адресу, то оно будет целым. Осуществляет эту операцию *pm.

pm=&m ; // адрес целой переменной m присваивается переменной типа указатель pm.

k=*pm ; // извлекается значение, лежащее по адресу помещенному в pm и присваивается

// переменной k. Переменные m и k имеют одно и тоже значение.

Мы уже встречались с адресацией в операторе:

scanf (“%d” , &a) ;

В подпрограмму с именем scanf передается адрес незаполненной переменной, где по этому адресу будет помещено значение, введенное с экрана.

Еще раз сформулируем операции получения адреса и значения.

& - операция получения адреса, если за этим знаком следует имя переменной.

* - операция косвенной адресации ( обратная к извлечению адреса ), когда за этим знаком следует

указатель на переменную. Результатом является значение, извлеченное по данному адресу.

Распечатать адрес можно как целую переменную без знака, используя спецификацию %u.

printf (“%u” , pm) ; или так printf (“%u” , &m) ;

 

МАССИВЫ.

 

Массив – набор перенумерованных переменных одного типа, обозначенных одним именем.

Еще одно более сложное определение:

Массив - именованная структура данных прямого доступа.

Прямой доступ означает, что по указанному номеру можно извлечь сразу любой элемент.

Одномерный массив – вектор. Двумерный – матрица.

Описание массива:

int a[10] ; // целочисленный вектор из 10 элементов.

float b[5][7] ; // вещественная матрица из 5 строк и 7 столбцов.

В памяти любые массивы располагаются последовательно и непрерывно. Матрицы располагаются цепочкой по строкам.

Существуют массивы и большей размерности 3-х, 4-х мерные, но используются они очень редко.

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

Работают с массивом, указывая его элементы – a[5] b[0][3].

Имя массива определяет адрес его нулевого элемента:

a одно и тоже с &a[0]

a+5 одно и тоже с &a[5]

*(a+5) одно и тоже с a[5].

 

ВЕКТОРЫ.

 

Поработаем сначала с одномерными массивами.

Вектор можно проинициализировать:

int x[10]={ 1, 4, -6, 8, -1, 0, 0, 32, 100, -1} ;

Mожно описать и ввести с экрана:

int x[10] , i ;

for (i=0 ; i<10 ; i++)

scanf(“%d” , &x[i]) ;

Очень полезна эхо-печать:

for (i=0 ; i<10 ; i++)

printf(“%d ” , x[i]) ;

Обратите внимание, что отсчет элементов в любом массиве идет с 0, а не с 1. В нашем векторе 10 элементов, но первый – x[0], а последний –x[9].

 

Рассмотрим задачу: вычислить 10 чисел Фибоначчи.

, , .

int a[10] , i ;

a[0]=1 ; a[1]=1;

for (i=0 ; i<=7 ; i++)

a[i+2]= a[i]+a[i+1];

for (i=0 ; i<=9 ; i++)

printf(“%d ” , a[i]) ;

 

 

Еще одна задача: найти в векторе нулевой элемент, удалить его и придвинуть «хвост».

 

int dan[10]={5, 4, 7, -1, 0, 9, 4, -10, 9, 2} ;

int i=0 , k ;

while (dan[i]!=0) i++ ;

for ( k=i ; k<9 ; k++)

dan[k]=dan[k+1] ;

for ( k=0 ; k<=9 ; k++)

printf(“%d ” , dan[k]) ;

 

Вопросы: 1) Какая возникнет ошибка при «плохих» исходных данных – в векторе нет нуля?

2) Как изменится программа, если нужно задвинуть все имеющиеся нули?

 

 

СОРТИРОВКА ВЕКТОРА.

 

Существует огромное количество различных алгоритмов сортировки. Рассмотрим самые простые из них. Сортировка вектора по возрастанию (убыванию) значений его элементов.

 

  1. Сортировка выбором.

Рассмотрим вектор 11 4 -3 5 10 8 12 6 4 0 отсортируем его значения по убыванию.

Найдем максимальный элемент вектора - 12. Переставим местами первый элемент и максимальный.

124 -3 5 10 8 11 6 4 0 Теперь рассмотрим вектор начиная со второго элемента, найдем в нем

12 11 -3 5 10 8 4 6 4 0 максимум – 11, переставим его местами со вторым элементом, и т. д.

12 11 10 5 -3 8 4 6 4 0 пока не останется один элемент вектора, соответственно самый

12 11 10 8 -3 5 4 6 4 0 маленький.

12 11 10 8 6 5 4 -3 4 0

12 11 10 8 6 5 4 4-3 0