Передача структурных переменных функциям .- 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Передача структурных переменных функциям .-



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

Main ()

{struct vect screen;

Struct point middle;

Struct point makepoint (int,int);

Screen.pt1=makepoint(0,0);

Screen.pt2=makepoint(xMax,yMax);

Middle=makepoint((screen.pt1.x+screen.pt2.x);screen.pt1.y+screen.pt2.y)/2);

}

Struct point makepoint (int x, int y)

{struct point tmp;

Tmp.x=x;

Tmp.y=y;

Return tmp;}

Struct point addpoint (struct point p1,struct point p2)

{p1.x+=p2.x;

P1.y+=p2.y;

Return p1;}

Как правило при передачи структурных переменных функции используется передача по адресу. Наличие скобок необходима из-за того, что приоритет оператора «.» выше приоритета оператора «*», а запись без () неверна.

 

 

Указатели на структурные переменные.

При работе с указателем на переменную со структурным типом используют операцию «->». Операторы доступа к компонентам структурных переменных вместе с операторами вызова функции и обращение к элементам массивов занимают самое высокое положение в таблице приоритетов и выполняются раньше других операторов.

Struct {int len;

Char str;

}*p;

++p->len

В этом примере на единицу увеличится значение компонента len, а не указателя *p.

Массивы структурных переменных.

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

Struct key

{chfr *word;

Int count;

}keytab[100];

For (i=0;I<=100;i++)

Massiv[i].count++

Struct key *p;

For (p=keytab;p<keytab+99;p++)

If (p->count>0)

Printf(“%d %s\n”,p->count,p->word);

Используя массивы структурных переменных средствами языка Си++ можно решать ряд задач обработки таблиц, то есть выполнять часть функций систем управления БД.

5 )Объединения (для экономии памяти)

Объединение – переменная, которая может в разные моменты времени содержать в себе объекты различных типов и размеров. Размер памяти таков, что хватило места под самый большой компонент объединения. Синтаксис доступа к компонентам объединения такой же, как и при работе со структурными.

Union {

Int klasha;

Float glasha;

Long double sasha;

}kreslo;

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

Поля битов. Средство typedef-

Поле битов – несколько переменных, хранящихся рядом внутри одного машинного слова. Синтаксис описания в поле битов и доступа к ним базируется на синтаксисе структурном.

Struct {unsigned int a:1;

Unsigned int b:1;

Unsigned int c:2;

}flags

Поля могут участвовать как обычные числа, но не могут быть массивами и не имеют адресов.

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

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

Например у нас имеется массив[100], указав тип double мы выделили память под каждый элемент этого массива, а используя typedef мы экономим память и выделяем тип как под одно целое.

typedef double DArray[100];

...

DArray A, B, C;

 

Понятие макроподстановки.

Понятие макроподстановки – имеет вид: #define_имя_заменяющий текст.

Макроподстановки используется для простейшей замены во всех местах, где встречается имя, вместо него будет помешен заменяющий текст. Имена в макроподстановке задаются по тем же правилам, что и имена переменных. Заменяющий текст может быть произвольным.

#define PI 3.14

Void main()

{printf (“%f\n”,PI);

}

Обычно заменяющий текст находится в строке, в которой расположено слово #define, но в длинных определениях его можно продолжить на следующих строчках, поставив в конце каждой продолжаемой строки «\»

#define matr for (i=1;i<=n;i++)\

For (j=1;j<=m;j++)

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

#define max(A,b) ((A>(B)?(A):(B))

Хотя обращение к max выглядит, как обычное к функции оно будет вызывать только текст значений каждый формальный параметр будет заменяться соответствующим аргументом. так строка x=max(a+b,c+d) будет заменена на строку x=((a+b)>(c+d)?(a+b):(c+d)).

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

#define vasia A

Void main ()

{int vasia;

#undef vasia

Vasia ()

}

Vasia (){….}

Включение файлов.

Директива #include предписывает компилятору поместить на ее место содержимое другого файла. Обычно эта директива применяется в так называемом включенном или заголовочном файле *.h. Однако существует возможность включить в текст программы любой другой исходный файл.

#include <имя файла> или #include “имя файла”. Если имя файла не является полным именем, то в первом случае поиск происходит только в пределах специфицированных каталогах включаемых файлов. При использовании кавычек сначала просматривается текущий каталог, а затем каталоги, включающих файлов.

 

Условная компиляция.

В Си существует возможность избирательно компилировать части файла в зависимости от значения некоторого константного выражения или идентификатора. Для этого существуют #if,#endif,#elif,#else.

#if (выражение 1)

Текст 1

#elif (выражение 2)

Текст 2

#else

Текст 3

#endif

Каждая из этих директив записывается на отдельной строке. Константные выражения в #if и последующий #elif вычисляются по порядку, пока не обнаружится выражение с ненулевым значением. Текст следуемый за строкой с ненулевым значением выбрасывается. Текст, расположенный за директивой с ненулевым значением обрабатывается обычным образом. Под словом текст имеется ввиду любая последовательность строк включая строки предпроцессора, которые не являются частью условия структуры. Если все выражения имеют ненулевые значения и есть строка #else, то следующий за ней текст обрабатывается.

#if SYSTEM==BCD

#include “bcd.h”

#elif SYSTEM==MSDOS

#include “msdos.h”

#else

#include “default.h”

#endif

 

 


10)Стандартные библиотеки <math.h> и <string.h>.


<math.h> (математические функции)

1)Синус

Double sin(double x)

A=sin(x)

2)Косинус

Double cos(double x)

3)Тангенс

Double tan(double x)

4)Арксинус

Double asin(double x)

5)Арккосинус

Double acos(double x)

6)Арктангенс

Double atan(double x)

7)

Double exp(double x)

8)Натуральный логарифм (x>0)

Double log(double x)

9)Десятичный логарифм

Double log10(double x)

10)Возведение в степень

Double pow(double x,double y)

11)

Double sqrt(double x)

12)Округление с избытком

Double ceil(double x)

13)Округление с недостатком

Double floor(double x)

14)Модуль для целых чисел |x|

Int abs(int x)

15)Модуль для вещественных чисел

Double fabs(double x)

16)Модуль для длинного целого

Long int labs(long int x)

 

<string.h>( функции обработки строк)

1)char *strcpy(char *s,const char *t)

Копирует строчку t в строчку s включая \0

2)char *strcat (char *s,const char *t)

Присоединяет строку t к строке s и возвращает s

3)char *strchr (const *s,int c)

Возвращает указатель на первое вхождение символа “c” в строку “s” или если такого нет, то возвращает NULL

4) char *strrchr(const char *s,int c)

Тоже самое, только на последний символ.

5)int strlen (const char *s)

Возвращает длину строки S, но без \0.

 


 

11) Стандартные библиотеки <ctype.h> и <stdlib.h>


<ctype.h> (функции проверки класса символов)

1)int isalpha (int c)

Возвращает не 0, то есть истину, если с-буква и 0 в противном случае.

2) int isupper (int c)


Возвращает не 0, если с-буква верхнего регистра и 0 в противном случае.

3) int islower (int c)

Возвращает не 0, если с-буква нижнего регистра и 0 в противном случае.

4) int isdigit (int c)

Возвращает не 0, если с-цифра и 0 в противном случае.

5) int isaalnum (int c)

Возвращает не 0, если с-буква или цифра и 0 в противном случае.

6) int isspace (int c)

Возвращает не 0, если с-пробел и 0 в противном случае.

7) int ispunct (int c)

Возвращает не 0, если с-печатаемый символ,кроме пробела, буквы или цифры.

8) int iscntrl (int c)

Возвращает не 0, если с-управляемый символ.

9) int tolower (int c)

Переводит с на нижний регистр, иначе не меняет.

10) int toupper (int c)

Переводит с на верхний регистр, иначе ничего не делает.

 

<stdlib.h>( функции общего назначения)

1)double afof(const char *s)

Переводит строку s в тип double. Рассматривает начальные символы до 1го не подходящего, а пробелы игнорирует. Пример – на входе ______3,78bsdfc на выходе будет 3,78

2)int afoi (const char *s)

Переводит строку s в тип int

3)long int afol(const char *s)

Переводит в long

4)int rand (coid)

Возвращает целое случайное число в диапазоне от 0 до max числа в данной реализации.



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 295; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.129.13.201 (0.024 с.)