Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмы и структуры данных. Учебное пособие по направлению подготовки 09.03.02 «Информационные системы и технологии»

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
double a[100],b; while(1) { printf("\n Введите количество элементов n=") ; scanf("%d",&n); if (n > 1 && n <= 100) break; printf ("Ошибка! Необходимо 1<n<=100! ") ; } printf("\n Введите значения элементов массива:\n"); for(j=0; j<n;j++) { printf("a[%d]=”, j+1) ; scanf(“%lf”, } for(i=0; i<n-1; i++) for(j=i+l; j<n; j++) if(a[i]>a[j]) { b=a[i]; a[i]=a[j];. a[j]=b; } printf("\n Упорядоченный массив: \n") ; for(j=0; j<n; j++) printf("a[%d]=%f\n", j+1,a[j]); }
При заполнении массива и при печати результатов его упорядочения индексация элементов выполнена от 1 до n, как это обычно принято в математике. В программе на Си это соответствует изменению индекса от 0 до (n-1).
В. программе реализован алгоритм прямого упорядочения – каждый элемент a[i], начиная с а[0] и кончая а[n-2], сравнивается со всеми после­дующими, и на место a[i] выбирается минимальный. Таким образом, а[0] принимает минимальное значение, а[1] - минимальное из оставшихся и т.д. Недостаток этого алгоритма состоит в том, что в нем фиксированное число сравнений, не Даже для уже упорядоченного массива придется выполнить то же самое количество итераций (n-1)*n/2, так как условия окончания циклов не связаны со свойствами, т.е. с размещением элементов массива.
Алгоритм попарного сравнения соседних элементов позволяет в ряде случаев уменьшить количество итераций при упорядочении. В цикле от 0 до n-2 каждый элемент a[i] массива сравнивается с последующим a[i+l] (0<i<n-l). Если a[i]>a[i+l], то значения этих элементов меняются местами. Упорядочение заканчивается, если оказалось, что a[i] не больше a[i+l] для
a[j]);
зависимое от исходного расположения значений элементов.
111
всех i. Пусть k – количество перестановок при очередном просмотре. Тогда упорядочение можно осуществить с помощью такой последовательности операторов:
do { for (i=0, k=0; i<n-l; i++) if ( a[i] > a[i+l] ) { b=a[i]; a[i]=a[i+1]; a[i+1]=b; k=k+l; } n--; } while ( k > 0 ) ;
Здесь количество повторений внешнего цикла зависит от исходного расположения значений элементов массива. После первого завершения внутреннего цикла элемент а[n-1] становится максимальным. После второ­го окончания внутреннего цикла на место а[n-2] выбирается максимальный из оставшихся элементов и т.д. Таким образом, после j-гo выполнения внутреннего цикла элементы a[n-j],...,a[n-l] уже упорядочены, и следующий внутренний цикл достаточно выполнить только для 0<i<(n-j-l). Именно поэтому после каждого окончания внутреннего цикла значение n уменьшается на 1.
В случае упорядоченности исходного массива внешний цикл повто­ряется только один раз, при этом выполняется (n-1) сравнений, k остается равным 0. Для случая, когда исходный массив упорядочен по убыванию, количество итераций внешнего цикла равно (n-1), а внутренний цикл последовательно выполняется (n-1)*n/2 раз.
Инициализация массивов. Инициализация – это объединение опреде-
ления объекта с одновременным присваиванием ему конкретного значе­ния. Использование инициализации позволяет изменить формат опреде­ления массива. Например, можно явно не указывать количество элементов одномерного массива, а только перечислить их начальные значения в списке инициализации:
double d[ ]={1.0, 2.0, 3.0, 4.0, 5.0};
В данном примере длину массива компилятор вычисляет по количеству начальных значений, перечисленных в фигурных скобках. После такого определения элемент d[0] равен 1.0, d[l] равен 2.0 и т.д. до d[4], который равен 5.0.
Если в определении массива явно указан его размер, то количество на­чальных значений не может быть больше количества элементов в массиве. Если количество начальных значений меньше, чем объявленная длина
112
массива, то начальные значения получат только первые элементы массива (с меньшими значениями индекса):
int M[8]={8,4,2};
В данном примере определены значения только переменных М[0], М[1] и М[2], равные соответственно 8, 4 и 2. Элементы М[3],..., М[7] не ини­циализируются.
Правила инициализации многомерных массивов соответствуют опреде­лению многомерного массива как одномерного, элементами которого служат массивы, размерность которых на единицу меньше, чем у исход­ного массива. Одномерный массив инициализируется заключенным в фи­гурные скобки списком начальных значений. В свою очередь, начальное значение, если оно относится к массиву, также представляет собой заклю­ченный в фигурные скобки список начальных значений. Например, присвоить начальные значения вещественным элементам двумерного мас­сива А, состоящего из трех "строк" и двух "столбцов", можно следующим образом:
double А[3][2]={{10,20}, (30,40), {50,60}};
Эта запись эквивалентна последовательности операторов присваива­ния: А[0][0]=10; А[0][1]=20; А[1][0]=30; А[1][1]=40; А[2][0]=50; А[2][1]=60;. Тот же результат можно получить с одним списком ини­циализации:
double A[3][2]={10,20,30,40,50,60};
С помощью инициализаций можно присваивать значения не всем элементам многомерного массива. Например, чтобы инициализировать только элементы первого столбца матрицы, ее можно описать так:
double Z[4][6]={{1}, {2}, (3), {4}};
Следующее описание формирует "треугольную" матрицу в целочис­ленном массиве из 5 строк и 4 столбцов:
int х[5][4]={{1), {2,3}, {4,5,6}, {7,8,9,10} };
В данном примере последняя пятая строка х[4] остается незапол­ненной. Первые три строки заполнены не до конца.
10.5. Переключатели
Основным средством для организации мультиветвления служит опера­тор-переключатель, формат которого имеет вид:
switch (выражение)
{ case константа1: операторы_1;
case константа2: операторы_2;
.................
default: операторы;
}
113
В этом операторе используются три служебных слова: switch, case,
default Первое из них идентифицирует собственно оператор-переклю-
чатель. Служебное слово case с последующей константой является в неко­тором смысле меткой. Константы могут быть целыми или символьными и все должны быть различными (чтобы метки были различимы). Служебное слово default также обозначает отдельную метку. При выполнении
опе­ратора вычисляется выражение, записанное после switch, и его значение последовательно сравнивается с константами, которые помещены вслед за case. При первом же совпадении выполняются операторы, помеченные данной меткой. Если выполненные операторы не предусматривают какого­либо перехода (т.е. среди них нет ни goto, ни return, ни exit(), ни break), то далее выполняются операторы всех следующих вариантов,
пока не
появится оператор перехода или не закончится переключатель.
Операторы вслед за default выполняются, если значение выражения в скобках после switch не совпало ни с одной константой после case. Метка default может в переключателе отсутствовать. В этом случае при несовпа­дении значения выражения с константами переключатель не выполняет никаких действий. Операторы, помеченные меткой default, не обязательно находятся в конце (после других вариантов переключателя). Уточним, что default и "case константа" не являются метками в обычном смысле. К ним, например, нельзя перейти с помощью оператора goto.
На рис. 52 приведены схемы переключателя (рис. 52, а) и оператора альтернативного выбора или селектора (рис. 52, б), отсутствующего в языке Си.
Рис. 52. Переключатель (а) и альтернативный выбор (б):
а – если выражение равно МК, то выполняются операторы S
б – если выражение равно LK, то выполняются только операторы S
114
k
, S
, …, Sn, S;
k+1
k
На рис. 53 изображена схема альтернативного выбора, реализованная
при помощи переключателя и дополнительных операторов, введенных в
, S2,...,Sn.
S
1
Рис.53. Альтернативный выбор с использованием переключателя.
В число операторов каждой группы S
выхода из переключателя
добавлен оператор
k
Для иллюстрации работы переключателя рассмотрим программу, кото-
рая читает любую десятичную цифру и выводит на экран ее название:
#include <stdio.h> void main( ) { int i; while(1) { printf("\n Введите десятичную цифру: ") ; scanf ("%d”,&i) ; printf("\t\t") ; switch( i ) {
115
case 1: printf("%d -один \n",i);
break;
case 2: printf ("%d - два \n",i);
break;
case 3: printf ("%d - три \n",i);
break;
case 4: printf("%d - четыре \n",i);
break; .
case 5: printf("%d - пять \n",i);
break;
саsе 6: printf("%d - шесть \n",i);
break;
case 7: printf("%d - семь \n",i);
break;
case 8: printf("%d - восемь \n",i);
break;
case 9: printf("%d - девять \n",i);
break;
case 0: printf("%d - нуль \n",i);
break;
default: printf("%d - это не цифра! \n",i);
return;
} /* Конец переключателя */
} /* Конец цикла */
Программа прекращает выполнение, как только будет введен символ, отличный от цифры. Завершение программы обеспечивает оператор return; который в данном случае передает управление операционной системе, так как выполняет выход из функции main().
Переключатель вместе с набором операторов break реализует в этой программе альтернативный выбор (см. рис. 52).
Несколько "меток" case с разными значениями констант могут поме­чать один оператор внутри переключателя, что позволяет еще больше разнообразить схемы построения операторов switch.
116
БИБЛИОГРФАФИЧЕСКИЙ СПИСОК
1. Веретенникова, В.Г. Тесты по информатике. 500 экзаменационных
ответов Ростов-н/Д: МарТ, 2001. – 140с.
рина, В. Д.
[Текст]: М, 2015. – 432 с.
ческие курсу ОИВТ / Т.Н.
методические указания и контрольные задания к лабораторному практику­му по курсу 28 с.
алгоритмизации» при подготовке учителей ресурс] / С.В. Даниленко, Ю.М. Мартынюк, В.С. Ванькова // Современная педагогика. – 2016. – № 12. URL:
http://pedagogika.snauka.ru/2016/12/6356 (дата обращения: 08.02.2019).
[Текст]:
во Тихоокеанского
учеб. томирский, М.П.
[Текст]: Липецкого
[Текст]: тических
1987. – 239 с.
образовательной деятельности по направлению «Педагогическое образова­ние» / А.В. (Высшее образование).
учеб.
[Текст] / В.Г. Веретенникова, С.М. Патрушина, Н.Г.Савельева. –
Гагарина, Л.Г. Алгоритмы и структуры данных [Текст] / Л.Г. Гага-
2.
Колдаев. – М.: Финансы и статистика, Инфра-М, 2009. – 304 с.
Голицына, О.Л. Основы алгоритмизации и программирования
3.
учеб. пособие / О.Л. Голицына, И.И. Попов. – М.: Форум, Инфра-
Горностаева, Т.Н. Организация ветвлений в Бейсике [Текст]: методи-
4.
указания и контрольные задания к лабораторному практикуму по
Горностаева. – Уссурийск: Изд-во УГПУ, 1993. – 11 с.
Горностаева, Т.Н. Организация циклов в Бейсике и Паскале [Текст]:
5.
ОИВТ / Т.Н. Горностаева. – Уссурийск: Изд-во УГПУ, 1995. –
Даниленко, С.В. Особенности
6.
Жданова, Т.А. Основы алгоритмизации и программирования
7.
учеб. пособие / Т.А. Жданова, Ю.С. Бузыкова. – Хабаровск: Изд-
гос. ун-та, 2011. – 56 с.
Заварыкин, В.И. Техника вычислений и алгоритмизация [Текст]:
8.
пособие для педагогических институтов / В.И. Заварыкин, В.Г. Жи-
Лапчик. – М.: Просвещение, 1987. – 157 с.
Кудинов, Ю.И. Основы алгоритмизации и программирования
9.
учеб. пособие / Ю.И. Кудинов, А.Ю. Келина. – Липецк: Изд-во
гос. техн. ун-та, 2013. – 73 с.
Лапчик М.П. Вычислительная техника и программирование
10.
учеб. пособие для студентов заочных отделений физико-матема-
факультетов пединститутов / М.П. Лапчик. – М.: Просвещение,
Могилев, А.В. Информатика [Текст]: учебник для осуществления
11.
Могилев, Н. И. Пак, Е. К. Хеннер. – М.: Академия, 2016. – 330 с.
образование – Бакалавриат) (Бакалавриат) (Педагогическое
Могилев, А.В. Практикум по информатике [Электронный ресурс]:
12.
пособие / А.В. Могилев, Н.И. Пак, Е.К. Хеннер; под ред. Е.К. Хен-
преподавания дисциплины «Основы
информатики [Электронный
117
нер. – 5-е
изд, стер. – М.: Издат. центр «Академия», 2009. – (Высшее
профессиональное образование). – Режим доступа:
https://elib.bashedu.ru/dl/read/Mogilev i dr_Praktikum po informatike_ up_Akademija_2009.pdf.
Муртазалиева, А.С. О значимости изучения алгоритмизации и
13.
про­граммирования в школьном курсе информатики [Текст] / А.С. Мурта­залиева, Т.С. Гаджиев // Журнал Вестник социально-педагогического института. – 2015. – №2 (14). – С.54-58.
Панфилова, Н.И. Программирование. Основы алгоритмизации и
14.
программирования [Текст]: учебник по направлению подготовки 230100 «Информатика и вычислительная техника» (квалификация «бакалавр») / Н.И. Панфилова, А.Н. Пылькин, Б.Г. Трусов. – 2-е изд. – М.: Academia,
2014. – 240 с.
Семакин, И.Г. Основы алгоритмизации и программирования
15.
[Текст]: И.Г. Семакин, А.П. Шестаков. – М.: Академия, 2016. – 304 с.
Точка, В.М. Основы алгоритмизации и программирования [Элект-
16.
ронный ресурс]: конспект лекций для студентов, обучающихся по спе­циальности 080801 «Прикладная информатика (в менеджменте) (дневной формы обучения)» / В.Н. Точка. – Тамбов, 2009. – 100 с. Режим доступа:
https://ronl.org/knigi/informatika/784912/
118
ОГЛАВЛЕНИЕ
ПРЕДИСЛОВИЕ ..................................................................................................3
1. ПОНЯТИЕ ОБ АЛГОРИТМАХ И СТРУКТУРАХ ДАННЫХ....................4
1.1. Основные определения..........................................................................4
1.2. Классификация структур данных .........................................................6
1.3. Информация и ее представление в памяти ЭВМ ..............................23
2. ПОНЯТИЕ АЛГОРИТМА.............................................................................25
2.1. Этапы решения задач на ПК................................................................25
3. СПОСОБЫ ЗАПИСИ АЛГОРИТМОВ ........................................................29
3.1. Словесная форма записи алгоритмов.................................................29
3.2. Запись алгоритма в виде формулы.....................................................30
3.3. Запись алгоритма в виде блок-схемы.................................................31
4. ВИДЫ АЛГОРИТМОВ .................................................................................35
4.1. Линейные алгоритмы...........................................................................35
4.2. Разветвляющиеся алгоритмы ..............................................................36
4.3. Циклические алгоритмы......................................................................39
5. СТРУКТУРНЫЕ АЛГОРИТМЫ..................................................................41
5.1. Базовые структуры алгоритмов ..........................................................41
6. В ЧЕМ ПРИНЦИПИАЛЬНОЕ ОТЛИЧИЕ ЦИКЛОВ? ПРИМЕРЫ
КОНФИГУРАЦИЙ БАЗОВЫХ СТРУКТУР............................................44
6.1. Примеры построения структурных алгоритмов ...............................45
7. ПРЕОБРАЗОВАНИЕ НЕСТРУКТУРНЫХ АЛГОРИТМОВ
В СТРУКТУРНЫЕ ......................................................................................49
7.1. Дублирование отдельных блоков схемы ...........................................49
7.2. Объединение условий ..........................................................................51
7.3. Использование переменной флажка...................................................54
8. НЕЛИНЕЙНЫЕ АЛГОРИТМЫ ...................................................................57
8.1. Вспомогательные алгоритмы..............................................................57
8.2. Рекурсивные алгоритмы......................................................................60
8.3. Итерационные алгоритмы ...................................................................63
9. ОСНОВЫ ЯЗЫКА СИ...................................................................................64
9.1. Базовые понятия языка ........................................................................64
9.2. Константы и строки..............................................................................67
9.3. Переменные...........................................................................................71
9.4. Операции...............................................................................................74
9.5. Разделители...........................................................................................78
9.6. Выражения и приведение арифметических типов............................81
119
10. ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ СИ......................88
10.1. Структура и компоненты простой программы ...............................88
10.2. Элементарные средства программирования ...................................96
10.3. Операторы цикла..............................................................................102
10.4. Массивы и вложение операторов цикла ........................................108
10.5. Переключатели .................................................................................113
БИБЛИОГРФАФИЧЕСКИЙ СПИСОК.........................................................117
Учебное издание
Глебова Татьяна Александровна Чиркина Марина Александровна Пышкина Ирина Сергеевна
АЛГОРИТМЫ И СТРУКТУРЫ ДАННЫХ
Учебное пособие по направлению подготовки 09.03.02 «Информационные системы и технологии»
В авторской редакции Верстка Н.В. Кучина
_______________________________________________
Подписано в печать 05.10.2024. Формат 60х84/16. Усл.печ.л. 6,98. Уч.-изд.л. 7,5. Тираж 80 экз. Бумага офисная «Снегурочка». Печать на ризографе. Заказ № 151.
Издательство ПГУАС.
440028, г. Пенза, ул. Германа Титова, 28.
120
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]