Вопрос № 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.Спасибо за внимание. Заранее благодарю
Отвечает: 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 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценка за ответ: 5 Комментарий оценки: БоЛьшое спасибо, Вы меня очень выручили
Вопрос № 151.943
Здравствуйте Есть конструктор копирования,в нем необходимо перераспределить память поля data. Если объект создан,то все ок,память для data выделена если же объект создается копированием myclass a=b; естественно возникнет ошибка при удалении массива. Как грамотно обработать такую ситуацию?
Приложение:
Отправлен: 26.11.2008, 18:36
Вопрос задал: Sov (статус: Студент)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: mega
Здравствуйте, Sov! в конструкторе не нужно освобождать данные объекта, поскольку они не распределяются перед его вызовом, любой конструктор, даже копирующий - первый метод класса, который впервые же и обращается к полям объекта, поэтому вызов delete[]data - излишний, но похоже я понял вашу мысль: вы хотите копировать объект, управляющий массивом данных
обычно, перенос указателей реализуется без перераспределения полезных данных. вместо распределения нового блока, рядом с полезными данными хранят
счетчик ссылок, который инкрементируется при увеличении числа объектов, хранящих указатель и декрементируется, когда число таких объектов уменьшается после очередного уменьшения счетчика, которое привело счетчик в нулевое состояние, данные можно освободить, т.к. более ни одного "живого" объекта, использущих полезные данные не осталось
теперь с экземпляром класса myclass можно работать как с обычной переменной, а его указатель никогда не потеряется при копировании mydata::refs - как раз тот самый счетчик ссылок, а data - полезные данные
класса myclass реальное освобождение объекта производится в методе myclass::release, а распределение - третьим конструктором myclass я показал пример с полезными данными типа int: mydata::data, вместо этого вы можете поместить здесь ваш массив int *data
Ответ отправил: mega (статус: 10-й класс)
Ответ отправлен: 26.11.2008, 19:47
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 236803 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценка за ответ: 5 Комментарий оценки: Спасибо за идею)
Вопрос № 151.973
Здраствуйте Эксперты памагите мне пажалуйста написать рограмму на С++ Задание:построить прямоугольник со сторонами 30 и 50,центер которого савмещен с центром экрана.Стороны прямоугольника должны быть параллельны сторонам экрана.
Отправлен: 26.11.2008, 22:25
Вопрос задал: Брага Д.В. (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Verena
Здравствуйте, Брага Д.В.! Сначала ищем окно консоли по его имени, которое также получаем через функцию.
Потом получаем размерность клиентской области окна функцией 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;
Затем выбираем цвет заливки для прямоугольника и рисуем его.
Пример в приложении скомпилирован в VS 6, но в принципе должно в любой среде без проблем отработать, поскольку используется win api. Удачи!
Приложение:
--------- Эта история - не для истории, понимаешь?
Ответ отправила: Verena (статус: Практикант)
Ответ отправлен: 28.11.2008, 14:43
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 236983 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Вопрос № 151.995
Здравствуйте! Наведите пожалуйста простой пример рекурсии.
Отправлен: 27.11.2008, 01:13
Вопрос задал: compile (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: realbustard
Здравствуйте, Compile! В приложении 2 задачи. Вторая - вычсление факториала, самый простой пример рекурсии. Первая задача - применение рекурсии для вычисления значения ф-ии. Удачи!!!
Приложение:
--------- Учись так, как-будто собираешься жить вечно; живи так, как-будто завтра умрешь (Отто фон Бисмарк)
Ответ отправил: realbustard (статус: Студент)
Ответ отправлен: 27.11.2008, 01:26
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 236842 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценка за ответ: 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 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценка за ответ: 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 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценка за ответ: 5 Комментарий оценки: Спасибо большое за помощь! Ваш способ наиболее простой и удобный!
информация по теме http://users.kpi.kharkov.ua/program/cplus/stati/fio.htm
Ответ отправил: Olegzp (статус: 7-й класс)
Ответ отправлен: 27.11.2008, 11:20
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 236869 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценка за ответ: 5 Комментарий оценки: Спасибо большое за помощь!
Вопрос № 152.018
Здраствуйте уважаемые Эксперты.Моя задача состоит в следующем: нужно подсчитать количество слов длины К из данных N букв, не содержащих данное подслово. Нужен исходник на с++. Заранее благодарю
Отвечает: Verena
Здравствуйте, Абраменко Роман Сергеевич! Я понимаю задание так: есть текст, состоящий из слов (разделитель - пробел), есть набор из N букв (строка из N символов), есть подслово (строка), задана длина искомого слова K. И надо найти количество слов, длина которых равна заданной, которые состоят только из заданных букв (т.е. не содержат букв не из набора) и не содержат в себе подслова. Сначала считываем текст (ограничу его 300-ми символами), потом все остальные данные (чтобы cin корректно считывал несколько
строк подряд, приходится чистить буфер таким образом: cin.ignore (cin.rdbuf ()->in_avail ())). В цикле выделяем очередное слово (сначала пропускаем все пробелы, наращивая счётчик, потом, запомнив значение счётчика на начале слова, пропускаем все остальные символы), если длина слова не соотвествует необходимой, дальнейшие проверки бессмысленны - переходим на следующую итерацию. Следующим шагом проверим, состоит ли слово из заданных букв, для этого проверяем
наличие каждого символа слова в строке букв функцией strchr, и если хоть один не найден, считаем проверку неудачной и переходим на следующую итерацию. В последнюю очередь проверим наличие подстроки. В цикле сравниваем очередной символ слова с первым символом подстроки, если они совпадают - проверяем равенство остальных символов в случае одного несовпадения, выставляем флаг, по которому определяем, нашли ли подстроку. Если подстрока была найдена, выходим из цикла и переходим на следующую итерацию.
Если же и эта проверка была удачной, то есть подстроку в слове мы не нашли, то наращиваем счётчик и, на всякий случай, выводим найденное слово на консоль. Вот примерный алгоритм решения. Реализация - в приложении, скомпилировано и проверено в VS 2005. Удачи!