![]() |
[C/C++] ЗАДАНИЯ
По аналогии с темой Krist_ALL'a решил создать отдельный топик с заданиями по С/С++. Надеюсь что вы enjoy it ;)
Задание 1. Код:
int a, sum=0; char buf[4096];Верное решение Задание 2. Мы создаем класс без конструкторов. Что сгенерирует компилятор дополнительно? Мы создаем класс, в котором есть только конструктор без аргументов. Что сгенерирует компилятор дополнительно? Мы создаем класс, в котором есть только конструктор копии. Что сгенерирует компилятор дополнительно? Задание 3. Код:
class SimpleClass {Верное решение Задание 4. Код:
class A {Верное решение Задание 5. Код:
foo() {Верное решение Задание 6. Код:
void display(int in) {Верное решение Задание 7. (by slesh) Код:
struct _REC { В таком виде структура занимает 12 байт. При этом не был потерян функционал!!! Верное решение Верное решение Задание 8. (by slesh) Необходимо откомпилить консольную прожку. Я тестил на VC++ 2008 ПРИМЕЧАНИЯ: 1) в коде нельзя ничего удалять!! 2) нельзя подключать новые хидеры!! Код:
#include "stdio.h" Верное решение Задание 9. (by slesh) Код:
#include "stdio.h" Необходимо обработать это исключение, выдать на экран сообщение об ошибке и завершить работу программы. И Главное - решение не должно использовать конструкцию try except и должно иметь глобальные характер. т.е. даже если это исключение появится в отдельном потоке, то действия программы должны быть такими же. P.S. Решение требует примерно 5 строчек кода. Верное решение Задание 10. Создать динамический двумерный массив размерностью N. Заполнить его значениями. Вывести значения массива на экран. Запрещается использовать символы '[' и ']'. Верное решение Верное решение Задание 11. Как можно выполнить эффективное побайтовое сравнение структур, не используя прагмы компилятора и группировку членов? Верное решение Задание 12. Код:
for (int k=0, int A=0; k < strlen(str); k++)Верное решение Особое решение slesh'a :) Задание 13. Что эффективней использовать и почему: Код:
strcpy(str, "bytes "); strcat(str, very_long_string);Верное решение Задание 14. Создать массив, начальный индекс которого есть произвольное число (например, 1, а не с 0). Верное решение Задание 15. Код:
const int x = 1; {Верное решение Задание 16. (by desTiny) Что будет в переменной после выполнения кода (не компилить!) Код:
/*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 нетривиальных проектов, решений и задач |
задание одын
Код:
int sum=0; char buf[]="Tell me your name:"; |
Нет, имелось в виду несколько не это ) Присмотрись к циклу, к порядку появления переменных.
PS Переполнение здесь роли не играет. |
может быть так?
int a, sum=0; char buf[4096]; printf("Tell me your name:"); gets(buf); for(a=0; a<100; a++, sum++); |
В первой задаче для локальных переменных будет использовано слишком много стековой памяти (8 килобайт вместо 4). Бороться с этим можно если запихать данные в структурку
|
Совершенно верно )
|
Добавил пару задачек
|
Цитата:
Если всё запихнуть в структуру, то будет оптимизированно Цитата:
|
А вот задачка от меня
Код:
В таком виде структура занимает 12 байт. При этом небыл потерян функционал!!! |
Код:
struct _REC |
Практически правильно, но есть способо без изменения позиции переменных
Его необходимо применить чтобы данная структура стала 7 байт и не потерялся функционал Код:
struct _RECРазмер должен быть 7 байт!! Код:
struct _REC |
P.S. Существуют 2 решения, оба сводятся к одному и томуже, но реализуются соверщенно по разному
|
Цитата:
|
Нет union делает другое
|
А вот еще одно задание довольно интерестное, если сразу задуматься, то быстро можно решить.
ЗАДАЧА: необходимо откомпилить консольную прожку. Я тестил на VC++ 2008 ПРИМЕЧАНИЯ: 1) в коде нельзя ничего удалять!! 2) нельзя подключать новые хидеры!! Код:
#include "stdio.h" |
вот вам моя задачка. есть класс с перегруженным оператором <. есть вектор, который хранит shared_ptr'ы на объекты этого класса. задача - поюзать std::sort не создавая левые функции, только при помощи stl b boost::bind. второй день не могу понять в чем дело =\ был бы вектор чистых объектов - можно было отсортировать строкой
Код:
std::sort(state_lines.begin(), state_lines.end());Код:
std::sort(state_lines.begin(), state_lines.end(), Код:
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 &'[ADDED] сцуко скомпилелось =\\\ пришлось сделать внутри класса такое вот static bool less (const HORIZONTALSTATELINE_PTR& left, const HORIZONTALSTATELINE_PTR& right); |
Цитата:
|
Ну и вот еще одна задачка от меня, если заюзать поиск то можно быстро решить её.
ЗАДАЧА: существует програмка Код:
#include "stdio.h"Необходи обработать это исключение и выдать на экран сообщение об ошибке и завершить работу программы. И Главное - решение не долно использовать конструкцию try except и должно иметь глобальные характер. т.е. даже если это исключение появится в отдельном потоке, то действия программы должны быть такимиже. P.S. Решение требует примерно 5 строчек кода. |
Цитата:
только чушь это всё конечно) |
2 desTiny всё делает намного проще )
И то что ты показал, то 12 байт вообще ) |
Извиняюсь за глупый вопрос, но что делает эта единица в конце?
Код:
bool data7:1; |
это значит что ты эта переменная будит занимать 1 бит.
И по этому конструкция в структуре типа bool data1:1; bool data2:1; bool data3:1; bool data4:1; bool data5:1; bool data6:1; bool data7:1; bool data8:1; тудет занимать 1 байт |
Интерестно, спасибо.
|
Цитата:
|
ок, так:
Код:
struct _REC |
2 desTiny Это правильный, но некрасивый способо. Есть более красивый и удобный)
|
Спасибо всем, кто поддержал тред. Обновил первый пост: есть нерешенные задачи!
|
Код:
void display(int in) { |
Код:
class SimpleClass { |
Немного поправлю:
Списки инициализаторов инициализируют члены данных в порядке их следования в определении класса. Отсюда проблемы = ) Решения приняты ) |
Цитата:
Кстати, мой VS сказал про него "8 байт". и про такое тоже: Код:
struct _REC |
Вижу что мало кто юзает данный способ по этому напишу правильный ответ сам )
Это директивы компилятора, которые на время могут менять выравнение структур. Подефолту выравнение идет на 4 байта. т.е. если структура будет 9 байт, то выравнеется на 12. #pragma pack(1) - выравнение 1 байт #pragma pack() - дефолтовое выранение. вот и выходит код типа #pragma pack(1) struct ..... #pragma pack() |
Кстати, одним из решений другого задания (5) тоже были директивы и никто не написал :(
Забыли их, бедняжек ( Added: перечитал пару статей: действительно, скорость при использовании прагм компилятора падает. Иногда значительно. |
А вешь очень удобная для оптимизации работы программы.
А если писать свой клиент-сервер которые общаются по своему протоколу, то такое просто необходимо юзать для снижения трафа |
Вообще это можно использовать не только в сетевых приложениях, а везде ) Лишних пару сэкономленных байт еще никому не мешали.
Added: перечитал пару статей: действительно, скорость при использовании прагм компилятора падает. Иногда значительно. |
Кстати не всегда это делать желательно, потому как бываются случае что
адрес переменной должен быть выравнен на 4 байта иначе будет ошибка. Такое встречается в некоторых WinAPI функцих которые просто убивают приложение если адрес буфера не выравненн на 4 байта |
это еще приводит к замедлению работы, ибо обращение к невыравненной ячейке памяти дает штраф
Цитата:
|
Добавил несколько несложных задачек. Не решены задания 2, 9, 10, 11, 12, 13, 14.
С радостью выслушаю любые ваши предложения и замечания ) |
здание 12 хочу решить так ))
Код:
int a = 0; |
Нужно отредактировать исходный код )) Хотя твоя версия, безусловно, верна.
|
| Время: 20:40 |