LINUX.ORG.RU
ФорумTalks

что б такого спросить

 


0

3

Привет, All!!!
Надо поспрашивать потенциальных junior'ов по С++. Если есть - подкиньте интересных вопросов!
Linux при том, что под него пишем.



Последнее исправление: cetjs2 (всего исправлений: 1)

Ответ на: комментарий от cdshines

Для 1 есть какое-то изящное решение?, а то я, дурак, сразу бы считал.

Там нечего считать, математика тривиальная. Это задача на знание синтаксиса C++: объявить интерфейс и отнаследоваться от него, перегрузить методы. Удивительно, но на вакансиях с небольшой зарплатой справляются отнюдь не все собеседуемые. Фееричнейший бред пишут.

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 2)
Ответ на: комментарий от Manhunt

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

тогда писать на псевдокоде

marvin_yorke ★★★
()
Ответ на: комментарий от buddhist

и что? методы класса компилируются и спокойно лежат себе в секции .text, обращения к полям класса из функции нет, в чем проблема?

marvin_yorke ★★★
()
Ответ на: комментарий от cdshines

Для 1 есть какое-то изящное решение?

насчет изящного не знаю, но общее - есть:

template<int N>
struct Polygon
{
	double x_[N];
	double y_[N];

	double area()
	{
		double a = 0;

		for( int i = 0 ; i < N ; ++i )
		{
			int j = (i + 1) % N;
			a += x_[i] * y_[j];
			a -= y_[i] * x_[j];
		}

		return a < 0 ? -a / 2 : a / 2;
	}
...

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

wota ★★
()
Ответ на: комментарий от Manhunt

А, а я подумал, что, может, есть какой-то метод универсально считать площади/периметры, не перегружая ничего. В смысле, чтоб сами классы предоставляли такие свойства, что одна функция справилась бы и с треугольником, и с прямоугольником.

cdshines ★★★★★
()
Ответ на: комментарий от marvin_yorke

тогда писать на псевдокоде

Вот и зачем мне сотрудник, который вместо того, чтобы написать 15 строчек текста как его попросили, начинает диктовать свои условия? Собеседование провалено, гратс.

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

для 1. гораздо веселее спросить про квадрат и прямоугольник. То, что прямоугольник надо наследовать от квадрата догоняют максимум 10% собеседуемых.

JFreeM ★★★☆
()
Ответ на: комментарий от JFreeM

прямоугольник надо наследовать от квадрата

очень логично, да

wota ★★
()
Ответ на: комментарий от Manhunt

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

marvin_yorke ★★★
()
Ответ на: комментарий от marvin_yorke

в задании же про общий интерфейс, а не реализацию говорится

так наследуй Polygon от интерфейса, делов то, я, кстати, про него тоже написал

wota ★★
()
Ответ на: комментарий от wota

В цикле-то что считать? Площадь равнобедренного треугольника*N. И зачем шаблон, вычисления всё равно будут в рантайме. Но идея хорошая, не вот тухлый ООП.

dmfd
()
Ответ на: комментарий от JFreeM

То, что прямоугольник надо наследовать от квадрата догоняют максимум 10% собеседуемых.

Не надо, поскольку ни одно из них не является частным случаем другого: инварианты квадрата не верны для прямоугольника (например, равенство сторон), а инварианты прямоугольника не верны для квадрата (например, независимость высоты от ширины). http://ru.wikipedia.org/wiki/Принцип_подстановки_Барбары_Лисков

Однако юниору подобная ошибка позволительна.

Manhunt ★★★★★
()
Ответ на: комментарий от dmfd

В цикле-то что считать? Площадь равнобедренного треугольника*N

см. оригинальную задачу

И зачем шаблон

чтоб не тратить время и память

wota ★★
()
Ответ на: комментарий от wota

см. оригинальную задачу

Точно, показалось, твой код для правильного n-угольника.

чтоб не тратить время и память

Да всё равно всё в рантайме будет считаться же.

dmfd
()
Ответ на: комментарий от marvin_yorke

у тебя была хоть раз ситуация, когда реально нужно было писать без какой-либо литературы вообще?

Есть вещи, которые человек помнит наизусть, если пользуется языком. В этой задаче нет ничего такого, для чего могла бы потребоваться литература.

Manhunt ★★★★★
()
Ответ на: комментарий от marvin_yorke

я не крестовик, но

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

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 1)
Ответ на: комментарий от dmfd

Да всё равно всё в рантайме будет считаться же.

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

wota ★★
()
Ответ на: комментарий от dmfd

Конструктор же.

лишние действия же

Не знал, что в этом есть что-то зазорное.

положить на стек 20 байт гораздо быстрее чем выделить 20 байт на куче и потом освободить

wota ★★
()
Ответ на: комментарий от Manhunt

Во втором вопросе подвох или как?

Gary ★★★★★
()
Ответ на: комментарий от dmfd

ну и в любом случае это уменьшает кол-во аллокаций памяти

wota ★★
()
Ответ на: комментарий от wota

положить на стек 20 байт гораздо быстрее чем выделить 20 байт на куче и потом освободить

При условии, что объект короткоживущий. Короче, нафиг тут ООП не нужен, передать размер массива и пару указателей (а если как нормальные люди делают - один указатель массив структур) в функцию - не великая беда, думаю.

dmfd
()
Ответ на: комментарий от Bad_ptr

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

kostik1
()
Ответ на: комментарий от kostik1

А ведь в этом есть некоторая логика - в квадрате будет только одна переменная - длина стороны, а в прямоугольнике добавится еще одна - длина второй стороны

Вот они, погроммисты. Побуду кэпом: квадрат - частный случай прямоугольника.

dmfd
()
Ответ на: комментарий от dmfd

Я прекрасно понимаю это, да, такое наследование не естественно, но сам подумай - если квадрат будет наследоваться от прямоугольника, у него будет одна лишняя переменная.

kostik1
()
Ответ на: комментарий от dmfd

квадрат - частный случай прямоугольника

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

Manhunt ★★★★★
()
Ответ на: комментарий от Harald

и сколько же? ( по вашему?)

0 (void|int main())?
1(http://www.ioccc.org/1985/august.hint) 2(argc,**argv)?
3(argc,**argv,**env)?

сколько дуще угодно ибо стек нагружает вызывающий и чистит его вызывающий поэтому функция(main в том числе ) может при правильном(:) ) вызове получить наперёд заданое число аргументов :) )

http://www.ioccc.org/1988/phillipps.c

зы. нуждаюсь в унцевом серебре.

qulinxao ★★☆
()
Ответ на: комментарий от kostik1

Ну и нахрена тогда вообще нужен квадрат, если в нем нет никаких различий от базового класса?

А тебе хотелось бы кучу кода написать?

dmfd
()
Ответ на: комментарий от kostik1

А ведь в этом есть некоторая логика

Да, есть. :p

Bad_ptr ★★★★★
()
Ответ на: комментарий от dmfd

нафиг тут ООП не нужен ... передать указатель на массив структур в функцию - не великая беда, думаю

Зависит от обстоятельств. Когда однажды понадобится к набору фигур добавить замкнутые сплайны из кривых безье, весь код, который вместо указателей на IShape манипулировал указателями на массивы координат, придется переписать.

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 1)
Ответ на: комментарий от hired777

http://www.cplusplus.com/reference/clibrary/cmath/abs/

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

Ну-ну. Пруфа, естественно, не будет? Так, наугад сказал?

$ g++ -Ofast ./1.cpp
$ time ./a.out 

real	0m0.648s
user	0m0.644s
sys	0m0.000s
$ g++ -Ofast ./2.cpp
$ time ./a.out 

real	0m0.065s
user	0m0.064s
sys	0m0.000s
$ cat ./1.cpp
#include <cmath>
#include <cstdlib>

int main()
{
	double s;
	double a = rand();
	for( int i = 0 ; i < 1000000000 ; ++i )
	{
		s += abs( a / 2 );
	}
	return s;
}
$ cat ./2.cpp
#include <cstdlib>

int main()
{
	double s;
	double a = rand();
	for( int i = 0 ; i < 100000000 ; ++i )
	{
		s += a < 0 ? -a / 2 : a / 2;
	}
	return s;
}

не думал, что очевидное нужно доказывать

wota ★★
()
Ответ на: комментарий от Manhunt

за использование ооп в практике подобно вопросу 1 - вон из профессии.

за велосепеденье для вопроса номер 2 ( для которого уже есть готовые решения ,) то же вон из профессии .

так что норм 0 и 3.

qulinxao ★★☆
()
Ответ на: комментарий от dmfd

Смешно говорить о скорости одной операции, когда рядом цикл.

с такой логикой можно сразу на Java писать, и даже больше - лучше на Java и писать, там все проще и меньше граблей

wota ★★
()
Ответ на: комментарий от wota

В случае 2.cpp компилятор вынес if за тело цикла, поскольку значение переменной a внутри цикла неизменно. В твоем шаблоне для ломаных такую оптимизацию произвести не получится.

Manhunt ★★★★★
()
Ответ на: комментарий от Harald
 int main(int a,int b, int c, int d,char *msg){
  2         if(d==1){
  3                 printf("%s\n",msg);
  4         }else{
  5                 main(1,2,3,1,&"Hello LOR");
  6         }
  7 }

печально что это знать вредно :)

qulinxao ★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.