| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2968 人关注过本帖
标题:职工信息管理系统中的数据保存问题
只看楼主 加入收藏
a956545765
Rank: 2
来 自:河南
等 级:论坛游民
帖 子:98
专家分:45
注 册:2016-7-27
结帖率:92.31%
收藏
已结贴  问题点数:20 回复次数:8 
职工信息管理系统中的数据保存问题
程序代码:

/*****************************************************************************************
*    职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不重复)。     *
*    试设计一职工信息管理系统,使之能提供以下功能:                                       *
*    1)系统以菜单方式工作                                                                 *
*    2)职工信息录入功能(职工信息用文件保存)--输入                                       *
*    3)职工信息浏览功能--输出                                                           *
*    4)职工信息查询功能--算法                                                           *
*    查询方式:                                                                           *
*        ①按学历查找                                                                     *
*        ②按职工号查找                                                                   *
*    5)职工信息删除、修改功能                                                             *
*                                                                                         *
*                                                                                        *
*                                                                                        *
*****************************************************************************************/

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

#include<malloc.h>
#define LEN sizeof(work)


typedef struct worker
{
    long no;//职工号

    char name[10];
    char sex[1];
    int age;
    char edu[5];//学历

    float  wages;
    char address[30];
    long long number;//电话

    struct worker *next;
}work;

int n;

//函数声明区
work *creat(void);//创建链表

work *input(work *head,work *p1);//输入职工信息

work *insert(work *head,work *workd);//插入职工信息

work *changes(work *head);
work *del(work *head, long num);
void search(work *head);
void save(work *head);//保存职工信息到文件

void print(work *head);//打印出职工信息

void numsearch(work *head,long num);
void namesearch(work *head,char name[]);




//函数编写区
work *creat(void)//新建职工信息

{
    work *head,*p1;
    n=0;
    p1=(work *)malloc(LEN);
    printf("请输入职工信息!\n");
    head=NULL;
    p1=input(head,p1);
    while(p1->no!=0)
    {
        head=insert(head,p1);
        p1=(work *)malloc(LEN);
        p1=input(head,p1);
    }
   

return head;   

}


work *input(work *head,work *p1)//输入职工信息

{
    int i,f,k,j;
    work *p2;
    loop:printf("职工号(输入0返回上一级): ");
    scanf("%ld",&p1->no);

    if(p1->no<0)
    {
        printf("职工号不能为负,请重新输入!\n");
        goto loop;
    }
    else
    {
        if(p1->no==0)
            return (p1);
        else
        {
            p2=head;
            f=0;
            for(i=1;i<=n;i++)
            {
                if(p1->no==p2->no)
                {
                    f=1;
                    break;
                }
                p2=p2->next;
            }
        }
        if(f)
        {
            printf("职工号重复,请重新输入!\n");
            goto loop;   

        }   

    }   

    printf("姓名:");
    scanf("%s",p1->name);
    printf("性别:");
    scanf("%s",&p1->sex);
    printf("年龄:");
    scanf("%d",&p1->age);   

    printf("学历:");
    scanf("%s",p1->edu);
    printf("工资:");
    scanf("%f",&p1->wages);
    printf("家庭住址:");
    scanf("%s",p1->address);
    printf("联系方式:");
    scanf("%lld",&p1->number);
   

return (p1);
}

work *insert(work *head,work *workd)
{
    work *p0,*p1,*p2;
    p1=head;//指向链表头部

    p0=workd;//指向要插入的结点

    if(head==NULL)//如果为空,直接插入到第一个结点

    {
        head=p0;
        p0->next=NULL;
    }
    else
    {
        while((p0->number>p1->number)&&(p1->next!=NULL))
        {
            p2=p1;
            p1=p1->next;
        }
        if(p0->number<=p1->number)
        {
            if(head==p1)//插入的结点在第一个结点之前

                head=p0;
            else//插入的结点在中间

                p2->next=p0;
           

            p0->next=p1;
        }
        else//插入的结点在最后

        {
            p1->next=p0;
            p0->next=NULL;
        }
    }
    n=n+1;;
    return (head);
}

work *changes(work *head)
{
    work *p1;
    int k;
    long num;
    do{
        printf("1.删除  2.插入  0.返回上一级\n");
        printf("请选择:");
        scanf("%d",&k);
        switch(k)
        {
            case 1:if(n==0)
                   {
                        printf("数据库为空,没有职工信息!!\n");
                        break;
                   }
                   else
                       do{
                           printf("请输入要删除的职工的职工号(职工号应为整数,输入0时跳出删除元素):");
                        scanf("%ld",&num);
                        if(num>0)
                            head=del(head,num);
                        if(num<0)
                            printf("职工号不能为负,请重新输入!\n");
                           

                       }while(num!=0);
                    break;
                   

             case 2:printf("请输入学生信息:\n");
                    p1=(work *)malloc(LEN);
                    p1=input(head,p1);
                    while(p1->no!=0)
                    {
                        head=insert(head,p1);
                        printf("请输入学生信息:\n");
                        p1=(work *)malloc(LEN);
                        p1=input(head,p1);   

                    }   

                    break;   

             case 0:
                     break;
                    

            default:printf("输入错误,请重新输入!\n");
        }
    }while(k!=0);
   

return head;

}

work *del(work *head,long num)
{
    work *p1,*p2;
    if(head==NULL)
    {
        printf("数据库为空,没有职工信息!\n");
    }
    else
    {
        p1=head;
        while(p1->no!=num&&p1->next!=NULL)
        {
            p2=p1;
            p1=p1->next;
        }
        if(num==p1->no)
        {
            if(p1==head)
            {
                head=p1->next;
                printf("删除成功!\n");
            }
            else
            {
                p2->next=p1->next;
                printf("删除成功!\n");
            }
            n=n-1;
            free(p1);
           

        }
        else
            printf("没有找到职工号为%d的职工信息!\n",num);   

    }
return head;   

}

void print(work *head)//打印职工信息

{
    int j;
    work *p1;
    if(n==0)
    {
        printf("数据库为空!\n");
        return;

    }
    p1=head;
    if(head!=NULL)
    {
        do{
            printf("职工号:%ld\n",p1->no);
            printf("姓名:%s\n",p1->name);
            printf("性别:%s\n",p1->sex);
            printf("年龄:%d\n",p1->age);
            printf("学历:%s\n",p1->edu);
            printf("薪水:%f\n",p1->wages);
            printf("家庭住址:%s\n",p1->address);
            printf("联系方式:%lld\n",p1->number);       

            p1=p1->next;
           

        }while(p1!=NULL);
    }
       

       

}

void save(work *head)//保存文件时候有问题

{
    FILE *fp;
    work *p1;
    if(n==0)
    {
        printf("没有职工信息!请先建立职工信息!!\n");
        return;
    }
    if((fp=fopen("职工信息.txt","r+"))==NULL)
    {
        printf("不能打开文件!!\n");
        exit(0);
    }
    for(p1=head;p1!=NULL;p1=p1->next)
    {
        fprintf(fp,"职工号:%ld\n姓名:%s\n性别:%s\n年龄:%d\n学历:%s\n薪水:%f\n家庭住址:%s\n联系方式:%lld\n",p1->no,p1->name,p1->sex,p1->age,p1->edu,p1->wages,p1->address,p1->number);   

       

        //职工数据写入文件中

        printf("保存成功!\n");
        fclose(fp);
    }
}

void search(work *head)
{
    int k;
    long num;
    char name[10];
    if(n==0)
    {
        printf("数据库为空,没有职工信息!!\n");
        return;
    }
    else
    {
        do{
            printf("1.按职工号查找  2.按姓名查找  0.返回上一级\n");
            printf("请选择:");
            scanf("%d",&k);
            switch(k)
            {
                case 1:do{
                            printf("职工号(输入0时跳出):");
                            scanf("%ld",&num);
                            if(num>0)
                                numsearch(head,num);
                            if(num<0)
                                printf("输入错误,请重新输入!\n");
                        }while(num!=0);
                    break;
                case 2:do{
                            printf("姓名(输入0时跳出):");
                            scanf("%s",name);
                            namesearch(head,name);
                        }while(strcmp(name,"0")!=0);       

                    break;
                default:printf("输入错误,请重新输入!\n");
            }
            

        }while(k!=0);
    }
   

}

void numsearch(work *head,long num)
{
    work *p1;
    p1=head;
    while(p1!=NULL)
    {
        if(num==p1->no)
        {
            printf("职工号:%ld\n",p1->no);
            printf("姓名:%s\n",p1->name);
            printf("性别:%s\n",p1->sex);
            printf("年龄:%d\n",p1->age);
            printf("学历:%s\n",p1->edu);
            printf("薪水:%f\n",p1->wages);
            printf("家庭住址:%s\n",p1->address);
            printf("联系方式:%lld\n",p1->number);
        return;       

        }
        p1=p1->next;
    }
    printf("没有找到该职工的信息\n");
}

void namesearch(work *head,char name[])
{
    int a=1;
    work *p1;
    p1=head;
    while(p1!=NULL)
    {
        if(strcmp(name,p1->name)==0)
        {
            printf("职工号:%ld\n",p1->no);
            printf("姓名:%s\n",p1->name);
            printf("性别:%s\n",p1->sex);
            printf("年龄:%d\n",p1->age);
            printf("学历:%s\n",p1->edu);
            printf("薪水:%f\n",p1->wages);
            printf("家庭住址:%s\n",p1->address);
            printf("联系方式:%lld\n",p1->number);
            a=0;       

        }
        p1=p1->next;
    }
    if(a)
        printf("没有找到该职工的信息\n");
}

void main()//菜单

{
    int choice;
    work *head;
    head=NULL;
    do{
        printf("*******************************************************************************\n");
        printf("^_^_^_^_^_^_^_^_^_^_^_^_^_^欢迎来到职工信息管理系统!^_^_^_^_^_^_^_^_^_^_^_^_^_^\n");
        printf("                                                                               \n");
        printf("                          职工信息管理系统的基本功能:                         \n");
        printf("                                   1. 新建;                                    \n");
        printf("                                   2. 查找;                                    \n");
        printf("                                   3. 更新;                                    \n");
        printf("                                   4. 显示;                                    \n");
        printf("                                   5. 存盘;                                    \n");
        printf("                                   0. 跳出;                                    \n");
        printf("                                                                               \n");
        printf("                               按键选择,回车确定!                             \n");
        printf("^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^\n");
        printf("*******************************************************************************\n");
       

        printf("请选择:");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1: head=creat();
                    break;
            case 2: search(head);
                    break;
            case 3: head=changes(head);
                    break;
            case 4: print(head);
                    break;       

            case 5: save(head);
                    break;
            case 0: printf("谢谢你的使用!!\n");
                    break;       

        }
    }while(choice!=0);
}


在输入多次数据之后,文件保存的时候就只保存最后一次的输入数据,还有在插入数据的时候,插入多组数据,也只是保存最后一次数据。问问大佬们错在了哪里~~~~~~ 

【不知道怎么回事代码复制上去格式有点乱,希望大佬们不要介意】




[此贴子已经被作者于2017-5-6 11:34编辑过]

搜索更多相关主题的帖子: 管理系统 信息 电话 姓名 学历 
2017-05-06 11:32
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:7 
如此之多的警告,重新改过吧。

ceshi4.c: In function 'input':
ceshi4.c:113:11: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[1]' [-Wformat=]
     scanf("%s",&p1->sex);
           ^
ceshi4.c:124:11: warning: unknown conversion type character 'l' in format [-Wformat=]
     scanf("%lld",&p1->number);
           ^
ceshi4.c:124:11: warning: too many arguments for format [-Wformat-extra-args]
ceshi4.c:73:15: warning: unused variable 'j' [-Wunused-variable]
     int i,f,k,j;
               ^
ceshi4.c:73:13: warning: unused variable 'k' [-Wunused-variable]
     int i,f,k,j;
             ^
ceshi4.c: In function 'del':
ceshi4.c:263:20: warning: format '%d' expects argument of type 'int', but argument 2 has type 'long int' [-Wformat=]
             printf("没有找到职工号为%d的职工信息!\n",num);
                    ^
ceshi4.c: In function 'print':
ceshi4.c:292:20: warning: unknown conversion type character 'l' in format [-Wformat=]
             printf("联系方式:%lld\n",p1->number);
                    ^
ceshi4.c:292:20: warning: too many arguments for format [-Wformat-extra-args]
ceshi4.c:273:9: warning: unused variable 'j' [-Wunused-variable]
     int j;
         ^
ceshi4.c: In function 'save':
ceshi4.c:322:20: warning: unknown conversion type character 'l' in format [-Wformat=]
         fprintf(fp,"职工号:%ld\n姓名:%s\n性别:%s\n年龄:%d\n学历:%s\n薪水:%f\n家庭住址:%s\n联系方式:%lld\n",p1->no,p1->name,p1->sex,p1->age,p1->edu,p1->wages,p1->address,p1->number);
                    ^
ceshi4.c:322:20: warning: too many arguments for format [-Wformat-extra-args]
ceshi4.c: In function 'numsearch':
ceshi4.c:392:20: warning: unknown conversion type character 'l' in format [-Wformat=]
             printf("联系方式:%lld\n",p1->number);
                    ^
ceshi4.c:392:20: warning: too many arguments for format [-Wformat-extra-args]
ceshi4.c: In function 'namesearch':
ceshi4.c:417:20: warning: unknown conversion type character 'l' in format [-Wformat=]
             printf("联系方式:%lld\n",p1->number);
                    ^
ceshi4.c:417:20: warning: too many arguments for format [-Wformat-extra-args]

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-06 11:48
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
吐槽一句,417行的代码,一个文件搞定,也是狠角色。

本来我还以为只是一些警告,看到结构,我瞬间无语了都。
结构成员sex的元素上限竟然是1,就这样,你还敢用%s。
图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2017-5-6 12:07编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-06 11:57
a956545765
Rank: 2
来 自:河南
等 级:论坛游民
帖 子:98
专家分:45
注 册:2016-7-27
收藏
得分:0 
回复 3楼 renkejun1942
抱歉,我C语言学完没多久不懂这些啊

不学好C不换头像!!!!
2017-05-06 19:17
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 4楼 a956545765
把所有警告消除,直到没有警告信息。
然后根据程序的表现,慢慢Debug吧。
debug是编程中非常重要的技能。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-06 19:44
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:7 
以下是引用renkejun1942在2017-5-6 19:44:55的发言:

把所有警告消除,直到没有警告信息。
然后根据程序的表现,慢慢Debug吧。
debug是编程中非常重要的技能。
先消错误
再消警告
然后是得不到预期结果的
最后是内存写错误 程序 “嘎”就挂了

DO IT YOURSELF !
2017-05-07 07:13
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 6楼 wp231957
他的程序没有错误提示,只有警告提示。
因为他的程序的错误,编译器检测不出来,只能肉眼一行一行的看,所以我直接放弃了。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-07 17:32
a956545765
Rank: 2
来 自:河南
等 级:论坛游民
帖 子:98
专家分:45
注 册:2016-7-27
收藏
得分:0 
学校上课用的DEV 编译的没有错误和警告

不学好C不换头像!!!!
2017-05-07 17:49
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 8楼 a956545765
Dev C++ 竟然这么NB,竟然没有警告。呵呵。

那你就对着我发在二楼的警告信息一行一行的改吧。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-07 17:57
快速回复:职工信息管理系统中的数据保存问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023611 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved