C语言课程设计(服装管理系统详解)

本人上周和下周正在开展C语言的课程设计,所以更新新的知识有一些慢,本篇博客将带领大家深度了解c语言的文件的操作以及本人在书写代码时所出现的问题。

首先我设置了用户登录系统、管理员登录系统。用户登录系统登录之后会按照用户所填写的衣服尺码与服装系统中的剩余对比从而给用户推荐满足她尺寸的服装。

此代码的实现,可能是因为本人较为笨拙搞了很久在文件的读取方面一直使用fwrite和fread。所以将服装文本中的信息一直读不到正确的位置所以一直再想为什么它read的时候会将所有的信息都读取到结构体的第一个字符数组之中,随后在课设中我发现read这个函数时对信息一行进行读取,没办法一个一个信息的存储与读取,所以我将代码中所有的fwrite和fread分别改为了fprintf和fscanf。然后进行编译之后发现用户登录之后会正常推荐服装信息。对此是我自己的思路,然后输出之后发现它只能推荐一个服装类型,但是我也使用了feof判断是否到了末尾所以我使用了循环。发现一直再循环里出不来,并且在if中判断相等之后循环不知道如何出来,所以我听取了朋友的建议使用了一个计数器,先对整体进行计数,然后下一个循环到服装总数之后就退出。但是又遇到了一个问题就是读了之后文件的指针就指向了文件的末尾,所以又要使用fseek()函数让指针重新指上服装文本中的文件开头的位置,对其重新读取。该功能其实我认为还可以使用链表但是我的代码和函数有点多如果对链表进行使用的话会很乱,并且不好找bug所以选择了计数器的方法。课设结束之后我会尝试用链表对其进行功能的分析。

该模块的代码如下所示:

void userin()
{
	Users y={0};
	stu f={0}; 
	int count=0;
	FILE *pe=fopen("users.txt","r+");
	FILE *pi=fopen("fuzhuang.txt","r+");
	fscanf(pe,"%s %s %s %s %s",y.id,y.name,y.paw,y.sex,y.size);
	fscanf(pi,"%s %s %s %s %d %d",&f.brand,&f.name,&f.num,&f.size,&f.price,&f.stock);
	printf("\t跟您尺码相同的服装库存还有:\n"); 
	printf("\t服装品牌\t服装编号\t服装类型\t服装尺寸\t服装售价\t服装库存\n");
	while(1)
	{
		if(feof(pi)==0)
		{
			fscanf(pi,"%s %s %s %s %d %d",&f.brand,&f.name,&f.num,&f.size,&f.price,&f.stock);
			count++;
		}
		else
			break;

	}
	fseek(pi,0L,SEEK_SET);
	while(count--)
	{
		if(strcmp(y.size,f.size)!=0)
		{
			if(feof(pi)==0)
			{
				fscanf(pi,"%s %s %s %s %d %d",&f.brand,&f.name,&f.num,&f.size,&f.price,&f.stock);
			}
		}
		else
		{
			printf("\t%s\t\t%s\t\t%s\t\t%s\t\t%d\t\t%d\n",f.brand,f.num,f.name,f.size,f.price,f.stock);
			if(feof(pi)==0)
			{
				fscanf(pi,"%s %s %s %s %d %d",&f.brand,&f.name,&f.num,&f.size,&f.price,&f.stock);
			}
		}
	}
} 

当然除了这个功能我认为还有一个功能的实现还是稍微有一点点的难度的,比如用户的注册和登录时所需要保存的数据和读取的数据。并且还要对其进行比较是否相等,两个功能的实现大差不差,所以我们直接来看这个注册和登录的代码吧!

void Regist()
{
	administrator a={0},b={0};
	char tmp[20]={-1};		//判断密码是否相同时使用的 
	FILE *pf = NULL;
	pf = fopen("administrator.txt","r");	//用pf去指向文件,文件是要已经存在的文件 只读模式 
	if(pf == NULL)
	{
		printf("注册时打开文件失败\n");
		return ;
	}
	printf("\t\t\t欢迎来到注册界面\n\n");
	printf("\t\t\t输入账号->");
	scanf("%s",a.id);
	printf("输入成功!\n"); 

//【注册界面】 
	printf("\t\t\t请输入姓名->"); 
	scanf("%s",a.name);
	printf("\t\t\t请输入性别:男/女->"); 
	do
	{		//输入性别并查看是否输入正确 
		getchar();
		scanf("%s",a.sex);
	}while(1);
			
		printf("\t\t\t请输入密码->"); 
		scanf("%s",a.paw);
		printf("\t\t\t请再输入一次密码->"); 
	do	//判断两次密码是否相等 
	{
		scanf("%s",tmp);
		if(strcmp(tmp,a.paw) != 0)
			printf("\t\t\t两次输入密码不一致,请再输入一次密码->");
		else
			break;
	}while(1);
		//两次密码一致
		fclose(pf);	
		pf = NULL;
		pf = fopen("administrator.txt","a");	//以追加的形式写入文件 
		//fwrite会在当前文件指针的位置写入数据
		//"w" 打开,文件指针指到头,只写;"a" 打开,指向文件尾部,不覆盖。 
		fprintf(pf,"%s %s %s %s",a.name,a.paw,a.id,a.sex);	//将a的数据存入文件之中
		printf("\t\t\t注册成功!\n"); 
		fclose(pf);	
		pf = NULL;
		system("cls");
		return;	
}


bool Login()	//返回值是一个布尔变量 
{
	administrator a={0},b={0};
	FILE *pf = fopen("administrator.txt","r+");	//以读的模式打开文件 
	if(pf == NULL)
	{
		printf("文件打开失败\n");
		return false;
	}
	printf("欢迎来到登录界面!\n");
	printf("请输入账号->");
	scanf("%s",a.id);
	fscanf(pf,"%s %s %s %s",b.name,b.paw,b.id,b.sex);	//每次读取Users个长度,读一次。 
	while(1)
	{
		if(strcmp(a.id, b.id) != 0 )
		{
			if(feof(pf) == 0)//未到文件尾 一直向后查找 
			{
				fscanf(pf,"%s %s %s %s",b.name,b.paw,b.id,b.sex);
			}
			else
			{
				printf("该账号不存在,请先注册\n");
				fclose(pf); 
				pf = NULL;
				return false;
			}
		}
		else//账号注册过->跳到输入密码 
		{
			break; //退出无限循环,跳到输入密码 
		}
		
	}
//【输入密码】 
	printf("请输入密码->"); 
	do
	{
		scanf("%s",a.paw);
	}while(1);
	printf("登录成功!\n");
	fclose(pf); 
	pf = NULL;
	system("cls");
	return true;
}

为了防止大家直接进行复制粘贴代码所以我对以上的代码进行了一些删减,如果有需要课设相关功能的朋友可以在csdn上私信我,我一定会对问题进行解答。

其他的代码我个人认为相关功能的实现很简单所以这里我就不详细的介绍其他的代码了。我会对我的程序进行截图,大家可以看看如果有需要的功能可以私信我。

本人的用户登录端可能后续还要加入很多功能。

 如下的图是对用户端想要的价格进行给用户的推荐如下:

 下面就是退出系统的相关操作:

 本人这篇博客的讲解就先到这里结束了,如果这里的一些功能你想要代码的话可以私信我,或者我的这篇博客有一些语言不清的地方或者思路有问题的地方,欢迎大佬们帮我指出谢谢!

猜你喜欢

转载自blog.csdn.net/m0_61886762/article/details/125242155
今日推荐