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

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

Автор: distance
Дата сообщения: 17.12.2007 16:21
KChernov
проблемы никакой нет.
а boost - да, используется.
Автор: KChernov
Дата сообщения: 17.12.2007 16:29
distance

Цитата:
а boost - да, используется.

Мне бы все таки желательно решение без использования сторонних либ, так как проект в целом не мой (я делаю что-то вроде заплатки).


Цитата:
проблемы никакой нет.

К сожалению пока мне не удалось получить код, который бы работал

Добавлено:
Причем все примеры, которые я пока находил, либо используют многомерный статический массив, либо одномерный динамический.
Вроде когда-то я видел пример многомерного динамического, но вот найти теперь не могу
Автор: distance
Дата сообщения: 17.12.2007 16:46
KChernov

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

Многомерные динамические массивы C++
Автор: KChernov
Дата сообщения: 17.12.2007 17:23
distance
Что-то я как-то протормозил на тему Гугля
Кстати ссылочку не мешало бы и поправить, а то она всю тему развозит

Итого получился вот такой рабочий вариант:

Код: // объявление и инициализация
double ****e = new double***[NZ];
for(j=0;j<NZ;j++) {
e[j] = new double**[NX];
for(i=0;i<NX;i++) {
e[j][i] = new double*[NY];
for(k=0;k<NY;k++) {
e[j][i][k] = new double[TP_SIZE];
for(kk=0;kk<TP_SIZE;kk++) e[j][i][k][kk] = 0.;
}
}
}
...
// уничтожение
for(j=0;j<NZ;j++) {
for(i=0;i<NX;i++) {
for(k=0;k<NY;k++) delete e[j][i][k];
delete e[j][i];
}
delete e[j];
}
delete e;
Автор: TheChampion
Дата сообщения: 18.12.2007 01:23
KChernov

Пардон, а что мешает использовать std::vector<std::vector<std::vector<std::vector<double> > > > или valarray со срезами?
Автор: KChernov
Дата сообщения: 18.12.2007 10:03
TheChampion
Ничто не мешает, но код инициализации все равно будет аналогичный по размеру.
Или приведенный d ntvt Задачи по С++ пример можно значительно улучшить?

[quote="Abs62"]
Код: #include <vector>
#include <iostream>

using namespace std;
typedef vector<double> Array_1;
typedef vector<Array_1> Array_2;
typedef vector<Array_2> Array_3;
typedef vector<Array_3> Array;

int main() {
int NZ=10,NX=11,NY=12,TP_SIZE=13;
Array A;

A.resize(TP_SIZE);
for(int i=0;i<TP_SIZE;i++) {
A[i].resize(NY);
for(int j=0;j<NY;j++) {
A[i][j].resize(NX);
for(int k=0;k<NX;k++) {
A[i][j][k].resize(NZ);
}
}
}

A[1][2][3][4]=12.345;
cout << A[1][2][3][4] << endl;

return(0);
}
Автор: alex000sp
Дата сообщения: 18.12.2007 21:42
Люди вы с деревьями сталкивались?

Добавлено:
В смысле с бинарными.
Автор: TheChampion
Дата сообщения: 19.12.2007 11:56
alex000sp
Да. А в чем вопрос-то?
Автор: akaGM
Дата сообщения: 19.12.2007 12:25
как теперь с гаи разбираться...
Автор: TheChampion
Дата сообщения: 19.12.2007 12:46
KChernov
Можно использовать

Код: std::valarray<double> v(NZ * NX * NY * TP_SIZE);
Автор: KChernov
Дата сообщения: 19.12.2007 15:52
TheChampion

Цитата:
обернутый в класс. Правда, придется создать итераторы для представления трехмерных матриц, двумерных матриц и векторов. Это делается при помощи slice и gslice.

Нисколько не сомневаюсь, что можно написать библиотеку (и что такие уже есть), которая все это прекрасно делает.
Вопрос был именно про стандарт.
Автор: Qraizer
Дата сообщения: 19.12.2007 18:01

Цитата:
... а вот с остальным как бороться?
А зачем бороться? И главное, как ты представляешь себе результат? Если каждое измерение может менять свою длину при каждом вызове функции, то всё равно получится то же самое, разве что замаскированное под более простые конструкции. Даже boost наверняка аналогичный код содержит, только тебе его не видно. Так что вопрос "а зачем бороться?" всё равное остаётся. Не вижу смысла городить что-то ради экономии на количестве строк инициализации многомерного массива в одном единственном месте. Хочешь, вынеси в отдельную функцию и вызывай её с параметрами.
Автор: aligatr kil
Дата сообщения: 19.12.2007 21:04
Помогите пожалуйсто с прогой на языке С++. Я не могу поянть даже смысла , что нужно сделать.

( Напишите программу выполнения арифметических операций в разных системах счисления ---- Числа по основанию 8 и 4. Выполнить операцию умножения. )

помогите пожалуйсто начинающему
Автор: alex000sp
Дата сообщения: 19.12.2007 22:50
Да есть одна проблемка но я думаю там проблема не в самом дереве а в указателе на элемент.
Самое интересное если переменная "d" описываеться так
struct Node{char d;Node*left;Node*right;};
int b[]={1,2,3,4,5,6,7,8};//это уже готовый массив чтобы не вводить в ручную
или так
struct Node{char d[];Node*left;Node*right;};
то всё замечательно работает
но стоит char d[] заменить на char*d(именно так нужно сделать в задании)
тоесть должно быть так:
struct Node{char*d;Node*left;Node*right;};
и вся программа перестаёт работать, а менно когда создаёться новая структура(в двух первых случаях) переменная d получает новый адрес и записывает новое значение в переменную.
В третьем случае программа сначала создаёт первый элемент дерева(вершину), потом создаёт первую ветку, (2 значение d) пока всё нормально далее читаем 3 значение из файла, и здесь начинаеться парадокс значения вроде должны быть разными но почему то адреса памяти 2 и 3 элемента совпадают в результате программа переписывает значение 2 на значение 3 и говорит что такой же элемент уже есть в дереве(хотя в файле не одного повторяющегося элемента нет)после чего программа выплёвывает всё на экран и завершает свою работу так и не дочитав фаил до конца

Исходник->

struct Node{char*d;Node*left;Node*right;};
//вот этот массив программа читает из файла {'4','7','3','5','1','6','2','8'};
char*b;

Node*first();
Node*search_insort(Node*root);
void print_tree(Node*root,int l);//l-слой
void excuse_tree(Node*);

void main()
{int i=0;b="0";
Node*root=first();
search_insort(root);
print_tree(root,0);
getch();
excuse_tree(root);
getch();
}

Node*first()
{
ifstream inClientFile("n.txt",ios::in);
if(!inClientFile){cerr<<"” Ё« -Ґ ¬®¦Ґв Ўлвм ®вЄалв ¤«п звҐ-Ёп"<<endl;//Фаил не может быть открыт для чтения
getch();exit(1);}

Node*pv=new Node;
inClientFile>>pv->d;
pv->left=0;
pv->right=0;
return pv;
}

Node*search_insort(Node*root)
{char d[10];
ifstream inClientFile("n.txt",ios::in);
if(!inClientFile){cerr<<"” Ё« -Ґ ¬®¦Ґв Ўлвм ®вЄалв ¤«п звҐ-Ёп"<<endl;//Фаил не может быть открыт для чтения
getch();exit(1);}
inClientFile>>d;
Node*pv=root,*prew;
do{
pv=root;
inClientFile>>d;
int found=0;
while(pv&&!found)
{
prew=pv;
cout<<"pv->d="<<pv->d<<" d="<<d;
if(d[0]==pv->d[0])found=1;
else if(d[0]<pv->d[0]){pv=pv->left;cout<<" pv=pv->left\n";}
else {pv=pv->right;cout<<" pv->right\n";}
}
if(found==1)return pv;
Node*pnew=new Node;
*pnew->d=*d;
pnew->left=0;
pnew->right=0;
if(d[0]<prew->d[0])prew->left=pnew;
else prew->right=pnew;
if(inClientFile.eof())return pnew;
}while(!inClientFile.eof());
cout<<"\nChtenie iz faila zaversheno\n";
}

Заранее спасибо.
Автор: TheChampion
Дата сообщения: 20.12.2007 01:02
alex000sp
Все правильно. Кроме new Node надо еще делать n->d = new char[buffer_size]. И не забывать delete[] в конце. Гораздо лучше будет использовать std::string или, если std::string по каким-то причинам использовать нельзя, создать конструктор и деструктор, которые будут вызывать new[] и delete[]. А еще лучше функции-члены использовать, типа этого:

Код: struct Node
{
Node* left;
Node* right;

Node() : left(0), right(0), data(0) {}
Node(const char* s)
: left(0), right(0), data_(new char[std::strlen(s) + 1])
{
std::strcpy(data_, s);
}

~Node()
{
if(data)
delete[] data_;
if(left)
delete left;
if(right)
delete right;
}

const char* data() const { return data_; }
char* data() { return data_; }
void setData(const char* s)
{
if(data_)
delete[] data_;
data_ = new char[std::strlen(s) + 1];
std::strcpy(data_, s);
}

private:
char* data_;
};
Автор: KChernov
Дата сообщения: 20.12.2007 13:26
aligatr kil
С задачами разбираются в другой теме Задачи по С++.
Так что запостите туда и подробно объясните, что непонятно.
Автор: alex000sp
Дата сообщения: 20.12.2007 22:27
TheChampion
Здесь не вся программа вылажена, в конце безусловно имееться оператор delete. Я подумал зачем выкладывать всякие мелочи которые работают без проблем, здесь выложено только создание дерева.
Мне кстати оператор std::string не знаком, я блльше знаком с операторами new и delete.
Можно по подробнее расказать о --->
n->d = new char[buffer_size] точнее принцип действия оператора [buffer_size]
Автор: TheChampion
Дата сообщения: 20.12.2007 22:57
alex000sp
std::string --- не оператор, а класс для строк, причем стандартный.

new char[buffer_size] --- это выделение памяти под buffer_size элементов char. Оператор называется new[], выделяет память в куче под указанное число элементов. Память высвобождается оператором delete[]. Путать delete и delete[] крайне не рекомендуется.
Автор: alex000sp
Дата сообщения: 21.12.2007 22:32
TheChampion
Понимаешь нужно написать эту программу используя только вызовы функций но не используя классы.
У меня всётаки используется просто delete Node так как до этого используется оператор new Node.
Может тебе стоит выслать весь програмный код для наглядности.
Автор: TheChampion
Дата сообщения: 22.12.2007 13:05
alex000sp

Цитата:
Понимаешь нужно написать эту программу используя только вызовы функций но не используя классы.

Не расстраивайся, struct Node {} --- это уже таки класс. :-)


Цитата:
Может тебе стоит выслать весь програмный код для наглядности.

Ты хочешь отправить мне свою программу? Или наоборот?
Автор: Wlodowski
Дата сообщения: 22.12.2007 13:59
Здравствуйте!
помогите, я в С++ новичок. Решаю задачу "нахождение суммы четных чисел в массиве".
Вот моё решение
#include <iostream.h>
main ()
{
int k,a[6],s;
double b;
s=0;
for (k=0;k<6;k++)
cin>>a[k];
b=a[6]%2;
if (b=0)
{
for (k=0;k<6;k++)
s+=a[k];}
cout<<s;
}

------------------
Результат = 0
Правильно ли я поставил условие через "%"? Что в начале числа проверяются делением на 2 и если остаток равен нулю, то число четное.


Добавлено:
Также просьба обьяснить решение нахождения чисел Фибоначчи. Кто то тут уже выкладывал готовое на С++, но я ничего не понял.
Автор: veronica b
Дата сообщения: 22.12.2007 14:23
Wlodowski, вот эта программа делает, что вы просили.

Код:
#include <iostream>

using namespace std;

#define SIZE 6

int main()
{
    int kk,sum;
    int temp;

    sum = 0;

    for(kk = 0;kk < SIZE;kk++)
    {
        cout << "Enter number: ";
        cin >> temp;

        if(temp%2 == 0)
            sum += temp;
    }

    cout << "Total sum: " << sum << endl;
    
    return 0;
}
Автор: Rudia
Дата сообщения: 22.12.2007 14:23

Цитата:
Здравствуйте!
помогите, я в С++ новичок. Решаю задачу "нахождение суммы четных чисел в массиве".
Вот моё решение

#include <iostream.h>
main ()
{
int k,a[6],s;
double b;
s=0;
for (k=0;k<6;k++)
cin>>a[k];
b=a[6]%2; //тут вы выходите за границы массива(т.е. берете вообще левое число, которое находится в памяти
if (b=0) // типичнейшая ошибка начинающего С программиста "=" - это операция присваивания и её результат ненулевой, т.е. b=0 - всегда истина . корректно b==0
{
for (k=0;k<6;k++)
s+=a[k];}
cout<<s;
}
Автор: Wlodowski
Дата сообщения: 22.12.2007 14:33
veronica b
спасибо
Rudia
а как можно тогда исправить её чтобы программа давала требуемый результат?
Автор: Abs62
Дата сообщения: 22.12.2007 14:42
Rudia

Цитата:
типичнейшая ошибка начинающего С программиста "=" - это операция присваивания и её результат ненулевой, т.е. b=0 - всегда истина

Да ну. Результат операции присваивания есть присваемое значение, то бишь b=0 - всегда false.
Автор: alex000sp
Дата сообщения: 22.12.2007 14:47
TheChampion
Я с тобой согдасен struct Node {} это действительно класс, но тем не менее всё остальное нужно написать используя только вызовы функции не используя классы. Я хотел выслать программу, может там незначительная ошибка которая мне всю малину портит
Автор: TheChampion
Дата сообщения: 22.12.2007 16:17
alex000sp
Высылай, адрес отправил в твой личный адрес.
Автор: askarnt
Дата сообщения: 22.12.2007 19:51
Помогите, пожалуйста, господа программисты! Вопрос на предпоследней строке кода.

FILE *fp,*fr;
fp=fopen("D:/2.log","r");
fr=fopen("D:/Maska.txt","r");
char a[10][100],d[100],v[100];
int b[10][100];
int i,k;
long int c;
char *s=d;
char *x=v;
if(!Table1->Active) Table1->Active=true;
Table1->Edit();
fgets(x,100,fr);
sscanf(x,"%d %d %d %d %d %d %d %d", b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8]);
for(k=1;k<20;k++)
{
fgets(s,100,fp);
sscanf(s,"%s %s %s %s %s %s %s %s", a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
for(i=0;i<8;i++)
if (b[i]="aaa") ///// Здесь выдает ошибку E2277. В чем дело????
Table1->FieldByName("Odin")->AsString=a[i];
Автор: veronica b
Дата сообщения: 22.12.2007 20:00
askarnt

Цитата:
if (b[i]="aaa") ///// Здесь выдает ошибку E2277. В чем дело????

int b[10][100] объявлен как дву мерный массив целых, а вы пытаетесь присвоить строковое значение. Естественно, компилятор на такую глупость не соглашается и не согласится без крепкого принуждения.
Автор: askarnt
Дата сообщения: 22.12.2007 20:13
Ой, на самом деле так:

FILE *fp,*fr;
fp=fopen("D:/2.log","r");
fr=fopen("D:/Maska.txt","r");
char a[10][100],d[100],v[100];
char b[10][100];
int i,k;
long int c;
char *s=d;
char *x=v;
if(!Table1->Active) Table1->Active=true;
Table1->Edit();
fgets(x,100,fr);
sscanf(x,"%s %s %s %s %s %s %s %s", b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8]);
for(k=1;k<20;k++)
{
fgets(s,100,fp);
sscanf(s,"%s %s %s %s %s %s %s %s", a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
for(i=0;i<8;i++)
if (b[i]="aaa") ////Ошибка Е2277 Lvalue required. В чем дело??
Table1->FieldByName("Odin")->AsString=a[i];

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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