史上最详细c语言学生管理系统(完整的源代码)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>


struct student
{
char sno[12];
char name[9];

char sex[5];
struct score
{
double China;
double shuxue;
double English;
double sum;
double average;
} fenshu;
int age;
struct student *next;
};
typedef struct student ID;//声明结构体同义词,方便使用
int total;//学生管理系统的实际人数
//各函数的声明
ID* Create(); //创建学生管理系统
void Save(ID *head); //保存学生信息文件
ID * Read(); //读取学生信息文件
void Display(ID * head); //显示学生信息文件
ID* Add(ID* head); //添加学生信息
ID* Change(ID* head); //修改学生信息
void Search(ID *head); //按照姓名或者类型查找学生
ID* Delete(ID *head); //删除学生信息
void Sort(ID *head);
/************************************************
*函数名: main(主函数)
*功能:显示主菜单
*返回值:NULL
*************************************************/
void main()
{
ID*head=NULL;//链表头结点
int choice;//用户菜单选择
while(1)
{
system("cls");//清屏
printf("\n");
printf("*************简易学生管理系统*************\n\n");
printf("\t1.创建简易学生管理系统\n\n");
printf("\t2.显示学生文件信息\n\n");
printf("\t3.添加新学生\n\n");
printf("\t4.修改学生的信息\n\n");
printf("\t5.查找学生\n\n");
printf("\t6.删除学生\n\n");
printf("\t7.排序学生\n\n");
printf("\t8.退出简易学生管理系统\n\n");
printf("\n\n");
printf("请输入你的选择(1~8):");
scanf("%d",&choice);//选择功能
getchar();//吸收回车符
switch(choice)
        {
         case 1: head=Create(); //创建学生管理系统子函数
            break;
         case 2: head=Read();   //读取学生管理系统文件子函数
                 if(head!=NULL) 
                     Display(head);  //显示学生管理系统
            break;
         case 3: head=Read();   //读取学生管理系统文件子函数
                 if(head!=NULL) 
                     head=Add(head); //添加新生
             break;
         case 4:  head=Read();  
                 if(head!=NULL) 
                     head=Change(head); //修改新生
            break;
         case 5:  head=Read();
                 if(head!=NULL) 
                     Search(head); //查找学生
            break;
         case 6:  head=Read();  
                 if(head!=NULL) 
                     head=Delete(head); //删除学生
            break;
         case 7: head=Read(); 
                 if(head!=NULL) 
                     Sort(head); //排序学生
            break;
         case 8: exit(0);       //退出
            break;
         default: printf("\n你输入错了,请你重新输入\n");
                  getch();
        }
    }
}
/***********************************************
*函数名:Create(创建)
*功能:创建一个单链表,把数据放在链表里面,一旦需要保存,就调用save函数保存在文件中
*返回值:ID *(结构体链表头节点指针)
***********************************************/
ID* Create()
{   
    int k=0;

    FILE *fp;       //定义一个文件指针,接收fopen的返回值,用于最后的关闭文件
    ID *head,*p1,*tail,*p3; 
             
    
    if ((fp=fopen("student.txt","r"))==NULL)      //如果文件不存在就创建
    {
        head=p1=tail=NULL;
        while(1)                //这个循环可以实现多次添加新学生信息
    {
     bb1:  p1= (ID*)malloc(sizeof(ID)); //给p1分配一个动态存储空间
           p1->next=NULL;
           printf("请输入姓名(当你不想录入时,在姓名处输入*,结束录入):\n");
           fflush(stdin);
           scanf("%8s",p1->name);       //输入姓名
  p1->name[8]=0;
          if(strcmp(p1->name,"*")==0)   //判断输入的是否为*号,是则结束函数
          {
            if(total==0)                //当记录人数为0时不创建学生文件
            {
             printf("你输入了0条记录,单链表没有创建...\n");
             free(p1);                  //释放p1空间
             return (head);         //把head返回
            }
            else
            {
                break;                  //跳出while循环
            }
          }
          fflush(stdin);
          printf("请输入学号: \n");
          scanf("%11s",p1->sno);
     
          p3=head;      //让p3从头开始遍历
          while(p3!=NULL)       //当p3不为空时
          {
                if((strcmp(p1->name,p3->name)==0)&&(strcmp(p1->sno,p3->sno)==0))
        {
                free(p1);
                    printf("你重复输入了。\n");
                goto bb1;
        }
                p3=p3->next;
          }
             //使得每个字段都能有效结束
 
          p1->sno[11]=0;
 
 fflush(stdin);
 printf("请输入学生性别:");
 scanf("%4s",p1->sex);
 fflush(stdin);
 printf("请输入学生年龄:");
 scanf("%d",&p1->age);
 fflush(stdin);
 printf("请输入学生科目成绩(语文,数学,英语):");
 scanf("%lf%lf%lf",&p1->fenshu.China,&p1->fenshu.shuxue,&p1->fenshu.English);
 
 p1->fenshu.sum=p1->fenshu.China+p1->fenshu.shuxue+p1->fenshu.English;
 p1->fenshu.average=p1->fenshu.sum/3.0;
 if(head==NULL)
 {
            head=p1;                //head和p2都为p1
            tail=p1;
          }
          else
          { 
            tail->next=p1;      //第二次以后的执行命令,目的就是p1向后移,而head的位置不变
            tail=p1;
          }
          
        total++;                //录入一个人后,总数就加1
    }
        tail->next=NULL;                     //尾指针域赋值为NULL
        free(p1);
        printf("\n新建简易学生管理系统成功,共有%d个学生\n ",total);
        getchar();      //这个getchar是吸收回车键的
        Save(head); //将新创建的学生链表保存到学生文件中
    }
    else  
    {
        printf("\n\t学生信息文件已经存在,不能重复创建!\n\n按任意键返回主菜单\n\n");
        getch();     //输入任意键进入下一步
    }  
    return head;        //返回头指针 
}
/*void Save(ID *head)
{


}*/




/************************************************
*函数名:Save(保存)
*功能:将链表(数据)保存在文件
*返回值:NULL
*参数:链表头节点
*************************************************/
void Save(ID *head) 
{
FILE *fp; //定义一个文件指针,接收fopen的返回值,用于最后的关闭文件 
    ID* t ; //定义一个指针,从头到尾遍历一遍单链表,向文件中写入
    if ((fp=fopen("student.txt","w"))==NULL) //打开文件来写入
    {
        printf("打开文件失败!\n");
        getch();     //输入任意键进入下一步
        exit(0); //退出
    }
    t=head; //把头指针赋给t,让它从头开始
    while(t!=NULL) //只要t指针不为空,即等于链表没有结束
    {
       fwrite(t,sizeof(ID),1,fp); //把链表写入文件中
       t=t->next; //指针后移
    }
    fclose(fp); //把文件关闭
    printf("\n文件保存成功\n");
printf("\n请按任意键返回主菜单\n");
getch(); 
}




/************************************************
*函数名:Read(读取学生文件)
*功能:读取文件中的信息并将其放入单链表中,并且最后返回一个头指针
*返回值:ID *(结构体指针)
*************************************************/
ID * Read()
{
    FILE *fp; //定义一个文件指针,接收fopen的返回值,用于最后的关闭文件
    ID *t1,*t2,*head=NULL;
   
    if((fp=fopen("student.txt","r"))==NULL)      //判断文件是否存在
    {
        printf("打开文件失败!没有该文件\n\n");
  printf("请按任意键返回主菜单\n");
        getch();
return 0;
     }
rewind(fp);  //这个函数是把一个文件的位置指针从新移至开头,不然的话会出现一个组数据丢失
    t1=(ID *) malloc(sizeof(ID)); //申请动态空间
    head=t2=t1; //把t1赋给头结点
    while(!feof(fp)) //feof函数的功能是判断这个文件是不是结束了,如果结束了,返回一个非零值,否则返回一个0,
    {
        if(fread(t1,sizeof(ID),1,fp)!=1) //fread函数返回读出数据项的个数
           break;  //如果没有读取内容,则结束 
        t1->next=(ID *)malloc(sizeof(ID)); //把在申请动态空间的同时,把t1的next指向下一个结点
        t2=t1;     //t2是真正的尾节点
t1=t1->next; //t1向后移一个结点
    }
    t2->next=NULL; 
fclose(fp); //关闭文件
    return head; //返回一个头指针,因为在没有创建一个单链表和文件的时候,就是靠这个头指针进行一系列的操作的
}




/************************************************
*函数名: Display(显示学生文件)
*功能:显示联系人信息
*返回值:无返回值)
*************************************************/
void Display(ID * head)
{
ID *t1=head;
printf("\n学生姓名==学号=====性别===年龄==语文成绩==数学成绩==英语成绩==总分==平均分\n\n");
    while(t1!=NULL)
{
printf("%-8s%-11s  %-4s  %-4d  %-8.2f %-8.2f  %-8.2f  %-8.2f %-8.2f \n",t1->name,t1->sno,t1->sex,t1->age,t1->fenshu.China,t1->fenshu.shuxue,t1->fenshu.English,t1->fenshu.sum,t1->fenshu.average);
t1=t1->next;
}
printf("\n\n简易学生管理系统成功显示\n");
printf("\n请按任意键返回主菜单\n");
getch();


}



/************************************************
*函数名: Add(添加)
*功能:添加人物信息
*返回值:ID *(结构体指针)
*************************************************/
ID* Add(ID* head)
{
    char saveflag; //存盘标志
int k=0;

    ID *p1,*p2,*pa; //pa是用来放添加的信息的,p1,p2是用来临时移动的
    p1=p2=head; //先让它们都等于头指针
    system("cls"); //清屏
    while(p1->next!=NULL) //把p1移到尾节点
        p1=p1->next;


bb2:pa=(ID*)malloc(sizeof(ID)); //申请动态存储空间
printf("请输入添加人的姓名:\n");
fflush(stdin);
    scanf("%8s",pa->name);
    fflush(stdin);
    printf("请输入学号: \n");
    scanf("%11s",pa->sno);
    p2=head;      //让p2从头开始遍历
    while(p2!=NULL)       //当p2不为空时
    {
      if((strcmp(pa->name,p2->name)==0)&&(strcmp(pa->sno,p2->sno)==0))
      {
           free(pa);
           printf("你重复输入了!\n");
           goto bb2;
 }
 
       p2=p2->next;
     }
     pa->name[8]=0;   //使得每个字段都能有效结束
     pa->sno[11]=0;
 
fflush(stdin);
     printf("请输入学生性别:");
scanf("%4s",pa->sex);
pa->sex[4]=0;
fflush(stdin);
     printf("请输入学生年龄:");
scanf("%d",&pa->age);
fflush(stdin);
     printf("请输入学生科目成绩(语文,数学,英语):");
scanf("%lf%lf%lf",&pa->fenshu.China,&pa->fenshu.shuxue,&pa->fenshu.English);
pa->fenshu.sum=pa->fenshu.China+pa->fenshu.shuxue+pa->fenshu.English;
pa->fenshu.average=pa->fenshu.sum/3.0;
p1->next=pa; //尾节点p1的next添加pa
pa->next=NULL;
     printf("新添加学生信息成功,是否存盘?(Y/N)\n");
fflush(stdin);
scanf("%c",&saveflag);//存盘?Y or N
if(saveflag=='y'||saveflag=='Y')//当输入y Y的时候
Save(head); //调用保存函数
else
{
printf("请按任意键返回主菜单\n");
getch(); 
}
free(pa);
     return(head); 
}





/************************************************
*函数名: Change(修改) 
*功能:修改人物信息
*返回值:ID *(结构体指针)
*************************************************/
ID* Change(ID* head)
{
    ID *p1,*p2; 
    char saveflag; 
 
    char n[10],t[12]; //存放待修改人的姓名和学号
int flag=0; //修改标志
    system("cls"); //清屏
p1=head; 
    printf("请输入要修改的学号:\n"); 
    scanf("%11s",t); 
    while(p1!=NULL) //这个while语句的作用是在遍历整个单链表
{
  if(strcmp(p1->sno,t)==0)//判断是不是你输入的学号是不是和简易学生管理系统中的相同
  {
flag=1; //当存在一样的名字时,
printf("\n你要修改的学生信息为:\n");
printf("\n学生姓名==学号=====性别===年龄==语文成绩==数学成绩==英语成绩==总分==平均分\n\n");
        printf("%-8s%-11s  %-4s  %-4d  %-8.2f %-8.2f  %-8.2f  %-8.2f %-8.2f \n",p1->name,p1->sno,p1->sex,p1->age,p1->fenshu.China,p1->fenshu.shuxue,p1->fenshu.English,p1->fenshu.sum,p1->fenshu.average);

bb3:printf("\n请输入修改后的姓名:\n");
fflush(stdin);
scanf("%8s",n);


p2=head; //让p2从头开始遍历
while(p2!=NULL)//当p2不为空时
{
if((strcmp(n,p2->name)==0)&&(strcmp(t,p2->sno)==0))
{
printf("你重复输入了。\n");
goto bb3;
}
p2=p2->next;
}


strcpy(p1->name,n);
p1->name[8]=0;
fflush(stdin);
   printf("请输入学生性别:");
   scanf("%4s",p1->sex);
p1->sex[4]=0;
fflush(stdin);
   printf("请输入学生年龄:");
   scanf("%d",&p1->age);
   fflush(stdin);
   printf("请输入学生科目成绩(语文,数学,英语):");
   scanf("%lf%lf%lf",&p1->fenshu.China,&p1->fenshu.shuxue,&p1->fenshu.English);
   p1->fenshu.sum=p1->fenshu.China+p1->fenshu.shuxue+p1->fenshu.English;
   p1->fenshu.average=p1->fenshu.sum/3.0;
printf("该学生信息已修改成功\n");
printf("学生信息已经新建成功,是否进行保存? (Y/N)\n");
fflush(stdin);
scanf("%c",&saveflag);
if(saveflag=='y'||saveflag=='Y')//当输入是的时候
Save(head); //调用保存函数
else
{
printf("请按任意键返回主菜单\n");
getch(); 
}
break;
  }  
  p1=p1->next;  //p1指针向后移
}
    if(flag==0) //没有这个名字的人,返回主菜单
{
        printf("\n没有找到要修改的学生信息,请按任意键返回主菜单!\n");
getch(); //按下任意键就进入下一条语句的函数
    }
return(head);    
}
/************************************************
*函数名:Search(查询)
*功能:可以通过姓名查询,也可以通过类型查询
*返回值:NULL
*************************************************/
void Search(ID *head)
{
int num; //子菜单选择
int count=0;
ID* p; 
int flag; //flag是用来判断是否找到,
char c[10],searchflag='y';//c是来存放姓名或者类型,
    char ch[12];
while(1)
{
searchflag='y';
printf("\n**************查找子菜单*******************\n");
printf("\n\t 1.按姓名\n");
printf("\n\t 2.按学号\n");
printf("\n\t 3.返回主菜单\n");
printf("\n*******************************************\n");
fflush(stdin);
printf("请输入您的选择:\n");
scanf("%d",&num);//选择你想要查询的方式 
switch(num) 
{

case 1: while(searchflag=='y'||searchflag=='Y') 
{
count=0;
flag=0; //初始化为0
printf("\n请输入待查找的姓名: \n");
scanf("%8s",c);
p=head; 
while(p!=NULL)
{
  if(strcmp(p->name,c)==0)
  {  
  count++;
  if(count==1)
printf("\n学生姓名==学号=====性别===年龄==语文成绩==数学成绩==英语成绩==总分==平均分\n\n");
                    printf("%-8s%-11s  %-4s  %-4d  %-8.2f %-8.2f  %-8.2f  %-8.2f %-8.2f \n",p->name,p->sno,p->sex,p->age,p->fenshu.China,p->fenshu.shuxue,p->fenshu.English,p->fenshu.sum,p->fenshu.average);

  flag=1; //flag赋值为1,表示为已经查到了数据了   
  }
  p=p->next; //p1指针向后移
}
if(flag==0) //表示没有找到相关数据
{
printf("\n未能找到符合条件的记录\n");
}
else
printf("\n\n\######找到了%d个姓名为\"%s\"学生!#####\n\n",count,c);
printf("\n查找完毕,是否需要重新查询? (Y/N)\n");
fflush(stdin);
scanf("%c",&searchflag);//是否继续查询(Y/N) 
}
break;
case 2: 
while(searchflag=='y'||searchflag=='Y')
{
count=0;
flag=0; //初始化为0,
printf("\n请输入被查找人的学号: \n");
scanf("%11s",ch);


p=head; 
while(p!=NULL)
{
  if(strcmp(p->sno,ch)==0)
  {
  count++;
  if(count==1)
printf("\n学生姓名==学号=====性别===年龄==语文成绩==数学成绩==英语成绩==总分==平均分\n\n");
                        printf("%-8s%-11s  %-4s  %-4d  %-8.2f %-8.2f  %-8.2f  %-8.2f %-8.2f \n",p->name,p->sno,p->sex,p->age,p->fenshu.China,p->fenshu.shuxue,p->fenshu.English,p->fenshu.sum,p->fenshu.average);

  flag=1; //flag赋值为1,表示为已经查到了数据了   
  }
  p=p->next;  //p1指针向后移
}
  if(flag==0) //表示没有找到相关数据
{
printf("\n对不起,未能找到符合条件的记录\n");
}
  else
printf("\n\n\######找到了该学生!#####\n\n");
printf("\n查找完毕,是否需要重新查询? Y/N\n");
fflush(stdin);
scanf("%c",&searchflag);//是否继续查询(Y/N)
}
break; 
case 3:return;
default :printf("你输入错了,请你输入任意键返回主菜单...\n");
    getch();
}
}
}


/************************************************
*函数名: Delete(删除)
*功能:通过查找学号来实现删除学生记录
*返回值:ID *(结构体指针)
*************************************************/
ID* Delete(ID *head)
{
ID *p1,*p2; //p1是用来遍历整一个单链表定位要删除的结点,p2是用来定位p1的前结点的
    char saveflag='n', temp; //saveflag是否保存,temp是否删除


char s[12]; //存放输入的学号 
    p1=p2=head; //把head赋给p1,p2  
    printf("\n请输入要删除的学号:\n");
    scanf("%11s",s);
getchar();
while(p1!=NULL)//这个while语句的作用是在遍历整个单链表时,当遇到一样的名字时把i赋值,引导下面的工作
{
  if(strcmp(p1->sno,s)==0)//判断是不是你输入的名字是不是和学生信息中的相等
  {
printf("你要删除的学生为:\n");
   printf("\n学生姓名==学号=====性别===年龄==语文成绩==数学成绩==英语成绩==总分==平均分\n\n");
            printf("%-8s%-11s  %-4s  %-4d  %-8.2f %-8.2f  %-8.2f  %-8.2f %-8.2f \n",p1->name,p1->sno,p1->sex,p1->age,p1->fenshu.China,p1->fenshu.shuxue,p1->fenshu.English,p1->fenshu.sum,p1->fenshu.average);
printf("请确定是否要删除该记录?Y/N?\n");
fflush(stdin);
scanf("%c",&temp);//确定要删除吗? 
if(temp=='y'||temp=='Y')//当输入是的时候
{
  if(p1==head)//判断是不是在头结点
  head=p1->next;//把头结点去掉
  else


  p2->next=p1->next;//删除p1结点(p2的next域指向p1的下个结点)
  printf("该学生信息已删除成功,是否存盘?Y/N?\n");
  fflush(stdin);
  scanf("%c",&saveflag);//确定要保存吗?
  if(saveflag=='y'||saveflag=='Y')//当输入是的时候
 Save(head); //调用保存函数
  else
{
printf("请按任意键返回主菜单\n");
getch(); 
}
}
else
{
printf("请按任意键返回主菜单\n");
getch(); 
}
break;
  }
  p2=p1;
  p1=p1->next;  //p1指针向后移
}
if((p1->next)==NULL&&strcmp(p1->sno,s))
{
printf("没有找到要删除的学生学号,请检查你要删除的学号是否正确\n");
printf("请按任意键返回主菜单\n");
getch(); //按下任意键就进入下一条语句的函数 

}
return(head); //return一个已经完成修改的链表头指针   
}


/************************************************
*函数名: Swap(交换)
*功能:交换结点内数据
*返回值:无
*************************************************/
void Swap1(char t1[],char t2[])
{
char t[20]={0};
strcpy(t,t1);
strcpy(t1,t2);
strcpy(t2,t);


}
void Swap2(double s1,double s2)
{
double s;
s=s1;
s1=s2;
s2=s;
}
void Swap3(int r1,int r2)
{
int r;
r=r1;
r1=r2;
r2=r;
}
/************************************************
*函数名: Sort(排序)
*功能:按照类型排序通讯记录
*返回值:ID *(结构体指针)
*************************************************/
void Sort(ID *head)
{
ID  *p1,*p2;
char saveflag='y';
p2=NULL;


while( head != p2)
{
p1 = head;
while( p1->next!= p2 )
{  
if( strcmp(p1->sno,p1->next->sno)>0)
{
Swap1(p1->name,p1->next->name);
Swap1(p1->sno,p1->next->sno);

Swap1(p1->sex ,p1->next->sex );
Swap2(p1->fenshu.China,p1->next->fenshu.China);
Swap2(p1->fenshu.shuxue,p1->next->fenshu.shuxue);
Swap2(p1->fenshu.English,p1->next->fenshu.English);
Swap2(p1->fenshu.sum,p1->next->fenshu.sum);
Swap2(p1->fenshu.average,p1->next->fenshu.average);
Swap3(p1->age,p1->next->age);




            } 
p1 = p1->next;
        }
  p2= p1;
    }


printf("学生已按照 学号类型 排序成功,是否存盘?Y/N?\n");
fflush(stdin);
scanf("%c",&saveflag);//确定要保存吗?
if(saveflag=='y'||saveflag=='Y')//当输入是的时候
Save(head); //调用保存函数
}


  • 63
    点赞
  • 343
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
vs2015+数据库,需要建的数据表如下: 1. “考试成绩管理系统用户登录”功能 具体要求: (1) 按照图示排列相应的控件,控件名称自定义,其中,界面中的图片可以不加; (2) 当输入正确的用户名和密码时,登录到主系统,如图所示,并且用户名或密码输入不正确时系统有所提示;当单击【取消】按钮时,用户名和密码被清空; (3) 程序中用到的数据库名为SCOREINFO,数据表名为userinfo,数据表结构如下图所示: (4) 数据表中的用户名和密码如下图。 2. 点击主窗体的“密码修改”菜单,完成“密码修改”功能,程序运行如下图所示: 具体要求: (1)此题必须使用数据库连接完成,原始密码必须为数据表里原有的数据,不使用数据库完成的为0分。 (2)需要建立数据库SCOREINFO及数据表userinfo,表的结构及数据第一部分的内容: (3)要有“原始密码输入错误”、“原始密码不能为空”及“两次输入密码不一致”的错误提示; (4)当单击【保存】按钮,新密码被更新到数据表中,不能更新的为0分; (5)单击【关闭】按钮,窗口关闭。 (6)3个Label;3个TextBox;2个Button 3. 完成“成绩查询”功能,程序运行如下图所示: 具体要求: (1) 按照图示排列相应的控件,界面下方是DataGridView控件; (2)程序用到的数据库名为SCOREINFO,数据表名为score,表结构如下: (3)完成的MainForm_Load事件处理程序:当加载窗体时,直接在窗体的dataGridView1控件中显示数据表的所有记录; (4)可以设查询条件:首先在组合框comboBox1中选择查询条件,并在textBox1中输入条件值(可以模糊查询,如按照姓名查询时,输入“王”,可以查所有姓王的同学的成绩),单击查询将结果显示在dataGridView1控件中。 (5)所需控件及属性:1个GroupBox,1个Label,Text为选择查询条件;1个ComboBox(Items:学号、姓名);1个TextBox;1个Button,Text为查询;1个DataGridView 4. 完成“课程信息修改”功能,程序运行如下图所示: 具体要求: (1)按照图示排列相应的控件,控件名称自定义,其中,程序刚开始运行时,“学分”和“课程编码”的文本框是只读的; (2)在数据库名为SCOREINFO中,创建数据表名为course,表结构如下: (3)当单击【查询】时,直接在窗体的dataGridView2控件中显示数据表的所有记录; (4)当选中DataGridView控件中的某一行记录时(DataGridView控件的Mouse_Click事件),“课程名字”、“学分”、“课程代码”文本框中分别显示该项对应的课程信息; (5)当选中某一行记录并单击【编辑】按钮时,【编辑】按钮变为【保存修改】,同时“学分”和“课程编码”的文本框恢复正常(ReadOnly属性为false);在文本框中修改相应的信息后单击【保存修改】,将修改后的数据更新到数据表中。 (6)所需控件及属性:1个GroupBox,3个Label;3个TextBox(textBox2属性ReadOnly为True,textBox3属性ReadOnly为True);2个Button;1个DataGridView 5. 完成“课程信息删除”功能,程序运行如下图所示: 具体要求: (1)按照图示排列相应的控件,控件名称自定义,其中,程序刚开始运行时,“学分”和“课程编码”的文本框是只读的; (2)数据表名为course,表结构同第4部分: (3)当单击【查询】时,直接在窗体的dataGridView控件中显示数据表的所有记录; (4)当选中DataGridView控件中的某一行记录时,“课程名字”、“学分”、“课程代码”文本框中分别显示该项对应的课程信息; (5)当选中某一行记录并单击【删除】按钮时,则该行从数据表中删除。 (6)所需控件:3个Label;3个TextBox(textBox2属性ReadOnly为True,textBox3属性ReadOnly为True);2个Button;1个DataGridView 6. 完成“课程信息添加”功能,程序运行如下图所示: 具体要求: (1)按照图示排列相应的控件,控件名称自定义; (2)程序用到的数据库和数据表名为course,表结构如下同第四部分: (3)当单击【查询】时,直接在窗体的dataGridView1控件中显示数据表的所有记 (4)当选中DataGridView控件中的某一行记录时,“课程名字”、“学分”、“课程代码”文本框中分别显示该项对应的课程信息; (5)当单击【添加】按钮时,在文本框中添加新的内容并将新内容添加到数据表中,并且在DataGridView控件中显示出新的课程信息 (6)所需控件:3个Label;3个TextBox;2个Button;1个DataGridView
学生管理系统程序 #include <iostream> using namespace std; #include <stdlib.h> double avg=0;//统计总分和加平均分权 const int mathp=4;//数学学分 const int cppp=5;//C++学分 const sum=70;//设置总学分 class Student { private: int num; char *name; char *sex; char *phone; char *rphone; double math; double cpp; Student* next; public: Student() {next=NULL;} ~Student(); void Push(Student **refhead,int num,char *name,char *sex,char *phone,char *rphone,double math,double cpp); void Delete(Student *head,int data); Student* Find(Student* head,int data); void Display(Student* head); int Length(Student* head); void Math(Student* head,int data); void Update(Student* head,int data); void Insert(); }; Student* head=new Student;//带头结点的头指针 void Student::Push(Student **refhead,int num,char *name,char *sex,char *phone,char *rphone,double math,double cpp) { Student* newnode=new Student;//新增加结点 newnode->num=num; newnode->name=name; newnode->sex=sex; newnode->phone=phone; newnode->rphone=rphone; newnode->math=math; newnode->cpp=cpp; newnode->next=*refhead; *refhead=newnode;//重置表头 } //遍历 void Student::Display(Student* head) { Student* temp; temp=head; if(temp->next==NULL)//判断空表 cout<<"没有学生!"; else {while(temp!=NULL)// { cout<<"学号:"<<temp->num<<"姓名:"<<temp->name<<"性别:"<<temp->sex<<"手机:"<<temp->phone<<"宿舍电话:"<<temp->rphone<<"数学成绩:"<<temp->math<<"C++成绩:"<<temp->cpp<<endl; temp=temp->next; } } return; } //人数 int Student::Length(Student* head) { Student* cur; cur=head; int count=0; while(cur!=NULL) { count++;//通过累加统计人数 cur=cur->next; } return count; } //查找 Student* Student::Find(Student* head,int data) { Student* cur=head; bool bo=false; while(cur!=NULL) { if(cur->num=data) { bo=true;//如果找到则改变bo的值 cout<<"学号:"<<cur->num<<"姓名:"<<cur->name<<"性别:"<<cur->sex<<"手机:"<<cur->phone<<"宿舍电话:"<<cur->rphone<<"数学成绩:"<<cur->math<<"C++成绩:"<<cur->cpp<<endl; break; } cur=cur->next; } if(bo==false)//通过判断bo的值判断找到与否 cout<<"没有这个人!"<<endl; return cur; } //删除 void Student::Delete(Student* head,int data) { Student *bef,*cur; bef=cur=head; while(cur!=NULL) { if(cur->num==data) break; else {bef=cur;cur=cur->next;} } if(cur==head)//如果是头结点则删除头结点 { head=cur->next; delete cur; } else { bef->next=cur->next; delete cur; } } //修改 void Student::Update(Student* head,int data) { Student* cur=head; bool bo=false; while(cur!=NULL) { if(cur->num==data) { bo=true; int a,b; char *c; double d; for(;;) //找到后提供各字段的修改 { cout<<"1修改学号|2修改姓名|3修改性别|4修改手机号|5修改宿舍电话号|6修改数学成绩|7修改C++成绩|8退出\n"; cin>>a; switch(a) { case 1:cout<<"输入新学号:"; cin>>b; cur->num=a; break; case 2:cout<<"输入新姓名:"; cin>>c; cur->name=c; break; case 3:cout<<"输入新性别:"; cin>>c; cur->sex=c; break; case 4:cout<<"输入新手机号:"; cin>>c; cur->phone=c; break; case 5:cout<<"输入新宿舍电话号:"; cin>>c; cur->rphone=c; break; case 6:cout<<"输入新数学成绩:"; cin>>d; cur->math=d; break; case 7:cout<<"输入C++成绩:"; cin>>d; cur->cpp=d; break; case 8:exit(1); break; default:cout<<"操作错误"; break; } } break; } } if(bo==false) cout<<"没有这个人!"<<endl; return; } //统计 void Student::Math(Student* head,int data) { Student* cur=head; bool bo=false; while(cur!=NULL) { if(cur->num=data) { bo=true; avg=cur->math*(mathp/sum)+cur->cpp*(cppp/sum);//计算总分和加平均分权的公式 break; } cur=cur->next; } if(bo==false){ cout<<"没有这个人!"<<endl; return; } cout<<"该生的总分和加平均分权="<<avg<<endl; return; } //录入 void Student::Insert() { head=NULL; int num; char name[8]; char sex[4]; char phone[11]; char rphone[7]; double math; double cpp; cout<<"请输入基本信息:\n"; cout<<"学号:"; cin>>num; cout<<"姓名:"; cin>>name; cout<<"性别:"; cin>>sex; cout<<"手机号:"; cin>>phone; cout<<"宿舍电话:"; cin>>rphone; cout<<"数学成绩:"; cin>>math; cout<<"C++成绩:"; cin>>cpp; Push(&head,num,name,sex,phone,rphone,math,cpp);//调用函数Push建立有序链表 } //用释构函数逐个释放空间 Student::~Student() { while(head!=NULL) { delete head; head=head->next; } } //程序主入口 void main() { for(;;) { head=NULL; Student s; int x; int data; cout<<"|1录入|2查找|3删除|4修改|5统计|6退出|\n"; cout<<"请作选择:\n"; cin>>x; switch(x) { case 1: start: s.Insert(); cout<<"继续吗?[Y/N]"; char ch; cin>>ch; if(ch=='y' || ch=='Y') goto start; s.Display(head); int l; l=s.Length(head); cout<<"一共有"<<l<<"个学生。"<<endl; break; case 2: cout<<"请输入你要查找的学生的学号:"; cin>>data; s.Find(head,data); break; case 3: cout<<"请输入你要删除的学生的学号:"; cin>>data; s.Delete(head,data); break; case 4: cout<<"请输入你要修改的学生的学号:"; cin>>data; s.Update(head,data); break; case 5: cout<<"请输入你要统计的学生的学号:"; cin>>data; s.Math(head,data); break; case 6: exit(1); break; default:cout<<"操作错误!"<<endl; break; } }}
C语言学生管理系统是一个用C语言编写的简单的学生信息管理系统,用于管理学生的基本信息,包括学号、姓名、性别、年龄等。以下是一个简单的C语言学生管理系统源代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STUDENTS 100 struct Student { char id[10]; char name[20]; char gender[10]; int age; }; struct Student students[MAX_STUDENTS]; int count = 0; void addStudent() { if (count >= MAX_STUDENTS) { printf("学生数量已达上限,无法添加新学生!\n"); return; } struct Student newStudent; printf("请输入学号:"); scanf("%s", newStudent.id); printf("请输入姓名:"); scanf("%s", newStudent.name); printf("请输入性别:"); scanf("%s", newStudent.gender); printf("请输入年龄:"); scanf("%d", &newStudent.age); students[count++] = newStudent; printf("添加学生成功!\n"); } void listStudents() { if (count == 0) { printf("暂无学生信息!\n"); return; } printf("学号\t姓名\t性别\t年龄\n"); for (int i = 0; i < count; i++) { struct Student student = students[i]; printf("%s\t%s\t%s\t%d\n", student.id, student.name, student.gender, student.age); } } int main() { int choice; while (1) { printf("\n学生管理系统\n"); printf("1. 添加学生\n"); printf("2. 查看学生\n"); printf("0. 退出\n"); printf("请选择操作:"); scanf("%d", &choice); switch (choice) { case 1: addStudent(); break; case 2: listStudents(); break; case 0: printf("感谢使用学生管理系统,再见!\n"); exit(0); default: printf("无效的选择,请重新输入!\n"); break; } } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值