学生管理程序
㈠ 用C语言编写学生管理系统界面
我这里有个学生通讯录管理系统,应该修改下就可以变成你想要的了。
========================================================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NULL 0
#define LEN sizeof(LNode)
int seat;
typedef struct LNode
{
int number;
double telenum;
char name[20];
struct LNode *next;
}LNode,*LinkList;
//用于通讯录结点
void printList(LinkList L)
{ // 打印头结点地址为L的通讯录
printf("\n ---------------------------------------\n");
printf(" 学号 姓名 电话号码\n");
printf(" ----------------------------------------\n");
LinkList p=L;
int n=1;
if(L==NULL||L->next==NULL) printf("该通讯录中没有元素\n");
else
while(p->next !=NULL)
{
printf(" %2d %-9d",n,p->next->number);
printf(" %-5s %.0f\n",p->next->name,p->next->telenum);
p=p->next;
n++;
}
printf(" ----------------------------------------\n");
return ;
}
LinkList prior(LinkList L,LinkList p)
{
if(L->next==NULL) return(L);
LinkList p_prior=L;
while(p_prior->next != p)
{
p_prior=p_prior->next;
}
return (p_prior);
} // 找到位于当前地址元素的前一元素的地址
void insertYouXu(LinkList L,LinkList Elem)
{ //插入一个元素,使原有序表仍为有序
LinkList p=L->next;
while(p!=NULL && Elem->number>=p->number)
{
if(p->number==Elem->number)
{
printf("重复输入!!\n");return;
}
p=p->next;
} //确定Elem插入的位置
if(p==NULL)
{
p=prior(L,p); Elem->next=NULL;p->next=Elem;
}
else //若为空表,插到头结点之后
{
p=prior(L,p); Elem->next=p->next; p->next=Elem;
}
}
LinkList creatIncreLink() //创建一个存放通讯录成员的非递减有序表,返回头结点地址
{
LinkList L=(LinkList)malloc(LEN); //头结点
L->next=NULL;
LinkList p;
int num=1;
int number;
double telenum;
char name[20];
printf("请输入学生学号、姓名和电话号码,建立通讯录,以'-1'为输入结束标志\n");
printf("请输入学号 %d:",num);
scanf("%d",&number);
printf("请输入姓名 %d: ",num);
char temp=getchar();
gets(name);
printf("请输入电话号码 %d:",num);
scanf("%lf",&telenum);
while (number>=0)
{
p=(LinkList)malloc(LEN); //新结点
p->number=number;
p->telenum=telenum;
strcpy(p->name,name);
insertYouXu(L,p); //有序的插入新结点
num++;
printf("请输入学号 %d:",num);
scanf("%d",&number);
printf("请输入姓名 %d: ",num);
temp=getchar();
gets(name);
printf("请输入电话号码 %d:",num);
scanf("%lf",&telenum);
}
return(L);
}
void deleteElem(LinkList L,int i) //从通讯录中删除第i个元素
{
LinkList p=L;
int j=0;
while (p->next&&j<i-1)
{
p = p->next;j++;
}
if(!(p->next))
{printf("第%d个元素删除失败\n",i);return ;}
//判断i是否合法,i既不能大于元素的个数,也不能小于等于0
LinkList q = p->next;
p->next = q->next;
free(q);
//释放删除的结点
}
int searchNum(LinkList L,int n)
{ // 按学号查找通讯者
int flag=0;
LinkList p=L->next;
seat=1;
if(L->next==NULL) printf("该链表中没有元素,查找失败\n");
else
{
while(p !=NULL)
{
if(p->number<=n)
if(p->number==n)
{
flag=1;
printf("要查找的是第%d位通讯者:\n",seat);
printf(" 学号: %d 姓名: %s 电话号码.:%.0f\n",p->number,p->name,p->telenum);
}
p=p->next;seat++;//!!!!
}
}
return flag;
}
int searchName(LinkList L,char n[])
{ // 按姓名查找通讯者
int flag=0;
LinkList p=L->next;
seat=1;
if(L->next==NULL||L==NULL)
printf("该通讯录中没有元素,查找失败\n");
else
{
while(p !=NULL)
{
if(!strcmp(p->name,n))
{
flag=1;
printf("要查找的是第%d位通讯者:\n",seat);
printf(" Number: %d Name: %s TeleNo.:%.0f\n",p->number,p->name,p->telenum);
}
p=p->next;seat++;//!!!!!
}
}
return flag;
}
int delNum(LinkList L,int n)
{ // 按学号删除通讯者
int flag=0;
LinkList p=L->next;
seat=1;
if(L->next==NULL)
printf("该链表中没有元素,删除失败\n");
else
{
while(p !=NULL)
{
if(p->number<=n)
{
if(p->number==n)
{
flag=1;
printf("%d ",p->number);
p=p->next;
deleteElem(L,seat);
}
}
else {p=p->next;seat++;}
}
printf("被删除\n");
}
return flag;
}
int delName(LinkList L,char n[])
{ // 按姓名删除通讯者
int flag=0;
LinkList p=L->next;
seat=1;
if(L->next==NULL)
printf("该链表中没有元素,查找失败\n");
else
{
while(p !=NULL)
{
if(!strcmp(p->name,n))
{
flag=1;
printf("%s ",p->name);
p=p->next;
deleteElem(L,seat);
}
else {p=p->next;seat++;}
}
if(flag)printf("被删除\n");
}
return flag;
}
void main()
{
system("color 1f");
LinkList L=NULL;
printf("\n ***************** ^@^欢迎使用通讯录系统***********\n");
printf(" * 1 通讯录的建立 *\n");
printf(" * 2 插入通讯记录 *\n");
printf(" * 3 查询通讯记录 *\n");
printf(" * 4 删除通讯记录 *\n");
printf(" * 5 显示通讯录信息 *\n");
printf(" * 0 退出管理系统 *\n");
printf(" **************** ^@^欢迎使用通讯录系统************\n");
int flag=0;
int menu;
printf("请选择0-5:");
scanf("%d",&menu);
while(menu!=0)
{
switch(menu)
{
case 1:
{
L=creatIncreLink();
printf("建立通讯录:");
printList(L);
flag=1;
break;
}
case 2:
{
if(flag==1)
{int number,telenum;
char name[20];
printf("请输入通讯者的学号和姓名:\n");
printf("请输入学号: ");
scanf("%d",&number);
printf("请输入姓名: ");
char temp=getchar();
gets(name);
printf("请输入电话号码: ");
scanf("%d",&telenum);
LinkList p=(LinkList)malloc(LEN); //新结点
p->number=number;
strcpy(p->name,name);
p->telenum=telenum;
insertYouXu(L,p); //有序的插入新结点
printf("插入后:");
printList(L);
}
else printf("\nERROR: 通讯录还没有建立,请先建立通讯录\n");
break;
}
case 3:
{
int way,n;
char na[20];
int s;
if(L!=NULL)
{
if(flag)
{
printf("选择查找方式:\n");
printf(" 1.按学号 2.按姓名");
scanf("%d",&way);
if(way==1)
{
printf("\n请输入学号:");
scanf("%d",&n);
s=searchNum(L,n);
if(s==0) printf("无此通讯者,查找失败!\n");
}
else if(way==2)
{
printf("\n请输入姓名:");
char temp=getchar();
gets(na);
s=searchName(L,na);
if(s==0) printf("无此通讯者,查找失败!\n");
}
else printf("通讯录中无记录!\n");
}
break;
}
else printf("通讯录中无记录!\n");break;
}
case 4:
{
int way;
printf("选择删除方式:1.按序号 2. 按学号 3.按姓名 \n");
scanf("%d",&way);
if(way==1)
{
int n;
printf("请输入通讯录序号: ");
scanf("%d",&n);
printf("删除后:\n");
deleteElem(L,n);
printList(L);
}
else if(way==2)
{
int n,f;
printf("请输入学号: ");
scanf("%d",&n);
f=delNum(L,n);
if(f!=0)
{
printf("删除后:\n");
printList(L);
}
else printf("无该学号,删除失败!\n");
}
else if(way==3)
{
char na[20];
int f;
printf("\n请输入姓名:");
char temp=getchar();
gets(na);
f=delName(L,na);
if(f!=0)
{
printf("删除后:\n");
printList(L);
}
else printf("无该学号,删除失败!\n");
}
else printf("ERROR!!\n");
break;
}
case 5:
{
printf("当前通讯录内容如下:\n");
printList(L);
break;
}
case 0: exit(0);
default: printf("\n没有此功能,重新输入\n");
}
printf("选择功能:");
scanf("%d",&menu);
}
}
================================================================
㈡ C语言学生管理系统
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#define max 20
typedef struct student //学生
{
char sno[max]; // 学号
char sname[max]; //姓名
char sex[max]; //性别
char age[max]; //年龄
char depart[max]; //系
char classs[max]; //班
char grade[max]; //年级
struct student* next;
} student;
student* head;
int LogOn() //登录模块,已实现输入密码不回显,如果中途发现输错某几位,可退格键重输
{
char username[max],password[max];
printf("\n请输入用户名:");
scanf("%s",username);
printf("\n请输入密码(最多15位):");
//开始以不回显且支持退格方式获取输入密码
int i=0;
while((i>=0)&&(password[i++]=getch())!=13)//条件i>=0是用于限制退格的范围
{
if(password[i-1]=='\b')//对退格键的处理
{
printf("%c%c%c",'\b','\0','\b');
i=i-2;
}
else
printf("*");
}
password[--i]='\0';
//已获取密码。验证用户身份
if(!strcmp(username,"zhang")&&!strcmp(password,"8147086"))
{
printf("\n登录成功!");
return 1;
}
else
return 0;
}
void regist()
{
char ch;
student *s,*ptr; //s用来建新结点,ptr用来暂存头结点
do
{
s=(student*)malloc(sizeof(student)); // 新建一个学生结点
printf("\n开始注册..."); //开始注册
printf("\n请输入该学生的学号:");
scanf("%s",s->sno);
printf("\n请输入该学生的姓名:");
scanf("%s",s->sname);
printf("\n请输入该学生的性别:");
scanf("%s",s->sex);
printf("\n请输入该学生的年龄:");
scanf("%s",s->age);
printf("\n请输入该学生的系:");
scanf("%s",s->depart);
printf("\n请输入该学生所在的班:");
scanf("%s",s->classs);
printf("\n请输入该学生所在的年级");
scanf("%s",s->grade);
ptr=head;
head=s;//将新结点插入队头
s->next=ptr;
fflush(stdin);
printf("\n请问是否继续注册?(Y/N)");
scanf("%c",&ch);
}while(ch=='Y'||ch=='y');
return;
}
void ElePrint(char str[]) //输出单个元素
{
if(str==NULL) exit(0);
printf("%s",str);
for(unsigned int i=0;i<12-strlen(str);i++) printf(" ");//为了对齐输出,需插入一些空格
return;
}
int LinePrint(student *ptr) //输出一行
{
if(ptr==NULL) //检查传进来的指针
return 0;
printf("\n");
ElePrint(ptr->sno);
ElePrint(ptr->sname);
ElePrint(ptr->age);
ElePrint(ptr->sex);
ElePrint(ptr->depart);
ElePrint(ptr->classs);
ElePrint(ptr->grade);
return 1;
}
void print() //输出全部学生信息
{
student *ptr=head;
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
while(ptr)
{
LinePrint(ptr);
ptr=ptr->next;
}
printf("\n");
return;
}
void search()//查询模块
{
int method;//查询方式
char no[max],name[max],departm[max],clss[max],grades[max]; //用来接收查询关键字
while(1)
{
printf("\n请选择查询方式");
printf("\n1.按学号查询");
printf("\n2.按姓名查询");
printf("\n3.按所在系查询");
printf("\n4.按所在班级查询");
printf("\n5.按所在年级查询");
printf("\n6.打印全部学生信息");
printf("\n7.返回主菜单\n");
scanf("%d",&method);
student *p=head,*temp;
switch(method)
{
case 1:
printf("\n请输入要查询的学号:");
scanf("%s",no);
while(p)
{
if(!strcmp(p->sno,no))
break;
else
{
temp=p;
p=p->next;
}
}
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
LinePrint(p);
break;
case 2:
printf("\n请输入要查询的姓名:");
scanf("%s",name);
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->sname,name))
LinePrint(p);
p=p->next;
}
break;
case 3:
printf("\n请输入学生所在的系:");
scanf("%s",departm);
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->depart,departm))
LinePrint(p);
p=p->next;
}
break;
case 4:
printf("\n请输入学生所在的班:");
scanf("%s",clss);
printf("\n请输入学生所在的年级:");
scanf("%s",grades);
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->classs,clss)&&!strcmp(p->grade,grades))
LinePrint(p);
p=p->next;
}
break;
case 5:
printf("\n请输入学生所在的年级:");
scanf("%s",grades);
printf("\n学号 姓名 年龄 性别 系 班 年级 ");
while(p)
{
if(!strcmp(p->grade,grades))
LinePrint(p);
p=p->next;
}
break;
case 6:
print();
break;
case 7:
return;
default:
printf("很抱歉,暂无此查询方式!");
break;
}
}
}
void modify()//修改学生信息
{
char num[max];
student *p=head;
printf("\n请输入要修改的学生的学号:");
scanf("%s",num);
while(p)
{
if(!strcmp(p->sno,num))
break;
else
p=p->next;
}
if(p==NULL)
{
printf("\n错误:没有此学生的信息!\n");
return;
}
LinePrint(p);
printf("\n请输入要修改的该学生的信息:");
printf("\n1.姓名");
printf("\n2.性别");
printf("\n3.年龄");
printf("\n4.所在的系");
printf("\n5.所在的班");
printf("\n6.所在的年级");
char name1[max],sex1[max],age1[max],depart1[max],class1[max],grade1[max];
int select;
fflush(stdin);
scanf("%d",&select);
printf("\n请输入新的信息:");
switch(select)
{
case 1:
scanf("%s",name1);
strcpy(p->sname,name1);
break;
case 2:
scanf("%s",sex1);
strcpy(p->sex,sex1);
break;
case 3:
scanf("%s",age1);
strcpy(p->age,age1);
break;
case 4:
scanf("%s",depart1);
strcpy(p->depart,depart1);
break;
case 5:
scanf("%s",class1);
strcpy(p->classs,class1);
break;
case 6:
scanf("%s",grade1);
strcpy(p->grade,grade1);
break;
default:
printf("\nError!");
break;
}
LinePrint(p);
return;
}
void del()// 删除某学生的信息
{
student *p=head,*temp=head,*s;
char num1[max];
printf("\n请输入要删除的学生的学号:");
scanf("%s",num1);
while(p)//查找该学生所在的结点
{
if(!strcmp(p->sno,num1))
break;
else
{
temp=p;
p=p->next;
}
}//while
if(!p)
{
printf("\n不存在此学生的信息.");
return;
}
LinePrint(p);//输出该学生的信息
printf("\n请问真的要删除该学生的信息吗?(Y/N)");
char ch;
fflush(stdin);
scanf("%c",&ch);
if(ch=='Y'||ch=='y')
{
s=p->next;
temp->next=s;
free(p);
printf("\n已经删除该学生的信息.");
}
return;
}
void sort() //排序模块。将学生记录按学号从小到大排列。用起泡排序算法实现
{
student *ptr,*s=head,*p;
int count=0,count1;
while(s)//统计链表结点个数
{
count++;
s=s->next;
}
for(int i=1;i<count;i++)
{
ptr=head;
p=NULL;
count1=count-i; //用来控制每轮起泡排序的终点,即每次把学号最小的结点移到倒数第i个结点
while(ptr&&ptr->next&&(count1--))
{
if(strcmp(ptr->sno,ptr->next->sno)>0)
{
s=ptr->next;
ptr->next=s->next;
if(p==NULL) //ptr处于队头时
head=s;
else
p->next=s;
s->next=ptr;
p=s;
}
else
{
ptr=ptr->next;
if(p==NULL) //ptr处于队头时
p=head;
else
p=p->next;
}
}
}
return;
}
void quit()
{
char ch;
printf("\n真的要退出?(Y/N)");
fflush(stdin);
scanf("%c",&ch);
if(ch=='Y'||ch=='y')
exit(0);
return;
}
int main()
{
int option;
printf("\nCopyright@2005 KongXinCai All rights reserved.");
printf("\n欢迎使用学生信息管理系统!\n");
//登录模块
int icheck=0;
while(icheck<3)
{
if(LogOn()==0)
icheck++;
else
break;
}
if(icheck==3)
{
printf("\n连续登录三次不成功,退出!");
exit(0);
}
//系统界面
while(1)
{
printf("\n\n请选择需要的服务:");
printf("\n1.注册");
printf("\n2.查询");
printf("\n3.修改");
printf("\n4.删除");
printf("\n5.排序");
printf("\n7.求平均");
printf("\n6.退出\n");
scanf("%d",&option);
switch(option)
{
case 1:
regist();
break;
case 2:
search();
break;
case 3:
modify();
break;
case 4:
del();
break;
case 5:
sort();
break;
case 6:
quit();
break;
}
}
return 0;
}