#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义结构体
typedef struct object {
int num;//编号
char name[50];
float onesize;//规格
char danwei[5];//计量单位
float price;//单价(元)
int sum;//数量
char guishu[20];//归集产品
struct object * next;
} ob; //用ob代替结构体名object
typedef struct churu {
int num;//编号
char name[50];
float onesize;//规格
char danwei[5];//计量单位
float price;//单价(元)
int cnt;//出入库数量
char guishu[20];//归集产品
struct churu * next;
} cr;
ob * head;//定义头指针
ob * cheat;
cr * head2;
cr * cheat2;
//声明函数
void yiji(ob* head);
ob * creat();
void printNum(ob* head);
void zuijia (ob* head);
void cut(ob *head);
void correct(ob *head);
void menu2(ob* head);
void menu3();
void ruku(cr * head2,cr * cheat2);
void chuku(cr * head2,cr * cheat2);
void menu4();
void rukuTJ(cr * head2,cr * cheat2);
void menu5();
void page() { //页面开始2
system("color 3E");
printf("\t\t\t\t\t**********************************\n");
printf("\t\t\t\t\t*****欢迎进入库存管理信息系统*****\n");
printf("\t\t\t\t\t**********************************\n");
printf("\n");
printf("\t\t\t\t\t\t按enter键继续\n");
}
void menu() { //目录
printf("\t\t\t\t\t\t********一级界面********\n");
printf("\t\t\t\t\t|________________________________________|\n");
printf("\t\t\t\t\t| 1. 创建文件信息\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 2. 基本信息管理\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 3. 原料出入库管理\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 4. 原材料领用统计\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 5. 出入库单查询\n");
printf("\t\t\t\t\t|________________________________________|");
printf("\n");
printf("\n\t\t\t\t\t请选择你要进行的操作(1--5):\n");
}
void pages() { //页面开始1
system("color 2E");
printf("\t\t\t\t\t**********************************\n");
printf("\t\t\t\t\t*****欢迎进入库存管理信息系统*****\n");
printf("\t\t\t\t\t**********************************\n");
printf("\n");
printf("\t\t\t\t\t如果是管理员请按:1,如果不是请按:2!\n");
}
int logon(){//登录功能
int i;
scanf("%d",&i);
if(i==1){
printf("\t\t\t\t\t*********欢迎进入登录页面*********\n");
printf("\t\t\t\t\t*********请输入登录密码***********\n");
while(1){
char ch[100],sh[10]={"200424"};
scanf("%s",ch);
if(strcmp(ch,sh)==0){
printf("\t\t\t\t\t*********登录成功*****************\n");
printf("\t\t\t\t\t*********按enter键继续************\n");
break;
}else
printf("\t\t\t\t\t*********密码错误,请重新输入******\n");
}
}else{
printf("\t\t\t\t\t你无法访问该系统,系统将自动退出!\n");
return 0;
}
return 1;
}
//主函数
int main(){
FILE * z;
int m,number;
char n;
pages();
int d=logon();
getchar();
while(1){
if(d){
page();//调用页面函数
char a[10];
gets(a);//按enter下一步
while(1) {
yiji(head);
break;
}
return 0;
}else
continue;
}
return 0;
}
void yiji(ob* head){
char n;
system("cls");//清屏
menu();//调用目录函数
AGAIN1:
scanf("%c",&n);
char a[10];
gets(a);
switch(n) {
case '1'://创建文件信息
head=creat();
printf("请再次选择您的操作:\n");
goto AGAIN1;
break;
case '2'://基本信息管理
system("cls");
menu2(head);
break;
case '3'://原料出入库管理
system("cls");
menu3();
break;
case '4'://原材料领用统计
system("cls");
menu4();
break;
case '5'://出入库单查询
system("cls");
menu5();
break;
default:
printf("选择功能错误!\n");
printf("请再次选择你的操作!\n");
goto AGAIN1;
}
}
ob * creat() { //1.创建信息功能,返回一个头指针
ob *p=NULL;//初始化指针
ob *po=head=(ob*)malloc(sizeof(ob));//开辟一个新单元,并赋给它内存初始地址
int n;
int ret;
//内置一个死循环,多次调用函数
while(1) {
p=(ob*)malloc(sizeof(ob));//开辟动态存储区,把起始地址赋给p
cheat2:
printf("请输入货物的编号、名称、规格、计量单位、单价、数量、归集产品:\n");
printf("编号:");
scanf("%d",&p->num);
//相邻两个比较重复
char b[10];
gets(b);
for(cheat=head;cheat;cheat=cheat->next){
if(cheat->num==p->num){
printf("此编号已存在,请勿重新输入\n");
goto cheat2;
}
}
if(p->num<0) {
printf("输入编号格式有误\n");
break;
}
printf("名称:");
scanf("%s",&p->name);
printf("规格:");
scanf("%f",&p->onesize);
printf("计量单位:");
scanf("%s",&p->danwei);
printf("价格:");
ret=scanf("%f",&p->price);
//读取到一个整型,ret=1,跳过循环。否则ret=0 非整型数据放到缓存区
while(ret!=1)
{
while(getchar()!='\n');//== fflush(stdin) 清空缓存区非法字符
printf("输入价格格式错误,请重新输入\n");
ret=scanf("%f",&p->price);
if(getchar()=='\n')
{
break;
}
}
if(p->price<0)
{
printf("输入价格错误\n");
break;
}
printf("数量:");
scanf("%d",&p->sum);
if(p->sum<0) {
printf("输入数量格式有误\n");
break;
}
printf("归集产品:");
scanf("%s",&p->guishu);
printf("\n");
po->next=p;
po=p;//实现让po指向p的空间
printf("===============================================\n");
printf("是否退出创建货物信息 退出: 输入1 继续: 输入2\n");
scanf("%d",&n);
char a[10];
gets(a);
if(n==1) {
po->next=NULL;//不再创建信息,成为尾结点
p=NULL;
return (head);
}
printf("\n");
if(n>2) {
printf("输入错误!\n");
system("pause");//暂停
break;
}
}
po->next=NULL;
free(p);
p=NULL;//让p重新指向空
return (head);
}
void printNum(ob* head){//二级目录(1) 显示原材料编码
ob* p;
if (head==NULL)
printf("尚未录入货物信息,请退出录入");
else{
printf("原料编码:\n");
for(p=head->next;p;p=p->next){
printf("%d\n",p->num);}
}
}
void zuijia (ob* head){//二级目录(2) 追加输入
ob *last=head;//p 头指针
ob *p1=(ob*)malloc(sizeof(ob));//开辟空间,给p1内存首地址
printf("请输入要添加的货物信息:\n");
cheat1:
printf("编号:");
scanf("%d",&p1->num);
char a[10];
gets(a);
for(cheat=head->next;cheat;cheat=cheat->next){
if(cheat->num==p1->num){
printf("此编号已存在,请勿重新输入\n");
goto cheat1;
}
}
printf("名称:");
scanf("%s",&p1->name);
printf("规格:");
scanf("%f",&p1->onesize);
printf("计量单位:");
scanf("%s",&p1->danwei);
printf("单价:");
scanf("%f",&p1->price);
printf("数量:");
scanf("%d",&p1->sum);
printf("归集产品:");
scanf("%s",&p1->guishu);
if(last){
while(last->next){
last=last->next;
}
last->next=p1;
}else{
head->next=p1;
}
p1->next=NULL;//p1为尾结点,添加完成
printf("添加成功!\n");
}
void cut(ob *head) {//二级目录(3) 删除
ob *p,*q;
p=head;
int numberplusplus;
if(p->next!=NULL) {
printf("按货物编号删除:\n");
printf("请输入货物编号:\n");
scanf("%d",&numberplusplus);
if(head==NULL) {
printf("为空链表\n");
return;
}
while(p->num!=numberplusplus&&p->next!=NULL) {
q=p;//q后驱
p=p->next;//p前驱
}
if(p->num==numberplusplus) {//如果编号对应的话
if(p==head) {//如果找到的是头结点
head=p->next;//头指针后移
} else {//如果不是头结点
q->next=p->next;//越过p结点
}
free(p);
printf("删除成功\n");
} else {
printf("没有此货物:\n");
}
} else
printf("未创建货物信息,无法删除\n");
}
void correct(ob *head) {//二级目录(4) 修改
ob *p=NULL;
ob *w=head;
char nameplus[50];//定义新变量名,存放修改的数据
int numberplus;
float priceplus;
int countplus;
int v;//下面用到的修改方式
int numm;
p=head->next;//p从第一个结点开始往后移
while(head!=NULL) {
if(p==NULL) {
printf("未创建货物信息,无法修改\n");
break;
}
printf("按照编号查找\n");
printf("请输入要查找的编号:\n");
scanf("%d",&numm);
if(p->num==numm) {
printf("已找到信息\n");
printf("请进行修改\n");
printf("编号:");
scanf("%d",&p->num);
printf("名称");
scanf("%s",&p->name);
printf("规格:");
scanf("%f",&p->onesize);
printf("计量单位:");
scanf("%s",&p->danwei);
printf("单价:");
scanf("%f",&p->price);
printf("数量");
scanf("%d",&p->sum);
printf("归集产品:");
scanf("%s",p->guishu);
// printf("用料单位:");
// scanf("%s",&p->user);
printf("修改完成");
break;
} else {
printf("未查找到该货物\n");
break;
}
}
printf("\n");
}
void menu2(ob* head) { //二级目录
printf("\t\t\t\t\t\t********二级界面********\n");
printf("\t\t\t\t\t|________________________________________|\n");
printf("\t\t\t\t\t| 1. 显示原材料编码\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 2. 原材料输入追加\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 3. 删除原材料\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 4. 修改原材料记录\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 5. 返回一级界面\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\n");
printf("\n\t\t\t\t\t请选择你要进行的操作(1--4):\n");
while(1) {
char n;
AGAIN2:
scanf("%c",&n);
char a[10];
gets(a);
switch(n) {
case '1'://显示原材料编码
printNum(head);
break;
case '2'://原材料输入追加
zuijia (head);
break;
case '3'://删除原材料
cut(head);
break;
case '4'://修改原材料记录
correct(head);
break;
case '5'://返回一级界面
yiji(head);
break;
default:
printf("选择功能错误!\n");
printf("请再次选择你的操作!\n");
goto AGAIN2;
}
printf("请问是否需要退出(退出请按1(每返回一次一级界面需多按一次退出),继续操作请按任意键)\n");
scanf("%c",&n);
gets(a);
if(n=='1'){
break;
}else{
printf("请再次选择你的操作!\n");
goto AGAIN2;
}
}
}
void menu3() { //二级目录
printf("\t\t\t\t\t\t********二级界面********\n");
printf("\t\t\t\t\t|________________________________________|\n");
printf("\t\t\t\t\t| 1. 原材料入库\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 2. 原材料出库\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 3. 返回一级界面\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\n");
printf("\n\t\t\t\t\t请选择你要进行的操作(1--2):\n");
while(1) {
char n;
AGAIN3:
scanf("%c",&n);
char a[10];
gets(a);
switch(n) {
case '1'://原材料入库
ruku(head2,cheat2);
break;
case '2'://原材料出库
chuku(head2,cheat2);
break;
case '3'://返回一级界面
yiji(head);
break;
default:
printf("选择功能错误!\n");
printf("请再次选择你的操作!\n");
goto AGAIN3;
}
printf("请问是否需要退出(退出请按1(每返回一次一级界面需多按一次退出),继续操作请按任意键)\n");
scanf("%c",&n);
gets(a);
if(n=='1'){
break;
}else{
printf("请再次选择你的操作!\n");
goto AGAIN3;
}
}
}
void ruku(cr * head2,cr * cheat2){
int h;
char c[10];
ruku1:
printf("请输入要进行入库操作的编号:\n");
scanf("%d",&h);
gets(c);
for(cheat=head->next;cheat;cheat=cheat->next){
if(cheat->num==h){
printf("编号:%d 名称:%s 规格:%.1f%s 单价:%.2f 数量:%d 归集产品:%s\n",cheat->num,cheat->name,cheat->onesize,cheat->danwei,cheat->price,cheat->sum,cheat->guishu);
printf("请输入本次入库数量:\n");
scanf("%d",&h);
gets(c);
cheat->sum+=h;
cr * p1;
//将一个结构体赋给另一种结构体
p1->num=cheat->num;
strncpy(p1->name,cheat->name,50);
p1->onesize=cheat->onesize;
strncpy(p1->danwei,cheat->danwei,5);
p1->price=cheat->price;
p1->cnt=h;
cheat2=head2;
if(cheat2){
while(cheat2->next){
cheat2=cheat2->next;
}
cheat2->next=p1;
}else{
head2=p1;
}
}else{
printf("此编号不存在,请重新输入");
goto ruku1;
}
}
}
void chuku(cr * head2,cr * cheat2){
printf("请输入要进行出库操作的编号:\n");
int h;
char c[10];
scanf("%d",&h);
gets(c);
for(cheat=head->next;cheat;cheat=cheat->next){
if(cheat->num==h){
printf("编号:%d 名称:%s 规格:%.1f%s 单价:%.2f 数量:%d 归集产品:%s\n",cheat->num,cheat->name,cheat->onesize,cheat->danwei,cheat->price,cheat->sum,cheat->guishu);
printf("请输入本次出库数量(负数):");
printf("\n数量:");
scanf("%d",&h);
gets(c);
cheat->sum+=h;
cr * p1;
//将一个结构体赋给另一种结构体
p1->num=cheat->num;
strncpy(p1->name,cheat->name,50);
p1->onesize=cheat->onesize;
strncpy(p1->danwei,cheat->danwei,5);
p1->price=cheat->price;
p1->cnt=h;
cheat2=head2;
if(cheat2){
while(cheat2->next){
cheat2=cheat2->next;
}
cheat2->next=p1;
}else{
head2=p1;
}
}
}
}
void menu4() { //二级目录
printf("\t\t\t\t\t\t********二级界面********\n");
printf("\t\t\t\t\t|________________________________________|\n");
printf("\t\t\t\t\t| 1. 入库统计及报表\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 2. 出库统计及报表\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 3. 年度统计及报表\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 4. 返回一级界面\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\n");
printf("\n\t\t\t\t\t请选择你要进行的操作(1--3):\n");
while(1) {
char n;
AGAIN4:
scanf("%c",&n);
char a[10];
gets(a);
switch(n) {
case '1'://入库统计及报表
rukuTJ(head2,cheat2);
break;
case '2'://出库统计及报表
break;
case '3'://年度统计及报表
break;
case '4'://返回一级界面
yiji(head);
break;
default:
printf("选择功能错误!\n");
printf("请再次选择你的操作!\n");
goto AGAIN4;
}
printf("请问是否需要退出(退出请按1(每返回一次一级界面需多按一次退出),继续操作请按任意键)\n");
scanf("%c",&n);
gets(a);
if(n=='1'){
break;
}else{
printf("请再次选择你的操作!\n");
goto AGAIN4;
}
}
}
void rukuTJ(cr * head2,cr * cheat2){
for(cheat2=head2;cheat2;cheat2=cheat2->next){printf("1456");
if(cheat2->cnt>0){
printf("编号:%d 名称:%s 规格:%.1f%s 单价:%.2f 总入库数量:%d 归集产品:%s\n",cheat2->num,cheat2->name,cheat2->onesize,cheat2->danwei,cheat2->price,cheat2->cnt,cheat2->guishu);
printf("1111111111111111");
}else{
printf("暂无入库记录");
}
printf("22222222222222222");
}
}
void chukuTJ(cr * head2,cr * cheat2){
}
void menu5() { //二级目录
printf("\t\t\t\t\t\t********二级界面********\n");
printf("\t\t\t\t\t|________________________________________|\n");
printf("\t\t\t\t\t| 1. 入库单查询\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 2. 出库单查询\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 3. 原材料库存查询\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\t\t\t\t\t| 4. 返回一级界面\n");
printf("\t\t\t\t\t|----------------------------------------|\n");
printf("\n");
printf("\n\t\t\t\t\t请选择你要进行的操作(1--3):\n");
while(1) {
char n;
AGAIN5:
scanf("%c",&n);
char a[10];
gets(a);
switch(n) {
case '1'://入库单查询
break;
case '2'://出库单查询
break;
case '3'://原材料库存查询
break;
case '4'://返回一级界面
yiji(head);
break;
default:
printf("选择功能错误!\n");
printf("请再次选择你的操作!\n");
goto AGAIN5;
}
printf("请问是否需要退出(退出请按1(每返回一次一级界面需多按一次退出),继续操作请按任意键)\n");
scanf("%c",&n);
gets(a);
if(n=='1'){
break;
}else{
printf("请再次选择你的操作!\n");
goto AGAIN5;
}
}
}