Вопрос № 143293: Здравствуйте! Столкнулся с такой задачей, что нужно переложить скрипт с PHP на C++. Установил Microsoft Visual Studio v6.0, начал изучать документацию по C++ и столкнулся с тем, что в этом языке нет поддержки регулярных выражений. Запрос к Гуглу и...Вопрос № 143310: <font color="red"> Приветствую, вас, уважаемые эксперты! </font>Мне необходима ваша помощь.Необходимо написать программульку на C++.NET следующего
содержания: Кубический резервуар со стороной N метров заполняется через две трубы квадратного сечени...Вопрос № 143353: <b> И снова я рад приветствовать уважаемых экспертов! </b> Обращуюсь к вам за помощью в решении задачки на С++.NET: <i> Заданы координаты точек (xA,yA), (xB,yB) и (xC,yC) лежащих на трех разных окружностях (их коды - A,B и C) с центрами в начал...
<
table width=100% cellpadding=4 class=A>
Вопрос № 143.293
Здравствуйте! Столкнулся с такой задачей, что нужно переложить скрипт с PHP на C++. Установил Microsoft Visual Studio v6.0, начал изучать документацию по C++ и столкнулся с тем, что в этом языке нет поддержки регулярных выражений. Запрос к Гуглу или Яндексу показал, что можно использовать сторонние библиотеки, такие как PCRE (www.pcre.org).
В силу того, что с C++ я не знаком, у меня появился вопрос, как включить поддержку регулярных выражений в программу? Да, на сайте www.pcre.org есть описание
установки этой библиотеки, но Английский язык для меня трудноват, да и с C++ я знаком буквально неделю. Хотелось бы узнать от вас, как можно правильно подключить эту библиотеку в свою программу и заставить работать простой пример с http://www.webcode.ru/re/pcre/.
Отправлен: 07.09.2008, 19:28
Вопрос задал: Cimus (статус: Студент)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: mega
Здравствуйте, Cimus!
да, действительно, Си не поддерживают регулярные выражения, но похоже лишь потому, что он обладает другой техноглогией ввода-вывода: scanf-printf, эта пара функций в общем случае предоставляет более широкий механизм форматирования и поиска (есть разве что один недостаток по отношению к регулярным выражениям: повторный ввод шаблона невозможен)
документация на русском языке сейчас уже не проблема, любой поисковик может предоставить вам множество русскоязычных сайтов-прототипов
SDK с полным или частичным описанием функций, достаточно просто ввести название функции в форму поиска (но ориентироваться по структуре смежных API лучше всетаки с оригинала: http://msdn.microsoft.com/)
вот, к примеру, что выдал google: для scanf: http://www.codenet.ru/progr/cpp/spru/scanf.php для printf: http://www.codenet.ru/progr/cpp/spru/printf.php
эти функции форматируют ввод-вывод в файлы, аналогично существует набор функций для ввода-выв
ода в/из памяти: sscanf-sprintf, но их формат практически не отличается от scanf-printf, поэтому достаточно изучить только эту пару функций
соответствие шаблону в этом случае можно определять несколькими способами:
1. анализировать результат scanf-sscanf (он равен числу считанных выражений, заданных шаблоном), к примеру: на шаблон "мама мыла %*d рам" результат будет 1, если строка соответствует шаблону, а вот шаблон еще и с ожиданием строки: "мама %*s мыла %*d рам" или "мама
%*[^0x20] мыла %*d рам" (соответствие: "мама Зина мыла 5 рам", "мама Наташа мыла 9 рам" и т.п.) здесь уже 2 выражения, следовательно scanf-sscanf вернет 2 в случае успеха.
2. анализировать результат контрольного выражения, например sscanf(src,"мама мыла %*d рам%n",&n) выставит в переменную n номер символа, на котором анализ строки был завершен, так, при этом инициализируя n = -1 можно убедиться в соответствии строки шабло
ну: если n не изменился, значит строка не подходит, иначе - подходит вплоть до выражения "%n"
3. существует еще один неявный способ: анализ считывающего маркера _ptr в структуре FILE, который после вызова sscanf-sprintf указывает на конец строки, либо на первый символ, не соответствующий шаблону.
PS: выражение "%n" не учитается на возврате из scanf-sscanf, поэтому во втором случае успешный результат будет так же 1, все остальные выражения обязательно учитаются PS: как мы
видим, формат scanf немного похож на регулярные выражения, но на самом деле все с точностью до наоборот: регулярные выражения - урезанный аналог scanf.
Ответ отправил: mega (статус: 4-ый класс)
Ответ отправлен: 08.09.2008, 15:24 Оценка за ответ: 5 Комментарий оценки: Достаточно развёрнутый ответ! Хоть я и не получил ответа но свой вопрос, но ответом более чем доволен! Спасибо!
Вопрос № 143.310
Приветствую, вас, уважаемые эксперты! Мне необходима ваша помощь.Необходимо написать программульку на C++.NET следующего содержания: Кубический резервуар со стороной N метров заполняется через две трубы квадратного сечения со стороной M сантиметров. Скорость течения жидкости V сантиметров в секунду. Сверху резервуар открыт и идет дождь, давая дополнительно L кубических метров воды в час.
Вопрос: Какой процент заполнения даст дождь ? Надеясь на вашу помощь, я вас
сердечно благодарю!
Отвечает: Терсков Сергей
Здравствуйте, Смирнов Сергей Витальевич! Размеры резервуара в данном случае нас не интересуют. Нам нужно узнать лишь соотношение количества воды поступающей из труб и от дождя. После приведения всех величин к метрическим (все сантиметры переведем в метры и время в секунды), получим следующую формулу: L/(M*M*V*2 + L) * 100. В самой программе проблем уже нет. Нужно лишь ввести нужные переменные и рассчитать по приведенной формуле результат.
Код:
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
double M;
cout << "Input M (centimeter): "; cin >> M; M /= 100;
double L;
cout << "Input L (meter^3): "; cin >> L; L /= 360
0;
double V;
cout << "Input V (centimeter per second): "; cin >> V; V /= 100;
double rain_percent = L/(M*M*V*2 + L) * 100;
cout << endl << "Percent of filling the reservoir by rain is: " << rain_percent << "%" << endl;
return 0; }
Ответ отправил: Терсков Сергей (статус: Специалист)
Ответ отправлен: 08.09.2008, 08:04 Оценка за ответ: 5 Комментарий оценки: Очень доволен ответом Терского Сергея (действительно специалист) и очень благодарен ему и самой редакции сайта за такую важную поддержку ваших посетителей
Ещё раз-огромное вам спасибо!!!
Вопрос № 143.353
И снова я рад приветствовать уважаемых экспертов! Обращуюсь к вам за помощью в решении задачки на С++.NET: Заданы координаты точек (xA,yA), (xB,yB) и (xC,yC) лежащих на трех разных окружностях (их коды - A,B и C) с центрами в начале координат. Вывести коды этих окружностей и их длины в порядке убывания.
Отвечает: Терсков Сергей
Здравствуйте, Смирнов Сергей Витальевич! Все достаточно просто. Для начала вычисляем радиусы окружностей (r^2 = x^2 + y^2), и их длины (2*PI*r). Сортируем массив окружностей по убыванию и выводим на экран. Код примерно такой:
Ответ отправил: Терсков Сергей (статус: Специалист)
Ответ отправлен: 09.09.2008, 09:42 Оценка за ответ: 5 Комментарий оценки: Я поставил отлично, потому что быть не довольным таким развернутым ответом невозможно.
Ответ построен очень грамотно(а сам код можно сказать как "изюминка"
И ещё раз хочу поблагодарить этого замечательного специалиста за его помощь посетителям этого сайта!