记账系统

#include <stdio.h>
#include <stdlib.h>
#define N 10

typedef struct{
    int id;
    int expend;
    int income;
}User;

int OutputMenu(void);
//函数功能:打印菜单  函数返回:用户选择菜单
void InputUsers(User users[],int* number);
//函数功能:输入用户数据 函数参数:记录用户数据的结构体,记录用户个数的指针
int compare(const void *a,const void *b);
//函数功能:qsort排序所需的比较指针
int AscendingCompare(int a,int b);
int DescendingCompare(int a,int b);
//函数功能:比较两个整数的大小 函数返回:两个整数的差值
void SelectionSort(User users[],int number,int (*compare)(int a,int b));
//函数功能:选择排序  函数参数:所需排序结构数组,用户数目,比较函数
void BubbleSort(User users[],int number,int (*compare)(int a,int b));
//函数功能:选择排序  函数参数:所需排序结构数组,用户数目,比较函数
int Search(User users[],int number,int goalID);
//函数功能:折半通过用户id查找并打印某用户数据 函数参数:要查找的数组,用户数目,要找的id  函数返回:返回找到的所在下标,未找到返回-1.
void OutPutEarn(User users[],int number);
//函数功能:输出支出大于收入的用户  函数参数:用户数据所在结构数组,用户数目
void OutPutAll(User users[],int number);
//函数功能:输出所有用户  函数参数:用户数据所在结构数组,用户数目

int main()
{
    printf("*********************************************************************************\n\n");
    printf("*********************************************************************************\n\n");
    printf("**************************   Welcome to bookkeeping !  **************************\n\n");
    printf("*********************************************************************************\n\n");
    printf("*********************************************************************************\n\n");
    printf("Please input number to goto the function.\n\n");
    int number=0;
    int choice=0;
    do{
        choice=OutputMenu();                    //记录操作人员输入的选择
        User users[N];                                 //记录用户数据
        switch(choice){
        case 1:
            InputUsers(users,&number);
            break;
        case 2:
            SelectionSort(users,number,DescendingCompare);
            break;
        case 3:
            SelectionSort(users,number,AscendingCompare);
            break;
        case 4:
            BubbleSort(users,number,AscendingCompare);
            break;
        case 5:
            printf("Please input the target ID:");
            int goalID;
            scanf("%05d",&goalID);
            fflush(stdin);
            int i=Search(users,number,goalID);              //记录查找到的下标,未找到返回-1
            if(i!=-1){
                printf("ID\tIncome\tExpend\n");
                printf("%d\t%d\t%d\n\n",users[i].id,users[i].income,users[i].expend);
            }else {
                printf("No finding!\n\n");
            }
            break;
        case 6:
            OutPutEarn(users,number);
            break;
        case 7:
            OutPutAll(users,number);
            break;
        defult:
            break;
        }
    }while(choice);
    return 0;
}

int OutputMenu(void){
    printf("1.Input record\
\n2.Selection Sort in descending order by expenses\
\n3.Selection Sort in ascending order by expenses\
\n4.Bubble Sort in ascending order by income\
\n5.Search records by ID using Binary Search\
\n6.List records which have more expenses than income\
\n7.List all records\
\n0.Exit\
        \nPlease enter your choice:");
    int choice;
    while(1){
        int c=scanf("%d",&choice);
        if(c!=1||choice<0||choice>7){                       //检测输入是否非法
            printf("\nInvalid input!Please input all again.\n");
            printf("Please enter your choice:");
            fflush(stdin);
        }
        else {
            break;
        }
    }

    return choice;
}

void InputUsers(User users[],int *number){
    printf("\nPlease input the user's score.Input three\"-1\" to end the inputing.\n");
    printf("ID\tIncome\tExpend\n");
    for(int i = 0;i < N;i++){
        while(1){
            int c=scanf("%05d,%d,%d",&users[i].id,&users[i].income,&users[i].expend);//检测输入是否非法
            if(c!=3||users[i].id>=100000||users[i].id<10000){
                if(users[i].id==-1){
                    break;
                }
                printf("\nInvalid input!Please input again.\n");
                fflush(stdin);
            }
            if(c==3){
                break;
            }
        }

        if(users[i].id==-1){
            *number=i;
            break;
        }
    }
}

int DescendingCompare(int a,int b){
    return a-b;
}
int AscendingCompare(int a,int b){
    return b-a;
}
void SelectionSort(User users[],int number,int (*compare)(int a,int b)){
    for(int i=0;i<number-1;i++){
        int index=i;
        for(int j=i+1;j<number;j++){
            if(compare(users[j].expend,users[index].expend)>0){
                index=j;
            }
        }
        if(index!=i){
            User temp=users[i];
            users[i]=users[index];
            users[index]=temp;
        }
    }
}

void BubbleSort(User users[],int number,int (*compare)(int a,int b)){
    for(int i = number-1;i >=0;i--){
        for(int j = 1;j < number;j++){
            if(compare(users[j-1].income,users[j].income)<0){
                User temp=users[j-1];
                users[j-1]=users[j];
                users[j]=temp;
            }
        }
    }
}

int compare(const void *a,const void *b){
    User *pa=(User* )a;
    User *pb=(User* )b;
    int m=pa->id;
    int n=pb->id;
    return m-n;
}

int Search(User users[],int number,int goalID){
    qsort(users,number,sizeof(users[0]),compare);
    int low=0,high=number-1;
    int mid=(low+high)/2;
    int Isfind=0;
    while(low<=high&&!Isfind){
        if(users[mid].id<goalID){
            low=mid+1;
            mid=(low+high)/2;
        }
        else if(users[mid].id>goalID){
            high=mid-1;
            mid=(low+high)/2;
        }
        else {
            Isfind=1;
        }
    }
    if(Isfind){
        return mid;
    }
    else {
        return -1;
    }
}

void OutPutEarn(User users[],int number){
    printf("\nThe followings are users whose expending larger than incoming:\n\n");
    printf("ID\tIncome\tExpend\n");
    for(int i=0;i<number;i++){
            if(users[i].expend>users[i].income){
                printf("%d\t%d\t%d\n",users[i].id,users[i].income,users[i].expend);
            }
    }
}

void OutPutAll(User users[],int number){
    printf("\nThe followings are all users in the data base:\n\n");
    printf("ID\tIncome\tExpend\n");
    for(int i=0;i<number;i++){
        printf("%d\t%d\t%d\n",users[i].id,users[i].income,users[i].expend);
    }
}

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值