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

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


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

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

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

Выпуск № 1132
от 14.10.2008, 09:35

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

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


Вопрос № 146431: Уважаемые здравствуйте! Почему определение ф-ии идет в конце? <div style="margin:15px; margin-top:10px"><div><b><font color="gray">Код:</font></b></div><pre style="margin: 0px; padding: 6px; border: 1px inset; width: 650px; height: 100px; text-...
Вопрос № 146450: Здравствуйте глубоко уважаемые эксперты. Помогите пожайлуста с одной маленькой проблемкой. Задание изначально было таким: Разработать программу на языке «Си», реализующую четыре различных алгоритма сортировки одномерного целочисл...
Вопрос № 146468: Добрый день господа! Возникли пару вопросов,будьте добры помогите найти ответы: 1)Как получить контекст устройства? Как это делается в Вашей программе? 2)Как освободить контекст устройства? Как это делается в Вашей программе? 3)Какие API-...

Вопрос № 146.431
Уважаемые здравствуйте!
Почему определение ф-ии идет в конце?
Код:
#include <iostream>
#include <math.h>
using namespace std;
//Объявление рекурсивной ф-и
double f(double,double);
int main()
{
double x=2.76
,y
,i=15;

y=f(i,x);
y+=45;
cout<<" Answer: "<<y<<endl;
return 0;
}
//Определение ф-ии
double f(double i,double x)
{
if (i==0)
return 0;
else
return (f(i-1,x)+sin(i*x));
}


И еще, что делают delete [] R; и delete p; в этом коде?
Код:
//ЗАДАЧА 7
/*
#include <iostream>
#include <time.h>
#include <stdlib.h>

using namespace std;

int main()
{
//Объявление, заполнение и вывод первого массива
const int m=5;
const int n=6;
int V[m][n];

for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
V[i][j]=rand()%20-5;
cout<<V[i][j]<<' ';
}
cout<<endl;
}

//Количество отрицательных элементов нечетных строк< br> int count=0;

//Подсчет count
for(int i=0;i<m;i+=2)
for(int j=0;j<n;j++)
if (V[i][j]<0) count++;

cout<<" Count: "<<count<<" ";

//Массив R
int* R=new int[count];
//Указатель на первый элемент массива R
int* p=R;

//Заполнение массива R
for(int i=0;i<m;i+=2){
for(int j=0;j<n;j++){
if (V[i][j]<0) {
*p=V[i][j];
p++;
}
}
}

//Вывод массива R на экран
for(int i=0;i<count;i++)
cout<<R[i]<<' ';

delete [] R;
delete p;

return 0;
}

смотрел без них, тоже все работает.

Приложение:

Отправлен: 08.10.2008, 11:34
Вопрос задал: Shah-ilya (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: realbustard
Здравствуйте, Shah-ilya!
Где определять ф-ю, в конце или в начале не имеет значения. Если функций используется много и все определены в одном файле, то лучше сначала их объявить перед ф-ей
main() , чтоб было нагляднее, какие ф-ии используются. А принципиальной разницы нет. Просто показал, что можно еще и так.

К сожалению я пока не могу оставлять комментарии в минифорумах вопроса. Поэтому отвечу здесь.
Оператор delete используется для освобождения памяти.
Например, операция delete [] R , освобождает память, выделенную для массива, delete p удаляет указатель. Эта память возвращается в так называемую "кучу" , откуда мы ее и позаимствовали. Освобожденная память может использоваться снова.
Если не производить этих действий, то происходит "утечка памяти". И в большом проекте, ресурсы компьютера могут исчерпаться.

---------
Учись так, как-будто собираешься жить вечно; живи так, как-будто завтра умрешь (Отто фон Бисмарк)
Ответ отправил: realbustard (статус: 4-ый класс)
Ответ отправлен: 08.10.2008, 12:46
Оценка за ответ: 5
Комментарий оценки:
О, спасибо, теперь все ясно. Ну я думаю что для таких маленьких программ, это не столь важно. Еще раз спасибо!


Вопрос № 146.450
Здравствуйте глубоко уважаемые эксперты.

Помогите пожайлуста с одной маленькой проблемкой.

Задание изначально было таким:

Разработать программу на языке «Си», реализующую четыре различных алгоритма сортировки одномерного целочисленного массива. Массив является динамическим, размерность указывается пользователем при запуске программы. Массив должен быть заполнен по выбору пользователя одним из трех вариантов:

∙ по возрастанию
∙ по убыванию
∙ случайными целыми числами в диапазоне от 0 до 100

Пользователь также должен иметь возможность многократно сортировать массив, любым из четырех алгоритмов. Необходимо обеспечить равные условия для работы различных алгоритмов, т.е. все алгоритмы сортировки должны работать над одинаковым массивом (одинаковой исходной последовательностью чисел).

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

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

В данном случае четырьмя различными алгоритмами сортировки одномерного целочисленного массива являются следующие её виды:
1. Пузырьковая сортировка.
2. Сортировка вставкой.
3. Сортировка выбором.
4. Поразрядная сортировка.

Код сделанной программы смотрите в приложении.

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

Заранее спасибо.

Приложение:

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

Отвечает: Sergey A. Wedensky
Здравствуйте, Михаил Степанович!

Сравнение у Вас и так реализовано в функции int menshe(int a, int b), которая вызывается из функций сортировок.

Для реализации присвоения - раскомментируйте строчку
//int assign(int a, int b);
уберите второй параметр 'int b' и напишите тело функции assign:

int assign(int a)
{
n_assign ++;
return a;
}

Везде в алгоритмах сортировки замените операторы присваивания на вызов функции assign и удалите изменение переменной n_assign, примерно так:

// Перестановка большего и меньшего
mmm=b[j-1];
b[j-1]=b[j];
b[j]=mmm;
n_assign+=3;

превратится в

// Перестановка большего и меньшего
mmm = assign(b[j-1]);
b[j-1] = assign(b[j]);
b[j] = assign(mmm);

Простите, самому переписывать некогда... Удачи.
Ответ отправил: Sergey A. Wedensky (статус: Студент)
Ответ отправлен: 08.10.2008, 16:59
Оценка за ответ: 5
Комментарий оценки:
Ответ отличный!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Вопрос № 146.468
Добрый день господа! Возникли пару вопросов,будьте добры помогите найти ответы:
1)Как получить контекст устройства? Как это делается в Вашей программе?
2)Как освободить контекст устройства? Как это делается в Вашей программе?
3)Какие API-функции для рисования графических фигур Вы знаете?
4)В каких случаях окну посылается сообщение WM_PAINT?
5)Какова цель вызова функции InvalidateRect()?
6)Как изменить шрифт?
Отправлен: 08.10.2008, 16:59
Вопрос задал: Иванов Роман Александрович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Verena
Здравствуйте, Иванов Роман Александрович!
Контекст устройства - это внутренняя структура данных, которая определяет набор графических объектов и ассоциированных с ними атрибутов, а также графических режимов, влияющих на вывод. Основные графические объекты - pan (перо для отрисовки линий), brush (кисть для заливки фона и фигур), bitmap (растровое изображение), palette (палитра с доступным набором цветов), font (шрифт), region (регион для отсечения области вывода).
Если необходимо использовать устройство графического вывода (например, экран или принтер), то необходимо получить дескриптор контекста устройства. Когда Windows возвращает такой дескриптор при вызове определённой функции, он как бы даёт программе право использовать устройство, далее дескриптор используется как параметр различных функций вывода для идентификации устройтсва. Поскольку контекст содержит много различной информации, то не прихо дится передавать в функции избыточные повторяющиеся данные.
Windows поддерживает следующие контексты: контекст дисплея, контекст принтера, совместимый контекст, метафайловый контекст, информационный контекст. Наиболее используемым, разумеется, является контекст дисплея, поскольку практически любая программа имеет средства вывода.
В программах с графическим интерфейсом контекст дисплея, как правило, получается при обработке сообщения WM_PAINT при помощи функции BeginPaint (дескриптор_окна, служебная_структура_типа_PAINTSTRUCT) , и обязательно освобождается в конце обработчика с помощью функции EndPaint с теми же параметрами (иначе контекст будет висеть в памяти, бессмысленно поглощая ресурсы компьютера). Вообще, дескриптор контекста дисплея можно получить и другим способом, это может пригодиться, если рисование происходит не в обработчике сообщения WM_PAINT , или цель его получения совсем иная. Для этого существуют т акие функции, как GetDC (описатель_окна) (возвращает контекст дисплея для клиентской области окна) и GetWindowDC (описатель_окна) (возвращает контекст для всего окна). Если передать в эти функции NULL, то вернётся дескриптор устройства для всего экрана. Освобождается таким образом захваченный контекст функцией ReleaseDC (описатель_окна, имеющийся_дескриптор_контекста) . При использовании этого метода можно рисовать в любом месте клиентской области, а не только в так называемом недействительном прямоугольнике (части окна, требуемой обновления, в которой происходит рисование в случае использования BeginPaint).
Также с контекстами устройств можно работать при помощи функций: SaveDC (сохраняет текущее состояние контекста устройства), RestoreDC (восстанавливает контекст устройства к предыдущему состоянию, сохраненному с SaveDC), ResetDC (обновляет m_hAttribDC контекст устройства), GetDeviceCaps (получает определенный вид зависящей от устройств информации относительно данных возможностей устройства дисплея) и некоторых других, обо всех можно почитать в MSDN .
Приложение рисует что-либо в области, реагируя на сообщение WM_PAINT , которое посылается окну при всех случаях, требующих перерисовки окна, как то изменение его размеров или местоположения, появление и исчезновение на переднем плане другого окна или меню, работа полосы прокрутки. В конце концов, приложение может и само инициировать это сообщение при помощи специальных функций InvalidateRect, InvalideteRgn или UpdateWindow . Следует стараться строить программу таким образом, чтобы всё возможное рисование происходило только при появлении сообщения WM_PAINT , хотя, конечно, существуют случаи, в которых это правило приходится нарушать.
Функция InvalidateRect, наряду с InvalideteRgn , используется для генерирования сообщения WM_PAINT для перерисовки определённой области окна. Выглядит она так:
bool InvalidateRect (HWND hWnd, CONST RECT* lpRect, BOOL bErase);
Здесь
hWnd - дескриптор окна, где происходит обновление. Если передано NULL, то обновляются и перерисовываются все окна приложения и посылаются сообщения WM_ERASEBKGND и WM_NCPAINT.
lpRect - указатель на структуру типа RECT, содержащие координаты прямоугольника, который необходимо обновить. Если передано NULL, то обновляется всё окно.
bErase - будет ли с тираться фон (true - стирается, но может привести к нежелательным эффектам).

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

Про шрифт не совсем поняла, что Вы хотели, если в смысле сменить шрифт в контексте устройства, возможно, вот этот пример Вам подойдёт ссылка>>.

P.S.: А уж как это всё используется в Вашей программе, Вам лучше знать...

Удачи!
---------
Эта история - не для истории, понимаешь?
Ответ отправила: Verena (статус: Практикант)
Ответ отправлен: 09.10.2008, 18:41
Оценка за ответ: 5
Комментарий оценки:
Аргументированный ответ!


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

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

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

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

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

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


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


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

∙ Версия системы: 5.5 от 09.10.2008

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

В избранное