🗊Презентация Структурный элемент программы - функции

Категория: Образование
Нажмите для полного просмотра!
Структурный элемент программы - функции, слайд №1Структурный элемент программы - функции, слайд №2Структурный элемент программы - функции, слайд №3Структурный элемент программы - функции, слайд №4Структурный элемент программы - функции, слайд №5Структурный элемент программы - функции, слайд №6Структурный элемент программы - функции, слайд №7Структурный элемент программы - функции, слайд №8Структурный элемент программы - функции, слайд №9Структурный элемент программы - функции, слайд №10Структурный элемент программы - функции, слайд №11Структурный элемент программы - функции, слайд №12Структурный элемент программы - функции, слайд №13Структурный элемент программы - функции, слайд №14Структурный элемент программы - функции, слайд №15Структурный элемент программы - функции, слайд №16Структурный элемент программы - функции, слайд №17Структурный элемент программы - функции, слайд №18Структурный элемент программы - функции, слайд №19Структурный элемент программы - функции, слайд №20Структурный элемент программы - функции, слайд №21Структурный элемент программы - функции, слайд №22Структурный элемент программы - функции, слайд №23Структурный элемент программы - функции, слайд №24Структурный элемент программы - функции, слайд №25Структурный элемент программы - функции, слайд №26Структурный элемент программы - функции, слайд №27Структурный элемент программы - функции, слайд №28Структурный элемент программы - функции, слайд №29Структурный элемент программы - функции, слайд №30Структурный элемент программы - функции, слайд №31Структурный элемент программы - функции, слайд №32Структурный элемент программы - функции, слайд №33Структурный элемент программы - функции, слайд №34Структурный элемент программы - функции, слайд №35

Содержание

Вы можете ознакомиться и скачать презентацию на тему Структурный элемент программы - функции. Доклад-сообщение содержит 35 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Функции
Описание слайда:
Функции

Слайд 2





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

Слайд 3





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

Слайд 4





Общий вид функции
Общий вид определения функции выглядит следующим образом:
 	тип_возвращаемого_значения имя_функции(список_параметров)
	{
		тело функции
	}
тип_возвращаемого_значения определяет тип переменной, которую возвращает функция в качестве своего значения. Функция может возвращать переменные любого типа кроме массива, но может возвращать указатель на массив
имя_функции – правильный идентификатор
список_параметров – список типов переменных и их имен, разделенных запятой
Общий вид списка формальных параметров функции выглядит следующим образом:
	имя_функции(тип имя_переменной1, …, тип имя_переменнойN)
Описание слайда:
Общий вид функции Общий вид определения функции выглядит следующим образом:   тип_возвращаемого_значения имя_функции(список_параметров) { тело функции } тип_возвращаемого_значения определяет тип переменной, которую возвращает функция в качестве своего значения. Функция может возвращать переменные любого типа кроме массива, но может возвращать указатель на массив имя_функции – правильный идентификатор список_параметров – список типов переменных и их имен, разделенных запятой Общий вид списка формальных параметров функции выглядит следующим образом: имя_функции(тип имя_переменной1, …, тип имя_переменнойN)

Слайд 5





Примеры
Функция с двумя аргументами целого типа, возвращающая целое число
int func(int a, int b) // правильное объявление параметров функции
	{
		тело функции
	}
	
int func(int a, b) // неправильное объявление параметров функции
	{
		тело функции
	}
Описание слайда:
Примеры Функция с двумя аргументами целого типа, возвращающая целое число int func(int a, int b) // правильное объявление параметров функции { тело функции } int func(int a, b) // неправильное объявление параметров функции { тело функции }

Слайд 6





Прототип функции
В современных, правильно написанных программах на языке С каждую функцию перед использованием необходимо объявлять. Обычно это делается с помощью прототипа функции. В первоначальном варианте языка С прототипов не было; но они были введены уже в Стандарт С89. Хотя прототипы формально не требуются, но их использование очень желательно. (Впрочем, в C++ прототипы обязательны!) 
Прототипы дают компилятору возможность тщательнее выполнять проверку типов, подобно тому, как это делается в таких языках как Pascal. Если используются прототипы, то компилятор может обнаружить любые сомнительные преобразования типов аргументов, необходимые при вызове функции, если тип ее параметров отличается от типов аргументов. При этом будут выданы предупреждения обо всех таких сомнительных преобразованиях. Компилятор также обнаружит различия в количестве аргументов, использованных при вызове функции, и в количестве параметров функции. 
В общем виде прототип функции должен выглядеть таким образом: 
тип имя_функции(тип имя_парам1, тип имя_парам2, ..., имя_парамN);
Использование имен параметров не обязательно. Однако они дают возможность компилятору при наличии ошибки указать имена, для которых обнаружено несоответствие типов, так что не поленитесь указать этих имен — это позволит сэкономить время впоследствии.
Описание слайда:
Прототип функции В современных, правильно написанных программах на языке С каждую функцию перед использованием необходимо объявлять. Обычно это делается с помощью прототипа функции. В первоначальном варианте языка С прототипов не было; но они были введены уже в Стандарт С89. Хотя прототипы формально не требуются, но их использование очень желательно. (Впрочем, в C++ прототипы обязательны!) Прототипы дают компилятору возможность тщательнее выполнять проверку типов, подобно тому, как это делается в таких языках как Pascal. Если используются прототипы, то компилятор может обнаружить любые сомнительные преобразования типов аргументов, необходимые при вызове функции, если тип ее параметров отличается от типов аргументов. При этом будут выданы предупреждения обо всех таких сомнительных преобразованиях. Компилятор также обнаружит различия в количестве аргументов, использованных при вызове функции, и в количестве параметров функции. В общем виде прототип функции должен выглядеть таким образом: тип имя_функции(тип имя_парам1, тип имя_парам2, ..., имя_парамN); Использование имен параметров не обязательно. Однако они дают возможность компилятору при наличии ошибки указать имена, для которых обнаружено несоответствие типов, так что не поленитесь указать этих имен — это позволит сэкономить время впоследствии.

Слайд 7





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

Слайд 8





Аргументы функции
Формальный параметр (аргумент) – переменная, объявленная в заголовке функции
Формальные параметры функции доступны внутри всей функции. Параметр создается в начале выполнения функции, и уничтожается при выходе из нее
Фактический параметр (аргумент) - это конкретное значение, которое присваивается переменной, называемой формальным аргументом. Фактический аргумент может быть константой, переменной или более сложным выражением. Независимо от типа фактического аргумента он вначале вычисляется, а затем его величина передается функции. 
 
/* Возвращает 1, если символ c входит в строку s и 0 в противном случае. */
int is_in(char *s,  char c) // определение функции
{
  while(*s)
    if(*s==c) return 1;
    else s++;
  return 0;
}
…
char str[]=function, ch=u;
int a;
a=is_in(str, ch); // вызов функции
Описание слайда:
Аргументы функции Формальный параметр (аргумент) – переменная, объявленная в заголовке функции Формальные параметры функции доступны внутри всей функции. Параметр создается в начале выполнения функции, и уничтожается при выходе из нее Фактический параметр (аргумент) - это конкретное значение, которое присваивается переменной, называемой формальным аргументом. Фактический аргумент может быть константой, переменной или более сложным выражением. Независимо от типа фактического аргумента он вначале вычисляется, а затем его величина передается функции.   /* Возвращает 1, если символ c входит в строку s и 0 в противном случае. */ int is_in(char *s, char c) // определение функции { while(*s) if(*s==c) return 1; else s++; return 0; } … char str[]=function, ch=u; int a; a=is_in(str, ch); // вызов функции

Слайд 9





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

Слайд 10





Передача параметров по значению
В языке С/С++ по умолчанию применяется передача параметров по значению. 
#include <stdio.h>
int sqr(int x); // прототип функции
int main(void)
{
  int t=10;
  printf("%d %d", sqr(t), t); // вызов функции
  return 0;
}
int sqr(int x) // определение функции
{
  x = x*x;
  return (x);
}
Описание слайда:
Передача параметров по значению В языке С/С++ по умолчанию применяется передача параметров по значению. #include <stdio.h> int sqr(int x); // прототип функции int main(void) { int t=10; printf("%d %d", sqr(t), t); // вызов функции return 0; } int sqr(int x) // определение функции { x = x*x; return (x); }

Слайд 11





Передача по ссылке
Если нужно передать параметры по ссылке, то формальные параметры объявляются как указатели
void swap(int*x, int *y);
int main(void)
{
	int i, j;
	i=10;
	j=20;
	swap(&i, &j); // передаются адреса переменных i, j
	return 0;
}
void swap(int *x, int *y)
{
	int temp;
	temp = *x; // сохраняем значение, записанное по адресу x
	*x = *y; // записываем значение, записанное по адресу y, в ячейку в адресом x
	*y =  temp; // записываем сохраненное значение
}
Результат работы программы: 
i и j перед обменом значениями: 10 20
i и j после обмена значениями: 20 10
Описание слайда:
Передача по ссылке Если нужно передать параметры по ссылке, то формальные параметры объявляются как указатели void swap(int*x, int *y); int main(void) { int i, j; i=10; j=20; swap(&i, &j); // передаются адреса переменных i, j return 0; } void swap(int *x, int *y) { int temp; temp = *x; // сохраняем значение, записанное по адресу x *x = *y; // записываем значение, записанное по адресу y, в ячейку в адресом x *y = temp; // записываем сохраненное значение } Результат работы программы: i и j перед обменом значениями: 10 20 i и j после обмена значениями: 20 10

Слайд 12





Передача массива в функции
В языке С/С++ весь массив нельзя передать в качестве аргумента функции. Можно передать указатель на массив, то есть имя массива без индексов.
Например,
 	int main(void)
	{
		int mass[12];
		read_mass(mass);
 	}
Описание слайда:
Передача массива в функции В языке С/С++ весь массив нельзя передать в качестве аргумента функции. Можно передать указатель на массив, то есть имя массива без индексов. Например, int main(void) { int mass[12]; read_mass(mass);   }

Слайд 13





Передача одномерного массива
Если аргументом функции является одномерный массив, то ее формальный параметр можно объявить тремя способами:
как указатель
как массив фиксированного размера
как массив неопределенного размера
Пример 1:
	void read_mass(int *p) // указатель
	{
		…
	}
Пример 2:
	void read_mass(int p[13]) //  массив фиксированного размера
	{
		…
	}
Пример 3:
	void read_mass(int p[]) // массив неопределенного размера
	{
		…
	}
Эти три объявления эквивалентны.
Описание слайда:
Передача одномерного массива Если аргументом функции является одномерный массив, то ее формальный параметр можно объявить тремя способами: как указатель как массив фиксированного размера как массив неопределенного размера Пример 1: void read_mass(int *p) // указатель { … } Пример 2: void read_mass(int p[13]) // массив фиксированного размера { … } Пример 3: void read_mass(int p[]) // массив неопределенного размера { … } Эти три объявления эквивалентны.

Слайд 14





Передача строк
#include <stdio.h>
#include <ctype.h>
void print_upper(char *string);
int main(void)
{
  char s[80];
  printf("Введите строку символов: ");
  gets(s);
  print_upper(s); 
  printf("\ns теперь на верхнем регистре: %s", s);
  return 0;
}
/* Печатать строку на верхнем регистре. */
void print_upper(char *string)
{
  register int t;
  for(t=0; string[t]; ++t)  {
    string[t] = toupper(string[t]);
    putchar(string[t]);
  }
}
Вот что будет выведено в случае фразы "This is a test.": 
Введите строку символов: This is a test.
THIS IS A TEST.
s теперь в верхнем регистре: THIS IS A TEST.
Эта программа не работает с символами кириллицы. 
После вызова print_upper() содержимое массива s в main() переводится в символы верхнего регистра
Описание слайда:
Передача строк #include <stdio.h> #include <ctype.h> void print_upper(char *string); int main(void) { char s[80]; printf("Введите строку символов: "); gets(s); print_upper(s); printf("\ns теперь на верхнем регистре: %s", s); return 0; } /* Печатать строку на верхнем регистре. */ void print_upper(char *string) { register int t; for(t=0; string[t]; ++t) { string[t] = toupper(string[t]); putchar(string[t]); } } Вот что будет выведено в случае фразы "This is a test.": Введите строку символов: This is a test. THIS IS A TEST. s теперь в верхнем регистре: THIS IS A TEST. Эта программа не работает с символами кириллицы. После вызова print_upper() содержимое массива s в main() переводится в символы верхнего регистра

Слайд 15





Вторая версия предыдущей программы: содержимое массива s остается постоянным
#include <stdio.h>
#include <ctype.h>
void print_upper(char *string);
int main(void)
{
  char s[80];
  printf("Введите строку символов: ");
  gets(s);
  print_upper(s);
  printf("\ns не изменялась: %s", s);
  return 0;
}
void print_upper(char *string)
{
  register int t;
  for(t=0; string[t]; ++t)
    putchar(toupper(string[t]));
}
Вот какой на этот раз получится фраза "This is a test.": 
Введите строку символов: This is a test.
THIS IS A TEST.
s не изменилась: This is a test.
Описание слайда:
Вторая версия предыдущей программы: содержимое массива s остается постоянным #include <stdio.h> #include <ctype.h> void print_upper(char *string); int main(void) { char s[80]; printf("Введите строку символов: "); gets(s); print_upper(s); printf("\ns не изменялась: %s", s); return 0; } void print_upper(char *string) { register int t; for(t=0; string[t]; ++t) putchar(toupper(string[t])); } Вот какой на этот раз получится фраза "This is a test.": Введите строку символов: This is a test. THIS IS A TEST. s не изменилась: This is a test.

Слайд 16





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

Слайд 17





Возврат из функции
Функция может завершать выполнение и осуществлять возврат в вызывающую программу двумя способами
первый способ используется тогда, когда после выполнения последнего оператора в функции встречается закрывающая фигурная скобка (}) 
для завершения выполнения используется оператор return — или потому, что необходимо вернуть значение, или чтобы сделать код функции проще и эффективнее.
#include <string.h>
#include <stdio.h>
void pr_reverse(char *s);
int main(void)
{
  pr_reverse("Мне нравится C");
  return 0;
}
void pr_reverse(char *s)
{
  register int t;
  for(t=strlen(s)-1; t>=0; t--) putchar(s[t]);
}
Описание слайда:
Возврат из функции Функция может завершать выполнение и осуществлять возврат в вызывающую программу двумя способами первый способ используется тогда, когда после выполнения последнего оператора в функции встречается закрывающая фигурная скобка (}) для завершения выполнения используется оператор return — или потому, что необходимо вернуть значение, или чтобы сделать код функции проще и эффективнее. #include <string.h> #include <stdio.h> void pr_reverse(char *s); int main(void) { pr_reverse("Мне нравится C"); return 0; } void pr_reverse(char *s) { register int t; for(t=strlen(s)-1; t>=0; t--) putchar(s[t]); }

Слайд 18





Количество операторов return
#include <stdio.h>
int find_substr(char *s1, char *s2);
int main(void)
{
  if(find_substr("C - это забавно", "is") != -1)
    printf("Подстрока найдена.");
  return 0;
}
/* Вернуть позицию первого, вхождения s2 в s1. */
int find_substr(char *s1, char *s2)
{
  register int t;
  char *p, *p2;
  for(t=0; s1[t]; t++) {
    p = &s1[t];
    p2 = s2;
    while(*p2 && *p2==*p) {
      p++;
      p2++;
    }
    if(!*p2) return t; /* 1-й оператор return */
  }
   return -1; /* 2-й оператор return */
}
Описание слайда:
Количество операторов return #include <stdio.h> int find_substr(char *s1, char *s2); int main(void) { if(find_substr("C - это забавно", "is") != -1) printf("Подстрока найдена."); return 0; } /* Вернуть позицию первого, вхождения s2 в s1. */ int find_substr(char *s1, char *s2) { register int t; char *p, *p2; for(t=0; s1[t]; t++) { p = &s1[t]; p2 = s2; while(*p2 && *p2==*p) { p++; p2++; } if(!*p2) return t; /* 1-й оператор return */ } return -1; /* 2-й оператор return */ }

Слайд 19





Категории пользовательских функций
Вычислительные функции – выполняют операции над своими аргументами и возвращают полученное в результате этих операций значение
Например, стандартные библиотечные функции sqrt() и sin(), которые вычисляют квадратный корень и синус своего аргумента соответственно. 
Функции, обрабатывающие информацию и возвращающие значение, которое показывает, успешно ли была выполнена эта обработка.
Например, библиотечная функция fclose(), которая закрывает файл. Если операция закрытия была завершена успешно, функция возвращает 0, а в случае ошибки она возвращает EOF. 
Функции, не имеющие явно возвращаемых значений. В сущности, такие функции являются чисто процедурными и никаких значений выдавать не должны. Все функции, которые не возвращают значение, должны объявляться как возвращающие значение типа void. Такие функции нельзя применять в выражениях
Например, функция exit(), которая прекращает выполнение программы.
Описание слайда:
Категории пользовательских функций Вычислительные функции – выполняют операции над своими аргументами и возвращают полученное в результате этих операций значение Например, стандартные библиотечные функции sqrt() и sin(), которые вычисляют квадратный корень и синус своего аргумента соответственно. Функции, обрабатывающие информацию и возвращающие значение, которое показывает, успешно ли была выполнена эта обработка. Например, библиотечная функция fclose(), которая закрывает файл. Если операция закрытия была завершена успешно, функция возвращает 0, а в случае ошибки она возвращает EOF. Функции, не имеющие явно возвращаемых значений. В сущности, такие функции являются чисто процедурными и никаких значений выдавать не должны. Все функции, которые не возвращают значение, должны объявляться как возвращающие значение типа void. Такие функции нельзя применять в выражениях Например, функция exit(), которая прекращает выполнение программы.

Слайд 20





Возвращаемые значения
Все функции, кроме тех, которые относятся к типу void, с помощью оператора return возвращают значение
В соответствии со стандартом С89, если функция, возвращающая значение, не использует для этого оператор return, то в вызывающий модуль возвращается «мусор»
В языке С++ (в стандарте С99) все функции, тип которой отличен от void, должны возвращать значение с помощью оператора return 
Если функция не объявлена как имеющая тип void, она может использоваться как операнд в выражении
Поэтому каждое из следующих выражений является правильным:
x = power(y);
if(max(x,y) > 100) printf("больше");
for(ch=getchar(); isdigit(ch); ) ... ;
Общепринятое правило гласит, что вызов функции не может находиться в левой части оператора присваивания. Выражение 
swap(x,y) = 100; /* неправильное выражение */
является неправильным. Если компилятор С в какой-либо программе найдет такое выражение, то пометит его как ошибочное и программу компилировать не будет
Описание слайда:
Возвращаемые значения Все функции, кроме тех, которые относятся к типу void, с помощью оператора return возвращают значение В соответствии со стандартом С89, если функция, возвращающая значение, не использует для этого оператор return, то в вызывающий модуль возвращается «мусор» В языке С++ (в стандарте С99) все функции, тип которой отличен от void, должны возвращать значение с помощью оператора return Если функция не объявлена как имеющая тип void, она может использоваться как операнд в выражении Поэтому каждое из следующих выражений является правильным: x = power(y); if(max(x,y) > 100) printf("больше"); for(ch=getchar(); isdigit(ch); ) ... ; Общепринятое правило гласит, что вызов функции не может находиться в левой части оператора присваивания. Выражение swap(x,y) = 100; /* неправильное выражение */ является неправильным. Если компилятор С в какой-либо программе найдет такое выражение, то пометит его как ошибочное и программу компилировать не будет

Слайд 21





Обязательно присваивать возвращенное значение какой-либо переменной? 
#include <stdio.h>
int mul(int a, int b);
int main(void)
{
  int x, y, z;
  x = 10;   y = 20;
  z = mul(x, y);           /* значение, возвращаемое функцией mul(), присваивается переменной z */
  printf("%d", mul(x,y));  /* возвращаемое значение не присваивается, но используется функцией printf() */
  mul(x, y);               /* возвращаемое значение теряется, потому что не присваивается никакой из переменных и не используется как часть какого-либо выражения */
  return 0;
}
int mul(int a, int b)
{
  return a*b;
}
Описание слайда:
Обязательно присваивать возвращенное значение какой-либо переменной? #include <stdio.h> int mul(int a, int b); int main(void) { int x, y, z; x = 10; y = 20; z = mul(x, y); /* значение, возвращаемое функцией mul(), присваивается переменной z */ printf("%d", mul(x,y)); /* возвращаемое значение не присваивается, но используется функцией printf() */ mul(x, y); /* возвращаемое значение теряется, потому что не присваивается никакой из переменных и не используется как часть какого-либо выражения */ return 0; } int mul(int a, int b) { return a*b; }

Слайд 22





Возврат указателей
#include <stdio.h>
char *match(char c, char *s);  /* прототип */
int main(void)
{
  char s[80], *p, ch;
  gets(s);
  ch = getchar();
  p = match(ch, s);
  if(*p)  /* символ найден */
    printf("%s ", p);
  else
    printf("Символа нет.");
  return 0;
} 
/* Возвращает указатель на первое вхождение c в s. */
char *match(char c, char *s)
{
  while(c!=*s && *s) s++;
  return(s);
}
Описание слайда:
Возврат указателей #include <stdio.h> char *match(char c, char *s); /* прототип */ int main(void) { char s[80], *p, ch; gets(s); ch = getchar(); p = match(ch, s); if(*p) /* символ найден */ printf("%s ", p); else printf("Символа нет."); return 0; } /* Возвращает указатель на первое вхождение c в s. */ char *match(char c, char *s) { while(c!=*s && *s) s++; return(s); }

Слайд 23





Функция типа void
Одним из применений ключевого слова void является явное объявление функций, которые не возвращают значений
#include <stdio.h>
void print_vertical(char *str);  /* прототип */
int main(int argc, char *argv[])
{
  if(argc > 1) print_vertical(argv[1]);
  return 0;
}
void print_vertical(char *str)
{
  while(*str)
    printf("%c\n", *str++);
}
И еще одно замечание: в ранних версиях С ключевое слово void не определялось. Таким образом, в программах, написанных на этих версиях С, функции, которые не возвращали значений, просто имели по умолчанию тип int — и это несмотря на то, что они не возвращали никаких значений!
Описание слайда:
Функция типа void Одним из применений ключевого слова void является явное объявление функций, которые не возвращают значений #include <stdio.h> void print_vertical(char *str); /* прототип */ int main(int argc, char *argv[]) { if(argc > 1) print_vertical(argv[1]); return 0; } void print_vertical(char *str) { while(*str) printf("%c\n", *str++); } И еще одно замечание: в ранних версиях С ключевое слово void не определялось. Таким образом, в программах, написанных на этих версиях С, функции, которые не возвращали значений, просто имели по умолчанию тип int — и это несмотря на то, что они не возвращали никаких значений!

Слайд 24





Что возвращает функция main()?
Функция main() возвращает целое число, которое принимает вызывающий процесс — обычно этим процессом является операционная система. Возврат значения из main() эквивалентен вызову функции exit() с тем же самым значением. Если main() нe возвращает значение явно, то вызывающий процесс получает формально неопределенное значение. На практике же большинство компиляторов С автоматически возвращают 0, но если встает вопрос переносимости, то на такой результат полагаться с уверенностью нельзя.
Описание слайда:
Что возвращает функция main()? Функция main() возвращает целое число, которое принимает вызывающий процесс — обычно этим процессом является операционная система. Возврат значения из main() эквивалентен вызову функции exit() с тем же самым значением. Если main() нe возвращает значение явно, то вызывающий процесс получает формально неопределенное значение. На практике же большинство компиляторов С автоматически возвращают 0, но если встает вопрос переносимости, то на такой результат полагаться с уверенностью нельзя.

Слайд 25





Рекурсия
В языке С функция может вызывать сама себя. В этом случае такая функция называется рекурсивной.
Рекурсия — это процесс определения чего-либо на основе самого себя, из-за чего рекурсию еще называют рекурсивным определением. 
Простым примером рекурсивной функции является factr(), которая вычисляет факториал целого неотрицательного числа. Факториалом числа n (обозначается n!) называется произведение всех целых чисел, от 1 до n включительно (для 0, по определению, факториал равен 1.). Например, 3! — это 1×2×3, или 6.
Здесь показаны factr() и эквивалентная ей функция, в которой используется итерация:
Описание слайда:
Рекурсия В языке С функция может вызывать сама себя. В этом случае такая функция называется рекурсивной. Рекурсия — это процесс определения чего-либо на основе самого себя, из-за чего рекурсию еще называют рекурсивным определением. Простым примером рекурсивной функции является factr(), которая вычисляет факториал целого неотрицательного числа. Факториалом числа n (обозначается n!) называется произведение всех целых чисел, от 1 до n включительно (для 0, по определению, факториал равен 1.). Например, 3! — это 1×2×3, или 6. Здесь показаны factr() и эквивалентная ей функция, в которой используется итерация:

Слайд 26





Что такое рекурсия
Описание слайда:
Что такое рекурсия

Слайд 27





Что такое рекурсия
Описание слайда:
Что такое рекурсия

Слайд 28





Примеры рекурсивного задания функций
f(0)=0
f(n)= f(n-1)+1 
f(0)=1
f(n)= n*f(n-1) 
f(0)=1
f(1)=1
f(n)= f(n-1)+ f(n-2), n>=2
f(0)=1
f(n)= f(n-1)+ f(n-2)+…+1 = f(i)+1 
f(0)=1
f(1)=2
f(n)= f(n-1)*f(n-2)
Описание слайда:
Примеры рекурсивного задания функций f(0)=0 f(n)= f(n-1)+1 f(0)=1 f(n)= n*f(n-1) f(0)=1 f(1)=1 f(n)= f(n-1)+ f(n-2), n>=2 f(0)=1 f(n)= f(n-1)+ f(n-2)+…+1 = f(i)+1 f(0)=1 f(1)=2 f(n)= f(n-1)*f(n-2)

Слайд 29





Механизм реализации рекурсии
Описание слайда:
Механизм реализации рекурсии

Слайд 30


Структурный элемент программы - функции, слайд №30
Описание слайда:

Слайд 31





Дерево рекурсии при вычислении факториала – F(5)
Описание слайда:
Дерево рекурсии при вычислении факториала – F(5)

Слайд 32





Работа рекурсивной функции
Пусть n=4
answer = factr(3)*4; return (answer) 
вызов функции		 возврат значения функции
	answer = factr(2)*3; return (answer) 
	вызов функции		       возврат значения функции
		answer = factr(1)*2; return (answer) 
		вызов функции		 возврат значения функции
				return (1)
Описание слайда:
Работа рекурсивной функции Пусть n=4 answer = factr(3)*4; return (answer) вызов функции возврат значения функции answer = factr(2)*3; return (answer) вызов функции возврат значения функции answer = factr(1)*2; return (answer) вызов функции возврат значения функции return (1)

Слайд 33





Фрагмент дерева рекурсии при вычислении чисел Фибоначчи – F(5)
Описание слайда:
Фрагмент дерева рекурсии при вычислении чисел Фибоначчи – F(5)

Слайд 34





Анализ трудоемкости рекурсивных реализаций алгоритмов
Связан как с количеством операций, выполняемых при одном вызове функции, так и с количеством таких вызовов
Более детальное рассмотрение приводит к необходимости учета затрат как на организацию вызова функции и передачи параметров, так и на возврат вычисленных значений и передачу управления в точку вызова
Механизм вызова функции или процедуры в языке высокого уровня существенно зависит от архитектуры компьютера и операционной системы. В рамках IBM PC совместимых компьютеров этот механизм реализован через программный стек. Как передаваемые в процедуру или функцию фактические параметры, так и возвращаемые из них значения помещаются в программный стек специальными командами процессора. Дополнительно сохраняются значения необходимых регистров и адрес возврата в вызывающую процедуру.
Описание слайда:
Анализ трудоемкости рекурсивных реализаций алгоритмов Связан как с количеством операций, выполняемых при одном вызове функции, так и с количеством таких вызовов Более детальное рассмотрение приводит к необходимости учета затрат как на организацию вызова функции и передачи параметров, так и на возврат вычисленных значений и передачу управления в точку вызова Механизм вызова функции или процедуры в языке высокого уровня существенно зависит от архитектуры компьютера и операционной системы. В рамках IBM PC совместимых компьютеров этот механизм реализован через программный стек. Как передаваемые в процедуру или функцию фактические параметры, так и возвращаемые из них значения помещаются в программный стек специальными командами процессора. Дополнительно сохраняются значения необходимых регистров и адрес возврата в вызывающую процедуру.

Слайд 35





Механизм вызова процедуры с использованием программного стека
Описание слайда:
Механизм вызова процедуры с использованием программного стека



Похожие презентации
Mypresentation.ru
Загрузить презентацию