第二次 第一个小项目(基于链表的增删改查)(仓库货物管理系统)

#define _CRT_SECURE_NO_WARNINGS     //排除部分警告干扰
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#include<conio.h>
#include<string.h>
#include<windows.h>
#include<stdbool.h>
#include<stdint.h>
typedef struct goods //定义一个结构体,即节点
 {
 void *datar; //加了datar
 char name[50], grade, num[15];
 int date;
 float money;
 struct goods * next;
}Goo, *NodePtr, *GoodsInfoPtr;//加了一个 *GoodsInfoPtr
struct info
{
 char account[30];
 char user[100];
 long dsit;
 long pw;
 struct info *xiage;
};
int main();
void regist1();
int judgePW(long ps);
int userInfoSave(char *u, char *p);
int search(char *s, int psw);
int searchAC(char *s);
int readfile();
void login();
void regist();
int menu();
int n = 0;
int textFile(NodePtr goods);
int userCheck(char *s, char *p);//**读取D盘user.txt文件,检测用户是否存在 不存在返回1,存在返回0
int userInfoSave(char *u, char *p);//**写入文件 将注册用户信息添加到D盘user.txt文件
struct info *pt, *header = NULL, *tail, *p0;
typedef bool (COMPTR)(const void*, const void*);
Goo * InitList(Goo * head) //把信息存入首节点
{
 strcpy(head->name, "示例:花盆");
 strcpy(head->num, "xxxxxxxxxxxx");
 head->grade = 'A';
 head->date = 2000;
 head->money = 0.00;
 head->next = NULL;
 return head;
}
void view(Goo* head) /*遍历链表,输出数据*/
{
 Goo * p;
 p = head;
 while (p != NULL)
 {
  printf("%-15s%-15s%3c%9d%9.2f\n", p->name, p->num, p->grade, p->date, p->money);//把d改成了f
  p = p->next;
 }
}
Goo * Search1(Goo* head, char * name) /*通过名称查找货物*/
{
 Goo * p = head;
 while (p && strcmp(p->name, name))
  p = p->next;
 return p;
}
Goo * Search2(Goo* head, char * num) /*通过货号查找货物*/
{
 Goo * p = head;
 while (p && strcmp(p->num, num))
  p = p->next;
 return p;
}
void Delete(Goo* head, char * i) /*删除货物信息*/
{
 Goo * p = head, *m, *q;
 while (p && strcmp(p->num, i) != 0)
 {
  q = p;   //q = p;       //如果不进行指针转换的话,那么删除指令只能删除本来输入到面板上的信息,而不能删除新增的信息
     //p = p;//新加一句              //要是像目前这样改掉呢,则是可以删原有的和新增的,但是不能删第一条
  p = p->next;//p = p->next;
 }
 if ((q != NULL) && (q->next != NULL) && head != NULL)
 {
  m = q->next;
  q->next = m->next;
  free(m);
  printf("Delete success!\n");
  Sleep(1000);
 }
 else
  printf("The goods does not exist!\n");
 Sleep(3000);
}
void AddHead(Goo* head, char name[50], char num[15], char grade, int date, float money) //*增加货物信息,把int改成float之后在显示上出了点问题
{
 Goo * p, *q = head;
 while (q->next != NULL)
 {
  q = q->next;
 }
 p = (Goo*)malloc(sizeof(Goo));
 strcpy(p->name, name);
 strcpy(p->num, num);
 p->grade = grade;
 p->date = date;
 p->money = money;
 p->next = NULL;
 q->next = p;
}
//里函数
int menu()
{
 int i, j, f;
 float g;
 Goo * head, *s;
 char a[50], b[50], t, e[15], h[15], k[15];
 system("cls");
 head = (Goo*)malloc(sizeof(Goo));
 head = InitList(head);
 for (j = 0;; j++)
 {
  printf("-----------------------------------------------------\n");
  printf("NAME              NUMBER      GRADE   DATE     MONEY\n");//把weight改成了money
  view(head);
  printf("-----------------------------------------------------\n");
  printf("******************请好好注意以下选项*****************\n");
  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("*                                                   *\n");
  printf("****************please make a choice:****************\n");
  scanf("%d", &i);
  switch (i)
  {
   case 1:
   {
    printf("please insert the goods' information:");
    printf("\nName :");
    scanf("%s", a);
    printf("Number :");
    scanf("%s", e);
    printf("grade :");
    getchar();
    scanf("%c", &t);
    printf("Date :");
    scanf("%d", &f);
    printf("Money :");
    scanf("%f", &g);
    AddHead(head, a, e, t, f, g);
    system("cls");
    break;
   }
   case 2:
   {
    printf("\nNumber:");
    scanf("%s", h);
    Delete(head, h);
    system("cls");
    break;
   }
   case 3:
   {
    printf("please input the goods' name: ");
    scanf("%s", b);
    s = Search1(head, b);
    system("cls");
    printf("%-15s%-15s%3c%9d%9.2f\n", s->name, s->num, s->grade, s->date, s->money);
    break;
   }
   case 4:
   {
    printf("please input the goods' number: ");
    scanf("%s", k);
    s = Search2(head, k);
    system("cls");
    printf("%-15s%-15s%3c%9d%9.2f\n", s->name, s->num, s->grade, s->date, s->money);
    break;
   }
   case 5:
   {
    printf("please input the the goods' number:");
    scanf("%s", k);
    s = Search2(head, k);
    printf("input grade:");
    getchar();
    scanf("%c", &t);
    s->grade = t;
    printf("input name:");
    getchar();
    gets_s(s->name);//在vs2015中,考虑到安全性,用gets_s代替了gets
    printf("input Date:    ");
    scanf("%d", &f);
    s->date = f;
    printf("input money:");
    scanf("%9f", &g);
    s->money = g;
    view(head->next);
    system("cls");
    break;//后加的break
   }
   case 6:
   {
    textFile(head);
    Sleep(2000);
    printf("写入完成!\n");
    Sleep(2000);
    system("cls");
    break;//后加的break
   }
   case 7:
   {
    system("cls");
    regist1();
    Sleep(2000);
    printf("更改成功,需退出后重新登录");
    Sleep(2000);
    system("cls");
    main();
    break;
   }
   case 8:
   {
    Sleep(1000);
    printf("正在读取文件信息,请稍后......\n");
    Sleep(2000);
    system("cls");
    readfile();
    break;//后加的break
   }
   case 9:
   {
    main();
    break;
   }
  }
 }
}
//主函数(表函数)
int main()
{
 int i;
 int choice = -1;
 while (1)
 {
  printf(" *******欢迎使用仓库货物管理系统*******\n");
  printf("                                         ");
  printf("\n|| ================================||\n");
  printf("||1.登录                           ||\n");
  printf("||2.注册                           ||\n");
  printf("||3.退出                           ||\n");
  printf("|| ================================||\n");
  printf("\t* 请输入您的选择:");
  
  scanf("%d", &choice);
   switch (choice)
   {
   case 1:
    system("cls");
    for (i = 1; i <= 3; i++)   //加个循环限制登陆次数为三次,三次失败则退出程序
    {
     login();
     printf("您还有%d次机会!\n", 3 - i);//加个提示
    }
    exit(0);
    break;
   case 2:
    system("cls");
    regist();
    break;
   case 3:
    exit(0);
    break;
   default:
    printf("输入有误,请重输...\n");
    break;
   }
  }
 }
//登录
void login()
{
 int i;
 int flag;
 char my_act[100];
 char my_pass[100];
 int X = -1;
 printf("\t\t=================****登录****=================\n\n");
 printf("\t\t* 输入账户: ");
 scanf("%s", my_act);
 printf("\n");
 printf("\t\t* 输入密码: ");
 scanf("%s", my_pass);
 //flag = search(my_act, password);
 flag = userCheck(my_act, my_pass);改动
 if (flag == 1)
 {
  printf("\t\t登录成功,正在跳转页面...\n");
  p0 = pt;
  Sleep(2000);
  system("cls");
  while (1)
  {
   X = menu();//成功进入
   if (X == 1)
   {
    system("cls");
    menu();
   }
   else return;
  }
 }
 else if (flag == 0)
 {
  printf("\t\t账号或密码错误,请重新输入...\n");
  Sleep(2000);
  system("cls");
  return;
 }
}
int search(char *s, int psw)
{
 if (header == NULL)
 {
  return 0;
 }
 pt = header;
 while (1)
 {
  if (strcmp(pt->account, s) == 0 && pt->pw == psw)
  {
   return 1;
  }
  if (pt->xiage == NULL)//这里next改成了xiage
   break;
  pt = pt->xiage;//这里next改成了xiage
 }
 return 0;
}
int searchAC(char *s)
{
 if (header == NULL)
 {
  return 0;
 }
 pt = header;
 while (1)
 {
  if (strcmp(pt->account, s) == 0)
  {
   return 1;
  }
  if (pt->xiage == NULL)//这里next改成了xiage
   break;
  pt = pt->xiage;//这里next改成了xiage
 }
 return 0;
}
//注册
void regist()
{
 printf("\t\t=================****注册****=================\n\n");
 struct info *p1;
 char userPas[100] = {
  0
 };
 p1 = (struct info*)malloc(sizeof(struct info));
 p1->xiage = NULL;//这里next改成了xiage
 int flag;
 printf("\t\t请输入您的账户....\n");
 printf("\t\t");
 scanf("%s", p1->account);
 printf("\t\t请输入用户名......\n");
 printf("\t\t");
 scanf("%s", p1->user);
 printf("\t\t输入您的密码......\n");
 printf("\t\t");
 scanf("%ld", &p1->pw);
 sprintf(userPas, "%ld", p1->pw);
 flag = userCheck(p1->account, userPas);
 //flag = search(p1->account, p1->pw);
 if (flag == 1)
 {
  printf("\t\t账户已存在,请重新注册......\n");
  Sleep(2000);
  system("cls");
  return;
 }
 else if (flag == 0)
 {
  userInfoSave(p1->account, userPas);
  printf("\t\t注册成功\n"); //flagN = N;标记当前注册账户是链表中的第几个 p1->dsit = 0;
  if (n == 0)
  {
   header = p1;
   tail = p1;
   n++;
   Sleep(2000);
   system("cls");
   return;
  }
  else
  {
   tail->xiage = p1;//这里next改成了xiage
   tail = p1;
   n++;
   Sleep(2000);
   system("cls"); return;
  }
 }
}
//修改登录信息
void regist1()
{
 printf("\t\t=================****修改信息****=================\n\n");
 struct info *p1;
 char userPas[100] = {
  0
 };
 p1 = (struct info*)malloc(sizeof(struct info));
 p1->xiage = NULL;//这里next改成了xiage
 int flag;
 printf("\t\t请刷新您的账户....\n");
 printf("\t\t");
 scanf("%s", p1->account);
 printf("\t\t请刷新您的用户名......\n");
 printf("\t\t");
 scanf("%s", p1->user);
 printf("\t\t输刷新的密码......\n");
 printf("\t\t");
 scanf("%ld", &p1->pw);
 sprintf(userPas, "%ld", p1->pw);
 flag = userCheck(p1->account, userPas);
 if (flag == 1)
 {
  printf("\t\t账户已存在,请重新注册......\n");
  Sleep(2000);
  system("cls");
  return;
 }
 else if (flag == 0)
 {
  userInfoSave(p1->account, userPas);
  printf("\t\t更改信息成功\n"); //flagN = N;标记当前注册账户是链表中的第几个 p1->dsit = 0;
  if (n == 0)
  {
   header = p1;
   tail = p1;
   n++;
   Sleep(2000);
   system("cls");
   return;
  }
  else
  {
   tail->xiage = p1;//这里next改成了xiage
   tail = p1;
   n++;
   Sleep(2000);
   system("cls"); return;
  }
 }
}
//密码判断
int judgePW(long ps)
{
 int n, k;
 for (k = 0; k<6; k++)
 {
  n = ps % 10;
  ps = ps / 10;
  if ((n < 0 || n > 9) && ((n<int('z') || n>int('a')) && (n<int('Z') || n>int('A'))))      //(n < 0 || n > 9)
  {
   return 2;
  }
 }
 return 1;
}
//文件写入函数
int textFile(NodePtr goods)//把list改成了goods  把void改成了int
{
 FILE *writePtr;
 Goo* curnode = goods;//把list改成了Goo
 writePtr = fopen("d:\\abc.txt", "wb+");//把TXT改成dat拓展名,则为二进制
 fprintf(writePtr, "%-6s%-16s%-11s%10s%20s\r\n",//fprintf->fwrite
  "NAME", "NUMBER", "GRADE", "DATA", "WEIGHT(kg)");
 while (curnode != NULL)
 {
  fprintf(writePtr, "%-6s%-16s%-11c%10d%20f\r\n", curnode->name, curnode->num, curnode->grade, curnode->date, curnode->money);   //修改参数 fprintf->fwrite    
  curnode = curnode->next;
 }
 fclose(writePtr);
 return 0;
}
//文件的读取
int readfile()
{
 FILE *readPtr;
 char ch;
 if ((readPtr = fopen("d:\\abc.txt", "rb")) == NULL)
 {
  printf("Cannot open file strike any key exit!");
  getch();
  exit(1);
 }
 ch = fgetc(readPtr);
 while (ch != EOF)
 {
  putchar(ch);
  ch = fgetc(readPtr);
 }
 fclose(readPtr);
}
//用户检查,如果已存在用户,那么就不用重新注册
int userCheck(char *s, char *p)
{
 char szTest[1000] = { 0 };
 char szTest1[1000] = { 0 };
 int len = 0;
 int num = 0;
 FILE *fp = fopen("D:\\user.txt", "r");
 if (NULL == fp)
 {
  printf("failed to open dos.txt\n");
  return 0;
 }
 while (!feof(fp))
 {
  memset(szTest, 0, sizeof(szTest));
  fgets(szTest, sizeof(szTest) - 2, fp); // 包含了\n 
  int i = strlen(szTest);
  if (szTest[i - 1] == '\n') //因为最后一行没有回车符
  {
   szTest[i - 1] = 0;
  }

  memset(szTest1, 0, sizeof(szTest1));
  fgets(szTest1, sizeof(szTest1) - 2, fp); // 包含了\n 
  i = strlen(szTest1);
  if (szTest1[i - 1] == '\n') //因为最后一行没有回车符
  {
   szTest1[i - 1] = 0;
  }

  //printf("%s%s",szTest,szTest1);
  if (strcmp(szTest, s) == 0 && strcmp(szTest, p) == 0)
  {
   return 1;
  }
  // printf("%s", szTest); 
 }
 fclose(fp);
 return 0;
}
//保存密码
int userInfoSave(char *u, char *p)
{
 FILE *fp = fopen("D:\\user.txt", "a+");
 if (fp == 0) { printf("can't open file\n"); return 0; }
 fseek(fp, 0, SEEK_END);
 fwrite("\n", strlen("\n"), 1, fp);
 fwrite(u, strlen(u), 1, fp);
 printf("%s", u);
 fwrite("\n", strlen("\n"), 1, fp);
 fwrite(p, strlen(p), 1, fp);
 fwrite("\n", strlen("\n"), 1, fp);
 fclose(fp);
 return 1;
}












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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值