Вопрос № 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 способ).
Приложение:
--------- Готовых решений небыло, нет и не будет... вся жизнь - это лишь размышления на тему
Отвечает: 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").
Здравствуйте! Начал осваивать Visual Studio 2005 и наступил на грабли.
Делаю простой пример: на форме кнопка, по нажатию на которую появляется MessageBox. Код обработчика события в приложении.
Так вот при компиляции выдается следующая ошибка:
error C2664: 'CWnd::MessageBoxW' : cannot convert parameter 1 from 'const char [28]' to 'LPCTSTR'
Пример вызова функции MessageBox скопировал из МСДН.
Не понимаю в чем проблема.
Заранее благодарен.
Отвечает: 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 Комментарий оценки: Спасибо за помощь! Буду разбираться дальше.
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 ему все становится понятно?
Дело в том, что константа 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)Вобщем, буду рад люблму отзыву, совеиу,предложению.Всем заранее спасибо
Отвечает: 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;
}
Почему мне не удается обратиться к методу базового класса, используя
объект производного не используя расширение области видимости. в первом примере же получилось...
Заранее спасибо !
Переопределение функции 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.
Определить план загрузки станков, обеспечивающий минимальное суммарное время работы оборудования.
Создать диалоговую систему решения и анализа экономической
задачи, заданной содержательным описанием.
В системе должны быть предусмотрены блоки:
∙ Формирования исходных данных;
∙ Вывода исходных данных на экран пользователя;
∙ Решения задачи различными способами;
∙ Вывода результатов решения задачи;
Блок формирования исходных данных должен предусматривать два режима:
∙ ввод исходных данных пользователем с клавиатуры;
∙ генерация основных объемов исходных данных случайным образом.
Блок решений включает следующие точные или приближенные способы решения предложенных оптимизационных задач (задач выбора наилучших решений из множества допустимых решений):
∙ Эвристические решения;
∙ Полный перебор множества допустимый решений.
Отвечает: kool
Здравствуйте, Михеева Ирина Владимировна!
Имхо это задача линейного программирования.
Так что сначала нужно будет создать ее движок,
а потом уже все эти красивости.
Удачи!
--------- I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 10.08.2007, 19:33