C语言编写一个购物管理系统

根据菜单的提示,操作就可以了 

#include "stdio.h"  //I/O函数
#include "stdlib.h" //标准库函数
#include "string.h" //字符串函数
#include "ctype.h"  //字符操作函数
#include "conio.h"//控制台输入输出函数
#include "malloc.h" //动态地址分配函数
#include "memory.h" //内存操作函数
#define N 3 //定义课程门数,可以根据情况设定

typedef struct shopping//定义数据结构
{
	char no[10]; //商品号 
    char name[20]; //商品名 
	float price;//商品价格 
	char date[12];//生产日期 
    struct shopping *next;//指向后继结点的指针
}SHO;//结构体类型名
  
/**********以下是函数原型***********/
SHO *init(); //初始化函数
SHO *create(); //创建链表
void print(SHO *h); //显示所有记录
void search(SHO *h);//查找记录
SHO *insert(SHO *h); //插入记录
SHO *modify(SHO *h); //修改记录
SHO *delet(SHO *h); //删除记录
void save(SHO *h); //记录保存为文件
SHO *load(); //从文件中读记录
void copy();//文件备份
void inputs(char *prompt,char *s,int count);//输入字符串并进行长度验证
int menu_select(); //主菜单函数

int main()
{
	 
	 SHO *head; //链表定义头指针
     head=init();//初始化链表
	 system("cls"); //清屏
	 for (;;) //无限循环
	 {
		 switch(menu_select())
		 {
		 case 0:head=init();break; //执行初始化
		 case 1:head=create();break; //输入记录创建链表
		 case 2:print(head);break; //显示所有记录
         case 3:search(head);break;//查找记录
		 case 4:head=insert(head);break;//插入记录
		 case 5:head=modify(head);break;//修改记录
		 case 6: head=delet(head);break;//删除记录
		 case 7:save(head);break;//保存文件
		 case 8:head=load();break;//读文件
		 case 9:copy();break;//文件备份
		 case 10:exit(0);//结束程序
		 }
	 }
    return 0;
 }
int menu_select()
 {
	 char s[80];
	 int c;
	 printf("按任意键继续\n");
	 getch();
	 system("cls");//清屏
	 printf("*************购物管理系统菜单***************\n\n");
	 printf("            0.初始化\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");
	 do{
		 printf("\n 输入你的选择(0-10):");
		 scanf("%s",s);
		 c=atoi(s);//将数字字符串转换为数值
	 }while (c<0||c>10);
	 return c;
 }
 
 /*初始化链表*/
SHO *init()
{
   return NULL;
}

/*输入字符串,并进行长度验证*/
void inputs(char *prompt,char *s,int count)
{
   char p[255];;
   do{
       printf(prompt);//显示提示信息
       scanf("%s",p);//输入字符串
       if(strlen(p)>count) printf("\ntoo long!\n");//进行长度验证,超过count值重新输入
     }while(strlen(p)>count);;
    strcpy(s,p);//将输入的字符串拷贝到字符串s中
} 

/*创建链表*/
SHO *create()
 {
	 float s;
	 SHO *h=NULL,*info;
     for(;;)
	 {
		 info=(SHO *)malloc(sizeof(SHO));//申请空间
         if(!info)//若指针info为空
         {
            printf("\n out of memory");//提示内存溢出
            return NULL;           //返回空指针
         }

           if(info->no[0]=='#') break;//如果学号首字符为#,结束输入
         inputs("输入商品号:",info->no,10);//输入商品号并检验
         inputs("输入商品名:",info->name,20); //输入商品名并检验
         printf("输入商品价格:");
         scanf("%f",&s);
         info->price=s;
         inputs("输入商品生产日期:",info->date,12);
         printf("跳出就按 # 符号");
         info->next=h;
         h=info;
	 return h;//返回头指针
     }
 }
 
 /*输出全部记录*/
void print(SHO *h)
{
	int i=0;//统计记录个数
	SHO *p;//移动指针
	system("cls");;//清屏
	p=h;
	printf("\n\n\n************************购物管理信息*************************************\n");
	printf("商品号\t\t商品名\t\t商品价格\t生产日期\t\n");
	printf("-------------------------------------------------------------------------------\n");
	while(p!=NULL)
	{
		i++;
		printf("  %s\t\t  %s\t\t  %.1f\t\t  %s\t\n",p->no,p->name,p->price,p->date);
		p=p->next;
	}
	printf("-------------------------------------------------------------------------------\n");
}

/*查找记录*/
void search(SHO *h)
{
	SHO *p;//移动指针
	char s[20];//存放商品名的字符数组
	system("cls");//清屏
	printf("请输入要查找的商品名:\n");
	scanf("%s",s);//输入商品名
    p=h;
    while(strcmp(p->name,s))
    {
	  p=p->next ;//移动指针,指向下一结点1
	  if(p==NULL)
	  break;
    }
	if(p==NULL) 
		printf("没有商品名为%s的商品!\n",s);
	else
	{
		printf("\n\n\n***************************查找结果*********************************\n");
	    printf("商品号号\t商品名\t\t价格\t\t生产日期\t\n");
		printf("--------------------------------------------------------------------------\n");
		printf("   %s\t\t  %s\t\t%.1f\t\t  %s\t\n",p->no,p->name,p->price,p->date);
        printf("--------------------------------------------------------------------------\n");
	}
}

/*插入记录*/
SHO *insert(SHO *h)
{
	SHO *p,*q,*info;//p指向插入位置,q是其前趋,info指新插入记录
	char s[10];//保存插入点位置的商品号
	float s1;int i;
	printf("在哪个商品号前插入?");;
	scanf("%s",s);;//输入插入点商品号
	printf("\n请输入新的记录:\n");
	info=(SHO *)malloc(sizeof(SHO));//申请空间
	if(!info)
	{
		printf("\n out of memory");//提示内存溢出
        return NULL;           //返回空指针
    }
	inputs("输入商品号:",info->no,10);//输入商品号并检验
	inputs("输入商品名:",info->name,20); //输入商品名并检验
	printf("输入商品价格:");
    scanf("%f",&i);
    info->price=i;
    inputs("输入商品生产日期:",info->date,12);
	info->next=NULL;//设后继指针为空
	p=h;
	q=h;
	while(p!=NULL&&strcmp(p->no,s)) //查找插入位置
	{
		q=p;
		p=p->next;
	}
	if(p==NULL) //如果p指针为空,说明没有指定结点
		if(p==h)//同时p等于h,说明链表为空
			h=info;//新记录则为头结点
		else
			q->next=info;//p不为空,但p不等于h,将新结点插在表尾
	else
		if(p==h)
		{
			info->next=p;//如果p等于h,则新结点插入在第一个结点之前
			h=info;//新结点为头结点
		}
		else
		{
			info->next=p;//不是头结点,则是中间某个位置,新结点的后继为p
			q->next=info;//新结点作为q的后继结点
		}
	printf("成功插入!");
	return h;
}

/*修改记录*/
SHO *modify(SHO *h)
{
	SHO *p;//p为查找到要修改的结点指针
	char s[10];//存放学号
	int i;float s1;
	system("cls");//清屏
	printf("请输入要修改商品的商品号:");
	scanf("%s",s);
	p=h;
	while(p!=NULL&&strcmp(p->no,s)) //查找
	{
		p=p->next;
	}
    if(p==NULL)
		printf("没有该商品!\n");
	else
	{
		printf("找到该商品!商品信息见下列\n");
		printf("商品号号\t商品名\t\t价格\t\t生产日期\t\n");
		printf("--------------------------------------------------------------------------\n");
		printf("   %s\t\t  %s\t\t%.1f\t\t  %s\t\n",p->no,p->name,p->price,p->date);
        printf("--------------------------------------------------------------------------\n");
        printf("请输入修改信息:\n");		 
		inputs("输入商品号:",p->no,10);//输入商品号并检验
    	inputs("输入商品名:",p->name,20); //输入商品名并检验
    	printf("请输入商品的价格:");
    	scanf("%f",&i);
        p->price=i;
    	inputs("输入商品的生产日期:",p->date,12);
		printf("修改成功!\n");
	}
	return h;
}

/*删除记录*/
SHO *delet(SHO *h)
{
	SHO *p,*q;//p为查找到要删除的结点指针,q为其前趋指针
	char s[10];//存放商品号
	char ch;
	system("cls");//清屏
	printf("请输入要删除的商品号:");
	scanf("%s",s);
	q=p=h;
	while(p!=NULL&&strcmp(p->no,s)) //查找
	{
		q=p;
		p=p->next;
	}
    if(p==NULL)
		printf("没有该商品!\n");
	else
	{
		printf("找到该商品!商品信息见下列\n");
		printf("商品号号\t商品名\t\t价格\t\t生产日期\t\n");
		printf("--------------------------------------------------------------------------\n");
		printf("   %s\t\t  %s\t\t%.1f\t\t  %s\t\n",p->no,p->name,p->price,p->date);
        printf("--------------------------------------------------------------------------\n");
        printf("确定要删除这条记录吗?(Y/N):\n");		 
		ch=getch();//此处一定要用getch函数输入,其它函数均不可以
		if(ch=='Y' || ch=='y')
		{
			if(p==h)//若被删结点是头结点
				h=p->next;//修改头指针指向下一条记录
			else
				q->next=p->next;//不是头结点,将p的后继结点作为q的后继结点
			free(p);
			printf("删除成功!\n");
		}		
	}
	return h;
}

/*保存数据到文件*/
void save(SHO *h)
{
	FILE *fp;//定义指向文件的指针
	SHO *p;//定义移动指针
	char outfile[50];//文件名
	printf("请输入文件名,例如:c:\\f1\\te.dat:\n");//提示文件名格式信息
	scanf("%s",outfile);
    if((fp=fopen(outfile,"wb"))==NULL)
	{
		printf("不能打开文件!\n");
		exit(1);
	}
	printf("\n保存文件\n");
	p=h;
	while(p!=NULL) 
	{
		fwrite(p,sizeof(SHO),1,fp);//写入一条记录
		p=p->next ;
	}
	fclose(fp);
	printf("成功保存文件!\n");
}

/*从文件读数据*/
SHO *load()
{
	SHO *p,*q,*h=NULL;
	FILE *fp;
	char infile[50];
	printf("请输入文件名,例如:c:\\f1\\te.dat:\n");//提示文件名格式信息
	scanf("%s",infile);
	if((fp=fopen(infile,"rb"))==NULL)
	{
		printf("不能打开文件!\n");
		exit(1);
	}
	printf("\n读文件\n");
	p=(SHO *)malloc(sizeof(SHO));
	if(!p)
	{
		printf("内存溢出!\n");
		return h;
	}
	h=p;
	while(!feof(fp))
	{
		if(1!=fread(p,sizeof(SHO),1,fp))
			break;
		p->next=(SHO *)malloc(sizeof(SHO));
		if(!p->next)
		{
			printf("内存溢出!\n");
		    return h;
		}
		q=p;
		p=p->next;
	}
	q->next=NULL;;
	fclose(fp);
	printf("成功读取文件!\n");
	return h;
}

/*文件备份*/
void copy()
{
	char outfile[20],infile[20];//目标文件名
	FILE *sfp,*tfp;//源文件指针,目标文件指针
	SHO *p=(SHO *)malloc(sizeof(SHO));//申请空间
	system("cls");
	printf("请输入源文件名,例如:c:\\f1\\te.dat:\n");
	scanf("%s",infile);
	if((sfp=fopen(infile,"rb"))==NULL) //打开记录文件
	{
		printf("不能打开文件!\n");
		exit(0);
	}
	printf("输入目标文件名,如c:\\f1\\te.dat:\n");
	scanf("%s",outfile);
	if((tfp=fopen(outfile,"wb"))==NULL)//打开目标文件
	{
		printf("不能打开文件!\n");
		exit(0);
	}
	while(!feof(sfp))//读文件直到文件尾
	{
		if(1!=fread(p,sizeof(SHO),1,sfp))
			break;//块读
		fwrite(p,sizeof(SHO),1,tfp);//块写		
	}
	fclose(sfp);
	fclose(tfp);
	printf("复制成功!\n");
}

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 我可以给您提供一些建议: 1. 首先,要使用c语言编写员工管理系统,需要具备一定的c语言编程基础; 2. 其次,可以根据需求分析,确定系统的功能需求; 3. 然后,根据功能需求,设计系统的结构,确定其中的数据结构; 4. 最后,编写程序,实现系统的功能。 ### 回答2: 员工管理系统一个用来管理公司或组织中的员工信息的软件系统。它可以实现员工的增加、删除、修改和查询等功能,并能够生成相应的报表和统计数据。 在C语言编写员工管理系统,可以采用结构体来存储员工的相关信息,例如员工编号、姓名、性别、年龄、职位等。通过定义一个包含这些成员的结构体,可以方便地表示每个员工的信息。 首先,需要定义一个结构体来表示员工信息,例如: ```c struct Employee { int id; char name[50]; char gender[10]; int age; char position[50]; }; ``` 然后,可以通过数组来存储多个员工的信息,例如: ```c struct Employee employees[100]; ``` 在主函数中,可以通过循环和条件判断来实现员工管理系统的各种功能。例如,可以通过循环遍历员工数组来查询、修改和删除员工信息,也可以通过条件判断来实现新增员工的功能。 另外,可以通过文件操作来实现员工信息的持久化。例如,可以将员工信息保存在一个文件中,并在程序启动时从文件中读取员工信息,并在程序退出时将新的员工信息写入文件中。 总之,用C语言编写一个员工管理系统需要定义合适的数据结构和使用循环、条件判断以及文件操作等技术来实现各种功能。这样,就能够轻松管理和操作员工的信息。 ### 回答3: 员工管理系统一个用来管理员工信息的软件系统。使用C语言编写一个员工管理系统的时候,需要首先确定系统的功能需求,并按照需求进行模块划分和功能设计。 系统的主要功能包括: 1. 员工信息录入:可以通过输入员工信息,包括姓名、性别、年龄等,并生成唯一的员工编号。 2. 员工信息查询:根据员工的编号或姓名进行查询,系统可以根据输入的关键信息在数据库中查找匹配的员工信息。 3. 员工信息修改:可以修改员工的基本信息,如姓名、性别、年龄等。 4. 员工信息删除:可以根据员工的编号或姓名进行删除,将员工信息从数据库中移除。 5. 员工信息展示:可以将员工的信息以表格的形式展示出来,方便查看和操作。 实现这个系统需要考虑的一些关键点包括: 1. 数据库设计:可以选择使用文件系统或者数据库管理系统来存储员工信息。使用C语言的文件操作或者数据库操作来读写员工信息。 2. 用户交互:为了方便用户输入和系统的操作,可以使用命令行方式进行交互,使用C语言的输入输出函数实现。 3. 模块化设计:将系统功能进行模块划分,设计不同的函数来实现不同的功能。方便代码的复用和维护。 实现一个员工管理系统需要对C语言的基本语法、文件操作、数据库操作等方面有一定的了解。可以先设计系统的结构和功能模块,再进行代码的编写和测试。通过不断调试和改进,最终完成一个功能完善、稳定可靠的员工管理系统

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

STM32单片机定制

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值