资源描述
X X 师 范 大 学
实 验 报 告
课 程 C语言课程设计
任课老师
学 号
姓 名
院 系
_______年______月至_______年_______月
注意事项
1. 使用C语言,代码已在vs中运行过,能够运行(关键功效全部能实现)
2. 需求分析,前期设计全部没写,请同学们自己完成
3. 附带有 student.txt 文件,将其移动至 F:\stu 文件夹中,运行程序时可直接选 6号指令,从中读取学生信息。假如没有该txt文件(可能会在上传过程中丢失),仍需在F盘下新建stu文件夹,各文件将保留于该文件夹中
4. 按word格式输出还未设计好,有爱好可自己完成
5. 按excel格式输出,完成后需自行调整对应列宽(拉宽),使内容美观
6. 从下一页开始,复制余下全文,粘贴即可运行
#include<stdio.h>
#define M 30 //班级总人数,暂定30,可修改
#define N 3 //课程成绩门数,暂定3,可修改
int inputstu(struct student stu[], int m, int n);
void prinstu(struct student stu[], int m, int n);
int sortsno(struct student stu[], int m);
int sortage(struct student stu[], int m);
int sortmark(struct student stu[],int sm[], int m, int n);
void prinsort(struct student stu[], int m, int n);
int writefile(struct student stu[], FILE *fp, int m, int n);
int readfile(struct student stu[], FILE *fp, int m, int n);
int fprinword(struct student stu[], FILE *fp, int m, int n);
int fprinexcel(struct student stu[], FILE *fp, int m, int n);
int seachsno(struct student stu[],long sno, int m,int n);
int seachsname(struct student stu[],char sname[], int m, int n);
int desno(struct student stu[], long sno, int m);
int desname(struct student stu[], char sname[], int m);
int cutin(struct student stu[], int m, int n);
struct student
{
int turn;
long sno;
char sname[20];
char sgrade[10];
char sbirth[10];
int smark[N];
};
void main()
{
int i = 0;
int con1 = 0;
int con2 = 0;
long sno;
char sname[20];
FILE *fp = NULL;
struct student stu[M];
for (i = 0; i < M; i++)
{
stu[i].turn = -1;
}
do {
printf("\n\n********************************************\n");
printf(" \n *** 学生信息管理系统 ***\n\n");
printf(" *** 请按提醒输入对应命令: ***\n\n");
printf(" 1 键盘输入全部学生基础信息\n");
printf(" 2 屏幕输出全部学生基础信息\n");
printf(" 3 子菜单:按一定次序对学生进行排序\n");
printf(" 4 按次序屏幕输出学生信息\n");
printf(" 5 保留学生信息(二进制文件)\n");
printf(" 6 从上次保留二进制文件中读取学生信息\n");
printf(" 7 子菜单:将学生信息保留为文本文档(人工阅读)\n");
printf(" 8 子菜单:对单个学生插入删除查询修改\n");
printf(" -1 退出系统\n");
scanf("%d", &con1);
switch (con1)
{
case 1:
{
printf("\n*** 注意! ***\n");
printf(" 继续进行输入会覆盖原数据!!!\n");
printf(" 第一次使用本软件或需重新写信息请继续:\n ");
printf(" 1 继续\n");
printf(" -1 返回\n");
scanf("%d", &con2);
if (con2 == 1)
{
inputstu(stu, M, N);
}
break;
}
case 2:prinstu(stu, M, N); break;
case 3:
{
do {
printf("\n****************************************\n");
printf(" 1 按学号次序进行排序\n");
printf(" 2 按年纪从小到大排序\n");
printf(" 3 按总成绩由高到低排序\n");
printf(" -1 返回上一级菜单\n");
scanf("%d", &con2);
switch (con2)
{
case 1:
{
sortsno(stu, M);
con2 = 0;
break;
}
case 2:
{
//sortage(stu, M);
break;
}
case 3:
{
int sm[M];
sortmark(stu, sm, M, N);
break;
}
case -1:break;
default:
printf("二级命令输入错误,请重试!\n");
fflush(stdin);
}
} while (con2 != -1);
break;
}
case 4:prinsort(stu, M, N); break;
case 5:writefile(stu, fp, M, N); break;
case 6:readfile(stu, fp, M, N); break;
case 7:
{
printf("\n************************************************\n");
printf(" 1 将学生信息输出为txt文档,路径:F:\stu\student.txt\n");
printf(" 2 将学生信息输出为word文档, 路径:F:\stu\student.doc \n");
printf(" 3 将学生信息输出为excel文档, 路径:F:\stu\student.xls \n");
printf(" -1 返回上一级菜单\n");
scanf("%d", &con2);
switch (con2)
{
case 1:
{
break;
}
case 2:
{
fprinword(stu, fp, M, N);
break;
}
case 3:
{
fprinexcel(stu, fp, M, N);
break;
}
}
}
break;
case 8:
{
do
{
printf("\n*******************************\n\n");
printf(" 1 按学号查询单个学生\n");
printf(" 2 按姓名查询单个学生\n");
printf(" 3 按学号删除单个学生\n");
printf(" 4 按姓名删除单个学生\n");
printf(" 5 插入单个学生信息\n");
printf("-1 返回主菜单\n");
scanf("%d", &con2);
switch (con2)
{
case 1:
{
printf("请输入单个学号:\n");
scanf("%10ld", &sno);
seachsno(stu, sno, M, N);
break;
}
case 2:
{
printf("请输入单个学生姓名:\n");
scanf("%20s",sname);
seachsname(stu, sname, M, N);
break;
}
case 3:
{
printf("请输入单个学号:\n");
scanf("%10ld",&sno);
desno(stu, sno, M);
break;
}
case 4:
{
printf("请输入单个学生姓名:\n");
scanf("%s", sname);
desname(stu, sname, M);
break;
}
case 5:
{
cutin(stu, M, N);
break;
}
default:
{
printf("二级指令错误,请重新输入!\n");
break;
}
}
} while (con2 != -1);
}
case -1:printf("感谢使用本系统!\n"); break;
default:
printf("一级命令输入错误,请重试");
fflush(stdin);
break;
}
} while (con1 != -1);
}
//输入学生基础信息
int inputstu(struct student stu[],int m,int n)
{
int i = 0;
int j = 0;
printf("请按说明输入学生信息:\n");
while (i < m)
{
printf("请输入第%d个学生学号,姓名,班级,出生日期:\n", i + 1);
scanf("%10ld%20s%10s%10s", &stu[i].sno, &stu[i].sname, &stu[i].sgrade, &stu[i].sbirth);
for (j = 0; j < n; j++)
{
printf("请输入第%d个学生第%d门成绩\n",i+1,j+1);
scanf("%d", &stu[i].smark[j]);
}
i++;
}
return i;
}
//屏幕输出学生信息
void prinstu(struct student stu[], int m, int n)
{
int i = 0;
int j = 0;
printf("**********************************************************\n");
printf("学生基础信息以下:\n");
printf(" 学号 姓名 班级 出生年月 成绩1 成绩2 成绩3\n");
while (i < m)
{
if (stu[i].sno == 0)
{
i++;
continue;
}
printf("%10ld %20s%10s %10s ", stu[i].sno, stu[i].sname, stu[i].sgrade, stu[i].sbirth);
for (j = 0; j < n; j++)
{
printf(" %d ", stu[i].smark[j]);
}
printf("\n");
i++;
}
}
//按学号次序进行排序
int sortsno(struct student stu[],int m)
{
int i = 0;
int j = 0;
int s;
long sno[M];
for (i = 0; i < M; i++)
{
sno[i] = stu[i].sno;
}
for (i = 0; i < m; i++)
{
for (j = i+1; j < m; j++)
{
s = sno[i];
if (s >sno[j])
{
s = sno[j];
sno[j] = sno[i];
sno[i] = s;
}
}
}
for (i = 0; i < m; i++)
{
for (j = 0; j < m; j++)
{
if (stu[j].sno == sno[i])
{
stu[j].turn = i;
}
}
}
return i;
}
//按年纪对学生进行排序;
int sortage(struct student stu[], int m)
{
}
//按总成绩由高到低排序
int sortmark(struct student stu[],int sm[], int m,int n)
{
int i = 0;
int j = 0;
int s = 0;
for (i = 0; i < m; i++)
{
sm[i] = 0;
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
sm[i] = sm[i] + stu[i].smark[j];
}
}
for (i = 0; i < m; i++)
{
for (j = i + 1; j < m; j++)
{
s = sm[i];
if (s <sm[j])
{
s =j;
}
sm[s] = 0;
stu[s].turn = i;
}
}
return i;
}
//按次序屏幕输出
void prinsort(struct student stu[],int m,int n)
{
int i = 0;
int j = 0;
int k = 0;
printf("\n**********************************************************\n");
printf("按排序,学生基础信息以下:\n");
printf(" 学号 姓名 班级 出生年月 成绩1 成绩2 成绩3\n");
while (k < m)
{
if (stu[i].sno == 0)
{
continue;
}
for (i = 0; i < m; i++)
{
if (stu[i].turn == k)
{
printf("%10ld %20s%10s %10s ", stu[i].sno, stu[i].sname, stu[i].sgrade, stu[i].sbirth);
for (j = 0; j < n; j++)
{
printf(" %d ", stu[i].smark[j]);
}
printf("\n");
}
}
k++;
}
}
//写数据进二进制文件
int writefile(struct student stu[],FILE *fp,int m,int n)
{
int i = 1;
fp = fopen("f:\\stu\\student.txt", "wb");
if (fp == NULL)
{
printf("打开文件失败!\n");
exit(0);
}
fwrite(&stu[0],sizeof(struct student),m,fp);
i = fclose(fp);
return i;
}
//从二进制中读取学生信息
int readfile(struct student stu[], FILE *fp, int m, int n)
{
int i = 1;
fp = fopen("f:\\stu\\student.txt", "rb");
if (fp == NULL)
{
printf("打开文件失败!\n");
exit(0);
}
fread(&stu[0], sizeof(struct student), m, fp);
i = fclose(fp);
return i;
}
//将学生信息写入word文档,保留于 F:\stu\student.doc
int fprinword(struct student stu[], FILE *fp, int m, int n)
{
int i = 0;
int j = 0;
fp = fopen("F:\\stu\\student.doc","w");
if (fp == NULL)
{
printf("文件打开失败!");
exit(0);
}
while (i < m)
{
if (stu[i].sno == 0);
{
continue;
}
fprintf(fp,"%10ld %20s%10s%10s", stu[i].sno, stu[i].sname, stu[i].sgrade, stu[i].sbirth);
for (j = 0; j < n; j++)
{
fprintf(fp," %d ", stu[i].smark[j]);
}
printf("\n");
i++;
}
fclose(fp);
return i;
}
//将学生信息写入excel文档,保留于 F:\stu\student.xls
int fprinexcel(struct student stu[], FILE *fp, int m, int n)
{
int i = 0;
int j = 0;
char t = '\t';
char lin[20]="成绩";
char str[4][20];
strcpy(str[0], " 学号");
strcpy(str[1], " 姓名");
strcpy(str[2], " 班级");
strcpy(str[3], " 生日");
fp = fopen("F:\\stu\\student.xls", "w");
if (fp == NULL)
{
printf("文件打开失败!");
exit(0);
}
fprintf(fp, "%s%c%s%c%s%c%s", str[0], t, str[1], t, str[2], t, str[3]);
for (i = 0; i < n; i++)
{
fprintf(fp, "%c %s%d", t, lin, i+1);
}
fprintf(fp, "\n");
i = 0;
while (i < m)
{
if (stu[i].sno == -1)
{
continue;
}
fprintf(fp, "%10ld%c%20s%c%10s%c%10s", stu[i].sno,t, stu[i].sname,t, stu[i].sgrade,t, stu[i].sbirth);
for (j = 0; j < n; j++)
{
fprintf(fp, "%c%d", t,stu[i].smark[j]);
}
fprintf(fp,"\n");
i++;
}
fclose(fp);
return i;
}
//按学号查询单个学生
int seachsno(struct student stu[],long sno,int m,int n)
{
int i = 0;
int j = 0;
for (i = 0; i < m; i++)
{
if (stu[i].sno == sno)
{
printf("按学号查询到学生基础信息以下:\n");
printf(" 学号 姓名 班级 出生年月 成绩1 成绩2 成绩3\n");
printf("%10ld %20s%10s %10s ", stu[i].sno, stu[i].sname, stu[i].sgrade, stu[i].sbirth);
for (j = 0; j < n; j++)
{
printf(" %d ", stu[i].smark[j]);
}
printf("\n");
break;
}
}
return i;
}
//按姓名查询单个学生
int seachsname(struct student stu[],char sname[], int m, int n)
{
int i = 0;
int j = 0;
int s = -1;
for (i = 0; i < m; i++)
{
s = strcmp(stu[i].sname, sname);
if (s == 0)
{
printf("按姓名查询到学生基础信息以下:\n");
printf(" 学号 姓名 班级 出生年月 成绩1 成绩2 成绩3\n");
printf("%10ld %20s%10s %10s ", stu[i].sno, stu[i].sname, stu[i].sgrade, stu[i].sbirth);
for (j = 0; j < n; j++)
{
printf(" %d ", stu[i].smark[j]);
}
printf("\n");
break;
}
}
return i;
}
//按学号删除单个学生信息
desno(struct student stu[], long sno,int m)
{
int i = 0;
for (i = 0; i < m; i++)
{
if (stu[i].sno == sno)
{
stu[i].sno = 0;
break;
}
}
return i;
}
//按姓名删除单个学生
int desname(struct student stu[], char sname[], int m)
{
int i = 0;
int j = 0;
int s = -1;
for (i = 0; i < m; i++)
{
s = strcmp(stu[i].sname, sname);
if (s == 0)
{
stu[i].sno = 0;
break;
}
}
return i;
}
//插入单个学生
int cutin(struct student stu[],int m,int n)
{
int i = 0;
int j = 0;
for (i=0;i<m;i++)
{
if (stu[i].sno == 0)
{
printf("请输入第%d个学生学号,姓名,班级,出生日期:\n", i + 1);
scanf("%10ld%20s%10s%10s", &stu[i].sno, &stu[i].sname, &stu[i].sgrade, &stu[i].sbirth);
for (j = 0; j < n; j++)
{
printf("请输入第%d个学生第%d门成绩\n", i + 1, j + 1);
scanf("%d", &stu[i].smark[j]);
}
break;
}
if (i == m - 1)
{
printf("临时没有空结构!\n");
}
}
return i;
}
展开阅读全文