Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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




1) Запустить программу Dev-C++.

2) Составить алгоритм решения задачи по работе с двумерным динамическим массивом в соответствие с индивидуальным заданием.

3) Составить программу решения индивидуального задания по работе с двумерным динамическим массивом.

4) Выполнить пошаговую отладку программы (Debug) с использованием слежения за переменными (Add Watch).

5) Выполнить отчет по лабораторной работе, содержащий результат выполнения программы.

Индивидуальные задания

В двухмерном целочисленном массиве (размеры массива N, M и значения его элементов вводить с клавиатуры) найти указанное значение. Значение элементов массива вводит пользователь. Массив в памяти разместить динамически.

1) Найти сумму элементов, расположенных на главной диагонали.

2) Найти произведение элементов, расположенных на главной диагонали.

3) Найти максимальный элемент и поменять его с первым элементом.

4) Найти минимальный элемент и поменять его с первым элементом.

5) Найти максимальный элемент и поменять его с последним элементом.

6) Найти минимальный элемент и поменять его с последним элементом.

7) Найти количество отрицательных и положительных элементов массива.

8) Найти количество 0-й и 1-ц в массиве, а также сумму единиц.

9) Найти число элементов массива, больших T (вводится с клавиатуры) и просуммировать эти элементы.

10) Найти число элементов массива > Т и их произведение.

11) Найти число элементов массива < T и их сумму.

12) Найти число элементов массива < T и перемножить эти элементы.

13) Найти число элементов массива = T и сложить эти элементы.

14) Найти число элементов массива = T и перемножить эти элементы.

15) Найти максимальный элемент среди лежащих ниже главной диагонали.

16) Найти минимальный элемент среди лежащих выше главной диагонали.

Контрольные вопросы

1) Дайте определение понятию «указатель».

2) Приведите пример объявления и использования указателей.

3) Приведите пример объявления многомерного массива.

4) Что такое указатель на указатель и для чего он используется?

5) Какие основные функции используются для работы с динамической памятью?

 

ЛАБОРАТОРНАЯ РАБОТА № 6

Тема: «Организация программ, содержащих подпрограммы»

Цель работы – ознакомиться с механизмом составления и организации взаимодействия пользовательских функций языка С.

Теоретические сведения

6.1. Описание функции пользователя

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

Описание функции – декларация ее прототипа в начале программного файла. Используется следующий способ декларации функций:

<тип_результата> <имя_функции>(<тип> <переменная>,

…<тип> <переменная>);

Идентификаторы переменных в круглых скобках прототипа указывать необязательно, так как компилятор языка их не обрабатывает.

Пример 6.1. Описание функции fun со списком параметров:

float fun(int, float, int, int);

Прототип функции сообщает компилятору о том, что далее в тексте программы будет приведено полное определение (полный ее текст). Полное определение функции имеет следующий вид:

<тип_результата> <имя_функции>(список параметров)

{

код функции

}

Тип результата определяет тип значения, который возвращается функцией в точку ее вызова при помощи оператора возврата return. Если тип функции не указан, то по умолчанию предполагается тип int. Список параметров состоит из перечня типов и имен параметров, разделенных запятыми. Функция может не иметь параметров (void), но круглые скобки необходимы в любом случае.

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

Пример 6.2. Реализация функции, определяющей наименьшее из двух целых чисел:

А)       int mini(int x, int y) {

int t;

if (x<y) t=x;

else t=y;

return t;

}

Б) можно написать функцию mini и другим образом:

mini(int x, int y) {

return (x<y)? x:y;

}

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

Если функция не возвращает никакого значения, она должна быть описана как функция типа void (пустая).

 

 

Пример 6.3. Функция вывода горизонтальной строки на экран дисплея:

void lin(char a)      // char a=’-‘; или a=’=’;

{

int k;

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

printf(“%c”, a);

}

Если у функции отсутствует список параметров, то при декларации такой функции желательно в круглых скобках также указать ключевое слово void. Например, заголовок основной функции должен выглядеть так: void main(void).

В языке С каждая функция – это отдельный блок программы, вход в который возможен только через вызов данной функции. Например, нельзя оператором перехода goto передать управление внутрь функции.

Вызов функции имеет следующий формат:

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

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

6.2. Область действия переменных

Область действия переменной – это правила, которые устанавливают, какие данные доступны из текущего места программы. Имеются три типа переменных: глобальные, локальные и формальные. Область действия локальных переменных – это те блоки, где локальные переменные объявлены. При выходе из блока локальная переменная и ее значение теряются.

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

Глобальные переменные объявляются вне какой-либо функции. Глобальные переменные могут быть использованы в любом месте программы, но перед их первым использованием они должны быть объявлены и инициализированы. Область действия глобальных переменных - вся программа с момента их объявления.

В языке С каждая переменная принадлежит к одному из четырех классов памяти – автоматическая (auto), внешняя (extern), статическая (static), регист- ровая (register). Тип памяти указывается ключевым словом (auto, extern, static, register), стоящим перед спецификацией типа переменной.

По умолчанию переменная относится к классу auto и будет размещена в стеке.

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

При необходимости функцию можно использовать для изменения передаваемых ей аргументов. В этом случае в качестве аргумента следует в вызываемую функцию передавать не значение переменной, а ее адрес. А для обращения к значению аргумента-оригинала использовать операцию «*».

 

Пример 6.4. Фрагмент программы, использующей функцию, в которой меняются местами значения аргументов x и y:

. . . void z1(int*, int*);    // Описание прототипа

void main()

{ int a=2, b=3;

printf(“\n a=%d, b=%d”, a, b);

z1(&a, &b);       // Обращение к функции

printf(“\n a = %d, b = %d”, a, b);

}

void z1(int *x, int *y)     {// Описание (реализация) функции

int t;

t = *x;

*x = *y;

*y = t;

return;

}

При таком способе передачи аргументов их значения будут изменены, т.е. на экран монитора будет выведено: "a = 2, b = 3, a = 3, b = 2».

6.3. Рекурсивные функции

В языке С функции могут вызывать сами себя. В этом случае функция называется рекурсивной.

Пример 5.5. Рекурсивная функция – вычисление факториала числа n - n! =1*2*3*…*n (n!=0*1*2*3*…*n):

double factor(int n)

{

if (n <2) return 1;

else return factor(n -1) * n;

}

Вызов функции в рекурсии не создает новую копию функции, а создает новые копии локальных переменных и параметров. Из рекурсивной функции надо предусмотреть выход, иначе система «зависает» через некоторое время работы с ней.

 

6.4. Указатели на функцию

На функцию, как и на другой объект, можно создать указатель, например, указатель р на функцию, возвращающую значение типа type и имеющую пара- метры типа type1 t, type2 z, объявляется следующим образом:

type (*p)(type1 t1, type2 t2);

 

Пример 6.5. Ввести массив NxN (не больше 50) целых чисел, в функции посчитать сумму его положительных значений. 

#include <stdio.h>

#include <conio.h>

void summa(int, int a1[ ][50]); // Описание прототипа функции

void main(void)

 {

int a[50][50];

int i,j,N;

printf("\n Введите размер массива N (<50)\n");

scanf(“%d”,&N);

printf("\n Введите данные \n");

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

     for(j=0; j<N; j++)

  {

      printf("\n a[%d][%d]=", i+1, j+1);

       scanf("%d", &a[i][j]);

  }

  summa(N,a); // Обращение к функции

}

void summa(int n, int a1[ ][50]) // Реализация функции 

{

int i,j,s;

printf("\n Функция summa \n"); // Вычисление суммы

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

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

      if (a1[i][j]>0) s+=a1[i][j];

printf("\a\n Сумма = %d, Press any key... ",s);

getch();

}

 










Последнее изменение этой страницы: 2018-05-10; просмотров: 150.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...