📄 成绩.cpp
字号:
/*成绩管理*/
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
/*用结构体存储学生信息*/
struct student
{
int stunum;
char name[MAX];
float score;
student *next;
};
typedef student* PSTU;
/*创建成绩表*/
PSTU CREATELIST ();
/*将成绩表按学号从小到大排列*/
PSTU RANK (PSTU T);
/*交换结点的内容*/
void CHANGE (PSTU a,PSTU b);
/*搜索成绩表*/
PSTU SEARCH (PSTU T);
/*按成绩查询成绩表*/
void SEARCH1 (PSTU T);
/*比较字符串*/
int COMSTRING (char *a , char *b);
/*复制字符串*/
void COPY (char *a , char *b);
/*修改成绩表*/
void CORRECT ( PSTU T ) ;
/*补充成绩表*/
PSTU ADDITION (PSTU T);
/*删除结点*/
PSTU DELETE (PSTU T);
/*输出成绩表*/
void OUTPUT ( PSTU T );
/*释放无用的链表*/
void main()
{
int i = 0;
char answer,ch;
PSTU stu ,stu1;
stu = CREATELIST (); /*创建成绩表*/
stu = RANK (stu); /*排列成绩表*/
printf("成绩表(按学号排序输出) :\n\n");
OUTPUT (stu) ; /*输出成绩表*/
printf ("\n是否对现有成绩表进行修改(修改.删除或添加成绩).(y/n):");
cin>>ch;
while (ch == 'y'||ch == 'Y')
{
printf("\n更正成绩表中的某些错误:1\n");
printf("删除成绩表中的某些成绩:2\n");
printf("将某些成绩添加到成绩表:3\n");
cin>>i;
if ( i==1)
{
do
{
CORRECT (stu);
stu = RANK (stu);
printf("是否继续修改(y/n):");
cin>>answer;
}while (answer == 'y'||answer == 'Y');
}
if ( i==2)
{
do
{
stu = DELETE (stu);
stu = RANK (stu);
printf("是否继续删除(y/n):");
cin>>answer;
}while (answer == 'y'||answer == 'Y');
}
if( i == 3)
{
do
{
stu = ADDITION (stu);
stu = RANK (stu);
printf("是否继续补充(y/n):");
cin>>answer;
}while (answer == 'y'||answer == 'Y');
}
printf("\n修改后的成绩表:\n");
OUTPUT (stu) ;
printf("是否继续对现有的成绩表进行修改修改(y/n):");
cin>>ch;
}
printf("\n是对成绩表进行查询(y/n):");
cin>>answer;
while (answer == 'y'||answer == 'Y')
{
printf("\n对某个人成绩进行查询:1\t对某个成绩段的成绩进行查询:2\n");
cin>>i;
if(i == 1)
{
do
{
stu1 = SEARCH (stu);
printf ("学生学号\t\t\t学生姓名\t\t\t学生成绩\n" );
printf ("%d\t\t\t\t%s\t\t\t\t%.1f\n",stu1->stunum, stu1->name , stu1->score);
printf("是否继续对某个人成绩进行查询(y/n):\n");
cin>>ch;
}while (ch == 'y'||ch == 'Y');
}
if(i == 2)
{
do
{
SEARCH1 ( stu );
printf("是否继续对某个成绩段进行查询(y/n):\n");
cin>>ch;
}while (ch == 'y'||ch == 'Y');
}
printf("\n是否继续对成绩表进行查询(y/n):\n");
cin >>answer;
}
}
/*创建成绩表*/
PSTU CREATELIST ()
{
int n , i;
PSTU S,T,D;
printf ("请输入学生人数:");
cin>>n;
printf ("请输入学生信息.\n\n");
for (i = n ; i > 0;i = i - 1)
{
D = new student; /* 申请新结点*/
printf("学生学号:");/*输入学生信息*/
cin>>D->stunum;
printf("学生姓名:");
scanf ("%s",D->name);
printf("学生成绩:");
cin>>D->score ;
D->next = NULL;
if ( i == n)
{
S = D ; /* 用S指向D*/
T = S; /*用T保留第一个结点*/
}
if ( i < n )
{
S ->next = D; /*将S->next 指向新结点,并且S前进*/
S = S->next;
}
printf("\n");
}
return T ;
}
/*将成绩表按学号从小到大排列*/
PSTU RANK (PSTU T)
{
PSTU M ,D;
int n = 0,i = 0 ,j = 0;
M = T;
D = T;
while(D!=NULL) /*计算链表的长度*/
{
n = n+1;
D = D->next;
}
for (i= 1 ;i <= (n -1) ;i++ )
{
while (M ->next!= NULL) /*当结点中学生学号比下一个学生学号小,交换两结点的信息*/
{
if (M->stunum >(M->next->stunum))
CHANGE ( M , M->next); /*调用交换信息的函数*/
M = M->next ;
}
M = T;
}
return T;
}
/*交换结点的内容*/
void CHANGE (PSTU a,PSTU b)
{
PSTU D;
D = new student; /*申请新结点用来作中转*/
D->stunum = a->stunum; /*保存a结点的信息*/
D->score = a->score;
COPY(D->name , a->name);
a->stunum = b->stunum; /*将b结点的信息写入a中*/
a->score = b->score;
COPY(a->name , b->name);
b->stunum =D->stunum; /*将保存的a结点中的信息写入b中*/
b->score =D->score;
COPY(b->name , D->name);
delete D; /*删除无用的结点*/
}
/*复制字符串*/
void COPY (char *a , char *b)
{
int i = 0;
while(b[i] != '\0' && i< MAX) /*复制字符串*/
{
a[i] = b[i];
i = i + 1;
}
a[i] = '\0'; /*复制完字符串以'\0'标志结束*/
}
/*输出成绩表*/
void OUTPUT ( PSTU T )
{
PSTU p;
p = T;
printf ("学生学号\t\t\t学生姓名\t\t\t学生成绩\n" );
do
{
printf ("%d\t\t\t\t%s\t\t\t\t%.1f\n",p->stunum, p->name , p->score);
p = p->next;
}
while (p != NULL);
}
/*搜索成绩表*/
PSTU SEARCH (PSTU T)
{
int i = 0 ,stun;
char name[MAX];
PSTU M ;
printf ("按学号搜索此人信息:1\t按姓名搜索此人信息:2\n");
cin>>i;
if (i == 1)
{
N: M = T; /*输入错误时,使M重新指向成绩表的头结点*/
printf ("输入要查找的学生学号:");
cin>>stun;
while ( (M != NULL)&& (M->stunum != stun))
{
M = M->next;
}
if (M == NULL) /*输入错误时,提示并要求重新输入*/
{
printf("输入错误,请确认输入.\n") ;
goto N;
}
}
if (i == 2)
{
L: M = T;
printf ("输入要查找的学生姓名:");
scanf ("%s",name);
while ( (M != NULL) && COMSTRING(M->name, name) != 1 )
{
M = M->next;
}
if (M == NULL)
{
printf("输入错误,请确认输入.\n") ;
goto L;
}
}
return M;
}
/*比较字符串*/
int COMSTRING (char *a, char *b)
{
int i = 0;
while ((a[i] == b[i])&&a[i] != '\0'&&b[i]!='\0')
{
i++;
}
if (a[i] == b[i])
return 1; /*字符串相等返回1*/
else
return 0; /*字符串不等返回0*/
}
/*按成绩查询成绩表*/
void SEARCH1 (PSTU T)
{
PSTU M ;
int i = 0;
float a,b;
M = T;
printf("输入要查询的成绩段范围(如60 99,中间有空格):\n");
cin>>a>>b;
while( M!=NULL )
{
if ((M->score >= a)&&(M->score<=b)) /*查找结点要求满足的条件*/
{
if( i == 0)
{
printf ("学生学号\t\t\t学生姓名\t\t\t学生成绩\n" );
}
printf("%d\t\t\t\t%s\t\t\t\t%f\n",M->stunum, M->name , M->score);
i++;
}
M = M->next;
}
if( i == 0)
printf("没有任何学生的成绩在此成绩段里.\n");
}
/*修改成绩表*/
void CORRECT ( PSTU T )
{
PSTU M;
int i = 0;
printf("\n(如果输入了两个相同的学号,修改时请按学生姓名查询进行修改.)\n\n");
M = SEARCH ( T );
printf("修改学号:1\t修改姓名:2\t修改成绩:3\n");
cin>>i;
if( i == 1)
{
printf("将其学号该为:");
cin>>M->stunum;
}
if( i == 2)
{
printf("将其姓名该为:");
scanf ("%s",M->name);
}
if (i == 3)
{
printf("将其成绩该为:");
cin>>M->score;
}
}
/*补充成绩表*/
PSTU ADDITION (PSTU T)
{
PSTU D ;
D = new student;
printf("学生学号:");
cin>>D->stunum;
printf("学生姓名:");
scanf ("%s",D->name);
printf("学生成绩:");
cin>>D->score ;
D->next = T;
return D;
}
/*删除结点*/
PSTU DELETE (PSTU T)
{
PSTU M ,D;
printf("输入要删除成绩的学生学号或学生姓名\n");
D = SEARCH ( T);
M = D ;
M = M->next;
if (D = T) /*如果删除的是头结点,则返回新的头结点*/
{
delete D;
return M;
}
else
{
delete D;
return T;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -