Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: Lyrik
Дата сообщения: 23.10.2009 16:23
akaGM

Цитата:
и обращение
swapIndex(10) = 5;
в этом смысле можно при конвертации заменить на
swapIndex[10] = 5 ?

насколько я понимаю в классе Vector определен operator(), но если там не определен operator [], то по идее нельзя будет так заменить. но если переименовать operator () в operator [] то должно работать.

Цитата:
Vector_long aaa;
тогда это что, "скаляр"?

трудно что-то сказать без конструктора и самого класса. но если разработчики пытались сделать свой класс похожим на стандартный STL вектор, то тогда при объявлении Vector_long aaa - это неициализированный вектор, т.е. вектор, имеющий 0 длину, но дальше по коду он может "превратиться" в полноценный вектор.
Автор: akaGM
Дата сообщения: 23.10.2009 16:32
Lyrik
это из Blitz++ Vector library
http://www.oonumerics.org/blitz/


Цитата:
но если переименовать operator () в operator [] то должно работать

сорри, что сразу не оговорил задачу:
мне надо выкусить/конвертнуть из С++ библиотеки реализацию одного класса
сделать его автономным и в перспективе перевести на фортран
Автор: akaGM
Дата сообщения: 26.10.2009 19:11

Код: vector<double>::iterator itr;
static vector<double> params;

for(itr = params.begin(); itr != params.end(); itr++) {}
Автор: RFTP
Дата сообщения: 26.10.2009 21:02
akaGM,
itr - это итератор, который условно можно назвать указателем
params.begin() - возвращает указатель на первый элемент массива
params.end() - возвращает указатель на память после последнего элемента массива
itr++ переместить указатель itr на 1 элемент вправо
То есть это цикл по всем элементам массива, а итератор последовательно указывает на каждый из них.
Автор: Quidnam
Дата сообщения: 26.10.2009 21:08
Здравствуйте товарищи.

Занимался изучением абстрактных классов и натолкнулся на такой вопрос.
Как из текущего объекта - Base* myClass = new SubClass();
Создать новый объект, типа SubClass* = new SubSubClass();
При этом перенести все данные полученные в конструкторе Base и SubClass.

Звучит наверное странно, Вы наверное скажите передайте по ссылке объект и всё тут.
Но возникают много трудностей. Предлагаю следующий код: (Внизу в функции main закоментированно описана проблема подробней)


Код: #include <iostream>
#include <string>
#include <conio.h>
using namespace std;

class Food
{
public:
    Food()
    {
        cout << "What is the name of this food? - ";
        cin >> mName;
        cout << "How many calories in this food? - ";
        cin >> mCals;
        cout << "What is the shape of this food? - ";
        cin >> mShape;
    }

    virtual void Info() const = 0;
    virtual bool Check() const = 0;

    int mCals;
    string mShape;
    string mName;
};

class Member : public Food
{
public:
    Member()
    {
        cout << "What colour is it? - ";
        cin >> mColour;
    }

    virtual void Info() const
    {
        cout << "\n" << mName << " has " << mCals
            << " it is a " << mColour << " " << mShape;
    }

    virtual bool Check() const
    {
        if(mName == "Apple") { return true; }
        return false;
    }

    string mColour;
};

class NotMember : public Member
{
public:
    NotMember()
    {
        cout << "How much does it weight? - ";
        _flushall();
        getline( cin, mHeavy, '\n' );
    }

    virtual void Info() const
    {
        cout << "\n" << mName << " has " << mCals << " calories"
            << ", it is a " << mColour << " " << mShape
            << "\nIt weights " << mHeavy << ", and its not a fruit!";
    }

protected:
    string mHeavy;
};

class NotMember2 : public NotMember
{
public:
    NotMember2()
    {
        cout << "Is it an Expensive fruit? (y/n)";
        if (_getch() == 'y') { mExpensive = "true"; }
        else { mExpensive = "false"; }
    }

    virtual void Info() const
    {
        cout << "\n" << mName << " has " << mCals << " calories"
            << ", it is a " << mColour << " " << mShape << "."
            << "\nIt weights " << mHeavy << ", and its not a fruit!\n"
            << "It is " << mExpensive << " that this food is expensive.";
    }

protected:
    string mExpensive;
};

class FruitMember : public Member
{
public:
    FruitMember()
    {
        cout << "Is it a tropical fruit? (y/n)";
        if (_getch() == 'y') { mTropical = "true"; }
        else { mTropical = "false"; }
    }


    virtual void Info() const
    {
        cout << "\n" << mName << " has " << mCals << " calories"
            << ", it is a " << mColour << " " << mShape
            << ". It is " << mTropical << " that this fruit is tropical.";
    }

protected:
    string mTropical;
};

class FruitMember2 : public FruitMember
{
public:
    FruitMember2()
    {
        cout << "\nIs it a European fruit? (y/n)";
        if (_getch() == 'y') { mEuropean = "true"; }
        else { mEuropean = "false"; }
    }

    virtual void Info() const
    {
        cout << "\n" << mName << " has " << mCals << " calories"
            << ", it is a " << mColour << " " << mShape
            << ".\n It is " << mTropical << " that this fruit is tropical.\n"
            << "It is " << mEuropean << " that this fruit is European.";
    }

protected:
    string mEuropean;
};

int main()
{

    Food* myFood;
    myFood = new Member;
    if (myFood->Check()) //Проверяет если введенное название фрукта - Apple
    {
        //Здесь должен быть код, который создаст объект FruitMember2,
        //при этом вызовет конструктор FruitMember и при этом же
        //сохранит все данные которые были введены в конструкторах
        //вызванных с помощью myFood = new Member;
        //Если сюда поместить Food* myFruit = new FruitMember2;
        //То вызовутся все конструкторы, включая тех, которые были
        //вызваны с помощью myFood = new Member;
        //Если сюда поместить MyFruitMember* myFruit = new FruitMember2
        //то не будут инициализированны прошлые данные из myFood
        //Если в конструктор передать по ссылке -
        //myFruit = new FruitMember2(myFood), то возникнет множество
        //не приятных проблем...
    }
    else
    {
        //Здесь то же самое, что выше описано, но для объекта NotMember2
    }

    return 0;
};
Автор: akaGM
Дата сообщения: 26.10.2009 21:09
RFTP
ок, спасибо, ясно...
и всё-таки
Цитата:
по динамическому размеру params?

тождественно
Цитата:
То есть это цикл по всем элементам массива

для рабоче-крестьянского (условно)
for (int i = 0; i < sizeof(params); i++) params[i]...
Автор: Abs62
Дата сообщения: 26.10.2009 21:28
akaGM
По рабоче-крестьянски это будет [no]for (int i = 0; i < params.size(); i++) params[i][/no]...
То бишь цикл не по всем элементам массива, а по заполненным элементам.
Автор: RFTP
Дата сообщения: 26.10.2009 21:38
Quidnam, зачем объекту класса Апельсин присваивать значения объекта типа Фрукт (который может быть на самом деле несовместимым по дереву наследования Яблоком), трудно понять... Но если действительно нужно, то следует на всех уровнях наследования добавить конструкторы типа:
Child(const Parent* p);
или же перегрузить оператор = :
Child& Child::operator=(const Parent& p);
Автор: akaGM
Дата сообщения: 26.10.2009 21:51
Abs62
а зачем мне незаполненные?
и итераторный params.size() мне не нужен
захотел, маллокнул десяток, заполнил, по ним и прошёлся...
Автор: Quidnam
Дата сообщения: 26.10.2009 21:52

Цитата:

зачем объекту класса Апельсин присваивать значения объекта типа Фрукт (который может быть на самом деле несовместимым по дереву наследования Яблоком)


Смысл был в том, что пользователь вводит некие данные, а дальше как Вы совершенно точно сказали, определяется какое дерево наследования выбрать. Можно конечно, сначала попросить ввести данные, дальше сделать проверку и только потом создать нужный объект. Но смысл был так же в том, чтобы, Фрукт и Мясо и Горох принадлежали классу Food ( еда ) Если Вы знаете способ, как это сделать лучше, я с удовольствием выслушаю Вас.
Автор: Abs62
Дата сообщения: 26.10.2009 21:59
akaGM
А затем, что в общем случае на момент выделения памяти может ещё быть неизвестно, сколько элементов заполнится в итоге.
Автор: akaGM
Дата сообщения: 26.10.2009 22:00
Abs62
я знаю!
я сам себе main() гы
Автор: RFTP
Дата сообщения: 27.10.2009 10:10

Цитата:
Можно конечно, сначала попросить ввести данные, дальше сделать проверку и только потом создать нужный объект. Но смысл был так же в том, чтобы, Фрукт и Мясо и Горох принадлежали классу Food ( еда )

Первое высказывание не исключает второго. Вместо функции Food.Check() можно создать другую, внешнюю - генератор объектов:

Код:
Food* createFood()
{
int mCals;
string mShape;
string mName;
cout << "What is the name of this food? - ";
cin >> mName;
cout << "How many calories in this food? - ";
cin >> mCals;
cout << "What is the shape of this food? - ";
cin >> mShape;
if(mName == "Apple") return new Member(mName,mCals,mShape);
else return new Food(mName,mCals,mShape);
}
Автор: Quidnam
Дата сообщения: 27.10.2009 19:47

Цитата:
внешнюю - генератор объектов:


Гениально! Спасибо RFTP.
Автор: BeTeP1
Дата сообщения: 28.10.2009 20:31
Делал функцию
bool _func(int a, char*b ,char* lpbuf);
#define func( buf ) _func( __LINE__, __FILE__ , buf)

все нормально робит
потребовалась функция с переменным числом аргументов, пытаюсь ее переопределить
bool _func(int a, char*b ,char* lpFormat, ...);
#define func(format,...) _func( __LINE__, __FILE__ , lpFormat, ....)

при компиляции выдает ошибки
Как это сделать?

Добавлено:
решение нашел на rsdn.ru
Автор: Infinite Retrieval
Дата сообщения: 28.10.2009 20:51
А как нормально считать строку на русском в консоли?
Настройки проекта и всякие: setlocale(LC_ALL,"rus"); setlocale(LC_ALL, ".1251"); setlocale(LC_ALL,".866"); не помогают..
Автор: Abs62
Дата сообщения: 28.10.2009 21:15
Infinite Retrieval
Вариант 1: использовать функции OemToChar/CharToOem для преобразования введённой строки.
Вариант 2: выставить кодировку ".866" и использовать юникодные функции ввода.
Автор: karakurt2
Дата сообщения: 28.10.2009 21:35
так пробовали?


Код:
#include <iostream>
#include <iomanip>
#include <locale>

void main()
{
    std::locale loc(".OCP");
    setlocale(LC_ALL, ".OCP");

    std::cin.imbue(loc);
    std::string line;
    while (std::getline(std::cin, line))
    {
        std::cout << line << std::endl;
    }
}
Автор: akaGM
Дата сообщения: 29.10.2009 18:58

Код: map<double,int> valueMap;
Автор: Eminence
Дата сообщения: 29.10.2009 19:34
Map - это не массив, это двоичное дерево. Первый элемент - это ключ, второй - соответствующее ему значение. Позволяет по ключу осуществлять быстрый поиск. Кроме того, вставки и удаления не приводят к перемещению элементов, как в массиве. Недостатки: большой расход памяти, медленный последовательный перебор.
Автор: Abs62
Дата сообщения: 29.10.2009 19:35
akaGM
Это ассоциативный массив.
Автор: akaGM
Дата сообщения: 29.10.2009 20:29
Abs62
ок, спасибо, я с этим немного знаком по Перлу/ПыХаПы...

Eminence

double Values[100];
valueMap[Values[i]] = i


Цитата:
Недостатки:

за всё в этой жизни надо...
Автор: akaGM
Дата сообщения: 30.10.2009 19:38

Код: struct TREC {
int i;
double d;
};

foo(vector<TREC> &trec);
Автор: Lyrik
Дата сообщения: 31.10.2009 00:04
akaGM

Цитата:
что при таком прототипе передаётся в функу, адрес динамического массива?

передается ссылка, что по сути является его адресом.

Цитата:
как его можно определить, только как

только по прототипу функции
Автор: palsarnick
Дата сообщения: 31.10.2009 00:37
Здравствуйте!

Каким образом на языке С можно перевести массив символов в число int без использования функции pow?


Заранее благодарен,
Лев
Автор: Abs62
Дата сообщения: 31.10.2009 01:01
palsarnick
String to Numeric Value Functions
Автор: palsarnick
Дата сообщения: 31.10.2009 01:23
Abs62
спасибо!
Автор: akaGM
Дата сообщения: 31.10.2009 15:18
Lyrik
э-э-э...
всё-таки я не умею задавать вопросы...

я знаю чтО такое foo(some_type &var)
я не знаю, что в прототипе означает
foo(vector<TREC> &trec);
а из твоего ответа на мой хреновый вопрос (ссылка==адрес) следует, что вызовы:

TREC * trec;
TREC trecs[5];
foo(trec);
foo(trecs);

имеют право быть...
Автор: Ntony
Дата сообщения: 31.10.2009 20:17
Задача звучит следующим образом: Дан массив 5 на 5. Найти в массиве минимальный элемент и записать в массив X[i] 1 если этот элемент содержится в [i] строке и -1 в противном случае.

Проблема при выводе этого самого массива X. Выводит числа -56 -48 и т.п.

Вот текст программы:
#include <stdio.h>
#define n 5

void read_matr (int a[n][n])
{int i,j;
FILE *fp;
fp=fopen("in.txt","r");
printf("Input a[][]:\n");

for (i=0;i<n;i++)
for (j=0;j<n;j++)
fscanf(fp,"%d",&a[i][j]);
fclose(fp);

}

void input_matr(int a[n][n])
{FILE *f;
int i,j,z;
read_matr(a);
}

int min_el(int (*a)[n])
{int i,j,min=a[0][0];
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if(a[i][j]<min)
min=a[i][j];
return min;

}

int *mas_x (int a[n][n],int *x)
{int i,j;
int min_str,min;
min=min_el(a);
for(i=0;i<n;i++)
{min_str=a[i][0];
for (j=0;j<n;j++)
if(a[i][j]<min_str)
min_str=a[i][j];
if (min_str==min)
x[i]=1;
else x[i]=-1;
}
return x;

}

void main(int a[n][n],int *x)
{int i,j;
FILE *f=fopen("out2.txt","w");
fprintf(f,"matr a[][]\n");
for (i=0;i<n;i++)
{for (j=0;j<n;j++)
fprintf(f,"%4d",&a[i][j]," ");
fprintf(f,"\n");
}
fprintf(f,"\n Massiv X: \n");
for (i=0;i<n;i++)
fprintf(f,"%4d ",&x[i]);
printf("\n");
fclose(f);
}
Автор: Lyrik
Дата сообщения: 01.11.2009 01:05
akaGM

Цитата:
я не знаю, что в прототипе означает
foo(vector<TREC> &trec);

vector - это шаблонный класс. в данном случае создается экземляр класса для типа TREC.

Цитата:
TREC * trec;
TREC trecs[5];
foo(trec);
foo(trecs);
имеют право быть...

ну если бы ссылка была бы указателем то имели бы, но она не указатель. есть принципиальные отличия ссылки и указателя. ф-ция foo принимает ссылку на TREC, а не ссылку на TREC*.
Ntony
Вы выводите не значения элементов, а их адреса:

Цитата:
fprintf(f,"%4d",&a[i][j]," ");


Цитата:
fprintf(f,"%4d ",&x[i]);

надо так:

Цитата:
fprintf(f,"%4d",a[i][j]," ");


Цитата:
fprintf(f,"%4d ",x[i]);

и если я правильно понял условие, то можно чуть упростить Вашу ф-цию:

Цитата:
int *mas_x (int a[n][n],int *x)
{int i,j;
int min;
min=min_el(a);
for(i=0;i<n;i++)
{
x[i] = -1;
for (j=0;j<n;j++)
{
if(a[i][j]==min)
{
x[i]=1;
break;
}
}
}
return x;
}

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.