Индивидуальное задание к лабораторной работе
Составить программу для обработки массивов согласно индивидуальному заданию приведенному в таблице 23.
Таблица 23 - Индивидуальное задание
Контрольные вопросы для подготовки и самостоятельной работы 1 Как производится доступ к элементам массива? 2 Какое количество операторов цикла необходимо для обработки главной или побочной диагонали массива? 3 Какие методы сортировки элементов Вы знаете? 4 Можно ли использовать указатель на тип элементов массива в качестве имени массива и что для этого необходимо? 5 Адрес какого элемента содержит имя массива? 6 Какие классы памяти можно использовать при объявлении массива? 7 Какие классы памяти используются по умолчанию?
8 Как размещаются элементы массива в памяти? 9 Как определяется количество байтов, на которое смещается указатель индексного выражения? Зависит ли смещение указателя от типа элементов массива?
Лабораторная работа №12 Сортировка одномерных массивов Цель работы: изучить и научиться применять обработку массивов по заданным логическим условиям, формирование новых массивов и их сортировка.
Теоретические сведения
Упорядочение в одномерных массивах. Для демонстрации некоторых особенностей вложения циклов и работы с массивами рассмотрим простейшие алгоритмы сортировки. Необходимо, введя значение переменной 1<n<=100 и значения n первых элементов массива а[0],а[1],...,а[n-1], упорядочить эти первые элементы массива по возрастанию их значений. Текст первого варианта программы: /* Упорядочение элементов массива */ #include <stdio.h> main() { int n,i,j; 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”,&a[j]); } 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] для всех 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 раз. Задание. Написать программу на СИ для задачи, указанной в таблице 24. Имя и размер массива выбрать самостоятельно. Таблица 24
Лабораторная работа № 13
Многомерные массивы. Цель работы: изучить конструкции языка С и операторы для обработки многомерных массивов.
Теоретические сведения Вложенные циклы. В теле цикла разрешены любые исполнимые операторы, в том числе и циклы, т.е. можно конструировать вложенные циклы. В качестве примера рассмотрим фрагмент программы для получения суммы такого вида: Введем следующие обозначения: а - двумерный массив, содержащий значения элементов матрицы; р - произведение элементов строки матрицы; с - сумма их значений; s - искомая сумма (результат). Опустив определения переменных и операторы ввода-вывода, запишем текст на языке Си: double a[10][5]; for(s=0.0,j=0; j<10; j++) { for(p=1.0,c=0.0,i=0; i<5; i++) { p*=a[j][i]; c+=a[j][i]; } s+=c+p; } При работе с вложенными циклами следует обратить внимание на правила выполнения операторов break и continue. Каждый из них действует только в том операторе, в теле которого он непосредственно использован. Оператор break прекращает выполнение ближайшего внешнего для него оператора цикла. Оператор continue передает управление на ближайшую внешнюю проверку условия продолжения цикла.
Для иллюстрации рассмотрим фрагмент другой программы для вычисления суммы произведений элементов строк той же матрицы: double a[10][5]; for (j=0,s=0.0; j<10; j++) { for (i=0,p=1.0; i<5; i++) { if (a[j][i] ==0.0) break; p*=a[j][i]; } if (i <5) continue; s+=p; } Внутренний цикл по i прерывается, если обнаруживается нулевой элемент матрицы. В этом случае произведение элементов столбца заведомо равно нулю, и его не нужно вычислять. Во внешнем цикле проверяется значение i. Если i<5, т.е. элемент a[j][i] оказался нулевым, то оператор continue передает управление на ближайший оператор цикла, и, таким образом, не происходит увеличение s на величину "недосчитанного" значения р. Если внутренний цикл завершен естественно, то i равно 5, и оператор continue не может выполняться. Ход работы
1 Изучить теоретические сведения. 2 В соответствии с индивидуальным заданием разработать алгоритм и программу с применением указателей на массив и массив указателей для работы с двумерным и трёхмерным массивом. 3 Показать использование различных видов синтаксических конструкций, включая индексные выражения и указатели на тип элементов массива для доступа к элементам массива. 4 Набрать и отладить программу на компьютере. 5 Изучить работу операторов. 6 Получить результаты. 7 Оформить отчет. 8 Подготовиться к защите лабораторной работы, изучив контрольные вопросы по данной теме.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|