Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задачки для новичков! Задачи 
:(
    Опции темы
Чoо
Дата 18.11.2010, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Dov
Код

        char r;
        cin >> r;
        if(r != 'y' && r != 'Y')
                break;

так надо? smile

**добавил**
Dov,  разобрался с исходником. Меня смущало, что в цикле:
Код

        while(mid > 0 && fgetc(file) != '\n')
        {
            mid -= 2;
            fseek(file, mid < 2 ? 0 : mid, SEEK_SET);
        }

вы отнимали 2, а не единицу. Возникли вопросы почему так. В отладчике посмотрел: у меня русские буквы кодируются двумя байтами (вопрос - почему? В принципе догадываюсь: поскольку работаю в юникоде, русские буквы кодируются двумя байтамИ, а английские одним. Верно?),и, в принципе, программа не выходила за пределы строки. Если же англоязычный словарь, то получалось, что mid мог перейти и на предыдущую строку и продолжить перемещаться назад.  и программа просто висла.
пример словаря:
Код

aedi
citcat
clatter
dettimd
dlim
dniksne
ebel
ecneita

ищем слово ebel. 

Если декрементировать mid, то всё ищет и не виснет. 
и еще сократил:
Код

        fgets(buf, N, file);
        if(buf[strlen(buf) - 1] == '\n')
            buf[strlen(buf) - 1] = '\0';

до
Код

fscanf(file,"%s",buf);


**добавил**
Цитата(Чoо @  18.11.2010,  16:01 Найти цитируемый пост)
В отладчике посмотрел: у меня русские буквы кодируются двумя байтами (вопрос - почему?

сообразил... это потому что у меня словарь в юникоде smile.

Это сообщение отредактировал(а) Чoо - 18.11.2010, 17:16


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Чoо
Дата 22.11.2010, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Цитата

Класс "комплексное число".
    Объявите класс "Комплексное число", полями которого являются
    действительная и мнимая части числа, а методами - сложение и умножение
    на другое комплексное число, определение модуля и вывод на экран.

мое решение:
Код

/*
    Класс "комплексное число".
    Объявите класс "Комплексное число", полями которого являются
    действительная и мнимая части числа, а методами - сложение и умножение
    на другое комплексное число, определение модуля и вывод на экран.
 */
#include <iostream>
#include <math.h>
using namespace std;

class clx {
    int realpart, imaginarypart; //действительная и мнимая части соотв.
public:
    /*методы */
    void clx_sum(clx); //прибавляет к комплексному числу другое комплексное число
    void clx_mul(clx); //умножает КЧ на другое КЧ
    float clx_mod(); // находит модуль КЧ
    int get_realpart(); //получает действительную часть
    int get_imaginarypart(); //получает мнимую часть
    void clx_print(char*) const; //выводит КЧ на экран
    //конструкторы
    clx(int,int);
    clx() {realpart = 0; imaginarypart = 0;}
    //деструктор необязателен
};
void clx::clx_sum(clx x)
{
    /* z = (x1 + x2; y1 + y2 */
    realpart += x.get_realpart();
    imaginarypart += x.get_imaginarypart();
}
void clx::clx_mul(clx x)
{
    /* z = (x1*x2 - y1*y2; x1*y2 + x2*y1) */
    int r = realpart; //времянка, что бы не потерять первоначальное значение действительной части
    realpart = r * x.get_realpart() - imaginarypart * x.get_imaginarypart();
    imaginarypart = r * x.get_imaginarypart() + x.get_realpart() * imaginarypart;
}
float clx::clx_mod()
{
    /* МОДУЛЬ = КОРЕНЬ(x^2 + y^2) */
    return sqrt(pow(realpart,2) + pow(imaginarypart,2));
}
int clx::get_realpart()
{
    return realpart;
}
int clx::get_imaginarypart()
{
    return imaginarypart;
}

void clx::clx_print(char *name) const
{
  cout << name <<"(" <<realpart << ";" << imaginarypart << ")";
}

clx::clx(int real, int imaginary)
{
    realpart = real;
    imaginarypart = imaginary;
}

int main()
{
    clx a(3,4), b(2,3);
    cout << "a = ";
    a.clx_print("a"); cout << " + "; b.clx_print("b"); cout << endl;
    a.clx_sum(b);
    a.clx_print("a"); cout << endl;

    cout << "a = ";
    a.clx_print("a"); cout << " * "; b.clx_print("b"); cout << endl;
    a.clx_mul(b);
    a.clx_print("a"); cout <<endl;

    cout << "mod(a) = " << a.clx_mod() << endl;

    return 0;
}

правда я не понимаю предупреждение:
Цитата

warning: deprecated conversion from string constant to ‘char*’

почему преобразование устаревшее, и как сделать неустаревшим smile.

Добавлено через 56 секунд
это ругается на 
Код

a.clx_print("a"); cout << endl;

и все вызовы метода print


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
bsa
Дата 22.11.2010, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Должно быть:
Код
void clx_print(const char*)


Это сообщение отредактировал(а) bsa - 22.11.2010, 18:24
PM   Вверх
Чoо
Дата 22.11.2010, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



bsa, оказывается все просто smile
вот еще одну задачу решил:
Цитата

    Класс "Прямоугольник".
    Объявите класс "прямоугольник" с полями: int x1, y1, x2, y2
    (координаты левого верхнего и правого нижнего углов) и методами:
        пересечься с другим прямоугольником;
        проверить, попадает ли точка в данный прямоугольник;
        масштабировать при условии неподвижности левого верхнего угла;
        передвинуть по плоскости без вращения;

Код

/*
    Класс "Прямоугольник".
    Объявите класс "прямоугольник" с полями: int x1, y1, x2, y2
    (координаты левого верхнего и правого нижнего углов) и методами:
        пересечься с другим прямоугольником;
        проверить, попадает ли точка в данный прямоугольник;
        масштабировать при условии неподвижности левого верхнего угла;
        передвинуть по плоскости без вращения;
 */
#include <iostream>
using namespace std;

struct pos_rectangle{
    int x1, y1, x2, y2;
};

class rectangle{
    pos_rectangle p;
public:

    /*пересекает текущий прямоугольник с  другим прямоугольником*/
    void cross(rectangle);
    /*проверяет попадает ли точка в прямоугольник */
    bool test(int,int);
    /*передвигает прямоугольник по плоскости на заданные координаты (левый верхний угол)*/
    void move(int, int);
    /*масштабирование*/
    void zoom(float); //в качестве параметра будем передавать множитель.
    /*следующий метод получает координаты прямоугольниква*/
    pos_rectangle get_pos() {return p;}
    /*конструкторы*/
    rectangle(int x1,int y1,int x2, int y2) {
        /*обеспечим, что бы первое значение всегда было меньше второго*/
        if(x1<x2)
        {
            p.x1 = x1;
            p.x2 = x2;
        }
        else
        {
            p.x1 = x2;
            p.x2 = x1;
        }
        /*аналогично */
        if(y1<y2)
        {
            p.y1 = y1;
            p.y2 = y2;
        }
        else
        {
            p.y1 = y2;
            p.y2 = y1;
        }
    }
    rectangle() {
        p.x1 = 0;
        p.x2 = 0;
        p.y1 = 0;
        p.y2 = 0;
    }
};
void rectangle::cross(rectangle dest)
{
    pos_rectangle p_dest;
    int x,y;
    p_dest = dest.get_pos();
    /*будем передвигать левый верхний угол первого прямоугольника внутри координат второго
      до тех пор, пока координаты нижнего правого угла первого прямоугольника не выйдут
      за координаты нижнего правого угла второго прямоугольника

      Будем добиваться такого пересечения:
                -----------------
                |               |
                |       --------|--------
                |       |       |       |
                -----------------       |
                        |               |
                        -----------------
    */


    if((dest.test(p.x1,p.y1) && !dest.test(p.x2,p.y2)) ||
       (rectangle::test(p_dest.x1,p_dest.y1) && !rectangle::test(p_dest.x2,p_dest.y2)) )
        cout << "Rectangle \"a\" crossed rectangle \"b\"\n"; //пересеклись
    else
        /*перемещаем левый угол в середину второго прямоугольника*/
    {
        /*вычислим координаты*/
        x = (p_dest.x1+p_dest.x2)/2;
        y = (p_dest.y1+p_dest.y2)/2;
        rectangle::move(x,y);
        rectangle::cross(dest);
    }
}
bool rectangle::test(int x, int y)
{
    if(x >= p.x1 && x <= p.x2 && y >= p.y1 && y <= p.y2)
        return true;
    else
        return false;
}
void rectangle::move(int x, int y)
{
    int l = p.x2 - p.x1;
    p.x1 = x;
    p.x2 = x + l;
    l = p.y2 - p.y1;
    p.y1 = y;
    p.y2 = y + l;
}
void rectangle::zoom(float f)
{
    p.x2 *=f;
    p.y2 *=f;
}

int main()
{
    rectangle a(0,0,10,6), b(3,3,30,26);
    pos_rectangle A,B;
    A = a.get_pos();
    B = b.get_pos();
    /*покажем координаты*/
    cout << "Rectangle a[(" << A.x1 << "," << A.y1 << "),(" << A.x2 << "," << A.y2 << ")]\n";
    cout << "Rectangle b[(" << B.x1 << "," << B.y1 << "),(" << B.x2 << "," << B.y2 << ")]\n";
    a.cross(b);
    A = a.get_pos();
    cout << "Rectangle a[(" << A.x1 << "," << A.y1 << "),(" << A.x2 << "," << A.y2 << ")]\n";
    cout << "a * 2:\n";
    a.zoom(2);
    A = a.get_pos();
    cout << "Rectangle a[(" << A.x1 << "," << A.y1 << "),(" << A.x2 << "," << A.y2 << ")]\n";
    return 0;
}

можно было бы сделать еще метод принт, что бы не было безобразия с выводом координат прямоугольников smile



--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Чoо
Дата 23.11.2010, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



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

следующая задача:
Цитата

    Класс "рекурсивный список".
    Объявите класс, который реализует односвязный рекурсивный список строк
    в свободной памяти. Список представляется двумя указателями: указателем на 
    строку в свободной памяти (поле info) и указателем на список же, только
    более короткий(поле tail). В частном случае одноэлементного списка
    этот указатель равен 0

я не понял что требуется: написать класс, рекурсивность которого проявляется только во время считывания элементов списка?
при других операциях работы со списком (добавление элемента и удаление элемента) я рекурсии не наблюдаю. 


при удалении рекурсию можно сделать только что бы установить указатель на удаляемый элемент. 
а при добавлении - если список делаем упорядоченным. Однако в задании сказано про рекурсивный список а не упорядоченный.

Это сообщение отредактировал(а) Чoо - 23.11.2010, 15:32


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Чoо
Дата 23.11.2010, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



вобщем сделал класс только с рекурсивным выводом списка. непонятно что требовалось в задании.
Код

/*
    Класс "рекурсивный список".
    Объявите класс, который реализует односвязный рекурсивный список строк
    в свободной памяти. Список представляется двумя указателями: указателем на
    строку в свободной памяти (поле info) и указателем на список же, только
    более короткий(поле tail). В частном случае одноэлементного списка
    этот указатель равен 0
 */
#include <iostream>
#include <string.h>
using namespace std;

/*элемент списка*/
struct element{
    char *info;
    element *tail;

    /*введем конструктор, который будет выделять память для нового
      элемента (под строку) и заполнять его
    */
    element(const char *s){
        info = new char[strlen(s)+1];
        strcpy(info,s);
        tail = 0;
    }
    /*введем деструктор, который будет освобождать память, занимаемую
      строкой */
    ~element(){
        delete []info;
    }
};

/*собственно класс, реализующий список*/
class list{
private:
    element *head; //голова списка
    /*приватные методы*/
    void show_rec(element *curr); //принимает указатель на текущий элемент и выводит его и все последующие
    void show_rec_rev(element *curr); //аналогично, но в обратном порядке
public:
    /*конструктор*/
    list() {head = 0;}
    /*деструктор*/
    ~list(); //в деструкторе надо освободить память, занимаемую элементами списка и строками в них

    /*методы*/
    void add(const char *s); //добавляет элемент в список
    void del(const char *s);  //удаляет элемент из списка. pre - для указателя на предыдущий элемент
    void show(); //выводит все элементы списка на экран
    void showreverse(); //выводит все элементы списка с хвоста
};
/*деструктор*/
list::~list()
{
    while(head)
    {
        element *p = head->tail;
        delete head;
        head = p;
    }
}

/*определение методов*/
void list::add(const char *s)
{
    if(!head)
        head = new element(s);
    else
    {
        element *p = new element(s);
        p->tail = head;
        head = p;
    }
}
void list::del(const char *s)
{
    element *pre = 0, *curr = head;
    while(curr)
    {
        if(strcmp(s,curr->info) == 0)
        {
            /*удаляем текущий элемент и корректируем указатели*/
            if(pre)
                pre->tail = curr ->tail;
            delete curr;
            break;
        }
        else
        {
            pre = curr;
            curr = curr->tail;
        }
    }
}

/*секция выводит список в прямом порядке*/
void list::show()
{
    show_rec(head);
}
void list::show_rec(element *curr)
{
    if(!curr) return;
    cout << curr->info << endl;
    list::show_rec(curr->tail);
}
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/

/*секция выводит список в обратном порядке*/
void list::showreverse()
{
    show_rec_rev(head);
}
void list::show_rec_rev(element *curr)
{
    if(!curr) return;
    show_rec_rev(curr->tail);
    cout << curr->info << endl;
}
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/

int main()
{
    list l;
    char s[2];
    s[1] = 0;
    for(char c = 'a'; c < 'i'; c++)
    {
        s[0] = c;
        l.add(s);
    }
    cout << "вывод с головы списка:\n";
    l.show();
    cout << "вывод с хвоста списка:\n";
    l.showreverse();
    cout << "удалили одну строку (\"f\") и вывели список с хвоста:\n";
    l.del("f");
    l.showreverse();
    return 0;
}



Это сообщение отредактировал(а) Чoо - 24.11.2010, 10:40


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Чoо
Дата 25.11.2010, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Цитата

    Система из трех классов. Объявите систему классов: "Точка", "Прямоугольник",
    "Эллипс". Определите методы, которые перемещают фигуру по плоскости, изменя-
    ют е размеры и выводят на экран.


Код

/*
    Система из трех классов. Объявите систему классов: "Точка", "Прямоугольник",
    "Эллипс". Определите методы, которые перемещают фигуру по плоскости, изменя-
    ют е размеры и выводят на экран.
 */
#include <stdio.h>


class point{
protected:
    int pos_x, pos_y;
public:
    point(int x, int y) {pos_x = x; pos_y = y;}
    virtual void show();
    virtual void resize(int factor) {};
    virtual void set_pos(int newpos_x, int newpos_y);
};
/*определение методов*/
void point::show()
{
    printf("координаты точки:\n     x: %d\n     y: %d\n", pos_x, pos_y);
}
void point::set_pos(int newpos_x, int newpos_y)
{
    printf("МЕНЯЕМ ПОЛОЖЕНИЕ...\n");
    pos_x = newpos_x; pos_y = newpos_y;
    printf("новые ");
    show();
}

class rectangle:public point{
private:
    int height, width; //высота и ширина понадобятся при перемещении прямоугольника
    void get_size();
protected:
    int pos_x2, pos_y2; //координаты прямоугольника можно задать 2-мя точками
public:
    rectangle(int x1, int y1, int x2, int y2);
    void show();
    void resize(int factor);
    void set_pos(int newpos_x, int newpos_y); //переопределяем, так как надо будет менять пары координат
};
/*конструктор*/
rectangle::rectangle(int x1, int y1, int x2, int y2):point(x1,y1),pos_x2(x2), pos_y2(y2)
{
    get_size();
}

/*определение методов*/
void rectangle::get_size()
{
    if((width = pos_x2 - pos_x)<0)
        width *= -1;
    if((height = pos_y2 - pos_y)<0)
        height *= -1;
}

void rectangle::show()
{
    printf("координаты прямоугольника:\n     верхний левый угол: %d;%d\n     нижний правый угол: %d;%d\n",
           pos_x, pos_y, pos_x2, pos_y2);
}
void rectangle::resize(int factor)
{
    /*перемещаем только правый нижний угол, взависимости от множителя
      положительный множитель - перемещаем вправо вниз,
      отрицательный - влево вверх, пока координаты угла больше нуля
    */
    printf("МЕНЯЕМ РАЗМЕР...\n");
    if(factor)
    {
        pos_x2 *= factor;
        pos_y2 *= factor;
    }
    else
        if(factor<0)
        {
            pos_x2 /= -factor;
            pos_y2 /= -factor;
        }
    get_size();
    printf("новые ");
    show();
}
void rectangle::set_pos(int newpos_x, int newpos_y)
{
    /*координаты задаем левым верхним углом прямоугольника.
      не забываем менять координаты првого нижнего угла */
    printf("МЕНЯЕМ ПОЛОЖЕНИЕ...\n");
    pos_x = newpos_x; pos_x2 = pos_x + width;
    pos_y = newpos_y; pos_y2 = pos_y + height;
    printf("новые ");
    show();
}

class ellipse:public point{
    int radius; //окружность определяется одной точкой и радиусом от нее.
public:
    ellipse(int x, int y, int r):point(x,y),radius(r) {} ;
    void show();
    void resize(int factor);
};
/*реализация класса*/
void ellipse::resize(int factor)
{
    printf("МЕНЯЕМ РАЗМЕР...\n");
    //ноль не обрабатываем
    radius = factor > 0 ? radius * factor : radius / (-factor);
    printf("новые ");
    show();
}
void ellipse::show()
{
    printf("коордынаты эллипса:\n     x: %d\n     y: %d\n     r: %d\n", pos_x, pos_y, radius);
}

int main()
{
    point *p;
    p = new point(100,500);
    p->show();
    p->resize(0); //ни чо не делает
    p->set_pos(10,50);
    delete p;

    /*дань полиморфизму =) */
    p = new rectangle(0,0,20,10);
    p->show();
    p->resize(2);
    p->set_pos(5,5);
    delete p;

    /*опять же полиморфизм*/
    p = new ellipse(10,10,6);
    p->show();
    p->resize(-2);
    p->set_pos(15,15);
    delete p;

    return 0;
}

прокомментируйте, если не трудно smile


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
baldina
Дата 26.11.2010, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Чoо @  25.11.2010,  19:56 Найти цитируемый пост)

class point{
protected:
    int pos_x, pos_y;
public:
    point(int x, int y) {pos_x = x; pos_y = y;}
    virtual void show();
    virtual void resize(int factor) {};
    virtual void set_pos(int newpos_x, int newpos_y);
};

1. используется protected, т.е. pos_x и pos_y доступны в производных классах. вроде бы класс предназначен для наследования. об этом говорит и наличие виртуальных функций. но в классах, которые могут быть базовыми, делают виртуальные деструкторы. для избежания проблем в будущем))
2. что означает resize в применении к point??
3. чего виртуального в функции set_pos? если у любой фигуры есть точка отсчета (origin), то его изменение не зависит от фигуры.
Код

class rectangle:public point{

открытое наследование означает "является", "работает как". например, "ту134 является самолетом; самолет является летательным аппаратом". в данном случае прямоугольник не является точкой. в качестве базового класса надо выбрать что-то абстрактное - геом. фигуру.

Код

class point {...}; // не геом фигура

class shape {
private:
  point origin;
public:
  virtual ~shape() {}
  void move (const point& distance) { origin += distance; }
  virtual void draw () const = 0;
  point get_origin () const;
...
};

class geom_point : public shape {...};
class rect : public shape {...};



Это сообщение отредактировал(а) baldina - 26.11.2010, 10:25
PM MAIL   Вверх
Чoо
Дата 26.11.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



baldina
1. - protected объявил для того, что бы можно было получить доступ к полям класса только из методов самого класса, а так же из производных классов.
2. resize в применении к поинт - ни чего не делает, т.к. точка - она точкА, ее невозможно масштабировать.
3. про точку отсчета немного недопонял:
в 10 строке вашего класса получение точки отсчета. Метод будет вызываться из производных классов(как и move), однако точка отсчета представлена только координатами одной точки x и y. И теперь мне не понятно, если прямоугольник будет производным классом от shape, то как будет задано его положение на сетке координат, ведь координаты одной точки для него не достаточны.
move так же меняет координаты одной точки.

Это сообщение отредактировал(а) Чoо - 26.11.2010, 15:58


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
baldina
Дата 26.11.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Чoо @  26.11.2010,  15:51 Найти цитируемый пост)
1. - protected объявил для того, что бы можно было получить доступ к полям класса только из методов самого класса, а так же из производных классов.

говорю же. если класс должен быть базовым - деструктор объявляется виртуальным

Цитата(Чoо @  26.11.2010,  15:51 Найти цитируемый пост)
. про точку отсчета немного недопонял

точка отсчета - одна, она не зависит от фигуры. это ноль в локальной системе координат фигуры
Цитата(Чoо @  26.11.2010,  15:51 Найти цитируемый пост)
если прямоугольник будет производным классом от shape, то как будет задано его положение на сетке координат, ведь координаты одной точки для него не достаточны

достаточно. вот что бы отобразить, помимо origin надо знать еще width и height, а что бы переместить и origin вполне хватит
Код

                      width
                -----------------
                |               | height
                |       --------|--------
                |       |       |       | height
                +----------------       |
            origin1     |               |
                        +----------------
                    origin2   width


Добавлено @ 16:21
Код

class rectangle:public shape{
private:
    int height, width; 
public:
    rectangle(int x1, int y1, int x2, int y2) : shape(x1, y1), width(x2-x1), height(y2-y1) {}
    void show() {
       point o = get_origin ();
       draw_rectangle (o.x, o.y, o.x+width, o.y+height);
    }
};


Добавлено через 10 минут и 8 секунд
кстати. функция resize, где factor - целое число, принимающее отрицательные значения (при уменьшении), выглядит несколько странно.
проще factor иметь действительным (double) и использовать только операцию умножения. уменьшение будет при значениях от 0 до 1.
а вообще - почитайте про аффинные преобразования, это простой и универсальный инструмент для перемещения, масштабирования, поворота и их комбинаций. все программы 2D и 3D графики используют их.

Это сообщение отредактировал(а) baldina - 26.11.2010, 16:22
PM MAIL   Вверх
baldina
Дата 26.11.2010, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Чoо @  26.11.2010,  15:51 Найти цитируемый пост)
2. resize в применении к поинт - ни чего не делает, т.к. точка - она точкА, ее невозможно масштабировать.

конечно. вы вводите в интерфейс класса бесполезную функцию. вот если бы эта функция была в интерфейсе класса shape - другое дело.
(опять кстати - при использовании аффинных преобразований потребуется переопределить в производных классах только функции отображения и др. специфичные для конкретных фигур. а геометрические преобразования выполняются универсально)

PM MAIL   Вверх
Чoо
Дата 26.11.2010, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Цитата(baldina @  26.11.2010,  16:16 Найти цитируемый пост)
достаточно. вот что бы отобразить, помимо origin надо знать еще width и height, а что бы переместить и origin вполне хватит

да, понял. Спасибо. Затупил что-то smile.. 
вот что получилось:
Код

/*
    Система из трех классов. Объявите систему классов: "Точка", "Прямоугольник",
    "Эллипс". Определите методы, которые перемещают фигуру по плоскости, изменя-
    ют е размеры и выводят на экран.
 */
#include <stdio.h>

struct point{
    int x,y;
};

/*абстрактная геометрическая фигура*/
class shape {
private:
  point origin;
public:
  shape() {origin.x = 0; origin.y = 0;}
  virtual ~shape() {}
  void move (const point &distance);
  virtual void draw () const = 0;
  virtual void resize(int factor) = 0;
  point get_origin () const;
};
void shape::move(const point &distance)
{
    origin.x += distance.x;
    origin.y += distance.y;
    printf("ИЗМЕНИЛИ ПОЛОЖЕНИЕ...\n");
    draw();
}
point shape::get_origin() const
{
    return origin;
}

/*точка*/
class geom_point:public shape{
public:
    void draw() const;
    void resize(int factor) {printf("изменение размеров точки невозможно!\n");}
};
void geom_point::draw() const
{
    point p;
    p = get_origin();
    printf("Координаты точки (x;y): %d;%d\n",p.x,p.y);
}

/*эллипс*/
class ellipse:public shape{
    int radius;
public:
    void draw() const;
    void resize(int factor);
};
void ellipse::draw() const
{
    point p;
    p = get_origin();
    printf("Координаты эллипса (x;y): %d;%d\n     радиус: %d\n",p.x,p.y,radius);
}
void ellipse::resize(int factor)
{
    printf("МЕНЯЕМ РАЗМЕР...\n");
    if(radius)
      radius = factor > 0 ? radius * factor : radius / (-factor);
    else
      radius = factor > 0 ? radius + factor : radius + (-factor);
    draw();
}

/*прямоугольник*/
class rectangle:public shape{
    int width, height;
public:
    rectangle() { width = 0; height = 0;}
    void draw() const;
    void resize(int factor);
};
void rectangle::draw() const
{
    point p;
    p = get_origin();
    printf("Координаты прямоугольника (x;y): %d;%d\n     ширина: %d\n     высота: %d\n",p.x,p.y,width, height);
}
void rectangle::resize(int factor)
{
    printf("МЕНЯЕМ РАЗМЕР...\n");
    if(factor>0)
    {
        width = width != 0 ? width * factor : width + factor;
        height = height != 0 ? height * factor : height + factor;
    }
    else
        if(factor<0)
        {
            width = width != 0 ? width / (-factor) : width + (-factor);
            height = height !=0 ? height / (-factor) : height + (-factor);
        }
    draw();
}

int main()
{
    shape *s;
    s = new geom_point;
    s->draw();
    s->move((point){3,-4});
    delete s;

    s = new ellipse;
    s->draw();
    s->move((point){5,5});
    s->resize(-2);
    delete s;

    s = new rectangle;
    s->draw();
    s->move((point){-1,-1});
    s->resize(-5);
    delete s;

    return 0;
}

Всё правильно понял?
однако не получилось избваиться от метода resize для точки.

Добавлено @ 17:46
и непонятно почему в объявлении метода draw константа. он же ни чего не принимает и ни чего не возвращает.. 
(а это нужно для того, что бы случайно не изменить содержимое полей объекта, что-то медленно все вспоминаю)

Это сообщение отредактировал(а) Чoо - 26.11.2010, 18:13


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
baldina
Дата 29.11.2010, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Чoо
1. добавьте в point конструктор и операторы +,+=,*,*=
это позволит сделать код короче и яснее
2. можно resize не делать виртуальным. достаточно хранить коэф. масштабирования, а при рисовании (и прочих операциях) умножать на него координаты точек.
Код

class shape {
 ...
 private:
   point origin;
   double factor;
 protected:
   point transform (const point& p) const
   {
      return origin + p*factor;
   }
 public:
   shape (const point& o = point(0,0)) : origin (o), factor(1.) {}
   void resize (double f) const { factor *= f; }
   double get_scale () const { return factor; }
 ...
};
...
void rectangle::draw() const
{
    printf("Прямоугольник (ширина, высота): %lf %lf\n", width, height);
    printf("\tМасштабный коэф.: %lf\n", get_scale());
    // левый нижний угол
    point lb =  transform(point(0,0));
    // правый верхний угол
    point rt =  transform(point(width,height));
    printf("\tКоординаты (x1,y1,x2,y2): %lf %lf %lf %lf\n", lb.x, lb.y, rt.x, rt.y);
}



Это сообщение отредактировал(а) baldina - 29.11.2010, 09:44
PM MAIL   Вверх
Чoо
Дата 30.11.2010, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



baldina, спасибо, что помогаете smile
переделал решение, вот результат:
Код

/*
    Система из трех классов. Объявите систему классов: "Точка", "Прямоугольник",
    "Эллипс". Определите методы, которые перемещают фигуру по плоскости, изменя-
    ют е размеры и выводят на экран.
 */
#include <stdio.h>

class point{
public:
    int x,y;
    point() {x = 0; y = 0;}
    point(int pos_x, int pos_y) {x = pos_x; y = pos_y;}
    /*перегружаем операторы +,*,=, +=, *=  */
    point operator +(point p2);
    point operator *(point p2);
    point operator =(point p2);
    void operator +=(point p2);
    void operator *=(point p2);

};
point point::operator +(point p2)
{
    point tmp;
    tmp.x = x + p2.x;
    tmp.y = y + p2.y;
    return tmp;
}
point point::operator *(point p2)
{
    point tmp;
    tmp.x = x * p2.x;
    tmp.y = y * p2.y;
    return tmp;
}

point point::operator =(point p2)
{
    x = p2.x;
    y = p2.y;
    return *this;
}
void point::operator +=(point p2)
{
    x = x + p2.x;
    y = y + p2.y;
}
void point::operator *=(point p2)
{
    x = x*p2.x;
    y = y*p2.y;
}

/*абстрактная геометрическая фигура*/
class shape {
private:
  point origin;
  double factor;
public:
  shape (const point &o) : origin (o), factor(1.) {}
  virtual ~shape() {}

  void move (const point &distance);
  void resize (const double f);

  point get_origin () const {return origin;}
  double get_scale () const {return factor;}

  virtual void draw () const = 0;
};
void shape::move(const point &distance)
{
    origin = distance;
    printf("ИЗМЕНИЛИ ПОЛОЖЕНИЕ...\n");
    draw();
}
void shape::resize(const double f)
{
    printf("ПОМЕНЯЛИ МАСШТАБНЫЙ КОЭФФИЦИЕНТ...\n");
    factor *= f;
    draw();
}


/*точка*/
class geom_point:public shape{
public:
    geom_point():shape((point){0,0}){};
    geom_point(const point &o):shape(o){};
    void draw() const;
};
void geom_point::draw() const
{
    point p;
    p = get_origin();
    printf("Координаты точки (x;y): %d;%d\n",p.x,p.y);
}

/*эллипс*/
class ellipse:public shape{
    int radius;
public:
    ellipse():shape((point){0,0}),radius(0){};
    ellipse(const point &o, int r):shape(o),radius(r){};
    void draw() const;
};
void ellipse::draw() const
{
    point p;
    p = get_origin();
    printf("Координаты эллипса (x;y): %d;%d\n     радиус: %f\n",p.x,p.y,radius*get_scale());
}

/*прямоугольник*/
class rectangle:public shape{
    int width, height;
public:
    rectangle():shape((point){0,0}),width(0), height(0){};
    rectangle(const point &o, int w, int h):shape(o),width(w), height(h){};
    void draw() const;
};
void rectangle::draw() const
{
    point p;
    p = get_origin();
    double factor = get_scale();
    printf("Координаты прямоугольника (x;y): %d;%d\n     ширина: %f\n     высота: %f\n",p.x,p.y,width*factor, height*factor);
}

int main()
{
    shape *s;
    s = new geom_point((point){2,3});
    s->draw();
    s->move((point){3,-4});
    delete s;

    printf("\n");

    s = new ellipse((point){0,0},3);
    s->draw();
    s->move((point){5,5});
    s->resize(0.5);
    delete s;

    printf("\n");

    s = new rectangle((point){0,0},5,4);
    s->draw();
    s->move((point){-1,-1});
    s->resize(5);
    delete s;

    return 0;
}

Надеюсь, что в этот раз всё правильно smile
на выходных решил еще одну задачу:
Цитата

    Объявите класс file для работы с файловой системой (удаление, переименование,
    чтение и запись атрибутов). Унаследуйте от него класс catalog для работы с
    каталогами (получение массива файлов, находящихся в каталоге) и вспомогательный
    класс filter, объект которого должен передаваться в метод получения содержимого



Код

/*
    Объявите класс file для работы с файловой системой (удаление, переименование,
    чтение и запись атрибутов). Унаследуйте от него класс catalog для работы с
    каталогами (получение массива файлов, находящихся в каталоге) и вспомогательный
    класс filter, объект которого должен передаваться в метод получения содержимого
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <time.h>
#include <dirent.h>
#include <errno.h>

struct filter{
    char extention[20]; //расширение файла
    /*можно было бы сделать больше полей, но пришлось бы писать больше кода для обработки*/
};

class file{
private:
    void get_premission(short bit, int shift, bool prot); //пока не знаю, куда запихнуть эту функцию, поэтому
                                                          //поместил ее в методы. Самма функция работает корректно
                                                          //но выглядит коряво
public:
    virtual ~file() {};
    void delete_file(const char *name);
    void rename_file(const char *old_name, const char *new_name);
    int attribute_read(struct stat *buf, const char *filename); //вернет ноль, если удастся получить аттрибуты, иначе - -1.
    void show_attribute(const char *filename); //просто показывает атрибуты файла (не все) как в команде ls -l.
                           //Вместо имени пользователя и группы будет отображено только ID
    void attribute_write() {}; //не реализовал. Слишком нудно для учебной задачи :)
};
void file::rename_file(const char *old_name, const char *new_name)
{
    if(rename(old_name,new_name))
        printf("ошибка переименования!\n");
    else
        printf("файл успешно переименован\n");
}
void file::delete_file(const char *name)
{
    remove(name);
}
int file::attribute_read(struct stat *buf, const char * filename)
{
    if(stat(filename,buf)==0)
        return 0;
    return -1;
}
void file::get_premission(short bit,int shift, bool prot)
{
    switch(bit << shift)
    {
    case S_IXUSR:
        if(prot)
            if(shift!=6)
                printf("--s");
            else
                printf("--t");
        else
            printf("--x");
        break;
    case S_IWUSR:
        printf("-w");
        if(prot)
            if(shift != 6)
                printf("S");
            else
                printf("T");
        else
            printf("-");
        break;
    case S_IXUSR | S_IWUSR:
        printf("-w");
        if(prot)
            if(shift!=6)
                printf("s");
            else
                printf("t");
        else
            printf("x");
        break;
    case S_IRUSR:
        printf("r-");
        if(prot)
            if(shift!=6)
                printf("S");
            else
                printf("T");
        else
            printf("-");
        break;
    case S_IXUSR | S_IRUSR:
        printf("r-");
        if(prot)
            if(shift!=6)
                printf("s");
            else
                printf("t");
        else
            printf("x");
        break;
    case S_IWUSR | S_IRUSR:
        printf("rw");
        if(prot)
            if(shift!=6)
                printf("S");
            else
                printf("T");
        else
            printf("-");
        break;
    case S_IRWXU:
        printf("rw");
        if(prot)
            if(shift!=6)
                printf("s");
            else
                printf("t");
        else
            printf("x");
        break;
    default:
        printf("--");
        if(prot)
            if(shift!=6)
                printf("S");
            else
                printf("T");
        else
            printf("-");
    }
}

void file::show_attribute(const char *filename)
{
    struct stat buf;
    if(attribute_read(&buf,filename)!=0)
    {
        printf("Не удалось получиь аттрибуты...\n");
        return;
    }

    /*применяем макросы, что бы узнать тип файла*/
    if(S_ISREG(buf.st_mode))
        printf("-");
    else
    if(S_ISDIR(buf.st_mode))
        printf("d");
    else
    if(S_ISCHR(buf.st_mode))
        printf("c");
    else
    if(S_ISBLK(buf.st_mode))
        printf("b");
    else
    if(S_ISSOCK(buf.st_mode))
        printf("s");
    else
    if(S_ISFIFO(buf.st_mode))
        printf("p");
    else
    if(S_ISLNK(buf.st_mode))
        printf("l");
    else
        printf("uncnown_type");

    /*смотрим биты setuid, setgid и sticky
      их значения пригодятся позже (ни чего лучше
      безобразия дальше по коду не придумал)
    */
    bool setuid = 0, setgid = 0, sticky = 0;
    switch (buf.st_mode & 07000)
    {
    case S_ISVTX:
        sticky = 1; break;
    case S_ISVTX | S_ISGID:
        sticky = 1;
        setgid = 1; break;
    case S_ISVTX | S_ISUID:
        sticky = 1;
        setuid = 1; break;
    case S_ISGID:
        setgid = 1; break;
    case S_ISGID | S_ISUID:
        setgid = 1;
        setuid = 1; break;
    case S_ISUID:
        setuid = 1; break;
    case S_ISUID | S_ISGID | S_ISVTX:
        setuid = 1;
        setgid = 1;
        sticky = 1;
    }

    /*получаем права владельца*/
    get_premission(buf.st_mode & 0700,0,setuid);
    /*права группы*/
    get_premission(buf.st_mode & 070,3,setgid);
    /*права других пользователей*/
    get_premission(buf.st_mode & 07,6,sticky);

    /*выводим количество ссылок на файл*/
    printf("     %d ",buf.st_nlink);
    /*выводим ID владельца файла*/
    printf("%d     ",buf.st_uid);
    /*выводим ID группы-владельца*/
    printf("%d     ",buf.st_gid);
    /*выводим размер файла*/
    printf("%d  ",buf.st_size);
    /*покажем дату последней модификации файла*/
    struct tm *t;
    t = gmtime(&buf.st_mtime);
    char time[17];
    strftime(time,17,"%F %R",t);
    printf("%s ",time);
    /*имя файла*/
    printf("%s\n",filename);


}

class catalog:public file
{
    char *dirname;
    char **filelist; //список файлов хранится тут
    int files_count;  //количество файлов в списке
public:
    void get_filelist(const filter filt);           //получает список файлов в дирректории dirname
    //конструкторы-деструкторы
    catalog(const char *name);
    ~catalog();
};
catalog::catalog(const char *name)
{
    dirname = new char[strlen(name)+1];
    strcpy(dirname,name);
    files_count = 0;
    filelist = NULL;
}
catalog::~catalog()
{
    delete []dirname;
    /*очищаем список файлов*/
    for(int i = 0; i < files_count; ++i)
    {
        delete [] filelist[i];
    }
    delete []filelist;
}

void catalog::get_filelist(const filter filt)
{
    DIR *dir;
    char *buf;
    int filelist_size = 0; //количество указателей в массиве filelist
    struct dirent *entry;
    struct stat attrib;

    files_count = 0;
    /* открыть указанный каталог, если возможно. */
    dir = opendir(dirname);
    if(dir == NULL)
    {
        printf("Error opening %s: %s", dirname, strerror(errno));
        return;
    }
    entry = readdir(dir);
    while(entry != NULL)
    {
        if(((entry->d_name !=".") || (entry->d_name !="..")) &&
           ((strcmp(filt.extention,"")==0) || (strstr(entry->d_name,filt.extention))))
        {
            buf = new char[strlen(entry->d_name)+1];
            strcpy(buf,entry->d_name);
            if(attribute_read(&attrib,entry->d_name) == 0)
            {
                /*в задании сказано формировать только массив обычных файлов*/
                if(S_ISREG(attrib.st_mode))
                {
                    files_count++;
                    /*перераспределяем память, если это необходимо
                      при повторном вызове метода память так же перераспределится
                    */
                    if(filelist_size<files_count)
                    {
                        filelist_size = files_count * 2;
                        filelist = (char**) realloc((char**)filelist,sizeof(char**)*filelist_size);
                    }
                    filelist[files_count-1] = new char[strlen(entry->d_name)+1];
                    strcpy(filelist[files_count-1],entry->d_name);
                }
            }
        }
        entry = readdir(dir);
    }
    /*заполнили список файлов. Перераспределяем память, так как возхможно, что выделена лишняя*/
    filelist = (char**)realloc((char**)filelist,sizeof(char**)*files_count);
    closedir(dir);
    /*отобразим список файлов*/
    for(int i = 0; i < files_count; ++i)
    {
        printf("%s\n",filelist[i]);
    }

}

int main()
{
    catalog *d;
    filter filt = {".txt\0"};
    d = new catalog("/home/oem/Developed/Cpp/study/exercise/2.2.7.2/untitled2-build-desktop");
    printf("Список файлов в дирректории:\n");
    d->get_filelist(filt);
    for(;;)
    {
        printf("Введите имя файла, атрибуты которого хотите поулчить. Для выхода нажмите просто <enter>...\n");
        char name[255];
        gets(name);
        if(strcmp(name,"")==0)
            break;
        d->show_attribute(name);
        printf("\n");
    }
    for(;;)
    {
        printf("Введите имя файла, который хотите переименовать. Для выхода нажмите <enter>...\n");
        char name[255];
        gets(name);
        if(strcmp(name,"")==0)
            break;
        char new_name[255];
        printf("Введите новое имя файла...\n");
        gets(new_name);
        d->rename_file(name,new_name);
        printf("\nСписок файлов в дирректории:\n");
        d->get_filelist(filt);
        printf("\n");
    }
    for(;;)
    {
        printf("Введите имя файла, который хотите удалить. Для выхода нажмите <enter>...\n");
        char name[255];
        gets(name);
        if(strcmp(name,"")==0)
            break;
        d->delete_file(name);
        printf("\nСписок файлов в директории:\n");
        d->get_filelist(filt);
        printf("\n");
    }
    delete d;
    return 0;
}


решал под линукс. Еще хотел отсортировать файлы по-имени, но это в задачу не входит. Хотя можно было бы ввести метод сортировки smile.
если для тренировки, такая система классов подойдет. Если писать реальную систему, то я бы писал не пару дней, что слишком лениво делать на этапе обучения.

Это сообщение отредактировал(а) Чoо - 30.11.2010, 20:41


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Чoо
Дата 2.12.2010, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



По последним задачам, там все правильно?

Следующая задача.
Цитата

    Клонирование объекта. объявите некоторый класс и анпишите
    вирутальный метод, возвращающий копию объекта. Заместите его
    в производном классе.

Код

/*
    Клонирование объекта. объявите некоторый класс и анпишите
    вирутальный метод, возвращающий копию объекта. Заместите его
    в производном классе.
 */
#include <stdio.h>

class someclass{
public:
    int field1; //делаем видимым, что бы можно было изменить вне методов класса. Это не хорошо, но для примера норм.
    someclass() {}
    virtual ~someclass() {}
    virtual someclass *copyobj();
};
someclass *someclass::copyobj()
{
    someclass *c;
    c = new someclass;
    c->field1 = field1;
    return c;
}

class childclass:public someclass{
public:
    childclass() {}
    ~childclass() {}
    childclass *copyobj();
};
childclass *childclass::copyobj()
{
    childclass *c;
    c = new childclass;
    c->field1 = field1;
    return c;
}

int main()
{    
    someclass *c, *s;
    c = new someclass;
    c->field1 = 100500;
    //должны создать копию объекта с, где field1 = 100500;
    s = c->copyobj();
    delete c;
    delete s;

    c = new childclass;
    c->field1 = 300;
    s = c->copyobj();
    delete c;
    delete s;

    return 0;
}


вот тут не знаю. по идее я делаю копию, вроде результат есть smile. но может это надо делать иначе? Пробовал через создание временного объекта, но он временный и уничтожается до того, как я его уничтожу сам smile.


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1354 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.