自动化与电气类专业大一第一学期C语言的课程设计,留给后来的新生参考。
前排提醒:由于链表和文件不属于课程学习内容,且本人自学能力菜得真实,因此本人写的课设没有使用到链表(在学了在学了)。但据本人同学所说链表的使用也在验收评分标准内,建议学弟学妹在课设开始时就学习链表的使用,不要太晚才开始学。
希望通过具体实例了解链表或学号尾数为1的学弟学妹可以参考我一位室友的文章:
功能齐全,注释详细。除此之外还有三篇文章详细介绍了他的函数,下面是他的主页:
在这里我们先看一眼我们的题目(历年题目的具体要求可能不太一样,也许你们这届的更难?也说不定)
接下来我们开始上菜!
PS:使用前请在你的电脑F盘内创建allinformation.txt和information.txt两个文本文件,如电脑没有F盘,请修改此代码中所有涉及到文件使用的部分。(注意此处的“.txt”为文件后缀名(扩展名),“allinformation”和“information”才是文件名。请电脑文件夹不显示后缀名的同学注意不要加“.txt”)
PSS:本人第一学期一直使用的DEV-C,第二学期入坑VS后发现根本停不下来,建议还在使用DEV-C的学弟学妹早日熟悉VS的使用(真的很好用!)。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
void menu();
void shuru();
void paixu();
void tongji();
void chaxun();
void xiugai();
void shanchu();
void tuichu();
FILE *fp1;
typedef struct information
{ char name[18];
char team[10];
int totalscore;
int highestscore;
double averagescore;
int number;
int totaltimes;
char coach[10];
}pi;
pi pif[30];
main()
{ menu();
int xuan;
printf("输入选项:");
scanf("%d",&xuan);
while (1){
fp1=fopen("f:\\information.txt","rb+");
switch(xuan){
case 1:shuru();break;
case 2:paixu();break;
case 3:tongji();break;
case 4:chaxun();break;
case 5:xiugai();break;
case 6:shanchu();break;
case 7:tuichu();break;
default :break;
}
if(xuan!=1&&xuan!=2&&xuan!=3&&xuan!=4&&xuan!=5&&xuan!=6&&xuan!=7){
printf("输入错误!请重新输入:\n");
scanf("%d",&xuan);
getchar();
fclose(fp1);
}
else {
fclose(fp1);
system("cls");
menu();
printf("输入选项:");
scanf("%d",&xuan);
}
}
}
void menu()
{ int i;
printf("\n");
for (i=0;i<97;i++)
printf("#");
printf("\n");
printf("#\t\t\t\t欢迎来到NBA球员生涯数据统计系统!\t\t\t\t#\n#\t\t\t\t\t\t\t\t\t\t\t\t#\n");
printf("#\t\t1——球员信息录入\t\t\t");
printf("2——球员排序\t\t\t\t#\n#\t\t\t\t\t\t\t\t\t\t\t\t#\n");
printf("#\t\t3——球员信息统计\t\t\t");
printf("4——球员记录查询\t\t\t#\n#\t\t\t\t\t\t\t\t\t\t\t\t#\n");
printf("#\t\t5——球员信息修改\t\t\t");
printf("6——球员记录删除\t\t\t#\n#\t\t\t\t\t\t\t\t\t\t\t\t#\n");
printf("#\t\t7——退出系统\t\t\t\t\t\t\t\t\t#\n");
for (i=0;i<97;i++)
printf("#");
printf("\n");
}
void shuru()//输入模块
{ void xiugai();
int i=1,a,k,num;
char tac[10];
pi pilr,pibh;
getchar();
do{
i=1;
printf("请输入球员名称:");
scanf("%s",pilr.name);
fread(&pibh,sizeof(pi),1,fp1);
while(!feof(fp1)){//feof()是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0
if (strcmp(pibh.name,pilr.name)==0){//如果字符串相同,返回0
printf("\n该球员已经存在,是否修改数据(按1确认修改,按其他键取消)?\n");
scanf("%d",&a);
i=0;
break;
}
fread(&pibh,sizeof(pi),1,fp1);
}
rewind(fp1);//将文件指针的位置倒回文件开头
}while(i==0&&a!=1);//检测用户输入的球员是否已存在
if (a==1) xiugai();
if (i==1) {
printf("请输入球员所属球队:");
scanf("%s",pilr.team);
do{
rewind(fp1);
k=0,i=1;
fread(&pibh,sizeof(pi),1,fp1);
while(!feof(fp1)){
if (strcmp(pibh.team,pilr.team)==0) {strcpy(tac,pibh.coach);num=pibh.number;k++;}
fread(&pibh,sizeof(pi),1,fp1);
}
if (k>=2) {
printf("该球队已存在两名球员,请重新输入球队名:\n");
k=0,i=0;
scanf("%s",pilr.team);
}
}while (i==0);//确保每个球队最多只有两名球员
printf("请输入球员的生涯累计得分:");
scanf("%d",&pilr.totalscore);
printf("请输入球员的生涯最高分:");
scanf("%d",&pilr.highestscore);
printf("请输入球员的生涯平均得分:");
scanf("%lf",&pilr.averagescore);
printf("请输入球员号码:");
scanf("%d",&pilr.number);
if (k==1) {
do{
while (pilr.number==num){
printf("该号码已在此队伍中存在,请重新输入:");
scanf("%d",&pilr.number);
}//确保一个队伍的球员号码不会重复
do{
i=1;
if (pilr.number<1||pilr.number>99){
printf("球员号码应介于1~99之间,请重新输入:");
scanf("%d",&pilr.number);
i=0;
}
}while (i==0);
}while (i==0||pilr.number==num);
}
do{
i=1;
if (pilr.number<1||pilr.number>99){
printf("球员号码应介于1~99之间,请重新输入:");
scanf("%d",&pilr.number);
i=0;
}
}while (i==0);
pilr.totaltimes=pilr.totalscore*1.00/pilr.averagescore;
printf("请输入球员所属教练:");
scanf("%s",pilr.coach);
if (k==1) {
while (strcmp(pilr.coach,tac)!=0){
printf("同一支球队只能有一名教练,请重新输入:\n");
scanf("%s",pilr.coach);
}
}//使每个球队只有一名教练
getchar();
fwrite(&pilr,sizeof(pi),1,fp1);
printf("\n录入成功!回到主菜单\n");
system("pause");
}
}
void sort (struct information *p[],int n,int c)//排序函数,用于球员排序和球员信息统计
{ int i,j,k;
struct information *w;
for (i=0;i<n-1;i++){
k=i;
if (c==1){
for (j=i+1;j<n;j++)
if (strcmp(p[j]->team,p[k]->team)==-1)
k=j;
}
else if (c==2){
for (j=i+1;j<n;j++)
if (p[j]->totalscore<p[k]->totalscore)
k=j;
}
else if (c==3){
for (j=i+1;j<n;j++)
if (p[j]->highestscore<p[k]->highestscore)
k=j;
}
else if (c==4){
for (j=i+1;j<n;j++)
if (p[j]->totaltimes<p[k]->totaltimes)
k=j;
}
else if (c==5){
for (j=i+1;j<n;j++)
if (p[j]->averagescore<p[k]->averagescore)
k=j;
}
else if (c==6){
for (j=i+1;j<n;j++)
if (p[j]->number<p[k]->number)
k=j;
}
else if (c==7){
for (j=i+1;j<n;j++)
if (strcmp(p[j]->coach,p[k]->coach)==-1)
k=j;
}
if (k!=i){
w=p[i];p[i]=p[k];p[k]=w;
}
}
}
void paixu()//排序模块
{ void sort(struct information *p[],int,int);
pi pilr,pibh;
int a,m=0,n,flag=0;
printf("请选择排序依据:\n");
printf("1-根据所属球队排序\n");
printf("2-根据生涯累计得分排序\n");
printf("3-根据生涯最高分排序\n");
printf("4-根据生涯参赛场次排序\n");
printf("5-根据生涯平均得分排序\n");
printf("6-根据球员号码排序\n");
scanf("%d",&a);
rewind(fp1);
fread(&pilr,sizeof(pi),1,fp1);
while(!feof(fp1)){
strcpy(pif[m].name,pilr.name);
strcpy(pif[m].team,pilr.team);
pif[m].totalscore=pilr.totalscore;
pif[m].highestscore=pilr.highestscore;
pif[m].averagescore=pilr.averagescore;
pif[m].number=pilr.number;
pif[m].totaltimes=pilr.totaltimes;
strcpy(pif[m].coach,pilr.coach);
m++;
flag=1;
fread(&pilr,sizeof(pi),1,fp1);
}//将文件内容逐一录入结构体数组中,对结构体数组进行排序
struct information *p[30];
for (n=0;n<=m-1;n++)
p[n]=&pif[n];
sort(p,m,a);
printf("球员名称 球员所属球队 生涯累计得分 生涯最高分 生涯参赛场次 生涯平均分 球员号码 所属教练\n");
for (n=0;n<=m-1;n++)
printf("%-12s%-15s%-15d%-12d%-12d%-12.2f%-10d%-10s\n",p[n]->name,p[n]->team,p[n]->totalscore,p[n]->highestscore,p[n]->totaltimes,p[n]->averagescore,p[n]->number,p[n]->coach);
system("pause");
}
void tongji()//统计模块
{ printf("球队\t 教练\t 球员");
void sort(struct information *p[],int,int);
pi pilr,pibh;
int m=0,n,i,t,k=0;
char str[10];
rewind(fp1);
fread(&pilr,sizeof(pi),1,fp1);
while(!feof(fp1)){
strcpy(pif[m].name,pilr.name);
strcpy(pif[m].team,pilr.team);
pif[m].totalscore=pilr.totalscore;
pif[m].highestscore=pilr.highestscore;
pif[m].averagescore=pilr.averagescore;
pif[m].number=pilr.number;
pif[m].totaltimes=pilr.totaltimes;
strcpy(pif[m].coach,pilr.coach);
m++;
fread(&pilr,sizeof(pi),1,fp1);
}
struct information *p[30];
for (n=0;n<=m-1;n++)
p[n]=&pif[n];
sort(p,m,1);
strcpy(str,p[0]->team);
for (i=0,t=0;t<=m;i++){
if (t!=m&&strcmp(str,p[t]->team)==0){
k++,t++;
}
else {
printf("\n%-12s%-8s%-10s",p[t-k]->team,p[t-k]->coach,p[t-k]->name);
if (k>=2){
for (i=1;i<k;i++)
printf("%-10s",p[t-k+i]->name);
}
if (t<m)
strcpy(str,p[t]->team);
i=-1,k=0;
if (t==m) {printf("\n");break;}
}
}
system("pause");
}
void chaxun()//查询模块
{
char cha[10];
int a,flag=0;
pi pilr;
printf("请选择查询类型:\n1-按球员名称查询\n2-按球员所属球队查询\n3-按球员所属教练查询\n");
scanf("%d",&a);
if (a==1){
printf("请输入球员名称:");
scanf("%s",cha);
printf("球员名称 球员所属球队 生涯累计得分 生涯最高分 生涯参赛场次 生涯平均分 球员号码 所属教练\n");
fread(&pilr,sizeof(pi),1,fp1);
while(!feof(fp1)){
if (strcmp(cha,pilr.name)==0){
printf("%-12s%-15s%-15d%-12d%-12d%-12.2f%-10d%-10s\n",pilr.name,pilr.team,pilr.totalscore,pilr.highestscore,pilr.totaltimes,pilr.averagescore,pilr.number,pilr.coach);
flag=1;
}
fread(&pilr,sizeof(pi),1,fp1);
}
if (flag==1) printf("\n查询完毕!");
else if (flag==0) printf("\n没有满足该条件的记录!");
}
else if (a==2){
printf("请输入球员所属球队:");
scanf("%s",cha);
printf("球员名称 球员所属球队 生涯累计得分 生涯最高分 生涯参赛场次 生涯平均分 球员号码 所属教练\n");
fread(&pilr,sizeof(pi),1,fp1);
while(!feof(fp1)){
if (strcmp(cha,pilr.team)==0){
printf("%-12s%-15s%-15d%-12d%-12d%-12.2f%-10d%-10s\n",pilr.name,pilr.team,pilr.totalscore,pilr.highestscore,pilr.totaltimes,pilr.averagescore,pilr.number,pilr.coach);
flag=1;
}
fread(&pilr,sizeof(pi),1,fp1);
}
if (flag==1) printf("\n查询完毕!\n");
else if (flag==0) printf("\n没有满足该条件的记录!\n");
}
else if (a==3){
printf("请输入球员所属教练:");
scanf("%s",cha);
printf("球员名称 球员所属球队 生涯累计得分 生涯最高分 生涯参赛场次 生涯平均分 球员号码 所属教练\n");
fread(&pilr,sizeof(pi),1,fp1);
while(!feof(fp1)){
if (strcmp(cha,pilr.coach)==0){
printf("%-12s%-15s%-15d%-12d%-12d%-12.2f%-10d%-10s\n",pilr.name,pilr.team,pilr.totalscore,pilr.highestscore,pilr.totaltimes,pilr.averagescore,pilr.number,pilr.coach);
flag=1;
}
fread(&pilr,sizeof(pi),1,fp1);
}
if (flag==1) printf("\n查询完毕!");
else if (flag==0) printf("\n没有满足该条件的记录!");
}
else {
printf("输入错误,即将退出!");
}
system("pause");
}
void xiugai()//修改模块
{ FILE *p;
pi pilr,pibh;
char gai[10],zancun[10];
int a,xiu,i,m=0,k,t,j=0,flag=0,choice;
rewind(fp1);
fread(&pilr,sizeof(pi),1,fp1);
while(!feof(fp1)){
strcpy(pif[m].name,pilr.name);
strcpy(pif[m].team,pilr.team);
pif[m].totalscore=pilr.totalscore;
pif[m].highestscore=pilr.highestscore;
pif[m].averagescore=pilr.averagescore;
pif[m].number=pilr.number;
pif[m].totaltimes=pilr.totaltimes;
strcpy(pif[m].coach,pilr.coach);
m++;
fread(&pilr,sizeof(pi),1,fp1);
}
rewind(fp1);
printf("请输入球员名称:");
scanf("%s",gai);
fread(&pilr,sizeof(pi),1,fp1);
p=fopen("f:\\allinformation.txt","wb+");
while(!feof(fp1)){
j++;
if (strcmp(pilr.name,gai)==0){
printf("\n1-球员名称\t 2-所属球队\t\n");
printf("3-生涯累计得分\t 4-生涯最高分\t\n");
printf("5-生涯参赛场次\t 6-生涯平均得分\t\n");
printf("7-球员号码\t 8-所属教练\t\n");
printf("请选择要修改的项目:");
scanf("%d",&xiu);
if (xiu==1) {
do{
i=1;
printf("你要将%s改为:",pilr.name);
scanf("%s",zancun);
rewind(fp1);
fread(&pibh,sizeof(pi),1,fp1);
while(!feof(fp1)){
if (strcmp(pibh.name,zancun)==0){
printf("\n该球员名称已经存在,请重新输入\n");
i=0;
break;
}
fread(&pibh,sizeof(pi),1,fp1);
}
}while (i==0);
rewind(fp1);
for (i=0;i<j;i++){
fread(&pilr,sizeof(pi),1,fp1);
strcpy(pilr.name,zancun);
}
}
else if (xiu==2) {
printf("你要将所属球队由%s改为:",pilr.team);
scanf("%s",pilr.team);
do{
k=0,i=1;
for (t=0;t<m;t++){
if (strcmp(pif[t].team,pilr.team)==0) {strcpy(zancun,pif[t].coach);k++;}
}
if (k>=2) {
printf("该球队已存在两名球员,请重新输入球队名:\n");
k=0,i=0;
scanf("%s",pilr.team);
}
}while (i==0);
if (k==1){
printf("检测到该队伍已存在教练,将自动更新该球员的教练信息\n");
strcpy(pilr.coach,zancun);
}}
else if (xiu==3) {
printf("你要将生涯累计得分由%d改为:",pilr.totalscore);
scanf("%d",&pilr.totalscore);
printf("生涯累计得分修改,需要对平均得分或参赛场次进行修改:\n1-自动更新平均得分\n2-自动更新参赛场次\n");
do{
i=1;
scanf("%d",&choice);
if (choice==1){
pilr.averagescore=pilr.totalscore*1.00/pilr.totaltimes;
printf("平均得分已自动更新!\n");
}
else if (choice==2){
pilr.totaltimes=pilr.totalscore/pilr.averagescore;
printf("参赛场次已自动更新!\n");
}
else {
getchar();
printf("输入错误,请重新输入:");
i=0;
}
} while (i==0);}
else if (xiu==4) {
printf("你要将生涯最高分由%d改为:",pilr.highestscore);
scanf("%d",&pilr.highestscore);}
else if (xiu==5) {
printf("你要将生涯参赛场次由%d改为:",pilr.totaltimes);
scanf("%d",&pilr.totaltimes);
printf("生涯参赛场次修改,需要对平均得分或生涯累计得分进行修改:\n1-自动更新平均得分\n2-自动更新生涯累计得分\n");
do{
i=1;
scanf("%d",&choice);
if (choice==1){
pilr.averagescore=pilr.totalscore*1.00/pilr.totaltimes;
printf("平均得分已自动更新!\n");
}
else if (choice==2){
pilr.totalscore=pilr.totaltimes*pilr.averagescore;
printf("生涯累计得分已自动更新!\n");
}
else {
getchar();
printf("输入错误,请重新输入:");
i=0;
}
} while (i==0);}
else if (xiu==6) {
printf("你要将生涯平均得分由%.2f改为:",pilr.averagescore);
scanf("%lf",&pilr.averagescore);
printf("生涯平均得分修改,需要对生涯累计得分或参赛场次进行修改:\n1-自动更新生涯累计得分\n2-自动更新参赛场次\n");
do{
i=1;
scanf("%d",&choice);
if (choice==1){
pilr.totalscore=pilr.totaltimes*pilr.averagescore;
printf("生涯累计得分已自动更新!\n");
}
else if (choice==2){
pilr.totaltimes=pilr.totalscore/pilr.averagescore;
printf("参赛场次已自动更新!\n");
}
else {
getchar();
printf("输入错误,请重新输入:");
i=0;
}
} while (i==0);}
else if (xiu==7) {
printf("你要将球员号码由%d改为:",pilr.number);
scanf("%d",&pilr.number);
do{
i=1;
if (pilr.number<1||pilr.number>99){
printf("球员号码应介于1~99之间,请重新输入:");
scanf("%d",&pilr.number);
i=0;
}
}while (i==0);}
else if (xiu==8) {
printf("你要将所属教练由%s改为:",pilr.coach);
scanf("%s",&pilr.coach);}
flag=1;
}
fwrite(&pilr,sizeof(pi),1,p);
fread(&pilr,sizeof(pi),1,fp1);
}
if (flag==0) {
printf("没有该球员的记录!");
fclose(p);
}
if (flag==1){
printf("按1确认更新修改后的信息:");
scanf("%d",&a);
fclose(p);
fclose(fp1);
if (a==1){
p=fopen("f:\\allinformation.txt","rb+");
fp1=fopen("f:\\information.txt","wb+");
fread(&pilr,sizeof(pi),1,p);
while(!feof(p)){
fwrite(&pilr,sizeof(pi),1,fp1);
fread(&pilr,sizeof(pi),1,p);
}
fclose(fp1);
printf("操作成功!");
}
else printf("修改取消");
}
printf("\n回到主菜单");
system("pause");
}
void shanchu()//删除模块
{ FILE *p;
pi pilr,pibh;
char shan[10],zancun[10];
int xiu,i,flag=0;
rewind(fp1);
printf("请输入球员名称:");
scanf("%s",shan);
fread(&pilr,sizeof(pi),1,fp1);
p=fopen("f:\\allinformation.txt","wb+");
while(!feof(fp1)){
if (strcmp(pilr.name,shan)==0){
printf("已找到该球员的信息:\n");
printf("球员名称 所属球队 ");
printf("生涯累计得分 生涯最高分 ");
printf("生涯参赛场次 生涯平均得分 ");
printf("球员号码 所属教练\n");
printf("%-10s\t%s\t\t%d\t\t%d\t\t%d\t\t%.2f\t\t%d\t%s\t",pilr.name,pilr.team,pilr.totalscore,pilr.highestscore,pilr.totaltimes,pilr.averagescore,pilr.number,pilr.coach);
printf("\n是否将其信息删除?按1-确认删除 按其他键-取消删除\n");
scanf("%d",&xiu);
if (xiu==1) {
printf("删除成功");
flag=2;
fread(&pilr,sizeof(pi),1,fp1);
if (feof(fp1)!=0) break;
}
else {
printf("删除取消");
flag=1;
}
}
fwrite(&pilr,sizeof(pi),1,p);
fread(&pilr,sizeof(pi),1,fp1);
}
if (flag==0) {
printf("没有该球员的记录!");
}
fclose(p);
p=fopen("f:\\allinformation.txt","rb+");
fclose(fp1);
fp1=fopen("f:\\information.txt","wb+");
fread(&pilr,sizeof(pi),1,p);
while(!feof(p)){
fwrite(&pilr,sizeof(pi),1,fp1);
if(fread(&pilr,sizeof(pi),1,p)==0) break;
}
fclose(fp1);
fclose(p);
printf("\n回到主菜单");
system("pause");
} //新建一个空白文件,将除待删除的球员信息以外的全部球员信息复制到空白文件中,再将原文件清空,将新建文件的内容复制到原文件中
void tuichu()
{ int a;
printf("按1退出系统:\n");
scanf("%d",&a);
if (a==1) {
printf("\n\t |-----------------------------------------------------------|\n");
printf("\t | |\n");
printf("\t | 感谢访问! |\n");
printf("\t | 欢迎下次再次访问! |\n");
printf("\t | |\n");
printf("\t |-----------------------------------------------------------|\n");
printf("\t | |\n");
printf("\t | |\n");
printf("\t | 作者: |\n");
printf("\t | 自动化与电气类21XX班 阿P (名字可不要也抄了哦) |\n");
printf("\t | |\n");
printf("\t |-----------------------------------------------------------|\n");
printf("系统将在3秒后退出");
Sleep(3000);
exit(0);
}
else {
printf("\n退出取消 回到主菜单");
system("pause");
}
}
非常感谢你看到这里,在这里我想作为一个即将成长为学长的过来人给学弟学妹提一些建议:
大一上学期一定一定一定要好好学!别看大一上学期只有二十出头的学分,和别的学期相比看起来微不足道。搭嘎!大一很多东西都会参考你第一学期的加权和排名的。学长(我暂且这么自称吧)在第一学期末参加了卓越班的选拔,因为成绩不合要求连面试都没走到;第二学期又尝试辅修计科,结果发现人家只收前百分之十五的学生(学长第一学期在百分之三十左右徘徊)。第一学期排名的影响远远不止这些,很多评奖评优都会看你第一学期的加权的。所以,
大一第一学期一定要好好学!
大一第一学期一定要好好学!
大一第一学期一定要好好学!
拒绝摆烂!
学长只能帮你到这了,编写课设时遇到什么问题也可以在评论区里提,学长也会尽量为你们解答。
最后,欢迎你们分流时选择人工智能专业,有时间也可以带带学长我。