1. C++ / Говнокод #5474

    +160

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    //перевод целого числа в строку
    	//num-число
    	//nn-длина поля
    	char* num10toc(int num, int nn=4)
    	{
    		int i;
    		int sgmin=0;
    		int	xnum=num;
    		char* p=lnum;
    		if (xnum<0) 
    		{
    			sgmin=1;
    			xnum=-xnum;
    
    		}
    		memset(lnum,0,WMAX+1);
    		memset(lnum,0x20,WMAX);
    		i=lenint(xnum);
    		int j=i;
    		int mm=nn-i-sgmin;
    		if (mm>0)
    		{
    			p+=mm;
    		}
    		if (sgmin!=0)
    		{
    			*p='-';
    			p++;
    		}
    		if (xnum==0)
    		{
    			*p='0';
    			return &lnum[0];
    		}
    		while (xnum>0)
    		{
    			*(p+i-1)=(char)(xnum%10+0x30);
    			xnum/=10;
    			i--;
    		}
    		*(p+j)=0;
    		return &lnum[0];
    	}

    Загадка: что выведется в следующих случаях?

    printf("%s\n", num10toc(0, 5));
    printf("%s\n", num10toc(1, 5));
    printf("%s\n", num10toc(12, 5));
    printf("%s\n", num10toc(123, 5));
    printf("%s\n", num10toc(1234, 5));
    printf("%s\n", num10toc(12345, 5));
    printf("%s\n", num10toc(123456, 5));

    Запостил: glprizes, 01 Февраля 2011

    Комментарии (4) RSS

    • Я помню, тут у нас один тоже загадки загадывал... В конце так эпично слил, что я его аж зауважал...
      Ответить
      • Ок, сам отвечу :) Во всех приведенных выше случаях вывод будет такой же, как у простого printf("%d\n", ...). На отрицательных числах проверить забыл, но скорее всего будет так же.
        То есть эта функция в принципе не нужна.
        Ответить
        • Вообще-то о том, что делает функция сказано в самой первой строке. :-) Lenint возвращает количество тезисов Ленина? Параметр по умолчанию задан в 4, а при вызовах везде 5. Где логика?
          Ответить
          • lenint() возвращает число знаков в целом числе :) там в цикле деление на 10, пока не 0. Ширина поля может быть в принципе любой.
            printf("%s\n", num10toc(123)) => printf("%4d", 123)
            printf("%s\n", num10toc(1234, 10)) => printf("%10d", 123)
            Ответить

    Добавить комментарий