1 /* 1、预处理命令及函数变量 */
2
3 #include<stdio.h>
4 #include<stdlib.h>
5 #include<string.h>
6 #include<conio.h>
7 #include<math.h>
8 #define MAX 100
9
10 typedef struct custstock { //用户账户数据
11 char StockCode[6]; //股票代码
12 char StockName[30]; //股票名称
13 long StockVal; //拥有股票数
14 }CustStock;
15
16 typedef struct custom { //已注册用户数据
17 char CustomerName[20]; //用户名
18 char PassWord[6]; //密码
19 }Customer;
20
21 typedef struct stock { //股票数据
22 char StockCode[6]; //股票代码
23 char StockName[30]; //股票名称
24 long StockVol; //总股数
25 long StockAva; //可交易股数
26 long StockNum; //股票数
27 char chChoice; //股票操作选择
28 }Stock;
29
30 int NUM;
31
32 void Login(char *,char *,Customer *);
33 void Register(Customer *);
34 void Interface_CustOperation(Customer *);
35 void Interface_StockExchange(Stock *);
36 void Display_StockMarket(Stock *);
37 void Menu_Choice(Stock *);
38 void InitCustData(Customer *);
39 void Buy(Customer *);
40 void Sell(Customer *);
41 void View(Customer *);
42 void Input_Stock();
43 void Input_NewStock(Stock *);
44
45 /* 2、主函数 */
46
47 void main()
48 {
49 char chChoice;
50 Stock straSto[MAX],strTemp;
51 system("cls");
52 printf("\n\n\n\t\t********************股票交易平台********************\n\n");
53 printf("\n\n\n\t\t需要更新股票信息吗?(y|Y--yes n|N--no)");
54 scanf("%c",&chChoice);
55 if('y'==chChoice||'Y'==chChoice)
56 Input_Stock(); //输入股票信息
57 Interface_StockExchange(&strTemp); //股票交易平台
58 }
59
60 /* 3、输入股票信息 */
61
62 void Input_Stock() //输入股票信息
63 {
64 FILE * fpData;
65 int nNum;
66 Stock straSto[MAX],strTemp;
67 printf("\n\t\t输入股票数:");
68 scanf("%d",&NUM);
69 if((fpData=fopen("Stock_File.dat","wb"))==NULL)
70 {
71 printf("FILE ERROR\n");
72 exit(0);
73 }
74 fwrite(&NUM,sizeof(NUM),1,fpData);
75 for(nNum=0;nNum<NUM;nNum++)
76 { //输入股票数据
77 Input_NewStock(&straSto[nNum]);
78 fwrite(&straSto[nNum],sizeof(straSto[nNum]),1,fpData);
79 }
80 fclose(fpData);
81 }
82 void Input_NewStock(Stock * a) //输入股票数据
83 {
84 system("cls");
85 getchar();
86 printf("\n\t\t请输入股票代码(字符个数<= 6:)");
87 gets(a->StockCode);
88 printf("\n\t\t请输入股票名称:");
89 gets(a->StockName);
90 printf("\n\t\t请输入股票总数:");
91 scanf("%ld",&a->StockVol);
92 a->StockAva=a->StockVol; //初始化可交易的股票数
93 a->StockNum++;
94 }
95
96 /* 4、股票交易平台主界面 */
97
98 void Interface_StockExchange(Stock * a) //股票交易平台
99 {
100 system("cls");
101 printf("\n\n\n\t\t*************************欢迎进入股票交易平台*******************\n\n");
102 printf("\t\t\t显示股票情况 [v]\n");
103 printf("\t\t\t老用户登录 [l]\n");
104 printf("\t\t\t新用户注册 [r]\n");
105 printf("\t\t\t退出交易系统 [q]\n");
106 printf("\n\n\t\t\t请选择:");
107 scanf("%c",&a->chChoice);
108 if(a->chChoice!='q'&&a->chChoice!='v'&&a->chChoice!='l'&&a->chChoice!='r')
109 {
110 system("cls");
111 Interface_StockExchange(a); //股票交易平台
112 }
113 else
114 Menu_Choice(a); //执行相关选择
115 }
116
117 /* 5、股票平台操作 */
118
119 void Menu_Choice(Stock * a) //执行相关选择
120 {
121 int nNum;
122 FILE * fpCust,*fpData;
123 Stock strTemp,straCust[MAX];
124 Customer strCust;
125 char CustomerName[20],PassWord[6];
126 switch(a->chChoice)
127 {
128 case 'v': //显示股票情况
129 system("cls");
130 printf("\n\n\n\t********************股票信息*****************\n\n\n");
131 printf("\t\t 股票名称 股票代码 总股数 可交易的股数\n\n");
132 if((fpData=fopen("Stock_File.dat","rb"))==NULL)
133 {
134 printf("FILE ERROR!\n");
135 exit(0);
136 }
137 fread(&NUM,sizeof(NUM),1,fpData);
138 for(nNum=0;nNum<NUM;nNum++)
139 fread(&straCust[nNum],sizeof(straCust[nNum]),1,fpData);
140 fclose(fpData);
141 for(nNum=0;nNum<NUM;nNum++)
142 Display_StockMarket(&straCust[nNum]); //显示股票信息
143 getch();
144 Interface_StockExchange(&strTemp); //返回股票交易平台
145 case 'l':
146 system("cls");
147 printf("\n\n\n\t********************用户登录*****************\n\n\n");
148 printf("\t\t\t 用户名:");
149 scanf("%s",CustomerName);
150 printf("\n\t\t\t 密码:");
151 scanf("%s",PassWord);
152 getchar();
153 Login(CustomerName,PassWord,&strCust); //用户登录
154 Interface_StockExchange(&strTemp); //返回股票交易平台
155 case 'r':
156 system("cls");
157 printf("\n\n\n\t********************用户注册*****************\n\n\n");
158 Register(&strCust);
159 if((fpCust=fopen("customer.dat","ab"))==NULL)
160 {
161 printf("FILE ERROR!\n");
162 exit(0);
163 }
164 fwrite(&strCust,sizeof(strCust),1,fpCust);
165 fclose(fpCust);
166 InitCustData(&strCust); //初始化新用户注册用户库
167 Interface_StockExchange(&strTemp); //返回股票交易平台
168 case 'q':
169 system("cls");
170 printf("\n\n\n\n\n\n\t\t 谢谢使用股票交易平台\n\n");
171 printf("\t\t 再 见\n\n");
172 getchar();
173 getchar();
174 exit(0);
175 }
176 }
177
178 /* 6、显示股票信息 */
179
180 void Display_StockMarket(Stock * a) //显示股票信息
181 {
182 printf("\n\t\t%-12s%-10s%-10ld%-10ld\n",a->StockName,a->StockCode,a->StockVol,a->StockAva);
183 }
184
185 /* 7、用户登录 */
186
187 void Login(char * name,char * password,Customer * a)
188 {
189 FILE * fp;
190 int Flag;
191 if((fp=fopen("customer.dat","rb"))==NULL)
192 {
193 printf("Read File error!\n");
194 exit(1);
195 }
196 while(!feof(fp)) //查看用户库中的信息
197 {
198 Flag=fread(a,sizeof(Customer),1,fp);
199 if(Flag!=1)
200 {
201 printf("\n\n\t\t 该用户还未注册!\n");
202 printf("\n\n\t\t 按任意键返回\n");
203 getchar();
204 break;
205 }
206 if(strcmp(name,a->CustomerName)==0&&strcmp(password,a->PassWord)==0)
207 {
208 printf("\t\t\t 登录成功(按任意键返回)");
209 getchar();
210 Interface_CustOperation(a); //登录成功,进入用户操作平台
211 break;
212 }
213 }
214 fclose(fp);
215 }
216
217 /* 8、用户操作平台界面 */
218
219 void Interface_CustOperation(Customer * a) //用户操作平台,完成股票交易
220 {
221 char choice;
222 Stock strTemp;
223 do
224 {
225 system("cls");
226 printf("\n\n\n\t\t*************************欢迎进入用户操作平台*******************\n\n");
227 printf("\n\n\t\t\t[b]-------买股票\n");
228 printf("\t\t\t[s]-------卖股票\n");
229 printf("\t\t\t[v]-------显示用户股票\n");
230 printf("\t\t\t[q]-------退出交易\n");
231 printf("\n\n\t\t\t请选择:");
232 scanf("%c",&choice);
233 if(choice!='b'&&choice!='s'&&choice!='v'&&choice!='q')
234 break;
235 else
236 {
237 switch(choice)
238 {
239 case 'b':Buy(a);break; //买股票
240 case 's':Sell(a);break; //买股票
241 case 'v':View(a);break; //显示用户的股票信息
242 case 'q':Interface_StockExchange; //返回股票交易平台
243 }
244 }
245 } while (1);
246 }
247
248
249 /* 9、买股票操作 */
250
251 void Buy(Customer * a) //买股票
252 {
253 FILE * fpData, *fpCust;
254 Stock straShare[MAX];
255 CustStock straCuSto[MAX];
256 Customer straCust[MAX];
257 int nNum;
258 char szShareCode[6];
259 long nVolume;
260 system("cls");
261 printf("\n\n\n\t********************股票信息*****************\n\n\n");
262 printf("\t\t 股票名称 股票代码 总股数 可交易的股数\n\n");
263 if((fpData=fopen("Stock_File.dat","rb"))==NULL) //打开股票数据库
264 {
265 printf("FILE ERROR!\n");
266 exit(0);
267 }
268 fread(&NUM,sizeof(NUM),1,fpData);
269 for(nNum=0;nNum<NUM;nNum++)
270 fread(&straShare[nNum],sizeof(straShare[nNum]),1,fpData);
271 if((fpCust=fopen(a->CustomerName,"rb"))==NULL) //打开用户股票账户库
272 {
273 printf("FILE ERROR!\n");
274 exit(0);
275 }
276 for(nNum=0;nNum<NUM;nNum++)
277 fread(&straCuSto[nNum],sizeof(straCuSto[nNum]),1,fpCust);
278 fclose(fpData);
279 fclose(fpCust);
280 for(nNum=0;nNum<NUM;nNum++)
281 Display_StockMarket(&straShare[nNum]); //显示股票信息
282 getchar();
283 printf("\n\t\t请输入要买入的股票代码:");
284 scanf("%s",szShareCode);
285 printf("\n\t\t请输入股数:");
286 scanf("%ld",&nVolume);
287 getchar();
288 nNum=0;
289 while((strcmp(straShare[nNum].StockCode,szShareCode)==0)||nNum<NUM)
290 {
291 if(strcmp(straShare[nNum].StockCode,szShareCode)==0)
292 {
293 if(straShare[nNum].StockAva>nVolume) //符合买股票条件
294 {
295 straCuSto[nNum].StockVal=straCuSto[nNum].StockVal+nVolume;
296 strcpy(straCuSto[nNum].StockName,straShare[nNum].StockName);
297 strcpy(straCuSto[nNum].StockCode,straShare[nNum].StockCode);
298 straShare[nNum].StockAva=straShare[nNum].StockAva-nVolume;
299 if((fpCust=fopen(a->CustomerName,"wb"))==NULL)
300 {
301 printf("FILE ERROR!\n");
302 exit(0);
303 }
304 for(nNum=0;nNum<NUM;nNum++)
305 fwrite(&straCuSto[nNum],sizeof(straCuSto[nNum]),1,fpCust);
306 if((fpData=fopen("Stock_File.dat","wb"))==NULL)
307 {
308 printf("FILE ERROR!\n");
309 exit(0);
310 }
311 fwrite(&NUM,sizeof(NUM),1,fpData);
312 for(nNum=0;nNum<NUM;nNum++)
313 fwrite(&straShare[nNum],sizeof(straShare[nNum]),1,fpData);
314 fclose(fpData);
315 fclose(fpCust);
316 break;
317 }
318 else
319 {
320 printf("\n\n\t\t该股票可交易份额不足,不能完成本次交易\n");
321 printf("\n\t\t退出本次交易\n");
322 getchar();
323 break;
324 }
325 }
326 else
327 {
328 nNum++;
329 if(nNum==NUM);
330 {
331 printf("\n\n\t\t输入的股票代码有误……\n");
332 printf("\n\t\t退出本次交易\n");
333 getchar();
334 break;
335 }
336 }
337 }
338 }
339
340 /* 10、卖股票操作 */
341
342 void Sell(Customer * a) //卖股票
343 {
344 FILE * fpData, *fpCust;
345 Stock straShare[MAX];
346 CustStock straCuSto[MAX];
347 Customer straCust[MAX];
348 int nNum;
349 char szShareCode[6];
350 long nVolume;
351 system("cls");
352
353 if((fpData=fopen("Stock_File.dat","rb"))==NULL) //打开股票数据库
354 {
355 printf("FILE ERROR!\n");
356 exit(0);
357 }
358 fread(&NUM,sizeof(NUM),1,fpData);
359 for(nNum=0;nNum<NUM;nNum++)
360 fread(&straShare[nNum],sizeof(straShare[nNum]),1,fpData);
361 if((fpCust=fopen(a->CustomerName,"rb"))==NULL) //打开用户股票账户库
362 {
363 printf("FILE ERROR!\n");
364 exit(0);
365 }
366 for(nNum=0;nNum<NUM;nNum++)
367 fread(&straCuSto[nNum],sizeof(straCuSto[nNum]),1,fpCust);
368 fclose(fpData);
369 fclose(fpCust);
370 printf("\n\n\n\t********************用户股票信息*****************\n\n\n");
371 printf("\t\t 股票名称 股票代码 持股数\n\n");
372 for(nNum=0;nNum<NUM;nNum++)
373 {
374 if(straCuSto[nNum].StockVal!=0)
375 printf("\t\t%s\t\t%s\t%ld\n",straCuSto[nNum].StockName,straCuSto[nNum].StockCode,straCuSto[nNum].StockVal);
376 }
377 getchar();
378 printf("\n\t\t请输入要卖的股票代码:");
379 scanf("%s",szShareCode);
380 printf("\n\t\t请输入要卖的股数:");
381 scanf("%ld",&nVolume);
382 getchar();
383 nNum=0;
384 while((strcmp(straShare[nNum].StockCode,szShareCode)==0)||nNum<NUM)
385 {
386 if(strcmp(straShare[nNum].StockCode,szShareCode)==0)
387 {
388 if(straCuSto[nNum].StockVal>nVolume) //符合卖股票条件
389 {
390 straCuSto[nNum].StockVal=straCuSto[nNum].StockVal-nVolume;
391 straShare[nNum].StockAva=straShare[nNum].StockAva+nVolume;
392 if((fpCust=fopen(a->CustomerName,"wb"))==NULL)
393 {
394 printf("FILE ERROR!\n");
395 exit(0);
396 }
397 for(nNum=0;nNum<NUM;nNum++)
398 fwrite(&straCuSto[nNum],sizeof(straCuSto[nNum]),1,fpCust);
399 if((fpData=fopen("Stock_File.dat","wb"))==NULL)
400 {
401 printf("FILE ERROR!\n");
402 exit(0);
403 }
404 fwrite(&NUM,sizeof(NUM),1,fpData);
405 for(nNum=0;nNum<NUM;nNum++)
406 fwrite(&straShare[nNum],sizeof(straShare[nNum]),1,fpData);
407 fclose(fpData);
408 fclose(fpCust);
409 break;
410 }
411 else
412 {
413 printf("\n\n\t\t你可交易股票份额不足,不能完成本次交易\n");
414 printf("\n\t\t退出本次交易\n");
415 getchar();
416 break;
417 }
418 }
419 else
420 {
421 nNum++;
422 if(nNum==NUM)
423 {
424 printf("\n\n\t\t输入的股票代码有误……\n");
425 printf("\n\t\t退出本次交易\n");
426 getchar();
427 break;
428 }
429 }
430 }
431 }
432
433 /* 11、显示用户股票信息 */
434
435 void View(Customer * a) //显示用户股票
436 {
437 FILE * fpData, *fpCust;
438 CustStock straCuSto[MAX];
439 int nNum;
440 int flag=1;
441 system("cls");
442
443 if((fpData=fopen("Stock_File.dat","rb"))==NULL) //打开股票数据库
444 {
445 printf("FILE ERROR!\n");
446 exit(0);
447 }
448 fread(&NUM,sizeof(NUM),1,fpData);
449 if((fpCust=fopen(a->CustomerName,"rb"))==NULL) //打开用户股票账户库
450 {
451 printf("FILE ERROR!\n");
452 exit(0);
453 }
454 for(nNum=0;nNum<NUM;nNum++)
455 fread(&straCuSto[nNum],sizeof(straCuSto[nNum]),1,fpCust);
456 fclose(fpData);
457 fclose(fpCust);
458 printf("\n\n\n\t********************用户股票信息*****************\n\n\n");
459 printf("\t\t 股票名称 股票代码 持股数\n\n");
460 for(nNum=0;nNum<NUM;nNum++)
461 {
462 if(straCuSto[nNum].StockVal!=0)
463 printf("\t\t%s\t\t%s\t%ld\n",straCuSto[nNum].StockName,straCuSto[nNum].StockCode,straCuSto[nNum].StockVal);
464 flag=0;
465 }
466 if(flag)
467 printf("\n\t\t暂无可显示的股票信息");
468 getchar();
469 getchar();
470 }
471
472 /* 12、新用户注册 */
473
474 void Register(Customer * a) //新用户注册
475 {
476 system("cls");
477 getchar();
478 printf("\n\n\t********************用户注册*****************\n\n");
479 printf("\n\t\t\t请输入用户名:");
480 scanf("%s",a->CustomerName);
481 printf("\n\t\t\t请输入密码:");
482 scanf("%s",a->PassWord);
483 getchar();
484 system("cls");
485 printf("\n\n你已注册成功\n");
486 getchar();;
487 }
488
489 void InitCustData(Customer * a) //初始化新注册用户库
490 {
491 int nNum;
492 CustStock straCuSto[MAX];
493 FILE * fpCust, * fpData;
494 if((fpData=fopen("Stock_File.dat","rb"))==NULL) //打开股票数据库
495 {
496 printf("FILE ERROR!\n");
497 exit(0);
498 }
499 fread(&NUM,sizeof(NUM),1,fpData);
500 if((fpCust=fopen(a->CustomerName,"wb"))==NULL) //打开用户股票账户库
501 {
502 printf("FILE ERROR!\n");
503 exit(0);
504 }
505 for(nNum=0;nNum<NUM;nNum++)
506 {
507 strcpy(straCuSto[nNum].StockName,"");
508 strcpy(straCuSto[nNum].StockCode,"");
509 straCuSto[nNum].StockVal=0;
510 fwrite(&straCuSto[nNum],sizeof(straCuSto[nNum]),1,fpCust);
511 }
512 fclose(fpCust);
513 fclose(fpData);
514 }