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

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


Информационный Канал Subscribe.Ru

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

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

Выпуск № 324
от 13.02.2006, 13:30

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


Вопрос № 34946: Помогите пожалуйста написать программу массива,так чтобы он сортировал числа по возрастанию при каждом новом вводе и сдвигал их вправо....
Вопрос № 34968: Привет всем экспертам !!! Возникла такая проблемма : напесал программу а точнее калькулятор под CLR Console Application ну или что-то вроде калькулятора !!! Работал под Microsoft Visual C++ 2005 Express Edition .NET !!! Компелируется без ...
Вопрос № 34969: Помогите пожалуйста решить проблему. Заданиеу меня такое: "Харктеристикой столбца целочисленной матрицы назовём сумму отрицательных нечётных элементов. Переставляя столбцы заданой матрицы, расположить их в соответсвии с ростом характеристик&...
Вопрос № 34978: Здравствуйте уважаемые эксперты. Не могли бы вы обьяснить как используется функция HANDLE FindFirstFile(LPCTSTR lsf, WIN32_FIND_DATA ptr) При передаче параметров, я так понял, в lsf заносится шаблон поиска. Но что он собой пре...
Вопрос № 35012: Здравствуйте, господа эксперты! Кто-нибудь знает как под Линуксом сделать загрузку функции из динамической библиотеки? Типа HMODULE dll = LoadLibrary("mylib.dll"); void * proc = GetProcAddress(dll,"funcname");...

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

Приложение:

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

Отвечает: Zitz
Здравствуйте, Осипов Ефрем Васильевич!

Какая то нелогичная задача, или (что скорее всего) Вы не все сказали...
Отсортировать числа можно функцией qsort, хотя причем тут сдвиг вправо? Запехиваем число в конец массива сортируем и оно встает на нужное место...
Или тут имеется ввиду что нужно написать бинарный поиск со вставкой?
В любом случае, нужно сначала попробывать что-то написать самому, а потом спросить, то что ну никак не можете сделать...
---------
Успех неизбежен
Ответ отправил: Zitz (статус: 6-ой класс)
Отправлен: 07.02.2006, 19:14

Отвечает: Tundravarg
Здравствуйте, Осипов Ефрем Васильевич!
Организовать динамический массив проще в виде связанного списка или дерева.
Каждый элемент таких структур можно описать в виде:
struct Node {
void *target; //Адрес элемента, например числа.
Node *left;
Node *right;
}
1. Связанный список:
Когда мы получаем первое число и создаём первый узел списка в target записываем адрес этого числа, а левую и праву. ссылку инициализируем нулями. При добавлении элемента перед данным левой ссылке данного узла присваивается адрес нового, а правой ссылке нового узла присваивается адрес текущего, короме того левая ссылка нового узла инициализируется нулём. При добавлении нового элемента справа происходит то же самое, только наоборот.
Для организации сортированного списка сначала выбирается текущий элемент, для которого выполняется одно из условий:
* следующий элемент не существует (right == 0);
* значение цели следующего элемента меньше значения цели нового (*((int*)right->target) > *((int*)new->target));
Затем куда-нибуди сохраняем следующий после текущего элемент, добавляем новый после текущего, и бывший следующий добавляем после нового. Таким образом мы вставляем элемент в список между двумя его элементами.
Но сначала надо сделать сравнение с первым узлом, и если его значение больше нового, то новый элемент добавляется слева от первого.
2. Бинарное дерево:
Самый первый элемент создаётся также как и в связанном списке. Отличие заключается в том, что по левой ссылке добавляется элемент, значение которого меньше текущего, а по правой ссылке больший.
Для определения наименьшего элемента мы должны перебирать эелементы, переходя по левым ссылкам, до тех пор, пока левая ссылка элемента не окажется нулём. Для получения наибольшего элемента мы должны переходить по правым ссылкам до конца.
Для отыскания узла, на ветку которого мы будем жобавлять новый нужно делить ряд циклических проверок:
Если теукщий элемент больше нового, то:
Если левая ветвь пуста то назначить на неё новый узел и закончить, иначе сделать текущим элемент на левой ветви и повторить п.1.
Иначе
Если правая ветвь пуста то назначить на неё новый узел и закончить, иначе сделать текущим элемент на правой ветви и повторить п.1.

Может, я здесь не очень понятно всё объяснл, но попробуйте порисовать схемки этих структур и, возможно, всё станет понятно. Здесь я умышленно не привязывался к конкретной реализации на C/C++, чтобы Вы сделали свою реализацию, но если у Вас будет конкретный вопрос по реализации этой системы, то задавайте его.
Ответ отправил: Tundravarg (статус: 1-ый класс)
Отправлен: 08.02.2006, 01:41


Вопрос № 34.968
Привет всем экспертам !!!
Возникла такая проблемма : напесал программу а точнее калькулятор под CLR Console Application ну или что-то вроде калькулятора !!!
Работал под Microsoft Visual C++ 2005 Express Edition .NET !!!
Компелируется без проблем !!!
Но неработает ровно половина !!!
Я скину код вы поймёте !!!
Вначале задаётся вопрос какие операции будут производица с числами
1 - Деление 2- умножение 3 - сложение 4 - вычитание
Нужно ввести цифру и нажать Enter !!!
У меня возникла проблемма с функциями разветвления IF и т.п !!!
Если нетрудно обьясните !!!
Ранише я учил ASM там полегче было с ветвлением !!!
Код прелогается 8) !!!

Приложение:

Отправлен: 07.02.2006, 20:22
Вопрос задал: Tamashev Denis M (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: X-MAN
Здравствуйте, Tamashev Denis M!
Уберите двоеточия после if(...) и else(...)
если стоит двоеточие, выражение в фигурных скобках после него будет выполняться в любом случае!!!
Ответ отправил: X-MAN (статус: 2-ой класс)
Отправлен: 07.02.2006, 20:48
Оценка за ответ: 3
Комментарий оценки:
Уюрал выдаёт ошибку !!!
В else (c == 2) !!!


Отвечает: Ataman N. N.
Здравствуйте, Tamashev Denis M!
В принципе, вместо if здесь можно воспользоваться оператором switch
swith (c)
{
case 1://умножение
break;
case 2://деление
break;
case 3:
break;
case 4:
break;
}
В конце произведенных операций выводим ответ. Это не стандарт, но уменьшает количество кода.
Console::WriteLine(L"Ответ: {0}",d.ToString());

Так должно работать.

#include "stdafx.h"
#using <mscorlib.dll>
using namespace System;

#ifdef _UNICODE
int wmain(void)
#else
int main(void)
#endif

{

double a;
double b;
double c;
double d;


Console::WriteLine(L"Умножение -1,деление -2,сложение -3,вычитание -4");
c = double::Parse(Console::ReadLine());
if (c == 1)
{
Console::WriteLine(L"Введите число которое надо умножить:");

a = double::Parse(Console::ReadLine());
Console::WriteLine(L"*");

b = double::Parse(Console::ReadLine());
d = a*b;
Console::WriteLine(L"Ответ: {0}",d.ToString());
}
if(c == 2)
{
Console::WriteLine(L"Введите число которое будем делить:");

a = double::Parse(Console::ReadLine());
Console::WriteLine(L"/");
b = double::Parse(Console::ReadLine());
d = a/b;
Console::WriteLine(L"Ответ: {0}",d.ToString());
}
if (c == 3)
{
Console::WriteLine(L"Введите число которое будем складывать:");
a = double::Parse(Console::ReadLine());
Console::WriteLine(L"+");
b = double::Parse(Console::ReadLine());
d = a+b;
Console::WriteLine(L"Ответ: {0}",d.ToString());
}
if (c == 4)
{
Console::WriteLine(L"Введите число из которого вычитаем:");
a = double::Parse(Console::ReadLine());
Console::WriteLine("-");
b = double::Parse(Console::ReadLine());
d = a-b;
Console::WriteLine(L"Ответ: {0}",d.ToString());
}
}
Ответ отправил: Ataman N. N. (статус: 6-ой класс)
Отправлен: 07.02.2006, 21:12
Оценка за ответ: 5
Комментарий оценки:
Так что везде If надо было поставить ??? Спасибо =)
А как цвет текста менять неподскажешь ???


Вопрос № 34.969
Помогите пожалуйста решить проблему.
Заданиеу меня такое: "Харктеристикой столбца целочисленной матрицы назовём сумму отрицательных нечётных элементов. Переставляя столбцы заданой матрицы, расположить их в соответсвии с ростом характеристик".
Я тут накидал начало программы, но мне нужно помочь не со всей программой, а конкретно меня интересует как посчитать сумму нечётных элементов и самое главное как отсортировать столбцы в матрице?
Заранее всем большое человеческое спасибо!

Приложение:

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

Отвечает: Raptor1
Здравствуйте, Михайлов Данила Витальевич!
Нетривиальная задача, в принципе можно сделать просто и тупо вручную отсортировав столбцы одним из алгоритмов, благо сейчас их много о описаны они хорошо, но это неспортивно и вообще неинтересно. Попробуем сделать как положено программисту С++. Для того чтобы отсортировать стоблцы нам надо представить их в виде некоторого класса, - упрощенного одномерного массива. Один из вариантов без проверки ошибок представлен ниже. Его конструктор и сама функция сортировки сделаны защищенными так как они небезопасны и пользователя допускать к ним нельзя. Из за этого же объявим класс матрицы другом класса столбца.
template class CMatrix;

template class CColumn
{
public:
virtual ~CColumn()
{
if(Data!=NULL)
delete [] Data;
};

T& operator [](DWORD dwIndex)
{
return Data[dwIndex];
}

T operator [](DWORD dwIndex) const
{
return Data[dwIndex];
}

DWORD GetSize(void) const {return m_dwCount;}

friend class CMatrix;

protected:
static int Compare(const void *obj1, const void *obj2)
{
for(DWORD i=0;i* >(obj1)->GetSize();i++)
{
if((*reinterpret_cast* > (obj1))[i]<(*reinterpret_cast* >(obj2))[i])
return -1;
if((*reinterpret_cast* > (obj1))[i]>(*reinterpret_cast* >(obj2))[i])
return 1;
}
return 0;
}

CColumn(DWORD dwCount):Data(NULL),m_dwCount(0)
{
Data=new T[Count];
m_dwCount=Count;
};

CColumn():Data(NULL),m_dwCount(0)
{
};

void Init(DWORD dwCount)
{
if(Data!=NULL)
delete [] Data;
Data=new T[dwCount];
m_dwCount=dwCount;
}

// один столбец
T* Data;
DWORD m_dwCount;
};
// далее класс матрицы
template class CMatrix
{
public:
void Sort(void)
{
qsort(vData,vData[0].GetSize(),sizeof(CColumn),CColumn::Compare);
}

virtual ~CMatrix()
{
if(vData!=NULL)
delete [] vData;
};

CMatrix(DWORD dwCount):vData(NULL)
{
vData=new CColumn[dwCount];
for(DWORD i=0;i vData[i].Init(dwCount);
};

CColumn& operator [](DWORD dwIndex)
{
return vData[dwIndex];
}

protected:
// много столбцов
CColumn* vData;
};
// и маленький пример использования
CMatrix m1(3);

// первый индекс это столбец, второй строка
m1[0][0]=1;
m1[0][1]=2;
m1[0][2]=3;

m1[1][0]=3;
m1[1][1]=2;
m1[1][2]=1;

m1[2][0]=2;
m1[2][1]=2;
m1[2][2]=2;

m1.Sort();

Вот собственно все, идея я надеюсь понятна, подробности в книгах по С++.
// как посчитать сумму нечётных элементов
ну это просто, в цикле увеличивая счетчик на 2 и переберешь все элменты в конкретном столбце (домашнее задание - модифицировать функцию сортировки чтобы она решала вашу задачу в чистом виде, т.е. сравнивала для сортировки только нечетные элементы)

p.s. Этот код был проверен один раз с использованием приведенного примера и может содержать ошибки.
Ответ отправил: Raptor1 (статус: Студент)
Отправлен: 08.02.2006, 00:28
Оценка за ответ: 5

Отвечает: PROD
Здравствуйте, Михайлов Данила Витальевич!
для хранения "характеристик" столбцов лучше использовать отдельный вектор (с количеством элементов равным количеству столбцов, естественно), выглядеть это будет примерно так:
for (i=0;i<row;i++){
par[i]=0;
for(j=0;j<col;j++){
if((a[i][j]<0) && (a[i][j]%2!=0)
par[i]+=a[i][j];
}
}
а сортировка будет выглядеть примерно:
for(i=0;i<row;i++){
for(j=0;j<row-1-i;j++){
if(par[j]>par[j+1]){
t=par[j];
par[j]=par[j+1];
par[j+1]=t;
for(k=0;k<col;k++){
t=a[k][j];
a[k][j]=a[k][j+1];
a[k][j+1]=t;
}
}
}
}
я это не запускал (некогда), но выглядеть должно примерно так.
(не забывай что у тебя в характеристическом массиве будут накапливатся отрицательные значения, следовательно при сортировке по возрастанию самым большим значением будет самым маленький по модулю)
Ответ отправил: PROD (статус: 3-ий класс)
Отправлен: 08.02.2006, 18:15


Вопрос № 34.978
Здравствуйте уважаемые эксперты.
Не могли бы вы обьяснить как используется функция

HANDLE FindFirstFile(LPCTSTR lsf, WIN32_FIND_DATA ptr)

При передаче параметров, я так понял, в lsf заносится шаблон поиска. Но что он собой представляет? В каком виде его туда пихать? ptr - ссылка на структуру типа WIN32_FIND_DATA, это понятно, но опять таки что туда заносить или что заносит туда функция?
Заранее всем спасибо.
Отправлен: 07.02.2006, 23:53
Вопрос задал: Юра (статус: 2-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: RedDevil
Здравствуйте, Юра!
lsf - это имя файла, в нем так же могут быть символы джокеры - * и ?.
ptr - это возращаемый параметр функцией. В нем содежрится информация о найденном файле или каталоге.
Вот его аттрибуты:
FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_COMPRESSED, FILE_ATTRIBUTE_DIRECTORY,
FILE_ATTRIBUTE_ENCRYPTED, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_OFFLINE, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_REPARSE_POINT , FILE_ATTRIBUTE_SPARSE_FILE, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_TEMPORARY.

Все их описания и дополнительную информацию, смотрите в MSDN. Очень вам советую ее приобрести.

Приложение:

Ответ отправил: RedDevil (статус: 5-ый класс)
Отправлен: 08.02.2006, 07:58


Вопрос № 35.012
Здравствуйте, господа эксперты!
Кто-нибудь знает как под Линуксом сделать загрузку функции из динамической библиотеки? Типа
HMODULE dll = LoadLibrary("mylib.dll");
void * proc = GetProcAddress(dll,"funcname");
Отправлен: 08.02.2006, 13:28
Вопрос задал: Skolod (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: BOIL
Здравствуйте, Skolod!

наилучшая вступительная статья (сам на этом учился) на сайте www.firststeps.ru, выбрать Linux

http://www.firststeps.ru/linux/r.php?8, но мне кажется, что надо проходить последовательно с первого урока (шага)

Удачи!..
Ответ отправил: BOIL (статус: 6-ой класс)
Отправлен: 08.02.2006, 13:37
Оценка за ответ: 5

Отвечает: Straight
Здравствуйте, Skolod!
Используйте dlopen, dlsym, dlfunc

Что-то вроде этого:

# include <dlfcn.h>
handle = dlopen(sofile, RTLD_NOW);
symbol = dlsym(handle, name);

Ответ отправил: Straight (статус: 7-ой класс)
Отправлен: 08.02.2006, 14:10
Оценка за ответ: 5

Отвечает: RedDevil
Здравствуйте, Skolod!
http://www.firststeps.ru/
Раздел линукс - общее. Там целый ряд статей по этому делу.
Ответ отправил: RedDevil (статус: 5-ый класс)
Отправлен: 09.02.2006, 13:06
Оценка за ответ: 5


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

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

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

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

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


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


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.14 (бета) от 09.02.2006
Яндекс Rambler's Top100

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Архив рассылки
Отписаться Вебом Почтой
Вспомнить пароль

В избранное