Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

Чемпионы рейтинга экспертов в этой рассылке

Verena
Статус: Практикант
Рейтинг: 100
∙ повысить рейтинг >>
Лысков Игорь Витальевич
Статус: Специалист
Рейтинг: 55
∙ повысить рейтинг >>
Dr_Andrew
Статус: Студент
Рейтинг: 40
∙ повысить рейтинг >>

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1176
от 02.12.2008, 18:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 434, Экспертов: 43
В номере:Вопросов: 6, Ответов: 8

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>

Вопрос № 151941: Здраствуйте, уважаемые эксперты.У меня такое задание: написать алгоритм Евклида, использующий соотношения НОД(a, b)=НОД(a mod b, b) при a >= b НОД (a, b)=НОД (a, b mod a) при b >= a.Спасибо за внимание. Заранее благодарю...


Вопрос № 151943: Здравствуйте Есть конструктор копирования,в нем необходимо перераспределить память поля data. Если объект создан,то все ок,память для data выделена если же объект создается копированием myclass a=b; естественно возникнет ошибка при уда...
Вопрос № 151973: Здраствуйте Эксперты памагите мне пажалуйста написать рограмму на С++ Задание:построить прямоугольник со сторонами 30 и 50,центер которого савмещен с центром экрана.Стороны прямоугольника должны быть параллельны сторонам экрана. ...
Вопрос № 151995: Здравствуйте! Наведите пожалуйста простой пример рекурсии ....
Вопрос № 152005: Здравствуйте ув. эксперты! Подскажите как имея переменную int записать ее в файл?...
Вопрос № 152018: Здраствуйте уважаемые Эксперты.Моя задача состоит в следующем: нужно подсчитать количество слов длины К из данных N букв, не содержащих данное подслово. Нужен исходник на с++. Заранее благодарю...

Вопрос № 151.941
Здраствуйте, уважаемые эксперты.У меня такое задание:
написать алгоритм Евклида, использующий соотношения НОД(a, b)=НОД(a mod b, b) при a >= b НОД (a, b)=НОД (a, b mod a) при b >= a.Спасибо за внимание. Заранее благодарю
Отправлен: 26.11.2008, 18:31
Вопрос задал: Абраменко Роман Сергеевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Verena
Здравствуйте, Абраменко Роман Сергеевич!
Нужно использовать рекурсивную функцию (функцию, вызывающую саму себя и прерывающуюся по определённому условию). Выглядеть она может, например, так:
Код:
int nod (int a,int b) //Рекурсивная функция определения НОД
{
if (a>b)
if (a%b==0) return b; //Если b уже делитель для a, то возвращаем b (выход из рекурсии)
else return nod(a%b, b); //иначе вызываем рекурсию
else if (b%a==0) return a; //Если a уже делитель для b, то возвращаем a (выход из рекурсии)
else return nod (a, b%a); //иначе вызываем рекурсию
}

Это если основываться на Вашем алгоритме. Но будет работать и такой вариант:
Код:
int nod(int a,int b)
{
if (a%b==0) return b; //Выход из рекурсии
else return nod(b,a%b);
}

Пример применения функции в приложении, скомпилировано в VS 2005.
Удачи!

Приложение:

---------
Эта история - не для истории, понимаешь?

Ответ отправила: Verena (статус: Практикант)
Ответ отправлен: 28.11.2008, 00:59

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 236939 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!

    Оценка за ответ: 5
    Комментарий оценки:
    БоЛьшое спасибо, Вы меня очень выручили


    Вопрос № 151.943
    Здравствуйте
    Есть конструктор копирования,в нем необходимо перераспределить память поля data.
    Если объект создан,то все ок,память для data выделена
    если же объект создается копированием
    myclass a=b;
    естественно возникнет ошибка при удалении массива. Как грамотно обработать такую ситуацию?

    Приложение:

    Отправлен: 26.11.2008, 18:36
    Вопрос задал: Sov (статус: Студент)
    Всего ответов: 1
    Мини-форум вопроса >>> (сообщений: 0)

    Отвечает: mega
    Здравствуйте, Sov!
    в конструкторе не нужно освобождать данные объекта, поскольку они не распределяются перед его вызовом, любой конструктор, даже копирующий - первый метод класса, который впервые же и обращается к полям объекта, поэтому вызов delete[]data - излишний,
    но похоже я понял вашу мысль: вы хотите копировать объект, управляющий массивом данных

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

    реализуется это довольно просто:

    struct mydata{
    int refs;
    int data;
    };

    class myclass{< br>
    mydata*m_data;

    void addref(void){
    if(m_data){
    ++m_data->refs;
    }
    }

    void release(void){
    if(m_data){
    if(!--m_data->refs){
    delete m_data; // реальное освобождение данных
    }
    m_data = NULL;
    }
    }

    public:

    myclass(void):m_data(NULL){}

    myclass(const myclass&src):m_data(src.m_data){
    addref();
    }

    myclass(int data){
    m_data = new mydata;
    m_data->refs = 0;
    m_data->data = data;
    addref();
    }

    ~myclass(void){
    release();
    }

    myclass&operator=(const myclass&src){
    release();
    m_data = src.m_data;
    addref();
    return*this;
    }

    };

    теперь с экземпляром класса myclass можно работать как с обычной переменной, а его указатель никогда не потеряется при копировании
    mydata::refs - как раз тот самый счетчик ссылок, а data - полезные данные класса myclass
    реальное освобождение объекта производится в методе myclass::release, а распределение - третьим конструктором myclass
    я показал пример с полезными данными типа int: mydata::data, вместо этого вы можете поместить здесь ваш массив int *data
    Ответ отправил: mega (статус: 10-й класс)
    Ответ отправлен: 26.11.2008, 19:47

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 236803 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!

    Оценка за ответ: 5
    Комментарий оценки:
    Спасибо за идею)


    Вопрос № 151.973
    Здраствуйте Эксперты памагите мне пажалуйста написать рограмму на С++
    Задание:построить прямоугольник со сторонами 30 и 50,центер которого савмещен
    с центром экрана.Стороны прямоугольника должны быть параллельны сторонам экрана.
    Отправлен: 26.11.2008, 22:25
    Вопрос задал: Брага Д.В. (статус: Посетитель)
    Всего ответов: 1
    Мини-форум вопроса >>> (сообщений: 2)

    Отвечает: Verena
    Здравствуйте, Брага Д.В.!
    Сначала ищем окно консоли по его имени, которое также получаем через функцию.
    Код:
    HWND hwnd; //Описатель окна
    char pszWindowTitle [1024]; //Заголовок окна
    GetConsoleTitle (pszWindowTitle, 1024); //Получаем заголовок консоли
    hwnd=FindWindow(NULL, pszWindowTitle); //Получаем описатель консоли

    Потом получаем размерность клиентской области окна функцией GetClientRect, находим координаты её центра и, отталкиваясь от них выбираем координаты углов прямоугольника:
    Код:
    RECT rct; 
    Get ClientRect (hwnd, &rct); //Получаем размерность клиентской области окна
    int xc = rct.right/2; //Координата х центра
    int yc = rct.bottom/2; //Координата у центра
    int xl = xc - w/2; //Координаты левого верхнего угла прямоугольника
    int yl = yc - w/2;

    Затем выбираем цвет заливки для прямоугольника и рисуем его.
    Код:
    SelectObject(hdc, CreateSolidBrush (RGB(0,255,0)));  //Выбираем зеленый цвет заливки
    Rectangle (hdc, xl, yl, xl+w, yl+h); //Рисуем прямоугольник

    Пример в приложении скомпилирован в VS 6, но в принципе должно в любой среде без проблем отработать, поскольку используется win api.
    Удачи!

    Приложение:

    ---------
    Эта история - не для истории, понимаешь?

    Ответ отправила: Verena (статус: Практикант)
    Ответ отправлен: 28.11.2008, 14:43

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 236983 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вопрос № 151.995
    Здравствуйте! Наведите пожалуйста простой пример рекурсии.
    Отправлен: 27.11.2008, 01:13
    Вопрос задал: compile (статус: Посетитель)
    Всего ответов: 1
    Мини-форум вопроса >>> (сообщений: 2)

    Отвечает: realbustard
    Здравствуйте, Compile!
    В приложении 2 задачи. Вторая - вычсление факториала, самый простой пример рекурсии.
    Первая задача - применение рекурсии для вычисления значения ф-ии.
    Удачи!!!

    Приложение:

    ---------
    Учись так, как-будто собираешься жить вечно; живи так, как-будто завтра умрешь (Отто фон Бисмарк)

    Ответ отправил: realbustard (статус: Студент)
    Ответ отправлен: 27.11.2008, 01:26

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 236842 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!

    Оценка за ответ: 4
    Комментарий оценки:
    Спасибо, только где приложение?


    Вопрос № 152.005
    Здравствуйте ув. эксперты!
    Подскажите как имея переменную int записать ее в файл?
    Отправлен: 27.11.2008, 04:21
    Вопрос задал: Sp3ct0r (статус: Посетитель)
    Всего ответов: 3
    Мини-форум вопроса >>> (сообщений: 0)

    Отвечает: Dr_Andrew
    Здравствуйте, Sp3ct0r!
    Так же, как любую переменную стандартного типа: передать в поток (в данном случае - в поток записи в файл, подключаемый директивой #include <fstream>). Пример с комментариями - в приложении.

    Приложение:

    Ответ отправил: Dr_Andrew (статус: Студент)
    Ответ отправлен: 27.11.2008, 07:42

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 236855 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!

    Оценка за ответ: 5
    Комментарий оценки:
    Спасибо большое за помощь!


    Отвечает: Lex NewtoN
    Здравствуйте, Sp3ct0r!

    На языке СИ:

    Если хотите, чтобы переменную можно было прочитать, к примеру, в блокноте:

    #include <stdio.h>

    int main(void)
    {
    FILE* f_out = fopen("out.txt","w");
    int number = 121212;
    fprintf(f_out,"%d",number);
    fclose(f_out);
    return 0;
    }

    Если переменную нужно записать как набор битов:

    #include <stdio.h>

    int main(void)
    {
    FILE* f_in;
    FILE* f_out;
    int number;

    // так делается запись числа в файл
    f_out = fopen("out.dat","w+b");
    number = 121212;
    fwrite(&number,sizeof(number),1,f_out);
    fclose(f_out);

    // так производится чтение числа из файла
    f_in = fopen("out.dat","r+b");
    fread(&number,sizeof(number),1,f_in);
    printf("number = %d ",number);
    fclose(f_in);

    return 0;
    }
    Ответ отправил: Lex NewtoN (статус: 2-й класс)
    Ответ отправлен: 27.11.2008, 08:25

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 236857 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!

    Оценка за ответ: 5
    Комментарий оценки:
    Спасибо большое за помощь! Ваш способ наиболее простой и удобный!


    Отвечает: Olegzp
    Здравствуйте, Sp3ct0r!

    int fd;
    int X=123;

    if((fd=creat("file",O_RDWR|O_APPEND) < 0);
    printf("creat error");

    if(write(fd,X,sizeof(X))!=sizeof(X));
    printf("write error");

    информация по теме http://users.kpi.kharkov.ua/program/cplus/stati/fio.htm
    Ответ отправил: Olegzp (статус: 7-й класс)
    Ответ отправлен: 27.11.2008, 11:20

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 236869 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!

    Оценка за ответ: 5
    Комментарий оценки:
    Спасибо большое за помощь!


    Вопрос № 152.018
    Здраствуйте уважаемые Эксперты.Моя задача состоит в следующем: нужно подсчитать количество слов длины К из данных N букв, не содержащих данное подслово. Нужен исходник на с++. Заранее благодарю

    Приложение:

    Отправлен: 27.11.2008, 12:03
    Вопрос задал: Абраменко Роман Сергеевич (статус: Посетитель)
    Всего ответов: 1
    Мини-форум вопроса >>> (сообщений: 0)

    Отвечает: Verena
    Здравствуйте, Абраменко Роман Сергеевич!
    Я понимаю задание так: есть текст, состоящий из слов (разделитель - пробел), есть набор из N букв (строка из N символов), есть подслово (строка), задана длина искомого слова K. И надо найти количество слов, длина которых равна заданной, которые состоят только из заданных букв (т.е. не содержат букв не из набора) и не содержат в себе подслова. Сначала считываем текст (ограничу его 300-ми символами), потом все остальные данные (чтобы cin корректно считывал несколько строк подряд, приходится чистить буфер таким образом: cin.ignore (cin.rdbuf ()->in_avail ())). В цикле выделяем очередное слово (сначала пропускаем все пробелы, наращивая счётчик, потом, запомнив значение счётчика на начале слова, пропускаем все остальные символы), если длина слова не соотвествует необходимой, дальнейшие проверки бессмысленны - переходим на следующую итерацию. Следующим шагом проверим, состоит ли слово из заданных букв, для этого проверяем наличие каждого символа слова в строке букв функцией strchr, и если хоть один не найден, считаем проверку неудачной и переходим на следующую итерацию. В последнюю очередь проверим наличие подстроки. В цикле сравниваем очередной символ слова с первым символом подстроки, если они совпадают - проверяем равенство остальных символов в случае одного несовпадения, выставляем флаг, по которому определяем, нашли ли подстроку. Если подстрока была найдена, выходим из цикла и переходим на следующую итерацию. Если же и эта проверка была удачной, то есть подстроку в слове мы не нашли, то наращиваем счётчик и, на всякий случай, выводим найденное слово на консоль. Вот примерный алгоритм решения.
    Реализация - в приложении, скомпилировано и проверено в VS 2005.
    Удачи!

    Приложение: