飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2250|回复: 1

[C/C++] [原]键盘输入5个用户的数据,包括:姓名和电话号码要求按姓名排序

[复制链接]
  • TA的每日心情
    开心
    2022-11-16 14:28
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2009-7-29 21:10:27 | 显示全部楼层 |阅读模式
    //3.        从键盘输入5个用户的数据,包括:姓名和电话号码
    //     要求按姓名排序后,输出用户的全部数据。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #define MAX 5

    typedef struct Person
    {
        char szName[20] ;
        char szNumber[20] ;
    }person ;

    int compare(const void * elem1, const void * elem2)
    {
        return strcmp(((person *)elem1)->szName, ((person *)elem2)->szName) ;
    }

    int main(void)
    {
        int i ;
        person p[MAX] ;
       
        for (i = 0; i < MAX; ++i)
        {
            scanf("%20s%20s", &p[i].szName, &p[i].szNumber) ;
        }
       
        qsort(&p, MAX, sizeof(person), compare) ;
       
       
        for (i = 0; i < MAX; ++i)
        {
            printf("%22s%22s\r\n", p[i].szName, p[i].szNumber) ;
        }
       
        return 0 ;
    }
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-7-29 22:19:52 | 显示全部楼层
    很像the c++ programming language上的例题。
    1. #include <string.h>
    2. #include <iostream>

    3. using namespace std;

    4. typedef int (*CFT)(const void*, const void*);

    5. struct User
    6. {
    7.         char* name;
    8.         char* id;
    9.         int dept;
    10. };

    11. /*
    12.         字符串比较
    13. */
    14. int str_cmp(const void* p, const void* q)
    15. {
    16.         return strcmp(static_cast<const User*>(p)->name,static_cast<const User*>(q)->name);
    17. }

    18. /*
    19.         数值比较
    20. */
    21. int int_cmp(const void* p, const void* q)
    22. {
    23.         return static_cast<const User*>(p)->dept - static_cast<const User*>(q)->dept;
    24. }


    25. /*
    26.         对向量base的n个元素按照递增顺序排序,
    27.         用由"cmp"所指定的函数做比较,
    28.         元素大小是"sz".
    29. */
    30. void ssort(void* base, size_t n, size_t sz, CFT cmp)
    31. {
    32.         for(int gap = n/2; 0 < gap; gap /= 2)
    33.                 for (int i = gap; i < n; i++)
    34.                         for (int j = i-gap; 0 <= j; j -= gap)
    35.                         {
    36.                                 char* b = static_cast<char*>(base);
    37.                                 char* pj = b + j*sz; //&base[j]
    38.                                 char* pjg = b + (j + gap) * sz; //&base[j+gap]

    39.                                 if (cmp(pjg,pj) < 0)
    40.                                 {
    41.                                         for (int k = 0; k < sz; k++)
    42.                                         {//swap  base[j],base[j+gap]
    43.                                                 char temp = pj[k];
    44.                                                 pj[k] = pjg[k];
    45.                                                 pjg[k] = temp;
    46.                                         }
    47.                                 }
    48.                         }

    49. }

    50. /*
    51.         输出函数
    52.         v 是结构体User数组首地址,
    53.         n 是数组元素个数
    54. */
    55. void print_id(User* v, int n)
    56. {
    57.         for (int i = 0; i < n; i++)
    58.                 cout << v[i].name << '\t' << v[i].id << '\t' << v[i].dept << '\n';
    59. }

    60. User heads[] =
    61. {
    62.         "kevin", "t1", 1,
    63.         "Neo",         "t3", 3,
    64.         "Eric",         "t2", 2
    65. };

    66. int main(int argc, char* argv[])
    67. {
    68.         cout << "Heads in alphabetical order:\n";
    69.         ssort(heads,3,sizeof(User),str_cmp);
    70.         print_id(heads, 3);
    71.         cout << '\n';

    72.         cout << "Heads in order of department number:\n";
    73.         ssort(heads, 3, sizeof(User), int_cmp);
    74.         print_id(heads,3);
    75.         return 0;
    76. }
    复制代码
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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