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

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

Автор: 4aineG
Дата сообщения: 04.08.2008 11:04
c0d3r
получается L1 вообще выкинуть и использовать Line1? а в аргументе конструктора мне что ставить?
Автор: 4aineG
Дата сообщения: 07.08.2008 14:12
помогите пожалуйста с моими ошибками
#pragma once
#include <iostream>
#include <string>
using namespace std;

class Line
{
private:

    char *Line1;
    int length;

public:
    
    Line(/*char* L1*/)
    {
        /*Line1 = new char[strlen(L1)];
        strcpy(Line1, L1);*/
        length = strlen(Line1);    
    }
    
    int CountWordsInLine()
    {
        int i=0;
        int Count=0;
        for(int i=0; i<length; i++)
        {
            if (Line1[i]=='_')
                Count++;
        }
        Count++;
        return Count;
    }

    char* ReverseLine() //ф-ция переворота: не меняет переменные в конечном
    { счете печатает не перевернутую строку
        for (int i=0; i<=(length-1)/2; i++)
            for (int j=length-1; j<(length-1)/2; j--)
        {
            char temp = Line1[i];
            Line1[i] = Line1[j];
            Line1[j] = temp;
        }
        return Line1;    
    }

    /*void PrintReversedLine()
    {
        for(int i=length-1; i<=0; i--)
            Line1[i]='a';

            printf("%s", Line1);
    }*/
        
    void Print()
    {
        int temp1 = CountWordsInLine();
        cout << "number of words: " << temp1 << endl;
        cout << "normal sentence: " << Line1 << endl;
        char* temp2 = ReverseLine();
        cout << "reversed sentence: " << temp2 << endl;
    }
    
    ~Line()
    {
        delete [] Line1;
    }

};

#pragma once
#include "Class.h"
int main()
{
    Line ln1;
    cout << "enter sentence: ";
    cin >> ln1; //ошибка возникает при переопределении операции ввода
    ln1.CountWordsInLine();
    ln1.ReverseLine();
    ln1.Print();
    //ln.PrintReversedLine();
    return 0;
}
Автор: c0d3r
Дата сообщения: 07.08.2008 15:16
4aineG


Цитата:
cin >> ln1; //ошибка возникает при переопределении операции ввода


Ну так ещё бы! Вы ведь его (operator<<) нигде не определили!
Автор: 4aineG
Дата сообщения: 07.08.2008 17:41
это получается нужно внутри класса писать?
Автор: CRIT1987
Дата сообщения: 07.08.2008 18:37
Народ вопрос по Builder C++, кто может помогите! Такой вопрос: есть дерево Treeview,дочерние узлы. Мне нужно сделать копирование узлов или узла при нажатой клавиши(shift или ctrl) из одного каталога в другой...Перемещение я сделал драг энд дроп.. а как копирование хз..привидите плиз код примерный..
Автор: c0d3r
Дата сообщения: 07.08.2008 18:45
4aineG


Цитата:
это получается нужно внутри класса писать?


Не хочу показаться грубым, но "это получается, что нужно книжку почитать" Нет, серьёзно, это есть в любой книжке, можно даже в гугле поискать.
Автор: CRIT1987
Дата сообщения: 10.08.2008 14:10
Народ, кто может помогите! Такой вопрос: есть дерево Treeview,дочерние узлы. Мне нужно сделать копирование узлов или узла при нажатой клавиши(shift или ctrl) из одного каталога в другой...Перемещение я сделал драг энд дроп.. а как копирование хз..привидите плиз код примерный..
Автор: 4aineG
Дата сообщения: 10.08.2008 17:22
помогите пожалуйста проблема с перегрузкой операторов >> <<, возможно и с '-' и еще с конструктором без параметров наверно проблема
#pragma once
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

class Line
{
private:

    char *Line1;
    int length;

public:

    Line()
    {
        Line1 [length] = '\0';
    }

Line(char* L1)
{
Line1 = new char[strlen(L1)];
strcpy(Line1, L1);
length = strlen(Line1);
}

// friend ostream& operator << (ostream& out, Line& lin);
// friend istream & operator >> (istream & in, Line &lin);
// Line operator - (char letter);

    int CountWordsInLine()
    {
int Count=0;
for(int i=0; i<length; i++)
    {
if (Line1[i]=='_')
Count++;
    }
Count++;
return Count;
    }

char* ReverseLine()
    {
for (int i=0; i<=(length-1)/2; i++)
    {
        char temp = Line1[i];
        Line1[i] = Line1[length-i-1];
        Line1[length-i-1] = temp;
    }
        return Line1;
    }

    void Print()
    {
        cout << Line1 << endl;
    }

    Line operator - (char letter)
    {
        char *temp = new char[length];
        for (int i=0; i<length; i++)
    {
        if (Line1[i]!= letter)
            temp[i] = Line1[i];
        temp[i]='\0';
    }
        strcpy(Line1, temp);
        for (int i=0; i<length; i++)
            delete [] temp;
        return Line1;
}

    istream & operator >> (istream & in)
    {
        in >> Line1 >> endl;
        return in;
    }

    ostream& operator << (ostream& out)
    {
        out << Line1;
        return out;
    }
};


#pragma once
#include "Class.h"

int main()
{
    Line ln1("Hello_Russia");
    cout << "normal sentece: ";
    Line ln2;
    cin >> ln2 >> endl;
    Line lin = ln2 - 'l';
    cout << "without delete letters: " << lin;

    Line lnx1 = ln1.CountWordsInLine();
    cout << "number of words: ";
    lnx1.Print();

    Line lnx2 = ln1.ReverseLine();
    cout << "reversed sentence: ";
    lnx2.Print();

    return 0;
}
Автор: c0d3r
Дата сообщения: 10.08.2008 21:28
4aineG

Так как подниматься с дивана за книжкой мне было лень, пришлось за вас погуглить. Например, вот: http://aydozz.blogspot.com/2007/02/inputoutput-operator-overloading-in-c.html

Если заменить


Код:
ostream& operator << (ostream& out)
Автор: CRIT1987
Дата сообщения: 10.08.2008 23:37
НАРОД по моему вопросу кто-нибудь знает что???
Автор: KChernov
Дата сообщения: 11.08.2008 16:15
CRIT1987

Цитата:
Народ, кто может помогите! Такой вопрос: есть дерево Treeview,дочерние узлы. Мне нужно сделать копирование узлов или узла при нажатой клавиши(shift или ctrl) из одного каталога в другой...Перемещение я сделал драг энд дроп.. а как копирование хз..привидите плиз код примерный..

А в чем собственно проблема?
Если при перемещении достаточно просто поменять ссылку.
То при копировании нужно создать копию поддерева и привязать ее к новому каталогу.
Во всем остальном копирование от перемещения не отличается.
Автор: CRIT1987
Дата сообщения: 11.08.2008 20:57
проблема не решена..
Автор: KChernov
Дата сообщения: 12.08.2008 09:46
CRIT1987

Цитата:
проблема не решена..

Если вы хотите таки решить свою проблему - формулируйте точнее!
Как минимум стоит комментировать данные вам ответы на тему подошло это или нет (и в чем конкретно не подошло).
Если вам просто нужно решение - вы ошиблись темой.
Автор: 4aineG
Дата сообщения: 12.08.2008 18:40
c0d3r
вот я обновил но почему то все равно не пашет, ошибка возникла при добавлении '-'
#pragma once
#include <iostream>
#include <cstring>
using namespace std;

class Line
{
private:

    char *Line1;
    int length;

public:

    Line()
    {
        length = 1;
        Line1 = new char[length];
        Line1[length-1] = '\0';
    }

Line(const char* L1)
{
     length = strlen(L1)+1;
Line1 = new char[length];
strcpy(Line1, L1);
        Line1[length-1] = '\0';
}

friend ostream& operator << (ostream& out , const Line& l);
    friend istream& operator >> (istream & in, Line &l);

    Line operator - (char letter)
    {
        char *temp = new char[length];
        int i,j;
        for (i=0, j=0; i<length; i++)
            if (Line1[i] != letter)
            {
                temp[j] = Line1[i];
                j++;
            }
        length = strlen(temp)+1;
        temp[length-1] = '\0';
        strcpy(Line1, temp);
        return Line1;
}

    ~Line()
    {
        delete [] Line1;
    }
};
istream & operator >> (istream & in, Line& l)
    {
        char *temper = new char[100];
        in >> temper;
        l.length = strlen(temper)+1;
        temper[l.length-1] = '\0';
        l.Line1 = new char[l.length];
        strcpy(l.Line1, temper);
        l.Line1[l.length-1] = '\0';
        return in;
    }

ostream& operator << (ostream& out, const Line& l)
    {
        return out << l.Line1;
    }

    

    
int main()
{
    Line ln1;
    cin >> ln1;
    cout << "normal sentece: " << ln1 << endl;
    Line ln2;
    ln2 = ln1 - 'u';
    cout << "without letter: " << ln2 << endl;
    
    return 0;
}

Автор: c0d3r
Дата сообщения: 12.08.2008 19:19
4aineG


Цитата:
вот я обновил но почему то все равно не пашет, ошибка возникла при добавлении '-'


Ох. Давайте учиться составлять багрепорты "не пашет" это может значить что угодно от "работает не так как я хочу" до "падает при старте". Пишите конкретнее и подробнее, это в ваших же интересах.

Собственно скомпилил. Запустил -- упала:


Цитата:

test
normal sentece: test
without letter:
*** glibc detected *** ./Line2: double free or corruption (fasttop): 0x098f80b0 **


Может вам кто-нибудь поможет, потому что я вам уже сказал -- используйте std::string -- тогды не было бы ни утечек памяти (а он и у вас есть), ни двойных освобождений памяти ни столько много кода, который не так уж легко и читать.

P.S. Если бы вы писали на Сях я бы ещё понял, почему вы не можете использовать std::string, а так не могу понять.
Автор: 4aineG
Дата сообщения: 12.08.2008 19:50
c0d3r
сначала я должен научиться создавать собственный класс, а уж потом поняв что как работает можно работать с помощью string
Автор: c0d3r
Дата сообщения: 12.08.2008 19:52
4aineG

Следуя вашей логике, я бы начинал изучение С++ с С (Я, кстати, так и изучал..)
Автор: 4aineG
Дата сообщения: 12.08.2008 19:52
конкретно ошибка возникла когда я добавил operator -
Автор: c0d3r
Дата сообщения: 12.08.2008 20:17
4aineG


Цитата:
конкретно ошибка возникла когда я добавил operator -


Ну так смотрите код и ищите ошибку. Добавляйте отладочный вывод, анализируйте -- словом учитесь отлаживать программу, для начала без отладчика.


Код: Line operator - (char letter)
{
char *temp = new char[length];
int i,j;
for (i=0, j=0; i<length; i++)
if (Line1[ i ] != letter)
{
temp[ j ] = Line1[ i ];
j++;
}
length = strlen(temp)+1;
temp[length-1] = '\0';
strcpy(Line1, temp);
return Line1;
}
Автор: Labutin
Дата сообщения: 12.08.2008 20:36
i и j в примере отличаются - i инкрементируется всегда, а j - только при выполнении условия.
Про конструктор копирования вам правильно написали.
Еще в операторе "минус" модифицируется строка из которой что-то вычитается - это не есть правильно с логической точки зрения (хотя язык C++ это не запрещает делать).
Т.е. a = b - с - если изменится b - это будет сюрпризом.

Добавлено:
Допиши вот эти два оператора:

Код:
Line operator=(const Line &L1)
{
delete [] Line1;
length = strlen(L1.Line1)+1;
Line1 = new char[length];
strcpy(Line1, L1.Line1);
Line1[length-1] = '\0';
return *this;
}
Line (const Line &L1)
{
length = strlen(L1.Line1)+1;
Line1 = new char[length];
strcpy(Line1, L1.Line1);
Line1[length-1] = '\0';
}
Автор: c0d3r
Дата сообщения: 12.08.2008 20:49

Цитата:
i и j в примере отличаются - i инкрементируется всегда, а j - только при выполнении условия.


Да. Я сначала думал, что он как найдёт первый символ в строке так сразу прерывает копирования, но т.к. break не увидел уже понял, что он пропускает символы.


Цитата:
Про конструктор копирования вам правильно написали.


Мне? Ему нужен конструктор присвоения (хотя и копирования лишним не будет). Я проверил, пришлось доставать толстую книжку Липмана. После добавления всё работает и не падает:


Код:
Line &operator=(const Line &rhs) {

// освобождаем память для текущей строки
delete Line1;

// копируем строку
Line1 = strdup(rhs.Line1);

// возвращаем ссылку на самих себя
return *this;
}
Автор: Labutin
Дата сообщения: 12.08.2008 20:52
c0d3r
Я там в своем сообщении сразу обоим написал и забыл вставить ники к кому обращался.
Разумеется дописывать нужно не Вам Но я думаю все поняли кому что я написал
Автор: 4aineG
Дата сообщения: 14.08.2008 09:43
А как мне в своем коде изменить, чтобы вместо «_» при наборе предложения можно ставить пробелы, пытаюсь вводить через консоль с пробелами: выводит и работает только с одним словом

#include <iostream>
#include <cstring>
using namespace std;

class Line
{
private:

    char *Line1;
    int length;

public:

    Line()
    {
        length = 1;
        Line1 = new char[length];
        Line1[length-1] = '\0';
    }

Line(const char* L1)
{
     length = strlen(L1)+1;
Line1 = new char[length];
strcpy(Line1, L1);
        Line1[length-1] = '\0';
}

friend ostream& operator << (ostream& out , Line& l);
    friend istream& operator >> (istream & in, Line &l);
    Line operator - (char letter);
    bool operator == (Line l);
    int CountWordsInLine();
    char* ReverseLine();
    void DrawStar();

    ~Line()
    {
        delete [] Line1;
    }
};

int Line::CountWordsInLine()
    {
int Count=0;
for(int i=0; i<length; i++)
    {
if (Line1[i]=='_')
Count++;
    }
Count++;
return Count;
    }

char* Line::ReverseLine()
    {
for (int i=0; i<(length-1)/2; i++)
    {
        char temp = Line1[i];
        Line1[i] = Line1[length-i-2];
        Line1[length-i-2] = temp;
    }
        return Line1;
    }

void Line::DrawStar()
{
    for (int i=0; i<45; i++)
        cout << '*';
    cout << endl;
}

istream & operator >> (istream & in, Line& l)
    {
        char *temper = new char[100];
        in >> temper;
        l.length = strlen(temper)+1;
        temper[l.length-1] = '\0';
        l.Line1 = new char[l.length];
        strcpy(l.Line1, temper);
        l.Line1[l.length-1] = '\0';
        return in;
    }

ostream& operator << (ostream& out, Line& l)
    {
        return out << l.Line1;
    }

    Line Line::operator - (char letter)
    {
        char *temp = new char[length];
        int i,j;
        for (i=0, j=0; i<length; i++)
        {
            if (Line1[i] != letter)
            {
                temp[j] = Line1[i];
                j++;
            }
        }
        temp[j] = '\0';
        return temp;
}

    bool Line::operator == (Line l)
    {
        int i, j;
        for (i=0, j=0; i<length-1, j<length-1; i++, j++)
            if (Line1[i] == l.Line1[j])
                return true;
        return false;
    }

int main()
{
    Line ln1;
    Line ln2("What's_up_niger");
    cout << "enter sentence: ";
    cin >> ln1;
    cout << "normal sentece: " << ln1 << endl;

    if(ln1 == ln2)
        cout << "sentences are equal" << endl;
    else
        cout << "sentences are not equal" << endl;
    cout << "number of words: " << ln1.CountWordsInLine() << endl;
    ln1.DrawStar();
    cout << "enter letter: ";
    char temp;
    cin >> temp;
    cout << "without letter: " << ln1 - temp << endl;
    cout << "reversed sentence: " << ln1.ReverseLine() << endl;
    
    return 0;
}
Автор: c0d3r
Дата сообщения: 14.08.2008 09:51
4aineG

Цитата:
А как мне в своем коде изменить, чтобы вместо «_» при наборе предложения можно ставить пробелы, пытаюсь вводить через консоль с пробелами: выводит и работает только с одним словом


Используйте cin.get(), cin.getline() или (я обычно так делаю) getline() и std::string.

http://cppreference.com/cppio/get.html
http://cppreference.com/cppio/getline.html
http://cppreference.com/cppstring/getline.html
Автор: 4aineG
Дата сообщения: 16.08.2008 12:10
Задание: Дан граф, определить является ли он связным.
Подскажите пожалуйста, при выполнении этого задания лучше использовать матрицу или списки смежности и еще: нужно наверно будет использовать обход в глубину или ширину, какой выбрать?
Автор: crazyASD
Дата сообщения: 19.08.2008 20:27
Добрый день уважаемые гуру!

Есть проблема с компиляцией исходника DLL на C.
Компилирую Borland C++ Compiler 5.5 + Tasm
Проблема заключается в том, что нумерация в секции экспорта после компиляции уползает вперед.

Тоесть в *.def файле функция WkbListPort2 @38 а функция WkbListBox2 @39
В скомпилированной же Dll:
27 (27): WkbListPort2 56    0x00001F10    0xFFFFDD10
25 (25): WkbListBox2    55    0x00001E51    0xFFFFDC51

Должно же быть:
29 (29): WkbListPort2    38    0x00001F02    0xFFFFED02
27 (27): WkbListBox2    39    0x00001E43    0xFFFFEC43

Подскажите, от чего это может меняться во время компиляции? (проверил на наличие экпортов исходник и ничего там не нашел, все назначения идут через def файл).
Заранее спасибо за ответ!
Автор: Gamburg
Дата сообщения: 25.08.2008 14:36
нужно поменять местами значение четных и нечетных индексов
{

int *pa;

const int n=5;
int tmp;
int a[n]={1,2,3,4,5};
pa=a;
for(int i=0;i<n;i++)
{

if(*(pa+i)%2==0&&*pa+i>0)
{
*(pa+i)=tmp;
tmp=*pa+(i-1);
здесь ругается компилятор на левую часть *pa+(i-1)=(*pa+i);
}

cout<<*(pa+i);
}

}
Автор: Lyrik
Дата сообщения: 25.08.2008 15:47
Gamburg
у Вас вообще там непонятно что написано %)
если условие задачи такое:

Цитата:
нужно поменять местами значение четных и нечетных индексов

то индекс равный 0 менять с индексом равным 1, потом индекс==2 с индексом==3, т.е. менять значение соседних элементов о_О

Цитата:
здесь ругается компилятор на левую часть

а компилер ругается по делу. он говорит Вам, что нельзя присвоить значение константе, т.к. *pa+(i-1) - это число, а не указатель. для указателя нужно сделать так:

Код: *(pa+i-1)
Автор: Gamburg
Дата сообщения: 25.08.2008 16:10
Lyrik :но все равно Ваш код не реализует требуемого условия
подскажите как правильно, пожалуйсто
Автор: Lyrik
Дата сообщения: 25.08.2008 16:39
Gamburg
так какое условие задачи?
такое:

Цитата:
индекс равный 0 менять с индексом равным 1, потом индекс==2 с индексом==3, т.е. менять значение соседних элементов

или другое? сформилуруйте пожалуйста более точно

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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