ЛР СИ. Функции. Передача параметров
Скачать 139.46 Kb.
|
МОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ (Национальный исследовательский университет) Кафедра 305 Отчет по лабораторной работе на тему: «ФУНКЦИИ. ПЕРЕДАЧА ПАРАМЕТРОВ» Вариант №10
Москва, 2021 Цель работы: изучение методов использования функций языка Си. Задание на лабораторную работу: 1) Написать функцию, которая сортирует одномерный массив в порядке убывания методом пузырька. В основной программе вызвать эту функцию для двух разных массивов. 2) Оформить свои задания по лабораторным работам 3, 4 1-го семестра, и 1 второго семестра в виде функций. Организовать меню с вызовом этих функций. 1 ТЕОРЕТИЧЕСКИЙ МАТЕРИАЛ Часто в программе требуется повторить определенную последовательность операторов в разных частях программы. Для того, чтобы описывать эту последовательность один раз, а применять многократно, в языках программирования применяются подпрограммы. Подпрограмма – автономная часть программы, выполняющая определенный алгоритм и допускающая обращение к ней из различных частей общей программы. В языке Си существует один вид подпрограмм – функции. Каждая программа в своем составе должна иметь главную функцию main(), служащую точкой входа в программу. Кроме функции main(), в программу может входить произвольное число функций, выполнение которых инициализируется либо прямо, либо вызовами из функции main(). Каждая функция по отношению к другой является внешней. Для того, чтобы функция была доступной, необходимо, чтобы до ее вызова о ней было известно компилятору. Форма записи функции: (){} Если тип возвращаемого функцией значения не указан, то подразумевается int. Если с именем функции не связан результат, то нужно указать тип функции void. Параметры, записываемые в обращении к функции, называются фактическими; параметры, указанные в описании функции – формальными. Фактические параметры должны соответствовать формальным по количеству, порядку следования и типу. Объекты, объявленные вне функции, действуют в любой функции и называются глобальными. Объекты, объявленные в функции, действуют только в ней и называются локальными. В теле функции обычно присутствует оператор return, определяющий возвращаемое функцией значение. Все параметры функции, кроме массивов, передаются по значению, т.е. внутри функции создаются локальные копии параметров. Если необходимо передать саму переменную, а не её копию, то в функцию передаётся адрес этой переменной. Таким образом, через параметры можно передавать результат выполнения функции. То есть, параметры, с помощью которых результаты должны передаваться из функции в точку вызова, описываются как указатели. Вызов функции может быть оформлен в виде оператора, если с именем функции не связано возвращаемое значение, или в виде выражения, если возвращаемое значение связано с именем функции. Прототип функции может указываться до вызова функции вместо описания функции для того, чтобы компилятор мог выполнить проверку соответствия типов аргументов и параметров. Прототип функции по форме такой же, как и заголовок функции. В конце него ставится «;». Функции можно подключать с помощью директивы #include . Такие файлы с функциями удобно использовать в диалоговых программах с пользовательским меню, позволяющих выбрать один из режимов. Пример 1: Функция с параметрами-значениями. Результат связан с именем функции. В программе объявляется прототип функции, а сама функция описывается ниже. //lab1_1 #include #include int max(int, int); //Прототип функции void main() { int x, y, z; printf(" Enter x, y "); scanf("%d%d",&x, &y); z=max(x, y); //Вызов функции с фактическими параметрами printf("x=%d y=%d max=%d",x, y, z); getch(); } int max(int a ,int b) //Заголовок функции с формальными параметрами { int c; if (a>b) c=a; else c=b; return c; } Пример 2: Функция с параметрами-указателями. Здесь передаются адреса фактических параметров, по которым и получаем результат. Функция меняет местами переменные x, y. //lab1_2 #include #include main() { float x,y; void swap(float *, float *); // Прототип функции с параметрами - указателями printf("\n Enter x,y "); scanf("%f%f",&x,&y); swap(&x,&y); // Передаём адреса переменных printf("\n x=%4.2f y=%4.2f ",x,y); getch(); } void swap(float * a, float * b) {float c; c=*a; // *a - содержимое по адресу a *a=*b; *b=c; } Пример 3: Передача в функцию массива с использованием указателя. Результат – элементы массива возводятся в квадрат. Функция описывается до вызова, поэтому прототип не объявляется. //lab1_3 #include #include void quart(int n, float * x) // Можно void quart(int n, float x[]) { int i; for (i=0;i x[i]=x[i]*x[i]; } main() { float z[]={1,2,3,4}; int j; for (j=0;j<4;j++) printf(" %6.2f",z[j]); quart(4,z); for (j=0;j<4;j++) printf("\n %6.2f",z[j]); getch(); } Пример 4: Подключение файлов с функциями и создание меню. //lab1_4 #include #include #include " lab1_1.h" //#include "lab1_2.h" //#include "lab1_3.h" main() { int nom; while(1) { printf("\n 1. Value parameters \n"); printf(" 2. Exit \n"); scanf("%d", &nom); switch(nom) { case 1:printf("\n1st function calling result:\n max value is: %d\n",max(2,3));break; /* case nom:printf("\nn function calling result:\n max value is: %d\n",func_nom(a,b, ..., m));break;*/ case 2:return 0; default:printf("Wrong mode"); } } getch(); } Содержимое lab1_1.h – функция max() из lab1_1.c. 2 ХОД РАБОТЫ 2.1) Протокол программы сортировки одномерного массива, в количестве двух массивов, по убыванию методом пузырька находится в приложении А. Результат вычислений программы изображён на рисунке 1. Рисунок 1 – Результат программы 1 2.2) Протокол программы сортировки одномерного массива, в количестве двух массивов, по убыванию методом пузырька находится в приложении Б. Результат вычислений программы изображён на рисунке 2. Рисунок 2 – Результат программы 2 3 ВЫВОДЫ В ходе выполнения лабораторной работы были получены знания о работе методов использования функций в языке Си. ПРИЛОЖЕНИЕ А #include #include #include #include #include // Функция сортировки прямым обменом (метод "пузырька") void bubbleSort(int *num, int size) { // Для всех элементов for (int i = 0; i < size - 1; i++) { for (int j = (size - 1); j > i; j--) // для всех элементов после i-ого { if (num[j - 1] < num[j]) // если текущий элемент меньше предыдущего { int temp = num[j - 1]; // меняем их местами num[j - 1] = num[j]; num[j] = temp; } } } } int puz(int N) { int a[N]; // Объявляем массив из N элементов // Вводим значения элементов массива for (int i = 0; i < N; i++) { printf("a[%d] = ", i); scanf("%d", &a[i]); } bubbleSort(a, N); // вызываем функцию сортировки // Выводим отсортированные элементы массива for (int i = 0; i printf("%d ", a[i]); getchar(); getchar(); return 0; } int main () { SetConsoleCP(1251); SetConsoleOutputCP(1251); int N; printf ("\n Приветствую! Это программа которая сортирует одномерный массив в порядке убывания методом пузырька."); printf ("\n В данной программе сортируется 2 массива одновременно."); printf ("\n Введите количество элементов в массиве №1:\n N="); scanf ("%d", &N); puz(N); printf ("\n Введите количество элементов в массиве №2:\n N="); scanf ("%d", &N); puz(N); return 0; } ПРИЛОЖЕНИЕ Б Протокол программы Matyushenko_RV_1_2_10.с: #include #include #include "Matyushenko_RV_1_1_10.h" #include "Matyushenko_RV_3_1_12.h" #include "Matyushenko_RV_4_1_12.h" int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); float m; do { printf ("\n Приветствую! Это многофункциональная программа"); printf ("\n Введите число (1) если хотите воспользоваться программой 1 ЛР 2 семестра"); printf ("\n Введите число (2) если хотите воспользоваться программой 3 ЛР 1 семестра"); printf ("\n Введите число (3) если хотите воспользоваться программой 4 ЛР 1 семестра"); printf ("\n Введите число (9) если хотите выйти из приложения\n"); scanf ("%f", &m); if(m==1) prog1(); if(m==2) prog2(); if(m==3) prog3(); } while (m != 9); return 0; } Протокол библиотеки Matyushenko_RV_1_1_10.h: #include #include #include #include #include void prog1(); // Функция сортировки прямым обменом (метод "пузырька") void bubbleSort(int *num, int size) { // Для всех элементов for (int i = 0; i < size - 1; i++) { for (int j = (size - 1); j > i; j--) // для всех элементов после i-ого { if (num[j - 1] < num[j]) // если текущий элемент меньше предыдущего { int temp = num[j - 1]; // меняем их местами num[j - 1] = num[j]; num[j] = temp; } } } } int puz(int N) { int a[N]; // Объявляем массив из N элементов // Вводим значения элементов массива for (int i = 0; i < N; i++) { printf("a[%d] = ", i); scanf("%d", &a[i]); } bubbleSort(a, N); // вызываем функцию сортировки // Выводим отсортированные элементы массива for (int i = 0; i printf("%d ", a[i]); getchar(); getchar(); return 0; } void prog1() { SetConsoleCP(1251); SetConsoleOutputCP(1251); int N; printf ("\n Приветствую! Это программа которая сортирует одномерный массив в порядке убывания методом пузырька."); printf ("\n В данной программе сортируется 2 массива одновременно."); printf ("\n Введите количество элементов в массиве №1:\n N="); scanf ("%d", &N); puz(N); printf ("\n Введите количество элементов в массиве №2:\n N="); scanf ("%d", &N); puz(N); } Протокол библиотеки Matyushenko_RV_3_1_12.h: #include #include #include #include void prog2 (); int fact(int n) { if (n == 0 || n==1) return 1; else { return n * fact(n - 1); } } void prog2 () { int i, N; float x, S1, S2, S3; SetConsoleCP(1251); SetConsoleOutputCP(1251); printf("\n Bведите число N \n"); scanf("%d", &N); printf("\n Bведите число x \n"); scanf("%f", &x); S1 = 0; S2 = 0; S3 = 0; for (i = 1; i <= N; i++) S1 += (pow(x,i)/fact(i)); i = 0; while (i { i++; S2+=(pow(x,i)/fact(i)); } i = 0; do { i++; S3+=(pow(x,i)/fact(i)); } while (i printf("\nS1=%f \nS2=%f \nS3=%f \n", S1, S2, S3); } Протокол библиотеки Matyushenko_RV_4_1_12.h: #include #include #include #include #include void prog3 (); double f(double x) { return (((1-x)*log10(x))/sqrt(1-log10(x))); } double Formula_Trapesii(double a, double b, int n) { double h=(b-a)/n; double I1=f(a)+f(b); for (int i=0; i<=n-1; i++) { I1+=2*f(a+i*h); } I1*=h/2; return I1; } double Sympson(double a, double b, int n) { double h=(b-a)/n; double I2=f(a)+f(b); int k; for (int i=0; i<=n-1; i++) { k=2+2*(i%2); I2+=k*f(a+i*h); } I2*=h/3; return I2; } void prog3 () { SetConsoleCP(1251); SetConsoleOutputCP(1251); double a,b; double I1,I2; int n; a=2; b=7; n=100; I1=Formula_Trapesii(a, b, n); I2=Sympson(a, b, n); printf ("\n Приветствую! Это программа по вычислению определённого интеграла по формуле трапеции и по формуле Симпсона \n"); printf ("\n Результат вычисления интеграла по формуле трапеции I1=%f \n Результат вычисления интеграла по формуле Симпсона I2=%f \n", I1, I2); } |