1、设计题目:设备管理程序设计。 2、设计内容及要求: (1)进行需求分析,规划设计。 (2)进行界面设计和相关数据表(包括:设备编号、设备种类、设备名称、设备价格、设备购入日期、是否报废等信息)的设计。 (3)实现对设备信息的数据录入、删除、修改、显示、插入、查找、排序以及数据保存等功能。 要求 1、用C语言程序设计方法进行应用程序的开发,综合运用数组、结构体、函数、文件的知识实现功能。
#ifndef _DEVICE_H_ #define _DEVICE_H_ typedef struct EquInfo //定义结构体 { char equipCode[10]; //编号 char equipType[20]; //种类 char equipName[20]; //名称 float equipPrice; //价格 char buyDate[20]; //购买日期 int scrap; //是否报废 int cut; //是否删除 } EquInfo; /*添加模块*/ void addition(); /*修改模块*/ void modifty(); //显示模块 void show(); //删除 void delete(); /*搜索模块*/ void search(); //排序显示菜单 void menu(); //排序 void sort(EquInfo *pst, int n, int m); //插入 void insert(); #endif
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdlib.h> #include "device.h" #define SIZE 100 //清空输入 void Dstdin(); void Dstdin() { while (getchar() != '\n') continue; } /*********************添加模块*****************************/ void addition() /*添加模块*/ { EquInfo news[SIZE]; EquInfo temp; int i, j; int count; FILE *fp; errno_t err; if ((err = fopen_s(&fp, "swy.txt", "a+")) != 0) { fputs("错误: 无法创建数据文件, 返回主菜单.\n", stderr); system("pause"); return; } for (count = 0; !feof(fp); count++) //从文件头一个一个的读取字符,读到文件的结尾。 { fscanf_s(fp, "%s %s %s %f %s %d %d ", temp.equipCode, 10, temp.equipType, 20, temp.equipName, 20, &temp.equipPrice, temp.buyDate, 20, &temp.scrap, &temp.cut); } system("cls"); if (count == SIZE) { fputs("错误: 文件已满, 请先删除后添加, 返回主菜单.\n", stderr); fclose(fp); system("pause"); return; } printf("**********************************************************\n"); printf("添加设备[1-%d]\n", SIZE - count); printf("请输入添加多少个设备[q退出]:\n"); printf("**********************************************************\n"); while (scanf_s("%d", &i)==1) { if (i<1 || i>SIZE - count) { printf("错误: 请输入1-%d\n", SIZE - count); continue; } for (j = 0; j < i; j++) { printf("------------------\n"); printf("输入设备编号\n"); scanf_s("%s", news[j].equipCode, 10); printf("输入设备种类\n"); scanf_s("%s", news[j].equipType, 20); printf("输入设备名称\n"); scanf_s("%s", news[j].equipName, 20); printf("输入设备价格\n"); scanf_s("%f", &news[j].equipPrice); printf("输入购买日期\n"); scanf_s("%s", news[j].buyDate, 20); printf("是否报废,0/1\n"); scanf_s("%d", &news[j].scrap); news[j].cut = 1; } for (j = 0; j < i; j++) { fprintf(fp, "%s %s %s %f %s %d %d \n", news[j].equipCode, news[j].equipType, news[j].equipName, news[j].equipPrice, news[j].buyDate, news[j].scrap, news[j].cut); } count += i; system("pause"); system("cls"); if (count == SIZE) { fputs("错误: 文件已满, 请先删除后添加, 返回主菜单.\n", stderr); fclose(fp); system("pause"); return; } printf("**********************************************************\n"); printf("添加设备[1-%d]\n", SIZE - count); printf("请输入添加多少个设备[q退出]:\n"); printf("**********************************************************\n"); } Dstdin(); fclose(fp); } /*******************************修改模块*********************/ void modifty() /*修改模块*/ { EquInfo equ[SIZE]; int num; int count = 0; int i, j; errno_t err; FILE *fp; system("cls"); if ((err = fopen_s(&fp, "swy.txt", "r")) != 0) { fputs("错误: 没有数据文件, 请先添加数据, 返回主菜单.\n", stderr); system("pause"); return; } for (i = 0; !feof(fp); i++) //从文件头一个一个的读取字符,读到文件的结尾。 { fscanf_s(fp, "%s %s %s %f %s %d %d ", equ[i].equipCode, 10, equ[i].equipType, 20, equ[i].equipName, 20, &equ[i].equipPrice, equ[i].buyDate, 20, &equ[i].scrap, &equ[i].cut); } printf("序号 设备编号 设备种类 设备名称 设备价格 购买日期 是否报废\n"); for (j = 0; j < i; j++) { printf("%-4d %-10s %-10s %-10s %-10g %-10s %-10d \n", j + 1, equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap); } printf("请输入要修改的设备序号[q退出]: "); while (scanf_s("%d", &num) == 1) { if (num<1 || num>i) { printf("错误: 请输入1-%d\n", i); continue; } printf("*************************\n"); printf("输入新设备编号\n"); scanf_s("%s", equ[num - 1].equipCode, 10); printf("输入新设备种类\n"); scanf_s("%s", equ[num - 1].equipType, 20); printf("输入新设备名称\n"); scanf_s("%s", equ[num - 1].equipName, 20); printf("输入新设备价格\n"); scanf_s("%f", &equ[num - 1].equipPrice); printf("输入新购买日期\n"); scanf_s("%s", equ[num - 1].buyDate, 20); printf("输入新是否报废,0/1\n"); scanf_s("%d", &equ[num - 1].scrap); equ[num - 1].cut = 1; printf("*************************\n"); count++; system("cls"); printf("序号 设备编号 设备种类 设备名称 设备价格 购买日期 是否报废\n"); for (j = 0; j < i; j++) { printf("%-4d %-10s %-10s %-10s %-10g %-10s %-10d \n", j + 1, equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap); } printf("请输入要修改的设备序号[q退出]: "); } fclose(fp); Dstdin(); if (count > 0) { puts("提示: 写入数据中..."); if ((err = fopen_s(&fp, "swy.txt", "w")) != 0) { fputs("错误: 无法创建数据文件, 返回主菜单.\n", stderr); system("pause"); return; } for (j = 0; j < i; j++) { fprintf(fp, "%s %s %s %f %s %d %d \n", equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap, equ[j].cut); } puts("提示: 写入完成, 返回主菜单."); fclose(fp); system("pause"); return; } else { puts("提示: 您没有任何删除操作, 返回主菜单."); system("pause"); return; } } void show()//显示模块 { EquInfo equ[SIZE]; EquInfo temp[SIZE]; int i, j; int num; int save; FILE *fp; errno_t err; system("cls"); if ((err = fopen_s(&fp, "swy.txt", "r")) != 0) { fputs("错误: 没有数据文件, 请先添加数据, 返回主菜单.\n", stderr); system("pause"); return; } for (i = 0; !feof(fp); i++) { fscanf_s(fp, "%s %s %s %f %s %d %d ", equ[i].equipCode, 10, equ[i].equipType, 20, equ[i].equipName, 20, &equ[i].equipPrice, equ[i].buyDate, 20, &equ[i].scrap, &equ[i].cut); } memmove(&temp[0], &equ[0], i * sizeof(EquInfo)); menu(); while (scanf_s("%d", &num) == 1) { if (num < 1 || num>7) { puts("错误: 请输入1-7"); continue; } switch (num) { case 1: printf("序号 设备编号 设备种类 设备名称 设备价格 购买日期 是否报废\n"); for (j = 0; j < i; j++) { printf("%-4d %-10s %-10s %-10s %-10g %-10s %-10d \n", j + 1, equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap); } break; case 2: sort(&temp[0], i, num); break; case 3: sort(&temp[0], i, num); break; case 4: sort(&temp[0], i, num); break; case 5: sort(&temp[0], i, num); break; case 6: sort(&temp[0], i, num); break; case 7: sort(&temp[0], i, num); break; default: break; } if (num > 1) { printf("序号 设备编号 设备种类 设备名称 设备价格 购买日期 是否报废\n"); for (j = 0; j < i; j++) { printf("%-4d %-10s %-10s %-10s %-10g %-10s %-10d \n", j + 1, temp[j].equipCode, temp[j].equipType, temp[j].equipName, temp[j].equipPrice, temp[j].buyDate, temp[j].scrap); } } if (num > 1) { puts("\n提示: 是否要保存排序后的数据, 写入文件."); puts("1. 保存 \t2. 不保存"); scanf_s("%d", &save); if (save == 1) { fclose(fp); puts("提示: 写入数据中..."); if ((err = fopen_s(&fp, "swy.txt", "w")) != 0) { fputs("错误: 无法创建数据文件, 返回主菜单.\n", stderr); system("pause"); return; } for (j = 0; j < i; j++) { fprintf(fp, "%s %s %s %f %s %d %d \n", temp[j].equipCode, temp[j].equipType, temp[j].equipName, temp[j].equipPrice, temp[j].buyDate, temp[j].scrap, temp[j].cut); } fclose(fp); puts("提示: 写入完成, 返回菜单."); if ((err = fopen_s(&fp, "swy.txt", "r")) != 0) { fputs("错误: 没有数据文件, 请先添加数据, 返回主菜单.\n", stderr); system("pause"); return; } for (i = 0; !feof(fp); i++) { fscanf_s(fp, "%s %s %s %f %s %d %d ", equ[i].equipCode, 10, equ[i].equipType, 20, equ[i].equipName, 20, &equ[i].equipPrice, equ[i].buyDate, 20, &equ[i].scrap, &equ[i].cut); } } } system("pause"); system("cls"); menu(); } Dstdin(); fclose(fp); } /***********************************搜索模块******************************/ void search() /*搜索模块*/ { char code[10]; char name[20]; float price; int choice; FILE *fp; EquInfo equ[SIZE]; int i, j; int count; char type[20]; char date[20]; errno_t err; system("cls"); if ((err = fopen_s(&fp, "swy.txt", "r")) != 0) { fputs("错误: 没有数据文件, 请先添加数据, 返回主菜单.\n", stderr); system("pause"); return; } for (i = 0; !feof(fp); i++) { fscanf_s(fp, "%s %s %s %f %s %d %d ", equ[i].equipCode, 10, equ[i].equipType, 20, equ[i].equipName, 20, &equ[i].equipPrice, equ[i].buyDate, 20, &equ[i].scrap, &equ[i].cut); } printf("***************选一种方式搜索***************\n"); printf("1. 设备编号搜索 \t2. 设备种类搜索\n"); printf("3. 设备名称搜索 \t4. 设备价格搜索\n"); puts("5. 设备购入日期 \tq. 退出"); puts("********************************************"); printf("请输入号码 1-5:"); while (scanf_s("%d", &choice) == 1) { if (choice < 1 || choice>5) { puts("错误: 请输入1-5"); continue; } switch (choice) { case 1: printf("请输入设备编号:\n"); scanf_s("%s", code, 10); for (j = 0, count = 0; j < i; j++) { if (strcmp(equ[j].equipCode, code) == 0) { if (count == 0) { puts("****************************************************************"); printf("设备编号 设备种类 设备名称 设备价格 购买日期 是否报废\n"); } printf("%-10s %-10s %-10s %-10g %-10s %-10d\n", equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap); count++; } } if (count == 0) { puts("查找结果: 未找到"); } else puts("****************************************************************"); break; case 2: printf("请输入设备种类:\n"); scanf_s("%s", type, 20); for (j = 0, count = 0; j < i; j++) { if (strcmp(equ[j].equipType, type) == 0) { if (count == 0) { puts("****************************************************************"); printf("设备编号 设备种类 设备名称 设备价格 购买日期 是否报废\n"); } printf("%-10s %-10s %-10s %-10g %-10s %-10d\n", equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap); count++; } } if (count == 0) { puts("查找结果: 未找到"); } else puts("****************************************************************"); break; case 3: printf("请输入设备名称:\n"); scanf_s("%s", name, 20); for (j = 0, count = 0; j < i; j++) { if (strcmp(equ[j].equipName, name) == 0) { if (count == 0) { puts("****************************************************************"); printf("设备编号 设备种类 设备名称 设备价格 购买日期 是否报废\n"); } printf("%-10s %-10s %-10s %-10g %-10s %-10d\n", equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap); count++; } } if (count == 0) { puts("查找结果: 未找到"); } else puts("****************************************************************"); break; case 4: printf("请输入设备价格:\n"); scanf_s("%f", &price); for (j = 0, count = 0; j < i; j++) { if (equ[j].equipPrice == price) { if (count == 0) { puts("****************************************************************"); printf("设备编号 设备种类 设备名称 设备价格 购买日期 是否报废\n"); } printf("%-10s %-10s %-10s %-10g %-10s %-10d\n", equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap); count++; } } if (count == 0) { puts("查找结果: 未找到"); } else puts("****************************************************************"); break; case 5: printf("请输入设备购入日期:\n"); scanf_s("%s", date, 20); for (j = 0, count = 0; j < i; j++) { if (strcmp(equ[j].buyDate, date) == 0) { if (count == 0) { puts("****************************************************************"); printf("设备编号 设备种类 设备名称 设备价格 购买日期 是否报废\n"); } printf("%-10s %-10s %-10s %-10g %-10s %-10d\n", equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap); count++; } } if (count == 0) { puts("查找结果: 未找到"); } else puts("****************************************************************"); break; } system("pause"); system("cls"); printf("***************选一种方式搜索***************\n"); printf("1. 设备编号搜索 \t2. 设备种类搜索\n"); printf("3. 设备名称搜索 \t4. 设备价格搜索\n"); puts("5. 设备购入日期 \tq. 退出"); puts("********************************************"); printf("请输入号码 1-5:"); } Dstdin(); fclose(fp); } //删除 void delete() { EquInfo equ[SIZE]; int i, j; FILE *fp; int num; int count = 0; errno_t err; system("cls"); if ((err = fopen_s(&fp, "swy.txt", "r")) != 0) { fputs("错误: 没有数据文件, 请先添加数据, 返回主菜单.\n", stderr); system("pause"); return; } for (i = 0; !feof(fp); i++) { fscanf_s(fp, "%s %s %s %f %s %d %d ", equ[i].equipCode, 10, equ[i].equipType, 20, equ[i].equipName, 20, &equ[i].equipPrice, equ[i].buyDate, 20, &equ[i].scrap, &equ[i].cut); } printf("序号 设备编号 设备种类 设备名称 设备价格 购买日期 是否报废 是否删除\n"); for (j = 0; j < i; j++) { if (equ[j].cut == 1) printf("%-4d %-10s %-10s %-10s %-10g %-10s %-10d 保留\n", j + 1, equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap); else printf("%-4d %-10s %-10s %-10s %-10g %-10s %-10d 删除\n", j + 1, equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap); } puts("请选择你要删除的项, 重复选择保留与删除切换[q退出]:"); while (scanf_s("%d", &num) == 1) { if (num<1 || num>i) { printf("错误: 请重新输入1-%d\n", i); continue; } system("cls"); if (equ[num - 1].cut == 1) equ[num - 1].cut = 0; else equ[num - 1].cut = 1; printf("序号 设备编号 设备种类 设备名称 设备价格 购买日期 是否报废 是否删除\n"); for (j = 0; j < i; j++) { if (equ[j].cut == 1) printf("%-4d %-10s %-10s %-10s %-10g %-10s %-10d 保留\n", j + 1, equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap); else printf("%-4d %-10s %-10s %-10s %-10g %-10s %-10d 删除\n", j + 1, equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap); } count++; puts("请选择你要删除的项, 重复选择保留与删除切换[q退出]:"); } Dstdin(); fclose(fp); if (count > 0) { puts("提示: 写入数据中..."); if ((err = fopen_s(&fp, "swy.txt", "w")) != 0) { fputs("错误: 无法创建数据文件, 返回主菜单.\n", stderr); system("pause"); return; } for (j = 0; j < i; j++) { if (equ[j].cut == 1) fprintf(fp, "%s %s %s %f %s %d %d \n", equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap, equ[j].cut); } fclose(fp); puts("提示: 写入完成, 返回主菜单."); system("pause"); return; } else { puts("提示: 您没有任何删除操作, 返回主菜单."); system("pause"); return; } } //排序显示菜单 void menu() { puts("********************显示菜单********************"); puts("1. 默认排序显示 \t2. 设备编号升序显示"); puts("3. 设备种类升序显示 \t4. 设备名称升序显示"); puts("5. 设备价格升序显示 \t6. 设备购入日期升序显示"); puts("7. 设备报废升序显示 \tq. 退出"); puts("************************************************"); } //排序 void sort(EquInfo *pst, int n, int m) { EquInfo temp; int i, j; if (m == 2) { for (i = 0; i < n; i++) { for (j = i; j < n; j++) { if (strcmp(pst[i].equipCode, pst[j].equipCode) > 0) { temp = pst[i]; pst[i] = pst[j]; pst[j] = temp; } } } } else if (m == 3) { for (i = 0; i < n; i++) { for (j = i; j < n; j++) { if (strcmp(pst[i].equipType, pst[j].equipType) > 0) { temp = pst[i]; pst[i] = pst[j]; pst[j] = temp; } } } } else if (m == 4) { for (i = 0; i < n; i++) { for (j = i; j < n; j++) { if (strcmp(pst[i].equipName, pst[j].equipName) > 0) { temp = pst[i]; pst[i] = pst[j]; pst[j] = temp; } } } } else if (m == 5) { for (i = 0; i < n; i++) { for (j = i; j < n; j++) { if (pst[i].equipPrice > pst[j].equipPrice) { temp = pst[i]; pst[i] = pst[j]; pst[j] = temp; } } } } else if (m == 6) { for (i = 0; i < n; i++) { for (j = i; j < n; j++) { if (strcmp(pst[i].buyDate, pst[j].buyDate) > 0) { temp = pst[i]; pst[i] = pst[j]; pst[j] = temp; } } } } else if (m == 7) { for (i = 0; i < n; i++) { for (j = i; j < n; j++) { if (pst[i].scrap > pst[j].scrap) { temp = pst[i]; pst[i] = pst[j]; pst[j] = temp; } } } } } //插入 void insert() { EquInfo equ[SIZE]; EquInfo temp; int num; int count = 0; int i, j; errno_t err; FILE *fp; system("cls"); if ((err = fopen_s(&fp, "swy.txt", "r")) != 0) { fputs("错误: 没有数据文件, 请先添加数据, 返回主菜单.\n", stderr); system("pause"); return; } for (i = 0; !feof(fp); i++) //从文件头一个一个的读取字符,读到文件的结尾。 { fscanf_s(fp, "%s %s %s %f %s %d %d ", equ[i].equipCode, 10, equ[i].equipType, 20, equ[i].equipName, 20, &equ[i].equipPrice, equ[i].buyDate, 20, &equ[i].scrap, &equ[i].cut); } if (i == SIZE) { fputs("错误: 文件已满, 请先删除后添加, 返回主菜单.", stderr); fclose(fp); system("pause"); return; } printf("序号 设备编号 设备种类 设备名称 设备价格 购买日期 是否报废\n"); for (j = 0; j < i; j++) { printf("%-4d %-10s %-10s %-10s %-10g %-10s %-10d \n", j + 1, equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap); } printf("***************************************************************************\n"); puts("提示: 插入到输入的序号后面"); printf("请输入要插入的设备序号[q退出]: "); while (scanf_s("%d", &num) == 1) { if (num<1 || num>i) { printf("错误: 请输入1-%d\n", i); continue; } printf("*************************\n"); printf("输入新设备编号\n"); scanf_s("%s", temp.equipCode, 10); printf("输入新设备种类\n"); scanf_s("%s", temp.equipType, 20); printf("输入新设备名称\n"); scanf_s("%s", temp.equipName, 20); printf("输入新设备价格\n"); scanf_s("%f", &temp.equipPrice); printf("输入新购买日期\n"); scanf_s("%s", temp.buyDate, 20); printf("输入新是否报废,0/1\n"); scanf_s("%d", &temp.scrap); temp.cut = 1; printf("*************************\n"); count++; if (num < i) { memmove(&equ[num + 1], &equ[num], (i - num) * sizeof(EquInfo)); } equ[num] = temp; i++; system("cls"); if (i == SIZE) { fputs("错误: 文件已满, 请先删除后添加, 返回主菜单.\n", stderr); fclose(fp); system("pause"); return; } printf("序号 设备编号 设备种类 设备名称 设备价格 购买日期 是否报废\n"); for (j = 0; j < i; j++) { printf("%-4d %-10s %-10s %-10s %-10g %-10s %-10d \n", j + 1, equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap); } printf("***************************************************************************\n"); puts("提示: 插入到输入的序号后面"); printf("请输入要插入的设备序号[q退出]: "); } fclose(fp); Dstdin(); if (count > 0) { puts("提示: 写入数据中..."); if ((err = fopen_s(&fp, "swy.txt", "w")) != 0) { fputs("错误: 无法创建数据文件, 返回主菜单.\n", stderr); system("pause"); return; } for (j = 0; j < i; j++) { fprintf(fp, "%s %s %s %f %s %d %d \n", equ[j].equipCode, equ[j].equipType, equ[j].equipName, equ[j].equipPrice, equ[j].buyDate, equ[j].scrap, equ[j].cut); } puts("提示: 写入完成, 返回主菜单."); fclose(fp); system("pause"); return; } else { puts("提示: 您没有任何删除操作, 返回主菜单."); system("pause"); return; } }
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "device.h" void main() { int n, w, t; for (t = 0; t < 2; t++) { do { system("cls"); puts("**************************MENU***************************\n"); puts("** 0. 添加设备信息 **\n"); puts("** 1. 修改设备信息 **\n"); puts("** 2. 排序显示信息 **\n"); puts("** 3. 搜索设备信息 **\n"); puts("** 4. 插入设备信息 **\n"); puts("** 5. 删除设备信息 **\n"); puts("** 6. 退出管理系统 **\n"); puts("*********************************************************\n"); printf("你想做什么,(0-6):"); scanf_s("%d", &n); if (n<0 || n>6) /*对选择的数字作出判断*/ { w = 1; getchar(); } else w = 0; } while (w == 1); switch (n) { case 0: addition(); //添加 t = 0; break; case 1: modifty(); //修改 t = 0; break; case 2: show(); //显示 t = 0; break; case 3: search(); //搜索 t = 0; break; case 4: insert(); //插入 t = 0; break; case 5: delete(); //删除 t = 0; break; case 6: exit(0); /*退出*/ } } }