Скачать презентацию Функции в языке Си Лектор Махметова А М Скачать презентацию Функции в языке Си Лектор Махметова А М

Лекция-СИ_6_рус.ppt

  • Количество слайдов: 37

Функции в языке Си Лектор Махметова А. М. Функции в языке Си Лектор Махметова А. М.

Вопросы: • Указатели • Функции пользователя • Атрибуты переменных Вопросы: • Указатели • Функции пользователя • Атрибуты переменных

Указатель – это переменная, которая может содержать адрес некоторого объекта в памяти компьютера, например Указатель – это переменная, которая может содержать адрес некоторого объекта в памяти компьютера, например адрес другой переменной. Через указатель, установленный на переменную можно обращаться к участку оперативной памяти, отведенной компилятором под ее значения.

Указатель объявляется следующим образом: тип *идентификатор; Пример: int *xptr, x; float *yptr, *sptr; Указатель объявляется следующим образом: тип *идентификатор; Пример: int *xptr, x; float *yptr, *sptr;

С указателями связаны две унарные операции: & и *. Операция & означает «взять адрес» С указателями связаны две унарные операции: & и *. Операция & означает «взять адрес» операнда (т. е. установить указатель на операнд). Данная операция допустима только над переменными.

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

Пример 1: int x, /* переменная типа int */ *y; /* указатель на элемент Пример 1: int x, /* переменная типа int */ *y; /* указатель на элемент данных типа int */ y=&x; *y=1; /* y - адрес переменной x */ /* косвенная адресация указателем поля x /* “по указанному адресу записать 1”, т. е. x=1; */

Пример 2: int i, j=8, k=5, *y; y=&i; *y=2; /* i=2 */ y=&j; /* Пример 2: int i, j=8, k=5, *y; y=&i; *y=2; /* i=2 */ y=&j; /* переустановили указатель на переменную j */ *y+=i; /* j+=i , т. е. j=j+i → j=j+2=10 */ y=&k; /*переустановили указатель на переменную k */ k+=*y; /* k+=k, k=k+k = 10 */ (*y)++; /* k++, k=k+1 = 10+1 = 11 */

//operasi & * #include <stdio. h> void main() { int a; int *a. Ptr; //operasi & * #include void main() { int a; int *a. Ptr; a=7; a. Ptr=&a; printf("adress a=%p n a. Ptr=%p", &a, a. Ptr); printf(" nn a=%d n a. Ptr=%d", a, *a. Ptr); printf("nn &*a. Ptr=%p”, &*a. Ptr); printf(“n *&a. Ptr=%p", *&a. Ptr); }

ФУНКЦИЯ Функция - это самостоятельная единица программы, спроектированная для реализации конкретной задачи. Вызов функций ФУНКЦИЯ Функция - это самостоятельная единица программы, спроектированная для реализации конкретной задачи. Вызов функций приводит к выполнению некоторых действий. Например, при обращении к функции printf() осуществляется вывод данных на экран.

Предварительно функцию необходимо объявить. Объявление функции пользователя возможна в двух формах: -в форме описания; Предварительно функцию необходимо объявить. Объявление функции пользователя возможна в двух формах: -в форме описания; - в форме определения (реализации).

Описание функции – декларация ее прототипа вначале программного файла. Используется следующий способ декларации функций: Описание функции – декларация ее прототипа вначале программного файла. Используется следующий способ декларации функций: <тип_результата> <имя_функции>(<тип> <переменная>, …<тип> <переменная>);

Полное определение функции имеет следующий вид: <тип_результата> <имя_функции>(список параметров) { код функции } Полное определение функции имеет следующий вид: <тип_результата> <имя_функции>(список параметров) { код функции }

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

// вычислить квадраты чисел от 1 до 10 #include <stdio. h> #include <conio. h> // вычислить квадраты чисел от 1 до 10 #include #include int square (int); void main(){ int x; clrscr(); printf("n"); for (x=1; x<=10; x++) printf("%d ", square(x)); } int square(int y) { return y*y; }

// Определить наибольшее из трех чисел #include <stdio. h> #include <conio. h> int maximum // Определить наибольшее из трех чисел #include #include int maximum (int, int); void main(){ int a, b, c; clrscr(); printf("n vvedite tri sifra: n"); scanf("%d%d%d", &a, &b, &c); printf("maximum=%dn", maximum(a, b, c)); getch(); }

int maximum(int x, int y, int z) { int max=x; if (y>max) max=y; if int maximum(int x, int y, int z) { int max=x; if (y>max) max=y; if (z>max) max=z; return max; }

#include <stdio. h> #include <conio. h> long factorial (long); void main(){ int i; clrscr(); #include #include long factorial (long); void main(){ int i; clrscr(); for (i=1; i<=10; i++) printf("%2 d!=%ldn", i, factorial(i)); getch(); } long factorial(long n) { if (n<=0) return 1; else return (n*factorial(n-1)); }

#include <stdio. h> void cub(int *); void main() { int namber=5; printf ( #include void cub(int *); void main() { int namber=5; printf (" original namber %d", namber); cub(&namber); printf ("n value namber is %d", namber); } void cub(int *n. Ptr) {*n. Ptr=*n. Ptr* *n. Ptr; }

Атрибуты переменных Имя переменной; Тип переменной; Значение переменной; Класс памяти; Время хранения; Область действия. Атрибуты переменных Имя переменной; Тип переменной; Значение переменной; Класс памяти; Время хранения; Область действия.

Классы памяти языка Си дают возможность определить, с какими функциями связаны какие переменные, и Классы памяти языка Си дают возможность определить, с какими функциями связаны какие переменные, и как долго переменная сохраняется в программе. Имеются 4 вида классов памяти: auto - автоматический - локальные идентификаторы, память для которых выделяется при входе в блок, т. е. составной оператор, и освобождается при выходе из блока.

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

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

register - регистровый - идентификаторы, подобные идентификаторам типа auto. Их значения, если это возможно, register - регистровый - идентификаторы, подобные идентификаторам типа auto. Их значения, если это возможно, должны помещаться в регистрах машины для обеспечения быстрого доступа к данным. Если класс памяти идентификатора не указан явно, то его класс памяти задается положением его определения в тексте программы. Если идентификатор определяется внутри функции, тогда его класс памяти auto, в остальных случаях идентификатор имеет класс памяти extern.

Область действия переменных Область действия переменной – это правила, которые устанавливают, какие данные доступны Область действия переменных Область действия переменной – это правила, которые устанавливают, какие данные доступны из текущего места программы. Имеются три типа переменных: • Глобальный; • Локальный; • Формальный.

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

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

Время хранения переменных Спецификаторы класса памяти по времени хранения делятся на два типа: Автоматическое Время хранения переменных Спецификаторы класса памяти по времени хранения делятся на два типа: Автоматическое время хранения; Статическое время хранения.

Для описания переменных с автоматическим временем хранения используются спецификаторы auto и extern. Это формальные Для описания переменных с автоматическим временем хранения используются спецификаторы auto и extern. Это формальные и локальные переменные. Для описания переменных со статистическим временем хранения используются спецификаторы static и register. Это локальные и глобальные переменные.

#include <stdio. h> void f 1(void); void f 2(void); void f 3(void); int a=2; #include void f 1(void); void f 2(void); void f 3(void); int a=2; int main() int a=5; { printf (" local a=%dn", a); { int a=15; a=%dn", a); } printf (" bloc printf (" local a=%dn", a); f 1(); f 2(); f 3(); printf (" local a=%dn", a); return(); }

void f 1(void) { int a=25; printf ( void f 1(void) { int a=25; printf ("n a=%dn", a); a++; ("n a=%dn", a); } printf void f 2(void) { static int a=75; printf ("n static a=%dn", a); a++; printf ("n static a=%dn", a); } void f 3(void) { printf ("n global a=%dn", a); a*=10; printf ("n global a=%dn", a); }

# include <stdio. h> # include <math. h> # include <conio. h> float func # include # include # include float func (float x, float y, float z) { float f, p; p=(x+y+z)/2; f=sqrt(p*(p-x)*(p-y)*(p-z)); //printf("nf=%f", f); return(f); } main () { float a, b, c, d, pl; clrscr (); scanf ("%f%f", &a, &b, &c, &d); pl=func(a, 1, 2)+ func(b, 2, 2. 5)+func(2. 5, c, d); printf ("n p 1=%f", pl); return 0; }

#include <stdio. h> #include <conio. h> #include <time. h> #include <stdlib. h> #define n #include #include #include #include #define n 3 #define b 4 int a[n][b], j; sum(int k) { int s=0; for(j=0; j

main() { int i, j; randomize(); for(i=0; i<n; i++) { for(j=0; j<b; j++) { main() { int i, j; randomize(); for(i=0; i

#include<stdio. h> #include<conio. h> int i; star(int k) { clrscr(); for(i=0; i<k; i++) putch('*'); #include #include int i; star(int k) { clrscr(); for(i=0; i