Контейнерные классы STL поддерживают семантику значений, но не поддерживают ссылочную семантику. Они создают внутренние копии вставляемых элементов и затем возвращают эти копии. Следовательно, если вам потребуется ссылочная семантика в контейнерах STL (например, из-за того, что копирование элементов обходится слишком дорого или же элементы должны совместно использоваться несколькими коллекциями), воспользуйтесь классом умного указателя для предотвращения потенциальных ошибок. Ниже приведено одно из возможных решений проблемы. В нем задействован вспомогательный класс умного указателя с подсчетом ссылок на объекты, на которые ссылается указатель:
#include "stdafx.h"
#include <iostream>
#include <list>
#include <deque>
#include <algorithm>
using namespace std;
/* Класс, обеспечивающий семантику подсчёта ссылок.
* Объект, на который ссылается указатель, автоматически
* уничтожается при удалении последнего экземпляра CountedPtr
* для данного объекта.
*/
template <class T>
class CountedPtr {
private:
T* ptr; // Указатель на значение
long* count; // Количество владельцев (общие данные)
public:
// Инициализация объекта существующим указателем
// - указатель p должен быть получен в результате вызова new
explicit CountedPtr(T* p = 0)
: ptr(p), count(new long(1)) {
}
// Копирующий указатель (увеличивает счётчик владельцев)
CountedPtr(const CountedPtr<T>& p) throw()
: ptr(p.ptr), count(p.count) {
++*count;
}
// Деструктор (уничтожает объект, если владелец был последним)
~CountedPtr() throw() {
dispose();
}
// Присваивание (перевод указателя на новый объект)
CountedPtr<T>& operator= (const CountedPtr<T>& p) throw() {
if (this!= &p) {
dispose();
ptr = p.ptr;
count = p.count;
++*count;
}
return *this;
}
// Доступ к объекту, на который ссылается указатель
T& operator*() const throw() {
return *ptr;
}
T* operator->() const throw() {
return ptr;
}
private:
void dispose() {
if (--*count == 0) {
delete count;
delete ptr;
}
}
};
Предполагается, что значения, которыми инициализируются умные указатели, были возвращены оператором new. Класс CountedPtr позволяет копировать умные указатели так, чтобы оригинал и копия оставались действительными. Объект уничтожается только после удаления последнего указателя, ссылающегося на него.
Класс CountedPtr можно усовершенствовать, например реализовать в нем автоматическое преобразование типов или возможность передачи права владения от умного указателя вызывающей стороне.
Ниже приведен пример использования класса CountedPtr:
void printCountedPtr(CountedPtr<int> elem)
{
cout << *elem << ' ';
}
int main()
{
// Массив целых чисел (для совместного использования
// в разных контейнерах)
static int values[] = { 3, 5, 9, 1, 6, 4 };
// Две разные коллекции
typedef CountedPtr<int> IntPtr;
deque<IntPtr> coll1;
list<IntPtr> coll2;
/* Вставка общих объектов в коллекции
* - исходный порядок в coll1
* - обратный порядок в coll2
*/
for (int i = 0; i<sizeof(values) / sizeof(values[0]); ++i) {
IntPtr ptr(new int(values[i]));
coll1.push_back(ptr);
coll2.push_front(ptr);
}
// Вывод содержимого обеих коллекций
for_each(coll1.begin(),coll1.end(),printCountedPtr);
cout << endl;
for_each(coll2.begin(), coll2.end(),printCountedPtr);
cout << endl << endl;
/* Модификация значений в разных коллекциях
* - возведение в квадрат третьего значения в coll1
* - изменение знака первого значения в coll1
* - обнуление первого значения в coll2
*/
*coll1[2] *= *coll1[2];
(**coll1.begin()) *= -1;
(**coll2.begin()) = 0;
// Повторный вывод содержимого обеих коллекций
for_each(coll1.begin(), coll1.end(),printCountedPtr);
cout << endl;
for_each(coll2.begin(), coll2.end(),printCountedPtr);
cout << endl;
}
Результат выполнения программы выглядит так:
3 5 9 1 6 4
4 6 1 9 5 3
-3 5 81 1 6 0
0 6 1 81 5 -3
Если вызвать вспомогательную функцию, сохраняющую элемент коллекции (IntPtr) где-то в другом месте, то значение, на которое ссылается указатель, остается действительным даже после уничтожения коллекций или удаления из них всех элементов.
В архиве Boost библиотек C++ (http://www.boost.org/) хранятся различные классы умных указателей, расширяющие стандартную библиотеку C++.
СПИСОК ЛИТЕРАТУРЫ
1. В.В. Подбельский Язык Си++: Учебное пособие. - 5-е изд. - М.: Финансы и статистика, 2000. - 560с. ил.
2. Ален И. Голуб. Си и Си++ правила программирования. - М.: БИНОМ, 1996. - 272с.
3. Бьерн Страуструп Язык программирования Си++. 3-е изд. /Пер. с англ. - СПб.; М.: «Невский диалект» - «Издательство БИНОМ», 1999. - 991с. ил.
4. Дональд Э. Кнут Искусство программирования. 3-е изд.: Пер. с англ.: Уч.пос. - М.: Издательский дом "Вильяс", 2000. - с., ил.
5. Влах И., Сингхал К. Машинные методы анализа и проектирования электронных схем: Пер. с англ. – М.: Радио и связь, 1988. – 560 с. ил.
ПРИЛОЖЕНИЕ 1
Таблицы кодов ASCII
Таблица П1.1
Коды управляющих символов (0 - 31)
Символ | Код 10 | Код 08 | Код 16 | Клавиши | Значение |
nul | 0 | 0 | 00 | ^@ | Нуль |
soh | 1 | 1 | 01 | ^A | Начало заголовка |
stx | 2 | 2 | 02 | ^B | Начало текста |
etx | 3 | 3 | 03 | ^C | Конец текста |
eot | 4 | 4 | 04 | ^D | Конец передачи |
enq | 5 | 5 | 05 | ^E | Запрос |
ack | 6 | 6 | 06 | ^F | Подтверждение |
bel | 7 | 7 | 07 | ^G | Сигнал (звонок) |
bs | 8 | 10 | 08 | ^H | Забой (шаг назад) |
ht | 9 | 11 | 09 | ^I | Горизонтальная табуляция |
lf | 10 | 12 | 0А | ^J | Перевод строки |
vt | 11 | 13 | 0B | ^K | Вертикальная табуляция |
ff | 12 | 14 | 0С | ^L | Новая страница |
cr | 13 | 15 | 0D | ^M | Возврат каретки |
so | 14 | 16 | 0Е | ^N | Выключить сдвиг |
si | 15 | 17 | 0F | ^O | Включить сдвиг |
dle | 16 | 20 | 10 | ^P | Ключ связи данных |
dc1 | 17 | 21 | 11 | ^Q | Управление устройством 1 |
dc2 | 18 | 22 | 12 | ^R | Управление устройством 2 |
dc3 | 19 | 23 | 13 | ^S | Управление устройством 3 |
dc4 | 20 | 24 | 14 | ^T | Управление устройством 4 |
nak | 21 | 25 | 15 | ^U | Отрицательное подтверждение |
syn | 22 | 26 | 16 | ^V | Синхронизация |
etb | 23 | 27 | 17 | ^W | Конец передаваемого блока |
can | 24 | 30 | 18 | ^X | Отказ |
em | 25 | 31 | 19 | ^Y | Конец среды |
sub | 26 | 32 | 1А | ^Z | Замена |
esc | 27 | 33 | 1B | ^ [ | Ключ |
fs | 28 | 34 | 1С | ^ \ | Разделитель файлов |
gs | 29 | 35 | 1D | ^ ] | Разделитель группы |
rs | 30 | 36 | 1E | ^ ^ | Разделитель записей |
us | 31 | 37 | 1F | ^_ | Разделитель модулей |
В графе "клавиши" обозначение ^ соответствует нажатию клавиши Ctrl, вместе с которой нажимается соответствующая "буквенная" клавиша, формирующая код символа.
Таблица П 1.2
Символы с кодами 32 – 127
Символ | Код 10 | Код 08 | Код 16 | Символ | Код 10 | Код 08 | Код 16 | |
пробел | 32 | 40 | 20 | = | 61 | 75 | 3D | |
! | 33 | 41 | 21 | > | 62 | 76 | ЗЕ | |
" | 34 | 42 | 22 | ? | 63 | 77 | 3F | |
# | 35 | 43 | 23 | @ | 64 | 100 | 40 | |
$ | 36 | 44 | 24 | А | 65 | 101 | 41 | |
% | 37 | 45 | 25 | В | 66 | 102 | 42 | |
£ | 38 | 46 | 26 | С | 67 | 103 | 43 | |
' | 39 | 47 | 27 | D | 68 | 104 | 44 | |
( | 40 | 50 | 28 | Е | 69 | 105 | 45 | |
) | 41 | 51 | 29 | F | 70 | 106 | 46 | |
* | 42 | 52 | 2А | G | 71 | 107 | 47 | |
+ | 43 | 53 | 2В | Н | 72 | 108 | 48 | |
, | 44 | 54 | 2C | I | 73 | 111 | 49 | |
- | 45 | 55 | 2D | J | 74 | 112 | 4A | |
. | 46 | 56 | 2Е | K | 75 | 113. | 4B | |
/ | 47 | 57 | 2F | L | 76 | 114 | 4C | |
0 | 48 | 60 | 30 | М | 77 | 115 | 4D | |
1 | 49 | 61 | 31 | N | 78 | 116 | 4E | |
2 | 50 | 62 | 32 | О | 79 | 117 | 4F | |
3 | 51 | 63 | 33 | Р | 80 | 120 | 50 | |
4 | 52 | 64 | 34 | Q | 81 | 121 | 51 | |
5 | 53 | 65 | 35 | R | 82 | 122 | 52 | |
6 | 54 | 66 | 36 | S | 83 | 123 | 53 | |
7 | 55 | 67 | 37 | Т | 84 | 124 | 54 | |
8 | 56 | 70 | 38 | U | 85 | 125 | 55 | |
9 | 57 | 71 | 39 | V | 86 | 126 | 56 | |
: | 58 | 72 | ЗА | W | 87 | 127 | 57 | |
; | 59 | 73 | ЗВ | X | 88 | 130 | 58 | |
< | 60 | 74 | ЗС | Y | 89 | 131 | 59 | |
Z | 90 | 132 | 5A | m | 109 | 155 | 6D | |
[ | 91 | 133 | 5B | n | 110 | 156 | 6E | |
\ | 92 | 134 | 5C | о | 111 | 157 | 6F | |
] | 93 | 135 | 5D | p | 112 | 160 | 70 | |
^ | 94 | 136 | 5E | q | 113 | 161 | 71 | |
_ | 95 | 137 | 5F | г | 114 | 162 | 72 | |
` | 96 | 140 | 60 | s | 115 | 163 | 73 | |
a | 97 | 141 | 61 | t | 116 | 164 | 74 | |
b | 98 | 142 | 62 | u | 117 | 165 | 75 | |
c | 99 | 143 | 63 | v | 118 | 166 | 76 | |
d | 100 | 144 | 64 | w | 119 | 167 | 77 | |
e | 101 | 145 | 65 | x | 120 | 170 | 78 | |
f | 102 | 146 | 66 | Y | 121 | 171 | 79 | |
g | 103 | 147 | 67 | z | 122 | 172 | 7А | |
h | 104 | 150 | 68 | { | 123 | 173 | 7В | |
i | 105 | 151 | 69 | | | 124 | 174 | 7С | |
j | 106 | 152 | 6A | } | 125 | 175 | 7D | |
k | 107 | 153 | 6B | ~ | 126 | 176 | 7Е | |
1 | 108 | 154 | 6C | del | 127 | 177 | 7F |
Таблица П1.3
Символы с кодами 128 - 255 (Кодовая таблица 866 - MS-DOS)
Символ | Код 10 | Код 08 | Код 16 | Символ | Код 10 | Код 08 | Код 16 | |
А | 128 | 200 | 80 | Ь | 156 | 234 | 9С | |
Б | 129 | 201 | 81 | Э | 157 | 235 | 9D | |
В | 130 | 202 | 82 | Ю | 158 | 236 | 9Е | |
Г | 131 | 203 | 83 | Я | 159 | 237 | 9F | |
Д | 132 | 204 | 84 | а | 160 | 240 | АО | |
Е | 133 | 205 | 85 | б | 161 | 241 | А1 | |
Ж | 134 | 206 | 86 | в | 162 | 242 | А2 | |
З | 135 | 207 | 87 | г | 163 | 243 | A3 | |
И | 136 | 210 | 88 | д | 164 | 244 | А4 | |
Й | 137 | 211 | 89 | е | 165 | 245 | А5 | |
К | 138 | 212 | 8А | ж | 166 | 246 | А6 | |
Л | 139 | 213 | 8В | з | 167 | 247 | А7 | |
М | 140 | 214 | 8С | и | 168 | 250 | А8 | |
Н | 141 | 215 | 8D | й | 169 | 251 | А9 | |
О | 142 | 216 | 8Е | к | 170 | 252 | АА | |
П | 143 | 217 | 8F | л | 171 | 253 | АВ | |
Р | 144 | 220 | 90 | м | 172 | 254 | АС | |
С | 145 | 221 | 91 | н | 173 | 255 | AD | |
Т | 146 | 222 | 92 | о | 174 | 256 | АЕ | |
У | 147 | 223 | 93 | п | 175 | 257 | AF | |
Ф | 148 | 224 | 94 | ░ | 176 | 260 | ВО | |
X | 149 | 225 | 95 | ▒ | 177 | 261 | В1 | |
Ц | 150 | 226 | 96 | ▓ | 178 | 262 | В2 | |
Ч | 151 | 227 | 97 | | | 179 | 263 | ВЗ | |
Ш | 152 | 230 | 98 | ┤ | 180 | 264 | В4 | |
Щ | 153 | 231 | 99 | ╡ | 181 | 265 | В5 | |
Ъ | 154 | 232 | 9А | ╢ | 182 | 266 | В6 | |
Ы | 155 | 233 | 9В | ╖ | 183 | 267 | В7 | |
╕ | 184 | 270 | В8 | ╓ | 214 | 326 | D6 | |
╣ | 185 | 271 | В9 | ╫ | 215 | 327 | D7 | |
║ | 186 | 272 | ВА | ╪ | 216 | 330 | D8 | |
╗ | 187 | 273 | ВВ | ┘ | 217 | 331 | D9 | |
╝ | 188 | 274 | ВС | ┌ | 218 | 332 | DA | |
╜ | 189 | 275 | BD | █ | 219 | 333 | DB | |
╛ | 190 | 276 | BE | ▄ | 220 | 334 | DC | |
┐ | 191 | 277 | BF | ▌ | 221 | 335 | DD | |
└ | 192 | 300 | СО | ▐ | 222 | 336 | DE | |
┴ | 193 | 301 | С1 | ▀ | 223 | 337 | DF | |
┬ | 194 | 302 | С2 | Р | 224 | 340 | ЕО | |
├ | 195 | 303 | СЗ | С | 225 | 341 | Е1 | |
— | 196 | 304 | С4 | Т | 226 | 342 | Е2 | |
+ | 197 | 305 | С5 | У | 227 | 343 | ЕЗ | |
╞ | 198 | 306 | С6 | ф | 228 | 344 | Е4 | |
╟ | 199 | 307 | С7 | X | 229 | 345 | Е5 | |
╚ | 200 | 310 | С8 | Ц | 230 | 346 | Е6 | |
╔ | 201 | 311 | С9 | Ч | 231 | 347 | Е7 | |
╩ | 202 | 312 | СА | Ш | 232 | 350 | Е8 | |
╦ | 203 | 313 | СВ | Щ | 233 | 351 | Е9 | |
╠ | 204 | 314 | СС | Ъ | 234 | 352 | ЕА | |
═ | 205 | 315 | CD | : Ы | 235 | 353 | ЕВ | |
╬ | 206 | 316 | СЕ | Ь | 236 | 354 | ЕС | |
╧ | 207 | 317 | CF | Э | 237 | 355 | ED | |
╨ | 208 | 320 | DO | Ю | 238 | 356 | ЕЕ | |
╤ | 209 | 321 | D1 | Я | 239 | 357 | EF | |
╥ | 210 | 322 | D2 | ≡ илиЁ | 240 | 360 | F0 | |
╙ | 211 | 323 | D3 | ± или ё | 241 | 361 | F1 | |
╘ | 212 | 324 | D4 | ≥ | 242 | 362 | F2 | |
╒ | 213 | 325 | D5 | ≤ | 243 | 363 | F3 | |
⌠ | 244 | 364 | F4 | . | 250 | 372 | FA | |
⌡ | 245 | 365 | F5 | √ | 251 | 373 | FB | |
÷ | 246 | 366 | F6 | n | 252 | 374 | FC | |
≈ | 247 | 367 | F7 | z | 253 | 375 | FD | |
· | 248 | 370 | F8 | ■ | 254 | 376 | FE | |
● | 249 | 371 | F9 | 255 | 377 | FF |
Таблица П1.4
Символы с кодами 128 - 255 (Кодовая таблица 1251 – MS Windows)
Символ | Код 10 | Код 08 | Код 16 | Символ | Код 10 | Код 08 | Код 16 | |
Ђ | 128 | 200 | 80 | ״ | 148 | 224 | 94 | |
Ѓ | 129 | 201 | 81 | • | 149 | 225 | 95 | |
, | 130 | 202 | 82 | - | 150 | 226 | 96 | |
Ѓ | 131 | 203 | 83 | — | 151 | 227 | 97 | |
,, | 132 | 204 | 84 | □ | 152 | 230 | 98 | |
… | 133 | 205 | 85 | тм | 153 | 231 | 99 | |
† | 134 | 206 | 86 | Љ | 154 | 232 | 9А | |
≠ | 135 | 207 | 87 | > | 155 | 233 | 9В | |
□ | 136 | 210 | 88 | Њ | 156 | 234 | 9С | |
‰ | 137 | 211 | 89 | Ќ | 157 | 235 | 9D | |
Љ | 138 | 212 | 8А | Ћ | 158 | 236 | 9Е | |
< | 139 | 213 | 8В | Џ | 159 | 237 | 9F | |
Њ | 140 | 214 | 8С | 160 | 240 | АО | ||
Ќ | 141 | 215 | 8D | Ў | 161 | 241 | А1 | |
Ћ | 142 | 216 | 8Е | Ў | 162 | 242 | А2 | |
Џ | 143 | 217 | 8F | J | 163 | 243 | A3 | |
Ŋ | 144 | 220 | 90 | ¤ | 164 | 244 | А4 | |
` | 145 | 221 | 91 | Ґ | 165 | 245 | А5 | |
' | 146 | 222 | 92 | ¦ | 166 | 246 | А6 | |
`` | 147 | 223 | 93 | § | 167 | 247 | А7 | |
Ё | 168 | 250 | А8 | 3 | 199 | 307 | С7 | |
© | 169 | 251 | А9 | И | 200 | 310 | С8 | |
Є | 170 | 252 | АА | Й | 201 | 311 | С9 | |
« | 171 | 253 | АВ | К | 202 | 312 | СА | |
172 | 254 | АС | Л | 203 | 313 | СВ | ||
- | 173 | 255 | AD | М | 204 | 314 | СС | |
® | 174 | 256 | АЕ | Н | 205 | 315 | CD | |
Ї | 175 | 257 | AF | О | 206 | 316 | СЕ | |
° | 176 | 260 | В0 | П | 207 | 317 | CF | |
± | 177 | 261 | В1 | Р | 208 | 320 | D0 | |
І | 178 | 262 | В2 | С | 209 | 321 | D1 | |
і | 179 | 263 | ВЗ | Т | 210 | 322 | D2 | |
ґ | 180 | 264 | В4 | У | 211 | 323 | D3 | |
μ | 181 | 265 | В5 | Ф | 212 | 324 | D4 | |
¶ | 182 | 266 | В6 | X | 213 | 325 | D5 | |
. | 183 | 267 | В7 | Ц | 214 | 326 | D6 | |
ё | 184 | 270 | В8 | Ч | 215 | 327 | D7 | |
??? | 185 | 271 | В9 | Ш | 216 | 330 | D8 | |
є | 186 | 272 | ВА | Щ | 217 | 331 | D9 | |
» | 187 | 273 | ВВ | Ъ | 218 | 332 | DA | |
j | 188 | 274 | ВС | Ы | 219 | 333 | DB | |
S | 189 | 275 | BD | Ь | 220 | 334 | DC | |
s | 190 | 276 | BE | Э | 221 | 335 | DD | |
ï | 191 | 277 | BF | Ю | 222 | 336 | DE | |
А | 192 | 300 | С0 | Я | 223 | 337 | DF | |
Б | 193 | 301 | C1 | А | 224 | 340 | Е0 | |
В | 194 | 302 | С2 | Б | 225 | 341 | Е1 | |
Г | 195 | 303 | СЗ | В | 226 | 342 | Е2 | |
Д | 196 | 304 | С4 | Г | 227 | 343 | ЕЗ | |
Е | 197 | 305 | С5 | Д | 228 | 344 | Е4 | |
Ж | 198 | 306 | С6 | Е | 229 | 345 | Е5 | |
Ж | 230 | 346 | Е6 | у | 243 | 363 | F3 | |
З | 231 | 347 | Е7 | ф | 244 | 364 | F4 | |
И | 232 | 350 | Е8 | х | 245 | 365 | F5 | |
й | 233 | 351 | Е9 | ц | 246 | 366 | F6 | |
к | 234 | 352 | ЕА | ч | 247 | 367 | F7 | |
л | 235 | 353 | ЕВ | ш | 248 | 370 | F8 | |
м | 236 | 354 | ЕС | щ | 249 | 371 | F9 | |
н | 237 | 355 | ED | ъ | 250 | 372 | FA | |
о | 238 | 356 | ЕЕ | ы | 251 | 373 | FB | |
п | 239 | 357 | EF | ь | 252 | 374 | FC | |
р | 240 | 360 | F0 | э | 253 | 375 | FD | |
с | 241 | 361 | F1 | ю | 254 | 376 | FE | |
т | 242 | 362 | F2 | я | 255 | 377 | FF |
ПРИЛОЖЕНИЕ 2
Стандартная библиотека функций языка Си
Таблица П2.1
Математические функции - файл math. h
Функция | Прототип и краткое описание действий |
Abs | int abs(int i); Возвращает абсолютное значение целого аргумента I |
Acos | double асоs (double х); Функция арккосинуса. Значение аргумента должно находиться в диапазоне от -1 до +1 |
Asin | double asin(double х); Функция арксинуса. Значение аргумента должно находиться в диапазоне от -1 до +1 |
atan | double atan(double x); Функция арктангенса |
atan2 | double atan2(double у, double х); Функция арктангенса от значения у/х |
cabs | double cabs(struct complex znum); Вычисляет абсолютное значение комплексного числа znum. Определение структуры (типа) complex - в файле math.h |
cos | double cos(double x); Функция косинуса. Угол (аргумент) задается в радианах |
cosh | double cosh (double x); Возвращает значение гиперболического косинуса х |
exp | double exp(double x); Вычисляет значение еx (экспоненциальная функция) |
fabs | double fabs(double x); Возвращает абсолютное значение вещественного аргумента х двойной точности |
floor | double floor(double x); Находит наибольшее целое, не превышающее значения х. Возвращает его в форме double |
fmod | double fmod(double x, double y); Возвращает остаток от деления нацело х на у |
hypot | double hypot(double x, double у); Вычисляет гипотенузу z прямоугольного треугольника по значениям катетов х, у (z2 = х2 + у2) |
labs | long labs(long х); Возвращает абсолютное значение целого аргумента long x |
ldexp | double ldexp(double v, int e); Возвращает значение выражения v•2e |
log | double log(double x); Возвращает значение натурального логарифма (In x) |
log10 | double log10(double x); Возвращает значение десятичного логарифма (log10 х) |
poly | double poly(double x, int n, double c[ ]); Вычисляет значение полинома: c[n]xn + c[n - 1]хn-1 +... + c[l]x + c[0] |
pow | double pow(double x, double у); Возвращает значение xy, т.е. х в степени у |
pow10 | double pow10(int p); Возвращает значение 10p |
sin | double sin(double x); Функция синуса. Угол (аргумент) задается в радианах |
sinh | double sinh(double x); Возвращает значение гиперболического синуса для х |
sqrt | double sqrt(double x);
Возвращает положительное значение квадратного корня ![]() |
tan | double tan(double x); Функция тангенса. Угол (аргумент) задается в радианах |
tanh | double tanh(double x); Возвращает значение гиперболического тангенса для х |
Таблица П2.2
Функции проверки и преобразования символов - файл ctype. h
Функция | Прототип и краткое описание действий |
isalnum | int isalnum(int с); Дает значение не нуль, если с - код буквы или цифры (А - z, a - z,0 - 9), и нуль - в противном случае |
isalpha | int isalpha(int с); Дает значение не нуль, если с - код буквы (А - Z, а - z), и нуль - в противном случае |
isascii | int isascii(int с); Дает значение не нуль, если с есть код ASCII, т.е. принимает значение от 0 до 127, в противном случае – нуль |
iscntrl | int iscntrl(int с); Дает значение не нуль, если с - управляющий символ с кодами 0x00 - 0x0lF или 0x7F, и нуль - в противном случае |
isdigit | int isdigit(int с); Дает значение не нуль, если с - цифра (0 - 9) в коде ASCII, и нуль - в противном случае |
isgraph | int isgraph(int с); Дает значение не нуль, если с - видимый (изображаемый) символ с кодом (0x21 - 0х7Е), и нуль - в противном случае |
islower | int islower(int с); Дает значение не нуль, если с - код символа на нижнем регистре (а - z), и нуль - в противном случае |
isprint | int isprint(int с); Дает значение не нуль, если с - печатный символ с кодом (0x20 - 0х7Е), и нуль - в противном случае |
ispunct | int ispunct(int с); Дает значение не нуль, если с - символ-разделитель (соответствует iscntrl или isspase), и нуль - в противном случае |
isspace | int isspace(int с); Дает значение не нуль, если с -обобщенный пробел: пробел, символ табуляции, символ новой строки или новой страницы, символ возврата каретки (0x09 - 0х0D, 0x20), и нуль - в противном случае |
Таблица П2.3
Функции ввода-вывода для стандартных файлов – файл stdio.h
Функция | Прототип и краткое описание действий |
getch | Int getch(void); Считывает один символ с клавиатуры без отображения на экране |
getchar | Int getchar (void); Считывает очередной символ из стандартного входного файла (stdin) |
gets | char * gets(char *s); Функция инициализации генератора случайных чисел (rand); seed - любое беззнаковое целое число |
printf | Int printf(char * format [, argument,…]); Функция форматированного вывода в файл stdout |
putchar | Int putchar (int f); Записывает символ f в стандартный файл вывода (stdout) |
Puts | Int puts(const char *s); Записывает строку s в стандартный файл вывода (stdout) |
scanf | Int scanf(char* format[, argument, …]); Функция форматированного ввода из файла stdin |
sprintf | i nt sprintf(char*s, char* format [, argument, …]); Функция форматированной записи в строку s |
sscanf | int sscanf(char*s, char * format [, address, …]); Функция форматированного чтения из строки |
ungetch | Int ungetch(int f); Возвращает символ f в стандартный файл ввода stdio, заставляя его быть следующим считываемым символом |
Таблица П2.4
Функции для работы со строками – файлы string.h stdlib.h
Функция | Прототип и краткое описание действий |
Atof | Double atof (char* str); Преобразовать строку str в вещественное число типа double |
Atoi | Int atoi(char* str); Преобразовать строку str в десятичное целое число |
itoa | Char * itoa (long v, char*str, int baz); Преобразовать целое v в строку str. При изображении числа используется основание baz (2£ baz£ 36). Для отрицательного числа и baz = 10 первый символ – «минус» |
ltoa | char * ltoa (long v, char*str, int baz); Преобразовать целое v в строку str. При изображении числа используется основание baz (2£ baz£ 36) |
strcat | char * strcat(char* sp, char *si); Преписывает строку si к строке sp (конкатенация строк) |
strchr | char* strchr(char* str, int c); Ищет в строке str первое вхождение символа с |
strcmp | strcmp(char* str1, char* str2); Сравнивает строки str1 и str2. Результат отрицателен, если str1 < str2; равен нулю, если str1 == str2 и положителен, если str1> str2 (сравнение беззнаковое) |
strcpy | char* strcpy(char* sp, char* si); Копирует байты строки si в строку sp |
strcspn | int strcspn (char * str1, char* str2); Определяет длину первого сегмента строки str1, содержащего символ, не входящие во множество символов строки str2 |
strdup | char* strdup(const char* str); Выделяет память и переносит в неё копию строки str |
strlen | Unsigned int strlen (char *str); Вычисляет длину строки str без учёта нулевого символа. |
strlwr | Char* strlwr(char*str); Преобразует буквы верхнего ригистра в строке в соответствующие буквы нижнего регистра |
strncat | char * strncat(char*sp, shar* si, int kol); Приписывает kol символов строки si к строке sp (конкатенация) |
strupr | Char * strupr(char* str); Преобразует буквы нижнего регистра в строке str в буквы верхнего регистра |
Ultoa | Char* ultoa (unsigned long v, char* str, int baz); Преобразует беззнаковое длинное целое в строку str |
Таблица П2.5
Функции для выделения и освобождения памяти – файлы stdlib.h, alloc.h
Функция | Прототип и краткое описание действий |
calloc | void *calloc(unsigned n, unsigned m); Возвращает указатель на начало области динамически распределенной памяти для размещения n элементов по m байт каждый. При неудачном завершении возвращает значение NULL |
free | void free(void *b1); Освобождает ранее выделенный блок динамически распределяемой памяти с адресом первого байта b1 |
malloc | void* malloc (unsigned s); Возвращает указатель на блолк динамически распределяемой памяти длиной s байт. При неудачном завершении возвращает значение NULL |
realloc | void* realloc (void* bl, unsigned ns); Изменяет размер ранее выделенной динамической памяти с адресом начала bl до размера ns байт. Если bl равен NULL, то функция выполняется как malloc() |
Таблица П2.6
Функции для работы с терминалом в текстовом режиме – файл conio.h
Функция | Прототип и краткое описание действий |
clreol | void clreol(void); Стирает символы от позиции курсора до конца строки в текстовом окне. |
clrscr | void clrscr (void); Очищает экран |
Gotoxy | void gotoxy(int x, int y); Перемещает курсор в позицию текстового окна с координатами (x, y) |
highvideo | void highvideo(void); Повышает яркость символов, выводимых после неё на экран |
normvideo | void normvideo (void); Устанавливает нормальную яркость выводимых на экран символов |
textattr | void textattr (int newattr); Устанавливает атрибуты (фон, цвет) символов, выводимых на экран |
textbackground | void textbackground(int с); Устанавливает цвет фона по значению параметра с |
textcolor | void textcolor(int c); Устанавливает цвет символов по значению параметра с |
textmode | void textmode (int m); Переводит экран в текстовый режим по значению параметра m; |
whrex | int wherex(void); Возвращает значение горизонтальной координаты курсора |
whrery | int wherey(void); Возвращает значение вертикальной координаты курсора |
window | void window (int x0, int y0, int x1, int y1); Создаёт текстовое окно по координатам угловых точек |
Таблица П2. 7
Специальные функции
Функция | Прототип и краткое описание действий | Местонахождение прототипа |
delay | void delay (unsigned x); Приостанавливает выполнение программы на х мсек | dos.h |
kbhit | int kbhit (void); Возвращает ненулевое целое, еслив буфере клавиатуры присутствуют коды нажатия клавиш, в противном случае – нулевое значение | conio.h |
nosound | void nosound(void); Прекращает подачу звукового сигнала, начатую функцией sound() | dos.h |
rand | int rand(void); Возвращает псевдослучайное целое число из диапазона от 0 до 2е15, может использовать srand() | stdlib.h |
sound | void sound(unsigned f); Вызывает звуковой сигнал с частотой f Гц | dos.h |
srand | void srand(unsigned seed); Функция инициализации генератора случайных чисел (rand); seed - любое беззнаковое целое число | stdlib.h |