![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
-------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Fantasist |
|
||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Да.... Ну первая очень классическая, ее решений уже множество приводилось. Снова ее решать лень.
Во - второй знать различия С и С++. Не знаем. Третья интересная, но довольно простая. Достадочно вспомнить, что число в степени двойки всегда имеет в одном из 1 битов еденицу, а во всех остальных нули. А число меньшее числа в степени 2 на один все старшие нули до бита степени двойки и все младшие - еденицы. Вот четвертая! Это монстр. Я долго думал, и в конце пришел вот к такому решению:
Только оно не компилилось. Я понимаю, что нужно как-то так - компилятор знает размер массива на этапе компиляции и с помощью шаблона можно из него эту информацию вытянуть, но вот как это провернуть синтаксически я не как догнать не мог. Потом полез в инет, и нашел:
До такого я бы не додумался в ближайшие года два. -------------------- Волны гасят ветер... |
||||
|
|||||
| mike_prog |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 27.9.2003 Репутация: нет Всего: 1 |
Вот вам еще задачки. Известны вершины треугольника (x1, y1), (x2, y2), (x3, y3). Внимание вопрос!
Это сообщение отредактировал(а) mike_prog - 11.10.2003, 15:44 |
|||
|
||||
| maxim1000 |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
1. записать три уравнения прямых в виде ax+by+c=0 потом для каждой вершины проделать такую операцию: подставить ее координаты в уравнение прямой через две остальные вершины подставить значение указанной точки в то же уравнение если знаки разные => точка за границей треугольника если все три проверки прошли => точка внутри 2. посчитать площади треугольников пусть вершины - A, B, C, а выбранная точка - D D внутри ABC <=> S(ABC)=S(ABD)+S(ACD)+S(BCD) S - площадь 3. пусть L - угол D внутри ABC <=> L(ADC)+L(BDC)+L(ADB)=360
ну вот, например, одно: наличие bool если немного поухитряться, можно прити к некоторым результатам:
тестировал я это в VC (++) 6.0 если сохранить файл с расширением c => выведет 4 если с расширением cpp => 1 конечно, если не менялись настройки компилятора в зависимости от расширений файлов -------------------- qqq |
||||||
|
|||||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
error C2265: '<Unknown>' : reference to a zero-sized array is illegal error C2266: '<Unknown>' : reference to a non-constant bounded array is illegal ПОЧЕМУ -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
| setq |
|
|||
|
Unregistered |
задача #2 <<Написать программу, которая, будучи откомпилированной компилятором языка "C", выводит на экран lang=C. А будучи откомпилированной компилятором языка "C++", выводит на экран lang=C++. При решении нельзя использовать макросы, и из операторов предкомпиляции можно использовать только #include. >>
я знаю как написать программу, которая будет работать правильно в 50% случаев :-)))))))))))))))) |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Покажи как используешь. -------------------- Волны гасят ветер... |
|||
|
||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
Я просто в задаче заменил звёздочки на этот код. А как нужно использовать? -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Вообще-то да. У меня так компилится и выполняется:
Некоторые компиляторы плохо шаблоны обрабатывают. -------------------- Волны гасят ветер... |
|||
|
||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
2Fantasist: Вот мой срр-файл:
А вот список ошибок: --------------------Configuration: T1 - Win32 Debug-------------------- Compiling... error C2265: '<Unknown>' : reference to a zero-sized array is illegal error C2266: '<Unknown>' : reference to a non-constant bounded array is illegal error C2784: 'int __cdecl sz(T (&)[1])' : could not deduce template argument for ' (&)[1]' from 'int [5]' error C2784: 'int __cdecl sz(T (&)[1])' : could not deduce template argument for ' (&)[1]' from 'char [10]' --------------------------------------------------------------------------------- VC++ 6.0 Что это может быть? -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
| gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: нет Всего: 22 |
А я по причине собственной тупости так и не понял, почему это работает. Понял только, что этот код подразумевает статическое расположение переменных относительно друг-друга. -------------------- С уважением. Gray. |
|||
|
||||
| Fantasist |
|
||||||||||||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Это не может быть, а есть - слабость VC60. VC70 это компилит.
В этой шаблонной функции ты указываешь, что у тебя параметром идет ссылка на массив из элементов T размером size (имя формального параметра просто опущено, так как он нам не нужен. Можно написать и так:
cмысл от этого не измениться.) Так как и size и T параметры шаблона, то для функции компилятор может автоматически вывести эти параметры. То есть: int x[5] = {1,2,3,4,5}; char y[] = "123456789"; sz(x) - здесь x имеет тип int[5] и компилятор делает инстасирования функции где T=int, size=5. sz(y) - здесь char[10] - T=char, size=10 Почему обязательно объявлять ссылку? Почему нельзя сделать просто:
Когда мы объявляем функцию: void fn(char array[10]), то для компилятора переменная array имеет тип char[], а не char[10]. Так как в функцию передается только указатель, то для компилятора не имеет значения какого размера ты объявляешь массив в формальном аргументе, поэтому для него этого числа 10 не существует. То есть вот так вполне легально:
Следовательно, в выше приведенном объявлении функции sz параметр функции имеет тип T[]. Параметр шаблона size игнорируется в этом аргументе, потому когда приходит пора инстанцировать функцию компилятор не может вывести этот параметр из фактического типа аргумента, так как для него нет разницы между char[10] и, допустим, char[3]. Когда же ты передаешь ссылку, то это число имеет значение. То есть:
Значит в случае:
size является полноценным аргументом типа, и компилято выводит его из фактического параметра. -------------------- Волны гасят ветер... |
||||||||||||||
|
|||||||||||||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
Красивое решение, но мне кажеться задачи были разработанны так, что бы не зависить от компилятора. Есть другие варианты? -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Это решение полностью соответсвует стандарту. То что VC60 его не компилирует - это проблема VC60. Задача, как мне кажется, была созданна именно в расчете на страндартный С++, а не возможные проблемы компилятора. Eще решение. Идею услышал - реализация моя: template <class T> int sz(T &) { struct szarr { T a; char flg; }; szarr arr; return ((int)(&arr.flg)-(int)(&arr))/((int)(&arr.a[1])-(int)(&arr.a[0])); } -------------------- Волны гасят ветер... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |