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

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

  1. Roston

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

    Joined:
    31 Jul 2008
    Messages:
    337
    Likes Received:
    104
    Reputations:
    8
    14) не совсем понял но всё же можно так
    Code:
    srand(time(NULL));
    for(i=0;i<n;i++)
    a[i]=random(20)+1;
    /*random(20) будет делать рендом от 0 до 19 а так если прибавить единицу то от 1 до 20*/
    
     
  2. Fata1ex

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

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Отредактировал условие 14 задания, спасибо )
     
    1 person likes this.
  3. Roston

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

    Joined:
    31 Jul 2008
    Messages:
    337
    Likes Received:
    104
    Reputations:
    8
    12)
    в цикле каждый раз идет обьявление и каждый раз считаеться размер str
    моя версия
    Code:
    int k=0,A=0,n=strlen(str);
    for(k=0;k<n;k++)
    A+=str[k];
    
    З.Ы. Заметь у тя счётчик масива k а ты в условии сколько выполнять цикл поставил i=)
     
    #43 Roston, 23 Jun 2009
    Last edited: 23 Jun 2009
  4. Fata1ex

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

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Совершенно верно )
    Баг со счетчиком был already героически пофикшен :)

    Хочу добавить, что добавил(оО) слишком много репутации в за последние пару часов, поэтому дополнительное вознаграждение за участие будет позже = )
     
    #44 Fata1ex, 23 Jun 2009
    Last edited: 23 Jun 2009
  5. Roston

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

    Joined:
    31 Jul 2008
    Messages:
    337
    Likes Received:
    104
    Reputations:
    8
    в 13) вся заковиренка в символе :?
     
  6. Fata1ex

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

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Странный вопрос. Разумеется да, потому что это единственное, чем отличаются два случая.
     
    #46 Fata1ex, 23 Jun 2009
    Last edited: 23 Jun 2009
  7. Roston

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

    Joined:
    31 Jul 2008
    Messages:
    337
    Likes Received:
    104
    Reputations:
    8
    тогда мой окончательный ответ что использовать
    Code:
    strcpy(str, "bytes "); strcat(str, very_long_string);
    чем
    Code:
    strcpy(str, "bytes: "); strcat(str, very_long_string);
     
  8. Fata1ex

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

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Главным является вопрос "почему?" )
    Добавил задачку.
     
  9. Roston

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

    Joined:
    31 Jul 2008
    Messages:
    337
    Likes Received:
    104
    Reputations:
    8
    оно занимает на один байт больше
     
  10. Fata1ex

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

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Нет, имелось в виду не это )
     
  11. Roston

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

    Joined:
    31 Jul 2008
    Messages:
    337
    Likes Received:
    104
    Reputations:
    8
    15)
    2 3 2
    Обьяснение:
    перечисления... если б Х ничего не присваивалось тогда бы вывод значения был бы в зависимости от расположения переменной и каждое следуещее значение инкрементировалось на 1, тобишь если б
    Code:
    enum {x,y,z}
    cout<<x<<" "<<y<<" "<<z;
    то результат быд 0 1 2

    а так Х=1+1, тогда Y=x+1=3; z=x=2
     
    3 people like this.
  12. Fata1ex

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

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Верно :)
     
  13. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Fata1ex в моё случае экономия времяни идет раза в 2 потому как strlen - проходит и сравнивате каждый символ с нулем. Так что если юзать strlen то это двойной проход строки. Для доказательства всег овышеслудующего приведу ассемблерный код который созддает компилятор MS

    случай
    Code:
    int a = 0;
    char * k = str;
    while (k[0])
     {
       a += k[0];
       k++;
     }
    
    Code:
     ; int a = 0;
      xor	 edx, edx
      mov	 BYTE PTR _str$[esp+10], cl
      mov	 WORD PTR _str$[esp+8], ax
    ; char * k = str;
      lea	 ecx, DWORD PTR _str$[esp+8]
    ; while (k[0])
      test	 al, al
      je	 SHORT $LN1@main
    $LL2@main:
    ; a += k[0];
     movsx	 eax, al
    ; 24   :    k++;
     inc	 ecx
     add	 edx, eax
     mov	 al, BYTE PTR [ecx]
     test	 al, al
     jne	 SHORT $LL2@main
    $LN1@main:
    
    Итого 31 байт.


    А теперь рассмотрим код в случае
    Code:
    int k=0,A=0,n=strlen(str);
    for(k=0;k<n;k++)
    A+=str[k];
    
    выходит
    Code:
      00024	8d 44 24 10	 lea	 eax, DWORD PTR _str$[esp+20]
      00028	83 c4 04	 add	 esp, 4
      0002b	88 4c 24 0e	 mov	 BYTE PTR _str$[esp+18], cl
      0002f	33 db		 xor	 ebx, ebx
      00031	8d 50 01	 lea	 edx, DWORD PTR [eax+1]
    $LL11@main:     /// <== вот это типа код strlen==========
      00034	8a 08		 mov	 cl, BYTE PTR [eax]
      00036	40		 inc	 eax
      00037	84 c9		 test	 cl, cl
      00039	75 f9		 jne	 SHORT $LL11@main
    /// <=========================================
      0003b	2b c2		 sub	 eax, edx
      0003d	8b d0		 mov	 edx, eax
    
    ; 23   : 
    ; 24   : for(k=0;k<n;k++)
    
      0003f	33 c0		 xor	 eax, eax
      00041	83 fa 02	 cmp	 edx, 2
      00044	7c 20		 jl	 SHORT $LC9@main
      00046	8d 4a ff	 lea	 ecx, DWORD PTR [edx-1]
      00049	55		 push	 ebp
      0004a	8d 9b 00 00 00
    	00		 npad	 6
    $LL10@main:
    
    ; 25   : A+=str[k];
    
      00050	0f be 6c 04 10	 movsx	 ebp, BYTE PTR _str$[esp+eax+20]
      00055	03 f5		 add	 esi, ebp
      00057	0f be 6c 04 11	 movsx	 ebp, BYTE PTR _str$[esp+eax+21]
      0005c	83 c0 02	 add	 eax, 2
      0005f	03 fd		 add	 edi, ebp
      00061	3b c1		 cmp	 eax, ecx
      00063	7c eb		 jl	 SHORT $LL10@main
      00065	5d		 pop	 ebp
    $LC9@main:
    
    ; 23   : 
    ; 24   : for(k=0;k<n;k++)
    
      00066	3b c2		 cmp	 eax, edx
      00068	7d 05		 jge	 SHORT $LN8@main
    
    ; 25   : A+=str[k];
    
      0006a	0f be 5c 04 0c	 movsx	 ebx, BYTE PTR _str$[esp+eax+16]
    $LN8@main:
      0006f	03 fe		 add	 edi, esi
    
    выходит 77 байт.
    что выходит почти в 2,5 раза больше по коду и следовательно по скорости.

    Из этого можно сказать что при работе со строковыми функциями лучше использоват собственные методы
     
  14. Lee_fx

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

    Joined:
    27 Sep 2008
    Messages:
    90
    Likes Received:
    14
    Reputations:
    0
    memset, memcmp?
     
  15. desTiny

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

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    следование неверно)
    @here: mov ecx, 10;
    loop @here;

    вообще несколько байт) а time = \infty
     
  16. Fata1ex

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

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Lee_fx, подробнее )
     
  17. Lee_fx

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

    Joined:
    27 Sep 2008
    Messages:
    90
    Likes Received:
    14
    Reputations:
    0
    Code:
    struct A {
    	int x;
    	char y;
    }; 
    int main() {
    	A a, b;
    	memset(&a, NULL, sizeof(a));
    	memset(&b, NULL, sizeof(b));
    	a.x = 10; a.y = 'q';
    	a.x = 10; a.y = 'q';
    
    	if(memcmp(&a, &b, sizeof(a)))
    		cout << "!=";
    	else
    		cout << "=";
    
    	return 0;
    }
    sizeof(a) и sizeof(b) - 12 байт, хотя int+char = 5 => остальные 7 занимает мусор, его и заNULLяем и сравниваем.
     
  18. Fata1ex

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

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Точно )
    Нерешенные задачи: 2 9 10 13 14
     
    #58 Fata1ex, 23 Jun 2009
    Last edited: 23 Jun 2009
  19. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Мне вот еще нравилась старая задачка одна, которая даже не зависела от языка программирования.
    А Задачка такая:
    Есть 2 числа
    int a = 12;
    int b = 7;

    необходимо обменять значения между этими переменными при этом нельзя использовать третью переменную.
    P.S. числа роли не играют.
     
    1 person likes this.
  20. [n]-c0der

    [n]-c0der Member

    Joined:
    3 Feb 2009
    Messages:
    83
    Likes Received:
    24
    Reputations:
    -1
    ASM xchg...

    Ну и собсна алгоритм:
    Code:
    a = a - b;
    b = b + a;
    a = b - a;
    Реализация :):
    Code:
    procedure _XCHG(var a,b:integer);
    Begin
      a:= a - b;
      b:=b + a;
      a:=b - a;
    End;
    Code:
    void _XCHG(int a, int b){
    	a = a - b;
    	b = b + a;
    	a = b - a;
    };
     
    #60 [n]-c0der, 23 Jun 2009
    Last edited: 23 Jun 2009
    1 person likes this.