![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 394; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.14.144.75 (0.007 с.) |