之前学校c语言程序实训课要求写的
如果程序有错误或可以改进的地方,希望各位指出
开发环境:IDE Visual Studio Code/Dev C++
处理器 AMD Ryzen 7 PRO 6850HS with Radeon Graphics 3.20 GHz
机带 RAM 16.0 GB (15.3 GB 可用)
系统类型 64 位操作系统, 基于 x64 的处理器
一.课程设计功能需求:
设备录入, 2、设备输出, 3、设备查询, 4、设备修改, 5、设备删除, 6、设备排序, 7、设备分类, 8、设备统计, 9、设备信息保存, 10、设备信息读取
二.功能展示:
三.程序亮点:
运用函数嵌套(在别的自定义函数中用到自定义print函数)
2.多文件(模块化)c程序
包含3个主要文件,main.c,head.h,fun.c
其中main.c中为主函数,head.h中为fun.c中的函数的声明,fun.c中为用户自定义函数
3.实现文件的导入导出
导出俩个文件data.txt用于存储设备内容 len.txt用于存储数组长度
4.在文件导入导出处使用指针
5.在设备排序中用到冒泡排序
6.多处用到
system (“pause”); 暂停程序
System (“cls”); 清除屏幕上的所有内容
使界面更加简洁
四.程序源代码:
main.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"head.h" //引入头文件
typedef struct
{
char name[50]; //设备名称
char type[50]; //设备类型
char id[50]; //设备id
char date[50]; //设备购买日期
char state[50]; //设备状态
}DEV;
int main()
{
DEV dev[50];
strcpy(dev[0].id,"0"); //用于判断文件是否正常导入,若正常导入,0将会被覆盖
int len;
for (;;)
{
switch (menu_list())
{
case 0:len=enter_list(dev);break;
case 1:show_list(dev,len);break;
case 2:search_list(dev,len);break;
case 3:change_list_dev(dev,len);break;
case 4:len=del_list_dev(dev,len);break;
case 5:len=add_list_dev(dev,len);break;
case 6:sort_list_dev(dev,len);break;
case 7:classify_list_dev(dev,len);break;
case 8:sata_list(dev,len);break;
case 9:write_list(dev,len);break;
case 10:len=read_list(dev);break;
case 11:exit(0);break;
}
}
system ("pause");
return 0;
}
head.h
int menu_list();
int enter_list();
void show_list();
void search_list();
void change_list_dev();
int del_list_dev();
int add_list_dev();
void sort_list_dev();
void print();
void classify_list_dev();
void sata_list();
//函数声明
fun.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
char name[50]; //设备名称
char type[50]; //设备类型
char id[50]; //设备id
char date[50]; //设备购买日期
char state[50]; //设备状态
}DEV;
int menu_list() //显示菜单
{
printf("---------实验设备管理系统---------\n");
printf("| 0.设备录入 |\n"); //Done
printf("| 1.设备输出 |\n"); //Done
printf("| 2.设备查询 |\n"); //Done
printf("| 3.设备修改 |\n"); //Done
printf("| 4.设备删除 |\n"); //Done
printf("| 5.设备增加 |\n"); //Done
printf("| 6.设备排序(按id) |\n"); //Done
printf("| 7.设备分类 |\n"); //Done
printf("| 8.设备统计 |\n"); //Done
printf("| 9.导出 |\n"); //Done
printf("| 10.导入 |\n"); //Done
printf("| 11.退出系统 |\n"); //Done
printf("----------------------------------\n");
int n;
printf("键入选择:");
scanf("%d",&n);
return n;
}
int enter_list(DEV dev[]) //设备录入
{
system ("cls"); //清除屏幕上的所有内容
int i,len;
printf("键入需要录入设备的个数:");
scanf("%d",&len);
printf("\n");
for ( i = 0; i < len; i++)
{
printf("设备名称:");
scanf("%s",dev[i].name);
printf("设备类型:");
scanf("%s",dev[i].type);
printf("设备id(6位):");
scanf("%s",dev[i].id);
printf("设备购买日期:");
scanf("%s",dev[i].date);
printf("设备状态:");
scanf("%s",dev[i].state);
printf("----------------------------------\n");
printf("\n");
}
system ("cls"); //清除屏幕上的所有内容
return len;
}
void show_list(DEV dev[],int len) //设备输出
{
system ("cls"); //清除屏幕上的所有内容
int i;
for ( i = 0; i < len; i++)
{
print(dev,i); //-----函数嵌套-----
}
system ("pause"); //系统中断
system ("cls");
}
void search_list(DEV dev[],int len) //设备查询
{
system ("cls");
char tar[50];
int i;
printf("输入设备id:");
scanf("%s",tar);
for ( i = 0; i < len; i++)
{
if (strcmp(tar,dev[i].id)==0)
{
printf("\n");
printf("-----找到设备-----\n");
print(dev,i);
break;
}
}
if (i>=len)
{
printf("-----找不到该设备-----\n");
}
system ("pause");
system ("cls");
}
void change_list_dev(DEV dev[],int len) //设备信息修改
{
system ("cls");
char tar[50];
int i;
printf("键入需要修改信息的设备id:");
scanf("%s",tar);
for ( i = 0; i < len; i++)
{
if (strcmp(tar,dev[i].id)==0)
{
printf("\n");
printf("-----找到设备-----\n");
printf("新的设备名称:");
scanf("%s",dev[i].name);
printf("新的设备类型:");
scanf("%s",dev[i].type);
printf("新的设备id(6位):");
scanf("%s",dev[i].id);
printf("新的设备购买日期:");
scanf("%s",dev[i].date);
printf("新的设备状态:");
scanf("%s",dev[i].state);
printf("-----设备信息修改成功-----\n");
printf("\n");
break;
}
}
if (i>=len)
{
printf("-----找不到该设备-----\n");
}
system ("pause");
system ("cls");
}
int del_list_dev(DEV dev[],int len) //删除设备
{
system ("cls");
printf("输入需要删除的设备的id:");
char tar[50];
char judge[5];
int i,flag=0;
scanf("%s",tar);
for ( i = 0; i < len; i++)
{
if (strcmp(tar,dev[i].id)==0)
{
printf("\n");
printf("-----找到设备-----\n");
print(dev,i); //-----函数嵌套-----
printf("确认删除(Y/S)?");
scanf("%s",judge);
int j;
if (strcmp(judge,"Y")==0)
{
for ( j = i; j < len-1; j++)
{
strcpy(dev[j].name,dev[j+1].name);
strcpy(dev[j].type,dev[j+1].type);
strcpy(dev[j].id,dev[j+1].id);
strcpy(dev[j].date,dev[j+1].date);
strcpy(dev[j].state,dev[j+1].state);
}
printf("-----设备删除成功-----\n");
}
--len;
flag=1;
break;
}
}
if (flag==0)
{
printf("-----找不到该设备-----\n");
}
system ("pause");
system ("cls");
return len;
}
int add_list_dev(DEV dev[],int len) //增加设备
{
system ("cls");
DEV temp;
printf("设备名称:");
scanf("%s",temp.name);
printf("设备类型:");
scanf("%s",temp.type);
printf("设备id(6位):");
scanf("%s",temp.id);
printf("设备购买日期:");
scanf("%s",temp.date);
printf("设备状态:");
scanf("%s",temp.state);
printf("\n");
printf("键入需要插入的位置(输入id):");
int pac=-1,i;
char tar[50];
scanf("%s",tar);
for ( i = 0; i < len; i++)
{
if (strcmp(tar,dev[i].id)==0)
{
pac=i;
break;
}
}
if (pac!=-1)
{
printf("-----找到目标设备位置-----\n");
for ( i = len; i >= pac; i--)
{
strcpy(dev[i].name,dev[i-1].name);
strcpy(dev[i].type,dev[i-1].type);
strcpy(dev[i].id,dev[i-1].id);
strcpy(dev[i].date,dev[i-1].date);
strcpy(dev[i].state,dev[i-1].state);
}
strcpy(dev[pac].name,temp.name);
strcpy(dev[pac].type,temp.type);
strcpy(dev[pac].id,temp.id);
strcpy(dev[pac].date,temp.date);
strcpy(dev[pac].state,temp.state);
printf("-----设备增加成功-----\n");
printf("\n");
}
else
{
printf("-----未找到目标设备位置-----\n");
printf("-----将增添至最后一位-----\n");
pac=len;
strcpy(dev[pac].name,temp.name);
strcpy(dev[pac].type,temp.type);
strcpy(dev[pac].id,temp.id);
strcpy(dev[pac].date,temp.date);
strcpy(dev[pac].state,temp.state);
printf("-----设备增加成功-----\n");
printf("\n");
}
++len;
system("pause");
system("cls");
return len;
}
void sort_list_dev(DEV dev[],int len) //设备排序
{
system ("cls");
int i,a;
DEV swap;
printf("-----设备排序将由id从小到大排序-----\n"); //冒泡排序
for ( a=0;a<len-1;a++)
{
for ( i = 0; i < len-1-i; i++)
{
if (strcmp(dev[i].id,dev[i+1].id)>0)
{
strcpy(swap.name,dev[i].name);
strcpy(swap.type,dev[i].type);
strcpy(swap.id,dev[i].id);
strcpy(swap.date,dev[i].date);
strcpy(swap.state,dev[i].state);
strcpy(dev[i].name,dev[i+1].name);
strcpy(dev[i].type,dev[i+1].type);
strcpy(dev[i].id,dev[i+1].id);
strcpy(dev[i].date,dev[i+1].date);
strcpy(dev[i].state,dev[i+1].state);
strcpy(dev[i+1].name,swap.name);
strcpy(dev[i+1].type,swap.type);
strcpy(dev[i+1].id,swap.id);
strcpy(dev[i+1].date,swap.date);
strcpy(dev[i+1].state,swap.state);
}
}
}
for ( i = 0; i < len; i++)
{
print(dev,i);//-----函数嵌套-----
}
system ("pause");
system ("cls");
}
void print(DEV dev[],int i) //批量输出
{
printf("设备名称:%s\n",dev[i].name);
printf("设备类型:%s\n",dev[i].type);
printf("设备id:%s\n",dev[i].id);
printf("设备购买日期:%s\n",dev[i].date);
printf("设备状态:%s\n",dev[i].state);
printf("----------------------------------\n");
}
void classify_list_dev(DEV dev[],int len) //设备分类
{
system ("cls");
char printer[50]={"打印机"};
char computer[50]={"电脑"};
char monitor[50]={"显示器"};
char earphone[50]={"耳机"};
int i;
printf("打印机组:\n");
int flag0=0;
for ( i = 0; i < len; i++)
{
if (strcmp(dev[i].type,printer)==0)
{
print(dev,i); //-----函数嵌套-----
flag0=1;
}
}
if (flag0==0)
{
printf("-----无设备-----\n");
}
printf("\n");
int flag1=0;
printf("电脑组:\n");
for ( i = 0; i < len; i++)
{
if (strcmp(dev[i].type,computer)==0)
{
print(dev,i); //-----函数嵌套-----
flag1=1;
}
}
if (flag1==0)
{
printf("-----无设备-----\n");
}
printf("\n");
int flag2=0;
printf("显示器组:\n");
for ( i = 0; i < len; i++)
{
if (strcmp(dev[i].type,monitor)==0)
{
print(dev,i); //-----函数嵌套-----
flag2=1;
}
}
if (flag2==0)
{
printf("-----无设备-----\n");
}
printf("\n");
int flag3=0;
printf("耳机组:\n");
for ( i = 0; i < len; i++)
{
if (strcmp(dev[i].type,earphone)==0)
{
print(dev,i); //-----函数嵌套-----
flag3=1;
}
}
if (flag3==0)
{
printf("-----无设备-----\n");
}
system ("pause");
system ("cls");
}
void sata_list(DEV dev[],int len) //设备统计
{
system ("cls");
int cnt0=0,cnt1=0;
int i;
printf("设备总数:%d\n",len);
for ( i = 0; i < len; i++)
{
if (strcmp(dev[i].state,"好")==0)
{
++cnt0;
}
}
for ( i = 0; i < len; i++)
{
if (strcmp(dev[i].state,"差")==0)
{
++cnt1;
}
}
printf("设备状态为良好的设备数:%d\n",cnt0);
printf("设备状态为差的设备数:%d\n",cnt1);
system ("pause");
system ("cls");
}
void write_list(DEV dev[],int len) //导出文件
{
int i;
system ("cls");
FILE *fp1;fp1=fopen("len.txt","w+");
fwrite(&len,sizeof(int),1,fp1);
FILE *fp;fp=fopen("data.txt","w+");
for ( i=0; i<len; i++)
{
fwrite(&dev[i],sizeof(DEV),1,fp);
}
fclose(fp);
fclose(fp1);
printf("-----导出成功-----\n");
system ("pause");
system ("cls");
}
int read_list(DEV dev[]) //导入文件
{
system("cls");
int i,len;
FILE *fp1;fp1=fopen("len.txt","r"); //-----使用指针-----
FILE *fp;fp=fopen("data.txt","r"); //-----使用指针-----
fread(&len,sizeof(int),1,fp1);
for ( i = 0; i < len; i++)
{
fread(&dev[i],sizeof(DEV),1,fp);
}
if (strcmp(dev[0].id,"0")!=0)
{
printf("-----文件导入成功-----\n");
}
else
{
printf("-----文件导入失败-----\n");
}
system ("pause");
system ("cls");
return len;
}
五.注意事项:
1.Id必须输入六位,不然在设备排序中会出现错误
设备类型有:打印机,电脑,显示器,耳机
设备状态有:好,坏
2.文件导出后必须输入11来退出程序,直接退出会导致len无法正确导出到len.txt