Читайте также:
|
|
Эти стандартные библиотечные функции и макросы составляют мощный набор средств преобразования данных, управления памятью и других, весьма разнообразных, действий. Наиболее часто встречаемые макросы и функции перечислены в таблице. Их объявления находятся в stdlib.h.
Макрос или функция | Выполняемое действие |
_exit() | Завершение программы |
_lrotl() | Циклический сдвиг беззнакового длинного целого влево |
_lrotr() | Циклический сдвиг беззнакового длинного целого вправо |
_rotl() | Циклический сдвиг беззнакового целого вправо |
_rotr() | Циклический сдвиг беззнакового целого влево |
abort() | Аварийное (ненормальное) завершение программы |
abs() | Модуль (абсолютное значение) целого числа |
atexit() | Регистрация функции, вызываемой при завершении программы |
atof() | Преобразование строки в число с плавающей точкой |
atoi() | Преобразование строки в целое |
atol() | Преобразование строки в длинное целое |
bsearch() | Бинарный поиск по массиву |
calloc() | Отведение памяти |
Преобразование данных
Первая важная группа функций, объявленных в stdlib.h, содержит функции преобразования. Основная задача этих функций — преобразование данных одного типа в данные другого типа. Например, функция atol() преобразует строку в длинное целое. Синтаксис этих функций задается следующими прототипами:
double atof(const char *s)
int atoi(const char *s)
long atol(const char *s)
char *ecvt(double value, int n, int * dec, int *sign)
char *fcvt (double value, int n, int * dec, int *sign)
Для всех этих функции *s является указателем на строку, value содержит преобразуемое значение, п указывает количество знаков в строке, в dec находится позиция десятичной точки относительно начала строки, sign содержит знак числа, *buf указывает на буфер символов, radix устанавливает основание системы счисления для преобразования, a endptr обычно равен нулю. Если же endptr содержит ненулевой адрес, то функция разместит по этому адресу символ, на котором закончился анализ строки.
Преобразование числа с плавающей точкой в строку
Функция fcvt() преобразует число с плавающей точкой в строку. Она также дает возможность получить информацию о знаке числа и о положении десятичной точки.
Преобразование строки в длинное целое
Функция strtol() преобразует заданную строку в число, пользуясь указанным основанием системы счисления. В следующем примере строка из двоичных цифр будет преобразована в целое число.
#include "stdafx.h"
#include <stdio.h>
#include <strstream>
#include <iostream>
using namespace std;
//#include <stdio.h>
//#include <stdlib.h>
main()
{ char *s="101101", *endptr; long long_number; long_number=strtol(s,&endptr,2);
// Двоичное число... равно десятичному...
printf("The binary value %s is equal to %ld decimal\n",s,long_number); return(0);}
38. Важнейшие библиотеки С и C++. Сортировка и поиск. Использование qsort()для сортировки целых чисел. Поиск целого числа в массиве.
Сортировка и поиск
Функция bsearch() используется для бинарного поиска в массиве. Функция qsort() производит быструю сортировку. Функция lfind() осуществляет линейный поиск по ключу в массиве последовательных записей, a lsearch() — линейный поиск в отсортированной или не отсортированной таблице.
void *bsearch(const void * key, const void *base,
size_t nelem, size_t width, int(*fcmp)(const void *,
const void *))
void qsort(void *base, size_t nelem, size_t width,
int(*fcmp)(const void *, const void *))
void *lfind(const void *key, const void *base,
size_t *num,size_t width, int(*fcmp)
(const void *, const void *))
void *lsearch(const void *key, const void *base,
size_t *num, size_t width, int(*fcmp)
(const void *, const void *))
Здесь key обозначает ключ поиска, *base — указатель на массив, в котором следует искать, nelem содержит количество элементов массива, a width — размер элемента в байтах. *fcmp — указатель на функцию, используемую для сравнения. В пит помещается количество элементов таблицы.
Использование qsort()для сортировки целых чисел
В Visual C++ есть функция qsort() для сортировки данных.
#include "stdafx.h"
#include <stdio.h>
#include <strstream>
#include <iostream>
using namespace std;
int int_comp(const void *i,const void *j);
int list[12]={95,53,71,86,11,28,34,53,10,11,74,-44};
main()
{ int i; qsort(list,12,sizeof(int),int_comp);
// Массив после сортировки
printf("The array after qsort:\n");
for(i=0;i<12;i++)
printf("%d ",list[i]);
printf("\n");
return (0);}
int int_comp(const void *i, const void *j)
{ return ((*(int *)i) - (*(int *)j));
}
Изначально массив list содержит целые числа со знаком. Функция qsort() упорядочивает их в том же массиве в порядке возрастания. В результате исходные числа оказываются отсортированными по возрастанию
39. Важнейшие библиотеки С и C++. Дополнительные функции. Использование генератора случайных чисел. Циклические сдвиги данных
Есть несколько функций, приведенных в таблице, которые выполняют разнообразные действия. Сюда входят вычисление абсолютной величины и циклические сдвиги. Функции циклического сдвига позволяют производить операции, которые до сих пор были доступны лишь программистам на ассемблере.
Функция | Выполняемое действие |
Завершение программы: | |
void abort(void) | Аварийно завершить программу с кодом возврата 3 |
int atexit(atexit_t func) | Выполнить функцию func перед завершением |
void exit(int status) | Завершить программу с кодом status |
void _exit(int status) | Немедленно завершить программу |
Математические | |
int abs(int x) | Вычислить абсолютную величину х |
int rand(void) | Выдать следующее случайное число |
void srand(unsigned seed) | Инициализировать чисел генератор случайных |
Циклический сдвиг | |
unsigned _rotl(unsigned val, int count) | Циклический сдвиг целого val влево |
unsigned _rotr(unsigned val, int count) | Циклический сдвиг целого val вправо |
Разное: | |
char *getenv(const char *name) | Прочитать переменную окружения |
int putenv(const char *name) | Записать значение переменной окружения |
void _swap(char *from, char *to, int nbytes) | Поменять местами заданное количество символов |
В Visual C++ есть функция генерации случайного числа. Генератор случайных чисел может быть инициализирован функцией srand(). Функция инициализации принимает в качестве параметра целое число и инициализирует генератор случайных чисел.
#include <stdio.h>
using namespace std;
main()
{
int x;
srand(3);
for(x=0; x <8; x++)
printf("Trial #%d, random number=%d\n", x, rand());
return (0);
}
Генераторы случайных чисел важны для задач статистической обработки и программ, которые основаны на использовании случайных последовательностей. Важно, чтобы выдаваемые генератором числа были распределены равномерно, то есть чтобы вероятность появления числа была одной и той же для всех чисел.
С и C++ предоставляют средства поразрядного циклического сдвига целых и длинных целых чисел вправо и влево.
#include <stdio.h>
using namespace std;
main()
{
unsigned int val=0x2345;
printf("rotate bits of %X to the left 2 bits and get %X\n", val, _rotl(val, 2));
printf("rotate bits of %X to the right 2 bits and get %X\n", val, _rotr(val, 2));
return (0);
}
Использование функций циклического сдвига, а также логических операций И, ИЛИ и исключающее ИЛИ позволяет на С и C++ манипулировать отдельными битами данных.
Символьные функции (ctype.h). Проверка, является ли символ цифрой, буквой или символом ASCII. Проверка на управляющий символ, разделительный символ (пробел, табуляция, перевод строки) и знак препинания. Преобразования в код ASCII, к верхнему и нижнему регистрам.
6.1. Символьные функции (ctype.h)
Символы (литеры) для большинства языков определяются как однобайтовые значения. В некоторых языках, например, китайском, требуются два байта. Макросы и функции для работы с символами, объявленные в ctype.h, принимают аргумент типа целое, но используют только младший его байт. Благодаря автоматическому приведению типов обычно можно передавать этим функциям и параметры символьного типа. Макросы и функции перечислены в таблице. Они позволяют проверять различные условия, а также приводить символы от верхнего регистра к нижнему и наоборот.
isalpha() | Проверка, является ли аргумент буквой |
isascii() | Проверка, является ли аргумент символом из набора ASCII |
isdigit() | Проверка, является ли аргумент десятичной цифрой (от 0 до 9) |
isgraph() | Проверка, является ли аргумент отображаемым символом (не пробелом) |
islower() | Проверка, является ли аргумент строчной буквой |
isprint() | Проверка, является ли аргумент отображаемым символом |
isupper() | Проверка, является ли аргумент заглавной буквой |
isxdigit() | Проверка, является ли аргумент шестнадцатеричной цифрой |
toascii() | Преобразование аргумента в эквивалентный символ ASCII |
tolower() | Преобразование от верхнего регистра к нижнему |
toupper() | Преобразование от нижнего регистра к верхнему |
6.1.1. Проверка, является ли символ цифрой, буквой или символом ASCII
Следующие три макроса позволяют осуществить эти проверки, пользуясь внутренней таблицей символов.
Макрос | Проверка |
int isalnum(ch) | Буквы A-Z, a-z или цифры 0-9. ch целое |
int isalpha(ch) | Буквы A-Z, a-z. ch целое |
int isascii(ch) | Символы ASCII с кодами 0-127 (0-7Fh). ch целое |
6.1.1. Проверка на управляющий символ, разделительный символ (пробел, табуляция, перевод строки) и знак препинания
Следующие процедуры реализованы и в виде макросов, и в виде функций:
Процедура | Проверка |
int iscntrl(ch) | Управляющий символ |
int isdigit(ch) | Цифра от 0 до 9 |
int isgraph(ch) | Отображаемый символ (не пробел) |
int islower(ch) | Строчная буква a-z |
int isprint(ch) | Отображаемый символ |
int ispunct(ch) | Знак препинания |
int isspace(ch) | Разделительный символ (пробел, табуляция, перевод строки) |
int isupper(ch) | Заглавная буква A-Z |
int isxdigit(ch) | Шестнадцатеричная цифра 0-9, a-f или A-F |
Эти процедуры позволяют проверять целый аргумент ch при помощи внутренней таблицы. Если аргумент удовлетворяет условию, возвращается ненулевое значение (TRUE), если нет — ноль (FALSE). Предполагается, что аргумент входит в стандартный набор символов ASCII.
6.1.1. Преобразования в код ASCII, к верхнему и нижнему регистрам
Следующие макросы и функции позволяют преобразовывать целочисленные коды ASCII:
Макрос | Преобразование |
int toascii(ch) | В символ ASCII |
int tolower(ch) | В символ верхнего регистра, если это символ нижнего регистра |
int _tolower(ch) | В символ верхнего регистра |
int toupper(ch) | В символ нижнего регистра, если это символ верхнего регистра |
int _toupper(ch) | В символ нижнего регистра |
Дата добавления: 2015-12-08; просмотров: 118 | Нарушение авторских прав