Содержимое файлов сателитов файла 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.
|