По аналогии с темой Krist_ALL'a решил создать отдельный топик с заданиями по С/С++. Надеюсь что вы enjoy it Задание 1. Code: int a, sum=0; char buf[4096]; printf("Tell me your name:"); gets(buf); for(a=0; a<100; a++) sum+=0; //(с) мыщьх Как оптимизировать программу с точки зрения использования ею оперативной памяти? И что в ней не так? Верное решение Задание 2. Мы создаем класс без конструкторов. Что сгенерирует компилятор дополнительно? Мы создаем класс, в котором есть только конструктор без аргументов. Что сгенерирует компилятор дополнительно? Мы создаем класс, в котором есть только конструктор копии. Что сгенерирует компилятор дополнительно? Задание 3. Code: class SimpleClass { private: int a; int b; public: SimpleClass(int x) : b(x), a(b) {} void print() { std::cout << "a=" << a << " b=" << b << std::endl; } }; int main() { SimpleClass a(42); a.print(); return 0; } Что здесь не так? Верное решение Задание 4. Code: class A { public: virtual void Foo (int n = 10) { cout << "A::Foo, n = " << n << endl; } }; class B : public A { public: virtual void Foo (int n = 20) { cout << "B::Foo, n = " << n << endl; } }; int main() { A * pa = new B (); pa->Foo (); return 0; } //(c) habrahabr//h1ppo Что выведет программа и почему? Верное решение Задание 5. Code: foo() { char a; char b; char c; char d[5]; } (c) мыщьх Сколько байт локальной памяти мы израсходовали? Почему? Как оптимизировать эту "оптимизированную"(здесь подсказка) программу? Верное решение Задание 6. Code: void display(int in) { // What im doing here????????/ cout << ++in; } void foo() { int a=10; display(a); } Что выведет программа? Верное решение Задание 7. (by slesh) Code: struct _REC { unsigned char data1; unsigned short data2; bool data3; bool data4; bool data5; bool data6; bool data7; unsigned short data8; } REC; Как оптимизировать данную структуру чтобы она занимала в памяти 6 байта, то есть sizeof(REC) = 6 В таком виде структура занимает 12 байт. При этом не был потерян функционал!!! Верное решение Верное решение Задание 8. (by slesh) Необходимо откомпилить консольную прожку. Я тестил на VC++ 2008 ПРИМЕЧАНИЯ: 1) в коде нельзя ничего удалять!! 2) нельзя подключать новые хидеры!! Code: #include "stdio.h" void _stdcall Sleep(unsigned long dwMilliseconds); int main(int argc, char* argv[]) { printf("START PAUSE"); Sleep(2000); printf("STOP PAUSE"); return 0; } ПОДСКАЗКА: решение требует дописания одной строки. Верное решение Задание 9. (by slesh) Code: #include "stdio.h" #include "windows.h" int main(int argc, char* argv[]) { printf("SRART\n"); __asm { hlt } return 0; } При выполнении появляется ошибка из-за того, что команда hlt является привилегированной и недоступной из пользовательского режима. Необходимо обработать это исключение, выдать на экран сообщение об ошибке и завершить работу программы. И Главное - решение не должно использовать конструкцию try except и должно иметь глобальные характер. т.е. даже если это исключение появится в отдельном потоке, то действия программы должны быть такими же. P.S. Решение требует примерно 5 строчек кода. Верное решение Задание 10. Создать динамический двумерный массив размерностью N. Заполнить его значениями. Вывести значения массива на экран. Запрещается использовать символы '[' и ']'. Верное решение Верное решение Задание 11. Как можно выполнить эффективное побайтовое сравнение структур, не используя прагмы компилятора и группировку членов? Верное решение Задание 12. Code: for (int k=0, int A=0; k < strlen(str); k++) A+=str[k]; Оптимизировать код. Верное решение Особое решение slesh'a Задание 13. Что эффективней использовать и почему: Code: strcpy(str, "bytes "); strcat(str, very_long_string); или strcpy(str, "bytes: "); strcat(str, very_long_string); ? Верное решение Задание 14. Создать массив, начальный индекс которого есть произвольное число (например, 1, а не с 0). Верное решение Задание 15. Code: const int x = 1; { enum { x = x + 1, y, z = x }; std::cout << x << ' ' << y << ' ' << z << std::endl; } Что выведет программа и почему? Без компиляции, пожалуйста ) Верное решение Задание 16. (by desTiny) Что будет в переменной после выполнения кода (не компилить!) Code: /*very very long not ever overflowable*/ int a = 5+765432l; ? Верное решение Задание 17. (by fker) Ввести число n, и заполнить двухмерный массив размерностью n числами от 1 до n*n по спирали. Верное решение Задание 18. Привести три эффективных варианта выхода из большого количества вложенных циклов без использования операторов break. Верное решение (Part 1) + Верное решение (Part 2) ############################################################################# Пока все ) Каждый может добавлять свои задания отдельным постом, я же по возможности буду их добавлять сюда. Просьба к авторам задач: после того, как вашу задачу решили, напишите, что это верное решение. Еще хочу добавить: если вам интересны интересные(оО) и нестандартные задачи по С/С++, вам понравится книги Г. Саттер - Решение сложных задач C++ Г. Саттер - Новые сложные задачи C++ М.В. Мозговой - 85 нетривиальных проектов, решений и задач
задание одын Code: int sum=0; char buf[]="Tell me your name:"; puts(buf); fgets(buf, sizeof(buf), stdin); ??
Нет, имелось в виду несколько не это ) Присмотрись к циклу, к порядку появления переменных. PS Переполнение здесь роли не играет.
может быть так? int a, sum=0; char buf[4096]; printf("Tell me your name:"); gets(buf); for(a=0; a<100; a++, sum++);
В первой задаче для локальных переменных будет использовано слишком много стековой памяти (8 килобайт вместо 4). Бороться с этим можно если запихать данные в структурку
За счёт выравнивания будет 20 байт (3[a,b,c] по 4 байта, d выравняет на 8 байт = 20 байт) Если всё запихнуть в структуру, то будет оптимизированно Поидее должно вывести 11, т.е. вначале выполнится инкремент (т.к. знак инкремента стоит слева, если справа - то после вывода), птом вывод
А вот задачка от меня Code: struct _REC { unsigned char data1; unsigned short data2; bool data3; bool data4; bool data5; bool data6; bool data7; unsigned short data8; } REC; Как оптимизировать данную структуру чтобы она занимала в памяти 6 байта. т.е. sizeof(REC) = 6 В таком виде структура занимает 12 байт. При этом небыл потерян функционал!!!
Code: struct _REC { unsigned short data2; unsigned short data8; unsigned char data1; bool data3:1; bool data4:1; bool data5:1; bool data6:1; bool data7:1; } REC; =)
Практически правильно, но есть способо без изменения позиции переменных Его необходимо применить чтобы данная структура стала 7 байт и не потерялся функционал Code: struct _REC { struct { unsigned char data1; unsigned short data2; bool data3; bool data4; bool data5; } first_rec; bool data6; bool data7; unsigned short data8; } REC; Также более наглядно будет в этом примере: Размер должен быть 7 байт!! Code: struct _REC { unsigned short data1; unsigned short data2; unsigned short data3; bool data4; bool data5; bool data6; bool data7; bool data8; } REC;
А вот еще одно задание довольно интерестное, если сразу задуматься, то быстро можно решить. ЗАДАЧА: необходимо откомпилить консольную прожку. Я тестил на VC++ 2008 ПРИМЕЧАНИЯ: 1) в коде нельзя ничего удалять!! 2) нельзя подключать новые хидеры!! Code: #include "stdio.h" void _stdcall Sleep(unsigned long dwMilliseconds); int main(int argc, char* argv[]) { printf("START PAUSE"); Sleep(2000); printf("STOP PAUSE"); return 0; } ПОДСКАЗКА: решение требует дописания одной строки.
вот вам моя задачка. есть класс с перегруженным оператором <. есть вектор, который хранит shared_ptr'ы на объекты этого класса. задача - поюзать std::sort не создавая левые функции, только при помощи stl b boost::bind. второй день не могу понять в чем дело =\ был бы вектор чистых объектов - можно было отсортировать строкой Code: std::sort(state_lines.begin(), state_lines.end()); а я уже опустился до дублирования сравнения в статик методе less Code: std::sort(state_lines.begin(), state_lines.end(), boost::bind<bool>(&HorizontalStateLine::less, _1, _2)); все равно не компилится =\ Code: e:\Program Files\boost\boost_1_38\boost\bind.hpp(282): error C2664: 'bool (const geometry::HorizontalStateLine &,const geometry::HorizontalStateLine &)' : cannot convert parameter 2 from 'std::allocator<_Ty>::value_type' to 'const geometry::HorizontalStateLine &' with [ _Ty=geometry::HORIZONTALSTATELINE_PTR ] e:\Program Files\boost\boost_1_38\boost\bind.hpp(282): error C2664: 'bool (const geometry::HorizontalStateLine &,const geometry::HorizontalStateLine &)' : cannot convert parameter 1 from 'std::allocator<_Ty>::value_type' to 'const geometry::HorizontalStateLine &' with [ _Ty=geometry::HORIZONTALSTATELINE_PTR ] Reason: cannot convert from 'std::allocator<_Ty>::value_type' to 'const geometry::HorizontalStateLine' with [ _Ty=geometry::HORIZONTALSTATELINE_PTR ] No constructor could take the source type, or constructor overload resolution was ambiguous люто бешено не понимаю почему от простого изменения типа элемента с объекта на указатель творится такая жопа [ADDED] сцуко скомпилелось =\\\ пришлось сделать внутри класса такое вот static bool less (const HORIZONTALSTATELINE_PTR& left, const HORIZONTALSTATELINE_PTR& right);
Ну и вот еще одна задачка от меня, если заюзать поиск то можно быстро решить её. ЗАДАЧА: существует програмка Code: #include "stdio.h" #include "windows.h" int main(int argc, char* argv[]) { printf("SRART\n"); __asm { hlt } return 0; } При выполненни вылезит ошибка из-за того что команда hlt является привелегированной и недоступной и пользопательноского режима. Необходи обработать это исключение и выдать на экран сообщение об ошибке и завершить работу программы. И Главное - решение не долно использовать конструкцию try except и должно иметь глобальные характер. т.е. даже если это исключение появится в отдельном потоке, то действия программы должны быть такимиже. P.S. Решение требует примерно 5 строчек кода.