回 帖 发 新 帖 刷新版面

主题:[讨论]【求助】C语言数据管理源代码,问题多了,大家帮忙完善下

大家帮我改下源代码,不要和我说什么程序通过,你试着输入些数据就会发现问题了,我试过了说程序可执行,但修改数据模块好像有点问题,另外我想把/*创建链表,完成数据录入功能,新结点在表头插入*/改成从表尾插入,可是自己改老出错,不得已写成表头插入,下面是源代码(还有加密没弄,不会。。。)
1)程序执行时,首先要进行密码检测,以不让非法用户使用本程序。标准密码预先在程序中设定,程序运行时,若用户的输入密码和标准密码相同,则显示“口令正确!”,并转去执行后续程序,若不想等责重新输入,3次不行等则显示“您是非法用户!!”,并终止程序执行。

2)将自己需要保护的数据加密后存入指定文件中。现在每个人在不同网站都有用户名和密码等信息,还有银行卡卡号及密码信息,众多的信息经常忘记,现在我们可通过C编程将其加密后存入指定的文件中。(至少要对密码加密,加密方法不限,简单加密方法如将字符的ASCII值加2)

3)需要保护的数据信息包括编号,账号位置,账号描述,账号名,密码等如:


********************************************************************** 


  编号   账号位置         账号描述             账号名            密码        
     1 http://www.hnust.cn   科大邮箱   daxiang@hnust.edu.cn 123456
     2 http://mail.wo.com.cn 手机邮箱  13187323020@wo.com.cn 654321
     3 http://wwww.pudn.com/ 程序开发网 xiangdesheng         123456

**********************************************************************

        
4)对指定文件中的信息要能进行添加、删除和明文显示等功能

5)具体提供以下功能:
1.开始运行程序是要进行密码验证
2.系统以菜单方式工作
3.带保护数据的录入功能(用文件保存)----输入。要求通过命令行给出文件名,设程序可执行名为jiami.exe,baocunshujude文件起名为my.dat,则要在DOS窗口输入命令jiami my.dat(也可以在VC6中设置程序参数my.dat)。若文件my.dat已经存在,则在该文件中追加数据,如果不存在,则新建。
4.保护数据的明文浏览功能----输出
5.保护数据的查询功能----算法。按账号名查询,如输入“xiang”查询,上表中两条记录均应查询出来
6.保护数据的删除、修改功能----算法
7.数据信息存入文件或激昂文件中的数据信息导入

6)主要应用点:数组、指针、结构体、文件



#include "stdio.h"     
#include "malloc.h"    
#include "stdlib.h"    
#include "string.h"    

#define N 50           

typedef struct stu     
{
    char address[N];     //账号位置
    char score[N];       //账号描述
    char name[N];        //账号名
    char order[N];       //密码
    struct stu *next;
}STUDENT;


/*菜单函数,返回值为整数*/
int menu_select()
{
    char s[3];
    int c;
    printf("\n         ***************主菜单**************\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\n"); 
    do
    { 
        printf("         请选择操作(1-9):"); 
        scanf("%s",s);
        c=atoi(s);
    }while(c<0||c>9);           /*选择项不在0~9之间重输*/
    return(c);         /*返回选择项,主程序根据该数调用相应的函数*/
}


/*创建链表,完成数据录入功能,新结点在表头插入*/
STUDENT *create()
{
     
    
    STUDENT *h=NULL,*info;            /*h:头结点指针;info:新结点指针*/
    for(;;)
    {
        info=(STUDENT *)malloc(sizeof(STUDENT));       /*申请空间*/
        if(!info)                                 /*如果指针info为空*/
        {
             printf("\n内存分配失败");                  
             return NULL;                         /*返回空指针*/
        }
        printf("\n请按如下提示输入相关信息.\n\n");                 
        printf("输入账号位置(输入'#'跳出):");        /*如果输入首字符为#则结束输入*/
        scanf("%s",info->address);
        if(info->address[0]=='#') break;
        printf("输入账号描述:");
        scanf("%s",info->score);
        printf("输入账号名:");
        scanf("%s",info->name);
        printf("输入密码:");
        scanf("%s",info->order);
           
        info->next=h;              
        h=info;            
    }
    return(h);         /*返回头指针*/          
}

回复列表 (共5个回复)

沙发

/*显示模块*/
void print(STUDENT *h)
{
     int i=0;              /* 统计记录条数*/
    STUDENT *p;            /*移动指针*/
    p=h;                  /*初值为头指针*/
    if(p==NULL)
    {
        printf("\n    很遗憾,空表中没有任何记录可供显示!\n");
    }
    else
    {
        printf("******************************* STUDENT ***************************************\n");
        printf("  编号     账号位置           账号描述             账号名            密码             \n");
        printf("--------------------------------------------------------------------------------\n");
        while(p!=NULL)
        {
            i++;
            printf("  %-7ld%-21s %-15s%-24s%s\n",i,p->address,p->score,p->name,p->order);
            p=p->next;
        }
        printf("*******************************************************************************\n\n");
    }
}


/*查找记录模块*/
void search(STUDENT *h)
{
    STUDENT *p;                 /*移动指针*/     
    char s[15];                  /*存放字符数组*/   
    printf("请输入您要查找的账号名:\n");
    scanf("%s",s);                   
    p=h;                            /*将头指针赋给p*/
    while(p!=NULL&&strcmp(p->name,s)!=0)       /*当记录的账号名不是要找的,并且指针不为空时*/
        p=p->next;                  /*移动指针,指向下一结点,继续查找*/
    if(p==NULL)                     /*指针为空,说明未能找到所要的结点*/
        printf("\n您要查找的是%s,很遗憾,查无此账号!\n",s);
    else                             
    {  
        printf("******************************** Found ****************************************\n");
        printf("  账号位置           账号描述             账号名            密码        \n");
        printf("-------------------------------------------------------------------------------\n");
        printf("  %-21s %-15s%-24s%s\n",p->address,p->score,p->name,p->order);
        printf("*******************************************************************************\n");
    }
}


/*修改记录模块*/
STUDENT *check(STUDENT *h)
{
    STUDENT *p=h;               /*将头指针赋给p*/    
    char b[N];                    /*定义要输入字符的数组*/
    printf("请输入你要修改的账号名(输入'#'返回主菜单):");       /*如果输入首字符为#则结束输入*/
    scanf("%s",b);
    if(b[0]=='#') return h;                             /*返回主菜单8?
    while(strcmp(p->name,b)!=0||p->next==NULL)       /*当记录的账号名不是要找的,并且指针不为空时*/
    p=p->next;                                      /*移动指针,指向下一结点,继续查找*/
    if(strcmp(p->name,b)==0)                         /*当记录的账号名是要找的,输入要修改成的数据*/
    {
    printf("输入您要修改成的账号位置:");
    scanf("%s",p->address);
    printf("输入您要修改成的账号描述:");
    scanf("%s",p->score);
    printf("输入您要修改成的账号名:");
    scanf("%s",p->name);
    printf("输入您要修改成的密码:");
    scanf("%s",p->order);
    printf("修改成功!!!");
    }
    if(p->next==NULL)
    {
        printf("查无此账号!!!\n");
    }
    return h;                           /*返回头指针*/
}


/*添加记录模块*/
STUDENT  *insert(STUDENT *h)
{  
    STUDENT *info,*p=h;                /*p指向插入位置,头指针赋给p,info指新插入记录*/   
    int n=0;
    while(p->next!=NULL)
        p=p->next;
    printf("\n请添加新记录!\n");
    info=(STUDENT *)malloc(sizeof(STUDENT)); 
    if(!info)
    {  
        printf("\n内存分配失败!");      
        return NULL;                    /*返回空指针*/  
    } 
  
    printf("输入账号位置:");
    scanf("%s",info->address);
    printf("输入账号描述:");
    scanf("%s",info->score);
    printf("输入账号名:");
    scanf("%s",info->name);
    printf("输入密码:");
    scanf("%s",info->order);
                
    p->next=info ;    

    info->next=NULL;            
                  

    printf("\n ----已经添加 %s 到链表!----\n",info->name);
    return(h);                /*返回头指针*/
}


/*删除记录模块*/
STUDENT *delete1(STUDENT *h)
{
    char k[5];                /*定义字符串数组,用来确认删除信息*/    
    STUDENT *p,*q;            /*p为查找到要删除的结点指针,q为其前驱指针*/    
    char s[N];                    
    printf("请输入要删除数据的账号名(输入'#'返回主菜单):\n");     
    scanf("%s",s);               /*输入要删除记录的账号名*/
    if(s[0]=='#') return h;            /*如果输入首字符为#则结束输入*/
    q=p=h;                          /*给q和p赋初值头指针*/
    while(p!=NULL&&strcmp(p->name,s))       /*当记录的账号名不是要找的,或指针不为空时*/
    {  
        q=p;                    /*将p指针值赋给q作为p的前驱指针*/
        p=p->next;                /*将p指针指向下一条记录*/
    }
    if(p==NULL)                    /*如果p为空,说明链表中没有该结点*/
        printf("\n很遗憾,链表中没有您要删除数据的账号!\n",s);
    else                        
    {
        printf("******************************** Found ****************************************\n");
        printf("  账号位置           账号描述             账号名            密码         \n");
        printf("-------------------------------------------------------------------------------\n");
        printf("    %-21s %-15s%-24s%s\n",p->address,p->score,p->name,p->order);
        printf("*******************************************************************************\n");
        
        do{
            printf("您确实要删除此记录吗?(y/n):");
            scanf("%s",k);
        }while(k[0]!='y'&&k[0]!='n');
        
        if(k[0]!='n')                
        {
            if(p==h)                /*如果p==h,说明被删结点是头结点*/
                h=p->next;            /*修改头指针指向下一条记录*/
            else
                q->next=p->next;    /*不是头指针,将p的后继结点作为q的后继结点*/
            free(p);                /*释放p所指结点空间*/
            printf("\n 已经成功删除账号为%s的记录!\n",s);
        }
    }
    return(h);                        /*返回头指针*/
}


/*保存数据到文件模块*/
void save(STUDENT *h)
{
   FILE *fp;                   /*定义指向文件的指针*/        
   STUDENT *p;                   /*定义移动指针*/                 
   char outfile[20];                /*保存输出文件名*/             
   printf("请输入导出文件名,例如:d:\\xds\\score.txt:\n");
   scanf("%s",outfile);
   if((fp=fopen(outfile,"wb"))==NULL)         /*为输出打开一个二进制文件,如没有则建立*/    
   {
      printf("不能打开文件,文件保存失败!\n");
   }
   else
   {
       p=h;                             /*移动指针从头指针开始*/         
       while(p!=NULL)                       /*如p不为空*/      
       {
          fwrite(p,sizeof(STUDENT),1,fp);      /*写入一条记录*/   
          p=p->next;                             /*指针后移*/
       }
       fclose(fp);                               /*关闭文件*/
       printf("-----所有记录已经成功保存至文件%s中!-----\n",outfile);   /*显示保存成功*/
   }
}

板凳

/*导入信息模块*/
STUDENT *load()
{
   STUDENT *p,*q,*h=NULL;                /*定义记录指针变量*/         
   FILE *fp;                                  /* 定义指向文件的指针*/    
   char infile[20];                               /*保存文件名*/ 
   printf("请输入导入文件名,例如:d:\\xds\\score.txt:\n");
   scanf("%s",infile);                           /*输入文件名*/ 
   if((fp=fopen(infile,"rb"))==NULL)             /*打开一个二进制文件,为读方式*/
   {  
        printf("文件打开失败!\n");              /*如不能打开,返回头指针*/
        return h;
   }
   p=(STUDENT *)malloc(sizeof(STUDENT));          /*申请空间*/
   if(!p)
   {  
        printf("内存分配失败!\n");               /*如没有申请到,则内存溢出*/
        return h;                               /*返回空头指针*/
   }
   h=p;                                           /*申请到空间,将其作为头指针*/
   while(!feof(fp))                               /*循环读数据直到文件尾结束*/
   {
       if(1!=fread(p,sizeof(STUDENT),1,fp))        
            break;                                 /*如果没读到数据,跳出循环*/
        p->next=(STUDENT *)malloc(sizeof(STUDENT)); /*为下一个结点申请空间*/
        if(!p->next)
        {
             printf("内存分配失败!\n");            /*如没有申请到,则内存溢出*/
             return h;
        }
        q=p;                                       /*保存当前结点的指针,作为下一结点的前驱*/
        p=p->next;                                 /*指针后移,新读入数据链到当前表尾*/
    }
    q->next=NULL;                                 /*最后一个结点的后继指针为空*/
    fclose(fp);                                   /*关闭文件*/
    printf("已经成功从文件%s导入数据!!!\n",infile);
    return h;                                     /*返回头指针*/
}


/******主函数开始*******/
void main()
{
    {
char password[10]={"123456"};       /*设定密码*/
char key[40];                       /*定义输入密码的数组*/
int i=0;                            /*记录输入密码次数*/
while(1)
{
    printf("\n请输入密码:");
    gets(key);                       /*输入密码*/
    if(strcmp(key,password)!=0)             /*输入的密码与原设定密码*/
         printf("\n密码错误!\n");      /*对输入的密码错误*/
    else
        break;               /*输入的密码与原设定密码相同,跳出循环*/
   
    i++;                   /*对下一次输入密码记录*/
    if(i==3)
        exit(0);           /*输入密码次数大于3时结束*/
}
printf("\n密码正确!\n");
}
    STUDENT *head = NULL;       /*链表定义头指针*/
    system("color 5e");        /*调DOS命令清屏,可用color ?命令查看命令格式*/
    for(;;)                        /*无限循环*/
    {
        switch(menu_select())   /*调用主菜单函数,返回值整数作开关语句的条件*/
        {
             case 1: head=create();break;        /*创建链表*/
             case 2: print(head);break;          /*显示全部记录*/     
             case 3: search(head);break;        /*查找记录*/
             case 4: head=insert(head);break;    /*插入记录*/
             case 5: head=check(head);break;    /*修改记录*/
             case 6: head=delete1(head);break;   /*删除记录*/
             case 7: save(head);break;           /*保存文件*/
             case 8: head=load();break;         /*读文件*/
             case 9: exit(0);                    /*程序结束*/
             
        }
    }
}
我晕,是不是大家看着这,说这也太长了吧。。
就没人看,无人回答了?
那我就说说大概问题在哪
就是/*创建链表,完成数据录入功能,新结点在表头插入*/ , /*修改记录模块*/  ,/*添加记录模块*/
这3个吧,我的想法帖子上有文字说明
还有个问题就是我事先有保存数据在DAT文件里
可是过两天导入时居然是乱码?!
/*修改记录模块*/(这个模块好像问题是在执行程序时输入记录然后选修改记录时,在输入修改后的数据就程序出错。。还有就是在输入的的数据程序里若果没有记录的话就直接程序出错,我的头都快要爆了。。。)
对于这个题目,由于我是菜鸟,所以改了又改,一个问题解决了又有新问题,都搞营养不良啦,555555.。。。。

3 楼

你的创建链表模块返回的是链表的尾指针吧?

4 楼

另外这一段
 if(strcmp(p->name,b)==0)                         /*当记录的账号名是要找的,输入要修改成的数据*/
    {
    printf("输入您要修改成的账号位置:");
    scanf("%s",p->address);
    printf("输入您要修改成的账号描述:");
    scanf("%s",p->score);
    printf("输入您要修改成的账号名:");
    scanf("%s",p->name);
    printf("输入您要修改成的密码:");
    scanf("%s",p->order);
    printf("修改成功!!!");
    }
你没有考虑过scanf的回车残留问题吗?

5 楼

对太度差没诚意的没兴趣

我来回复

您尚未登录,请登录后再回复。点此登录或注册