商品记录维护

练习目的:随机存取文件的建立、读取、记录删除和更新操作。

问题描述:有一家商店,为了查看店里有些什么商品、数量有多少以及每件商品的价格如何,需要编制一份商品目录。每种商品都包括4种属性:商品ID、商品名、数量与价格。商品ID为0—99之间的整数,每种商品的ID号互不相同,所以这里默认只有100种商品;商品名只包含大小写字母与空格,长度不超过35个字符;商品数量的范围是0—99999;商品的价格为一个非负的浮点数。

你要帮助商店设计一个二进制文件,存储该商店的所有商品情况。下表为该商店商品清单的样例。

 

记录号(商品ID)

商品名

数量

价格

5

Lamp

23

5.99

8

Screwdriver

9

7.99

10

Hammer

10

12.00

13

Bicycle

5

100.99

16

Optical mouse

21

11.50

25

keyboard

32

59.99

要求:

1.设计一个结构,来表示一件商品。

2.创建名为“commodity.dat”的二进制文件,存储该商店商品信息,初始化为100条空记录,用商品ID作为记录号。

3.实现对“commodity.dat”中商品信息的初始化录入。

4.根据商品记录号,实现对“commodity.dat”中商品信息的更新,其中记录号不可以更新,其他三项信息均可更新。

5.根据商品记录号,实现对“commodity.dat”中商品信息的删除。

6.实现对“commodity.dat”中全部商品信息的输出。

7.上述2~6项中对文件的初始化、单条商品记录的删除和更新、文件信息的输出这些功能,都分别定义成单独的函数。

  1 #include <stdio.h>
  2 #include<stdlib.h>
  3 /**
  4 @author tz
  5 @date 2019-04-11
  6 */ 
  7 typedef struct commodity {
  8     int id;
  9     char name[40];
 10     int number;
 11     float price;
 12     int key;
 13 } THING;
 14 void creatFile();//对文件初始化
 15 void entryFile();//录入信息
 16 void updateFile();//更新信息
 17 void deleteFile();//删除信息
 18 void printFile();//输出信息
 19 
 20 int main() {
 21     int key=8;
 22     while (key != 6) {
 23         printf("请输入您的选择:\n");
 24         printf("1--创建一个100条空记录的文件\n");
 25         printf("2--输入商品记录\n");
 26         printf("3--更新商品记录\n");
 27         printf("4--删除商品记录\n");
 28         printf("5--输出全部商品记录\n");
 29         printf("6--退出程序\n");
 30         printf("[选择]");
 31         scanf("%d", &key);
 32         switch (key) {
 33         case(1):
 34             creatFile();
 35             break;
 36         case(2):
 37             entryFile();
 38             break;
 39         case(3):
 40             updateFile();
 41             break;
 42         case(4):
 43             deleteFile();
 44             break;
 45         case(5):
 46             printFile();
 47             printf("\n");
 48             break;
 49         case(6):
 50             printf("程序运行结束,再见!\n\n");
 51             break;
 52         }
 53     }
 54     return 0;
 55 }
 56 
 57 //对文件初始化
 58 void creatFile() {
 59     THING record[100];
 60     int i;
 61     FILE* fptr = fopen("commodity.dat", "wb");
 62     if (fptr == NULL)
 63         exit(0);
 64     for ( i = 0; i < 100; i++) {
 65         record[i].id = i;
 66         *(record[i].name) = "";
 67         record[i].price = 0.0;
 68         record[i].number = 0;
 69         record[i].key = 0;
 70     }
 71     fwrite(record, sizeof(THING), 100, fptr);
 72     printf("100条空记录创建完毕\n\n");
 73     fclose(fptr);
 74 }
 75 //录入信息(循环)
 76 void entryFile() {
 77     THING client;
 78     FILE* fptr = fopen("commodity.dat", "rb+");
 79     if (fptr == NULL)
 80         exit(0);
 81     printf("请输入商品信息[ID为-1代表输入结束]:\n");
 82     printf("商品ID:");
 83     scanf("%d", &client.id);
 84     getchar();
 85     while (client.id != -1) {
 86         printf("商品名:");
 87         gets(client.name);
 88         printf("数量:");
 89         scanf("%d", &client.number);
 90         printf("价格:");
 91         scanf("%f", &client.price);
 92         client.key = 1;
 93         fseek(fptr, (client.id) * sizeof(THING), SEEK_SET);
 94         fwrite(&client, sizeof(THING), 1, fptr);
 95         printf("请输入商品信息[ID为-1代表输入结束]:\n");
 96         printf("商品ID:");
 97         scanf("%d", &client.id);
 98         getchar();
 99     }
100     printf("商品信息输入结束\n");
101     fclose(fptr);
102     printFile();
103     printf("\n");
104 }
105 
106 //更新信息
107 void updateFile() {
108     FILE* fptr ;
109     while (1) {
110         THING client = {0,"",0,0,0};
111         char lin[36] = "\0";
112         int num = 0;
113         float price = 0.0;
114         fptr = fopen("commodity.dat", "rb+");
115         if (fptr == NULL)
116             exit(0);
117         printf("请输入待更新商品ID[ID为-1代表结束更新]:\n");
118         scanf("%d", &client.id);
119         if (client.id == -1)
120             break;
121         //读出信息
122         fseek(fptr, (client.id) * sizeof(THING), SEEK_SET);
123         fread(&client, sizeof(THING), 1, fptr);
124         fclose(fptr);
125         if (client.key == 0)//判断此id对应的结构体是否被录入信息
126         {
127             printf("对不起,记录号为%d的商品不存在,无法更新\n", client.id);
128             continue;
129         }
130         //输出原信息
131         printf("原商品信息如下:\n");
132         printf("记录号(商品ID)        商品名                    数量        价格\n");
133         printf("%-25d%-40s%-15d%.2f\n", client.id, client.name, client.number, client.price);
134         printf("请输入更新信息[如某项不更新请直接按回车键]:\n");
135         //更改
136         getchar();
137         printf("商品名:");
138         gets(lin);
139         if (lin[0] != '\0')
140             strcpy(client.name, lin);
141 
142         printf("数量:");
143         gets(lin);
144         int i = 0, len = 1;
145         while (lin[i] != '\0') {
146             num = num * 10 + (lin[i] - '0');
147             len *= 10;
148             i++;
149         }
150         if(lin[0]!=0)
151             client.number = num;
152 
153         printf("价格:");
154         gets(lin);
155         num = 0;
156         i = 0;
157         len = 1;
158         while (lin[i] != '\0') {
159             if (lin[i] != '.')
160             {
161                 num = num * 10 + (lin[i] - '0');
162                 len *= 10;
163             }
164             i++;
165         }
166         if(lin[0]!=0)
167             client.price = num * 1.0 / 100;
168         
169         //输出更新后信息
170         printf("更新后商品信息如下:\n");
171         printf("记录号(商品ID)        商品名                    数量        价格\n");
172         printf("%-25d%-40s%-15d%.2f\n", client.id, client.name, client.number, client.price);
173 
174         fptr = fopen("commodity.dat", "rb+");
175         if (fptr == NULL)
176             exit(0);
177         fseek(fptr, (client.id) * sizeof(THING), SEEK_SET);
178         fwrite(&client, sizeof(THING), 1, fptr);
179         fclose(fptr);
180     }
181     
182     printf("更新工作结束\n\n");
183 }
184 
185 //删除信息
186 void deleteFile() {
187     FILE* fptr;
188     char lin;
189     while (1) {
190         THING client = { 0,"",0,0,0 };
191         THING emptydity = { 0,"",0,0,0 };
192         fptr = fopen("commodity.dat", "rb+");
193         if (fptr == NULL)
194             exit(0);
195         printf("请输入待删除商品ID[ID为-1代表结束删除]:\n");
196         scanf("%d", &client.id);
197         getchar();
198         if (client.id == -1)
199             break;
200         emptydity.id = client.id;
201         fseek(fptr, (client.id) * sizeof(THING), SEEK_SET);
202         fread(&client, sizeof(THING), 1, fptr);
203         fclose(fptr);
204         if (client.key == 0)//判断此id对应的结构体是否被录入信息
205         {
206             printf("对不起,记录号为%d的商品不存在,无法进行删除操作\n", client.id);
207             continue;
208         }
209 
210         //输出原信息
211         printf("该商品信息如下:\n");
212         printf("记录号(商品ID)        商品名                    数量        价格\n");
213         printf("%-25d%-40s%-15d%.2f\n", client.id, client.name, client.number, client.price);
214 
215         printf("是否确实删除(确认按Y,取消按N)?\n");
216         lin=getchar();
217         if (lin == 'N')
218         {
219             printf("您选择不删除记录号为%d的商品\n", client.id);
220         }
221         else
222         {//用空链表代替原本的
223             fptr = fopen("commodity.dat", "rb+");
224             if (fptr == NULL)
225                 exit(0);
226             fseek(fptr, (client.id) * sizeof(THING), SEEK_SET);
227             fwrite(&emptydity, sizeof(THING), 1, fptr);
228             fclose(fptr);
229             printf("记录号为%d的商品成功删除\n", client.id);
230         }
231         printFile();
232     }
233     printf("删除工作结束\n\n");
234 }
235 
236 //输出信息
237 void printFile() {
238     FILE*fptr = fopen("commodity.dat", "rb+");
239     if (fptr == NULL)
240         exit(0);
241     THING comdity[10];
242     fread(comdity, sizeof(THING), 10, fptr);
243     printf("商品信息如下:\n");
244     printf("记录号(商品ID)        商品名                    数量        价格\n");
245     //每次读出10个,依次遍历完文件
246     int i,j;
247     for ( j = 10; j <= 100; j+=10) {
248         for ( i = 0; i < 10; i++)
249         {
250             if (comdity[i].key == 1)
251                 printf("%-25d%-40s%-15d%.2f\n", comdity[i].id, comdity[i].name, comdity[i].number, comdity[i].price);
252 
253         }
254         fseek(fptr, (j) * sizeof(THING), SEEK_SET);
255         fread(comdity, sizeof(THING), 10, fptr);
256     }
257     fclose(fptr);
258 }

 

程序运行效果:

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出全部商品记录

6--退出程序

[选择]1↙

100条空记录创建完毕

 

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出全部商品记录

6--退出程序

[选择]2↙

请输入商品信息[ID为-1代表输入结束]:

商品ID:5↙         

商品名:Lamp↙

数量:23↙

价格:5.99↙

请输入商品信息[ID为-1代表输入结束]:

商品ID: 8↙                    

商品名:Screwdriver↙

数量:9↙

价格:7.99↙

请输入商品信息[ID为-1代表输入结束]:

商品ID: 10↙               

商品名:Hammer↙

数量:10↙

价格:12.00↙

请输入商品信息[ID为-1代表输入结束]:

-1↙

商品信息输入结束

商品信息如下:

记录号(商品ID)    商品名        数量  价格

5                   Lamp          23    5.99

8                   Screwdriver    9    7.99

10                  Hammer        10    12.00

 

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出全部商品记录

6--退出程序

[选择]3↙

请输入待更新商品ID[ID为-1代表结束更新]:

8↙

原商品信息如下:

记录号(商品ID)    商品名          数量    价格

8                   Screwdriver     9       7.99

请输入更新信息[如某项不更新请直接按回车键]:

商品名:↙

数量:7↙

价格:9.99↙

更新后商品信息如下:

记录号(商品ID)    商品名          数量    价格

8                   Screwdriver     7       9.99

请输入待更新商品ID[ID为-1代表结束更新]:

15↙

对不起,记录号为15的商品不存在,无法更新

请输入待更新商品ID[记录号为-1代表结束更新]:

-1↙

更新工作结束

 

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出全部商品记录

6--退出程序

[选择]4↙

请输入待删除商品ID[记录号为-1代表结束删除]:

8↙

该商品信息如下:

记录号(商品ID)    商品名          数量    价格

8                   Screwdriver     7       9.99

是否确实删除(确认按Y,取消按N)?

Y↙

记录号为8的商品成功删除

商品信息如下:

记录号(商品ID)    商品名          数量    价格

5                   Lamp            23      5.99

10                  Hammer          10      12.00

请输入待删除商品ID[记录号为-1代表结束删除]:

10↙

该商品信息如下:

记录号(商品ID)    商品名          数量    价格

10                  Hammer          10      12.00

是否确实删除(确认按Y,取消按N)?

N↙

您选择不删除记录号为10的商品

商品信息如下:

记录号(商品ID)    商品名          数量    价格

5                   Lamp            23      5.99

10                  Hammer          10      12.00

请输入待删除商品ID[记录号为-1代表结束删除]:

8↙

对不起,记录号为8的商品不存在,无法进行删除操作

请输入待删除商品ID[记录号为-1代表结束删除]:

-1↙

删除工作结束

 

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出全部商品记录

6--退出程序

[选择]5↙

商品信息如下:

记录号(商品ID)    商品名          数量    价格

5                   Lamp            23      5.99

10                  Hammer          10      12.00

 

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出全部商品记录

6--退出程序

[选择]6↙

程序运行结束,再见!

posted @ 2020-04-22 19:21  简单记录一下咯  阅读(448)  评论(0)    收藏  举报