- •1.Основные компоненты программного обеспечения и их связь с аппаратурой. Ретроспектива развития программирования.
- •2 Этапы решения задач на эвм
- •3 Основные типы данных и структуры данных в программировании
- •3.1.1 Арифметические типы
- •3.1.2 Логический тип
- •3.1.3 Символьный тип
- •4 Методы решения задач программирования
- •5 Разработка алгоритмов Пример 5.8
- •Пример 5.9
- •Пример 5.10
- •6 Кодирование алгоритмов на языке си
- •- Семантические;
- •Тело директивы
- •Имя аргумента
- •Оператор
- •6.4.1 Имена переменных Имена переменных могут состоять из букв (только из латинского алфавита), цифр и символа подчеркивания, приравненного к букве. Начинаться имя должно с буквы.
- •Пример 6.3:
- •6.4.2 Типы и размеры данных
- •6.4.3 Константы
- •Пример 6.4:
- •Пример 6.5:
- •Пример 6.6:
- •Пример 6.7:
- •Пример 6.8:
- •7 Декларации в си
- •8 Операторы в языке си
- •9 Управление в си
- •10 Указатели и массивы
- •Литерные указатели
- •11 Структуры в языке си
- •Структуры, вложенные друг в друга
- •Пример 11.10
- •12 Функции и структура программы
- •Аппарат формальних і фактичних аргументів Приклад 12.4
- •Опис прототипу функції
- •Приклад 12.5
- •13 Передача аргументов
Аппарат формальних і фактичних аргументів Приклад 12.4
Завдання. Знайти максимальний із трьох елементів.
#include<stdio.h>
int max_int (int a, int b)
{ return (a>b) ? a : b; /*для 2-х перемінних*/
}
main()
{ int x,y,z;
int m1,m2;
scanf(“%d,%d,%d”,&x,&y,&z);
/*максимум із x,y,z*/
m1=max_int(x, y);
m2=max_int(m1, z);
printf(“\nmax(%d,%d,%d)”,x,y,z;m2);
}
Ім'я функції |
Тип аргументу |
Імена аргументів |
main |
Фактичні |
x,y,m1,z |
Printf |
Фактичні |
“”(ФОРМАТНИЙ РЯДОК) x,y,z,m2 |
max_int |
Формальні Фактичні |
a,b x,y,m1,z |
Scanf |
Фактичні |
“”(ФОРМАТНИЙ РЯДОК) x,y,z |
Аргументи поділяють на трьох типу:
-вхідні;
-вихідні; що
-обновлюються.
Аргументи, що приходять у функцію, не змінюють своїх значень і використовуються для формування інших значень називаються вхідними.
Аргументи, що одержують свої значення і повертають їх із функції називаються вихідними.
Ті аргументи, що є одночасно вхідними і вихідними називаються що обновляються.
функція |
вхідні аргументи |
вихідні аргументи
|
max_int |
a,b |
------------------ |
scanf |
форматний рядок |
x,y,z |
Printf |
x,y,z,m2 форматний рядок |
------------------ |
Опис прототипу функції
Тому що в «СИ» усі функції незалежні друг від друга, те обов'язково у функції , що викликає , описувати прототипи що викликаються функцій.
Для опису синтаксису прототипу існує два засоби:
1.
<тип результату> <ім'я функції >( );
2. (повний)
<тип результату> <ім'я функції > <деклорація типів аргументів>( );
Приклад 12.5
Варіант 1 : int max_int(int, int);
Варіант 2 : int max_int();
Варіант 3 : int max_int( int a1, int a2)
Припускається використання будь-якого з варіантів.
13 Передача аргументов
13.1 Способы передачи аргументов
-по значению;
-по имени (по наименованию);
-по ссылке.
13.1.1 По значению.
Пример 13.1
#include<stdio.h>
int int max_int(int a, int b)
{return a>b ? a:b;}
main()
{ int max_int(int a, int b);
m1,l;
m1=max_int(5,9);
l=strlen("по значению");
В качестве фактических аргументов передаются либо изображения констант, либо выражения.
Этот способ используется для передачи входных аргументов.
Формальный |
Фактический |
имя скалярной переменной |
Изображение константного выражения |
-имя массива символов -имя литерного указателя |
|
13.1.2 Передача аргументов по имени
Пример 13.2
int max_int(int a, int b)
{return a>b ? a:b;}
main()
{ int max_int(int a, int b);
int a,b,m1;
int x[]={-1,10,-200,-9};
int m2,l1,l2,l3;
char s[]="пл наименованию";
char *ms[]={"Белеет","парус"};
int *px;
char *pms;
int i;
scanf("%d",&a);
/*значение а вводит пользователь*/
b=25;
m1=max_int(a,b);
/*max_int вызывается и ей передаётся значение*/
px=x;
for(i=0;i<3;i++)
{m2=max_int(*px++,x[i+1]);
printf("m2=%d",m2);
}
l1=strlen(s);
pms=ms;
for(i=0;i<2;i++)
{l2=strlen(ms[i]);
l3=strlen(*pms++);
printf("l2=%d l3=%d",l2,l3);
}
}
Этот способ используется только(!!!) для передачи входных аргументов.
Формальный |
Фактический |
-имя скалярной переменной; |
-имя скалярной переменной; -имя элемента массива; -указатель на элемент массива; |
-имя структуры; |
-имя структуры; -имя элемента массива структур; -указатель на элемент массива структур; |
-имя массива; |
-имя массива; |
Строки: -имя массива символов; -имя литерного указателя; |
-имя массива символов; -имя литерного указателя; -имя элемента массива символов; -имя элемента массива литерных указателей; |
13.1.3 Передача аргумента по ссылке
Пример 13.3
/*так нельзя!!!!!!!!!!*/
void obmen(int a,int b)
{ int r;
r=a;
a=b;
b=r;
}
Пример 13.4
/*нужно только так!!!!*/
…………
void obmen(int *a,int *b)
{ int r;
r=*a;
*a=b;
*b=r;
}
main()
{
int x,y;
void obmen(int *,int *);
scanf("%d %d",&x,&y);
printf("x=%d y=%d",x,y);
obmen(&x,&y);
printf("x=%d y=%d",x,y);
}
Формальный |
Фактический |
-имя указателя на скалярную переменную; |
-адрес скалярной переменной; -адрес элемента массива; |
-имя массива; |
-имя массива; |
-имя указателя на структуру; |
-адрес структуры; |
Этот способ используется для передачи выходных и обновляемых аргументов.
!!! Количество, типы и порядок следования формальных и фактических аргументов должны совпадать.
13.2 Особенности передачи аргументов функций в языке С
Все аргументы передаются по значению: вызываемой функции-копии.
!!! Вызываемая функция не может непосредственно изменить переданные ей параметры.
Пример 13.5
/*возведение x в степень n*/
/*вариант 1*/
int power 1(int x, int n)
{
int i, p;
p=1;
for(i=0; i<=n; i++)
p=p*x;
return p;
}
Пример 13.6
/*вариант 2*/
int power 2(int x, int n)
{
int p;
for(p=1; n>0; --n)
p=p*x;
return p;
}
Чтобы функция могла изменить переменную в вызывающей функции, формальный параметр должен быть передан по ссылке,
а фактический по адресу.
Механизм передачи аргументом массива иной: элементы массива не копируются, так как аргументами передаётся адрес массива.
13.3 Особые случаи передачи аргументов.
13.3.1 Передача аргументом одномерного массива
формальный |
тело |
массив переменных, граница опущена |
переменные с индексом |
указатель на переменную |
указатели |
13.3.2Передача аргументом многомерного массива
Замечание.При передаче многомерного массива обязательна передача количества элементов по первому измерению, остальные можно опустить.
Пример.
main()
{double xyz[10][15][7];
f(double[][15][7]);
...
}
f(double a[][15][7])
{...}
Для двумерного массива обязательно объявление количества столбцов,
а строк- необязательно.
Пример.
f1(int mpr[2][9]) {...};
f2(int mpr[][9]) {...};
f3(int(*pmpr)[9]) {...};
13.3.3 ПЕРЕДАЧА АРГУМЕНТОВ СТРУКТУРЫ
В общем случае над структурами допустимы следующие операции:
-копирование ~передача аргументов
-присваивание ~возврат функции как -взятие адреса результата
-доступ к ее членам
-инициализация
Существует 3 подхода к передаче структур в функцию и возврата из нее:
-передача ее членов по отдельности
-как единого целого
-указателя на структуру
Обьекты типа:
“точка” “прямоугольник”
struct point struct rect
{ int x; { struct point1;
int y; struct point2;
} }
Пример 13.9
/*Формирование точки по ее компонентам X и Y*/
struct point makepoint (int x, int y)
{ struct point temp;
temp.x=x;
temp.y=y;
return temp;
}
(0;0) 640
350
Обьекты “экран” и “середина экрана”
Пример 13.10
#define MAXX 639
#define MAXY 349
#define MINX 0
#define MINY 0
...
struct rest screen;
struct point middle;
struct point makepoint(int,int);
screen.pt1=makepoint(MINX,MINY);
screen.pt2=makepoint(MAXX,MAXY);
middle=makepoint ((screen.pt1.x+screen.pt2.x)/2
screen.pt1.y+screen.pt2.y)/2);
Пример 13 11
/*Сложение двух точек*/
struct point addp(struct point pl, struct point p2)
/*функция возвращает результатом структуру и получает аргументами структуру*/
{ pl.x+=p2.x;
pl.y+=p2.y;
return pl;
}
Пример13.13
struct point * ps;
struct point t;
struct point makepoint(int, int);
t=makpoint(15, 25);
ps=&t;
/* *ps - структура t
(*ps).x - =15
(*ps).y - =25 */
printf (“ Это t: (%d, %d)”, (*ps). x, (*ps).y);
!!! prio(.)>prio(*)
Оператор
Синтаксис
< указатель на структуру >
< имя члена структуры >
Семантика
Если p -указатель на структуру, то
p<член структуры> есть ее член.
Бинарный, левоассоциотивный оператор, имею- щий высший приоритет.
Для 13.13
printf (“Это t: (%d,%d)”,psx, psy);
Пример 13.14
struct rect2, *pr;
pr=&r;
/* Эквивалентно */
1) r.pt1.x
2) prpt1.x
3) (r.pt1).x
4) (prpt1).x
Пример 13.15
/* Передается аргументом по ссылке */
main()
{
struct point p;
struct makepoint (int, int);
void put(struct point * );
p=makepoint(10, 12);
put (&p);
}
void put (struct point *p) ;
{
printf (“х=%d, y=%d”, *px, *py);
}
Пример 13.16
/* Учет приоритета оператора*/
struct
{
int len;
char *str;
}*p;
++plen; /* len++, а не p++*/
++(plen);
(++p)len; /* 1) ++p; 2) len* */
(p++)len; /* 1) len; 2) p++*/
p++len;
*pstr; /* то, на что ссылается str */
*(pstr);
*pstr++; /*1)то, на что ссылается str; 2)str++*/
(*pstr)++; /* то, на что ссылается str и его ++*/
*p++str; /* 1)на что ссылается str; 2) p++*/
СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ
Берри Р., Миккинз Б. Язык Си: Введение для программистов. - М.: Финансы и статистика, 1988. - 191с.
Болски М.И. Язык программирования Си: Справочник. - М.: Радио и связь, 1988. - 96с.
Джехани Н. Программирование на языке Си. - М.: Радио и связь.- 270с.
Инструментальная мобильная операционная система ИНМОС/ М.И.Беляев и др - М.: Финансы и статистика, 1985. - 231с.
Керниган Б., Ритчи Д. Язык программирования Си. - М.: Финансы и статистика, 1990. - 230с.
Керниган Б., Ритчи Д., Фьюэр А. Язык программирования Си. Задачи по языку Си. - М.: Финансы и статистика, 1985. - 279с.
Подбельский В.В., Фомин С.С. Программирование на языке Си. - Финансы и статистика, 1998. - 234 с.
Погорелый С.Д., Слободянюк Т.Ф. Программное обеспечение микропроцессорных систем: Справочник. - Киев: Технiка, 1989. - 301с
Сван Т. Освоение Borland C++ 4.5. Практический курс. - К.: Диалектика, 1996. - 320c.
Сван Т. Освоение Borland C++ 4.5. Энциклопедия функций. - К.: Диалектика, 1996. - 320c.
Хэнкок Л., Кригер М. Введение в программирование на языке Си. - М.: Радио и связь, 1986. - 192с.
Уинер Р. Язык Турбо Си. - М.: Мир, 1991. - 384с.
Уэйт М., Прата С., Мартин Д. Язык Си: Руководство для начинающих. - М.: Мир, 1984. - 512с.
Хэзвилд Р., Кирби Л. и др. Искусство программирования на С. Фундаментальные алгоритмы, структуры данных и примеры приложений. – К.: ДиаСофт, 2001. – 736с.
Если в методе требуются вспомогательные переменные, их описывают после метода в том же синтаксисе, что и исходные данные.