18536

Подпрограммы (функции)

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа № 6 Функции Вы уже знакомы с некоторыми библиотечными функциями такими как printf scanf getchar putchar gets sin cos ... . Теперь нужно знать как создавать свои собственные функции. Функция – это самостоятельная единица программы предназначенн...

Русский

2013-07-08

197.24 KB

3 чел.

Лабораторная работа № 6

Функции

Вы уже знакомы с некоторыми библиотечными функциями, такими как printf(), scanf(), getchar(), putchar(), gets(), sin(), cos(), ... . Теперь нужно знать, как создавать свои собственные функции.

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

Программа на Си может состоять из любого количества функций, одна из которых всегда носит имя main. Выполнение программы начинается с функции main(), которая может вызывать другие функции. Те в свою очередь тоже могут вызывать какие-то функции.

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

Описание любой функции имеет вид:

Заголовок функции

{Описания локальных переменных

Операторы

}

Заголовок функции имеет формат:

тип_функции  имя_функции (список_параметров)

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

Примеры заголовков функций:

main()

float max (float x, float y)

int prov (char mas[], int s)

void line (ink k, int n, char simv, int ps)

Тип функции, указанный перед именем функции, - это тип возвращаемого функцией значения. По умолчанию предполагается тип int. Если функция никакое значение не возвращает, то указывается тип void.

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

void line (k,n,simv,ps)

int k,n;

char simv;

int ps;

Но такая форма записи уже устарела (и имеет недостатки).

Значение функции передается в вызывающую программу с помощью оператора возврата return.

Пример описания функции:

/*функция определения наибольшего из двух чисел*/

float max ( float x, float y )

{if (x>y) return x;

else return y;

}

/*2-й вариант*/

float max (float x, float y)

{ float z; /*z=max(x,y)*/

z = (x>y) ? x : y ;

return z;

}

Вы можете вызвать свою функцию в любом выражении, указав ее имя и аргументы (фактические параметры):

имя_функции (аргумент_1, аргумент_2, ...)

Аргументом может быть идентификатор, константа и выражение. Типы аргумента и соответствующего параметра в заголовке функции должны совпадать. Например, оператор

f = max(a,b) - max(c,d);

содержит два вызова приведенной выше функции max. При первом обращении функции max передаются значения переменных a и b, она возвращает наибольшее из этих чисел, которое подставляется вместо указателя функции max(a,b). При втором вызове функции max формальным параметрам x и y присваиваются соответственно значения фактических параметров c и d. Оператор return возвращает наибольшее из этих значений в точку вызова функции.

Вызов функции без параметров имеет вид: имя_функции ().

Использование указателей при передаче параметров

Обмен информацией между вызывающей программой и функцией осуществляется благодаря параметрам. Если данные входные и функцией не изменяются, то передавать в списке параметров нужно значения данных. Сложнее вернуть вызывающей программе выходные данные, если их несколько (если результатом выполнения функции является одно единственное значение, то оно обычно, как вы уже видели, в число параметров не включается, а является значением функции). Если функция должна вернуть вызывающей программе нес колько значений, в этом случае передавать ей в качестве фактических параметров нужно адреса переменных. Вспомните вызов функции scanf(). Если, например, нужно ввести значения двух переменных x и y типа int, вы должны написать:

scanf ("%d %d",&x,&y);

где &x,&y - адреса переменных x и y. Точно так же при обращении к своей функции для выходных параметров нужно указывать адреса.

В описании функции соответствующие формальные параметры должны быть описаны как указатели на переменные соответствующего типа.

Допустим, функция function1() должна изменить значения переменных a и b типа float. В вызывающей программе обращение к функции нужно записать так:

function1 ( &a, &b );

а заголовок функции должен иметь вид:

void function1 ( float *ptr1, float *ptr2 )

Здесь prt1 и ptr2 - это указатели на переменные типа float (названия их могут быть изменены - это формальные параметры). Значениями указателей являются адреса. При вызове функции function1 переменной pt1 присваивается адрес a, а ptr2=&b.

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

*ptr1 = ... ;

*prt2 = ... ;

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

Примеры решения задач

Задача 1. В двух заданных массивах обнулить отрицательные элементы. Для обнуления отрицательных элементов массива составить подпрограмму. 

Для обнуления отрицательных элементов массива составим функцию, не обладающую значением, т.к. результатом работы функции должен быть измененный массив (а в массиве много элементов). Функция имеет следующие входные параметры: количество элементов массиваn, исходный массив m[]. Измененный массив m[] является также выходным параметром.

Программа:

#include <stdio.h>

#define NMAX 100  /* максимальное количество элементов массива */

otr (int n, float m[])   /* заголовок функции */

{int i;     /* текущий номер элемента массива */

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

if (m[i]<0)

m[i]=0;

}

main()

{int n, k;

int i;

float m1[NMAX], m2[NMAX];

printf(“\n Введите размер первого массива\n”);

scanf (“%d,&n);

printf(“\n Введите массив из %d элементов\n,n);

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

scanf (“%f,&m1[i]);

printf(“\n Введите размер второго массива\n”);

scanf (“%d,&k);

printf(“\n Введите массив из %d элементов\n, k);

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

scanf (“%f,&m2[i]);

otr(n,m1); /*вызов функции для обнуления отриц. элем. массива m1*/

otr(k,m2); /*вызов функции для обнуления отриц. элем. массива m2*/

printf(“\n Измененный массив первый\n”);

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

printf (“%.2f,m1[i]);

printf(“\n Измененный массив второй\n”);

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

printf (“%.2f,m2[i]);

}

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

Дано: массив1: 1 -5 9 10 0 -5

 массив2: -1 -8 -9 -4

Вывод: массив1: 1 0 9 10 0 0

массив2: 0 0 0 0

Задача 2. Даны две строки длиной до 80 символов. Определить число латинских букв в каждой строке.

Программа:

#include <stdio.h>

/*----------------------------------------------------------------------------------*/

/* Функция определения количества лат. букв в заданной строке */

/*----------------------------------------------------------------------------------*/

int KolLatBukv (char s[])

{ int i, /* индекс очередного символа строки s */

k=0; /* количество лат. букв */

 for (i = 0; s[i] != '\0'; i++ )

if (s[i] >= 'a' && s[i] <= 'z' | | s[i] >= 'A' && s[i] <= 'Z') k++;

return k;

}

/*------------------------*/

/* Главная функция */

/*------------------------*/

void main()

{ char s1[81], s2[81];  /* заданные строки */

 printf ("\nВведите две строки символов\n");

gets (s1);

gets (s2);

printf ("В 1-й строке %d лат. букв\n", KolLatBukv (s1));

printf ("Во  2-й  строке  %d  лат. букв\n", KolLatBukv (s2));

}

Пример результата выполнения программы:

Введите две строки символов

AaBbcd 123 Zz

t = x + y * z / 10 ;

В 1-й строке 8 лат. букв

Во 2-й строке 4 лат. букв

Задача 3. Описать функцию, которая для заданного числового массива определяет сумму и количество положительных элементов.

Программа:

#include <stdio.h>

/* Функция определения суммы и количества */

/*положительных элементов заданного массива */

void SumPos (float m[], int n, float *s, int *k)

/* Вх. параметры:

 m – указатель на заданный массив,

 n – число элементов массива.

Вых. параметры: 

*s –  сумма положительных элементов массива,

*k – количество положительных элементов      */

{ int i;

for (i=0, *s=0, *k=0;  i<n;  i++)

if (m[i] > 0)   (*s) += m[i],  (*k)++;

}

/*---------------------------------------------------------------------*/

 /* Главная функция (для тестирования подпрограммы) */

 /*---------------------------------------------------------------------*/

void main()

{float a[6],  /* массив */

s;  /* сумма положительных элементов */

int k,  /* количество положительных эл-тов */

  i;   /* индекс элемента массива*/ 

printf ("\nВведите 6 чисел\n");

for ( i=0; i < 6; i++) scanf ("%d ", &a[i] );

SumPos (a, 6, &s, &k); /* вызов функции */

printf ("Сумма положительных чисел =  %f\n", s);

printf ("Количество положительных чисел:  %d\n", k);

}

Порядок выполнения работы.

1. Получить задание у преподавателя.

2. Составить программу на Си и подобрать тесты для проверки программы на ЭВМ.

3. Выполнить тестирование и отладку программы на ЭВМ, показать результаты преподавателю.

4. Оформить и сдать отчет по лабораторной работе.

Задания для самостоятельного выполнения

  1.  Заданы два массива вещественных чисел. Найти номера минимальных элементов в каждом из них. Нахождение номера минимального элемента оформить как подпрограмму.
  2.  Заданы два массива целых чисел. Найти сумму четных элементов в каждом из них. Подсчет суммы четных элементов оформить как подпрограмму.
  3.  Заданы два массива целых чисел. Найти сумму и количество четных элементов в каждом из них. Подсчет суммы и количества четных элементов оформить как подпрограмму.
  4.  Задан текст, состоящий из n строк. В каждой строке подсчитать количество заглавных латинских букв и количество строчных латинских. Работу с каждой строкой оформить как подпрограмму.
  5.  Задан текст, состоящий из n строк. В каждой строке заменить цифры на пробелы. Работу с каждой строкой оформить как подпрограмму.
  6.  Заданы два массива целых чисел. В каждом из них найти среднее арифметическое значение элементов, кратных пяти. Подсчет среднего арифметического значения элементов массива оформить как подпрограмму.
  7.  Задан текст, состоящий из n строк. В каждой строке заменить заглавные латинские буквы на строчные, а строчные на заглавные (коды строчных и заглавных букв отличаются на число 32, например символ a код 97, а символ A – код 65). Работу с каждой строкой оформить как подпрограмму.
  8.  Задан текст, состоящий из n строк. В каждой строке заменить два одинаковых соседних символа на два пробела. Работу с каждой строкой оформить как подпрограмму.
  9.  Задан текст, состоящий из m строк. В каждой строке заменить сочетание символов АВ на два пробела. Работу с каждой строкой оформить как подпрограмму.
  10.  Заданы два массива целых чисел. В каждом из них найти сумму и количество элементов, кратных пяти. Подсчет суммы и количества элементов оформить как подпрограмму.
  11.  Задан текст, состоящий из n строк. В каждой строке заменить цифры на символ ‘!’. Работу с каждой строкой оформить как подпрограмму.
  12.  Заданы два массива целых чисел. В каждом из них найти количество четных элементов, кратных пяти. Подсчет количества элементов оформить как подпрограмму.
  13.  Задан текст, состоящий из n строк. В каждой строке подсчитать количество латинских букв. Работу с каждой строкой оформить как подпрограмму.
  14.  Задан текст, состоящий из n строк. В каждой строке заменить пробелы на символ ‘,. Работу с каждой строкой оформить как подпрограмму.
  15.  Заданы два массива целых чисел. Найти количество четных элементов в каждом из них. Подсчет количества четных элементов оформить как подпрограмму.
  16.  Задан текст, состоящий из n строк. В каждой строке подсчитать количество цифр. Работу с каждой строкой оформить как подпрограмму.
  17.  Заданы два массива вещественных чисел. В каждом из них элементы увеличить в заданное количество раз. Изменение массива оформить как подпрограмму.
  18.  Заданы два массива целых чисел. В каждом из них найти наименьшее среди положительных элементов. Нахождение минимального элемента оформить как подпрограмму.
  19.  Задан текст, состоящий из n строк. В каждой строке заменить символ ‘, на символ ’ ’ (пробел).  Работу с каждой строкой оформить как подпрограмму.
  20.  Заданы два массива вещественных чисел. В каждом из них заменить отрицательные элементы на число 0, а положительные увеличить в два раза. Изменение массива оформить как подпрограмму.
  21.  Заданы два массива целых чисел. В каждом из них уменьшить четные элементы в два раза.  Изменение массива оформить как подпрограмму.
  22.  Задан текст, состоящий из n строк. В каждой строке все не латинские буквы заменить на пробелы. Работу с каждой строкой оформить как подпрограмму.
  23.  Заданы два массива целых чисел. В каждом массиве элементы кратные 4 уменьшить в два раза. Изменение массива оформить как подпрограмму.
  24.  Задан текст, состоящий из n строк. В каждой строке все не цифровые символы заменить на пробелы. Работу с каждой строкой оформить как подпрограмму.
  25.  Заданы два массива вещественных чисел. Найти сумму минимальных элементов этих массивов. Нахождение минимума в массиве оформить как подпрограмму. 
  26.  Заданы два массива вещественных чисел. В каждом из них нечетные элементы увеличить в 4 раза. Изменение массива оформить как подпрограмму.
  27.   Задан текст, состоящий из n строк. В каждой строке заменить точки на запятые, а восклицательные знаки на точки. Работу с каждой строкой оформить как подпрограмму.
  28.   Заданы два массива целых чисел. В каждом из найти количество элементов, принадлежащее заданному диапазону целых чисел от а до в. Изменение массива оформить как подпрограмму.


 

А также другие работы, которые могут Вас заинтересовать

21762. Планирование НОТ и внедрение планов НОТ 27 KB
  Для обеспечения эффективности производства и улучшения качества работы планируют и внедряют планы НОТ. Планы НОТ должны обеспечивать комплексность планируемых и осуществляемых мероприятий; реальность планируемых мероприятий учитывающих научную обоснованность мероприятий с использованием достижений научнотехнического прогресса; непрерывность планирования мероприятий НОТ и экономичность которая обеспечивается выбором оптимального варианта и сопоставления необходимых затрат с достигаемым эффектом от внедрения отдельных...
21763. Рудничная аэромеханика 162 KB
  Режимы движения воздуха в шахтных вентиляционных системах. Применение уравнения Бернулли к движению воздуха по горным выработкам. Основное уравнение аэростатики Аэростатика наука о равновесии газов воздуха. Одной из основных задач аэростатики является определение изменения давления неподвижного воздуха с ростом высоты или глубины а также условий равновесия находящегося в воздушной среде тела.
21764. Рудничная аэромеханика. Аэродинамическое сопротивление горных выработок и методы его расчета 1.87 MB
  Разделив в этой формуле левую и правую части выражения на площадь живого сечения потока S SM получим выражение кг м2 в котором величина Pлб SSм представляет собой лобовое сопротивление hлб; тогда окончательное выражение для подсчета величины потерь давления воздуха вызванных лобовым сопротивлением hлб = Cx кг м2 Суммарное сопротивление. Эквивалентное отверстие выработки или шахты площадь отверстия в тонкой стенке через которое при разности давлений по обе стороны стенки равной депрессии выработки или шахты проходит...
21765. Специальные вентиляционные режимы 223.5 KB
  Высокая температура в очаге пожара приводит к нагреву воздуха что вызывает нарушение вентиляции шахты в целом и отдельных ее участков изменяется дебит вентиляционных потоков и их направление. При пожарах могут применяться следующие вентиляционные режимы: неизменный по дебиту и направлению; ослабленный или усиленный по дебиту и неизменный по направлению; реверсивный в целом по шахте или на отдельных участках с изменением количества воздуха; нулевой при котором прекращается доступ воздуха к очагу пожара путем выключения вентиляторов или с...
21766. Проектирование вентиляции шахт 1.43 MB
  При проектировании вентиляции шахты решаются задачи выбора схем вентиляции участков и шахты прогноза выделений вредных газов в выработки определения расхода воздуха для вентиляции шахты проверки сечения выработок по допустимой скорости движения воздуха выбора калорифера для подогрева поступающего в шахту воздуха в зимнее время проверки устойчивости движения воздуха в выработках расчета депрессии шахты регулирования распределения воздуха по выработкам шахты выбора способа вентиляции шахты и вентилятора главного проветривания...
21767. Расчет расхода воздуха для шахты в целом 2.99 MB
  3 Расчет расхода воздуха для шахты в целом Расход воздуха для шахты в целом определяется по формуле Qш=11ΣQучΣQп.ΣQкΣQут м3 мин 1 где 11 коэффициент учитывающий неравномерность распределения воздуха по сети горных выработок; ΣQуч расход воздуха для проветривания выемочных участков м3 мин; ΣQп.в расход воздуха подаваемый к всасам ВМП для обособленного проветривания тупиковых выработок м3 мин. На газовых шахтах расход воздуха для проветривания тупиковых выработок проводимых за пределами выемочных участков кроме...
21768. Расчет количества воздуха 1.55 MB
  В соответствии с 200 ПБ проветривание шахт должно быть организовано таким образом чтобы состав скорость и температура воздуха в действующих горных выработках соответствовали требованиям настоящих Правил. Расход количество воздуха для проветривания шахт должен определяться в соответствии с руководствами инструкциями утвержденными в установленном порядке. Расход воздуха подаваемого в горные выработки должен соответствовать расчетному.
21769. Исследование спектральных характеристик систем с ШИМ c выходом по переменному току 360 KB
  Задачей работы является приобретение навыков теоретического расчета фильтров импульсно-модуляционных систем при прохождении через них сигналов с ШИМ-II
21770. Компьютерная безопасность и взлом компьютерных систем 92.5 KB
  Компьютерные преступления приобрели в странах с развитой телекоммуникационной инфраструктурой настолько широкое распространение, что для борьбы с ними в уголовное законодательство были введены специальные составы преступлений. Однако во всех странах мира отмечается лавинообразный рост компьютерной преступности