学生信息管理系统 链表和数组
老师给分贼水 多数人抄祖传下来代码
话不多说 上代码
**数组存储形式 **
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#define M 8
using namespace std;
//*******************************************************
struct Student{
char num[20];
char name[20];
char major[20];
char clas[20];
int score[3];
};
int N;
typedef struct Student STU;
//*******************************************************
void Input(STU *p,int &i);
void Output(STU *p);
void Save(STU *p);
int Fetch(STU *p);
void Max(STU[],int m);
double average_person(STU *p);
void Sort_select(STU *P);
void Sort_buble(STU *p);
void Sort_insert(STU *p);
void Search(STU *p);
void Ask();
void PrintMenu();
//*******************************************************
int main(){
int choice;
int m,n,i,j;
STU stu[N];
char filename[10];
STU *p;
p=stu;
while(1){
PrintMenu();
scanf("%d",&choice);
switch(choice){
case 1:{
printf("请输入即将录入信息的学生数\n");
scanf("%d",&N);
for(int i=0;i<N;i++){
Input(stu+i,i);
}
break;
}
case 3:{
getchar();
Save(stu);
printf("文件保存成功!\n");
Ask();
break;
}
case 2:{
printf("请输入想查看第几个学生的信息:\n");
scanf("%d",&n);
if(i>=0&&n<N){
Output(stu+n-1);
}
else{
printf("输入错误,查无此人\n");
}
Ask();
break;
}
case 4:{
if(Fetch(stu)==0){
printf("提取失败\n");
}
Ask();
break;
}
case 5:{
printf("请输入想查哪门科目的最高分\n");
scanf("%d",&m);
Max(stu,m);
Ask();
break;
}
case 6:{
printf("对某个专业的学生,按平均成绩由低到高选择排序为:\n");
Sort_select(stu);
Ask();
break;
}
case 7:{
printf("对某个班级的学生,按平均成绩由高到低起泡排名为:\n");
Sort_buble(stu);
Ask();
break;
}
case 8:{
printf("对某个班级的学生,按某门课程成绩由低到高进行直接插入排序:\n");
Sort_insert(stu);
Ask();
break;
}
case 9:{
printf("输入班级及某个分数,查找同学");
getchar();
Search(stu);
Ask();
break;
}
default:{
printf("请正确输入0~9之间的数字!\n");
break;
}
}//while
}return 0;
}
//main
//***********************************************************
//输入函数:学号、姓名、专业、班级、三科成绩、总成绩
void Input(STU *p,int &i){
int j;
printf("请输入第%d个学生的全部信息\n",i+1);
printf("请输入学生学号,回车结束\n");
scanf("%s",&p->num);
getchar();
printf("请输入学生姓名,回车结束\n");
gets(p->name);
printf("请输入学生专业,回车结束\n");
gets(p->major);
printf("请输入学生班级,回车结束\n");
scanf("%s",&p->clas);
getchar();
for(j=0;j<3;j++){
printf("请输入第%d门成绩,回车结束\n",j);
scanf("%d",&p->score[j]);
}
getchar();
}
//输出函数
void Output(STU *p){
printf("\n学号 名字 专业 班级 高数 日语 C语言");
printf("\n%s\t%s\t%s\t%s\t%d\t%d\t%d\t",p->num,p->name,p->major,p->clas,p->score[0],p->score[1],p->score[2]);
}
//保存函数、将数据存入文件
void Save(STU *p)
{
FILE *fp;
char filename[20];
int i;
printf("请输入要保存的文件名称:\n");
gets(filename);
if((fp=fopen("C:\\Users\\余悸\\Desktop\\student_list.txt","w+"))==NULL)
{
printf("新建文件失败,请重试:\n");
return;
}
for(i=0;i<N;i++)
{
//if(fwrite(p++,sizeof(STU),1,fp)!=1)
fprintf(fp,"学号 名字 专业 班级 高数 日语 C语言\n");
fprintf(fp,"%s\t%s\t%s\t%s\t%d\t%d\t%d\t",(p+i)->num,(p+i)->name,(p+i)->major,(p+i)->clas,(p+i)->score[0],(p+i)->score[1],(p+i)->score[2]);
//printf("文件写入失败,请重试!\n");
}
fclose(fp);
}
//阅读函数、读取文件中学生的信息
int Fetch(STU *p)
{
FILE *fp;
int i=0;
if ((fp = fopen("C:\\Users\\余悸\\Desktop\\student_list.txt","rb")) == NULL)
{
//printf("1");
fclose(fp);
return 0;
}
//fseek(fp,(long)(sizeof(STU)),0);
//rand()%N;
fseek(fp, sizeof(Student) * 1, SEEK_SET);
Student* student = new Student();
fread(student,sizeof(STU),1,fp);
printf("已读取到第%d个学生的信息\n",i+1);
printf("学号 名字 专业 班级 高数 日语 C语言\n");
printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\t",(p+i)->num,(p+i)->name,(p+i)->major,(p+i)->clas,(p+i)->score[0],(p+i)->score[1],(p+i)->score[2]);
fclose(fp);
return 1;
}
//选择排序函数、对某个专业的学生,按总平均成绩由低到高进行选择排序
void Sort_select(STU *p){
int i,j,k;
double t,aver[N];
STU a;
char b[10];
getchar();//吸收回车字符
printf("请输入你要查看成绩的专业:\n");
gets(b);
for(i=0;i<N;i++)
{
aver[i]=average_person(p+i);
}
for(i=0;i<N-1;i++)
{
k=i;
for(j=i+1;j<N;j++)
if(aver[k]>aver[j])
k=j;
t=aver[i];
aver[i]=aver[k];//交换平均值
aver[k]=t;
a=*(p+i);
*(p+i)=*(p+k);
*(p+k)=a;//交换指针的引用
}
for(i=0;i<N;i++){
if(!strcmp((p+i)->major,b)){
printf("专业: %s\t班级: %s\t姓名: %s\t平均成绩: %5.3f\n",(p+i)->major,(p+i)->clas,(p+i)->name,aver[i]);}
}
}
//冒泡排序函数、对某个班级的学生,按总平均成绩由高到低进行起泡排序
void Sort_buble(STU *p)
{
int i,j;
double t, aver[N];
char b[20];
STU a;
printf("选择一个班级:\n");
scanf("%s",b);
for(i = 0;i < N;i++)
{
aver[i] = average_person(p+i);
}
for(i = 0;i < N;i++){
for(j = 0;j < N-1-i;j++){
if(aver[j]<aver[j+1])
{
t = aver[j];
aver[j] = aver[j+1];
aver[j+1] = t;
a = *(p+j);
*(p+j) = *(p+j+1);
*(p+j+1) = a;
}
}
}
printf("%s班平均分从高到低为\n",b);
for(i = 0;i < N;i++){
if(!strcmp((p+i)->clas,b)){
printf("姓名:%s\t平均分=%5.3f\n",(p+i)->name,aver[i]);
}
}
}
//插入排序函数、对某个班级的学生,按某门课程成绩由低到高进行直接插入排序
void Sort_insert(STU *p)
{
int i, j, id, temp;
int grade[N];
char b[20];
int k = 0;
STU *m;
m = p;
printf("请输入你想查看成绩的班级:\n");
scanf("%s",&b);
printf("请输入你想查看成绩的课程:\n");
scanf("%d", &id);
if(id<0||id>2){
printf("请输入正确的科目!\n");
return;
}
getchar();
for (i = 0;i < N;i++,p++){
if(!strcmp((p+i)->clas,b)){
grade[k] = p->score[id];
k++;
}
}
for (i = 1;i < k;i++)
if(grade[i]<grade[i-1])
{
temp = grade[i];
j = i-1;
do{
grade[j+1] = grade[j];
j--;
}
while (j >= 0&&temp < grade[j]);
grade[j+1] = temp;
}
printf("对该班级的学生,按课程成绩由低到高进行插入排序为:\n");
for(i = 0;i < k; i++){
p = m;
for (j = 0; j < N;j++,p++){
if((!strcmp(p->clas,b))&&(p->score[id]==grade[i])){
printf("专业: %s\t班级: %s\t姓名: %s\t该门课程的分数为: %5.3f\n",(p)->major,(p)->clas,(p)->name,p->score[id]);
printf("\n");
}
}
}
}
//搜索函数、实现班级和成绩的综合查找
void Search(STU *m){
STU *p;
int j,sum_scores;
int limit_score;
int op;
char a[20];
j=0;
printf("请输入学生班级:\n");
scanf("%s",&a);
getchar();
printf("请输入查找选项1.低于某分数 2.高于某分数\n");
scanf("%d",&op);
if(op==2){
printf("请问您想要查询总分再多少以上学生?\n");
scanf("%d",&limit_score);
printf("您查询的学生信息为:\n");
for(p=m;p<m+N;p++){
sum_scores=(p->score[0])+(p->score[1])+(p->score[2]);
if(!strcmp((p->clas),a)){
if(sum_scores>=limit_score){
Output(p);
printf("\n");
j++;
}
else{
printf("该班无超过%d的学生!\n",limit_score);
}
}
if(j==0){
printf("您查找的班级不存在!");
}
}
}
else if(op==1){
printf("请问您想要查询总分在多少以下学生?\n");
scanf("%d",&limit_score);
printf("您查询的学生信息为:\n");
for(p=m;p<m+N;p++){
sum_scores=(p->score[0])+(p->score[1])+(p->score[2]);
if(!strcmp((p->clas),a)){
if(sum_scores<=limit_score){
Output(p);
printf("\n");
j++;
}
else{
printf("该班无低于%d的学生!\n",limit_score);
}
}
if(j==0){
printf("您查找的班级不存在!");
}
}
}
else{
printf("请输入正确的数字功能!\n");
}
}//Search
//求所有学生某门课程的最高分和分数最高的学生的姓名
void Max(STU *stu,int grade_m)
{
STU *p;
p=stu;
if(grade_m<0||grade_m>2){
printf("请输入正确的科目!\n");
return;
}
int max1=0;
for(int i=0;i<N;i++){
if((p+i)->score[grade_m]>max1){
max1=(p)->score[grade_m];
}
}
for(int i=0;i<N;i++){
if(max1==(p+i)->score[grade_m]){
printf("第%d科的最高分的人是 %s\n",grade_m,(p+i)->name);
printf("他的第%d科的分数是 %d",grade_m,(p+i)->score[grade_m]);
printf("\n");
}
}
return ;
}
//询问函数
void Ask()
{
int c;
printf("\n您所需要的功能已经实现,是否继续进行?若退出请输入0\n");
scanf("%d",&c);
if(c==0)
exit(0);
}
//计算平均分函数
double average_person(STU *p)
{
return (((p->score[0])+(p->score[1])+(p->score[2]))/3.0);
}
void PrintMenu(){
printf( "***********************功能菜单***************************************\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( "9.实现班级和成绩的综合查找\n" ) ;
printf( "0.结束程序\n" ) ;
printf( "***********************************************************************\n") ;
printf("\n");
printf("请输入选择的功能\n");
}
链表存储形式
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
int n ;
struct Student{
char num[20];
char name[20];
char major[20];
char clas[20];
float score[3];
Student *next;
//Student *pre;
};
typedef Student Node;
void CreateList(int n);//创建链表 输入学生的信息
void OutPut(Node *p);//输出所有或一个学生的信息
void Save(Node *h); //保存所有学生信息到文件
int Fetch(Node *h);//随机读取某个学生的信息
void Search_num( Node *h, char *stu_id ) ; // 查找指定学号的学生,返回该学生的指针
void InsertList( Node *h, char *id); // 添加一个学生信息到链表中,保持有序性
void Delete_num( Node *h, char *stu_id ) ; // 删除指定学号的学生
void Search_Major_SubjectScore(Node *h, char* stu_profes , int score_id , int stu_score ) ; // 查找某个专业某门课程小于某个分数的学生
void Delete_Major_Subject( Node *h, char* stu_profes , int score_id , int stu_score ) ; // 删除某个专业某门课程小于某个分数的学生
void PrintMenu();//打印菜单
void CreateList(Node *h,int n){
for(int i=0;i<n;i++){
Student *s = new(Student);
printf("请输入第%d个学生的全部信息\n",i+1);
printf("请输入该生的学号 姓名 专业 班级\n");
scanf( "%s%s%s%s", &s->num, s->name, s->major, s->clas ) ;
printf("请输入该学生的高数 日语 C语言的成绩\n");
scanf( "%f%f%f", &s->score[0], &s->score[1], &s->score[2] ) ;
s->next = h->next; // s接到第一个节点前面
h->next = s ; // s变成第一个
}
}
void OutPut(Node *p){
printf("学号 名字 专业 班级 高数 日语 C语言");
printf("\n%s\t%s\t%s\t%s\t%.2f\t%.2f\t%.2f\n",p->num,p->name,p->major,p->clas,p->score[0],p->score[1],p->score[2]);
}
void Save(Node *h){
FILE *fp;
char filename[20];
int i;
printf("请输入要保存的文件名称:\n");
gets(filename);
if((fp=fopen("C:\\Users\\余悸\\Desktop\\student_list.txt","w+"))==NULL)
{
printf("新建文件失败,请重试:\n");
return;
}
Node *p=h;
p=p->next;
while(p!=NULL){
fprintf(fp,"学号 名字 专业 班级 高数 日语 C语言\n");
fprintf(fp,"%s\t%s\t%s\t%s\t%.2f\t%.2f\t%.2f\t",p->num,p->name,p->major,p->clas,p->score[0],p->score[1],p->score[2]);
p = p->next;
}
fclose(fp);
}
int Fetch(Node *p){
FILE *fp;
int i=0;
if ((fp = fopen("C:\\Users\\余悸\\Desktop\\student_list.txt","rb")) == NULL)
{
fclose(fp);
return 0;
}
i = rand()%n;
fseek(fp, sizeof(Student) * i, SEEK_SET);
Student* student = new (Student);
fread(student,sizeof(Node),1,fp);
printf("已读取到第%d个学生的信息\n",i+1);
printf("学号 名字 专业 班级 高数 日语 C语言\n");
printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\t",student->num,student->name,student->major,student->clas,student->score[0],student->score[1],student->score[2]);
fclose(fp);
return 1;
}
void Search_num( Node *h,char *stu_id ) {
Node *p = h;
p=p->next;;
while(p!=NULL){
if(!(strcmp(p->num,stu_id))){
printf("该学生的信息为\n");
OutPut(p);
return ;
}
p=p->next;
}
printf("查无此人 可能退学了\n");
return ;
}
void InsertList(Node *h,char *id){
Node *p=h,*pre=h;
p=p->next;
Student *s = new(Student);
strcpy(s->num,id);
printf("请输入新插入学生的全部信息\n");
printf("请输入该生的姓名 专业 班级\n");
scanf( "%s%s%s", s->name, s->major, s->clas ) ;
printf("请输入该学生的高数 日语 C语言的成绩\n");
scanf( "%f%f%f", &s->score[0], &s->score[1], &s->score[2] ) ;
while(p!=NULL){
if(strcmp(p->num,id)>0){
s->next = pre->next;
pre->next = s;
s->next = p;
return ;
}
else{
pre=p;
p=p->next;
}
}
s->next = h->next;
h->next = s;
return ;
}
void Delete_num( Node *h,char *stu_id ){
Node *p = h,*pre = h;
p=p->next;
while(p!=NULL){
if(!(strcmp(p->num,stu_id))){
pre->next = p->next;
delete(p);
printf("已成功删除该学生的信息\n");
return;
}
pre = p;
p = p->next;
}
printf("没有此学号的学生,可能已经被删除了!\n");
return;
}
void Search_Major_SubjectScore(Node *h,char *major,int clas_i,int score_d){
Node *p = h;
p = p->next;
while(p!=NULL){
if(!(strcmp(p->major,major))){
if(p->score[clas_i]<score_d){
printf("%s专业第%d门课程小于%d分的学生的信息为\n",major,clas_i,score_d);
OutPut(p);
return ;
}
}
p=p->next;
}
printf("查无此人 可能退学了\n");
return ;
}
void Delete_Major_Subject(Node *h, char* stu_profes , int score_id , int stu_score ){
Node *p = h,*pre = h;
p=p->next;
while(p!=NULL){
if(!(strcmp(p->num,stu_profes))){
if(p->score[score_id]<stu_score){
pre->next = p->next;
delete(p);
printf("已成功删除该学生的信息\n");
return;
}
}
pre = p;
p = p->next;
}
printf("没有此学号的学生,可能已经被删除了!\n");
return;
}
void PrintMenu(){
printf( "***********************功能菜单***************************************\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( "9.删除某个专业某门课程小于某个分数的学生\n" );
printf( "0.结束程序\n");
printf( "***********************************************************************\n") ;
printf("\n");
}
int main(){
int op;
Node *h;
h = new (Student);// 初始化链表h
h->next = NULL ;
while( 1 ) {
PrintMenu() ;
printf( "请输入选择功能:" ) ;
scanf( "%d", &op ) ;
if (op == 1) {
printf( "请输入学生个数:" ) ;
scanf( "%d", &n );
CreateList( h,n );
}
else if (op == 2) {
int op2;
printf("请选择输出功能:\n");
printf("1.输出全部学生的信息。\n");
printf("2.输出某个学生的信息。\n");
scanf("%d",&op2);
if(op2 == 1){
Node *p=h;
p=p->next;
while(p!=NULL){
OutPut(p);
p = p->next;
}
}
else if( op2 == 2){
int n;
Node *p=h;
printf("请输入查看学生的顺序\n");
scanf("%d",&n);
p=p->next;
for(int i=0;i<n;i++){
p = p->next;
}
OutPut(p);
}
else{
printf("请输入正确的数字!\n");
}
}
else if (op == 3) {
Save(h);
printf( "成功保存到文件“student_list.txt”中\n" ) ;
}
else if(op==4){
if(Fetch(h)==0){
printf("提取失败\n");
}
}
else if(op==5){
printf("请输入查找学生的学号\n");
char str[20];
scanf("%s",str);
Search_num(h,str);
}
else if(op==6){
printf("请输入插入学生的学号");
char id[100];
scanf("%s",&id);
InsertList(h,id);
}
else if(op==7){
printf("请输入要删除学生的学号\n");
char str[20];
scanf("%s",str);
Delete_num(h,str);
}
else if(op==8){
printf("请输入要查找学生的专业 课程 小于的分数\n");
char str[20];
int class_i,score_d;
scanf("%s",str);
scanf("%d %d",&class_i,&score_d);
Search_Major_SubjectScore(h,str,class_i,score_d);
}
else if(op==9){
printf("请输入要删除学生的的专业 课程 小于的分数\n");
char str[20];
int class_i,score_d;
scanf("%s",str);
scanf("%d %d",&class_i,&score_d);
Delete_Major_Subject(h,str,class_i,score_d);
}
else if( op == 0){
break;
}
else{
printf("请输入正确的数字!\n");
}
}
return 0;
}
完成这两个实验,你可能对C语言代码有了一丝丝的兴趣,能力可能有了很大的提升,但是你绝对会厌倦这种ctrl+c、ctrl+v的工作生活,不对,多数程序员的工作就是这样。
看到这里的海大学子们,希望早点摆脱卷的绩点生活,编码能力越来越好,中国未来的IT行业是你们的!