林江楠 发表于 2021-12-7 20:36:04

购买电动车用户信息管理系统

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

char adminname = "admin1";
char adminpassword = "a123456";

struct Date
{
        int year;
        int month;
        int day;
};

typedef struct Infor
{
        char name;
        char gender;
        int age;
        char address;
        char buytype;
        char color;
        double price;
        struct Date date;
        struct Infor *next;
}INFOR,*Pointer;

INFOR infor;

int login(void);
void Menushow(void);
void Add(Pointer infor);
void Modify(Pointer infor);
void Show(Pointer infor);
void Search(Pointer infor);
void Print(Pointer infor);
void Del(Pointer infor);
//void Sort(Pointer infor);
//void Loadfromfile(Pointer infor);
void Xuigai(char adminname[],char adminpassword[]);

int login(void)
{
        char username;
        char userpassword;
        printf("请输入用户名:");
        gets(username);
        printf("请输入密码:");
        gets(userpassword);
       
        if(!strcmp(adminname,username) && !strcmp(adminpassword,userpassword))
        {
                return 1;
        }
        else
        {
                return 0;
        }
}
void Menushow(void)
{
        int i;
        printf("\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("|----10.退出系统------------------|\n");
        printf("\n");
        printf("请输入你选择的编号:");
        scanf("%d",&i);
        do
        {
                switch(i)
                {
                        case 1:Add(&infor);break;
                        case 2:Modify(&infor);break;
                        case 3:Show(&infor);break;
                        case 4:Search(&infor);break;
                        case 5:Del(&infor);break;
                        //case 6:Sort(&infor);break;
                        //case 7:Loadfromfile(&infor);break;
                        //case 8:Save();break;
                        //case 9:Xuigai(adminname,adminpassword);break;
                        //case 10:Quit();break;
                }
        }while(i < 1 || i > 10);
}
void Add(Pointer infor)
{
        Pointer p;
        static Pointer tail;
        do{
       
        p = (Pointer)malloc(sizeof(INFOR));
       
        if(p == NULL)
        {
                printf("内存分配失败\n");
                exit(1);
        }
        printf("请输入姓名:");
        scanf("%s",p->name );
        printf("请输入性别(男/女):");
        scanf("%s",p->gender );
        printf("请输入年龄:");
        scanf("%d",&p->age);
        printf("请输入地址:");
        scanf("%s",p->address );
        printf("请输入购品牌和型号:");
        scanf("%s",p->buytype );
        printf("请输入购买的颜色:");
        scanf("%s",p->color );
        printf("请输入价格:");
        scanf("%f",&p->price );
        printf("请输入购买时间:(yyyy-mm-dd):");
        scanf("%d-%d-%d",&p->date.year,&p->date.month ,&p->date.day);
       
       
        if(infor != NULL)
        {
                tail->next = p;
                p->next = NULL;
        }
        else
        {
                infor = p;
                p->next = NULL;
        }
        tail = p;
}
        while(p->name != '0');
       
       
}
void Modify(Pointer infor)
{
        Pointer p = infor;
        int flag = 0;
        char sename;
        printf("请输入你要修改的用户名字:");
        gets(sename);
        while(p != NULL)
        {
                if(!strcmp(p->name,sename))
                {
                        flag = 0;
                        break;
               }
               else
               {
                       flag = 1;
                       p = p->next;
               }
       
        }
        if(flag)
        {
                printf("并未查询到该用户的信息T_T\n");
        }
        else
        {
                printf("请输入修改后的信息:\n");
                printf("请输入姓名:");
                scanf("%s",p->name );
                printf("请输入性别(男/女):");
                scanf("%s",p->age );
                printf("请输入年龄:");
                scanf("%d",&p->age);
                printf("请输入地址:");
                scanf("%s",p->address );
                printf("请输入购品牌和型号:");
                scanf("%s",p->buytype );
                printf("请输入购买的颜色:");
                scanf("%s",p->color );
                printf("请输入价格:");
                scanf("%f",p->price );
                printf("请输入购买时间:(yyyy-mm-dd):");
                scanf("%d-%d-%d",&p->date.year,&p->date.month,&p->date.day);
        }
}
void Show(Pointer infor)
{
        Pointer p = infor;
        if(p == NULL)
        {
                printf("暂时还未存入数据!!\n");
                printf("显示失败!!");
        }
        else
        {
                while(p != NULL)
                {
                        printf("姓名:%s",p->name);
                        printf("性别:%s",p->gender );
                        printf("年龄:%d",p->age );
                        printf("地址:%s",p->address );
                        printf("购买品牌型号:%s",p->buytype );
                        printf("颜色:%s",p->color );
                        printf("价格:%.2f",p->price );
                        printf("购买时间:%d-%d-%d",p->date.year ,p->date.month ,p->date.day);
                }
}
}
void Print(Pointer infor)
{
                Pointer p = infor;
                printf("姓名:%s",p->name );
                printf("性别:%s",p->gender );
                printf("年龄:%d",p->age );
                printf("地址:%s",p->address );
                printf("购买品牌型号:%s",p->buytype );
                printf("颜色:%s",p->color );
                printf("价格:%.2f",p->price );
                printf("购买时间:%d-%d-%d",p->date.year ,p->date.month ,p->date.day);
}
void Search(Pointer infor)
{
        Pointer p = infor;
        int flag = 0;
        char sename;
        printf("请输入你要修改的用户名字:");
        scanf("%s",sename);
        while(p != NULL)
        {
                if(!strcmp(p->name,sename))
                {
                        printf("已找到相关信息!!\n");
                        Print(&infor);
               }
               else
               {       
                       p = p->next;
               }
       
        }
        if(flag)
        {
                printf("并未查询到该用户的信息T_T\n");
        }
        else
        {
                char choi;
                printf("是否显示该用户信息(Y/N):");
                scanf("%c",choi);
                if(choi == 'Y')
                {
                        printf("姓名:%s",p->name);
                        printf("性别:%s",p->gender );
                        printf("年龄:%d",p->age );
                        printf("地址:%s",p->address );
                        printf("购买品牌型号:%s",p->buytype );
                        printf("颜色:%s",p->color );
                        printf("价格:%.2f",p->price );
                        printf("购买时间:%d-%d-%d",p->date.year ,p->date.month ,p->date.day);
               }
               else
               {
                       printf("请按任意键继续\n");
                       getchar();
               }
        }
}
void Del(Pointer infor)
{
        Pointer previous,current,new;
       
        current = infor;
        previous = NULL;
       
        char delname;
        printf("请输入你要删除的用户姓名:");
        gets(delname);
       
        while(strcmp(delname,current->name) && current != NULL)
        {
                previous = current;
                current = current->next ;
        }
        if(current == NULL)
        {
                printf("并未找到该用户的信息");
                return ;
        }
        else
        {
                if(previous == NULL)
                {
                        infor = current->next ;
                }
                else
                {
                        previous->next = current->next ;
                }
                printf("删除成功");
                free(current);
        }
}

void Sort(Pointer infor)
{
        ;
}
void Loadfromfile(Pointer infor)
{
        ;
}
void Xuigai(char adminname[],char adminpassword[])
{
        char username;
        char userpassword;
        do{
                printf("请输入用户名:");
                gets(username);
                printf("请输入密码:");
                gets(userpassword);       
                if(!strcmp(adminname,username) && !strcmp(adminpassword,userpassword))
                {
                        do{
                               
                                printf("请输入修改后的用户名:");
                                gets(adminname);
                                printf("请输入密码:");
                                gets(adminpassword);
                                printf("请再次输入密码:");
                                gets(userpassword);
                               
                        }while(strcmp(userpassword,adminpassword));       
                }
        }while(strcmp(adminname,username) || strcmp(adminpassword,userpassword));
        printf("修改完毕");

}


int main(void)
{
        int count = 3;
        while(1)
        {
                if(login())
                {
                        printf("\n欢迎使用电瓶车信息管理系统^_^");
                        printf("\n登陆成功\n");
                       
                        while(1)
                        {
                                Menushow();
                        }
                       
                }
                else
                {
                        count -= 1;
                        printf("用户或密码输入错误\n请重新输入");
                        if (count== 0)
                        {
                                printf("用户名或密码输入错误超过3次\n系统退出\n");
                        }
                        else
                        {
                                printf("你还有%d次机会\n",count);
                        }
                }
        }
       
       
        return 0;
}




快到期末了,做了一个课设,但是第一个函数就出错了,增加信息都不行,哪里出问题了

求解答

jhq999 发表于 2021-12-7 21:12:05

本帖最后由 jhq999 于 2021-12-7 21:13 编辑

你自己试试,我就不运行了,有bug@我
void Add(Pointer infor)
{
      Pointer p;
      static Pointer tail=infor;///////////
       ///// do
      
       while(1)
      {
      
      p = (Pointer)malloc(sizeof(INFOR));
      
      if(p == NULL)
      {
                printf("内存分配失败\n");
                exit(1);
      }
      printf("请输入姓名:");
      scanf("%s",p->name );
      printf("请输入性别(男/女):");
      scanf("%s",p->gender );
      printf("请输入年龄:");
      scanf("%d",&p->age);
      printf("请输入地址:");
      scanf("%s",p->address );
      printf("请输入购品牌和型号:");
      scanf("%s",p->buytype );
      printf("请输入购买的颜色:");
      scanf("%s",p->color );
      printf("请输入价格:");
      scanf("%f",&p->price );
      printf("请输入购买时间:(yyyy-mm-dd):");
      scanf("%d-%d-%d",&p->date.year,&p->date.month ,&p->date.day);
      
      
      if(infor != NULL)
      {
                tail->next = p;
                p->next = NULL;
      }
      else
      {
                infor = p;
                p->next = NULL;
      }
      tail = p;
      printf("是否继续添加(Y/N)?");
      fflush(stdin);
      char isbreak=getchar();
      if(isbreak!='Y'||isbreak!='y')break;
      fflush(stdin);
}
      ////while(p->name != '0');
}

林江楠 发表于 2021-12-7 21:48:51

jhq999 发表于 2021-12-7 21:12
你自己试试,我就不运行了,有bug@我

还是不行输入完就自动结束了
请输入用户名:admin1
请输入密码:a123456

欢迎使用电瓶车信息管理系统^_^
登陆成功

|----1.增加购买电瓶车用户信息-----|
|----2.修改购买电瓶车用户信息-----|
|----3.显示购买电瓶车用户信息-----|
|----4.查询用户信息---------------|
|----5.删除用户信息---------------|
|----6.按购买日期进行排序---------|
|----7.从文件中读取用户信息-------|
|----8.将购买用户信息保存到文件---|
|----9.修改密码-------------------|
|----10.退出系统------------------|

请输入你选择的编号:1
请输入姓名:12
请输入性别(男/女):男
请输入年龄:18
请输入地址:都叫我i的
请输入购品牌和型号:就安慰i都
请输入购买的颜色:白色
请输入价格:3000
请输入购买时间:(yyyy-mm-dd):2021-02-28

--------------------------------
Process exited after 40.31 seconds with return value 3221225477
请按任意键继续. . .

jhq999 发表于 2021-12-8 07:05:34

本帖最后由 jhq999 于 2021-12-8 16:20 编辑

林江楠 发表于 2021-12-7 21:48
还是不行输入完就自动结束了
只改到Add函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char adminname = "admin1";
char adminpassword = "a123456";

struct Date
{
      int year;
      int month;
      int day;
};

typedef struct Infor
{
      char name;
      char gender;
      int age;
      char address;
      char buytype;
      char color;
      double price;
      struct Date date;
      struct Infor *next;
}INFOR,*Pointer;

Pointer infor=NULL;////////////

int login(void);
void Menushow(void);
void Add(Pointer *infor);/////////////////形参改变,实参并不会随之改变,如果infor参数只是指针,在函数里它的值改变了,
                                                    //并不影响代入的实参,所以必须用指针的指针,这样才可以代入的指针类型的实参,
                                                    //如果是c++,就不用这么麻烦,直接用引用声明形参
void Modify(Pointer infor);
void Show(Pointer infor);
void Search(Pointer infor);
void Print(Pointer infor);
void Del(Pointer infor);
//void Sort(Pointer infor);
//void Loadfromfile(Pointer infor);
void Xuigai(char adminname[],char adminpassword[]);

int login(void)
{
      char username;
      char userpassword;
      printf("请输入用户名:");
      gets(username);
      printf("请输入密码:");
      gets(userpassword);
      
      if(!strcmp(adminname,username) && !strcmp(adminpassword,userpassword))
      {
                return 1;
      }
      else
      {
                return 0;
      }
}
void Menushow(void)
{
      int i;
                do
       {
      printf("\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("|----10.退出系统------------------|\n");
      printf("\n");
      printf("请输入你选择的编号:");
      scanf("%d",&i);
      
                switch(i)
                {
                        case 1:Add(&infor);break;
                        case 2:Modify(infor);break;
                        case 3:Show(infor);break;
                        case 4:Search(infor);break;
                        case 5:Del(infor);break;
                        //case 6:Sort(&infor);break;
                        //case 7:Loadfromfile(&infor);break;
                        //case 8:Save();break;
                        //case 9:Xuigai(adminname,adminpassword);break;
                        //case 10:Quit();break;
                }
      }while(i >0 && i < 10);///////////////
}
void Add(Pointer *infor)///////////
{
      Pointer p;
      static Pointer tail=*infor;///////////
       ///// do
      
       while(1)
      {
      
      p = (Pointer)malloc(sizeof(INFOR));
      
      if(p == NULL)
      {
                printf("内存分配失败\n");
                exit(1);
      }
      printf("请输入姓名:");
      scanf("%s",p->name );
      printf("请输入性别(男/女):");
      scanf("%s",p->gender );
      printf("请输入年龄:");
      scanf("%d",&p->age);
      printf("请输入地址:");
      scanf("%s",p->address );
      printf("请输入购品牌和型号:");
      scanf("%s",p->buytype );
      printf("请输入购买的颜色:");
      scanf("%s",p->color );
      printf("请输入价格:");
      scanf("%lf",&p->price );///////////////
      printf("请输入购买时间:(yyyy-mm-dd):");
      scanf("%d-%d-%d",&p->date.year,&p->date.month ,&p->date.day);
      
      
      if(*infor != NULL)
      {
                tail->next = p;
                p->next = NULL;
      }
      else
      {
                *infor = p;
                p->next = NULL;
      }
      
      printf("是否继续添加(Y/N)?");
      fflush(stdin);
      char isbreak=getchar();
      if(isbreak!='Y'&&isbreak!='y')break;////////////
      fflush(stdin);
                tail = p;
}
      ////while(p->name != '0');
}

林江楠 发表于 2021-12-8 15:58:44

jhq999 发表于 2021-12-8 07:05
只改到Add函数

为什莫需要这么改呢,我不理解

jhq999 发表于 2021-12-8 16:21:04

本帖最后由 jhq999 于 2021-12-8 16:29 编辑

林江楠 发表于 2021-12-8 15:58
为什莫需要这么改呢,我不理解

void Add(Pointer *infor);/////////////////形参改变,实参并不会随之改变,如果infor参数只是指针,在函数里它的值改变了,
                                                    //并不影响代入的实参,所以必须用指针的指针,“case 1:Add(&infor);break;”这样才可以改变代入的指针的指针类型的实参“&infor”所指向的infor值,
                                                    //如果是c++,就不用这么麻烦,直接用引用声明形参。


这也是单链表常见的错误
页: [1]
查看完整版本: 购买电动车用户信息管理系统