飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3270|回复: 4

[C/C++] 19课作业1

[复制链接]
  • TA的每日心情
    无聊
    2024-1-15 22:57
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2011-1-14 22:41:06 | 显示全部楼层 |阅读模式
    本帖最后由 zaas 于 2011-1-14 22:50 编辑
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. int Numinput(int *p,int i);
    4. void Print(int *p,int i);
    5. void Ascending(int *p,int i);
    6. void Descending(int *p,int i);
    7. void Random(int *p,int i);
    8. int Sort (int *p,int i,char * method);
    9. void Change(int *a,int *b);
    10. int Big(int a,int b);
    11. int Small(int a,int b);
    12. void main()
    13. {
    14.         int i;
    15.         int flag;
    16.         int *p;
    17.         char  method[10];
    18.         printf("how many nums?\n");
    19.         flag=scanf("%d",&i);
    20.         if (!flag)
    21.         {
    22.                 printf("error num!\n");
    23.                 return;
    24.         }
    25.         p= (int * )malloc(i*sizeof(int));
    26.         flag=Numinput(p,i);
    27.         if (!flag)
    28.         {
    29.                 printf("error num!\n");
    30.                 free(p);
    31.                 return;
    32.         }
    33.         printf("Ascending/Descending/Random?\n");
    34.         scanf("%10s",method);
    35.         printf("Original:\n");
    36.         Print(p,i);
    37.         flag=Sort(p,i,method);
    38.         if (!flag)
    39.         {
    40.                 printf("error method!\n");
    41.                 free(p);
    42.                 return;
    43.         }
    44.         printf("Sorted:\n");
    45.         Print(p,i);
    46.         free(p);       
    47. }
    48. int Numinput(int *p,int i)
    49. {
    50.         int j;
    51.         int flag;
    52.         printf("input nums:\n");
    53.         for (j=0;j<i;j++)
    54.         {
    55.                 flag=scanf("%d",p+j);
    56.                 if (!flag)
    57.                 {
    58.                         return(0);
    59.                 }
    60.         }
    61.         return(1);
    62. }
    63. void Print(int *p,int i)
    64. {
    65.         int j;
    66.         for (j=0;j<i;j++)
    67.         {
    68.                 printf("%d ",*(p+j));
    69.         }
    70.         printf("\n");
    71. }
    72. int Sort (int *p,int i,char * method)
    73. {
    74.         switch (*method)
    75.         {
    76.         case 'A':
    77.                 Ascending(p,i);
    78.                 return(1);
    79.         case 'a':
    80.                 Ascending(p,i);
    81.                 return(1);
    82.         case 'D':
    83.                 Descending(p,i);
    84.                 return(1);
    85.         case 'd':
    86.                 Descending(p,i);
    87.                 return(1);
    88.         case 'R':
    89.                 Random(p,i);
    90.                 return(1);
    91.         case 'r':
    92.                 Random(p,i);
    93.                 return(1);
    94.         default:
    95.                 return(0);
    96.         }
    97. }
    98. void Ascending(int *p,int i)
    99. {
    100.         int j,k;
    101.         for (j=0;j<i;j++)
    102.         {
    103.                 for (k=0;k<i-j-1;k++)
    104.                 {
    105.                         if (Big(*(p+k),*(p+k+1)))
    106.                         {
    107.                                 Change(p+k,p+k+1);
    108.                         }                       
    109.                 }
    110.         }
    111. }
    112. void Change(int *a,int *b)
    113. {
    114.         int temp;
    115.         temp=*a;
    116.         *a=*b;
    117.         *b=temp;
    118. }
    119. int Big(int a,int b)
    120. {
    121.         return a>b?1:0;
    122. }
    123. int Small(int a,int b)
    124. {
    125.         return a<b?1:0;
    126. }
    127. void Descending(int *p,int i)
    128. {
    129.         int j,k;
    130.         for (j=0;j<i;j++)
    131.         {
    132.                 for (k=0;k<i-j-1;k++)
    133.                 {
    134.                         if (Small(*(p+k),*(p+k+1)))
    135.                         {
    136.                                 Change(p+k,p+k+1);
    137.                         }                       
    138.                 }
    139.         }
    140. }
    141. void Random(int *p,int i)
    142. {
    143.         int j;
    144.         int *rnd= (int * )malloc(i*sizeof(int));
    145.         Ascending(p,i);
    146.         for (j=0;j<=i/2;j++)
    147.         {               
    148.                 *(rnd+2*j)=*(p+j);
    149.                 *(rnd+2*j+1)=*(p+i-j-1);
    150.         }
    151.         for (j=0;j<i;j++)
    152.         {
    153.                 *(p+j)=*(rnd+j);
    154.         }
    155.         free(rnd);
    156. }
    复制代码
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2024-1-15 22:57
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2011-1-14 22:53:22 | 显示全部楼层
    回复 1# zaas


        图如下:
    Snap1.gif
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2024-1-15 22:57
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2011-1-14 23:03:01 | 显示全部楼层
    switch的优化:
    1. 00401190  /$  8B4424 0C     mov     eax, dword ptr [esp+C]
    2. 00401194  |.  0FBE00        movsx   eax, byte ptr [eax]
    3. 00401197  |.  83C0 BF       add     eax, -41                         ;  Switch (cases 41..72)
    4. 0040119A  |.  83F8 31       cmp     eax, 31
    5. 0040119D  |.  0F87 9F000000 ja      00401242
    6. 004011A3  |.  33C9          xor     ecx, ecx
    7. 004011A5  |.  8A88 64124000 mov     cl, byte ptr [eax+401264]
    8. 004011AB  |.  FF248D 481240>jmp     dword ptr [ecx*4+401248]
    9. 004011B2  |>  8B5424 08     mov     edx, dword ptr [esp+8]           ;  Case 41 ('A') of switch 00401197
    10. 004011B6  |.  8B4424 04     mov     eax, dword ptr [esp+4]
    11. 004011BA  |.  52            push    edx
    12. 004011BB  |.  50            push    eax
    13. 004011BC  |.  E8 DF000000   call    004012A0
    14. 004011C1  |.  83C4 08       add     esp, 8
    15. 004011C4  |.  B8 01000000   mov     eax, 1
    16. 004011C9  |.  C3            retn
    17. 004011CA  |>  8B4C24 08     mov     ecx, dword ptr [esp+8]           ;  Case 61 ('a') of switch 00401197
    18. 004011CE  |.  8B5424 04     mov     edx, dword ptr [esp+4]
    19. 004011D2  |.  51            push    ecx
    20. 004011D3  |.  52            push    edx
    21. 004011D4  |.  E8 C7000000   call    004012A0
    22. 004011D9  |.  83C4 08       add     esp, 8
    23. 004011DC  |.  B8 01000000   mov     eax, 1
    24. 004011E1  |.  C3            retn
    25. 004011E2  |>  8B4424 08     mov     eax, dword ptr [esp+8]           ;  Case 44 ('D') of switch 00401197
    26. 004011E6  |.  8B4C24 04     mov     ecx, dword ptr [esp+4]
    27. 004011EA  |.  50            push    eax
    28. 004011EB  |.  51            push    ecx
    29. 004011EC  |.  E8 4F010000   call    00401340
    30. 004011F1  |.  83C4 08       add     esp, 8
    31. 004011F4  |.  B8 01000000   mov     eax, 1
    32. 004011F9  |.  C3            retn
    33. 004011FA  |>  8B5424 08     mov     edx, dword ptr [esp+8]           ;  Case 64 ('d') of switch 00401197
    34. 004011FE  |.  8B4424 04     mov     eax, dword ptr [esp+4]
    35. 00401202  |.  52            push    edx
    36. 00401203  |.  50            push    eax
    37. 00401204  |.  E8 37010000   call    00401340
    38. 00401209  |.  83C4 08       add     esp, 8
    39. 0040120C  |.  B8 01000000   mov     eax, 1
    40. 00401211  |.  C3            retn
    41. 00401212  |>  8B4C24 08     mov     ecx, dword ptr [esp+8]           ;  Case 52 ('R') of switch 00401197
    42. 00401216  |.  8B5424 04     mov     edx, dword ptr [esp+4]
    43. 0040121A  |.  51            push    ecx
    44. 0040121B  |.  52            push    edx
    45. 0040121C  |.  E8 7F010000   call    004013A0
    46. 00401221  |.  83C4 08       add     esp, 8
    47. 00401224  |.  B8 01000000   mov     eax, 1
    48. 00401229  |.  C3            retn
    49. 0040122A  |>  8B4424 08     mov     eax, dword ptr [esp+8]           ;  Case 72 ('r') of switch 00401197
    50. 0040122E  |.  8B4C24 04     mov     ecx, dword ptr [esp+4]
    51. 00401232  |.  50            push    eax
    52. 00401233  |.  51            push    ecx
    53. 00401234  |.  E8 67010000   call    004013A0
    54. 00401239  |.  83C4 08       add     esp, 8
    55. 0040123C  |.  B8 01000000   mov     eax, 1
    56. 00401241  |.  C3            retn
    57. 00401242  |>  33C0          xor     eax, eax                         ;  Default case of switch 00401197
    58. 00401244  \.  C3            retn
    复制代码
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-3-7 15:25
  • 签到天数: 442 天

    [LV.9]以坛为家II

    发表于 2011-1-15 16:32:17 | 显示全部楼层
    学习了,感觉楼主是对C通了,用的很自如;而自己则是不通,处处碰壁。
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2011-1-15 20:42:02 | 显示全部楼层
    过来看帖,顺便膜拜一下!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表