书本上的一个例题——股票交易系统
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 }