###前言###
- 本篇主要是用顺序表实现一个简易的动态增长的通讯录,为了便于读者阅读和思维的连贯性,笔者将代码和需要讲解的内容都放在一起,在代码中呈现,需要注意和思考的地方已经在注释中注明
1.Stock.h – 所需接口声明
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <math.h>
#include <assert.h>
#define MAX 100
int NUM;
typedef struct custstock
{
char StockCode[6];
char StockName[30];
long StockVal;
}custstock;
typedef struct custom
{
char CustomerName[20];
char PassWord[6];
}customer;
typedef struct stock
{
char StockCode[6];
char StockName[30];
long Stockvol;
long StockAva;
long StockNum;
char chChoice;
}stock;
void Login(char*, char*, customer*);
void Register(customer*);
void Interface_CustOperation(customer*);
void Interface_StockExchange(stock*);
void Display_StockMarket(stock*);
void Menu_Choice(stock*);
void InitCustData(customer*);
void Buy(customer*);
void Sell(customer*);
void View(customer*);
void Input_Stock();
void Input_NewStock(stock*);
void Delete_Stock();
2.main.c – 大框架
#include "stock.h"
int main()
{
char chChoice = 0;
stock strTemp;
system("cls");
printf("\n\n\t\t***************股票交易平台***************\n\n");
printf("\n\n\n\t\t需要更新股票信息吗?(y|Y--Yes n|N--No d|D--Delete)");
scanf("%c", &chChoice);
if (chChoice == 'y' || chChoice == 'Y')
{
Input_Stock();
}
else if (chChoice == 'D' || chChoice == 'd')
{
Delete_Stock();
}
Interface_StockExchange(&strTemp);
return 0;
}
3.Stock.c – 所需接口实现
#include "stock.h"
void Input_Stock()
{
FILE* fpData;
int nNUM;
stock straSto[MAX];
printf("\n\t\t输入股票种类数:");
scanf("%d", &NUM);
if ((fpData = fopen("Stock_File.dat", "wb")) == NULL)
{
printf("FILE ERROR\n");
exit(0);
}
fwrite(&NUM, sizeof(NUM), 1, fpData);
for (nNUM = 0; nNUM < NUM; nNUM++)
{
Input_NewStock(&straSto[nNUM]);
fwrite(&straSto[nNUM], sizeof(straSto[nNUM]), 1, fpData);
}
fclose(fpData);
fpData = NULL;
}
void Input_NewStock(stock* a)
{
system("cls");
getchar();
printf("\n\t\t请输入股票代码(字符个数<=6:)");
gets(a->StockCode);
printf("\n\t\t请输入股票名称:");
gets(a->StockName);
printf("\n\t\t请输入总股数:");
scanf("%ld", &a->Stockvol);
a->StockAva = a->Stockvol;
a->StockNum++;
}
void Delete_Stock()
{
system("cls");
char Code[6];
int nNum;
stock straSto[MAX];
FILE* fpData;
if ((fpData = fopen("Stock_File.dat", "rb+")) == NULL)
{
printf("无股票数据\n");
exit(0);
}
fread(&NUM, sizeof(NUM), 1, fpData);
if (!NUM)
{
printf("无股票数据\n");
}
else
{
getchar();
for (nNum = 0; nNum < NUM; nNum++)
{
fread(&straSto[nNum], sizeof(straSto[nNum]), 1, fpData);
}
printf("\n\n\n\t*************************股票信息*************************\n\n\n");
printf("\t\t股票名称 股票代码 总股数 可交易的股数\n\n");
for (nNum = 0; nNum < NUM; nNum++)
{
Display_StockMarket(&straSto[nNum]);
}
printf("请输入要删除的股票代码:>");
gets(Code);
for (nNum = 0; nNum < NUM; nNum++)
{
if (strcmp(Code, straSto[nNum].StockCode) == 0)
{
for (int begin = nNum; begin < NUM; begin++)
{
straSto[begin] = straSto[begin + 1];
}
NUM--;
int Coded = 0;
sscanf(Code, "%d", &Coded);
printf("\n删除股票代码为[%d]的股票后:>", Coded);
printf("\n\n\n\t*************************股票信息*************************\n\n\n");
printf("\t\t股票名称 股票代码 总股数 可交易的股数\n\n");
for (int i = 0; i < NUM; i++)
{
Display_StockMarket(&straSto[i]);
}
break;
}
}
if (nNum == NUM)
{
printf("该股票代码对应的股票不存在\n");
}
rewind(fpData);
fwrite(&NUM, sizeof(NUM), 1, fpData);
for (nNum = 0; nNum < NUM; nNum++)
{
fwrite(&straSto[nNum], sizeof(straSto[nNum]), 1, fpData);
}
fclose(fpData);
fpData = NULL;
}
getchar();
}
void Interface_StockExchange(stock* a)
{
system("cls");
printf("\n\n\n\t\t***************欢迎进入股票交易平台***************\n\n");
printf("\t\t\t显示股票情况 [v]\n");
printf("\t\t\t老用户登录 [l]\n");
printf("\t\t\t新用户注册 [r]\n");
printf("\t\t\t退出交易系统 [q]\n");
printf("\n\n\t\t\t请选择:");
scanf(" %c", &a->chChoice);
if (a->chChoice != 'q'
&& a->chChoice != 'v'
&& a->chChoice != 'l'
&& a->chChoice != 'r')
{
system("cls");
Interface_StockExchange(a);
}
else
{
Menu_Choice(a);
}
}
void Menu_Choice(stock* a)
{
int nNum;
FILE* fpCust;
FILE* fpData;
stock strTemp;
stock straCust[MAX];
customer strCust;
char CustomerName[20];
char PassWord[6];
switch (a->chChoice)
{
case 'v':
system("cls");
printf("\n\n\n\t*************************股票信息*************************\n\n\n");
printf("\t\t股票名称 股票代码 总股数 可交易的股数\n\n");
if ((fpData = fopen("Stock_File.dat", "rb")) == NULL)
{
printf("FILE ERROR!\n");
exit(0);
}
fread(&NUM, sizeof(NUM), 1, fpData);
for (nNum = 0; nNum < NUM; nNum++)
{
fread(&straCust[nNum], sizeof(straCust[nNum]), 1, fpData);
}
fclose(fpData);
fpData = NULL;
for (nNum = 0; nNum < NUM; nNum++)
{
Display_StockMarket(&straCust[nNum]);
}
fflush(stdin);
system("pause");
Interface_StockExchange(&strTemp);
case 'l':
system("cls");
printf("\n\n\n\t\t***************用户登录***************\n\n");
printf("\t\t\t用户名:");
scanf("%s", CustomerName);
printf("\n\t\t\t密码:");
scanf("%s", PassWord);
getchar();
Login(CustomerName, PassWord, &strCust);
Interface_StockExchange(&strTemp);
case'r':
system("cls");
printf("\n\n\n\t\t***************用户注册***************\n\n");
Register(&strCust);
if ((fpCust = fopen("customer.dat", "ab")) == NULL)
{
printf("FILE ERROR!\n");
exit(0);
}
fwrite(&strCust, sizeof(strCust), 1, fpCust);
fclose(fpCust);
fpCust = NULL;
InitCustData(&strCust);
Interface_StockExchange(&strTemp);
case'q':
system("cls");
printf("\n\n\n\n\n\t\t谢谢使用股票交易平台\n\n");
printf("\t\t再 见\n\n");
getchar();
getchar();
exit(0);
}
}
void Display_StockMarket(stock* a)
{
printf("\n\t\t%-12s%-10s%-10ld%-10ld\n",
a->StockName, a->StockCode, a->Stockvol, a->StockAva);
}
void Login(char* name, char* password, customer* a)
{
FILE* fp;
int Flag;
if ((fp = fopen("customer.dat", "rb")) == NULL)
{
printf("Read File error!\n");
exit(1);
}
while (!feof(fp))
{
Flag = fread(a, sizeof(customer), 1, fp);
if (Flag != 1)
{
printf("\n\n\t\t该用户还未注册!\n");
printf("\n\n\t\t按任意键返回\n");
getchar();
break;
}
if (strcmp(name, a->CustomerName) == 0 && strcmp(password, a->PassWord) == 0)
{
Interface_CustOperation(a);
break;
}
}
fclose(fp);
fp = NULL;
}
void Interface_CustOperation(customer* a)
{
char choice;
stock strTemp;
do
{
system("cls");
printf("\n\n\t********************欢迎进入用户操作平台********************\n\n");
printf("\n\n\t\t\t [b]-----买股票\n");
printf("\t\t\t [s]-----卖股票\n");
printf("\t\t\t [v]-----显示用户股票\n");
printf("\t\t\t [q]-----退出交易\n");
printf("\n\t\t请选择:");
scanf("%c", &choice);
if (choice != 'b' && choice != 's' && choice != 'v' && choice != 'q')
{
break;
}
else
{
switch (choice)
{
case'b':
Buy(a);
break;
case's':
Sell(a);
break;
case'v':
View(a);
break;
case'q':
Interface_StockExchange(&strTemp);
}
}
} while (1);
}
void Buy(customer* a)
{
FILE* fpData;
FILE* fpCust;
stock straShare[MAX];
custstock straCuSto[MAX];
customer straCust[MAX];
int nNum;
char szShareCode[6];
long nVolume;
system("cls");
printf("\n\n\n\t*************************股票信息*************************\n\n\n");
printf("\t\t股票名称 股票代码 总股数 可交易的股数\n\n");
if ((fpData = fopen("Stock_File.dat", "rb")) == NULL)
{
printf("FILE ERROR!\n");
exit(0);
}
fread(&NUM, sizeof(NUM), 1, fpData);
for (nNum = 0; nNum < NUM; nNum++)
{
fread(&straShare[nNum], sizeof(straShare[nNum]), 1, fpData);
}
if ((fpCust = fopen(a->CustomerName, "rb")) == NULL)
{
printf("FILE ERROR!\n");
exit(0);
}
for (nNum = 0; nNum < NUM; nNum++)
{
fread(&straCuSto[nNum], sizeof(straCuSto[nNum]), 1, fpCust);
}
fclose(fpData);
fpData = NULL;
fclose(fpCust);
fpCust = NULL;
for (nNum = 0; nNum < NUM; nNum++)
{
Display_StockMarket(&straShare[nNum]);
}
getchar();
printf("\n\t\t请输入要买入的股票代码:");
gets(szShareCode);
printf("\n\t\t请输入股数:");
scanf("%ld", &nVolume);
getchar();
nNum = 0;
while ((strcmp(straShare[nNum].StockCode, szShareCode) == 0) || nNum < NUM)
{
if (strcmp(straShare[nNum].StockCode, szShareCode) == 0)
{
if (straShare[nNum].StockAva > nVolume)
{
straCuSto[nNum].StockVal = straCuSto[nNum].StockVal + nVolume;
strcpy(straCuSto[nNum].StockName, straShare[nNum].StockName);
strcpy(straCuSto[nNum].StockCode, straShare[nNum].StockCode);
straShare[nNum].StockAva = straShare[nNum].StockAva - nVolume;
if ((fpCust = fopen(a->CustomerName, "wb")) == NULL)
{
printf("FILE ERROR!\n");
exit(0);
}
for (nNum = 0; nNum < NUM; nNum++)
{
fwrite(&straCuSto[nNum], sizeof(straCuSto[nNum]), 1, fpCust);
}
if ((fpData = fopen("Stock_File.dat", "wb")) == NULL)
{
printf("FILE ERROR!\n");
exit(0);
}
fwrite(&NUM, sizeof(NUM), 1, fpData);
for (nNum = 0; nNum < NUM; nNum++)
{
fwrite(&straShare[nNum], sizeof(straShare[nNum]), 1, fpData);
}
fclose(fpData);
fpData = NULL;
fclose(fpCust);
fpCust = NULL;
break;
}
else
{
printf("\n\n\t\t该股票可交易份额不足,不能完成本次交易\n");
printf("\n\t\t\t退出本次交易\n");
getchar();
break;
}
}
else
{
nNum++;
if (nNum == NUM)
{
printf("\n\n\t\t输入的股票代码有误.....\n");
printf("\n\t\t\t退出本次交易\n");
getchar();
break;
}
}
}
}
void Sell(customer* a)
{
FILE* fpData;
FILE* fpCust;
stock straShare[MAX];
custstock straCuSto[MAX];
customer straCust[MAX];
int nNum;
char szShareCode[6];
long nVolume;
system("cls");
if ((fpData = fopen("Stock_File.dat", "rb")) == NULL)
{
printf("FILE ERROR!\n");
exit(0);
}
fread(&NUM, sizeof(NUM), 1, fpData);
for (nNum = 0; nNum < NUM; nNum++)
{
fread(&straShare[nNum], sizeof(straShare[nNum]), 1, fpData);
}
if ((fpCust = fopen(a->CustomerName, "rb")) == NULL)
{
printf("FILE ERROR!\n");
exit(0);
}
for (nNum = 0; nNum < NUM; nNum++)
{
fread(&straCuSto[nNum], sizeof(straCuSto[nNum]), 1, fpCust);
}
fclose(fpData);
fpData = NULL;
fclose(fpCust);
fpCust = NULL;
printf("\n\n\n\t*************************用户股票信息*************************\n\n\n");
printf("\t\t股票名称 股票代码 持股数\n\n");
for (nNum = 0; nNum < NUM; nNum++)
{
if (straCuSto[nNum].StockVal != 0)
{
printf("\t\t%s\t\t%s\t%ld\n",
straCuSto[nNum].StockName,
straCuSto[nNum].StockCode,
straCuSto[nNum].StockVal);
}
}
getchar();
printf("\n\t输入要卖的股票代码:");
scanf("%s", szShareCode);
printf("\n\t输入要卖的股数:");
scanf("%ld", &nVolume);
getchar();
nNum = 0;
while ((strcmp(straShare[nNum].StockCode, szShareCode) == 0) || nNum < NUM)
{
if (strcmp(straShare[nNum].StockCode, szShareCode) == 0)
{
if (straCuSto[nNum].StockVal > nVolume)
{
straCuSto[nNum].StockVal = straCuSto[nNum].StockVal - nVolume;
straShare[nNum].StockAva = straShare[nNum].StockAva + nVolume;
if ((fpCust = fopen(a->CustomerName, "wb")) == NULL)
{
printf("FILE ERROR!\n");
exit(0);
}
for (nNum = 0; nNum < NUM; nNum++)
{
fwrite(&straCuSto[nNum], sizeof(straCuSto[nNum]), 1, fpCust);
}
if ((fpData = fopen("Stock_File.dat", "wb")) == NULL)
{
printf("FILE ERROR!\n");
exit(0);
}
fwrite(&NUM, sizeof(NUM), 1, fpData);
for (nNum = 0; nNum < NUM; nNum++)
{
fwrite(&straShare[nNum], sizeof(straShare[nNum]), 1, fpData);
}
fclose(fpData);
fpData = NULL;
fclose(fpCust);
fpCust = NULL;
break;
}
else
{
printf("\n\n\t\t你可交易股票份额不足,不能完成本次交易\n");
printf("\n\t\t\t退出本次交易\n");
getchar();
break;
}
}
else
{
nNum++;
if (nNum == NUM)
{
printf("\n\n\t\t输入的股票代码有误.....\n");
printf("\n\t\t\t退出本次交易\n");
getchar();
break;
}
}
}
}
void View(customer* a)
{
FILE* fpCust;
FILE* fpData;
custstock straCuSto[MAX];
int nNum;
int flag = 1;
system("cls");
if ((fpData = fopen("Stock_File.dat", "rb")) == NULL)
{
printf("FILE ERROR!\n");
exit(0);
}
fread(&NUM, sizeof(NUM), 1, fpData);
if ((fpCust = fopen(a->CustomerName, "rb")) == NULL)
{
printf("FILE ERROR!\n");
exit(0);
}
for (nNum = 0; nNum < NUM; nNum++)
{
fread(&straCuSto[nNum], sizeof(straCuSto[nNum]), 1, fpCust);
}
fclose(fpCust);
fpCust = NULL;
fclose(fpData);
fpData = NULL;
printf("\n\n\n\t*************************用户股票信息*************************\n\n\n");
printf("\t\t股票名称 股票代码 持股数\n\n");
for (nNum = 0; nNum < NUM; nNum++)
{
if (straCuSto[nNum].StockVal != 0)
{
printf("\t\t%s\t\t%s\t%ld\n",
straCuSto[nNum].StockName,
straCuSto[nNum].StockCode,
straCuSto[nNum].StockVal);
flag = 0;
}
}
if (flag)
{
printf("\n\t\t暂无可显示的股票信息");
}
fflush(stdin);
getchar();
getchar();
}
void Register(customer* a)
{
system("cls");
getchar();
printf("\n\n\t********************用户注册********************\n\n");
printf("\n\t\t\t输入用户名:");
scanf("%s", a->CustomerName);
printf("\n\t\t\t输入密码:");
scanf("%s", a->PassWord);
system("cls");
printf("\n\n您已成功注册\n");
fflush(stdin);
getchar();
}
void InitCustData(customer* a)
{
int nNum;
FILE* fpCust;
FILE* fpData;
custstock straCuSto[MAX];
if ((fpData = fopen("Stock_File.dat", "rb")) == NULL)
{
printf("FILE ERROR!\n");
exit(0);
}
fread(&NUM, sizeof(NUM), 1, fpData);
if ((fpCust = fopen(a->CustomerName, "wb")) == NULL)
{
printf("FILE ERROR!\n");
exit(0);
}
for (nNum = 0; nNum < NUM; nNum++)
{
strcpy(straCuSto[nNum].StockCode, "");
strcpy(straCuSto[nNum].StockName, "");
straCuSto[nNum].StockVal = 0;
fwrite(&straCuSto[nNum], sizeof(straCuSto[nNum]), 1, fpCust);
}
fclose(fpCust);
fpCust = NULL;
fclose(fpData);
fpData = NULL;
}