Файл: Лабораторная работа 1 Изучение среды разработки программ 3 Лабораторная работа 2 Исследование базовых типов данных языка Си 18.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 292
Скачиваний: 3
СОДЕРЖАНИЕ
Лабораторная работа № 1Изучение среды разработки программ
ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Лабораторная работа № 2Исследование базовых типов данных языка Си
Лабораторная работа № 4Применение управляющих инструкций языка для организации ветвлений в программе
ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ
Лабораторная работа № 5Исследование циклов
Лабораторная работа № 6Применение массивов и указателей для решения прикладных задач
ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Лабораторная работа № 7Исследование массивов и указателей
Лабораторная работа № 8Применение функций работы со строками для решения прикладных задач
ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Практическое занятие № 6Использование функций для работы с массивами
ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Практическое занятие № 7Программирование рекурсивных алгоритмов
ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Практическое занятие № 8Применение производных типов данных для решения прикладных задач
ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Лабораторная работа № 5Исследование методов доступа к файлам данных
Лабораторная работа № 6Исследование связанных списков данных
Рассмотрим пример. Пусть заданы два массива чисел. Необходимо определить, в каком из массивов сумма положительных элементов больше. Очевидно, что для решения этой задачи целесообразно использовать отдельную функцию, вычисляющую эту сумму.
int PositivSum(int *a, int n);
int main(int argc, char* argv[])
{
const int N=10;
int Arr1[N], Arr2[N];
int sum1=0,sum2=0;
randomize();
cout<<”\nПервый массив:\n”;
for (int i=0;i
{
Arr1[i]=rand()%100-50;
cout<
}
cout<<”\nВторой массив:\n”;
for (int i=0;i
{
Arr2[i]=rand()%100-50;
cout<
}
sum1=PositivSum(Arr1,N);
sum2=PositivSum(Arr2,N);
cout<<"\nСумма положительных элементов
первого массива: "<<sum1;
cout<<"\nСумма положительных элементов второго массива: "<<sum2;
if (sum1==sum2) cout<<"\nСуммы равны!";
else if (sum1>sum2) cout<<"\nПервая сумма больше";
else cout<<"\nВторая сумма больше";
return 0;
}
//-----------------------------------------------------
int PositivSum(int *a, int n)
{
int sum=0;
for (int i=0;i
if (a[i]>0) sum+=a[i];
return sum;
}
Необходимо обратить внимание на тот факт, что синтаксис языка Си позволяет использовать и другую нотацию процедуры передачи массива в функцию. Так, вместо:
int PositivSum(int *a, int n);
можно записать:
int PositivSum(int a[], int n);
что тоже говорит о том, что в качестве параметра передается имя массива, то есть адрес начала массива.
Если попытаться сделать эту программу более эффективной, то можно увидеть, что процедуру инициализации массива данными можно реализовать в виде отдельной функции, а из функции возвращать адрес созданного массива:
...
int PositivSum(int *a, int n);
int* InputData(const int n);
int main(int argc, char* argv[])
{
const int N=10;
int sum1=0,sum2=0;
int *Arr1, *Arr2;
Arr1=InputData();
Arr2=InputData();
...
_getch();
return 0;
}
//-----------------------------------------------------
int* InputData(const int n)
{
int a[n];
cout<<”\nМассив:\n”;
for (int i=0;i
{
a[i]=rand()%100-50;
cout<
}
_getch();
return a;
}
...
Если откомпилировать эту программу, то возникнет ряд ошибок. С чем они могут быть связаны? Ответ на этот вопрос очень простой. Мы в функции InputData() создаем локальный массив с именем a, а затем пытаемся вернуть его адрес в вызывающую функцию. Но ничего не получится, так как локальный массив создается в стеке, и при выходе из функции он разрушается, а, следовательно, теряется не только его адрес начала, но и сами значения.
Разрешить эту проблему можно путем создания в функции не локального массива, а выделения динамической памяти под массив, то есть созданием динамического массива.
Вместо
int a[n]
требуется
int *a=new int[n];.
В этом случае при выходе из функции динамическая память не теряется и программа будет работать правильно. Но для того, чтобы она работала корректно, необходимо перед завершением функции main() освободить динамическую память:
delete []Arr1;
delete []Arr2;
ПРОГРАММА РАБОТЫ
Реализовать с использованием механизма функций в соответствии с номером по журналу и номером варианта:
Вариант 1
В одномерном массиве, состоящем из п вещественных элементов, вычислить:
-
сумму отрицательных элементов массива; -
произведение элементов массива, расположенных между максимальным и минимальным элементами.
Вариант 2
В одномерном массиве, состоящем из п вещественных элементов, вычислить:
-
сумму положительных элементов массива; -
произведение элементов массива, расположенных между максимальным по модулю и минимальным по модулю элементами.
Вариант 3
В одномерном массиве, состоящем из п целых элементов, вычислить:
-
сумму элементов массива, расположенных между первым и последним нуле
выми элементами. -
Преобразовать массив таким образом, чтобы сначала располагались все положительные элементы, а потом — все отрицательные (элементы, равные 0, считать положительными).
Вариант 4
В одномерном массиве, состоящем из п вещественных элементов, вычислить:
-
сумму элементов массива с нечетными номерами; -
Сжать массив, удалив из него все элементы, модуль которых не превышает 1. Освободившиеся в конце массива элементы заполнить нулями.
Вариант 5
В одномерном массиве, состоящем из п вещественных элементов, вычислить:
-
максимальный элемент массива; -
сумму элементов массива, расположенных до последнего положительного элемента.
Вариант 6
В одномерном массиве, состоящем из п вещественных элементов, вычислить:
-
минимальный элемент массива; -
сумму элементов массива, расположенных между первым и последним положительными элементами.
Вариант 7
В одномерном массиве, состоящем из п целых элементов, вычислить:
-
номер максимального элемента массива; -
Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в нечетных позициях, а во второй половине — элементы, стоявшие в четных позициях.
Вариант 8
В одномерном массиве, состоящем из п вещественных элементов, вычислить:
-
сумму элементов массива, расположенных между первым и вторым отрицательными элементами. -
Преобразовать массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает 1, а потом — все остальные.
Вариант 9
В одномерном массиве, состоящем из п вещественных элементов, вычислить:
-
максимальный по модулю элемент массива; -
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.
Вариант 10
В одномерном массиве, состоящем из п целых элементов, вычислить:
-
минимальный по модулю элемент массива; -
сумму модулей элементов массива, расположенных после первого элемента, равного нулю.
Вариант 11
В одномерном массиве, состоящем из п вещественных элементов, вычислить:
-
номер минимального по модулю элемента массива; -
сумму модулей элементов массива, расположенных после первого отрицательного элемента.
Вариант 12
В одномерном массиве, состоящем из п вещественных элементов, вычислить:
-
номер максимального по модулю элемента массива; -
сумму элементов массива, расположенных после первого положительного элемента.
Вариант 13
В одномерном массиве, состоящем из п вещественных элементов, вычислить:
-
количество элементов массива, лежащих в диапазоне от А до В; -
сумму элементов массива, расположенных после максимального элемента.
Вариант 14
В одномерном массиве, состоящем из п вещественных элементов, вычислить:
-
количество элементов массива, равных 0; -
сумму элементов массива, расположенных после минимального элемента.
Вариант 15
В одномерном массиве, состоящем из п вещественных элементов, вычислить:
-
количество элементов массива, больших С; -
Преобразовать массив таким образом, чтобы сначала располагались все отрицательные элементы, а потом — все положительные (элементы, равные 0, считать положительными).
Занятие 12
Практическое занятие № 7
Программирование рекурсивных алгоритмов
Цель занятия:
-
Совершенствование навыков разработки программ в среде программирования MS Visual C++ -
Совершенствование навыков описания и использования функций в программах -
Получение начальных навыков в использовании рекурсий
Время на выполнение работы: 2 часа
Учебные вопросы:
-
Рекурсивные определения и алгоритмы -
Программирование рекурсий
Подготовка к выполнению работы:
-
Изучить рекомендованную литературу (базовые конструкции структурного программирования, массивы и указатели, функции). -
Изучить материал настоящего руководства.
Материалы для подготовки к занятию:
-
Конспект лекций. -
[1] стр. 73-82.
ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
-
Рекурсивные определения и алгоритмы
Рекурсивной называется функция, которая вызывает саму себя. Такая рекурсия называется прямой. Существует еще косвенная рекурсия, когда две или более функций вызывают друг друга. Если функция вызывает себя, в стеке создается копия значений ее параметров, как и при вызове обычной функции, после чего управление передается первому исполняемому оператору функции. При повторном вызове этот процесс повторяется. естественно, что для завершения вычислений каждая рекурсивная функция должна содержать хотя бы одну нерекурсивную ветвь алгоритма, заканчивающуюся оператором возврата. При завершении функции соответствующая часть стека освобождается, и управление передается вызывающей функции, выполнение которой продолжается с точки, следующей за рекурсивным вызовом.
Классическим примером рекурсивной функции является вычисление факториала числа. Для того чтобы получить значение факториала числа