Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Функции распознавания вида символаСодержание книги
Поиск на нашем сайте
Строго говоря, это не функции, а макроопределения, описанные в заголовочном файле <ctype.h>:
isalnum(c) истина если c буква или цифра; isalpha(c) истина если c буква; isdigit(c) истина если c цифра; iscntrl(c) истина если c символ удаления или обычный уп- равляющий символ; isprint(c) истина если c печатный символ; islower(c) истина если c буква нижнего регистра; isupper(c) истина если c буква верхнего регистра; ispunct(c) истина если c знак пунктуации; isspace(c) истина если c пробел, знак табуляции, возврат каретки, символ перевода строки, вертикальной табуляции, перевода страницы; isxdigit(c) истина если c шестнадцатеричная цифра; _toupper(c) преобразует c из диапазона [a-z] к символам [A-Z]; _tolower(c) преобразует c из диапазона [A-Z] к символам [a-z]; _toascii(c) преобразует c больший, чем 127 к диапазону 0-127 путем очистки всех битов, кроме 7 млад- ших. 13.4. Функции преобразования данных Прототипы функций преобразования данных находятся в файле <stdlib.h>. Преобразование строки символов в целое число:
int atoi(const char *s); long atol(const char *s);
Возвращает преобразованное значение входной строки. Если строка не может быть преобразована возвращает ноль.
Преобразование строки символов в вещественное число:
double atof(const char *s);
Возвращает преобразованное значение входной строки. Если строка не может быть преобразована возвращает ноль.
Преобразование строки символов в длинное целое число с указанием системы счисления:
long strtol(const char *s, char **endptr, int radix); unsigned long strtoul(const char *s, char **endptr, int radix);
Возвращает преобразованное значение входной строки. Если строка не может быть преобразована возвращает ноль. Указатель *endptr устанавливается на первый символ строки не отвечающий синтаксису целого числа языка СИ. Преобразование строки символов в вещественное число:
double strtod(const char *s, char **endptr);
Возвращает преобразованное значение входной строки. Если строка не может быть преобразована возвращает ноль. Указатель *endptr устанавливается на первый символ строки не отвечающий синтаксису вещественного числа языка СИ.
Преобразование целого числа в строку символов с указанием системы счисления:
char *ltoa(long value, char *string, int radix); char *itoa(int value, char *string, int radix); char *ultoa(unsigned long value, char *string, int radix);
Возвращает указатель на выходную строку. Преобразование вещественного числа в строку символов:
char *ectv(double value, int ndig, int *dec, int *sign); char *fctv(double value, int ndig, int *dec, int *sign);
Функции возвращают указатель на статический буфер памяти с выходной строкой, содержащей только цифры числа. Буфер обновляется при каждом вызове функции. Для функции ectv() ndig является числом цифр в выходной строке, для fctv() - числом цифр в выходной строке после десятичной точки. Параметр dec показывает положение десятичной точки в выходной строке, которая явно не присутствует. Параметр sign принимает отличное от нуля значение для отрицательных чисел. Преобразование вещественного числа в строку:
char *gctv(double value, int ndec, char *buf);
Функции возвращают указатель на буфер buf памяти с выходной строкой, содержащей готовое к печати символьное представление числа из ndec цифр в формате F Фортрана, если возможно. В противном случае число будет представлено в формате e функции printf(). Структуры языка C. Под структурой понимают совокупность данных разного типа, лежащих в непрерывной области памяти и объединенных общим именем. Отличие от массивов - элементы структуры разного типа. Необходимость: часто реальный объект характеризуется величинами разного типа. Пример: товар на складе название char name[21]; цена float price; количество int number; Все три переменных неразрывно связаны с каким-то товаром. Описание структуры Способ struct { char name[21]; float price; int number;} goods; Выделяется 27 байт для переменной goods; Способ struct _GOODS { char name[21]; float price; int number;}; Оператор не выделяет память, а устанавливает тип структуры. Для выделения памяти надо выдать оператор: struct _GOODS goods1, goods2; Выделяет память для goods1 и goods2, каждой по 27 байт. Можно смепшать два способа: struct _GOODS { char name[21]; float price; int number;} goods; Устанавливает тип структуры и выделяет память для goods. 3 способ. Используется оператор описания типа typedef: typedef double real;
обычное описание Если при описании имени стоит слово typedef, то описание не выделяет память, а создает новый тип данных - real, который можно применять также как и любое другое описание типа: real a, b; Еще пример: typedef char string[40];
новый тип string string a, b, c; - описание трех переменных, каждая из которых является массивом из 40 символов. В случае структуры имеем: typedef struct { char name[21]; float price; int number;} GOODS; Описание типа GOODS goods1, goods2; - выделение памяти для переменных goods1 и goods2. Трактовка имени структуры. Имя структуры обозначает значение всей области памяти, которую она занимает. Поэтому для структур одного и того же типа допускается операция присваивания:
goods2 = goods1; При этом вся область памяти goods1 копируется в область памяти goods2. Доступ к элементу структуры. Для этого используется операция ".". goods1.name - образовалось составное имя. Тип составного имени такой же как тип соответствующего элемента структуры. С составным именем можно выполнять любые действия, разрешенные для типа элемента. goods2.price = 20*goods1.price; scanf("%s", goods1.name); goods1.name[3]; Из структур можно составить массив: GOODS ab[50]; Тогда ab - адрес массива; ab[2] - значение структуры; ab[2].price - значение элемента структуры. Структура может входить в другую структуру: typedef struct { GOODS goods; int fl;} GF; GF a - описание; a.good.name Никаких ограничений на уровень вложенности структур нет. Инициализация структур. Статические структуры могут быть проинициализированы подобно массивам: static GOODS a = { "Телепвизор", 14000.0, 20}; Необходимо строго следитьза соответствием порядка констант порядку элементов структуры. Структуры и функции. Структура целиком может быть передана функции как параметр. Кроме того, структура может быть полностью возвращена как значение функции. Пример: typedef struct { double r, f;} POLAR; typedef struct { double x, y;} DECART; DECART ptod(POLAR pcoord) { DECART dcoord; dcoord.x = pcoord.r*cos(pcoord.f); dcoord.y = pcoord.r*sin(pcoord.f); return dcoord; } void main(void) { DECART a; POLAR b = { 15.2, 0.18}; a = ptod(b); . . . } Для больших структур такой способ передачи параметров и возврата значений неэффективен, так как компилятору приходится создавать копии параметров и результатов работы функции в специальной области памяти. Значиительно эффективнее передавать адреса параметров: void prot (DECART*dc, POLAR*pc) { (*dc).x = (*pc).r*cos((*pc).f); (*dc).y = (*pc).r*cos((*pc).f); } (*dc) в скобках потому, что "." имеет более высший приоритет. Головная программа при этом выглядит так:
void main(void) { DECART a; POLAR b = { 15.2, 0.18}; ptod(&a, &b); . . . } Запись вида (*dc).x громоздка и плохо понятна. Поэтому разработчики языка C предусмотрели более понятную эквивалентную запись: (*dc).x эквивалентно dc->x. Используя ее: void ptod(DECART *dc, POLAR *pc) { dc->x = pc->r*cos(pc->f); dc->y = pc->r*sin(pc->f); } Поля бит в структурах. Для целых чисел допускается использовать область памяти меньше байта: struct { int c1:4; -8<c1<7 int c2:12 -2 <c2<2 -1 } ab; ab.c1 будет преобразовано в целый тип, затем будет использоваться. На преобразование тратится время и память. Рекомендуется использовать для беззнаковых типов данных и в крайних случаях.
/* Пример использования структур */
#include <stdio.h> #include <string.h> #include <math.h>
typedef struct { char name[21]; int number; float price; } GOODS;
void in_goods (GOODS gs[], int *n); int in_goods1 (GOODS *g); void out_goods (GOODS gs[], int n); void sort_goods (GOODS gs[], int n);
void main(void) { int n; GOODS goods[100]; in_goods (goods, &n); sort_goods (goods, n); out_goods (goods, n); { float f=0; sin(f); } }
void in_goods(GOODS gs[], int *n) { printf("Введите характеристики товаров в виде:\n" \ "наименование количество цена\n" \ "-----окончание ввода \"end\"-------\n"); *n=0; while(in_goods1(&gs[*n])) (*n)++; }
int in_goods1(GOODS *g) { scanf("%s", g->name); if (strcmp(g->name, "end")==0) return 0; scanf("%d%f", &g->number, &g->price); return 1; }
void out_goods(GOODS gs[], int n) { int i; printf("*----------------------------------*\n"); printf("| Наименование | Кол-во | Цена |\n"); printf("|---------------|--------|--------|\n"); for(i=0; i<n; i++) printf("| %20s | %6d | %10.2f |\n", gs[i].name, gs[i].number, gs[i].price); printf("*-------------------------------*\n"); }
void sort_goods(GOODS gs[], int n) { int i, j, GOODS r; for (i=0; i<n-1; i++) for(j=i+1; j<n; j++) if(gs[i].price) { r=gs[j]; gs[j]=gs[i]; gs[i]=r; } }
Объединения. Объединяются ключевым словом union. Способы описания такие же, как и в случае структур, только вместо слова struct используется слово union. union {int a; long b;} pr; Для переменной pr выделяется память, достаточная для хранения самого длинного элемента объединения, т. е. в нашем примере - 4 байта. Если использовать pr.a, то выделенная память будет использоваться как int, в случае pr.b как long. Однако, участок памяти один и тот же. Поэтому одновременно существовать pr.a и pr.b не могут. Ответственность за некорректное использование памяти лежит на программисте. Объединения используются для экономии памяти: union {int bc[100]; double kk[20];} cc; На все отводится 200 байт.
int bc[100] 200 байт ______________________________ |----------------------------| double kk[20] (160 байт) Одновременно работать с массивом cc.bc и cc.kk нельзя. Объединения нельзя инициализировать.
|
||||
Последнее изменение этой страницы: 2016-04-08; просмотров: 383; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.242.39 (0.007 с.) |