C语言编程问题

本文介绍了一个设备管理系统的实现细节,包括设备信息的添加、显示、查询、修改等功能,以及如何通过菜单进行操作。系统使用C语言开发,涵盖了设备的基本属性如编号、名称、价格等,并提供了添加记录、显示信息、查询记录、修改记录等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提问,问什么addRecord添加信息后,用display()显示不出来

引用文本

#ifndef L_MACHINE_LL
#define L_MACHINE_LL
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>

#define initial_size 5 //数组的初始大小
#define incr_size 5 //数组每次增加的大小

struct machine_info{
char serial_number[15]; //编号
char name[20]; //名称
int price; //单价
int year; //购进年代
char home[25]; //厂家
int number; //数量
char use[2]; //可用性
char unuse[2]; //不可用性
};
typedef struct machine_info MacInfo;//定义一个类型名McaInfo代表定义的结构体machine_info

extern int numMac;//记录设备种数
extern MacInfo *record; //记录设备信息的指针
extern int saveTag;
extern int arraySize;//数组大小

int menu_select();
void handle__menu();

void quit();
void showTable();
void addRecord();
void display();
void removeRecord();
int findRecord(char *target,int type,int from);
void queryRecord();

void copyRecord();
void modifyRecord();
void rejectRecord();
void buyRecord();
int Save();
int Load();
void handle_menu1();
void handle_menu2();
#endif

/*
**初始化
*/
int numMac=0;//记录设备种数
int saveTag=0;//1表示未保存,0表示已保存
MacInfo *record=NULL; //记录设备信息的指针
int arraySize=0;

/***
*主函数
*/
void main()
{ char s[2];
int mima;
int count=0;
printf(" * * * * * * * * * * * \n");
printf(" * * * * * * * * * \n");
printf(" * * * * * * * * * * \n");
printf(" * * * * * * \n");
printf(" * * * * * * \n");
printf(" * * * * * * * \n");
printf(" * * * * * * * \n");
printf(" * * * * * \n");
printf("\n\n “);
printf(“管理员能进行所有操作,一般人员只能进行1.显示设备信息,4.查找指定的设备,5.修改指定的设备信息,8.对设备进行排序,9/10储存和读取记录,11退出”);
printf(“请输入密码:”);
while(1)
{
scanf(”%s",s);
mima=atoi(s);
if(mima1234)
{
handle_menu1();
break;
}
if(mima
4321)
{
handle_menu2();
break;
}
if((mima!=1234)&&(mima!=4321))

		if((mima!=1234)&&(mima!=4321))
{

	printf("请输入正确的密码:");
	count++;
	if(count==3)
	{
		printf("输入错误密码超过3次强行退出,请重新启动");
		break;
	}
}
}

}

/**************
*菜单处理函数1
*/
void handle_menu1()
{
for(;?{
switch(menu_select())
{
case 1:
display();
break;
case 2:
addRecord();
break;
case 3:
printf(“请输入在权限范围内的数字”);
continue;
case 4:
queryRecord();
break;
case 5:
modifyRecord();
break;
case 6:
printf(“请输入在权限范围内的数字”);
continue;
case 7:
printf(“请输入在权限范围内的数字”);
continue;

        case 8:
			Save();
			break;
        case 9:
			Load();
			break;
        case 10:
			quit();
	}
}

}
/**************
*菜单处理函数2
*/
void handle_menu2()
{
for(;?{
switch(menu_select())
{
case 1:
display();
break;
case 2:
addRecord();
break;
case 3:
removeRecord();
break;
case 4:
queryRecord();
break;
case 5:
modifyRecord();
break;
case 6:
rejectRecord();
break;
case 7:
buyRecord();
break;

        case 8:
			Save();
			break;
        case 9:
			Load();
			break;
        case 10:
			quit();
	}
}

}
/******
**菜单选择函数menu_slect
/
int menu_select()
{
char s[2];
int cn=0;
record=(MacInfo
)malloc(sizeof(MacInfo)*initial_size);//给数组分配MacInfo分配initial_size个记录空间大小。
if(record==NULL)
{
printf(“出错!”);
exit(-1);
}
arraySize=initial_size;

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("10.文件读取记录\n");
	printf("11.退出\n");
	printf("\n\t请选择1~11   ");
	for(;;)
	{
	gets(s);
	cn=atoi(s);
	if(cn<1||cn>11)printf("\n输入错误,重选1~11");
	else
		break;
	}
	return cn;

}
/**
**结束运行退出
*/
void quit()
{
char str[5];
if(saveTag==1)
{
printf(“是否保存原来的记录?(Y/N)”);
gets(str);
if(str[0]!=‘n’||str[0]!=‘N’)
Save();
}
free(record);
exit(0);
}

/**
*打印表头
**/
void showTable()
{
printf(“编号\t名称\t单价\t购进年代\t生产家\t该设备数量\t可用\t不可用\n”);
}

/*
*显示设备信息
*/

void display()
{
int i;
if(numMac0)
{
printf(“没有可以显示的数据信息!”);
return;
}
showTable();
for(i=0;i<numMac;i++)
{
printf("%s\t%s\t%d\t%d\t%s\t%d\t%s\t%s\n",record[i].serial_number,record[i].name,record[i].price,record[i].year,record[i].home,record[i].number,record[i].use[2],record[i].unuse[2]);
if(i%20
0&&i!=0)
{
printf(“输入任一字符后继续。。\n”);
getch();
printf("\n\n");
showTable();
}
}
}

/**
*新建或添加信息
*/
void addRecord()
{
char str[20];
if(numMac==0)
printf(“当前还没有记录,现在建立新表\n”);
else
printf(“当前已经有数据,现在在表末尾添加新记录\n”);

while(1)
{
	printf("现在要新增一组信息,sure?(Y/N)\n");
	
	scanf("%s",str);
	if(str[0]=='n'||str[0]=='N')
		break;

	if(numMac>=arraySize)
	{
	record=(MacInfo*)realloc(record,(arraySize+initial_size)*sizeof(MacInfo));
	if(record==NULL)
	{
		printf("memory failed!");
	    exit(-1);
	}
	arraySize=arraySize+incr_size;
	}

		printf("请输入设备编号:");
		scanf("%s",record[numMac].serial_number);
		printf("请输入设备名称:");
		scanf("%s",record[numMac].name);
		printf("请输入设备单价:");
		scanf("%d",&record[numMac].price);
		printf("请输入设备购进年代:");
		scanf("%d",&record[numMac].year);
		printf("请输入设备厂家:");
		scanf("%s",record[numMac].home);
		printf("请输入设备数量:");
		scanf("%d",&record[numMac].number);
		printf("请输入设备的不可用台数:");
		scanf("%s",record[numMac].unuse);
		printf("请输入设备的可用台数:");
		scanf("%s",record[numMac].use);
		numMac++;
}
printf("现在共有%d条信息",numMac);
saveTag=1;//输入一个新的学生后,信息保存标志为1,表示未保存。

}

/*
*查找指定的记录
*参数:target:要查找的记录的某一项与target相同
type: 通过那一项来查找 0通过编号查找 1通过名称查找
from: 从第from项开始查找
*返回查找到的记录的序号,否则则返回-1
*/
int findRecord(char *target,int type,int from)
{
int i;
for(i=from;i<numMac;i++)
{
if((type==0&&strcmp(target,record[i].serial_number)0)||
(type
1&&strcmp(target,record[i].name)==0))
return i;
}
return -1;
}

/*
*查询指定的设备信息
*/

void queryRecord()
{
char target[20];
int type;
int i;
char str[20];
int count;
if(numMac==0)
{
printf(“无记录可以查询,可以增加功能增添信息>.<”);
return;
}
while(1)
{
printf(“1.按设备编号查询\n”);
printf(“2.按设备名称查询\n”);
gets(str);
if(str[0]==1)
{
printf(“请输入要查询的设备编号:”);
gets(target);
type=0;
}
if(str[0]==2)
{
printf(“请输入要查询的设备名称:”);
gets(target);
type=1;
}
i=findRecord(target,type,0);

	if(i!=-1)
	{
		showTable();
	}
	count=0;
	while(i!=-1)
	{
		count++;
	printf("%s\t%s\t%d\t%d\t%s\t%d\t%s\t%s\n",record[i].serial_number,record[i].name,record[i].price,record[i].year,record[i].home,record[i].number,record[i].use[2],record[i].unuse[2]);
		i=findRecord(target,type,i+1);
	}
	if(count==0)
		printf("没有找到符合条件的设备\n");
	else
		printf("一共找到%d条信息\n\n",count);
}

}

/*
*将one指向的一条记录赋给two
*/

void copyRecord(MacInfo *one,MacInfo *two)
{
strcpy(two->serial_number,one->serial_number);
strcpy(two->name,one->name);
two->price=one->price;
two->year=one->year;
strcpy(two->home,one->home);
two->number=one->number;
two->use[2]=one->use[2];
two->unuse[2]=one->unuse[2];
}

/*
*删除指定的记录
*/

void removeRecord()
{
char target[20];
int type;
int i,j;
char str[2];
if(numMac==0)
{
printf(“没有可供删除的信息”);
return;
}

printf("1.按编号查找要删除的记录\n");
printf("2.按名称查找要删除的记录\n");
gets(str);
if(str[0]==1)
{
	printf("请输入设备编号:");
	gets(target);
	type=0;
}
if(str[0]==2)
{
	printf("请输入设备名称:");
	gets(target);
	type=1;
}
i=findRecord(target,type,0);
if(i!=-1)
{
	showTable();
}
while(i!=-1)
{
	printf("%s\t%s\t%d\t%d\t%s\t%d\t%s\t%s\n",record[i].serial_number,record[i].name,record[i].price,record[i].year,record[i].home,record[i].number,record[i].use[2],record[i].unuse[2]);
	printf("确定要删除该信息吗(Y/N)");
	gets(str);

	if(str[0]=='y'||str[0]=='Y')
	{
		numMac--;
		for(j=i;j<numMac;j++)
		{
			copyRecord(&record[j+1],&record[j]);
		}
	}
	i=findRecord(target,type,i+1);
}

}

/*
*修改指定的设备记录
*/
void modifyRecord()
{
char target[20];
int type;
char str[5];
int i;
if(numMac==0)
{
printf(“没有可供修改的信息”);
return;
}
printf(“1.按编号查找要修改的信息”);
printf(“2.按名称查找要修改的信息”);
gets(str);
if(str[0]==1)
{
printf(“请输入要修改的设备的原始编号:”);
gets(target);
type=0;
}
if(str[0]==2)
{
printf(“请输入要修改的设备的原始名称:”);
gets(target);
type=1;
}
i=findRecord(target,type,0);
if(i=-1)
{
printf(“查无此记录”);
return;
}

while(i!=-1)
{
		showTable();
	printf("%s\t%s\t%d\t%d\t%s\t%d\t%s\t%s\n",record[i].serial_number,record[i].name,record[i].price,record[i].year,record[i].home,record[i].number,record[i].use[2],record[i].unuse[2]);
	printf("确定要修改该信息吗(Y/N)");
	gets(str);

	if(str[0]=='y'||str[0]=='Y')
	{
		printf("请输入新的设备编号:");
		scanf("%s",record[i].serial_number);
		printf("请输入新的设备名称:");
		scanf("%s",record[i].name);
		printf("请输入新的设备单价:");
		scanf("%d",&record[i].price);
		printf("请输入新的设备购进年代:");
		scanf("%d",&record[i].year);
		printf("请输入新的设备厂家:");
		scanf("%s",record[i].home);
		printf("请输入新的设备数量:");
		scanf("%d",&record[i].number);
		printf("请输入新的设备的不可用台数:");
		scanf("%s",&record[i].unuse[2]);
		printf("请输入新的设备的可用台数:");
		scanf("%s",&record[i].use[2]);


	}
	i=findRecord(target,type,i+1);
}
saveTag=1;

}

/*
*对指定的记录或全部记录进行报废
*/

void rejectRecord()
{
char str[5];
char s[5];
char a[5];
int sign=0;//检测有无不可用的设备的标准
char target[20];
int type;
int i;
if(numMac==0)
{
printf(“无相关的设备信息可以报废”);
return;
}

for(i=0;i<numMac;i++)//检查所有设备是否有不可用的
{
	
	if(record[i].use[0]!=0)
		sign=1;//若sign为1则有不可用的设备,可进行报废
}
if(sign==0)//sign为0,没有不可用的设备,不能报废
{
	printf("所有设备都可用,没有不可用的设备,不能报废!");
	return;
}
printf("1.按指定的设备进行报废\n");
printf("2.对全部设备进行报废\n");
gets(str);
if(str[0]==1)
{
	printf("1.按编号查找要报废的设备\n");
	printf("2.按名称查找要报废的设备\n");
	gets(s);
	if(s[0]==1)
	{
		printf("请输入设备编号");
		gets(target);
		type=0;
	}
	if(s[0]==2)
	{
		printf("请输入设备的名称");
		gets(target);
		type=1;
	}
	i=findRecord(target,type,0);
	while(i!=-1)
	{
		showTable();
		printf("%s\t%s\t%d\t%d\t%s\t%d\t%s\t%s\n",record[i].serial_number,record[i].name,record[i].price,record[i].year,record[i].home,record[i].number,record[i].use[2],record[i].unuse[2]);
		printf("确定要对该设备进行报废吗?(Y/N)");
		gets(a);
		if(a[0]=='n'||a[0]=='N')
			return;
		if(a[0]=='y'||a[0]=='Y')
		{
			record[i].number=record[i].number-atoi(record[i].unuse);
			record[i].unuse[2]='0';
		}
		i=findRecord(target,type,i+1);
	}
}
if(str[0]==2)
{
	printf("确定对全部设备进行报废吗?(Y/N)");
	gets(str);
	if(str[0]=='n'||str[0]=='N')
		return;
	if(str[0]=='y'||str[0]=='Y')
	{
		for(i=0;i<numMac;i++)
		{
				record[i].number=record[i].number-atoi(record[i].unuse);
			record[i].unuse[2]='0';
		}
	}
}

}

/*
*对指定的设备进行购买
*/

void buyRecord()
{
char str[5];
char target[20];
int type;
char s[10];
int i;

if(numMac==0)
{
	printf("无设备信息,无法购买");
	return;
}
printf("1.按编号查找要购买的设备\n");
printf("2.按名称查找要购买的设备\n");
gets(str);
if(str[0]==1)
{
	printf("请输入设备编号:");
	gets(target);
	type=0;
}
if(str[0]==2)
{
	printf("请输入设备的名称:");
	gets(target);
	type=1;
}
i=findRecord(target,type,0);
if(i!=-1)
{
	showTable();
}
while(i!=-1)
{
	printf("%s\t%s\t%d\t%d\t%s\t%d\t%s\t%s\n",record[i].serial_number,record[i].name,record[i].price,record[i].year,record[i].home,record[i].number,record[i].use[2],record[i].unuse[2]);
	printf("确定该设备种类进行够买吗?(Y/N)");
	gets(str);
	if(str[0]=='n'||str[0]=='N')
		return;
	if(str[0]=='y'||str[0]=='Y')
	{
		printf("请输入购买的数量:");
			gets(s);
		if(atoi(s)<0)
		{
			printf("输入错误!");
			continue;
		}
		if(atoi(s)>=0)
		{
			
			record[i].number=record[i].number+atoi(s);
			strcpy(record[i].use,s);
		}
		printf("购买成功!");
	}
	i=findRecord(target,type,i+1);
}
saveTag=1;

}

/**

  • 文件储存操作函数
    *结果:数组record保存至指定文件
    *返回:成功0,失败-1
    */

int Save()
{
FILE *fp;
char fname[30];

if(numMac==0)
{
	printf("没有记录可以保存!");
	return -1;
}
printf("请输入要保存至的文件名(按回车选择文件mac_info):");
gets(fname);
if(strlen(fname)==0)
	strcpy(fname,"mac_info");
if((fp=fopen(fname,"w"))==NULL)
{
	printf("该文件打不开,不能存入文件!\n");
	return -1;
}
printf("正在存文件》》》》\n");
fwrite(record,sizeof(MacInfo)*numMac,1,fp);
fclose(fp);
printf("%d条数据已经存入该文件,请继续操作。\n",numMac);
saveTag=0;
return 0;

}

/*
*文件读取操作函数
*结果:record将为从指定文件中读取出记录
*返回:成功0,失败-1
*/

int Load()
{
FILE *fp;
char fname[30];
char str[5];

if(numMac!=0&&saveTag==0)
{
	printf("请选择是否覆盖原来的记录(Y),还是将读取的记录添加到原有的记录之后(N)?\n");
	printf("按回车直接覆盖原有的记录\n");
	gets(str);
	if(str[0]!='n'||str[0]!='N')

		numMac=0;
}
if(numMac!=0&&saveTag==1)
{
	printf("原来的记录没有保存,是否保存原来的记录?(Y/N)");
	printf("按回车则保存原来的记录");
	gets(str);
	if(str[0]!='n'||str[0]!='N')
		Save();

	printf("请选择是否覆盖原来的记录(Y),还是将读取的记录添加到原有的记录之后(N)?\n");
	printf("按回车直接覆盖原有的记录\n");
	gets(str);
	if(str[0]!='n'||str[0]!='N')

		numMac=0;
}

printf("请输入要读取的文件名(按回车直接选择文件mac_info):");
gets(fname);
if(strlen(fname)==0)
	strcpy(fname,"mac_info");

if((fp=fopen(fname,"rb"))==NULL)
{
	printf("该文件打不开!请重新选择\n");
	return -1;
}
printf("\n读取文件》》》\n");
while(!feof(fp))
{

	 if(numMac>=arraySize)
	 {
		 record=(MacInfo*)realloc(record,sizeof(MacInfo)*(arraySize+incr_size));
		 if(record==NULL)
		 {
			 printf("memory failed!");
			 exit(-1);
		 }
		 arraySize=arraySize+incr_size;
	 }
	 if((fread(&record[numMac],sizeof(MacInfo),1,fp)!=1))break;
	 numMac++;
}
fclose(fp);
printf("现在有%d条记录。",numMac);
return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CodeToMing

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

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

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

打赏作者

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

抵扣说明:

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

余额充值