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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вот интересные задачки по С++ 
:(
    Опции темы
Nastya
Дата 9.10.2003, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

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



Вот тут случайно наткнулась.
Ну, кто смог решить ?
ЗАДАЧКИ


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Fantasist
Дата 10.10.2003, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Да.... Ну первая очень классическая, ее решений уже множество приводилось. Снова ее решать лень.

Во - второй знать различия С и С++. Не знаем.

Третья интересная, но довольно простая. Достадочно вспомнить, что число в степени двойки всегда имеет в одном из 1 битов еденицу, а во всех остальных нули. А число меньшее числа в степени 2 на один все старшие нули до бита степени двойки и все младшие - еденицы.

Вот четвертая! Это монстр. Я долго думал, и в конце пришел вот к такому решению:

Код

template <class T,int nm>
int sz(T arg[nm])
{
return nm;
}


Только оно не компилилось. Я понимаю, что нужно как-то так - компилятор знает размер массива на этапе компиляции и с помощью шаблона можно из него эту информацию вытянуть, но вот как это провернуть синтаксически я не как догнать не мог.

Потом полез в инет, и нашел:

Код

template <class T,int size>
int sz(T (&)[size])
{
  return size;
}


До такого я бы не додумался в ближайшие года два.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
mike_prog
Дата 11.10.2003, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот вам еще задачки. Известны вершины треугольника (x1, y1), (x2, y2), (x3, y3). Внимание вопрос!
Цитата
Как определить, принадлежит ли точка (x, y) этому треугольнику.


Это сообщение отредактировал(а) mike_prog - 11.10.2003, 15:44
PM MAIL ICQ   Вверх
maxim1000
Дата 11.10.2003, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



Цитата
Как определить, принадлежит ли точка (x, y) этому треугольнику.

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
если немного поухитряться, можно прити к некоторым результатам:
Код
#include "stdio.h"
void func(bool)
{
 printf("%d",sizeof(bool));
};
void main()
{
 func(0);
};

тестировал я это в VC (++) 6.0
если сохранить файл с расширением c => выведет 4
если с расширением cpp => 1
конечно, если не менялись настройки компилятора в зависимости от расширений файлов


--------------------
qqq
PM WWW   Вверх
Dov
Дата 11.10.2003, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата
template <class T,int size>
int sz(T (&)[size])
{
  return size;
}

error C2265: '<Unknown>' : reference to a zero-sized array is illegal
error C2266: '<Unknown>' : reference to a non-constant bounded array is illegal

ПОЧЕМУ confused.gif


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
setq
Дата 12.10.2003, 15:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











задача #2 <<Написать программу, которая, будучи откомпилированной компилятором языка "C", выводит на экран lang=C. А будучи откомпилированной компилятором языка "C++", выводит на экран lang=C++. При решении нельзя использовать макросы, и из операторов предкомпиляции можно использовать только #include. >>

я знаю как написать программу, которая будет работать правильно в 50% случаев :-))))))))))))))))
  Вверх
Fantasist
Дата 13.10.2003, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата
error C2265: '<Unknown>' : reference to a zero-sized array is illegal
error C2266: '<Unknown>' : reference to a non-constant bounded array is illegal


Покажи как используешь.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Dov
Дата 13.10.2003, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(Fantasist @ 13.10.2003, 18:01)
Покажи как используешь.

Я просто в задаче заменил звёздочки на этот код.
А как нужно использовать?


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Fantasist
Дата 13.10.2003, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Вообще-то да. У меня так компилится и выполняется:

Код
template <class T,int size>
int sz(T (&)[size])
{
 return size;
}

int main()
{
int x[5] = {1,2,3,4,5};
char y[] = "123456789";
std::cout << sz(x) << " " << sz(y);
return 0;
}


Некоторые компиляторы плохо шаблоны обрабатывают.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Dov
Дата 14.10.2003, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



2Fantasist: Вот мой срр-файл:
Код
#include <iostream>
using namespace std;

template <class T,int size>
int sz(T (&)[size])
{
   return size;
}

int main()
{
   int x[5] = {1,2,3,4,5};
   char y[] = "123456789";

   cout << sz(x) << " " << sz(y);

   return 0;
}


А вот список ошибок:
--------------------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
Что это может быть?


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
gray_k
Дата 14.10.2003, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата
template <class T,int size>
int sz(T (&)[size])
{
  return size;
}

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


--------------------
С уважением.
Gray.
PM MAIL   Вверх
Fantasist
Дата 14.10.2003, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата
VC++ 6.0
Что это может быть?


Это не может быть, а есть - слабость VC60. VC70 это компилит.


Цитата
А я по причине собственной тупости так и не понял, почему это работает.


В этой шаблонной функции ты указываешь, что у тебя параметром идет ссылка на массив из элементов T размером size (имя формального параметра просто опущено, так как он нам не нужен. Можно написать и так:
Код

template <class T,int size>
int sz(T (&array)[size])
{
 return 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


Почему обязательно объявлять ссылку? Почему нельзя сделать просто:
Код

template <class T,int size>
int sz(T array[size])
{
 return size;
}



Когда мы объявляем функцию: void fn(char array[10]), то для компилятора переменная array имеет тип char[], а не char[10]. Так как в функцию передается только указатель, то для компилятора не имеет значения какого размера ты объявляешь массив в формальном аргументе, поэтому для него этого числа 10 не существует. То есть вот так вполне легально:
Код

void fn(int arr[3])
{...}

{
  int x[5] = {1,2,3,4,5};
  fn(x);
}



Следовательно, в выше приведенном объявлении функции sz параметр функции имеет тип T[]. Параметр шаблона size игнорируется в этом аргументе, потому когда приходит пора инстанцировать функцию компилятор не может вывести этот параметр из фактического типа аргумента, так как для него нет разницы между char[10] и, допустим, char[3].
Когда же ты передаешь ссылку, то это число имеет значение. То есть:
Код

void fn(int (&arr)[3])
{...}
{
  int x[5] = {1,2,3,4,5};
  int y[3] = {1,2,3};

  fn(x);  //error! Incompatible types int[5] и int(&)[3]
  fn(y);  //OK

}


Значит в случае:

Код

template <class T,int size>
int sz(T (&array)[size])
{
 return size;
}


size является полноценным аргументом типа, и компилято выводит его из фактического параметра.





--------------------
Волны гасят ветер...
PM MAIL   Вверх
Nastya
Дата 14.10.2003, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

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



Цитата
Это не может быть, а есть - слабость VC60. VC70 это компилит.


Красивое решение, но мне кажеться задачи были разработанны так, что бы не зависить от компилятора.
Есть другие варианты?


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Fantasist
Дата 14.10.2003, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 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]));
}



--------------------
Волны гасят ветер...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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