[C/C++] ЗАДАНИЯ

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Fata1ex, 21 Jun 2009.

  1. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    По аналогии с темой 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 нетривиальных проектов, решений и задач
     
    #1 Fata1ex, 21 Jun 2009
    Last edited: 9 Jul 2009
    2 people like this.
  2. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    задание одын
    Code:
    int sum=0; char buf[]="Tell me your name:";
    puts(buf); fgets(buf, sizeof(buf), stdin);
    
    ??
     
    _________________________
  3. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Нет, имелось в виду несколько не это ) Присмотрись к циклу, к порядку появления переменных.
    PS Переполнение здесь роли не играет.
     
  4. nemaniak

    nemaniak Elder - Старейшина

    Joined:
    10 Jun 2008
    Messages:
    195
    Likes Received:
    161
    Reputations:
    108
    может быть так?

    int a, sum=0; char buf[4096];
    printf("Tell me your name:"); gets(buf);
    for(a=0; a<100; a++, sum++);
     
  5. jawbreaker

    jawbreaker Elder - Старейшина

    Joined:
    7 Jul 2008
    Messages:
    156
    Likes Received:
    76
    Reputations:
    3
    В первой задаче для локальных переменных будет использовано слишком много стековой памяти (8 килобайт вместо 4). Бороться с этим можно если запихать данные в структурку
     
    1 person likes this.
  6. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Совершенно верно )
     
  7. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Добавил пару задачек
     
  8. FireFenix

    FireFenix Elder - Старейшина

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    За счёт выравнивания будет 20 байт (3[a,b,c] по 4 байта, d выравняет на 8 байт = 20 байт)
    Если всё запихнуть в структуру, то будет оптимизированно
    Поидее должно вывести 11, т.е. вначале выполнится инкремент (т.к. знак инкремента стоит слева, если справа - то после вывода), птом вывод
     
    #8 FireFenix, 22 Jun 2009
    Last edited: 22 Jun 2009
  9. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    А вот задачка от меня

    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 байт.
    При этом небыл потерян функционал!!!
     
    #9 slesh, 22 Jun 2009
    Last edited: 22 Jun 2009
    1 person likes this.
  10. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    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;
    
    =)
     
  11. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Практически правильно, но есть способо без изменения позиции переменных

    Его необходимо применить чтобы данная структура стала 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;
    
     
    #11 slesh, 22 Jun 2009
    Last edited: 22 Jun 2009
  12. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    P.S. Существуют 2 решения, оба сводятся к одному и томуже, но реализуются соверщенно по разному
     
  13. FireFenix

    FireFenix Elder - Старейшина

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    Использовать вместо структуры - объединения (union)?
     
  14. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Нет union делает другое
     
  15. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    А вот еще одно задание довольно интерестное, если сразу задуматься, то быстро можно решить.

    ЗАДАЧА: необходимо откомпилить консольную прожку. Я тестил на 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;
    }
    
    
    ПОДСКАЗКА: решение требует дописания одной строки.
     
  16. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    вот вам моя задачка. есть класс с перегруженным оператором <. есть вектор, который хранит 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);
     
    #16 Ra$cal, 22 Jun 2009
    Last edited: 22 Jun 2009
  17. FireFenix

    FireFenix Elder - Старейшина

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    extern "C" __declspec(dllimport) void __stdcall Sleep(unsigned long dwMilliseconds);
     
    1 person likes this.
  18. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Ну и вот еще одна задачка от меня, если заюзать поиск то можно быстро решить её.
    ЗАДАЧА: существует програмка
    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 строчек кода.
     
  19. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    неявное преобразование типа должно сжевать.

    только чушь это всё конечно)
     
  20. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 desTiny всё делает намного проще )
    И то что ты показал, то 12 байт вообще )
     
    #20 slesh, 22 Jun 2009
    Last edited: 22 Jun 2009