Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1104
от 13.09.2008, 18:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 430, Экспертов: 38
В номере:Вопросов: 3, Ответов: 3

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 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 кубических метров воды в час.

Вопрос: Какой процент заполнения даст дождь ?
Надеясь на вашу помощь, я вас сердечно благодарю!
Отправлен: 07.09.2008, 22:03
Вопрос задал: Смирнов Сергей Витальевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Терсков Сергей
Здравствуйте, Смирнов Сергей Витальевич!
Размеры резервуара в данном случае нас не интересуют. Нам нужно узнать лишь соотношение количества воды поступающей из труб и от дождя. После приведения всех величин к метрическим (все сантиметры переведем в метры и время в секунды), получим следующую формулу: 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) с центрами в начале координат. Вывести коды этих окружностей и их длины в порядке убывания.

Заранее огромное спасибо!!!
Отправлен: 08.09.2008, 15:05
Вопрос задал: Смирнов Сергей Витальевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Терсков Сергей
Здравствуйте, Смирнов Сергей Витальевич!
Все достаточно просто. Для начала вычисляем радиусы окружностей (r^2 = x^2 + y^2), и их длины (2*PI*r). Сортируем массив окружностей по убыванию и выводим на экран. Код примерно такой:
Код:
#include <math.h>
#include <algorithm>
#include <functional>
#include <vector>
#include <iostream>

using namespace std;

const double PI = 3.1415926535897932384626433832795;

struct circle {

double radius;
char code;

circle()
: radius(0.0)
, code(' ') {
}

circle(double x, double y, char c) {

radius = sqrt(x*x + y*y);
code = c;
}

bool operator < (const circle& c) const {

return r adius < c.radius;
}

bool operator > (const circle& c) const {

return !(*this < c);
}

double length() const {

return radius * PI * 2;
}
};

int main(int argc, char* argv[]) {

vector<circle> v(3);

v[0] = circle(5.6, 2.3, 'A');
v[1] = circle(-10.1, 4.7, 'B');
v[2] = circle(7.4, -12.3, 'C');

sort(v.begin(), v.end(), greater<circle>());

for(vector<circle>::iterator iter = v.begin();
iter != v.end();
++iter)
cout << "Circle: " << iter->code << ", length: " << iter->length() << endl;

return 0;
}
Ответ отправил: Терсков Сергей (статус: Специалист)
Ответ отправлен: 09.09.2008, 09:42
Оценка за ответ: 5
Комментарий оценки:
Я поставил отлично, потому что быть не довольным таким развернутым ответом невозможно. Ответ построен очень грамотно(а сам код можно сказать как "изюминка" И ещё раз хочу поблагодарить этого замечательного специалиста за его помощь посетителям этого сайта!


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале

∙ Версия системы: 5.3 RC 2 от 09.09.2008

Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное