C语言实现医疗管理系统

hospital.h文件内容

#ifndef __SLIST_H__
#define __SLIST_H__

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

#define MAGIC "darr"
#define SIZE 32

#define DEBUG(msg) printf("file: %s func: %s line: %d %s", __FILE__, __func__, __LINE__, msg)


//函数指针类型
typedef int(*op_t)(void *data);
typedef int(*cmp_t)(void *data, void *key);
typedef int(*op_file_t)(void *data, FILE *fp);

//节点类型
typedef struct _node_t{
    void *data;     //数据域
    struct _node_t *next;   //后继指针
}node_t;

//头信息结构体
typedef struct _darr_t{
    node_t *p;      //指向链表的第一个节点
    int size;       //数据的大小
    int count;      //链表节点的个数
    op_t my_destroy;//自定义销毁
}darr_t;


//头信息结构体的创建
darr_t *darr_create(int size, op_t my_destroy);
//头插
int darr_prepend(darr_t *s, void *data);
//尾插
int darr_append(darr_t *s, void *data);
//根据索引插入节点
int darr_insert_by_index(darr_t *s, void *data, int index);
//节点个数
int darr_count(darr_t *s);


//通过索引检索值
int darr_retrieve_by_index(darr_t *s, void *data, int index);
//通过关键字检索数据
int darr_retrieve_by_key(darr_t *s, void *data, void *key, cmp_t my_cmp);
//通过关键字查找索引
int darr_find_index_by_key(darr_t *s, void *key, cmp_t my_cmp);
//通过关键字查找所有的索引
darr_t *darr_find_all_index_by_key(darr_t *s, void *key, cmp_t my_cmp);

//通过索引值修改数据
int darr_modify_by_index(darr_t *s, void *data, int index);
//通过关键字修改对应的数据
int darr_modify_by_key(darr_t *s, void *data, void *key, cmp_t my_cmp);
//通过关键字修改所有的数据
int darr_modify_all_by_key(darr_t *s, void *data, void *key, cmp_t my_cmp);

//通过索引删除节点
int darr_delete_by_index(darr_t *s, int index);
//通过关键字删除节点
int darr_delete_by_key(darr_t *s, void *key, cmp_t my_cmp);
//通过关键字删除所有的节点
int darr_delete_all_by_key(darr_t *s, void *key, cmp_t my_cmp);

//保存数据
int darr_store(darr_t *s, char *path, op_file_t op_write);
//加载数据
int darr_load(darr_t *s, char *path, op_file_t op_read);

//链表的反转
int darr_reverse(darr_t *s);

//遍历
int darr_traverse(darr_t *s, op_t my_print);
//销毁
int darr_destroy(darr_t *s);

#endif /*__SLIST_H__*/





hospital.c文件内容


#include "hospital.h"

//头信息结构体的创建
darr_t *darr_create(int size, op_t my_destroy)
{
    darr_t *s = NULL;

    if (size <= 0)
    {
        DEBUG("size <= 0\n");
        goto err0;
    }

    //分配空间
    s = malloc(sizeof(darr_t));
    if (NULL == s)
    {
        DEBUG("malloc failed..\n");
        goto err0;
    }
    memset(s, 0, sizeof(darr_t));


    //初始化
    s->p = NULL;
    s->size = size;
    s->count = 0;
    s->my_destroy = my_destroy;



    return s;
err0:
    return NULL;
}

//分配节点的函数
static node_t *__node_alloc(darr_t *s, void *data)
{
    node_t *new = NULL;

    //容错判断
    if (NULL == s || NULL == data)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }

    //分配节点空间
    new = malloc(sizeof(node_t));
    if (NULL == new)
    {
        DEBUG("malloc failed...\n");
        goto err0;
    }
    memset(new, 0, sizeof(node_t));

    //分配数据域的空间
    new->data = malloc(s->size);
    if (NULL == new->data)
    {
        DEBUG("malloc data failed...\n");
        goto err1;
    }
    memset(new->data, 0, s->size);

    //初始化节点
    memcpy(new->data, data, s->size);
    new->next = NULL;

    s->count ++;

    return new;
err1:
    free(new);
err0:
    return NULL;
}

//头插
int darr_prepend(darr_t *s, void *data)
{
    node_t *new = NULL;

    if (NULL == s || NULL == data)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }
    
    //分配节点空间
    new = __node_alloc(s, data);
    if (NULL == new)
        goto err0;

    //头插
    new->next = s->p;
    s->p = new;

    return 0;
err0:
    return -1;
}

//尾插
int darr_append(darr_t *s, void *data)
{
    node_t *tmp = NULL;
    node_t *new = NULL;

    if (NULL == s || NULL == data)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }
    
    //分配节点空间
    new = __node_alloc(s, data);
    if (NULL == new)
        goto err0;

    if (NULL == s->p)
    {
        s->p = new;
    }
    else
    {
        //tmp指向第一个节点
        tmp = s->p;

        //tmp指向链表的最后一个节点
        while(NULL != tmp->next)
            tmp = tmp->next;

        tmp->next = new;
    }

    return 0;
err0:
    return -1;
}


//根据索引插入节点
int darr_insert_by_index(darr_t *s, void *data, int index)
{
    int i = 0;
    node_t *new = NULL;
    node_t *tmp = NULL;

    if (NULL == s || NULL == data)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }
    
    if (index < 0 || index > s->count)
    {
        DEBUG("The index is out of range\n");
        goto err0;
    }

    //分配节点空间
    new = __node_alloc(s, data);
    if (NULL == new)
        goto err0;

    if (0 == index)
    {
        new->next = s->p;
        s->p = new;
    }
    else
    {
        tmp = s->p;
        //找到要插入的位置的上一个节点
        for (i = 0; i < index - 1; i++)
        {
            tmp = tmp->next;
        }

        new->next = tmp->next;
        tmp->next = new;
    }

    return 0;
err0:
    return -1;
}

//节点个数
int darr_count(darr_t *s)
{
    if (NULL == s)
    {
        DEBUG("s is NULL\n");
        goto err0;
    }

    return s->count;
err0:
    return -1;
}

//通过索引检索值
int darr_retrieve_by_index(darr_t *s, void *data, int index)
{
    int i = -1;
    node_t *tmp = NULL;

    if (NULL == s || NULL == data)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }

    if (index < 0 || index >= s->count)
    {
        DEBUG("The index is out of range\n");
        goto err0;
    }

    //找到对应索引的节点
    tmp = s->p;
    for (i = 0; i < index; i++)
    {
        if (i == s->count)
            goto err0;
        else
        tmp = tmp->next;
    }

    memcpy(data, tmp->data, s->size);

    return 0;
err0:
    return -1;
}

//通过关键字检索数据
int darr_retrieve_by_key(darr_t *s, void *data, void *key, cmp_t my_cmp)
{
    node_t *tmp = NULL;

    if (NULL == s || NULL == data || NULL == key || NULL == my_cmp)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }

    tmp = s->p;
    while(NULL != tmp)
    {
        if (my_cmp(tmp->data, key) == 0)
        {
            memcpy(data, tmp->data, s->size);
            break;
        }

        //tmp指向下一个节点
        tmp = tmp->next;
    }

    return 0;
err0:
    return -1;
}


//通过关键字查找索引
int darr_find_index_by_key(darr_t *s, void *key, cmp_t my_cmp)
{
    int i = -1;
    node_t *tmp = NULL;

    //容错判断
    if (NULL == s || NULL == key || NULL == my_cmp)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }

    tmp = s->p;
    for (i = 0; i < s->count; i++)
    {
        if (my_cmp(tmp->data, key) == 0)
            break;
        
        //指向下一个节点
        tmp = tmp->next;
    }

    //没有找到的情况
    if (i == s->count)
        goto err0;


    return i;
err0:
    return -1;
}


//通过关键字查找所有的索引
darr_t *darr_find_all_index_by_key(darr_t *s, void *key, cmp_t my_cmp)
{
    int i = -1;
    node_t *tmp = NULL;
    darr_t *s1 = NULL;
    
    if (NULL == s || NULL == key || NULL == my_cmp)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }

    s1 = darr_create(sizeof(int), NULL);
    if (NULL == s1)
        goto err0;

    tmp = s->p;
    for (i = 0; i < s->count; i++)
    {
        if (my_cmp(tmp->data, key) == 0)
        {
            darr_append(s1, &i);
        }
    
        tmp = tmp->next;
    }

    return s1;
err0:
    return NULL;
}

//通过索引值修改数据
int darr_modify_by_index(darr_t *s, void *data, int index)
{
    int i = -1;
    node_t *tmp = NULL;

    if (NULL == s || NULL == data)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }

    if (index < 0 || index >= s->count)
    {
        DEBUG("The index is out of range\n");
        goto err0;
    }

    //找到对应索引的节点
    tmp = s->p;
    for (i = 0; i < index; i++)
    {
        tmp = tmp->next;
    }

    memcpy(tmp->data, data, s->size);

    return 0;
err0:
    return -1;
}

//通过关键字修改对应的数据
int darr_modify_by_key(darr_t *s, void *data, void *key, cmp_t my_cmp)
{
    node_t *tmp = NULL;

    if (NULL == s || NULL == data || NULL == key || NULL == my_cmp)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }

    tmp = s->p;
    while(NULL != tmp)
    {
        if (my_cmp(tmp->data, key) == 0)
        {
            memcpy(tmp->data, data, s->size);
            break;
        }

        //tmp指向下一个节点
        tmp = tmp->next;
    }

    return 0;
err0:
    return -1;
}

//通过关键字修改所有的数据
int darr_modify_all_by_key(darr_t *s, void *data, void *key, cmp_t my_cmp)
{

    node_t *tmp = NULL;

    if (NULL == s || NULL == data || NULL == key || NULL == my_cmp)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }

    tmp = s->p;
    while(NULL != tmp)
    {
        if (my_cmp(tmp->data, key) == 0)
        {
            memcpy(tmp->data, data, s->size);
        }

        //tmp指向下一个节点
        tmp = tmp->next;
    }

    return 0;
err0:
    return -1;
}



//通过索引删除节点
int darr_delete_by_index(darr_t *s, int index)
{
    int i = 0;
    node_t *tmp = NULL;
    node_t *save = NULL;

    if (NULL == s)
    {
        DEBUG("s is NULL\n");
        goto err0;
    }

    if (index < 0 || index >= s->count)
    {
        DEBUG("The index is out of range\n");
        goto err0;
    }

    if (0 == index)
    {
        save = s->p;
        s->p = save->next;
    }
    else
    {

        //先找到要删除的节点的上一个节点
        tmp = s->p;     
        for (i = 0; i < index - 1; i++)
            tmp = tmp->next;

        save = tmp->next;
        tmp->next =  save->next;
    }


    if (NULL != s->my_destroy)
        s->my_destroy(save->data);
    free(save->data);
    free(save);

    s->count --;

    
    return 0;
err0:
    return -1;
}

//通过关键字删除节点
int darr_delete_by_key(darr_t *s, void *key, cmp_t my_cmp)
{
    int index = -1;

    if (NULL == s || NULL == key || NULL == my_cmp)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }

    index = darr_find_index_by_key(s, key, my_cmp);

    //通过索引删除节点
    darr_delete_by_index(s, index);

    return 0;
err0:
    return -1;
}


//保存数据
int darr_store(darr_t *s, char *path, op_file_t op_write)
{
    int ret = -1;
    node_t *tmp = NULL;
    FILE *fp = NULL;


    //容错判断
    if (NULL == s || NULL == path || NULL == op_write)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }

    //打开文件
    fp = fopen(path, "w");
    if (NULL == fp)
    {
        DEBUG("fopen failed..\n");
        goto err0;
    }

    //写魔法数字
    ret = fwrite(MAGIC, sizeof(char), strlen(MAGIC), fp);
    if (ret != strlen(MAGIC))
    {
        printf("fwrite failed...\n");
        goto err0;
    }

    //写数据的大小
    ret = fwrite(&s->size, sizeof(int), 1, fp);
    if (ret != 1)
    {
        printf("fwrite size failed..\n");
        goto err1;
    }

    //写节点的个数
    ret = fwrite(&s->count, sizeof(int), 1, fp);
    if (ret != 1)
    {
        printf("fwrite count failed..\n");
        goto err1;
    }

    tmp = s->p;
    while(tmp != NULL)
    {
        //将节点中的数据保存到文件中
        op_write(tmp->data, fp);   
    
        tmp = tmp->next;
    }

    fclose(fp);

    return 0;
err1:
    fclose(fp);
err0:
    return -1;
}

//加载数据
int darr_load(darr_t *s, char *path, op_file_t op_read)
{
    int ret = -1;
    int size;
    int count;
    int i;

    char buf[SIZE];
    FILE *fp = NULL;
    void *data = NULL;

    if (NULL == s || NULL == path || NULL == op_read)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }

    //以只读的方式打开一个文件
    fp = fopen(path, "r");    
    if (NULL == fp)
    {
        DEBUG("fopen file failed..\n");
        goto err0;
    }

    memset(buf, 0, SIZE);
    //读魔法数字
    ret = fread(buf, sizeof(char), strlen(MAGIC), fp);
    if (ret != strlen(MAGIC))
    {
        DEBUG("fread failed...\n");
        goto err1;
    }
    
    if (strcmp(buf, MAGIC) != 0)
    {
        DEBUG("file is not matched\n");
        goto err1;
    }

    //读取size
    ret = fread(&size, sizeof(int), 1, fp);
    if (ret != 1)
    {
        DEBUG("fread size failed...\n");
        goto err1;
    }
    
    //读取count
    ret = fread(&count, sizeof(int), 1, fp);
    if (ret != 1)
    {
        DEBUG("fread count failed..\n");
        goto err1;
    }

    data = malloc(size);
    if (NULL == data)
    {
        DEBUG("malloc data failed..\n");
        goto err1;
    }

    //读取数据
    for (i = 0; i < count; i++)
    {
        memset(data, 0, size);         
        op_read(data, fp);

        //尾插
        darr_append(s, data);
    }

    free(data);
    fclose(fp);

    return 0;
err1:
    fclose(fp);
err0:
    return -1;
}

//链表的反转
int darr_reverse(darr_t *s)
{
    node_t *tmp = NULL;
    node_t *save = NULL;

    if (NULL == s)
    {
        DEBUG("s is NULL\n");
        goto err0;
    }

    tmp = s->p;
    s->p = NULL;
    while(NULL != tmp)
    {
        //保存下一个节点
        save = tmp->next;

        //头插
        tmp->next = s->p;
        s->p = tmp;
    
        tmp = save;
    }

    return 0;
err0:
    return -1;
}


//通过关键字删除所有的节点
int darr_delete_all_by_key(darr_t *s, void *key, cmp_t my_cmp)
{
    int i = -1;
    node_t *tmp = NULL;
    node_t *save = NULL;
    
    if (NULL == s || NULL == key || NULL == my_cmp)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }

    tmp = s->p;
    for (i = 0; i < s->count; i++)
    {
        save = tmp->next;
        if (my_cmp(tmp->data, key) == 0)
        {
            darr_delete_by_index(s, i);
            i--;
        }

        tmp = save;
    }

    return 0;
err0:
    return -1;
}


//遍历
int darr_traverse(darr_t *s, op_t my_print)
{
    node_t *tmp = NULL;

    if (NULL == s || NULL == my_print)
    {
        DEBUG("some elements are NULL\n");
        goto err0;
    }

    //指向第一个节点
    tmp = s->p;

    while(NULL != tmp)
    {
        my_print(tmp->data);

        //指向下一个节点
        tmp = tmp->next;
    }

    return 0;
err0:
    return -1;
}

//销毁
int darr_destroy(darr_t *s)
{
    node_t *tmp = NULL;
    node_t *save = NULL;

    if (NULL == s)
    {
        DEBUG("s is NULL\n");
        goto err0;
    }

    //指向链表的第一个节点
    tmp = s->p;
    while(NULL != tmp)
    {
        //保存下一个节点
        save = tmp->next;
        
        if (NULL != s->my_destroy)
            s->my_destroy(tmp->data);
        
        free(tmp->data);
        free(tmp);
        
        //tmp指向下一个节点
        tmp = save;
    }
    
    free(s);


    return 0;
err0:
    return -1;
}

main.c内容



#include "hospital.h"


#define my_scanf(op, format, ...) do{       \
    int ret = 0;                            \
    ret = scanf(format, __VA_ARGS__);       \
    while(getchar() != '\n')                \
    /*do nothing*/;                 \
    if (ret <= 0)                           \
    op;                                 \
}while(0)

#define my_gets(buf, size)  do{             \
    memset(buf, 0, size);                   \
    fgets(buf, size, stdin);                \
    if (buf[strlen(buf) - 1] == '\n')       \
    buf[strlen(buf) - 1] = '\0';        \
    else                                    \
    while(getchar() != '\n')            \
    /*do nothing*/;                 \
}while(0)


//病人结构体信息
typedef struct _people{
    int id;
    char name[100];
    char sex[100];
    int age;
    char cases[200];
    char drug[20];
    int cost;
}people;


//自定义输出函数
int my_print(void *data)
{
    people *s = data;

    printf("病人编号:%d\n病人姓名:%s\n病人性别:%s\n病人年龄:%d\n病人病例:%s\n使用药物:%s\n病人花费:%d\n\n", s->id, s->name, s->sex, s->age, s->cases, s->drug, s->cost);

    return 0;
}

//比较函数
int my_cmp_id(void *data, void *key)
{
    return ((people*)data)->id  - *(int *)key;
}

int my_cmp_name(void *data, void *key)
{
    return strcmp(((people*)data)->name, (char *)key);
}

int op_write(void *data, FILE *fp)
{
    int ret = -1;

    //写数据
    ret = fwrite(data, sizeof(people), 1, fp);
    if (ret != 1)
    {
        printf("fwrite data failed...\n");
        goto err0;
    }

    return 0;
err0:
    return -1;
}

int op_read(void *data, FILE *fp)
{
    int ret = -1;

    //写数据
    ret = fread(data, sizeof(people), 1, fp);
    if (ret != 1)
    {
        printf("fwrite data failed...\n");
        goto err0;
    }

    return 0;
err0:
    return -1;
}

int main(void)
{
    int start = 0;
    int start1 = 0;
    int return0 = 0;
    system("clear");
    read(&start1);
start3:
    if(start == start1)
    {
        goto start2;
    }
    else
    {
        printf("温馨提示:密码错误3次系统将自毁\n");
        printf("请输入密码[0-9]:");
        scanf("%d",&start);
        if(start == start1)
        {
            goto start2;
        }
        return0++;
        if(return0 == 3)
        {
            return 0;
        }
        goto start3;
    }
start2:
    return0 = 0;
    int l = 1;
    int c = 1;
    int sx = 1;
    int drug1 = 1;
    int id;
    int cost1;
    int x = 1;
    char name[100];
    int age;
    int n;
    int index;
    int rev = 0;
    people s;
    darr_t *d = NULL;
    darr_t *d1 = NULL;
    d = darr_create(sizeof(people),  NULL);
    if (NULL == d)
    {
        goto err0;
    }

lang:
    system("clear");
    printf("==================================\n");
    if(l == 0)
    {
        printf("无效输入请重新选择            \n");
    }
    printf("欢迎来到医院管理系统请进行语言选择\n");
    printf("1.中文                            \n");
    printf("2.Eenglish                        \n");
    printf("请进行语言选择:                    ");
    my_scanf(, "%d", &l);
    while(1)
    {
retry:
        if(l == 1)
        {
            cshow();
        }
        else if(l == 2)
        {
            eshow();
        }
        else
        {
            l = 0;
            goto lang;
        }
        printf("请选择功能:");
        my_scanf(goto retry, "%d", &n);
        int cost = 0;

        if (9 == n)
            break;
        switch(n)
        {
            case 0:
                printf("请设置新的密码[0-9]:");
                scanf("%d",&start1);
                write(start1);

                goto start3;
revise:
            case 1:
                memset(&s, 0, sizeof s);
                system("clear");

                printf("    请输入要添加的病人的病号:   ");
                my_scanf(, "%d", &id);

                system("clear");
                printf("请输入要添加的病人的名字:      ");
                my_scanf(, "%s", &name);
                sprintf(s.name, "%s", name);

sex1:
                system("clear");
                if (sx == 0)
                {
                    system("clear");
                    printf("    无效输入请重新选择    \n");
                }
                printf("   请输入要添加的病人的性别   \n");
                printf("============1.先生============\n");
                printf("============2.女士============\n");
                printf("病人的性别为:                  ");
                my_scanf(, "%d", &sx);
                switch(sx)
                {
                    case 1:
                        sprintf(s.sex, "%s", "男士");
                        break;
                    case 2:
                        sprintf(s.sex, "%s", "女士");
                        break;
                    default:
                        sx = 0;
                        goto sex1;
                }

                system("clear");
                printf("请输入要添加的病人的年龄:      ");
                my_scanf(, "%d", &age);

cases:
                system("clear");
                if (c == 0)
                {
                    system("clear");
                    printf("无效输入请重新选择        \n");
                }
                printf("    请输入要添加的病人的病例: \n");
                printf("===========1.大病=============\n");
                printf("===========2.中病=============\n");
                printf("===========3.小病=============\n");
                printf("===========4.没病=============\n");
                printf("病人的病例为:                  ");
                my_scanf(, "%d", &c);
                switch(c)
                {
                    case 1:
                        sprintf(s.cases, "%s", "大病");
                        break;
                    case 2:
                        sprintf(s.cases, "%s", "中病");
                        break;
                    case 3:
                        sprintf(s.cases, "%s", "小病");
                        break;
                    case 4:
                        sprintf(s.cases, "%s", "没病");
                        break;
                    default:
                        c = 0;
                        goto cases;
                }

                while(1)
                {
drug2:
                    system("clear");
                    if (drug1 == -2)
                    {
                        system("clear");
                        printf("无效输入请重新选择        \n");
                    }
                    printf("  请输入病人所需要的药品-1退出      \n");
                    printf("=========1.一全大补丸=======$100====\n");
                    printf("=========2.二全大补丸=======$200====\n");
                    printf("=========3.三全大补丸=======$300====\n");
                    printf("=========4.四全大补丸=======$400====\n");
                    printf("=========5.五全大补丸=======$500====\n");
                    printf("=========6.六全大补丸=======$600====\n");
                    printf("=========7.七全大补丸=======$700====\n");
                    printf("=========8.八全大补丸=======$800====\n");
                    printf("=========9.九全大补丸=======$900====\n");
                    printf("=========0.十全大补丸=======$1000===\n");
                    printf("选择的药品为:                    ");
                    my_scanf(, "%d", &drug1);
                    if (drug1 == -1)
                        break;
                    switch(drug1)
                    {
                        case 0:
                            sprintf(s.drug, "%s", "十全大补丸");
                            cost += 1000;
                            break;
                        case 1:
                            sprintf(s.drug, "%s", "一全大补丸");
                            cost += 100;
                            break;
                        case 2:
                            sprintf(s.drug, "%s", "二全大补丸");
                            cost += 200;
                            break;
                        case 3:
                            sprintf(s.drug, "%s", "三全大补丸");
                            cost += 300;
                            break;
                        case 4:
                            sprintf(s.drug, "%s", "四全大补丸");
                            cost += 400;
                            break;
                        case 5:
                            sprintf(s.drug, "%s", "五全大补丸");
                            cost += 500;
                            break;
                        case 6:
                            sprintf(s.drug, "%s", "六全大补丸");
                            cost += 600;
                            break;
                        case 7:
                            sprintf(s.drug, "%s", "七全大补丸");
                            cost += 700;
                            break;
                        case 8:
                            sprintf(s.drug, "%s", "八全大补丸");
                            cost += 800;
                            break;
                        case 9:
                            sprintf(s.drug, "%s", "九全大补丸");
                            cost += 900;
                            break;
                        default:
                            drug1 = -2;
                            goto drug2;
                    }
                }

                s.id = id;
                s.age = age;
                s.cost = cost;
                darr_append(d, &s);
                while(1)
                {
                    if(cost1 == -1)
                        break;
                    system("clear");
                    printf("您本次共消费%d元人民币\n", cost);
                    printf("按-1键退出                    ");
                    my_scanf(, "%d", &cost1);
                }
                if ( rev == 1)
                {
                    rev = 0;
                    goto ok;
                }
                cost1 = 1;
break;

            case 2:
                while(1)
                {
retry1:
                    printf("请输入所要查询病人的id [-1 quit]: ");
                    my_scanf(goto retry1, "%d", &id);

                    //退出
                    if (-1 == id)
                        break;
                    //通过关键字查找索引
                    index = darr_find_index_by_key(d, &id, my_cmp_id);
                    //通过索引值检索数据
                    memset(&s, 0, sizeof s);
                    darr_retrieve_by_index(d, &s, index);
                    system("clear");
                    //输出
                    my_print(&s);
                }
                break;
            case 3:
                while(1)
                {
                    system("clear");
                    printf("请输入要修改病人的id [-1 quit]: ");
                    my_scanf(, "%d", &id);
                    rev = 1;
                    if ( id == -1)
                        break;
                    memset(&s, 0, sizeof s);
                    darr_delete_by_key(d, &id, my_cmp_id);
                    goto revise;
                }
ok:
                break;
            case 4:
                while(1)
                {
                    memset(&s, 0, sizeof s);
                    system("clear");
                    printf("请输入要删除病人的id[-1 quit]: ");
                    my_scanf(, "%d", &id);

                    //退出
                    if (-1 == id)
                        break;

                    //通过id删除病人信息
                    darr_delete_by_key(d, &id, my_cmp_id);
                }
                break;

            case 5:
                while(1)
                {
                    if(x == -1)
                        break;
                    system("clear");
                    darr_traverse(d, my_print);
                    printf("输入-1键退出");
                    my_scanf(, "%d", &x);
                }
                x = 1;
                break;

            case 6:
                {
                    int i = 0;
                    int count = 0;
                    while(1)
                    {
                        //清屏和定位光标
                        printf("\033[2J\033[5;0H");
                        printf("载入病人信息中...\n");
                        printf("[");
                        for (i = 0; i < count; i +=5)
                        {
                            printf("=");
                        }
                        printf(">");

                        //定位光标
                        printf("\033[%d;%dH", 6, 22);
                        printf("] \033[31m%d%%\033[0m\n\n", count);

                        //循环结束的条件
                        if (100 == count)
                            break;
                        count += 5;

                        //睡眠0.4秒钟
                        usleep(400000);
                    }

                    system("clear");
                    printf("载入病人信息成功3s后进入管理系统..\n");
                    usleep(1000000);
                    system("clear");
                    printf("载入病人信息成功2s后进入管理系统..\n");
                    usleep(1000000);
                    system("clear");
                    printf("载入病人信息成功1s后进入管理系统..\n");
                    usleep(1000000);
                }
                darr_load(d, "stu.db", op_read);
                break;

            case 7:
                {
                    int i = 0;
                    int count = 0;
                    while(1)
                    {
                        //清屏和定位光标
                        printf("\033[2J\033[5;0H");
                        printf("保存病人信息中...\n");
                        printf("[");
                        for (i = 0; i < count; i +=5)
                        {
                            printf("=");
                        }
                        printf(">");

                        //定位光标
                        printf("\033[%d;%dH", 6, 22);
                        printf("] \033[31m%d%%\033[0m\n\n", count);

                        //循环结束的条件
                        if (100 == count)
                            break;
                        count += 5;
                        usleep(400000);
                    }
                    system("clear");
                    printf("保存病人信息成功3s后进入管理系统..\n");
                    usleep(1000000);
                    system("clear");
                    printf("保存病人信息成功2s后进入管理系统..\n");
                    usleep(1000000);
                    system("clear");
                    printf("保存病人信息成功1s后进入管理系统..\n");
                    usleep(1000000);
                }
                darr_store(d, "stu.db", op_write);
                break;

            case 8:
                goto lang;
        }
    }

    return 0;
err0:
    return 1;
}


int cshow(void)
{
    system("clear");
    printf("                               \n");
    printf("============================== \n");
    printf("||         医院管理系统      ||\n");
    printf("|| 0.设置密码                ||\n");
    printf("|| 1.注册病人信息            ||\n");
    printf("|| 2.查询病人信息            ||\n");
    printf("|| 3.修改病人信息            ||\n");
    printf("|| 4.删除病人信息            ||\n");
    printf("|| 5.列出所有病人信息        ||\n");
    printf("|| 6.载入所有病人信息        ||\n");
    printf("|| 7.保存所有病人信息        ||\n");
    printf("|| 8.语言选择                ||\n");
    printf("|| 9.退出系统                ||\n");
    printf("============================== \n");
    printf("                               \n");
}

int eshow(void)
{
    system("clear");
    printf("                                  \n");
    printf("==================================\n");
    printf("||   hospital management system ||\n");
    printf("|| 0.set up                     ||\n");
    printf("|| 1.register                   ||\n");
    printf("|| 2.inquiry                    ||\n");
    printf("|| 3.modify patient information ||\n");
    printf("|| 4.delete patient information ||\n");
    printf("|| 5.list                       ||\n");
    printf("|| 6.load                       ||\n");
    printf("|| 7.save                       ||\n");
    printf("|| 8.language                   ||\n");
    printf("|| 9.exit                       ||\n");
    printf("==================================\n");
    printf("                                  \n");
}

int write(int i)
{

    int ret = -1;
    FILE *fp = NULL;

    //以写的方式打开一个文件
    fp = fopen("password", "w");
    if (NULL == fp)
    {
        printf("fopen failed...\n");
        goto err0;
    }

    ret = fwrite(&i, sizeof(int), 1, fp);
    if (ret <= 0)
    {
        printf("fwrite failed...\n");
    }

    //关闭文件
    fclose(fp);

    return 0;
err0:
    return -1;
}

int read(int *i)
{

    int ret;
    FILE *fp = NULL;
    //以只读的方式打开一个文件
    fp = fopen("password", "r");
    if (NULL == fp)
    {
        printf("fopen failed..\n");
        goto err0;
    }

    ret = fread(i, sizeof(int), 1, fp);
    if (ret <= 0)
    {
        printf("fread failed...\n");
    }
    //关闭文件
    fclose(fp);
    return 0;
err0:
    return -1;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值