目录

1.总体设计

2.功能实现

(1).创建功能

(2).保存部分

(3).查找部分

(4).修改部分

(5).删除部分

(6).排序

(7).主函数部分


1.总体设计

题目:仓库货物管理系统

功能:每个货物的信息作为一条记录,包括货物名称,货物编号,货物价格与货物数量。

要实现以下功能:

1.创建信息(录入编号,名称,价格,数量)。

2.删除信息

3.修改信息。

4.输出信息。

5.添存信息(自动保存)。

6.增加信息(逐个添加)。

7.查找信息:按照编号或名称方式。

要求:1、用C语言实现程序设计;
2、利用结构体数组、链表等实现信息输出、查询等;
3、系统的各个功能模块要求用函数的形式实现;
4、界面合理,程序要有注释。
5、程序中所用到的排序查找方法采用冒泡排序。

2.功能实现

主页面

void page() {
	system("color 3E");
	printf("\t\t\t\t\t**********************************\n");
	printf("\t\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|________________________________________|\n");
	printf("\t\t\t\t\t|________________基本信息________________|\n");
	printf("\t\t\t\t\t|   1. 创建货物信息| 2. 保存货物信息|\n");
	printf("\t\t\t\t\t|----------------------------------------|\n");
	printf("\t\t\t\t\t|   3. 查找货物信息| 4. 修改货物信息|\n");
	printf("\t\t\t\t\t|----------------------------------------|\n");
	printf("\t\t\t\t\t|   5. 删除货物信息| 6. 输出货物信息|\n");
	printf("\t\t\t\t\t|----------------------------------------|\n");
	printf("\t\t\t\t\t|   7. 添存信息    | 8. 排序|\n");
	printf("\t\t\t\t\t|----------------------------------------|\n");
	printf("\t\t\t\t\t    9. 增加信息    | 0. 退出程序\n");
	printf("\t\t\t\t\t|________________________________________|");
	printf("\n");
	printf("\n\t\t\t\t\t请输入你的操作代号(0--8):\n");
}

(1).创建功能

a1 * creat() { //1.创建信息功能,返回一个头指针
	a1 *po=NULL;
	a1 *p=NULL;//初始化指针
	po=head=(a1*)malloc(sizeof(a1));//开辟一个新单元,并赋给它内存初始地址
	int n;
	int ret;
	//内置一个死循环,多次调用函数
	while(1) {
		p=(a1*)malloc(sizeof(a1));//开辟动态存储区,把起始地址赋给p
		printf("请输入货物的编号、名称、价格、数量:\n");
		printf("编号:");
		scanf("%d",&p->number);
		//相邻两个比较重复
		if(p->number==po->number) {
			printf("输入货物编号重复\n");
			break;
		}
		if(p->number<0) {
			printf("输入编号格式有误\n");
			break;
		}
		printf("名称:");
		scanf("%s",&p->name);
		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->count);
			if(p->count<0) {
				printf("输入数量格式有误\n");
				break;
			}
		printf("\n");
		po->next=p;
		po=p;//实现让po指向p的空间
		printf("===============================================\n");
		printf("是否退出创建货物信息 退出: 输入1 继续: 输入2\n");
		scanf("%d",&n);
		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);
}

(2).保存部分

void baocun(a1 *head) { //
	int m;//标记
	m=0;
	a1 *p=NULL;
	FILE *z;//文件指针
	p=head->next;//p 第一结点 
	if(p==NULL) {
		printf("未创建货物信息,无法保存\n");
	} else if(p!=NULL) {
		p=head->next;//p从第一个结点开始
		if((z=fopen("货物信息.txt","w"))==NULL) { //创建货物信息文件, 只写
			printf("无法打开此货物文件\n");
			exit(0);//若空,终止
		}
		while(p!=NULL) {
			fprintf(z,"编号:%d\t",p->number);//格式化输出  以文件为对象 
			fprintf(z,"名称:%s\t",p->name);
			fprintf(z,"价格:%f\t",p->price);
			fprintf(z,"数量:%d\n",p->count);
			p=p->next;//p后移
			m++;//标记作用
		}
		printf("保存成功! 共保存%d个货物信息\n",m);
		fclose(z);//关闭文件;
	}
}

(3).查找部分

void search(a1 *head) {
	a1 *p=NULL;
	char name0[100];
	p=head->next;
	int n;
	int x;
	if(p!=NULL) {
		printf("\t\t\t请选择查找方式\n");//查找方式
		printf("\t\t\t1.通过货物编号查找  2.通过货物名称查找\n");
		printf("========================================\n");
		printf("请输入查找方式:1或2\n");
		scanf("%d",&n);
		switch(n) {
			case 1:
				printf("请输入查找的货物编号:\n");
				scanf("%d",&x);
				while(p!=NULL) {
					if(x==p->number) {
						printf("要查找的货物的信息为:\n");
						printf("编号: %d\n",p->number);
						printf("名称: %s\n",p->name);
						printf("价格: %f\n",p->price);
						printf("数量: %d\n",p->count);
						printf("查找成功\n");
						break;//防止无限查找
					}
					printf("\n");
					p=p->next;
				}
				break;//case1的break
			case 2:
				printf("请输入要查找的货物名称:\n");
				scanf("%s",&name0);
				while(p!=NULL) {
					if(strcmp(name0,p->name)==0) {
						printf("要查找的货物信息为:\n");
						printf("编号: %d\n",p->number);
						printf("名称: %s\n",p->name);
						printf("价格: %f\n",p->price);
						printf("数量: %d\n",p->count);
						printf("查找成功!\n");
						break;
					}
					printf("\n");
					p=p->next;
				}
				break;//case2的break
			default:
				printf("查找方式有误!\n");
		}
	} else
		printf("未录入信息,无法查找\n");
}

(4).修改部分

void correct(a1 *head) {
	a1 *p;
	a1 *w;
	w=head;
	p=NULL;
	char nameplus[100];//定义新变量名,存放修改的数据
	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");
			if(p->number==numm) {
				printf("已找到信息\n");
				printf("|编号\t|名称\t|价格\t\t|数量\t |\n");
				printf("|%d\t|%s\t|%f\t|%d\t |\n",p->number, p->name,p->price,p->count);
				printf("请进行修改\n");
				printf("编号:");
				scanf("%d",&p->number);			
				printf("名称");
				scanf("%s",&p->name);
				printf("价格:");
				scanf("%f",&p->price);
				printf("数量");
				scanf("%d",&p->count);
				printf("修改完成");
				break;
			} else {
				printf("未查找到该货物\n");
				break;
			}

		}
	printf("\n");
}

(5).删除部分

void cut(a1 *head,int number) {//以编号方式删除
	a1 *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->number!=numberplusplus&&p->next!=NULL) {
			q=p;//q后驱
			p=p->next;//p前驱
		}
		if(p->number==numberplusplus) {//如果编号对应的话
			if(p==head) {//如果找到的是头结点
				head=p->next;//头指针后移
			} else {//如果不是头结点
				q->next=p->next;//越过p结点
			}
			free(p);
			printf("删除成功\n");
		} else {
			printf("没有此货物:\n");
		}
	} else
		printf("未创建货物信息,无法删除\n");
}

(6).排序

void sort(a1 *head) {
int i,cou=0;//cou:结点数 
int num;//内循环 
a1 *p,*q,*tail;
p=head;
if(head->next!=NULL)
{
	printf("按编号从小到大排序\n");
while(p->next!=NULL)//计算结点数 
{
	cou++;
	p=p->next;
}
for(i=0;i<cou-1;i++)
{
	num=cou-i-1;//内循环次数 
	q=head->next;//q指向第一个结点 
	p=q->next;//p指向p后一个结点 
	tail=head;//tail指向q前一个结点 
	while(num--)//内循环 
	{
		if(q->number>p->number)
		{
			q->next=p->next;
			p->next=q;
			tail->next=p;
		}
		tail=tail->next;
		q=tail->next;
		p=q->next;
	 } 
}
printf("排序成功\n");
}
else 
{
	printf("无货物信息\n");
}
}

(7).主函数部分

int main() {
	FILE *z;//文件指针
	int m;
	char n;
	int number;
	page();//调用页面函数
	getchar();//按enter下一步
	if((z=fopen("货物信息.txt","r"))!=NULL) {
		head=in();//读入
	} else {
		printf("文件中没有保存货物信息!\n");
	}
	while(1) {
		system("cls");//清屏
		menu();//调用目录函数
		scanf("%c",&n);
		switch(n) {
			case '1'://创建信息
				head=creat();
				break;
			case '2':// 保存信息
				baocun(head);
				break;
			case '3'://查询信息
				search(head);
				break;
			case '4'://修改信息
				out(head);
				correct(head);
				break;
			case '5'://删除信息
				cut(head,number);
				break;
			case '6'://输出信息
				out(head);
				break;
			case '7'://添存信息
				add(head);
				baocun(head);
				break;
			case '8'://排序
				sort(head);
				break;
			case '9'://增加信息 
				add(head);
				break;
			case '0'://退出程序
				break;
			default:
				printf("选择功能错误!\n");
		}
		printf("\n");
		printf("—————————————————————————————\n");
		printf("是否继续对该货物信息的操作,如果继续操作 输:1 退出输: 2 \n");
		printf("—————————————————————————————\n");
		scanf("%d",&m);
		getchar();
		if(m==2) {
			break;
		}
	}
	return 0;
}
//‘添存信息’功能添加完后自动保存到文件
//‘创建信息’功能不设置自动保存,保存覆盖.txt 
//‘修改信息’先输出所有货物信息,再进行修改   修改是在不保存到.txt的条件下修改
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void page() { //页面开始
	system("color 3E");
	printf("\t\t\t\t\t**********************************\n");
	printf("\t\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|________________________________________|\n");
	printf("\t\t\t\t\t|________________基本信息________________|\n");
	printf("\t\t\t\t\t|   1. 创建货物信息| 2. 保存货物信息|\n");
	printf("\t\t\t\t\t|----------------------------------------|\n");
	printf("\t\t\t\t\t|   3. 查找货物信息| 4. 修改货物信息|\n");
	printf("\t\t\t\t\t|----------------------------------------|\n");
	printf("\t\t\t\t\t|   5. 删除货物信息| 6. 输出货物信息|\n");
	printf("\t\t\t\t\t|----------------------------------------|\n");
	printf("\t\t\t\t\t|   7. 添存信息    | 8. 排序|\n");
	printf("\t\t\t\t\t|----------------------------------------|\n");
	printf("\t\t\t\t\t    9. 增加信息    | 0. 退出程序\n");
	printf("\t\t\t\t\t|________________________________________|");
	printf("\n");
	printf("\n\t\t\t\t\t请输入你的操作代号(0--8):\n");
}
//定义结构体
typedef struct object {
	int number;
	char name[100];
	float price;
	int count;
	struct object * next;
} a1; //用a1代替结构体名object
a1 * head;//定义头指针
a1 * creat() { //1.创建信息功能,返回一个头指针
	a1 *po=NULL;
	a1 *p=NULL;//初始化指针
	po=head=(a1*)malloc(sizeof(a1));//开辟一个新单元,并赋给它内存初始地址
	int n;
	int ret;
	//内置一个死循环,多次调用函数
	while(1) {
		p=(a1*)malloc(sizeof(a1));//开辟动态存储区,把起始地址赋给p
		printf("请输入货物的编号、名称、价格、数量:\n");
		printf("编号:");
		scanf("%d",&p->number);
		//相邻两个比较重复
		if(p->number==po->number) {
			printf("输入货物编号重复\n");
			break;
		}
		if(p->number<0) {
			printf("输入编号格式有误\n");
			break;
		}
		printf("名称:");
		scanf("%s",&p->name);
		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->count);
			if(p->count<0) {
				printf("输入数量格式有误\n");
				break;
			}
		printf("\n");
		po->next=p;
		po=p;//实现让po指向p的空间
		printf("===============================================\n");
		printf("是否退出创建货物信息 退出: 输入1 继续: 输入2\n");
		scanf("%d",&n);
		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 baocun(a1 *head) { //从头指针开始
	int m;//标记
	m=0;
	a1 *p=NULL;
	FILE *z;//文件指针
	p=head->next;//p 第一结点 
	if(p==NULL) {
		printf("未创建货物信息,无法保存\n");
	} else if(p!=NULL) {
		p=head->next;//p从第一个结点开始
		if((z=fopen("货物信息.txt","w"))==NULL) { //创建货物信息文件, 只写
			printf("无法打开此货物文件\n");
			exit(0);//若空,终止
		}
		while(p!=NULL) {
			fprintf(z,"编号:%d\t",p->number);//格式化输出  以文件为对象 
			fprintf(z,"名称:%s\t",p->name);
			fprintf(z,"价格:%f\t",p->price);
			fprintf(z,"数量:%d\n",p->count);
			p=p->next;//p后移
			m++;//标记作用
		}
		printf("保存成功! 共保存%d个货物信息\n",m);
		fclose(z);//关闭文件;
	}
}
//查找功能
void search(a1 *head) {
	a1 *p=NULL;
	char name0[100];
	p=head->next;
	int n;
	int x;
	if(p!=NULL) {
		printf("\t\t\t请选择查找方式\n");//查找方式
		printf("\t\t\t1.通过货物编号查找  2.通过货物名称查找\n");
		printf("========================================\n");
		printf("请输入查找方式:1或2\n");
		scanf("%d",&n);
		switch(n) {
			case 1:
				printf("请输入查找的货物编号:\n");
				scanf("%d",&x);
				while(p!=NULL) {
					if(x==p->number) {
						printf("要查找的货物的信息为:\n");
						printf("编号: %d\n",p->number);
						printf("名称: %s\n",p->name);
						printf("价格: %f\n",p->price);
						printf("数量: %d\n",p->count);
						printf("查找成功\n");
						break;//防止无限查找
					}
					printf("\n");
					p=p->next;
				}
				break;//case1的break
			case 2:
				printf("请输入要查找的货物名称:\n");
				scanf("%s",&name0);
				while(p!=NULL) {
					if(strcmp(name0,p->name)==0) {
						printf("要查找的货物信息为:\n");
						printf("编号: %d\n",p->number);
						printf("名称: %s\n",p->name);
						printf("价格: %f\n",p->price);
						printf("数量: %d\n",p->count);
						printf("查找成功!\n");
						break;
					}
					printf("\n");
					p=p->next;
				}
				break;//case2的break
			default:
				printf("查找方式有误!\n");
		}
	} else
		printf("未录入信息,无法查找\n");
}
//添加信息功能
void add(a1 *head) {
	a1 *p=NULL;
	a1 *p1=NULL;
	p=head;//p 头指针
	while(p->next!=NULL) {
		p=p->next;
	}
	p1=(a1*)malloc(sizeof(a1));//开辟空间,给p1内存首地址
	printf("请输入要添加的货物信息:\n");
	printf("编号:");
	scanf("%d",&p1->number);
	printf("名称:");
	scanf("%s",&p1->name);
	printf("价格:");
	scanf("%f",&p1->price);
	printf("数量:");
	scanf("%d",&p1->count);
	printf("添加成功!\n");
	p->next=p1;//让p的下一个结点为p1
	p1->next=NULL;//p1为尾结点,添加完成
}
//修改信息功能
void correct(a1 *head) {
	a1 *p;
	a1 *w;
	w=head;
	p=NULL;
	char nameplus[100];//定义新变量名,存放修改的数据
	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->number==numm) {
				printf("已找到信息\n");
				printf("|编号\t|名称\t|价格\t\t|数量\t |\n");
				printf("|%d\t|%s\t|%f\t|%d\t |\n",p->number, p->name,p->price,p->count);
				printf("请进行修改\n");
				printf("编号:");
				scanf("%d",&p->number);			
				printf("名称");
				scanf("%s",&p->name);
				printf("价格:");
				scanf("%f",&p->price);
				printf("数量");
				scanf("%d",&p->count);
				printf("修改完成");
				break;
			} else {
				printf("未查找到该货物\n");
				break;
			}

		}
	printf("\n");
}
//删除信息功能
void cut(a1 *head,int number) {//以编号方式删除
	a1 *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->number!=numberplusplus&&p->next!=NULL) {
			q=p;//q后驱
			p=p->next;//p前驱
		}
		if(p->number==numberplusplus) {//如果编号对应的话
			if(p==head) {//如果找到的是头结点
				head=p->next;//头指针后移
			} else {//如果不是头结点
				q->next=p->next;//越过p结点
			}
			free(p);
			printf("删除成功\n");
		} else {
			printf("没有此货物:\n");
		}
	} else
		printf("未创建货物信息,无法删除\n");
}
//显示信息功能
void out(a1 *head) {
	a1 *p=NULL;
	p=head->next;//指向第一个结点
	if(p!=NULL) {
		while(p!=NULL) {
			printf("__________________________________________\n");
			printf("|编号\t|名称\t|价格\t\t|数量\t |\n");
			printf("|________________________________________|\n");
			printf("|%d\t|%s\t|%f\t|%d\t |\n",p->number, p->name,p->price,p->count);
			printf("|________________________________________|\n");
			p=p->next;//按顺序输出
		}
	} else printf("未创建货物信息,无法显示\n");
}
//读取功能
a1 *in() {
	FILE *z;
	a1 *head,*p,*w;
	if((z=fopen("货物信息.txt","r")) == NULL) { //打开txt文件  只读
		printf("不能打开文件!\n");
	}
	head=(a1 *)malloc(sizeof(a1)); //申请空间,获得首地址
	head->next=NULL;
	p=(a1 *)malloc(sizeof(a1));
	int m=0;
	while(fread(p,sizeof(a1),1,z)==1) { //读取文件信息。fread函数若执行成功,那么返回值为count(数据项的个数)
		m=m+1;
		p->next=NULL;//输出
		printf("编号:%d\t名称:%s\t价格%f\t数量:%d\t\n",p->number, p->name,p->price,p->count);
		getchar();
		if(m==1) {//如果只有一组信息,即只有一个结点
			head->next=p;
		} else {
			w->next=p;//多组信息
		}
		w=p;//让w指向p的空间
		p=(a1 *)malloc(sizeof(a1));//重新得到起始地址
	}
	fclose(z);
	return head;
}
//排序
void sort(a1 *head) {
int i,cou=0;//cou:结点数 
int num;//内循环 
a1 *p,*q,*tail;
p=head;
if(head->next!=NULL)
{
	printf("按编号从小到大排序\n");
while(p->next!=NULL)//计算结点数 
{
	cou++;
	p=p->next;
}
for(i=0;i<cou-1;i++)
{
	num=cou-i-1;//内循环次数 
	q=head->next;//q指向第一个结点 
	p=q->next;//p指向p后一个结点 
	tail=head;//tail指向q前一个结点 
	while(num--)//内循环 
	{
		if(q->number>p->number)
		{
			q->next=p->next;
			p->next=q;
			tail->next=p;
		}
		tail=tail->next;
		q=tail->next;
		p=q->next;
	 } 
}
printf("排序成功\n");
}
else 
{
	printf("无货物信息\n");
}
}

//主函数开始
int main() {
	FILE *z;//文件指针
	int m;
	char n;
	int number;
	page();//调用页面函数
	getchar();//按enter下一步
	if((z=fopen("货物信息.txt","r"))!=NULL) {
		head=in();//读入
	} else {
		printf("文件中没有保存货物信息!\n");
	}
	while(1) {
		system("cls");//清屏
		menu();//调用目录函数
		scanf("%c",&n);
		switch(n) {
			case '1'://创建信息
				head=creat();
				break;
			case '2':// 保存信息
				baocun(head);
				break;
			case '3'://查询信息
				search(head);
				break;
			case '4'://修改信息
				out(head);
				correct(head);
				break;
			case '5'://删除信息
				cut(head,number);
				break;
			case '6'://输出信息
				out(head);
				break;
			case '7'://添存信息
				add(head);
				baocun(head);
				break;
			case '8'://排序
				sort(head);
				break;
			case '9'://增加信息 
				add(head);
				break;
			case '0'://退出程序
				break;
			default:
				printf("选择功能错误!\n");
		}
		printf("\n");
		printf("—————————————————————————————\n");
		printf("是否继续对该货物信息的操作,如果继续操作 输:1 退出输: 2 \n");
		printf("—————————————————————————————\n");
		scanf("%d",&m);
		getchar();
		if(m==2) {
			break;
		}
	}
	return 0;
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐