⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 student.cpp

📁 本课程设计意在通过课程的设计巩固和运用在课程中所学的理论知识和实验技能
💻 CPP
字号:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

const SUB_AMOUNT = 4;/*保存考试科目总数*/
const NAME_LEN = 8;  /*姓名长度*/

struct Student      
{
  char name[NAME_LEN];     /*保存姓名*/
  char sex;                /*保存性别,0为男,1为女*/
  long StudyNum;           /*保存学号*/
  float score[SUB_AMOUNT]; /*保存各科分数*/
  float total;               /*保存总分数*/
  struct Student *next;    /*定义指向下一个结构体的指针*/
 };

#define STU struct Student

STU *HEAD = NULL;/*链表的头指针*/

void main()
{
   int FunNumber;
   
   STU  *create();
   void AddStudent();
   void output();
   void ChangeStudent();
   void DelStudent();
   void paixu();
   void SearchStudent();
  
   printf("学生成绩记录为空,输入1创建,0退出:");
   scanf("%d",&FunNumber);

   if (1 == FunNumber) HEAD = create();
       else 
	   { 
	    printf("退出系统!");  
	    exit(0);
	   }

   if(NULL == HEAD) /*创建学生纪录不成功*/
   {
	   printf("退出系统!");
	   exit(0); 
   }
   
   do{
	  printf("************************\n");
      printf("|学生成绩系统主菜单界面|\n");
      printf("|    1.添加学生成绩    |\n");
      printf("|    2.显示学生成绩    |\n");
      printf("|    3.修改学生成绩    |\n");
      printf("|    4.删除学生成绩    |\n");
      printf("|    5.排序学生成绩    |\n");
      printf("|    6.查找学生成绩    |\n");
      printf("|    7.安全退出系统    |\n");
      printf("| ->学生成绩管理程序<- |\n");
      printf("************************\n");
      printf("请输入选择号(1--7):");
      scanf("%d",&FunNumber);

      switch(FunNumber)
       { 
	     case 1:
			 AddStudent();
			 break;
         case 2:
			 output();
			 break;
         case 3:
			 ChangeStudent();
			 break;
         case 4:
			 DelStudent();
			 break;
         case 5:
			 paixu();
			 break;
         case 6:
			 SearchStudent();
			 break;
		 case 7:
			 break;
         default:
			 printf("输入错误!");
			 break;
         }
     }while(FunNumber!=7);

   printf("退出系统!");

}   

STU *create()/*建立学生成绩的纪录,按学号从小到大插入学生信息*/
{
	int num=0;/*学生个数*/
	long number = -1;
	STU *p,*q,*find;
	char name[NAME_LEN];
	int i,sex;
	float cent,totalscore = 0;

	int CheckStudyNum(const long);
	
	printf("开始创建学生成绩记录!");

	printf("第%d个学生:",num+1);

	printf("请输入学号(为0时结束):");
	scanf("%ld",&number);
	
	while(number < 0)
	{
     printf("输入错误,请输入学号(为0时结束):");
	 scanf("%ld",&number);
	}
	if (0 == number) return NULL;
	
	while( 0 != number )
	{
		num++;
		p = new STU;

		p->StudyNum = number;

		printf("请输入姓名:");
		scanf("%s",name);
		for(i=0;i<NAME_LEN;i++) 
			p->name[i] = name[i];

		printf("请输入性别:");
		scanf("%d",&sex);
		p->sex = sex;

		printf("请依次输入各科分数,共%d科:",SUB_AMOUNT);
		totalscore = 0;
		for(i=0;i<SUB_AMOUNT;i++)
		{
			scanf("%f",&cent);
			p->score[i] = cent;
			totalscore += cent;
		}

		p->total = totalscore;

		if (1 == num) 
		{
			q = HEAD = p;
			q->next  = NULL;
		}
		else
		{
			find = HEAD;

			if(find->StudyNum > number) /*插入头结点之前*/
			{
				HEAD    = p;
                p->next = find;  
			}
            else
			{
		       while((NULL != find->next) && (find->StudyNum < number))
				  find = find->next;

			   if(NULL == find->next)/*插入链表尾部*/
			   {
                 q->next = p;
			     q = q->next;
		         q->next = NULL;
			   }
		       else/*插入p与p->next之间*/
			   {
                 p->next    = find->next;
			     find->next = p;
			   }

			}
		}
	    printf("第%d个学生:",num+1);

lp:		printf("请输入学号(为0时结束):");
		scanf("%ld",&number);

		while (number < 0)
		{
		  printf("输入错误,请输入学号(为0时结束):");
		  scanf("%ld",&number);
		}

		if(0 == CheckStudyNum(number))
		{
			printf("输入错误!");
			goto lp;
		}
	}
    
	return HEAD;
}

void AddStudent()
{
	int CheckStudyNum(const long);
	long number;
	STU *p,*find;
	char name[NAME_LEN];
	int i,sex;
	float cent,totalscore = 0;;

lp:	printf("请输入学号:");
	scanf("%ld",&number);

	while (number <= 0)
	{
		printf("输入错误,请输入学号:");
		scanf("%ld",&number);
	}

	if (0 == CheckStudyNum(number)) 
	{
		printf("输入错误!");
		goto lp;
	}
    
   	p = new STU;

	p->StudyNum = number;

	printf("请输入姓名:");
	scanf("%s",name);
	for(i=0;i<NAME_LEN;i++) 
		p->name[i] = name[i];

	printf("请输入性别:");
	scanf("%d",&sex);
	p->sex = sex;

	printf("请依次输入各科分数,共%d科:",SUB_AMOUNT);
	for(i=0;i<SUB_AMOUNT;i++)
	{
		scanf("%f",&cent);
	    p->score[i] = cent;
		totalscore += cent;
	}

	p->total = totalscore;

	find = HEAD;

	if(find->StudyNum > number) /*插入头结点之前*/
	{
		HEAD    = p;
        p->next = find;  
	}
    else
	{
	    while((NULL != find->next) && (find->StudyNum < number))
		 find = find->next;

		if(NULL == find->next)/*插入链表尾部*/
		{
          find->next = p;
		  find = find->next;
		  find->next = NULL;
		}
		else/*插入p与p->next之间*/
		{
           p->next    = find->next;
		   find->next = p;
		}
	}
  printf("操作成功!\n");
}

void output()
{
	STU *p = HEAD;
	FILE *fp;
	char PutStyle,ch;
	int i,j,len;
	char filename[20];
	char str1[2];
	char StrNum[10];
	char StrScore[10];
	float s;

	if (NULL == HEAD )
	{
		printf("学生纪录为空,请先建立学生纪录!\n");
		return;
	}
	printf("输入f将输出存储在文件,输入s将输出在屏幕:");
	scanf("%c",&PutStyle);
	scanf("%c",&PutStyle);

	while(('f' != PutStyle) && ('s' != PutStyle))
	{
		printf("输入错误!");
		printf("输入f将输出存储在文件,输入s将输出在屏幕:");
	    scanf("%c",&PutStyle);
	}

	if ('s' == PutStyle)
	{
   	  printf("%10s%15s%5s","name","studynumber","sex");
	  for(i=0;i<SUB_AMOUNT;i++) 
		  printf("%8s%d","subject",i+1);
	  printf("%8s\n","total");

      while(p!=NULL)
	  { 
		  printf("%10s",p->name);
		  printf("%15ld",p->StudyNum);
		  printf("%5d",p->sex);
		  for(i=0;i<SUB_AMOUNT;i++)
			  printf("%7.1f  ",p->score[i]);
		  printf("%6.1f\n",p->total);
		  p = p->next;
       }
	}
	else
	{
		printf("请输入要存储信息的文件名:");
		scanf("%s",filename);
		if (!(fp = fopen(filename,"w"))) 
			printf("打开文件出错");
		else
		{
			fputs("     name ",fp);
			fputs("   studynumber ",fp);
			fputs(" sex ",fp);
			for(i=0;i<SUB_AMOUNT;i++)
			{
				fputs("subject ",fp);
				j = i+1;
				itoa(j,str1,10);
				fputs(str1,fp);
				fputs(" ",fp);
			}
            fputs("total   \n",fp);
			
            while(p!=NULL)
			{ 
			 len = strlen(p->name);
			 for(i=1;i<=9-len;i++) fputs(" ",fp);
			 fputs(p->name,fp);
			 fputs(" ",fp);

			 itoa(p->StudyNum,StrNum,10);
			 len = strlen(StrNum);
			 for(i=1;i<=14-len;i++) fputs(" ",fp);
			 fputs(StrNum,fp);
			 fputs(" ",fp);

			 fputs("  ",fp);
			 ch=p->sex+48;
			 fwrite(&ch,1,1,fp);
			 fputs("  ",fp);

   		     for(i=0;i<SUB_AMOUNT;i++)
			 {
				 len = 0;
				 itoa(int(p->score[i]),StrScore,10);
				 fputs(StrScore,fp);
				 len += strlen(StrScore);

                 s = p->score[i]-int(p->score[i]);
				 if(0 != s)
				 {
                   fputs(".",fp);
				   len++;
                   while((s-int(s)) > 0.000001) s = s * 10;
				   
				   itoa((int)s,StrScore,10);
                   fputs(StrScore,fp);
				   len += strlen(StrScore);
				 }

				 for(j=1;j<=10-len;j++) fputs(" ",fp);
			 }
             
			 itoa(int(p->total),StrScore,10);
             fputs(StrScore,fp);
			 len = strlen(StrScore);

			 s = p->total - (int)p->total;
			 if ( 0 != s )
			 {
               fputs(".",fp);
			   len++;

               while((s-int(s)) > 0.000001) s = s * 10;
		       itoa((int)s,StrScore,10);
			   fputs(StrScore,fp);
			   len += strlen(StrScore);
			 }
			 for(j=1;j<=9-len;j++) fputs(" ",fp);
		     p = p->next;
			 fputs("\n",fp);
			}
			fclose(fp);
		}
	}
}

void ChangeStudent()
{
	long number;
    STU *SearchByNum(const long);
	STU *p;
	int FunNumber,ChangeSex,subject;
	float ChangeScore;

	printf("请输入你要更改的学生的学号:");
	scanf("%ld",&number);
 
    p = SearchByNum(number);
	if(NULL == p) 
	{
		printf("该学生不存在");
		return;
	}
    
lp:	printf("***************************\n");
    printf("|       更改学生信息      |\n");
	printf("|        1.更改姓名       |\n");
	printf("|        2.更改性别       |\n");
	printf("|        3.更改成绩       |\n");
	printf("|        0.取消操作       |\n");
	printf("***************************\n");
	printf("请输入你需要的操作:");

	scanf("%d",&FunNumber);
    
	 switch(FunNumber)
	 {
	  case 1:
		  printf("请输入姓名:");
		  scanf("%s",p->name);
		  break;
	  case 2:
		  printf("请输入性别:");
		  scanf("%d",&ChangeSex);
		  p->sex = ChangeSex;
		  break;
	  case 3:
error:	  printf("请输入你想更改的科目(1~%d):",SUB_AMOUNT);
		  scanf("%d",&subject);

		  if((0 < subject) && (SUB_AMOUNT > subject))
		  {
			  printf("请输入该科目成绩:");
			  scanf("%f",&ChangeScore);
			  p->total -= p->score[subject-1];
			  p->score[subject-1] = ChangeScore;
			  p->total += p->score[subject-1];
		  }
		  else goto error;
		  break;
	  case 0:
		  return;
		  break;
	  default:
		  printf("输入错误!\n");
		  goto lp;
		  break;
	 }
	 printf("操作已成功!\n");
}

void DelStudent()
{
   long number;
   int i;
   char sure;
   STU *SearchByNum(const long);
   STU *p,*find = HEAD;

   printf("请输入你要删除学生的学号:");
   scanf("%ld",&number);

   p = SearchByNum(number);
   if(NULL == p) 
	{
		printf("该学生不存在");
		return;
	}

   printf("该学生的信息如下:\n");
   printf("%10s%15s%5s","name","studynumber","sex");
	for(i=0;i<SUB_AMOUNT;i++) 
      printf("%8s%d","subject",i+1);
	 printf("%8s\n","total");

    printf("%10s",p->name);
	printf("%15ld",p->StudyNum);
    printf("%5d",p->sex);
    for(i=0;i<SUB_AMOUNT;i++)
	  printf("%7.1f  ",p->score[i]);
	printf("%6.1f\n",p->total);

	printf("确实要删掉吗?(y,n):");
    scanf("%c",&sure);
	scanf("%c",&sure);

   if (('y' == sure) || ('Y' == sure)) 
   {
     if (HEAD == p) HEAD = p->next;
     else
	 {
		 while(p != find->next) find = find->next;
		 find->next = p->next;
	 }
	 delete p;
    printf("操作已成功!\n");
   }
}

void paixu()
{
	STU *p = HEAD;
	STU *q = HEAD->next;
	float cent;

	while (NULL != p)
	{
		for(q = p->next;NULL != q;q = q->next)
		{
          if(p->total < q->total)
		  {
             cent = p->total;
			 p->total = q->total;
			 q->total = cent;
		  }
		 }
		p = p->next;
	}
	printf("操作已成功!\n");
}

void SearchStudent()
{
	long number;
	int i;
	STU *p;
	STU *SearchByNum(const long);

	printf("请输入你要查找的学生的学号:");
	scanf("%ld",&number);
    p = SearchByNum(number); 
    if(NULL == p) 
	{
		printf("该学生不存在");
		return;
	}

	printf("请输入你要查找的学生的信息如下:\n");
	printf("%10s%15s%5s","name","studynumber","sex");
	for(i=0;i<SUB_AMOUNT;i++) 
      printf("%8s%d","subject",i+1);
	 printf("%8s\n","total");

    printf("%10s",p->name);
	printf("%15ld",p->StudyNum);
    printf("%5d",p->sex);
    for(i=0;i<SUB_AMOUNT;i++)
	  printf("%7.1f  ",p->score[i]);
	printf("%6.1f\n",p->total);
}

int CheckStudyNum(const long number)/*检测所输入学号是否合理*/
{
	STU *find = HEAD;
    while(NULL != find)
	{			
		if(number == find->StudyNum) break;
		else find = find->next;
	}
      
	if (NULL != find) return 0;
	else return 1;
}

STU *SearchByNum(const long number)
{
	STU *find = HEAD;

	while(NULL != find)
	{
		if(number == find->StudyNum) break;
		find = find->next;
	}

	return find;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -