• 实用编程——高级筛选


        在上学期的办公室工作中,其实很多次都需要用到高级筛选:比如,这里有一份系里同学正确的名字学号等信息,交上去后上面发下来一个总表,要你在几千个人中找出这些同学并核对他们的信息是否有误。往往这个时候我们就需要用到Excel中的高级筛选了,但是我在之前很多尝试中,发现WPS的高级筛选是没法使用的,后来换成Office2013也是如此,所以对工作造成了很大的困扰,每次都要百度很久,想各种办法才能找出所有的数据,如果数据量不大还好,可以通过查找等方式进行一一核对,但是这样始终不好,时间就是金钱,谁他丫花这么多时间去做这种低效率的事啊。

            在有的时候,我们是通过学号找的人,但是学号万一错了就可能丢失了一个人。如果通过名字找,又有可能出现同名的人(高级筛选如果同名会出问题),导致工作量进一步增加。

            之前写了一个勤工俭学核对的程序,能够比较高效得实现数据的核对。这里把它做了修改,可实现两种核对方式,结合使用,目前没发现有问题,以后的工作也会轻松些了。

    /*代码在VC 6.0 cpp程序中编译通过*/
    #include <stdio.h>
    #include <string.h>
    #include <Windows.h>

    void BiduiXuehao();
    void BiduiName();

    int main(void)
    {
        char xuanze[2];
        printf("请在程序正式工作前,将正确数据放入E:\正确数据.txt中,将总表(需要核对的数据)放入E:\核对数据.txt中,格式:名字 学号。准备好后请继续! ");
        system("pause");
        while(1)
        {
            system("cls");
            printf("请输入相应的序号,选择筛选模式: 1、通过名字核对(若名字有错误可能会导致找不到人) 2、通过学号核对(若学号有错误可能会导致找不到人) ");
            printf("请输入选择:");
            while(1)
            {
                scanf("%s",xuanze);
                if(strlen(xuanze) > 1)
                    printf("请重新选择:");
                else
                    break;
            }
            switch(xuanze[0])
            {
            case '1':BiduiName();break;
            case '2':BiduiXuehao();break;
            default:printf("输入错误!");system("cls");break;
            }
        }
        return 0;
    }

    void BiduiName(void)
    {
        int hang = 0,flag = 0;
        FILE *pRight = fopen("E:\正确数据.txt","r");
        char RightName[20],HeduiName[20],RightNum[20],HeduiNum[20];
        system("cls");
        while(fscanf(pRight,"%s%s",RightName,RightNum) != EOF)        //如果正确版本里的人没结束,那就继续
        {
            hang = 0;
            flag = 0;
            FILE *pHedui = fopen("E:\核对数据.txt","r");        //重新打开文件查找
            while(fscanf(pHedui,"%s%s",HeduiName,HeduiNum) != EOF)
            {
                hang++;
                if(strcmp(RightName,HeduiName) == 0)        //如果名字相同,则表示在总表中找到了这个同学,所以比较他们的学号是不是相同的
                {
                    printf("总表中第%d行找到%s.",hang,RightName);
                    if(strcmp(RightNum,HeduiNum) == 0)        //学号正确,则输出信息。
                    {
                        if(flag == 2)
                            printf("找到同名的%s,总表中此行的学号正确 ",RightName);
                        else
                            printf("Ta的学号正确。 ");
                        flag = 1;
                        break;
                    }
                    else
                    {
                        printf("Ta的学号有问题。正确的为:%s.此处为:%s 这里将继续检索是不是有同名的现象。 ",RightNum,HeduiNum);
                        flag = 2;
                        continue;
                    }
                }
            }
            if(flag == 1)        //已经找到正确的了
            {
                continue;
            }
            else if(flag == 2)
                printf("总表中没有找到其他的%s。所以他的学号错误。 ",RightName);
            else        //到文件最后没找到这个同学
            {
                printf("总表中没有找到%s同学,建议通过Ta的学号看一下总表中名字是否有误 ",RightName);
            }
            fclose(pHedui);
        }
        fclose(pRight);
        system("pause");
    }


    void BiduiXuehao(void)
    {
        int flag = 0;
        FILE *pRight = fopen("E:\正确数据.txt","r");
        char RightName[20],HeduiName[20],RightNum[20],HeduiNum[20];
        system("cls");
        while(fscanf(pRight,"%s%s",RightName,RightNum) != EOF)        //如果正确版本里的人没结束,那就继续
        {
            flag = 0;
            FILE *pHedui = fopen("E:\核对数据.txt","r");        //重新打开文件查找
            while(fscanf(pHedui,"%s%s",HeduiName,HeduiNum) != EOF)
            {
                if(strcmp(RightNum,HeduiNum) == 0)        //如果学号相同,则表示在总表中找到了这个同学,所以比较他们的名字是不是相同的
                {
                    if(strcmp(RightName,HeduiName) == 0)        //姓名正确,则输出信息。
                    {
                        printf("%sTa的学号正确。 ",RightName);
                        flag = 1;
                        break;
                    }
                    else
                    {
                        printf("学号为:%s的同学总表中名字有问题。正确的为:%s.总表为:%s",RightNum,RightName,HeduiName);
                        flag = 1;
                    }
                }
            }
            if(flag == 1)        //已经找到了
            {
                continue;
            }
            else        //到文件最后没找到这个同学
            {
                printf("%s同学学号为%s,但是在总表中没有检索到相同学号的人 ",RightName,RightNum);
            }
            
            fclose(pHedui);
        }
        fclose(pRight);
        system("pause");
    }



            这里就不附上截图了,因为试验用的都是同学的信息。有兴趣的可自作尝试。
            

  • 相关阅读:
    [WPF]搜索列表项的四种实现方案点评
    一个生成均匀分布随机数的问题
    制作NSIS命令行窗口输出插件
    公司的Principle给出的高性能数据库设计,总觉得别扭
    用WordPress一步步建立自己的博客站点
    译作要严格尊重原著吗?——读〈Windows核心编程〉小感
    这么好的书怎么全国都缺货?
    【C语言】用c语言实现简单的五子棋
    【C语言】游戏菜单界面设计 与 游戏整合
    【C语言】基于五子棋框架上的 象棋 小游戏
  • 原文地址:https://www.cnblogs.com/YaLi/p/6405778.html
Copyright © 2020-2023  润新知