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

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


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

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

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

Выпуск № 1014
от 04.03.2008, 09:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 478, Экспертов: 50
В номере:Вопросов: 7, Ответов: 9

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


Вопрос № 125066: Здравствуйте, уважаемые эксперты! Помогите, пожалуйста, выявить ошибки. Задание такое: "1. Создайте шаблон класса Point для хранения координат любого типа (int, float, double). Продемонстрируйте работу с созданным шаблоном класса." В пр...
Вопрос № 125068: Уважаемые эксперты! Помогите в решении тривиально проблемы: нужно отправить число (int32) на url, открыв этот url в дефолтном браузере. Браузер открываю: ShellExecute(NULL, "open", "http://www.myurl.com", NULL, NULL, SW_S...
Вопрос № 125069: вопрос как написать код программы для определения места нахождения точки относительно двух кругов с координатами центров в точке (0:0) ...
Вопрос № 125078: Уважаемые эксперты, нужна помощь в решении двух программ (заранее спасибо): 1.Даны два массива, упорядоченных по возростанию: А[n] и B[m]. Сформируйте массив C[n+m], состоящий из элементов массивов А и В, упорядоченный по возростанию. <...
Вопрос № 125170: Здравствуйте! Задача такого плана: у меня есть файл, в котором находятся какие-то данные (числовые). Я собираюсь поместить всё его содержимое в динамический массив, и совершить арифметические операции. Вывод - тоже в файл. 1. Как пр...
Вопрос № 125180: Уважаемые эксперты! Прошу помощи в решении задачи «Быстрое возведение в целую неотрицательную степень. Числа Армстронга». Краткая справка: Числами Армстронга называют такие n-значные числа, которые равны сумме n ных степеней составляющих...
Вопрос № 125205: Добрый день эксперты! У меня вопрос связан с протоколом smtp и средой разработки VC++ 6.0 SP6. Приложение под Win32. Написал программу, и в ней есть модуль для отправки данных по smtp протоколу: отправка пакета: send(sock,tSendPacket,strlen(t...

Вопрос № 125.066
Здравствуйте, уважаемые эксперты!
Помогите, пожалуйста, выявить ошибки. Задание такое: "1. Создайте шаблон класса Point для хранения координат любого типа (int, float, double). Продемонстрируйте работу с созданным шаблоном класса." В приложении результат моих мучений... Что не так? Большое спасибо!

Приложение:

Отправлен: 27.02.2008, 10:12
Вопрос задал: Mangoost (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Verena
Здравствуйте, Mangoost!
Ну, по сути у Вас практически всё верно, если, конечно, Вам достаточно такого скромного функционала шаблона. Ошибки скорей синтаксические. Например, я не поняла, что Вы хотели сказать вот этой строкой:
Point coorint[]={xint,yint};
Если имелся в виду массив координат, то так проинициализировать его не получится, хотя бы потому, что у Вас нет конструктора без параметров, впрочем, конструкция в любом случае неподходящая. Если же Вы хотели объявить один экземпляр класса, то это надо делать так:
Point coorint (xint,yint);
Скобочки после объявления - вызов конструктора.
Потом, Вы вызываете не ту переменную в предпоследней строке, к тому же вызов функции должен сопровождаться либо списком параметров, либо пустыми скобками, если параментров нет. Также не ясно, зачем Вам два параметра в методе Print, если по логике она должна распечатывать координаты из класса. И нехорошо перекрывать переменную из области видимости класса внутри метода (т.е. называть переменные или параметры метода также, как поля класса, см. параметры Print-а). Ну ещё по мелочи подправила опечатки.
В приложении подправленная программа.

Приложение:

---------
Эта история - не для истории, понимаешь?

Ответ отправила: Verena (статус: Студент)
Ответ отправлен: 27.02.2008, 15:22
Оценка за ответ: 5

Отвечает: Терсков Сергей
Здравствуйте, Mangoost!
Судя по вашему коду, вы не очень хорошо разбираетесь в ООП и его реализации на С++. Сначала нужно хорошо изучить теорию, а уже потом браться за практику. И начинать нужно совсем не с шаблонных классов, а с чего нибудь более простого. Предыдущий эксперт указал вам на все ошибки в коде, поэтому повторяться не буду. Мой вариант вашей задачи смотрите в приложении.

Приложение:

Ответ отправил: Терсков Сергей (статус: Практикант)
Ответ отправлен: 28.02.2008, 03:45


Вопрос № 125.068
Уважаемые эксперты!
Помогите в решении тривиально проблемы: нужно отправить число (int32) на url, открыв этот url в дефолтном браузере. Браузер открываю:
ShellExecute(NULL, "open", "http://www.myurl.com", NULL, NULL, SW_SHOWNORMAL). Как передать int на url?
Отправлен: 27.02.2008, 10:33
Вопрос задал: Агафонов Валентин Сергеевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: Ross
Здравствуйте, Агафонов Валентин Сергеевич!

Если на сервере есть например php-скрипт, который должен обрабатывать это число, то проще всего передать его прямо в самом урл:
http://www.myurl.com/get-val.php?val=1234

Строчку можно сформировать используя stringstream, strstream, sprintf(крайне не рекомендуется) или snprintf (в компиляторе Visual Studio она называется _snprintf):

char dst_buffer[64] = "";
_snprintf(dst_buffer,64,"http://myurl.com/get-val.php?val=%d",1234);

---------
Доступно только то, что видимо (c) Б. Керниган
Ответ отправил: Ross (статус: Студент)
Ответ отправлен: 27.02.2008, 16:53


Вопрос № 125.069
вопрос как написать код программы для определения места нахождения точки относительно двух кругов с координатами центров в точке (0:0)
Отправлен: 27.02.2008, 10:35
Вопрос задал: Логачёв Андрей Алексеевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: Mihasic
Здравствуйте, Логачёв Андрей Алексеевич !

допустим радиусы окружностей r и R, при чем r < R
координаты точки (x, y)

(пусть тип всех перечисленных переменных double)

попадание на границы в данном примере я не рассматривал, тем более нужно определить точность попадания. т.е. числа с плавающей запятой сравниваются обычно как:
abs(a-b) < eps
(eps - точность)
это вместо a==b

Приложение:

Ответ отправил: Mihasic (статус: 10-ый класс)
Ответ отправлен: 27.02.2008, 11:00
Оценка за ответ: 5


Вопрос № 125.078
Уважаемые эксперты, нужна помощь в решении двух программ (заранее спасибо):

1.Даны два массива, упорядоченных по возростанию: А[n] и B[m]. Сформируйте массив C[n+m], состоящий из элементов массивов А и В, упорядоченный по возростанию.

2.Даны два массива : А[n] и B[m]. Необходимо создать третий массив, в котором нужно собрать:
*Элементы обоих массивов;
*Общие элементы двух массивов;
*Элементы массива A, которые не включаются в B;
*Элементы массива B, которые не включаются в A;
*Элементы массивов A и B, коотрые не являются общими дял них (то есть объединение результатов двух предыдущих вариантов).
Отправлен: 27.02.2008, 11:15
Вопрос задал: Биюн Виктор Павлович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Терсков Сергей
Здравствуйте, Биюн Виктор Павлович!
Варинт решения вашей задачи смотрите в приложении...

Приложение:

Ответ отправил: Терсков Сергей (статус: Практикант)
Ответ отправлен: 28.02.2008, 04:38
Оценка за ответ: 5
Комментарий оценки:
Спасибо!Профессиональный ответ.


Вопрос № 125.170
Здравствуйте!

Задача такого плана: у меня есть файл, в котором находятся какие-то данные (числовые). Я собираюсь поместить всё его содержимое в динамический массив, и совершить арифметические операции. Вывод - тоже в файл.

1. Как правильно организовать чтение с файла и запись в файл? Насколько я понимаю - есть способы С и есть способы С++ - что безопасней, надёжней и быстрей? Я думаю использовать fopen fgets fprint fputs. Если возможно, приведите примеры.

2. Как осуществить проверку, что в массив пойдут не буквенные символы (ошибочный ввод), а числа? Сделать проверку по ASCII коду? Как?

3. Как подсчитать в динамическом массиве количество занятых ячеек? После выделения памяти для динамического массива, чем он забивается? Нулями, или там "мусор"?

4. Как сделать ассемблерную вставку?

5. Где можно найти свободно распостраняемые библиотеки? Компилятор у меня фриварный - BC 5.5, но там отсутствуют графические бибилиотеки.

Заранее вам спасибо.
Отправлен: 27.02.2008, 20:30
Вопрос задал: VeRTeX (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: kool
Здравствуйте, VeRTeX!
1) Если программа под DOS, то лучше читать и записывать блоками
fread, fwrite. Если под винды - иногда очень быстро отображение файла на память.
Примеры в help или MSDN.
2) Сделать в цикле проверку по коду содержимого буфера который будет передаваться в файл.
3) Никак нужно следить за этим самому. Считайте что там мусор.
4) __asm{
//ассемблерная вставка.
}
Удачи!
---------
I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 27.02.2008, 23:06
Оценка за ответ: 5
Комментарий оценки:
Спасибо, что ответили! Правда, не совсем понятен ответ по первому пункту, rtfm я и сам могу написать... А дело в том, что у меня довольно таки мало времени на штудирование мануалов, иначе бы я не спрашивал помощи... Но, всё равно спасибо, Ваши ответы полезны.

Отвечает: Ross
Здравствуйте, VeRTeX!

1) По скорости и библиотеки С и классы fstream в C++ практически одинаковы. Применимо к вашему примеру(ASCII файл с числами) наверно будет удобнее использовать файловые потоки С++, т.к. они позволяют сразу преобразовывать текстовые данные в нужный вам тип (при этом также осуществляется и проверка). Например:
//создаем фаловый поток
ifstream in_file("input.txt");

int val;

//читаем значение типа int
in_file >> val;

//проверяем правильность
if (in_file.fail()) //если истина, зн чтение прошло некорректно

запись осуществляется также элементарно:
ofstream out_file("output.txt");
out_file << 1234 << " " << 4321;
out_file.close();

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

3) Количество занятых ячеек конечно придется считать вручную (что не так уж сложно, вы же сами в них чтото записываете). В динамически созданном массиве первоначально будет мусор. Нулями инициализируются только обычные массивы, созданные со спецификатором static.

4) __asm {}

5) Посоветовал бы выбрать компилятор поновее, т.к. ваш скорее всего не поддерживает последние изменения принятые в стандарте языка (ту же библиотеку stl к примеру). Из хороших компиляторов под windows обычно выделяют портированный под windows gcc - компилятор с открытым исходным кодом (http://gcc.gnu.org) и компилятор, который входит в состав среды разработки MS Visual Studio (беплатную express версию можно скачать с сайта майкрософт)
---------
Доступно только то, что видимо (c) Б. Керниган
Ответ отправил: Ross (статус: Студент)
Ответ отправлен: 28.02.2008, 01:02
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо за ответ! Касательно 5-го пункта, насколько я понял, gcc качается в исходниках, и его надо компилировать у себя на машине. По крайней мере, такой вывод я сделал из-за того, что скачанный мной последний билд был представлен в исходниках. Под windows готовой сборки я не нашёл. По первому пункту я не очень понял - "В таком случае лучше сначала считывать файл в буфер (функцией read()), а затем разбирать уже его (используя strstream например)" - как это реализовать?


Вопрос № 125.180
Уважаемые эксперты! Прошу помощи в решении задачи «Быстрое возведение в целую неотрицательную степень.
Числа Армстронга».
Краткая справка:
Числами Армстронга называют такие n-значные числа, которые равны сумме n ных степеней составляющих их цифр. Число n называют основанием соответствующего числа Армстронга.
Задание(НА ЯЗЫКЕ С, НЕ С++):
1. Составить функцию по шаблону
unsigned long intpower( unsigned long a, unsigned long n ) возводящую a в степень n с использованием инвараинтного алгоритма.
2. Испльзуя полученную функцию составить программу, находящую все числа Армстронга с основаниями от 2 до целого положительного M < 8.
3. Вывести на экран найденные числа и их основания.
Отправлен: 27.02.2008, 21:49
Вопрос задал: Alex09 (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Терсков Сергей
Здравствуйте, Alex09!
Идентичный вопрос (правда с описанием инвариантного алгоритма) №124683. Код переделанный на С (изменяется только вывод с cout на printf) смотрите в приложении...

Приложение:

Ответ отправил: Терсков Сергей (статус: Практикант)
Ответ отправлен: 28.02.2008, 03:58
Оценка за ответ: 4


Вопрос № 125.205
Добрый день эксперты! У меня вопрос связан с протоколом smtp и средой разработки VC++ 6.0 SP6. Приложение под Win32.
Написал программу, и в ней есть модуль для отправки данных по smtp протоколу:
отправка пакета: send(sock,tSendPacket,strlen(tSendPacket),0);
прием ответа: recv(sock,pReportBuffer,strlen(pReportBuffer),0));
Вроде бы все запросы(почту) нормально отправляло в режиме конфигурации "Win32 Debug", потом поменял конфигурацию на "Win32 Release", и тут появились проблемы, пакеты перестали отправляться, сначала не мог понять, но потом нашел ошибку:
нужно было на прием ответа писать:
recv(sock,pReportBuffer,512,0)) - (т.е. третий параметр я для примера поставил здесь 512, т.е.размер в байтах буфера для приема данных - pReportBuffer). И после этого все отлично заработало и в Debug и в Release режиме.
Вопрос: почему у меня с неправильным третьим параметром команды recv в режиме Debug все нормально работало, а в Release обнаружилось что я неправильно написал. Причем в Debug у меня все нормально показывало все ответы от smtp сервера, когда проходил под отладкой: и приветствия сервера, и авторизация: (220 ...., 250...., 334 ..... и т.д.)т.д.

Приложение:

Отправлен: 28.02.2008, 02:30
Вопрос задал: Алексей Ч. (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Ross
Здравствуйте, Алексей Ч.!

Функция strlen возвращает длину строки, переданной ей указателем. Поскольку строка в с++ это массив символов, который заканчивается 0, то функция strlen по сути просто считает все символы, пока не встретит 0:

int strlen(const char* s)
{
for (int len=0; *s; ++s,++len);
return len;
}

Вы же передаете в функцию strlen только что созданный массив, в котором содержится мусор, что конечно же некорректно. В debug версии 0 там попался не сразу, поэтому создалась иллюзия, что программа работает нормально, вот и все. Просто указывайте в функции recv размер всего буфера.
Кстати завершающий строку 0 вы не учли и в отправке сообщения. Полная длина строки = strlen(s)+1
---------
Доступно только то, что видимо (c) Б. Керниган
Ответ отправил: Ross (статус: Студент)
Ответ отправлен: 29.02.2008, 00:38
Оценка за ответ: 5


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

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

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

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

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

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


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


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.71 от 27.02.2008
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное