RuLib

Новости Главная Каталог книг Статьи Загрузка Карта сайта

 

Содержимое файлов сателитов файла Fridman.djvu.
Fridman.djvu.info

638


Fridman.djvu.ISBN

0-07-882504-0
5-7989-0205-6


Fridman.djvu.NameBook

Арт Фридман, Ларс Кландер, Марк Михаэлис, Герб Шильдт Под ред. В. Тимофеева C C++. Архив программ 2001г. ISBN 5-7989-0205-6 ,0-07-882504-0
Арт Фридман, Ларс Кландер, Марк Михаэлис, Герб Шильдт Под ред. В. Тимофеева C C++. Архив программ 2001г. ISBN 5-7989-0205-6 ,0-07-882504-0


Fridman.djvu.tth

D5GFCJDIYAYXJXP6W6CHJVUJUJQUWA3V74RQT7A


Fridman.djvu.txt

Арт Фридман Ларе Кландер Марк Михаэлис Херб Шильдт

F1
рхив программ

шш
КОМ
ариями


поможет в решении самых разнообразных задач
продемонстрирует процедуры для синтаксического анализа, двоичных деревьев, финансов и статистики, работы в internet
совместим со всеми современными компиляторами сопровождается детальными пояснениями




УДК 004.43 ББК 32.973-018.1 Ф88

Фридман А., Клаидер Л., Михаэлис М., Шильдт X.
C/C++. Архив программ - М.: ЗАО <Издательство БИНОМ>, 2001 г. - 640 с: ил.
В книге представлен код работоспособных программ на C/C++, относящихся к самым разнообразным областям и аспектам написания приложений - от работы с достаточно простыми структурами данных (списки, деревья) до построения синтакси-ческих анализаторов и интерпретаторов, доступа к Internet и т. п. Программный код может использоваться в ваших программах без изменений или в модифицированном и усовершенствованном виде. Чрезвычайно полезно также его изучение в целях освое-ния главнейших принципов, алгоритмов и приемов решения разных задач. Программы снабжены развернутыми комментариями и детальными пояснениями их работы.
Для широкого круга программистов, пишущих на языках C/C++.

Все права защищены. Никакая часть этой книги не может быть воспроизведена в любой форме или любыми средствами, электронными или механическими, включая фотографирование, маг-нитную запись или иные средства копирования или сохранения информации без письменного разрешения издательства.

#d ЬП

с/?3


ISBN 5-7989-0205-6 (русск.) ISBN 0-07-882504-0 (англ.)Authorized translation from the English
language edition, i Original copyright. Osborne/McGraw-Hill, 1999 > Издание на русском языке. ЗАО <Издательство БИНОМ>, 2001



Содержание
Предисловие............................11
Глава 1. Сортировка..................13
Введение в сортировку.......................   14
Пузырьковая сортировка......................   15
Выборочная сортировка......................   18
Базовая быстрая сортировка....................   21
Улучшенная быстрая сортировка..................   26
Сортировка слиянием.......................   31
Глава 2. Связанные списки...............37
Введение в связанные списки....................   38
Односвязные списки........................   40
Простой односвязный список....................   40
Шаблон односвязного списка....................   46
Двусвязные списки........................   54
Простой двусвязный список.....................   54
Шаблон двусвязного списка.....................   60
Глава 3. Двоичные деревья...............71
Введение в двоичные деревья.....................72
Двоичные деревья поиска......................73
Простой шаблон двоичного дерева поиска..............74
Сбалансированное двоичное дерево поиска..............92
Глава 4. Смешанные таблицы
и разреженные массивы............... .  119
Введение в смешанные таблицы и разреженные массивы.......   120
Проектирование смешанной таблицы................   120
Простая смешанная таблица с целыми ключами...........   122
Смешанная таблица с ключами типа char *.............   129
Проектирование разреженного массива...............   137
Одномерный разреженный массив.................   138
Двумерный разреженный массив..................   142
Глава 5. Управление памятью.............149
Управление памятью в С и C++...................   150
Перегрузка глобальной операции new................   151
Простой аллокатор, основанный на массиве.............   154
Простой аллокатор, основанный на списке.............   159



6_______________________________________________________C/C++. Архив программ

Глава 6. Работа с файлами и каталогами.......165
Поиск и замена в текстовом файле.................   166
Работа с файловой системой....................   178
Просмотр содержимого файла...................   193
Глава 7. Основы шифровки...............199
Что такое шифровка.......................   200
Усиление защиты шифра.....................   206
Более сложный алгоритм шифровки.................   206
Ограниченность традиционных систем шифровки с одним ключом . . .   215
Криптосистемы с общим ключом..................   216
Цифровые подписи........................   217
Построение цифровой подписи...................   217
Алгоритм Райвеста-Шамира-Эйдлмана (RSA)...........   219
Свойства алгоритма RSA......................   220
Алгоритм RSA как таковой.....................   221
Математика алгоритма.......................   221
Смешанные значения.......................   222
API шифровки системы Windows..................   222
Криптографические серверы (CSP).................   224
Программная модель CryptoAPI...................   225
Вызов базовых функций CryptoAPI.................   226
Цифровые подписи в CryptoAPI...................   229
Поддержка CryptoAPI в программах MFC..............   229
Код класса CCryptoDoc.......................   230
Последние замечания о CryptoNotes и шифрах............   238
Глава 8. Управление исходным кодом.........   241
Проектирование программы управления кодом...........   243
Классы лексем..........................   244
Класс сканера CScanner......................   277
Инициализация сканера для C++..................   287
Класс синтаксического разбора CCodeParser.............   294
Главная программа........................   317
Компиляция SCodeMnt.exe....................   324
Запуск SCodeMnt.exe.......................   325
Чем можно заняться.......................   325
Глава 9. C/C++ в Internet...............   327
Службы Internet.........................   328
WinSockAPI...........................   328
Инициализация WinSock......................   329
Служба имен...........................   330
Вопросы, касающиеся порядка байтов................   330
Коммуникация через сокеты....................   331
Проблема блокировки и вызов select()................   331



Содержание_________________________________________________________________7

Асинхронные вызовы сокетов....................   332
Синхронные операции и сериализация................   333
Проект простого обозревателя...................   333
Новый Internet-класс CHtmlView..................   375
Управляющий элемент обозревателя................   375
Создание проекта, использующего CHtmlView............   376
Перемещение в среде CHtmlView..................   377
Простая программа-обозреватель на основе класса CHtmlView.....   379
Обозреватель для просмотра результатов поиска...........   379
Глава 10. Финансовые расчеты.............381
Вычисление амортизации.....................   382
Линейная амортизация.......................   382
Код программы для расчета линейной амортизации..........   383
Амортизация по сумме цифр лет..................   385
Код программы для амортизации по сумме цифр лет.........   387
Амортизация по балансу с двойным наклоном............   391
Код программы для амортизации по балансу с двойным наклоном . . .   393
Функции, связанные с рентой...................   397
Вычисление конечной стоимости при единственном
начальном взносе.........................   398
Код для вычисления конечной стоимости при единственном
начальном взносе.........................   399
Расчет конечной стоимости ряда взносов...............   401
Код для вычисления конечной стоимости
при последовательных взносах...................   402
Расчет одиночного взноса, достигающего заданной
конечной стоимости........................   404
Код для расчета взноса, достигающего заданной стоимости......   404
Расчет взносов, необходимых для достижения указанной
конечной стоимости........................   405
Код для расчета ряда взносов, достигающих целевой суммы......   406
Написание простого калькулятора ссуды..............   407
Код для расчета выплат по ссуде..................   408
Объединение различных вычислений................   409
Код для расчета взносов в пенсионный фонд.............   410
Глава 11. Статистические расчеты..........413
Введение в средние значения....................414
Среднее арифметическое, медиана и модус..............415
Другие распространенные виды средних..............423
Среднее взвешенное........................423
Среднее геометрическое......................424
Вычисление среднего квадратичного и квадратичной суммы......425
Оценка вероятностей.......................430
Второй закон вероятности.....................432
Третий закон вероятности.....................432



8_______________________________________________________C/C++. Архив программ

Четвертый закон вероятности....................   432
Регрессионный анализ......................   439
Глава 12. Создание фракталов.............   445
Введение во фракталы.......................   446
Краткое замечание о графиках...................   448
Обзор архитектуры документ/вид..................   449
Глава 13. Объектно-ориентированный анализатор
выражений..................   483
Основы синтаксического анализа..................   484
Выражения............................   484
Анализ выражений: проблема...................   485
Синтаксический анализ выражения.................   486
Разбиение выражения на лексемы..................   487
Простой анализатор выражений..................   489
Анализатор, воспринимающий переменные.............   497
Обобщенный анализатор......................   505
Расширение и улучшение анализатора...............   512
Глава 14. Реализация языковых
интерпретаторов на C++..........   515
Анализатор выражений Small BASIC................   517
Выражения Small BASIC......................   518
Лексемы языка Small BASIC....................   518
Интерпретатор языка Small BASIC..............., .   529
Ключевые слова..........................   539
Загрузка программы........................   540
Главный цикл...........................   541
Функция присваивания......................   542
Команда PRINT..........................   543
Команда INPUT..........................   544
Команда GOTO..........................   545
Оператор IF.............................   547
Цикл FOR.............................   548
GOSUB..............................   551
Работа со Small BASIC.......................   552
Усовершенствование и расширение интерпретатора.........   554
Создание своего собственного компьютерного языка.........   554
Глава 15. Исследование библиотеки
стандартных шаблонов...........   555
Обзор библиотеки стандартных шаблонов..............   556
Контейнеры............................   556
Итераторы............................   557
Алгоритмы............................   558



Содержание9

Функциональные объекты, определяемые пользователем.......558
Сортировки STL.........................559
Алгоритм sort()..........................559
Алгоритм partial_sort()......................561
Функция sortheap........................562
Сортировка STL-контейнеров с элементами,
определенными пользователем...................564
Определяемый пользователем критерий сортировки.........566
Поиск в контейнерах STL.....................568
Алгоритм find()..........................569
Алгоритм binary_search().....................571
Использование функциональных объектов.............572
Контейнеры и потоки.......................574
Чтение элементов контейнера из файла...............576
Сравнение строк.........................577
Алгоритмы теории множеств....................579
Поиск подмножества строк....................580
Обслуживание приоритетных сообщений..............583
Контейнер двоичного дерева....................586
Глава 16. C/C++ в разработках CGI...........605
Архитектура CGI.........................   606
FTP и HTTP: сохранение статуса..................   607
Эффективность коммуникации без сохранения статуса........   608
Четыре шага транзакции HTTP..................   609
1-й шаг: Создание соединения....................   609
2-й шаг: Запрос клиента......................   610
3-й шаг: Отклик сервера......................   611
4-й шаг: Разрыв соединения сервером................   611
Подробнее об URI.........................   612
Внутри URL............................   612
URL, протоколы и типы файлов...................   613
Фрагменты URL..........................   613
URL и HTML...........................   614
Абсолютные и относительные URL.................   614
Место CGI в модели Web......................   615
Разработка компонента часов...................   616
Компонент часов..........................   616
Сценарий CGI, использующий метод POST протокола HTTP.....   622
Использование приложений CGI..................   636
Взаимодействие сервера с программой CGI..............   636
Обращение из обозревателя к программе CGI.............   637




<?



Предисловие
Это книга написана программистами, пишущими на C/C++, - для про-граммистов, пишущих на C/C++. В 16-ти ее главах вы найдете самый интерес-ный и полезный код, приложения которого вы можете видеть повсюду. Про-граммы и подсистемы можно использовать так, как они написаны, или как ос-нову для ваших собственных разработок. Будете ли вы относительным нович-ком в программировании или испытанным профессионалом, я уверен, что книга вам понравится.
Книга появилась на свет довольно курьезным образом. Скотт Роджерс, один из издателей и главный редактор Осборна, задумал выпустить серию книг, которые стали называться Annotated Archives. Эти книги должны были собрать вместе массу практических программ и библиотек, сопровождаемых исчерпывающими, углубленными описаниями кода, предложениями по его развитию и советами относительно его применения. Я сразу понял, что это за-мечательная мысль и что из этого может получиться отличная книга по про-граммированию на C/C++. Единственным препятствием было то, что мой пи-сательский план и так уже был забит до отказа, и я не мог сам написать всю книгу. (Из-за быстроты перемен и инноваций нагрузка на мое расписание все-гда очень велика.)
Именно тогда за дело взялся Уэнди Ринальди, мой основной редактор в Ос-борне. Объединив наши умственные усилия, мы придумали план. Мы решили собрать нескольких авторов, каждый из которых напишет о том, что его осо-бенно интересует. Я сам напишу две главы, а потом буду выступать в качестве консультанта и советчика. При таком подходе мы смогли своевременно пре-доставить для книги код самого высокого качества и при этом сохранить ее связность. Я думаю, вас удовлетворят результаты того, что мы сделали.
Книгу открывают пять глав, написанных Артом Фридманом, охватываю-щие наиболее фундаментальные структуры и алгоритмы компьютерной обра-ботки данных: сортировку, поиск, двоичные деревья, смешанные таблицы, разреженные массивы и управление памятью. Арт предлагает углубленное изучение этой тематики и приводит ряд изощренных и элегантных реализа-ций. По большей части он спроектировал свой код в виде подсистем, которые вы можете вставить прямо в свой следующий проект. Арт даже реализовал на-бор процедур, поддерживающих балансировку двоичных деревьев. Если вам когда-нибудь приходилось этим заниматься, вы знаете, что это такое.
Ларе Кландер написал несколько глав, посвященных различным популяр-ным предметам, которые, я надеюсь, будут вам интересны. Например, Ларе рассказывает о шифрах, файловых утилитах, финансовых, статистических расчетах и фракталах. Он числе прочего он приводит код для простого обозре-вателя Internet. Так что, если вам потребуются процедуры для расчета выплат по ссуде, вычисления стандартного отклонения выборки, шифровки файла и т. д., главах Ларса вы найдете все, что нужно.
Сам я написал две главы. Первая содержит три версии синтаксического анализатора с рекурсивным спуском для разбора численных выражений, та-ких, как (10+2)/3. Такой анализатор в ряде ситуаций бывает весьма полезен. Другая глава исследует языковые интерпретаторы. В качестве примера анали-



634Глава 16

Функция CreateResponse(), как и предыдущая, начинается с объявления пары локальных счетчиков. Она создает также одиночную строку sResponse, в которой будет храниться отсылаемый клиенту текст. После этого функция созда-ет файловый объект, в который она потом запишет сконструированную строку:
void CPostApp::CreateResponse(CString sOutputFile, CString slniFile)
{
int i; int nlndex; CString sResponse; CFile fOutput;
Переменная fStatus отслеживает информацию о состоянии файлового объек-та, в частности, дату и время создания и т. п. Значение sKey будет представлять имя ключа, а в sVal будет содержаться ассоциированное с ключом значение:
CFileStatus fStatus; CString sOser; CString sKey; CString sVal;
Действительная обработка начинается с создания заголовков для файла HTML. Как вы видели в программе clock.cpp, в начале указывается, что типом содержимого файла является text/html, чтобы обозреватель знал, как пра-вильно интерпретировать полученный код. Затем специфицируется заголовоч-ная информация HTML, требуемая протоколом, и заглавие генерируемой HTML-страницы:
// Сформировать заголовок HTML                                                            у
sResponse = "Content-type: text/html\r\n"; sResponse += "\r\n"; sResponse +=
"<>DOCTYPE HTML PUBLIC \"-//W30//DTD W3 HTML 3.0//EN\">\r\n" ; sResponse += "<HTML>\r\n"; sResponse += "<HEAD>\r\n";
sResponse += "<TITLE>POST Application</TITLE>\r\n"; sResponse += "</HEAD>\r\n";
Затем начинается цикл for, обрабатывающий строки из строкового массива класса приложения:
for (i = 0; i < m_saParams.GetSize(); i++) {
Цикл будет повторяться до тех пор, пока не будет обработано все содержи-мое INI-файла.
Функция Empty() стирает содержимое объекта-строки, не удаляя при этом сам объект. Строки очищаются, поскольку на каждом проходе цикла они бу-дут содержать другие значения.
sKey.Empty(); sVal.Empty();
Следующий оператор if проверяет, что в текущей строке массива содержит-ся знак равенства - его должна содержать каждая строка INI-файла:
if ((nlndex = m_saParams[i].Find(' = ')) != -1) ( sKey = m_saParams[i].Left(nlndex);



C/C++ в разработках CGI____________________________________________________635
sVal = m_saParams[i].Right(m_saParams[i] .GetLength() - nIndex - 1); } Например, в файле INI может находиться следующая строка: Name = Osborne Reader
Код в операторе if извлекает имя параметра (Name) и присваивает его пере-менной sKey, а затем извлекает значение ключа (Osborne Reader) и записыва-ет его в sVal.
Другой оператор if проверяет, указал ли пользователь значения для пара-метра. Если не указал, ему посылается Web-страница с требованием ввести все данные, а не значения только отдельных полей:
if (sVal == "") {
sResponse += "<Hl>Please enter all data</Hl>\r\n"; break;
'}
После проверки того, что значения для обеих частей строки указаны кор-ректно, информация каждой из них присоединяется к строке sUser:
sUser += "<НЗ>"; sUser += sKey; sUser += ": "; sUser += sVal; SUser += "</H3>\r\n"; }
(Кстати, для форматирования текста, отображаемого на Web-странице, программа применяет тег <НЗ>. Конечно, этот формат можно изменить, что-бы он отвечал требованием вашего приложения.)
После обработки всех имеющихся строк (или при ошибке) цикл завершится и будет выполнен следующий оператор if:
if (i == m_saParams.GetSize()) {
sResponse += "<Hl>Server's Reply:</Hl>\r\n";
sResponse += sUser; }
Он проверяет, что для всех параметров пользователь ввел действительные значения. Если нет, программа просто возвращает сообщение "Введите все дан-ные", которое вы видели выше, а не отображает в странице отклика какие-то ущербные сведения. Если же пользователь все ввел правильно, программа при-соединяет к файлу заглавие и информацию, извлеченную из INI-файла.
Наконец, функция берет код, необходимый для добавления завершающих тегов, соответствующих тем, которые она создала в начале, и присоединяет его в конец страницы. Теперь sResponse содержит законченную страницу HTML:
sResponse += "</BODY>\r\n"; sResponse += "</HTML>\r\n";
Последний оператор if пробует открыть выходной файл. Если ему это удает-ся, строка sResponse сбрасывается в файл. В противном случае его код пропус-кается и программа завершается. Если программа не сумела корректно запи-сать файл, то при выходе из приложения пользователь получит ошибку HTTP.



636Глава 16

if (fOutput.Open(sOutputFile.GetBuffer(0),
CFile::modeCreate | CFile::modeWrite | CFile::typeBinary)) { fOutput.Write(sResponse.GetBuffer(O),sResponse.GetLength()); fOutput.Close();
} }
Использование приложений CGI
Теперь, когда вы выполнили основную часть необходимой для приложения Post работы, нужно организовать на вашем сервере поддержку передачи его CGI-вывода пользователю. Как вы знаете, когда обозреватель извлекает HTML-документ Web, он сначала связывается с сервером и затем запрашивает содержимое документа (обычно он делает это командой HTTP GET). Затем, если документ существует, сервер откликается на запрос, передавая HTML-до-кумент обозревателю, и после передачи закрывает соединение.
Когда вы пишете сценарий CGI, изменения в описанном процессе происхо-дят только со стороны сервера. Обозреватель (клиент) не знает, что сервер ак-тивирует сценарий CGI, и ему неважно, что за данные он получает от сервера. С вашей точки зрения, при написании CGI-сценариев вам нужно позаботиться только о вводе/выводе сервера. Обозреватель свяжется с программой сервера, который в свою очередь запустит ваш сценарий. Сценарий затем выполнит об-работку, необходимую для получения желаемого вывода.
Обычно сервер передает вывод вашего сценария обозревателю через HTML. Для этого к выводу сценария он добавляет необходимую заголовочную инфор-мацию и отсылает все вместе программе обозревателя, первоначально активи-ровавшей сервер. Затем сервер закрывает соединение и ждет следующего'за-проса соединения.
Как вы, возможно, знаете, работающие на 32-битных системах серверы обычно могут одновременно обрабатывать запросы от нескольких пользовате-лей. Это подразумевает, что ваш сценарий может использоваться сразу не-сколькими клиентами, и при этом вам не нужно будет писать какой-то специ-альный код. Как правило, большинство серверов умеют создавать столько па-раллельных экземпляров сценария/программы CGI, сколько их требуетря для обслуживания запросов всех пользователей.
Взаимодействие сервера с программой CGI
Когда сервер активирует ваш сценарий CGI, он должен выполнить несколь-ко ключевых действий, включая следующие:
│  Активировать сценарий, предоставив ему необходимые данные, послан-ные обозревателем
│   Предоставить значения переменных среды, к которым обращается сце-нарий
│   Обработать вывод сценария, в том числе включить в него необходимую заголовочную информацию, чтобы обозреватель мог правильно интер-претировать данные сценария



C/C++ в разработках CGI___________________________________________________637
Как вы знаете, протоколом, используемым при коммуникации клиентов и серверов Web, является HTTP. Информация заголовков HTTP обеспечивает эффективную коммуникацию программ; таким образом, вам нужно внима-тельно изучить заголовочную информацию, передаваемую от сервера обозрева-телю. Например, когда программа сервера готова послать данные, она посыла-ет сначала набор заголовков, описывающих статус данных, их тип (тип содер-жимого файла) и т. д. Обозреватель, в свою очередь, использует заголовок типа содержимого, чтобы подготовиться к обработке данных, которые за ним по-следуют. Сервер отвечает за предоставление этих мета-данных при каждой от-правке данных обозревателю.
Обращение из обозревателя к программе CGI
Нельзя исполнить CGI-сценарий непосредственно из обозревателя. Чтобы использовать сценарий, вы должны найти его на машине сервера HTTP. Что-бы можно было просмотреть вывод CGI-сценария с помощью обозревателя, сервер должен этот сценарий запустить. Как правило, сценарии, доступные серверу, размещают в его каталоге cgi-bin (или cgi\bin, или что-то другое в этом роде). Они должны быть откомпилированы и готовы к исполнению.
Вам нужно также создать страницу клиента, которая будет вызывать ис-полняемый CGI-файл. Страница, пригодная для работы с описываемой про-граммой, будет выглядеть примерно так:
1 <!DOCTYPE HTML PUBLIC "-//W30//DTD W3 HTML 3.0//EN"> <HTML> <HEAD>
<TITLE>C++ Annotated Archives</TITLE> <META NAME="AUTHOR" CONTENT="Osborne Reader"> </HEAD> <BODY> <P>
<Hl>Example using HTTP POST method</Hl> <HR>
<FORM METHOD="POST" ACTION="/cgi-bin/post.exe">
<H2>Enter your name, e-mail address, and phone number, below:</H2> <P> <PRE>
Name: <INPUT NAME="Name" VALUE=""> Address: <INPOT NAME="E-Mail" VALUE=""> Phone: <INPOT NAME="Phone" VALUE>""> </PRE> <P>
To run this form, click this button: <INPOT TYPE="submit" VALUE="Send!"> </FORM> <HR> </BODY> </HTML>
Ключевые моменты здесь заключены в объявлениях формы. Первый раздел файла заканчивается тегом </HEAD>:



638Глава 16

<!DOCTYPE HTML PUBLIC "-//W30//DTD W3 HTML 3.0//EN">
<HTML>
<HEAD>
<TITLE>C++ Annotated Archives</TITLE>
<META NAME^'AUTHOR" CONTENT="Osborne Reader">
</HEAD>
Файл HTML сообщает сначала свой тип, затем некоторую заголовочную ин-формацию и мета-информацию, которую могут читать машины поиска. Он также инициализирует страницу для отображения HTML.
<BODY>
<р>
<Hl>Example using HTTP POST method</Hl>
<HR>
<FORM METHOD="POST" ACTI0N='7cgi-bin/post.exe">
Следующие несколько операторов выполняют некоторое форматирование и предварительное отображение информации. Ключевым здесь, однако, являет-ся тег <FORM>. Он сообщает обозревателю, что далее следует определение формы. Атрибут METHOD говорит форме, что она будет использовать для пе-редачи данных функцию HTTP POST, а атрибут ACTION сообщает клиенту, какую программу нужно вызвать на сервере для выполнения требуемой зада-чи. Заметьте, что программа клиента находится в подкаталоге cgi-bin корнево-го каталога сервера.
<H2>Enter your name, e-mail address, and phone number, below:</H2>
<P>
<PRE>
Name: <INPOT NAME="Name" VALUE=""> Address: <INPOT NAME="E-Mail" VALUE="">                                          ,
Phone: <INPOT NAME="Phone" VALUE=""> </PRE>
Следующие строки отображают действительную форму для ввода данных. Каждое из значений INPUT NAME будет транслировано в имя соответствую-щего ключа INI-файла. Параметр VALUE указывает, что значением каждого из ключей по умолчанию является нулевая строка.
<Р>
То run this form, click this button:
<INPOT TYPE="submit" VALOE="Send!">
</FORM>
<HR>
</BODY>
</HTML>
Наконец, значение TYPE="submit" говорит форме, что она должна отобра-жать кнопку. Когда пользователь на нее нажмет, клиент пошлет информацию серверу с помощью метода POST - это то же самое, как если бы программа сервера вызывалась с несколькими параметрами командной строки.
Когда вы загрузите файл HTML и отошлете введенные в его поля данные, сервер инициирует программу, передаст ей данные в возвратит вам страницу HTML с откликом, генерированным функцией CreateResponseQ.



Научно-техническое издание

Арт Фридман, Ларе Кландер, Марк Михаэлис, Херб Шильдт C/C++. Архив программ
Компьютерная верстка СВ. Лычагина
Подписано в печать 25.12.2000. Формат 70x1001ц. Усл. печ. л. 52.
Гарнитура Школьная. Бумага газетная.                                 >
Печать офсетная. Тираж 4000 экз. Заказ № 1208.
ЗАО <Издательство БИНОМ>, 2001 г.                          '
103473, Москва, Краснопролетарская, 16 Лицензия на издательскую деятельность № 065249 от 26 июня 1997 г.
Международный центр /2?\ International Centre for научной и технической MQn Scientific and Technical информации                      \^s                         Information
Международный центр
научной и технической информации
125252, Москва, ул. Куусинена, д. 21-Б
Лицензия ЛР №090179
Отпечатано в ордена Трудового Красного Знамени ГП <Техническая книга>
Министерства РФ по делам печати,
телерадиовещания и средств массовых коммуникаций.
198005, Санкт-Петербург, Измайловский пр., 29.



 

 

 

 

 

 

 

Новости Главная

Каталог книг

Статьи

Загрузка Карта сайта
Сайт управляется системой uCoz