Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Интересные и занимательные задачи по программированию > Тест на знание С++


Автор: JAnty 7.12.2006, 12:38
Это обычный тест на знание С++ 

Код

int a = 0;
int b = 1;
int c = a+b; /* результат == 1  */


Постановка задачи: убрать с кода знаки "=". (Желательно, что бы оно ещё потом компилилось smile ).

Автор: Earnest 7.12.2006, 12:57
Глупый тест. 

int a(0); и так далее.

Автор: comp 8.12.2006, 17:34
#define a 0
#define b 1
#define c a + b

Автор: JackYF 8.12.2006, 19:52
comp, неверно.

В этом случае не создастся ни одной переменной, а их создавалось 3.
Правильное решение написала Earnest.

Автор: Rockie 9.12.2006, 03:45
Цитата(JAnty @  7.12.2006,  12:38 Найти цитируемый пост)
Постановка задачи: убрать с кода знаки "=". (Желательно, что бы оно ещё потом компилилось smile  )

Код
//int a  0;
//int b  1;
//int c  a+b; /* результат  1  */

 smile 

Автор: Dov 9.12.2006, 12:10
Гы-гы.  smile 
Rockie, зачот.

Автор: JackYF 11.12.2006, 15:33
Rockie,  smile Присоединяюсь к Dov... 

Автор: Xenon 11.12.2006, 17:37
А там вообще в задании просят ТОЛЬКО УБРАТЬ - прибавлять низя  smile 

Автор: Dray 11.12.2006, 17:40
УЖОС и при этом чтоб компилилось! smile 

Автор: JackYF 11.12.2006, 18:12
Цитата(Xenon @  11.12.2006,  17:37 Найти цитируемый пост)
А там вообще в задании просят ТОЛЬКО УБРАТЬ - прибавлять низя  smile  


Никто не говорил, что прибавлять нельзя  smile 
Говорили, что надо убрать "=". smile

Earnest - правильное решение.
Rockie - повеселил народ smile.

Автор: En_t_end 12.12.2006, 14:12
JackYF
Цитата(JackYF @  11.12.2006,  22:12 Найти цитируемый пост)

Earnest - правильное решение.
Rockie - повеселил народ

JackYF - комментирует
ЗЫ ты прям как маджик гуди блин smile

Добавлено @ 14:20 
кстати вот ещё решение(раз вы скобки добавили, значит можно не просто стирать '=' но и стирать другие интересные символы smile(то есть все)) :
Код

 

имеется ввиду контекст:
Код

void main(void)
{

}


Добавлено @ 14:22 
но суть одна... суть примера Rockie  smile 

Автор: Voldemar2004 13.12.2006, 11:17
JAnty, в С++ переменные можно инициализировать не только знаком =, но и скобками:
Код
#define begin {
#define end; }

void main()

begin

int a(0), b(1), c(a+b);

end;

Автор: Xenon 13.12.2006, 15:02
Voldemar2004, Ну это, как бы, уже озвучили smile

Автор: JackYF 13.12.2006, 15:41
Voldemar2004,
Цитата(Voldemar2004 @  13.12.2006,  11:17 Найти цитируемый пост)

#define begin {
#define end; }


Это еще что? smile
И как ты при этом будешь итераторы стандартные использовать, мне интересно?



Автор: UniBomb 14.12.2006, 20:42
Есть ещё маленькая загадка - вопрос. Многие конечно скажут что-то типа "баян", но те кто ни разу не наталкивался на неё пускай поробуют, подумают:

переменной а присвоить значение переменной b, b присвоить значение переменной а без использования третьей переменной.
Код

int a(6);
int b(3);



Автор: JackYF 14.12.2006, 20:56
UniBomb, для всех типов переменных ? smile Или только для int'ов?

Автор: UniBomb 14.12.2006, 20:58
JackYF

Начнём с int'ов... А там глядиш и будет универсальное решение для всех типов данных.

Автор: JackYF 14.12.2006, 21:02
Цитата(UniBomb @  14.12.2006,  20:58 Найти цитируемый пост)
А там глядиш и будет универсальное решение для всех типов данных. 

Какой минимальный набор операций должен поддерживать тип данных, по-твоему?

Автор: UniBomb 14.12.2006, 21:06
JackYF

Как фишка ляжет. Хотя в принципе минимальный набор (плюс, минус, умножить, разделить, и, или) операций поддерживает каждый тип. Это если я тебя правильно понял...

Автор: skyboy 14.12.2006, 21:08
Код

a= a + b;
b= a - b;
a= a - b;

Автор: JackYF 14.12.2006, 21:12
Цитата(UniBomb @  14.12.2006,  21:06 Найти цитируемый пост)
Хотя в принципе минимальный набор (плюс, минус, умножить, разделить, и, или) операций поддерживает каждый тип


Я же и спрашивал smile Пользовательский тип может и не поддерживать данные операции.
Если же поддерживает -- skyboy ответил.
Можно тоже же самое, только место -,+ -- xor.

Хотя не думаю, что этот вопрос он слышал в первый раз. smile

Автор: skyboy 14.12.2006, 21:12
Код

a = a * b;
b = a / b;
a = a / b;

Автор: Fazil6 14.12.2006, 21:17
Код

int x = 1876;
int y = 60332;
std::cout << x << "   " << y << std::endl;
y = y ^ x;
x = x ^ y;
y = y ^ x;
std::cout << x << "   " << y << std::endl;

Автор: UniBomb 14.12.2006, 21:22
skyboy
врое прально....


Fazil6
боюсь мои познания а си не настолько велики, что бы я смог понять твой код....

Есть ещё способ с использованием логичесих операций (если его не изобразил Fazil6)....

Автор: JackYF 14.12.2006, 21:26
Цитата(UniBomb @  14.12.2006,  21:22 Найти цитируемый пост)
Есть ещё способ с использованием логичесих операций (если его не изобразил Fazil6)....


Именно его и изобразил. Это побитовый XOR.

Автор: Dray 14.12.2006, 21:34
А теперь устроим свистопляску!
Код
int a=1;
int b=2;
int c=3;

К а присвоить b, к b присвоить c, к c присвоить а. Без добавления переменных.

Автор: Fazil6 14.12.2006, 21:51
и в чем задача?
а меняем с b и потом с меняем с  b  

Автор: Dray 14.12.2006, 22:02
And the winner is...
... Fazil6 !!!
 smile 

Автор: nikitao 14.12.2006, 22:34
Напомниет топик , где надо было Hello world написать как можно КРУЧЕ smile 

Автор: UniBomb 14.12.2006, 22:49
Что ж, превратим этот топик в сборник интересных задач, вот следующая - написать программу, которая выводила бы на экран саму себя. Самое короткое решенеие (жаль его не помню) уместилось в одной строке...

Автор: JackYF 14.12.2006, 23:05
Цитата(UniBomb @  14.12.2006,  22:49 Найти цитируемый пост)
уместилось в одной строке... 

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

Автор: UniBomb 14.12.2006, 23:09
JackYF

ну хорошо - в одной строке с приемлимой длинной. да и вообще, много разговариваеш!  smile 

Автор: Rockie 15.12.2006, 01:31
Цитата(UniBomb @  14.12.2006,  22:49 Найти цитируемый пост)
Самое короткое решенеие (жаль его не помню) уместилось в одной строке...


угу, жаль..

Цитата(UniBomb @  14.12.2006,  23:09 Найти цитируемый пост)
да и вообще, много разговариваеш!   


Зато ты - много, лови минус.


Автор: UniBomb 15.12.2006, 11:57
Rockie

Цитата

Зато ты - много, лови минус.


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

Автор: Любитель 15.12.2006, 13:05
А задача печати самой себя очень старая.
Здесь рулят языки без всяких main-функций. Тогда такой пролграмой будет пустая програма.  smile 
Условие только надо уточнить - не использовать внешних источников информации (а то из исходника прогу напечатаем, да и всё).

Автор: UniBomb 15.12.2006, 14:04
Любитель

Хех, с внешними источниками данных всё равно придётся повыпендриваться, ведь получается что одним оператором всю прогу на экран не вывести... С добавлением нового оператора возникнет необходимость вывода этого оператора на экран, на следовательно ввод в программу нового оператора, для вывода того... В общём всё бесконечно запутано...

Автор: Любитель 15.12.2006, 14:56
В смысле с внешними как раз всё тривиально. Мы читаем из файла main.cpp текст и пишем его на экран. Компилируем, ложим экзешку в папку с main.cpp, запускаем.

Автор: UniBomb 15.12.2006, 17:03
Любитель

не, так не пойдёт... давай без внешних источников... 

Автор: Rockie 15.12.2006, 21:08
На http://ru.wikipedia.org/wiki/Quine#.D0.A1.D0.B8 лежит пример на Си.

Код
#include<stdio.h>
char*i="\\#include<stdio.h>",n='\n',q='"',*p=
"%s%cchar*i=%c%c%s%c,n='%cn',q='%c',*p=%c%c%s%c,*m=%c%c%s%c%c;%s%c",*m=
"int main(){return!printf(p,i+1,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n,m,n);}"
;int main(){return!printf(p,i+1,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n,m,n);}


Зато улыбнул пример на Brainfuck: 
Код
>>+++++++>>++>>++++>>+++++++>>+>>++++>>+>>+++>>+>>+++++>>+>>++>>+
>>++++++>>++>>++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+
>>+++++>>+>>+>>+>>++++>>+++++++>>+>>+++++>>++++++++++++++>>+>>+>>
++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+>>+++++>>+++++
++++++++++++++++++++++++>>+>>+>>++++>>+++++++>>+>>+++++>>++>>+>>+
>>+++++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>
>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>++
>>++++>>+++++++>>+>>+++++>>+++++++>>+>>+++++>>+>>+>>+>>++++>>+>>+
+>>+>>++++++>>+>>+++++>>+++++++>>+>>++++>>+>>+>>++>>+++++>>+>>+++
>>+>>++++>>+>>++>>+>>++++++>>+>>+++++>>+++++++++++++++++++>>++>>+
+>>+++>>++>>+>>++>>++++>>+++++++>>++>>+++++>>++++++++++>>+>>++>>+
+++>>+>>++>>+>>++++++>>++++++>>+>>+>>+++++>>+>>++++++>>++>>+++++>
>+++++++>>++>>++++>>+>>++++++[<<]>>[>++++++[-<<++++++++++>>]<<++.
.------------------->[-<.>>+<]>[-<+>]>]<<[-[-[-[-[-[-[>++>]<+++++
++++++++++++++++++++++++>]<++>]<++++++++++++++>]<+>]<++>]<<[->.<]<<]

а в особенности это:
Цитата
(переносы строк добавлены для читабельности)

smile 



Автор: Dov 15.12.2006, 21:17
Цитата(Rockie @  15.12.2006,  20:08 Найти цитируемый пост)
(переносы строк добавлены для читабельности)

 smile  smile  smile  Пацтулом.  smile  smile  smile 

Автор: Любитель 18.12.2006, 15:09
Rockie, да замечание весёлое.  smile 

Автор: ressac 19.12.2006, 20:37
Код

int a(6);
int b(3);


под Си это не пашет, под Си++ да. smile

Добавлено @ 20:39 
Цитата

А задача печати самой себя очень старая.


если ты про то что она показывает свой исходник, то помойму легче всего впихнуть рид файл и всё. 

Автор: Voldemar2004 19.12.2006, 23:13
Чтобы написать прогу, которая выводит саму себя - достаточно написать в ф-цию, считывающую файл - в качестве аргумента указать имя исходника.

Автор: Любитель 20.12.2006, 13:43
Млин, я сказал - не использовать внешних источников данных.

Автор: ressac 20.12.2006, 17:26
Любитель, ну тогда printf("..."); smile

Автор: Любитель 20.12.2006, 17:37
Плохо говорить, когда ответ уже был. Если пытаться делать тривиально то тебе нужен бесконечный printf.

Автор: DeMoNN 20.2.2009, 17:18
можно его в ресурсы запхать smile это уже не ВНЕШНИЙ а ВНУТРЕННИЙ источник бует))))

Автор: Goliaf777 29.3.2009, 16:43
Вот очень  легкая задачка: зачем нужно перегружать стандартный оператор присваивания и конструктор копирования, при динамическом распределении памяти в классе?

Автор: GoldFinch 29.3.2009, 22:08
чтоб члены класса - указатели  не копировались в другой объект %)

Автор: Rififi 29.3.2009, 23:11
Код
std::vector<std::string> v;
v.reserve(1);
v[0] = "Hello, world!";
std::cout << v[0];

что выведет программа?

Автор: azesmcar 29.3.2009, 23:19
Цитата

что выведет программа? 


не вызван конструктор для std::string. хрень какую нибудь или access violation.

Автор: azesmcar 1.6.2009, 01:21
и задача, может многие знают, встретил на брейнбенче, довольно интересная smile 
Код

struct A
{
    A(): i(1){}
    int i;
};

struct B : A
{
    B(): j(2){}
    int j;
};

int main()
{
    A *p = new B[10];
    A *q = p;
    int total = 0;
    for (int i = 0; i < 10; ++i)
    {
        total += q++->i;
    }

    //чему равна переменная total в этом участке кода?
    delete [] p;
    return 0;
}


Автор: GoldFinch 4.6.2009, 19:45
azesmcar, видимо total == 10
хотя непонятно зачем там int j; и зачем такие кривые идентификаторы

Автор: azesmcar 4.6.2009, 19:53
Цитата(GoldFinch @  4.6.2009,  19:45 Найти цитируемый пост)
azesmcar, видимо total == 10

нет, 10 было бы слишком просто smile 

Цитата(GoldFinch @  4.6.2009,  19:45 Найти цитируемый пост)
хотя непонятно зачем там int j; и зачем такие кривые идентификаторы 

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

Автор: Любитель 4.6.2009, 20:36
Инкрементится указатель на A, он не знает о фактическом размере элементов массива, т. е. сдвиг будет на sizeof(A). А фактически - будут пройдены 5 элементов, сумма 15. Так?

PS Блин, печально другое - вначале хотел сказать, что программа вывалится, так как выделили память только под массив, а не под сами объекты. Год работы с шарпом даёт о себе знать.. smile 

Автор: azesmcar 4.6.2009, 20:41
Цитата(Любитель @  4.6.2009,  20:36 Найти цитируемый пост)
Инкрементится указатель на A, он не знает о фактическом размере элементов массива, т. е. сдвиг будет на sizeof(A). А фактически - будут пройдены 5 элементов, сумма 15. Так?

Да, только будет пройдено на 5 а 10. Просто 5 из них будет прибавлено 1, для остальных 5-и будет прибавлена 2. Или мы о разном.
В итоге - 15, все абсолютно верно. smile 

Цитата

PS Блин, печально другое - вначале хотел сказать, что программа вывалится, так как выделили память только под массив, а не под сами объекты. Год работы с шарпом даёт о себе знать.. smile 

 smile бывает...именно так и бывает smile

Автор: newsl 1.11.2009, 16:10
#include<iostream>
using namespace std;

int main ()
{
    int a(3);
    int b(9);

    a+=b;
    b-=a;
    a+=b;
    b*=~0;
    
    cout<<a<<endl;
    cout<<b<<endl;

system ("pause");
return 0;

}

Автор: Belirafor 4.11.2009, 00:21
сорри не туда!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)