程序采用C语言编写,用到了结构体、链表相关知识,代码如下:
#include <Windows.h>
#include <stdio.h>
#define READ_FILE1 "courses.csv"
#define WRITE_FILE1 "courses_new.txt"
#define MAX_XYCOUNT 1000
typedef struct DataNode_ {
int banhao;
char kclb[128];
int yxpgs;
float pgfs;
char jszc[128];
char kkxy[128];
char xn[128];
char xq[128];
float pjcj;
int jsbh;
}DataNode;
typedef struct SeqTable_ {
int len;
DataNode* datas;
}SeqTable;
int menu()
{
int cmd = 0;
printf("*****************欢迎使用课程管理系统*****************\r\n");
printf("************1.加载课程数据\r\n");
printf("************2.删除非法数据,并存储到courses_new.txt文件\r\n");
printf("************3.查询指定教师所教课程信息\r\n");
printf("************4.根据评估分数统计\r\n");
printf("************5.统计每个学院信息\r\n");
printf("************6.根据平均成绩统计\r\n");
printf("************0.退出系统\r\n");
printf("请选择:");
scanf("%d", &cmd);
return cmd;
}
unsigned char split_(const char* src, const char* separator, char** dest, int* num)
{
if (!src || !separator || !strlen(src))
return 0;
char* pSeparator, * pStart, * pEnd;
unsigned int sep_len;
int count = 0;
pSeparator = (char*)malloc(16);
if (pSeparator == NULL) return 0;
if (separator == NULL || strlen(separator) == 0) strcpy(pSeparator, " ");/* one blank by default */
else strcpy(pSeparator, separator);
sep_len = strlen(pSeparator);
pStart = (char*)src;
while (1)
{
pEnd = strstr(pStart, pSeparator);
if (pEnd != NULL)
{
memset(pEnd, '\0', sep_len);
*dest++ = pStart;
pEnd = pEnd + sep_len;
pStart = pEnd;
++count;
}
else
{
*dest = pStart;
++count;
break;
}
}
*num = count;
if (pSeparator != NULL) free(pSeparator);
return 1;
}
void setValue(DataNode* data, char* tmp[128])
{
if (!data)
return;
memset(data, 0, sizeof(DataNode));
data->banhao = atoi(tmp[0]);
strcpy(data->kclb, tmp[1]);
data->yxpgs = atoi(tmp[2]);
data->pgfs = atof(tmp[3]);
strcpy(data->jszc, tmp[4]);
strcpy(data->kkxy, tmp[5]);
strcpy(data->xn, tmp[6]);
strcpy(data->xq, tmp[7]);
if (strstr(tmp[8], "N/A"))
data->pjcj = -1;//表示异常数据
else
data->pjcj = atof(tmp[8]);
data->jsbh = atoi(tmp[9]);
}
void loadData(SeqTable* seqTObj)
{
if (!seqTObj)
return;
FILE* fp = fopen(READ_FILE1, "r");
if (!fp)
{
printf("打开文件:%s 失败...\r\n", READ_FILE1);
return;
}
char* tmp[128];
int colCount = 0;
char oneLine[1024] = { 0 };
fscanf(fp, "%s", oneLine);
while (!feof(fp))
{
fscanf(fp, "%s", oneLine);
split_(oneLine, ",", tmp, &colCount);
if (10 != colCount)
continue;
if (0 == seqTObj->len)
{
seqTObj->len = 1;
seqTObj->datas = (DataNode*)malloc(sizeof(DataNode) * 1);
setValue(&seqTObj->datas[0], tmp);
}
else
{
seqTObj->len++;
seqTObj->datas = (DataNode*)realloc(seqTObj->datas, sizeof(DataNode) * seqTObj->len);
setValue(&seqTObj->datas[seqTObj->len - 1], tmp);
}
}
fclose(fp);
printf("从文件%s加载数据成功...\r\n", READ_FILE1);
}
void delInvalidDataAndStore(SeqTable* seqTObj)
{
if (!seqTObj)
return;
if (0 == seqTObj->len)
{
printf("没有数据...\r\n");
return;
}
int i = 0;
for (; i < seqTObj->len; i++)
{
if (0 == strlen(seqTObj->datas[i].jszc) || seqTObj->datas[i].pjcj < 0)
{
memmove(seqTObj->datas + i, seqTObj->datas + i + 1, sizeof(DataNode) * (seqTObj->len - i - 1));
seqTObj->len--;
}
}
FILE* fp = fopen(WRITE_FILE1, "w");
if (!fp)
{
printf("打开文件%s失败...\r\n", WRITE_FILE1);
return;
}
for (i = 0; i < seqTObj->len; i++)
{
fprintf(fp, "%d,%s,%d,%f,%s,%s,%s,%s,%f,%d\n",
seqTObj->datas[i].banhao,
seqTObj->datas[i].kclb,
seqTObj->datas[i].yxpgs,
seqTObj->datas[i].pgfs,
seqTObj->datas[i].jszc,
seqTObj->datas[i].kkxy,
seqTObj->datas[i].xn,
seqTObj->datas[i].xq,
seqTObj->datas[i].pjcj,
seqTObj->datas[i].jsbh);
}
fclose(fp);
printf("存储到文件%s成功...\r\n", WRITE_FILE1);
}
void findTecherCousInfo(SeqTable* seqTObj)
{
if (!seqTObj)
return;
if (0 == seqTObj->len)
{
printf("没有数据...\r\n");
return;
}
int jsbh;
printf("请输入教师编号:");
scanf("%d", &jsbh);
int i = 0;
float pgfs = 0, pjcj = 0;
int count = 0;
for (; i < seqTObj->len; i++)
{
if (seqTObj->datas[i].jsbh == jsbh)
{
count++;
pgfs += seqTObj->datas[i].pgfs;
if (seqTObj->datas[i].pjcj > -1)
{
pjcj += seqTObj->datas[i].pjcj;
}
}
}
if (count > 0)
printf("教师编号为:%d老师的所有课程平均评估分数是:%f,平均成绩是:%f\r\n", jsbh, pgfs / count, pjcj / count);
else
printf("教师编号为:%d的老师没有课程...\r\n", jsbh);
}
void tongjiPGFS(SeqTable* seqTObj)
{
if (!seqTObj)
return;
if (0 == seqTObj->len)
{
printf("没有数据...\r\n");
return;
}
float pgfs;
printf("请输入要比较的评估分数:");
scanf("%f", &pgfs);
int i = 0;
int count = 0;
for (; i < seqTObj->len; i++)
{
if (seqTObj->datas[i].pgfs > pgfs)
{
count++;
printf("班号:%d,评估分数:%f\r\n", seqTObj->datas[i].banhao, seqTObj->datas[i].pgfs);
}
}
printf("评估分数高于 %f 的班级总共有 %d 个\r\n", pgfs, count);
}
typedef struct XYCount_ {
char xymc[128];
int count;
}XYCount;
void tongjiXY(SeqTable* seqTObj)
{
if (!seqTObj)
return;
if (0 == seqTObj->len)
{
printf("没有数据...\r\n");
return;
}
XYCount tmpxy[MAX_XYCOUNT];
memset(tmpxy, 0, sizeof(XYCount) * MAX_XYCOUNT);
int i = 0;
for (; i < seqTObj->len; i++)
{
int j = 0;
for (; j < MAX_XYCOUNT; j++)
{
if (0 == strcmp(seqTObj->datas[i].kkxy, tmpxy[j].xymc))
{
tmpxy[j].count++;
break;
}
if (0 == tmpxy[j].count)
{
strcpy(tmpxy[j].xymc, seqTObj->datas[i].kkxy);
tmpxy[j].count++;
break;
}
}
}
int i2 = 0, j2 = 0;
for (i2 = 1; i2 < MAX_XYCOUNT; i2++)
for (j2 = i2 + 1; j2 < MAX_XYCOUNT; j2++)
if (tmpxy[i2].count < tmpxy[j2].count) //如果前一个数比后一个数大,则利用中间变量t实现两值互换
{
XYCount t;
strcpy(t.xymc, tmpxy[i2].xymc);
t.count = tmpxy[i2].count;
strcpy(tmpxy[i2].xymc, tmpxy[j2].xymc);
tmpxy[i2].count = tmpxy[j2].count;
strcpy(tmpxy[j2].xymc, t.xymc);
tmpxy[j2].count = t.count;
}
for (i2 = 0; i2 < MAX_XYCOUNT; i2++)
{
if (0 == tmpxy[i2].count)
break;
printf("%s\t%d\r\n", tmpxy[i2].xymc, tmpxy[i2].count);
}
}
void tongjiPJCJ(SeqTable* seqTObj)
{
if (!seqTObj)
return;
if (0 == seqTObj->len)
{
printf("没有数据...\r\n");
return;
}
float pjcj = 0;
printf("请输入平均成绩参考值:");
scanf("%f", &pjcj);
int i = 0;
XYCount tmpxy[MAX_XYCOUNT];
memset(tmpxy, 0, sizeof(XYCount) * MAX_XYCOUNT);
for (; i < seqTObj->len; i++)
{
if (seqTObj->datas[i].pjcj > pjcj)
{
int j = 0;
for (; j < MAX_XYCOUNT; j++)
{
if (0 == strcmp(seqTObj->datas[i].kclb, tmpxy[j].xymc))
{
tmpxy[j].count++;
break;
}
if (0 == tmpxy[j].count)
{
strcpy(tmpxy[j].xymc, seqTObj->datas[i].kclb);
tmpxy[j].count++;
break;
}
}
}
}
int i2 = 0, j2 = 0;
for (i2 = 1; i2 < MAX_XYCOUNT; i2++)
for (j2 = i2 + 1; j2 < MAX_XYCOUNT; j2++)
if (tmpxy[i2].count < tmpxy[j2].count) //如果前一个数比后一个数大,则利用中间变量t实现两值互换
{
XYCount t;
strcpy(t.xymc, tmpxy[i2].xymc);
t.count = tmpxy[i2].count;
strcpy(tmpxy[i2].xymc, tmpxy[j2].xymc);
tmpxy[i2].count = tmpxy[j2].count;
strcpy(tmpxy[j2].xymc, t.xymc);
tmpxy[j2].count = t.count;
}
for (i2 = 0; i2 < MAX_XYCOUNT; i2++)
{
if (0 == tmpxy[i2].count)
break;
printf("%s\t%d\r\n", tmpxy[i2].xymc, tmpxy[i2].count);
}
}
int main()
{
SeqTable seqTObj;
seqTObj.len = 0;
seqTObj.datas = NULL;
while (1)
{
int choiceCmd = menu();
if (1 == choiceCmd)
{
loadData(&seqTObj);
}
else if (2 == choiceCmd)
{
delInvalidDataAndStore(&seqTObj);
}
else if (3 == choiceCmd)
{
findTecherCousInfo(&seqTObj);
}
else if (4 == choiceCmd)
{
tongjiPGFS(&seqTObj);
}
else if (5 == choiceCmd)
{
tongjiXY(&seqTObj);
}
else if (6 == choiceCmd)
{
tongjiPJCJ(&seqTObj);
}
else if (0 == choiceCmd)
{
printf("欢迎下次使用...\r\n");
system("pause");
break;
}
system("pause");
system("cls");
}
return 1;
}