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

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


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

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

Выпуск № 821
от 15.08.2007, 15:35

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


Вопрос № 97849: Подскажите пожалуйста, как можно прочесть матрицу из текстового файла?Заранее большое спасибо....
Вопрос № 97850: Здравствуйте! Проблемка есть вот такой код void __fastcall TForm1::SpeedButton5Click(TObject *Sender) { Application->CreateForm(__classid(TForm2), &Form2); .... .... .... } так вот при компиляции выдае...
Вопрос № 97851: Здравствуйте! Начал осваивать Visual Studio 2005 и наступил на грабли. Делаю простой пример: на форме кнопка, по нажатию на которую появляется MessageBox. Код обработчика события в приложении. Так вот при компиляции выдается следующая ошибка:...
Вопрос № 97867: Изучаю перегрузку функций, VC++ 2005 Express edition beta 2; при компиляции выдается следующее сообщение: Error 1 error C2668: 'print' : ambiguous call to overloaded function c:documents and settingspatriotix-nмои документыvisual stu...
Вопрос № 97868: Здравствуйте, Уважаемые Эксперты. Мой вопрос касается больше теоретическо-методической стороны изученмя С++, чем конкретно какой-нибудь проблемы.Но в то же время мне нужен точный и, самое главное, действенный, совет . Вообщем. появилось желание и...
Вопрос № 97877: Здравствуйте, уважаемые эксперты.Помогите начинающему разобраться с наследованием: Имеем наследование: class Basic { protected: int proti; public: int pubi; public: void GetVal(void)const {cout<<"pu...
Вопрос № 97890: HELP ME!!!Каждый из m станков может обрабатывать n типов деталей. Известны резервы времени работы станков ai, i=1..m, и число деталей каждого вида bj, j=1..n. Известно время обработки каждой детали на каждом станке tij, i=1..m, j=1..n. Определить...

Вопрос № 97.849
Подскажите пожалуйста, как можно прочесть матрицу из текстового файла?Заранее большое спасибо.
Отправлен: 09.08.2007, 15:25
Вопрос задал: Nimere (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Aristos
Здравствуйте, Nimere!

Если известно количество строк и столбцов в матрице, то прочитать её можно так:

int matrix[4][3];
int rows = 4; // количество строк
int cols = 3; // количество столбцов

std::ifstream fin("c:/matrix.txt");
for (int i = 0; i < 4; i ++)
{
for (int j = 0; j < 3; j ++)
{
fin >> matrix[i][j];
}
}

может потребоваться включить следующий заголовок:
#include <fstream>
или fstream.h

Приложение:

Ответ отправил: Aristos (статус: 2-ой класс)
Ответ отправлен: 09.08.2007, 17:16
Оценка за ответ: 5

Отвечает: Василенко Алексей Васильевич
Здравствуйте, Nimere!
для того. чтоб прочитать матрицу А*В из файла можно использовать принципиально 2а подхода:
1 - считывать каждое значение с новой строки;
2 - считывать ряд и однй строки используя какой нить разделитель.

для удобства я ингда использовал еще 2е стороки добавочной информации.
1ая строка - А, 2ая - В (или наоборот).

на практике 1й способ проще для обработки, 2й - нагляднее.

P.S.: как вариант можно в 1й вариант добавить разделитель, как признак конца строки(1й -1 способ).

Приложение:

---------
Готовых решений небыло, нет и не будет... вся жизнь - это лишь размышления на тему

Ответ отправил: Василенко Алексей Васильевич (статус: 3-ий класс)
Ответ отправлен: 09.08.2007, 21:54

Отвечает: Maxim V.G.
Здравствуйте, Nimere!
Предложу ещё один вариант:
Пускай файл имеет структуру где первые 2 цифры это размерность матрицы, а дальше идёт сама матрицы указанной размерности.
Считываем все символы из файла в буфер.
Затем проверяем является ли каждый символ числом. Потом конвертим в int (float) в зависимости от постановки задачи и пишем в массив размер которой задан первыми 2мя символами в файле.
---------
Жить вредно - от неё умирают
Ответ отправил: Maxim V.G. (статус: 3-ий класс)
Ответ отправлен: 10.08.2007, 00:45


Вопрос № 97.850
Здравствуйте! Проблемка
есть вот такой код
void __fastcall TForm1::SpeedButton5Click(TObject *Sender)
{
Application->CreateForm(__classid(TForm2), &Form2);
....
....
....
}

так вот при компиляции выдает ошибку:
Е2303 Type name expected
E2121 Function call missing )
хотя все имена перечислены

Помогите пож-та
Отправлен: 09.08.2007, 15:29
Вопрос задала: FoxLady (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Sov
Здравствуйте, FoxLady!
Создаем проект, на форме 1 кнопка
Добавляем еще одну форму File->New->Form
Редактируем файлы

Приложение:

Ответ отправил: Sov (статус: 6-ой класс)
Ответ отправлен: 09.08.2007, 17:50

Отвечает: Усова Татьяна Владимировна
Здравствуйте, FoxLady!

Для того, чтобы это сработало, надо в модуль формы Form1 включить заголовочный файл модуля формы Form2. Если имя этого файла Unit2.h, тможно вручную включить в модуль формы Form1 директиву препроцессора
#include "Unit2.h"
То же самое можно сделать, выполнив команду главного меню File|Include Unit Hdr и выбрав в появившемся диалоговом окне имя нужного файла. Тогда указанная выше директива препроцессора будет записана в модуль автоматически. (цитата из книги А.Я. Архангельского "С++ Builder 6").

Советую скачать или купить ее
Ответ отправила: Усова Татьяна Владимировна (статус: 1-ый класс)
Ответ отправлен: 10.08.2007, 06:55


Вопрос № 97.851
Здравствуйте! Начал осваивать Visual Studio 2005 и наступил на грабли.
Делаю простой пример: на форме кнопка, по нажатию на которую появляется MessageBox. Код обработчика события в приложении.
Так вот при компиляции выдается следующая ошибка:

error C2664: 'CWnd::MessageBoxW' : cannot convert parameter 1 from 'const char [28]' to 'LPCTSTR'

Пример вызова функции MessageBox скопировал из МСДН.
Не понимаю в чем проблема.
Заранее благодарен.

Приложение:

Отправлен: 09.08.2007, 15:45
Вопрос задал: Goretsky Anton (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Sergey A. Wedensky
Здравствуйте, Goretsky Anton!

Подобное обсуждалось неоднократно.
В настройках проекта у Вас указано использование юникода. Компилятор разыменовывает макрос MessageBox в вызов функции MessageBoxW (обратите внимание на W - юникодная версия), которая принимает в качестве строковых параметров wchar_t*, а Вы ей пытаетесь передать char*.
LPCTSTR - это тоже макрос, который при использовании юникода определен как wchar_t*.

Решения: (1) изменить используемую кодировку на ANSI или MBCS в настройках проекта (Project|Properties|Configuration Properties|General|Character Set, кажется) либо (2) передавать в функцию указатель на wide char (например L"Help, Something went wrong." или _T("Help, Something went wrong.") для строковой константы).
Ответ отправил: Sergey A. Wedensky (статус: Студент)
Ответ отправлен: 09.08.2007, 16:02
Оценка за ответ: 5
Комментарий оценки:
Спасибо за ответ!

Отвечает: Aristos
Здравствуйте, Goretsky Anton!

Необходимо заменить строки вида "string" на TEXT("string").

Дело в том, что в настройках проекта (по-умолчанию) указано использование кодировки UNICODE. При этом каждый символ строки занимает 2 байта и имеет тип wchar_t, а строки задаются в виде L"string", а не "string". Макрос TEXT() в зависимости от настроек проекта подставляет или нет символ L перед строкой. LPCTSTR так же в зависимости от настроек будет либо const char*, либо const wchar_t*. Использование подобных макроопределений позволяет одиникаовым образом работать со строками вне зависимости от настроек проекта.
ps: Вообще говоря, использование UNICODE является продвинутой темой и требует некоторого опыта.
Ответ отправил: Aristos (статус: 2-ой класс)
Ответ отправлен: 09.08.2007, 16:08
Оценка за ответ: 5
Комментарий оценки:
Спасибо за помощь! Буду разбираться дальше.


Вопрос № 97.867
Изучаю перегрузку функций, VC++ 2005 Express edition beta 2;
при компиляции выдается следующее сообщение:

Error 1 error C2668: 'print' : ambiguous call to overloaded function c:documents and settingspatriotix-nмои документыvisual studio 2005projects\_1_\_1_\_1_.cpp 25

если поменять тип на double, то сообщение пропадает и компиляция проходит успешно.

Так как я учусь, хотелось бы узнать почему при использовании типа float компилятор ругается на неоднозначность, а при использовании double ему все становится понятно?

Приложение:

Отправлен: 09.08.2007, 18:38
Вопрос задал: Patriotix-N (статус: 3-ий класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Aristos
Здравствуйте, Patriotix-N!

Дело в том, что константа 2.55 имеет тип double и может быть приведена как к int, так и к float. Из-за этого и возникает неоднозначность вызова. Решить проблему можно 2мя способами:
1. print(2.55f); // постфикс f обозначает что константа с плавающей точкой имеет тип float
2. print((float)2.55); // явное приведение типов
Ответ отправил: Aristos (статус: 2-ой класс)
Ответ отправлен: 09.08.2007, 18:49

Отвечает: Sergey A. Wedensky
Здравствуйте, Patriotix-N!

Дело в стандарте записи числовых констант.
Когда Вы пишете в коде '2.55', компилятор воспринимает это как константу типа double. Так как прототипа функции print(), принимающей параметр типа double не определено, он (компилятор) пытается провести кастинг к одному из типов, для которых определена перегруженная функция. Но double он может преобразовать как к float, так и к int.
Таким образом, компилятор не может однозначно понять, какую из перегруженных функций вызывать - print((float)2.55) или print((int)2.55). О чем Вам и сообщает.

Если же Вы определяете прототип print(double), то его компилятор и вызовет, т.к. '2.55' - константа типа double и никакого преобразования не нужно.

Если Вы запишете константу в виде '2.55f', компилятор поймет ее как константу типа float и компиляция пройдет успешно. Не говоря уже о прямом кастинге - print((float)2.55);.
Ответ отправил: Sergey A. Wedensky (статус: Студент)
Ответ отправлен: 09.08.2007, 18:52


Вопрос № 97.868
Здравствуйте, Уважаемые Эксперты. Мой вопрос касается больше теоретическо-методической стороны изученмя С++, чем конкретно какой-нибудь проблемы.Но в то же время мне нужен точный и, самое главное, действенный, совет .
Вообщем. появилось желание изучить самостоятельно С++.Только мне не надо поверхностное знание языка, ограничивающееся написанием программ, типа "Hello, Word!" ну или типа того.
Нет, учиться так учиться ! Интересует все-от представления элементов программы в памяти до
конкретных алгоритмов. Пока тыкался по форумам , нашел несколько неплохих(как утверждают) книг
"В.Г. Давыдов.Технологии программирования С++"
"Страуструп Б. Язык программирования С++, спец. изд."
Какие еще источники Вы можете добавить?

Как лучше всего практиковаться? Нет, я понимаю, что лучшая практика-это написание программ, но , помоему, писать программу "под задачу" не совсем эффективно и отчасти глупо. Посему спрашиваю: может кто знает какие-нибудь сборники задач(или что-то типа того), типа "практикум программирования по С++"(Нечто похожее я видел у Пирогова, но по Ассемблеру...)

На какие тонкости при изучении стоит обращать внимание.Нужно ли больше времени уделять алгоритмам(например разным видам сортировок, графам и. т.д) или же, наооборот больше делать упор на "жизнь"(т.е работа с формами, компонентами и т.д)(в идеале -я хочу свободно научиться писать ЛЮБЫЕ Win32 приложения в C++ Builder 6)Вобщем, буду рад люблму отзыву, совеиу,предложению.Всем заранее спасибо
Отправлен: 09.08.2007, 18:45
Вопрос задал: Денскевич Р (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Patriotix-N
Здравствуйте, Денскевич Р!
Начнем попорядку.
1. Из источников могу посоветовать две книги:
Брюс Эккель.- Философия C++. Введение в стандартный C++.- том 1
Брюс Эккель, Чак Эллисон.- Философия C++. Практическое программирование.- том 2.
Возникает вопрос: имеете ли вы навыки программирования на каком-либо другом языке. Если нет то обязательно вам понадобится прочитать какие-нибудь книги по алгоритмам, не просто алгоритмам на С++, а по теории алгоритмов.
На С++ есть отличная книга
Р.Седжвик - Фундаментальные алгоритмы на C++. Части 1-4,
Р.Седжвик - Фундаментальные алгоритмы на C++. Часть 5. Алгоритмы на графах.
Елси вы хотите узнать о логике компьютера и представлении программы в памяти, на более низком уровне, то желательно почитать книги не по С++, а по ассемблеру, там обычно в начале имеется несколько глав о представлении данных в компьютере. Из своего опыта могу сказать, что после этого вы сможете гораздо лучше понять, почему именно так устроены компиляторы и принципы программирования. Лично я начинал изучать ассемблер с книги:
АССЕМБЛЕР И ПРОГРАММИРОВАНИЕ ДЛЯ IBM PC
Под редакцией Еpшова В.Г
Всю книгу вам читать не обязательно, просто можете прочитать начальные главы.

2. Насчет сборников знаю не много, но у меня на полке стоит:
А.В. Крячков, И.В. Сухинина, В.К. Томшин.- Программирование на С и С++ практикум
но в этой книге больший упор делается на Си нежели на Си++, примеры даются на Си, лишь последние главы посвящены Си++, но вы можете сами писать решения на Си++, поэтому решать вам. Но упор в книге делается на алгоритмы.

3. Если вы хотите писать "ЛЮБЫЕ Win32 приложения в C++ Builder 6", то упор придется делать и на алгоритмы и на "жизнь". Точно не могу сказать, но я предполагаю так:
Алгоритмы вам понадобятся в любом случае, и чтобы их освоить понадобится МНОГО время.
Для реального же программирования форм можно воспользоваться любым справочником World C++, например. Поэтому я считаю(ИМХО), что при изучении упор следует делать на алгоритмы, и философию С++. Работать же с формами вы научитесь когда придет время делать реальные программы.
---------
Лучше знать ничего обо всем, чем все ни о чем.
Ответ отправил: Patriotix-N (статус: 3-ий класс)
Ответ отправлен: 09.08.2007, 22:08
Оценка за ответ: 5
Комментарий оценки:
Спасибо.Очень помогли !

Отвечает: Delph
Здравствуйте, Денскевич Р!

Полностью согласен с тем, что пишет Patriotix-N. От себя добавлю ещё одну маленькую рекомендацию. Попробуйте придумать какую-нибудь простенькую игрушку, которую можно реализовать на компьютере. Продумайте её детали и начните воплощать её на C++. Когда покончите с игрой, создайте простенькую базу данных (пример: Ваши друзья-товарищи-родственники..., книги, принадлежащие Вам, кто и когда какую книгу взял...) Это уже довольно серьёзный практикум, в ходе которого Вы сможете неплохо отточить свои навыки и приобрести ценнейший опыт. Игра поможет Вам освоить сам язык C++, а на базе данных Вы отработаете большую часть (если не все) алгоритмов. Если Вы придумаете себе ещё какие-то интересные задачи, на решение которых уйдёт не меньше недели, то прибавите в свою копилку ещё больше опыта.

Любой путь начинается с первого шага! Поэтому будьте смелее в задумках и вперёд!
Ответ отправил: Delph (статус: 6-ой класс)
Ответ отправлен: 10.08.2007, 10:39


Вопрос № 97.877
Здравствуйте, уважаемые эксперты.Помогите начинающему разобраться с наследованием:

Имеем наследование:
class Basic
{
protected: int proti;
public:
int pubi;
public:
void GetVal(void)const
{cout<<"pubi="<<pubi<<" "<<"proti="<<proti;}
};

class Child: public Basic
{
public:
void IncPubI(void)
{ pubi++;}
void IncProtI(void)
{ proti++;}
};
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
Child obj;
obj.IncPubI();
obj.Basic::GetVal();
//Метод базового класса доступен и так.Оператор разрешения области видимости можно не использовать
return 0;
}
//---------------------------------------------------------------------------
Теперь имеем более сложное наследование

// Базовый класс для Deriv1, Deriv2, Deriv12
class Base
{
private:
int d;
public:
void f( void )
{
cout << "The function is called: " << "Base::f( )"
<< endl;

return;
}
virtual void f( int i )
{
cout << "The virtual function is called: "
<< "Base::f( int )" << endl;

return;
}
void f( int i, int j )
{
cout << "The function is called: "
<< "Base::f( int, int )"
<< endl;

return;
}

};

// **********************************************************
// Производный класс для Base и базовый для Deriv12
class Deriv1: public Base
{
private:
char d;
public:
void f( void )
{
cout << "The function is called: " << "Deriv1::f( )"
<< endl;

return;
}
virtual void f( int i )
{
cout << "The virtual function is called: "
<< "Deriv1::f( int )" << endl;

return;
}

};
// **********************************************************
// Производный класс для Base
class Deriv2: public Base
{
public:
void f( void )
{
cout << "The function is called: " << "Deriv2::f( )"
<< endl;

return;
}
virtual void f( int i )
{
cout << "The virtual function is called: "
<< "Deriv2::f( int )" << endl;

return;
}

};
// **********************************************************
// Производный класс для Deriv1 и Base
class Deriv12: public Deriv1
{
// Данные

private:

char d;
// В этом классе обычный метод f( ) и виртуальный метод
// f( int ) не переопределены
};
#pragma argsused
int main(int argc, char* argv[])
{
// Создаем объекты различных классов
Base b_obj;
Deriv1 d1_obj;
Deriv2 d2_obj;
Deriv12 d12_obj;
cout << "Call of methods with usage of objects" << endl;
cout << "*************************************" << endl;
// Для объекта класса Base вызываем обычный и виртуальный
// методы
b_obj.f( );
b_obj.f( 1 );
// Для объекта класса Deriv2 вызываем его виртуальный
// метод
d2_obj.f( 1 );
// Для объекта класса Deriv2 вызываем виртуальный метод
// из класса Base
d2_obj.Base::f( 1 );
// Для объекта класса Deriv2 вызываем обычный метод из
// класса Base.По аналогии с предыдущем примером вызов должен(может) выглядеть так
// 2_obj.f(1,1)-ведь методы наследуются производными классами.Ан нет...Облом !
// Пишет " Ошибка! Такой функции в классе Deriv2 нет "
// А доступ к методу возможен только так
d2_obj.Base::f( 1, 1 );
//Почему ?
return 0;
}
Почему мне не удается обратиться к методу базового класса, используя
объект производного не используя расширение области видимости. в первом примере же получилось...
Заранее спасибо !
Отправлен: 09.08.2007, 20:50
Вопрос задал: Денскевич Р (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: V1s0r
Здравствуйте, Денскевич Р!

Переопределение функции void f() из Base функцией void f() из Deriv2 вызвало сокрытие функции void f(int, int) из Base, хотя она нормально наследовалась...

Пути решения конкретной проблемы:

1) использовать using-объявления? см. Бъерн Страуструп, Язык С++, глава 15, пункт 15.2.2 Наследование и using-объявления

2) Переопределение функцию void f(int, int) для Deriv2, которая будет просто вызывать соотв. функцию из Base

Теперь по теории.
Никогда не переопределяйне невиртуальные функции в производных классах.
Скотт Мейерс "Эффективное использование С++", правило 37

При наследований можно уйти в дебри, особенно если примешаны шаблоны...
Советую почитать хорошую книгу по языку С++, можно Страуструпа (сложная книга, но результат стоит того...) и обязательно Скотта Мейерса "Эффективное использование С++" (все тома!)

Удачи в освоении этого прекрасного языка!

Приложение:

Ответ отправил: V1s0r (статус: 3-ий класс)
Ответ отправлен: 10.08.2007, 00:45


Вопрос № 97.890
HELP ME!!!Каждый из m станков может обрабатывать n типов деталей. Известны резервы времени работы станков ai, i=1..m, и число деталей каждого вида bj, j=1..n. Известно время обработки каждой детали на каждом станке tij, i=1..m, j=1..n.
Определить план загрузки станков, обеспечивающий минимальное суммарное время работы оборудования.

Создать диалоговую систему решения и анализа экономической
задачи, заданной содержательным описанием.
В системе должны быть предусмотрены блоки:
∙ Формирования исходных данных;
∙ Вывода исходных данных на экран пользователя;
∙ Решения задачи различными способами;
∙ Вывода результатов решения задачи;
Блок формирования исходных данных должен предусматривать два режима:
∙ ввод исходных данных пользователем с клавиатуры;
∙ генерация основных объемов исходных данных случайным образом.
Блок решений включает следующие точные или приближенные способы решения предложенных оптимизационных задач (задач выбора наилучших решений из множества допустимых решений):
∙ Эвристические решения;
∙ Полный перебор множества допустимый решений.
Отправлен: 09.08.2007, 23:33
Вопрос задала: Михеева Ирина Владимировна (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: kool
Здравствуйте, Михеева Ирина Владимировна!
Имхо это задача линейного программирования.
Так что сначала нужно будет создать ее движок,
а потом уже все эти красивости.
Удачи!

---------
I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 10.08.2007, 19:33


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

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

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

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

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


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


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

В избранное