课程设计--学生信息管理系统

问题及代码:

/*     
* Copyright (c) 2016, 烟台大学计算机与控制工程学院     
* All rights reserved.     
* 文件名称:student.project  
* 作者:陈哲    
* 完成日期:2016年12月29日     
* 版本号:V1.0      
* 问题描述:本程序是一个有关于学生信息的管理系统。实现了增加、删除、修改、查询、插入、显示、排序、存入文件等功能。


头文件stu.h

#include "stdio.h"  
#include "stdlib.h"  
#include "string.h"
#include <fstream>   //写文件 ofstream  
# include "conio.h"
using namespace std;
#include <windows.h> //Sleep()函数  
# define N sizeof(struct student)   //测结构体变量的大小  
  
typedef struct student  
{  
    char number[20];//学号
    char name[20];  //姓名
    char sex[20];  //性别
    char Tel[20];  //手机号码
    char college[20];  //学院
    char add[20];  //籍贯
    int score;//总成绩
    struct student *next;  
} stu;  //为结构体命名  
  
stu *creatlink( stu * head);   //创建链表信息  
stu *delet(stu *p0);           //删除信息  
stu *modify(stu *h);           //修改信息 
void findNum(stu *h);          //查询信息  
void findName(stu *h);         //查询信息 
void insert(stu *head);        //插入
void print(stu *p);            //显示全部信息  
stu *sort(stu *head);          //冒泡排序  
void outfile(stu *head);       //写入文件


int MainMenu();        //主菜单
int FindMenu();        //查询菜单
int ManageMenu();      //管理员菜单
int StudentMenu();     //学生菜单


源文件stu.cpp

#include <malloc.h>  
#include "stu.h"  
int length=0;
/*******************************************************************************************************
* 功能描述: 创建链表  
* 输入描述: 新生信息  
* 输出描述: 无  
* 返回值  : 无
* 其他说明:  无限增加新的学生,不能重复。
********************************************************************************************************/
stu *creatlink( stu * &head)   //尾插法创建链表  
{  
    stu *p1, *p2,*p3;
	int a;
    int i = 1;  
    char choice1;  
    head = p2 = (stu *)malloc(N); //p2始终指向尾节点,开始时指向头结点  
	strcpy(p2->number,"-99999");
    head->next = NULL;  
    choice1 = 'y';  
    for (i = 1; choice1 == 'y' || choice1 == 'Y'; i++)  
    {  
        p1 = (stu *)malloc(N);  
        printf("*************************************************************************\n");  
        printf("请输入第%d个学生的信息:\n", i);  
        printf("学号:");  
        scanf("%s", p1->number);  
        printf("\n姓名:");  
        scanf("%s", p1->name);  
        printf("\n性别:");  
        scanf("%s", p1->sex);  
        printf("\n手机号:");  
        scanf("%s", p1->Tel);  
        printf("\n学院:");  
        scanf("%s", p1->college);  
        printf("\n籍贯:");  
        scanf("%s", p1->add);  
        printf("\n总成绩:");  
        scanf("%d", &p1->score);   
          
     
	if (head== NULL)  
	{  
		head =p1;  
	    head->next=NULL;
	} 
	else  
	{  
		
		p3=head;
		while (p3)
		{
			if(strcmp(p1->number,p3->number)==0)
			{
				printf("重复!\n");
				scanf("%d",&a);
				while(a!=1)
				{
					printf("你输入的数字有误\n");
					scanf("%d",&a);
				}
				return head;
			}
			p3=p3->next;
		}
			p2 =head;
		 
		 while (p2)
		 {
			 if(p2->next==NULL)
			 {
				 p2->next=p1;
				 p1->next=NULL;
				 
			 }
			 p2=p2->next;
		 }
	} 
	length++;
	printf("\n是否继续?(Y/N):");  
        choice1 = getch();  
        printf("\n");
}
return(head);
}
      


/*******************************************************************************************************
* 功能描述: 删除信息  
* 输入描述: 学生学号  
* 输出描述: 已删除  
* 返回值  : 无
* 其他说明:  删除没有的学生会显示“没有此生”
********************************************************************************************************/ 
stu *delet(stu  *head)                 //删除信息  
{  
    char num[20];  
    stu *p,*pre;
    char choice2; 
	if (head== NULL)  
    {  
        printf("\n错误执行!");  
        getch();  
        return head;  
    }  
    printf("\n请输入要删除学生的学号:");  
    scanf("%s", num);  
    pre=head;
	int judge=0;
	p=pre->next;
    while(p)  
    {  
        if(strcmp(p->number, num)==0)  
		{
			judge=1;
		    printf("你要删除的信息如下,请确认是否删除:\n");  
            printf("\n学号:%s 姓名:%s 性别:%s 手机号:%s 学院:%s 籍贯:%s\n\n", p->number, p->name, p->sex, p->Tel, p->college, p->add);
			printf("\n是Y,否N:");   //显示要删除的学生的信息//  
		    choice2 = getch();  
			if (choice2 == 'Y' || choice2 == 'y')  
			{  
	     		pre->next= p->next; 
				free(p);
				return head;
				//p=NULL;
			    printf("删除学生成功!\n");
		        break;
			}  
		}
		pre=p;
		p=p->next;
    }  
    if(judge==0)  
    {  
        printf("该生不存在\n");  
        getch();  
        return head;  
    }  
    system("pause");  
    return head;  
}  


/*******************************************************************************************************
* 功能描述: 修改信息  
* 输入描述: 学生学号  
* 输出描述: 此生不存在“没有此生”  xb  
* 返回值  : 无
* 其他说明:  可以单项修改学生信息
********************************************************************************************************/
stu *modify(stu *h)                //修改信息  
{  
	int cho;  
    char choice;  
    int cp;  
    char num[20],ch[20];  
    stu *p;  
    if (h== NULL)  
    {
		printf("\n请输入要修改学生信息的学号:");
		scanf("%s", num);
        printf("\n没有此学生!"); 
        getch();  
        return h;  
    }  
    printf("\n请输入要修改学生信息的学号:");  
    scanf("%s", num);  
    p=h;  
    while(p)  
    {  
        if(strcmp(p->number, num)!=0)    p = p->next;  
        else break;  
    }  
    if(!p)  
    {  
        printf("\n没有此学生!");  
        getch();  
        return h;  
    }
	printf("学生信息如下:\n");  
    printf("\n学号:%s 姓名:%s 性别:%s 手机号:%s 学院:%s 籍贯:%s 总成绩:%d\n\n", p->number, p->name, p->sex, p->Tel, p->college, p->add,p->score);
    
    while(1)  
    {  
        printf("\n请选择要修改的项:\n");  
        printf("1学号   2 姓名   3 性别   4 手机号   5 学院  6 籍贯  7 总成绩\n");  
        scanf("%d",&cho);  
        printf("请输入修改后的内容:\n");  
        switch (cho)  
        {  
        case 1:  
            scanf("%s", ch);  
            strcpy(p->number,ch);  
            break;  
        case 2:  
            scanf("%s", ch);  
            strcpy(p->name,ch);  
            break;  
        case 3:  
            scanf("%s", ch);  
            strcpy(p->sex,ch);  
            break;  
        case 4:  
            scanf("%s", ch);  
            strcpy(p->Tel,ch);  
            break;
		case 5:  
            scanf("%s", ch);  
            strcpy(p->college,ch);  
            break;
		case 6:  
            scanf("%s", ch);  
            strcpy(p->add,ch);  
            break;	    
        case 7:  
            scanf("%d",&cp);  
            p->score=cp;  
            break;  
        default:  
            break;  
        }  
        printf("修改后学生信息如下:\n");  
        printf("\n学号:%s 姓名:%s 性别:%s 手机号:%s 学院:%s 籍贯:%s 总成绩:%d\n\n", p->number, p->name, p->sex, p->Tel, p->college, p->add,p->score);  
        printf("\n是否要继续修改? \n是Y否N:     ");  
        choice=getch();  
        if (choice == 'n' || choice == 'N') break;  
    }  
    system("pause");  
    return h;  
}  


    

/*******************************************************************************************************
* 功能描述: 查询信息(按学号)
* 输入描述: 学生学号  
* 输出描述: 学生信息  
* 返回值  : 无
* 其他说明:  没有时显示“没有此生”
********************************************************************************************************/
  
void findNum(stu *h)                      //按学号查询信息  
{  
    char num[20];  
    stu *p; 
	

	if (h== NULL)  
    {  
		printf("\n请输入要查找学生信息的学号:");
		scanf("%s", num);
        printf("\n没有此学生!");
        getch();  
        return;  
    }  
    printf("\n请输入要查找学生信息的学号:");  
    scanf("%s", num);  
    p=h;  
    while(p)  
    {  
        if(strcmp(p->number, num)!=0)    p = p->next;  
        else break;  
    }  
    if(!p)  
    {  
        printf("\n没有此学生!");  
        getch();  
        return;  
    }  
    printf("你查找的学生信息如下:\n");  
    printf("\n学号:%s 姓名:%s 性别:%s 手机号:%s 学院:%s 籍贯:%s 总成绩:%d\n\n", p->number, p->name, p->sex, p->Tel, p->college, p->add, p->score);  
    printf("输入任意键继续!");  
    getch();  
}  


/*******************************************************************************************************
* 功能描述: 查询信息(按姓名)
* 输入描述: 学生学号  
* 输出描述: 学生信息  
* 返回值  : 无
* 其他说明:  没有时显示“没有此生”
********************************************************************************************************/
  
void findName(stu *h)                      //按姓名查询信息  
{  
    char name[20];  
    stu *p;
	
	if (h== NULL)  
    {  
		printf("\n请输入要查找学生信息的姓名:");
		scanf("%s", name);
        printf("\n没有此学生!");  
        getch();  
        return;  
    }  
    printf("\n请输入要查找学生信息的姓名:");  
    scanf("%s", name);  
    p=h;  
    while(p)  
    {  
        if(strcmp(p->name, name)!=0)    p = p->next;  
        else break;  
    }  
    if(!p)  
    {  
        printf("\n没有此学生!");  
        getch();  
        return;  
    }  
    printf("你查找的学生信息如下:\n");  
    printf("\n学号:%s 姓名:%s 性别:%s 手机号:%s 学院:%s 籍贯:%s 总成绩:%d\n\n", p->number, p->name, p->sex, p->Tel, p->college, p->add, p->score);  
    printf("输入任意键继续!");  
    getch();  
}  


/*******************************************************************************************************
* 功能描述: 显示信息
* 输入描述: 无 
* 输出描述: 已有学生信息  
* 返回值  : 无
* 其他说明:  
********************************************************************************************************/
  
void print(stu *p)                  //显示全部信息  
{  
	if(p==NULL)  
    {  

        printf("\n没有学生!");  
        getch();  
        return ;  
    }  
	 p = p->next;  
    while (p)  
    {  
        printf("\n学号%s  姓名%s  性别%s  手机号%s  学院%s  籍贯%s   总成绩%d\n", p->number, p->name, p->sex, p->Tel, p->college, p->add,p->score);  
        p = p->next;  
    }  
    printf("\n按任意键继续!");  
    getch();  
}  

/*******************************************************************************************************
* 功能描述: 按总成绩排序
* 输入描述: 无  
* 输出描述: 排序后的学生信息  
* 返回值  : 无
* 其他说明:  
********************************************************************************************************/
stu *sort(stu *head)      //按总成绩冒泡排序  
{  
    stu* p1;  
    stu* p2;  
    char number[20];  
    char name[20];  
    char sex[20];  
    char Tel[20];  
    char college[20];  
    char add[20];  
    int  score;//总成绩  
  
    p1 = head;  
    while (p1!=NULL)  
    {  
        p2 = p1->next;  
        while (p2!=NULL)  
        {  
            if(p2->score<p1->score) 
            {  
                //完成数值交换  
                strcpy(number, p2->number);  
                strcpy(name, p2->name);  
                strcpy(sex, p2->sex);  
                strcpy(Tel, p2->Tel);  
                strcpy(college, p2->college);  
                strcpy(add, p2->add);  
                score= p2->score;  
  
                strcpy(p2->number, p1->number);  
                strcpy(p2->name, p1->name);  
                strcpy(p2->sex, p1->sex);  
                strcpy(p2->Tel, p1->Tel);  
                strcpy(p2->college, p1->college);  
                strcpy(p2->add, p1->add);  
                p2->score= p1->score;  
  
                strcpy(p1->number, number);  
                strcpy(p1->name, name);  
                strcpy(p1->sex, sex);  
                strcpy(p1->Tel, Tel);  
                strcpy(p1->college, college);  
                strcpy(p1->add, add);  
                p1->score= score;  
            }  
            p2 = p2->next;//指向下一个节点  
        }  
        p1 = p1->next;//指向下一个节点  
    }  
    print(head);  
  
    printf("学生信息排序完毕,按任意键继续!");  
    getch();  
    return(head);     /*返回头指针*/  
}

/*******************************************************************************************************
* 功能描述: 插入信息
* 输入描述: 插入位置  
* 输出描述: 学生信息  
* 返回值  : 无
* 其他说明:  位置大于链表长度时显示“没有找到该位置”
********************************************************************************************************/
void insert(stu *head)
{
    int num,i;
    student *p,*q;
    p=head;

    printf("请输入你要插入位置: ");
    scanf("%d",&num);
    if(num>length)
    {
        printf("找不到要插入的位置\n");
        return ;
    }
    else
    {
        printf("请输入你要插入的学生的学号、姓名、性别、手机号、学院、籍贯、总成绩:\n");
        q=(stu *)malloc(N);
        scanf("%s %s %s %s %s %s %d",&q->number,q->name,&q->sex,&q->Tel,&q->college,&q->add,&q->score);

        while(p!=NULL)
        {
            if(p->number==q->number)
            {
                printf("该学号已经存在,无法插入信息!\n");
                return ;
            }
            p=p->next;
        }
        p=head;
        for(i=0; i<num; i++)
            p=p->next;
        q->next=p->next;
        p->next=q;
        length++;
        printf("插入学生信息成功!\n");
		print(head);
        return  ;
    }
	printf("\n按任意键继续!");  
    getch();
}
/*******************************************************************************************************
* 功能描述: 保存至文件
* 输入描述: 无  
* 输出描述: 学生信息  
* 返回值  : 无
* 其他说明:  
********************************************************************************************************/
void outfile(stu *head)     
{  
    stu *p=head;  
    FILE *fp;  
    int ch;  
    ofstream outfile("output.txt",ios::app);  
    if(!outfile)//未成功打开文件  
    {  
        exit(1);  
    }  
    fp=fopen("output.txt","r");  
    ch=fgetc(fp);  
    if ( ch==EOF )  
    {  
        outfile<<"学号    姓名    性别    手机    学院    籍贯    总成绩";  
        outfile<<"\r\n";//回车换行  
    }  
	p = p->next;

    while(p)  
    {  
        outfile<<" "<<p->number<<"    "<<p->name<<"    "<<p->sex<<"    "<<p->Tel<<"    "<<p->college<<"    "<<p->add<<"    "<<p->score;  
        outfile<<"\r\n";  
        p=p->next;  
    }  
    outfile.close();  
} 
//============================系统主菜单==========================  
int MainMenu()  
{  
    int ok;  
    system("cls");  
    printf("  *************************************************************************\n");  
    printf("  **                  欢迎来到学生信息管理系统主界面!                    **\n");
	printf("  **                                                                     **\n");
    printf("  **                              1.管理员                               **\n");  
    printf("  **                              2.学生                                 **\n");  
    printf("  **                              0.退出                                 **\n");
	printf("  *************************************************************************\n");	
    scanf("%d", &ok);  
    return ok;  
}  
  
//============================查询主菜单==========================  
int FindMenu()  
{  
    int ok;  
    system("cls");  
    printf("*************************************************************************\n");  
    printf("*                               1.按学号                                *\n");  
    printf("*                               2.按姓名                                *\n");  
    printf("*                               0.退出                                  *\n");
	printf("*************************************************************************\n");
    scanf("%d", &ok);  
    return ok;  
}  
  
//============================管理员菜单==========================  
int ManageMenu()  
{  
    int choice;  
    system("cls");  
    printf("*************************************************************************\n"); 
    printf("                              1. 添加学生信息                            \n");  
    printf("                              2. 删除学生信息                            \n");  
    printf("                              3. 修改学生信息                            \n");
    printf("                              4. 查询学生信息                            \n");
	printf("                              5. 插入学生信息                            \n");
    printf("                              6. 显示学生信息                            \n");
    printf("                              7. 排序显示信息                            \n");  
    printf("                              0. 返        回                            \n"); 
	printf("*************************************************************************\n");
    printf("请输入你要执行的操作代码:");  
    scanf("%d", &choice);  
    return choice;  
}  
  
//============================管理员菜单==========================  
int StudentMenu()  
{  
    int choice;  
    system("cls");  
    printf("*************************************************************************\n");  
    printf("                              1. 查询学生信息                            \n");  
    printf("                              0. 返        回                            \n");
	printf("*************************************************************************\n");
    printf("请输入你要执行的操作代码:");  
    scanf("%d", &choice);  
    return choice;  
}  




主函数main.cpp

#include "stu.h"

int main()  
{  
    int nChoose1;  
    int nChoose2;  
    int nChoose3;  
    int nChoose4;  
    int nEnd = 1;  
    int nEnd2 = 1;  
    int nEnd3 = 1;  
    char sName[10];  
    char sPassword[10];  
    //int i;   //choice用于选择对数据执行操作,i循环,ok主界面选择//  
    stu *head;  
    head = NULL;  
    while (nEnd)  
    {  
		
        nChoose1 = MainMenu();  
        switch (nChoose1)  
        {  
        case 0:  
            nEnd = 0;
			sort(head);                //排序  
            outfile(head);               //将链表内容写入文件  
            system("cls");               //清屏    
            printf("         \n        谢");  
            Sleep(200);  
            printf("                谢");  
            Sleep(200);  
            printf("                使");  
            Sleep(200);  
            printf("                用\n\n");  
            break;    
        case 1:    
            printf("请输入账号:\n");  
            scanf("%s", sName);    
            printf("请输入密码:\n");  
            scanf("%s", sPassword);  
            if (strcmp(sName,"chenzhe")!=0)  
            {  
                printf("账号错误!\n");  
            }  
            else  
            {  
                if (strcmp(sPassword,"123456")!=0)  
                {  
                    printf("密码错误!\n");  
                }  
                else  
                {  
                    nEnd2 = 1;  
                    while (nEnd2)  
                    {  
                        nChoose2 = ManageMenu();  
                        switch (nChoose2)  
                        {  
                        case 1:  
                            head = creatlink(head);  
                            break;  
                        case 2:  
                            head = delet(head);  
                            break;  
                        case 3:  
                            head = modify(head);  
                            break; 
						
                        case 4:  
                            nChoose4 = FindMenu();  
                            switch (nChoose4)  
                            {  
                            case 1:  
                                findNum(head);  
                                break;  
                            case 2:  
                                findName(head);  
                                break;  
                            default:  
                                printf("=========================================================================\n");  
                                printf("                                错误的选项号                             \n");  
                                printf("=========================================================================\n");  
                                break;  
                            }  
                            break;
						case 5:  
                            insert(head);  
                            break;	
						case 6:
							print(head);
							break;
                        case 7:  
                            head = sort(head);  
                            break;  
                        case 0:  
                            nEnd2 = 0;  
                            break;  
                        default:  
                            printf("=========================================================================\n");  
                            printf("                                错误的选项号                             \n");  
                            printf("=========================================================================\n");  
                            break;  
                        }  
                    }  
                }  
            }  
            break;  
        case 2:  
            nEnd3 = 1;  
            while (nEnd3)  
            {  
                nChoose3 = StudentMenu();  
                switch (nChoose3)  
                {  
                case 0:  
                    nEnd3 = 0;  
                    break;  
                case 1:  
                    nChoose4 = FindMenu();  
                    switch (nChoose4)  
                    {  
                    case 1:  
                        findNum(head);  
                        break;  
                    case 2:  
                        findName(head);  
                        break;  
                    default:  
                        printf("=========================================================================\n");  
                        printf("                                错误的选项号                             \n");  
                        printf("=========================================================================\n");  
                        break;  
                    }  
                    break;  
                default:  
                    printf("=========================================================================\n");  
                    printf("                                错误的选项号                             \n");  
                    printf("=========================================================================\n");  
                    break;  
                }  
            }  
            break;  
        default:  
            printf("=========================================================================\n");  
            printf("                                错误的选项号                             \n");  
            printf("=========================================================================\n");  
            break;  
        }  
    }
	return 0;
	
} 



运行结果:










  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值