c语言课程设计(学生籍贯管理系统)学完c语言你可以做的案例

目录

第一章 设计简介及设计方案讨论

1.1背景和意义

1.1.1背景:

1.1.2意义:

1.2需求分析

1.3使用说明

1.4流程图

1.5设计

1.5.1功能实现

第二章   核心代码讲解

2.1核心代码与分析

2.1.1代码和分析

第三章  运行结果及分析

3.1运行结果展示

3.1.1截图分析

其余代码:



第一章 设计简介及设计方案讨论

1.1背景和意义

1.1.1背景:

        籍贯对开展遗传咨询、基因分析、区别重名学生,具有重要的参考价值。籍贯与年龄、性别、学历一样,是一项个人信息。所以学校每年会录入学生的籍贯信息。但由于学生人数众多,老师的工作量庞大且很容易出错,在这种背景下本系统便产生了。

1.1.2意义:

        为了保证信息在录入时候的准确性和学校的统一管理,用c语言编写一个程序——学生籍贯信息记录簿设计,该系统可以通过对学生学号的查找进而对学生的籍贯进行增,删,改,查。

1.2需求分析

步骤:

  1. 编写主函数在主函数中编写switch语句提供选择。
  2. 建立一个菜单界面,每次登录系统都会显示菜单界面,当功能执行完毕将再次显示菜单界面,直到在菜单界面输入相应的数字来结束程序。
  3. 编写各子函数,子函数有:结束程序函数,第一次录入学生函数,对学生进行增、删、改、查,的四个函数,保存信息函数,统计学生个数函数。
  4. 将子函数与主函数连接。
  5. 学生籍贯录入系统主要功能有:

(1)创建信息链表并以磁盘文件保存;

(2)读取磁盘文件并显示输出所有学生的籍贯信息;

(3)按学号或姓名查询其籍贯;

(4)能添加﹑删除和修改学生的籍贯信息(可选项);

(5)新增功能统计籍贯管理系统中总共输入学生信息;

1.3使用说明

        该系统可以录入学生的学号,姓名,年龄,电话号码,身份证号码,籍贯,现居住地址。在程序中选择0-7,8个数字后按enter键开始相应的操作。输入0退出管理系统。输入1开始录入学生的信息。输入2显示全部的学生信息。输入3通过学生学号查找学好对应的学生的籍贯信息。输入4通过学生学号修改学号所对应学生的籍贯信息。输入5删除某个学生的全部信息。输入6插入某个学生的信息。输入7保存信息到磁盘文件student.txt文件中。

1.4流程图

 

 

 

 

 

1.5设计

1.5.1功能实现

代码中引入#include<stdlib.h>,#include<string.h>文件,分别用来malloc申请内存空间创建链表,Exit(0)结束程序。和使用字符串函数strcmp,strcpy 用来对比和对比后信息的修改。

为了能够更好的将学生信息录入,所以创建了结构体类型,用于存储学生的籍贯信息。结构体类型如下:

struct student

{

    char num[12];               //学生学号

    char name[40];              //学生姓名

    int age[6];                 //学生年龄

    char tele[20];              //学生电话号码

    int id[18];                 //学生身份证号码

    char jiguan[60];            //学生籍贯

    char addr[80];              //居住地址

    struct student* next;       //next域存放下一节点的位置信息

};

接下来介绍各个函数的功能作用:

1.struct student* LIstInit(struct student* pt);

对链表进行初始化。

2.struct student* ListCreate(struct student* pt, int n);

创建链表将新生成的节点插入到链表中

3.void ListInsert(struct student* pt);

建立一个新的节点插入学生信息插入信息

4.void ListDelete(struct student* pt, char n[40]);

输入学生学号,删除学号对应学生的籍贯信息。数据为空则无法删除。

5.void LIstSearch(struct student* pt, char n[]);

输入学生学号,查询学号所对应学生的籍贯信息,通过strcmp函数对比如果找到则显示信息,找不到则显示没有找到相关信息,如果为空则显示数据为空,无法查找。

6.void input(struct student* p, int i);

输入学生信息

7.void output(struct student* pt);

输出学生的所有信息

8.void menu();该函数为显示菜单函数,为用户提供选择的功能。在main方法中可以利用switch方法来输入数字从而调用menu中对应数字代表的功能。在main方法中开头调用一次menu结束调用一次保证可以进行多次选择。

9. void ListModify(struct student* pt, char na[]);

该函数用学号找到学生并且可以修改学生的籍贯信息。

10. void PrintFile(struct student* pt);通过键盘输入学生信息后,将在目录中建立一个stutent.txt文本文件。对学生的信息进行保存。

11. int ListNum(struct student *pt);

该函数用来统计总共录入了多少个学生得信息。

12. 退出程序,通过引入的stdlib.h文件中的exit(0);来关闭文件。

第二章   核心代码讲解

2.1核心代码与分析

2.1.1代码和分析

1. 初始化链表

struct student* LIstInit(struct student* pt)
{ 
  struct student* head = NULL;
    head = (struct student*)malloc(sizeof(struct student));
    head->next = NULL;
    pt = head;
    return pt;
}

        main函数调用LIstInit函数,将一个指向struct student类型的指针pt作为函数参数传入,在LIstInit函数首先定义一个头指针head令它为空,然后让head指向开辟的大小为sizeof(struct student)建立头节点,令head->next=NULL,建立空的链表,让传进来的指针pt指向head,并且返回pt。

2、插入节点

struct student* ListCreate(struct student* pt, int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        struct student* p;
        p = NULL;
        p = (struct student*)malloc(sizeof(struct student));
        input(p, i);
        p->next = pt->next;
        pt->next = p;
    }
    return pt;
}

         main函数调用ListCreate函数,将一个指向struct student类型的指针和一个整数作为参数传入ListCreate函数。整数代表要插入几个学生的信息,在for循环中循环几次。在for循环中首先定义一个指向struct student类型的指针变量p,然后初始化p,再将p指向大小为(sizeof(struct student)的空间。然后调用input函数填写学生信息。p->next=pt->next表示p指向的节点的next域为空并且永远都是最后一个节点,当再插入一个新的节点的时候会插在此节点的前面。

(1).用图表示此过程:

p0,p1,p2分别表示for循环第一次第二次第三次的指针指向的节点。由图可知p0指向的永远都是最后一个节点并且每次插入一个新的节点的时候都会插到第一个位置。

 3.

void ListInsert(struct student* pt){
struct student* s = NULL;
s = (struct student*)malloc(sizeof(struct student));
…
s->next = pt->next;
    pt->next = s;
}

        此函数是当链表建立,即信息录入完毕后。可以插入一个新的节点,方法与ListCreate函数类似都是先生成一个新的节点,然后将该节点放在第一个位置。变成头节点。

4.删除某个节点

void ListDelete(struct student* pt, char n[])
{
    struct student* p = pt->next, * pre = pt;  
    if (p == NULL)
        printf("数据为空,无法删除!\n");
    else
    {
        while (strcmp(p->num, n) != 0)
        {
            pre = p;
            p = pre->next;
            if (p == NULL)
            {
                printf("没有找到相关信息,无法删除\n");
                return;
            }
        }
        pre->next = p->next;
        free(p);
        printf("删除成功\n");
    }
}

        main函数调用ListDelete函数,首先通过main函数中输入需要删除学生信息的学号,然后再将指向srtuct student类型的指针一起作为函数参数传入ListDelete函数。在ListDelete函数中首先定义指向srtuct student类型的指针p和pre,然后令p = pt->next, * pre = pt分别表示令p指向头节点的指向和令pre指向头节点。首先判断该链表是不是一个空链表如果是则表示该链表中没有数据,输出数据为空,无法删除。如果不为空则进入while循环用(strcmp(p->num, n) != 0)作为判断条件如果不为0表示传进来的和指向的不相等,开始下一步操作。令pre指向pt->next。令p指向pre->next则可以表示为p->(pt->next)->next开始找下一个节点,如果找到最后p==NULL,则表示没有该学生信息,所以输出没有找到相关信息,无法删除。如果找到则跳出循环,执行下一步操作。令pre->next=p->next表示将p节点删除然后free(p)释放掉p所占用的内0存最后输出删除成功。

(1).用图来表示删除过程:假设p2是要删除的节点

 5. void LIstSearch(struct student* pt, char n[]);

        此函数用来查找学号对应学生的籍贯信息,所用方法与ListDelete函数方法一样,如果p=pt->next为空则输出数据为空,无法查找。如果不为空则进入while循环判断如果找不到则输出没有找到相关信息。如果找到则输出该学生的籍贯。

6.查找并且修改

void ListModify(struct student* pt, char na[])
{
    char JG[60];
    struct student* p = pt->next;
    while (p != NULL)
    {
        if (strcmp(p->num, na) == 0)
        {
            printf("请输入您修改后的学生籍贯:\n");
            scanf("%s", &JG);
            strcpy(p->jiguan, JG);
            break;
        }
    }
}

        main函数调用ListModify函数,将一个类型为struct studen的指针和数组字符串作为变量传入ListModify函数。在函数中首先定义一个数组字符串变量,和一个struct studen的指针p并且让p指向pt->next,意思是p指向头节点pt的指向。如果p不为空则开始循环,进入循环后首先一步是判断如果strcmp(p->num, na) == 0则表示p->num和na相等然后开始输入学生籍贯,下一步将输入的信息复制给p->jiguan,将原来的信息覆盖。

7. void input(struct student* p, int i);void output(struct student* pt);

这两个函数通过main函数和其他函数调用。分别用来输入学生信息,输出学生的所有信息。

8.将信息以文件形式保存到磁盘中:

void PrintFile(struct student* pt)
{
    struct student* p = pt->next;
    FILE* fp;
    fp = fopen("student.txt", "w");
    fprintf(fp, "学号\t姓名\t\t\t电话号码\t\t身份证号码\t\t籍贯\t\t\t通讯地址\n");
    while (p != NULL)
    {
        fprintf(fp, "%s\t", p->num);
        fprintf(fp, "%s\t", p->name);
        fprintf(fp, "%s\t",p->age);
        fprintf(fp, "\t%s", p->tele);
        fprintf(fp, "\t\t%s", p->id);
        fprintf(fp, "\t%s\t", p->jiguan);
        fprintf(fp, "\t%s", p->addr);
        fprintf(fp, "\n");
        p = p->next;
    }
    fclose(fp);
}

        用while循环遍历整个链表信息并且用格式化的方式写入文本文件直到p等于NULL的时候读写结束。结束后fclose(fp)关闭文件。

9. 统计总共录入了多少个学生

int ListNum(struct student *pt)
{
       int i = 0;
       struct student *p = pt->next;
       while(p != NULL)
       {
            i++;// 变量i用来计数
            p = p->next;
       }
       return i;
}

        main函数调用ListNum函数,将一个类型为struct studen的指针作为参数传入ListNum函数。在ListNum函数中首先定义一个变量i来计数,然后定义一个struct studen的指针p指向头节点的指向。如果p不为空就开始计数,下一步将p的位置移动到p->next位置。直到p为空循环结束,给main函数返回i,在main函数中输出。

10.main函数

        main函数中定义了struct student类型的指针 pt 用来接收LIstInit,ListCreate的函数返回值并且作为函数参数用来修改和查找信息。在main函数中用do while来循环menu并且用switch来选择函数功能。

第三章  运行结果及分析

3.1运行结果展示

3.1.1截图分析

1.首页menu。如图:3-1

图:3-1

2.输入1 开始录入信息:正常录入。如图:3-2

图:3-2

3.输入2显示全部学生的信息:正常显示。如图:3-3

图:3-3

4.输入3查找学生籍贯:正常显示。如图:3-4

图:3-4

输入不存在的信息:显示数据为空,无法查找。如图:3-5

3-5

5.输入4可以修改学生的信息:修改正常。如图:3-6

3-6

修改后输入2查询:查询正常。如图:3-7

3-7

6.输入5删除学生信息:删除成功。如图:3-8

3-8

显示删除成功输入2查看:信息已被删除出。如图:3-9

3-9

输入不存在的信息:显示数据为空,无法删除。如图:3-10

3-10

7.输入6开始插入学生的信息:插入正常。如图:3-11

3-11

8.输入7保存信息到student.txt中:保存正常。如图:3-12

3-12

9.输入8统计总共录入了多少个学生得信息:如图:3-13

当没有录入学生的信息的时候显示系统中总共录入0个学生的信息。

3-13

10.输入0退出程序:退出正常。如图:3-14

3-14

其余代码:

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Student)
struct Student{
	long num;
	char name[20];
	char jiguan[20];
	struct Student*next;
};
void menu()
{
    printf("\n\n");
    printf("\t\t\t===================学生学籍管理系统===================\n");
    printf("\t\t\t* * * * * * * * * * * * * * * * * * * * * * * * * *  *\n");
    printf("\t\t\t*               0. 退出管理系统                      *\n");
    printf("\t\t\t*               1. 录入学生的相关信息                *\n");
    printf("\t\t\t*               2. 全部学生的相关信息                *\n");
    printf("\t\t\t*               3. 查找某个就学生的籍贯              *\n");
    printf("\t\t\t*               4. 修改某个学生的籍贯                *\n");
    printf("\t\t\t*               5. 删除某个学生的相关信息            *\n");
    printf("\t\t\t*               6. 插入某个学生的相关信息            *\n");
    printf("\t\t\t*               7. 保存学生信息                      *\n");
    printf("\t\t\t*                                                    *\n");
    printf("\t\t\t* * * * * * 学生学籍管理系统欢迎您的使用!* * * * *  *\n");
    printf("\t\t\t======================================================\n");
    printf("\t\t\t选择0-7,按下回车开始操作                             \n");
}
int n;
struct Student * creat(void){
	struct Student* head;
	struct Student* p1,* p2;
	n=0;
	p1=p2=(struct Student*)malloc(LEN);
	printf("请输入您要插入的学生的学号:");
    scanf("%ld", &p1->num);
    printf("请输入您要插入的学生的姓名:");
    scanf("%s", &p1->name);
    printf("请输入您要插入的学生的籍贯:");
    scanf("%s",&p1->jiguan); 
	head=NULL;
	while(p1->num!=0){
		n=n+1;
		if(n==1){
			head=p1;	
		}
		else {
			p2->next=p1;	
		}
		p2=p1;
		p1=(struct Student*)malloc(LEN);
    printf("请输入您要插入的学生的学号:");
    scanf("%ld", &p1->num);
    printf("请输入您要插入的学生的姓名:");
    scanf("%s", &p1->name);
    printf("请输入您要插入的学生的籍贯:");
    scanf("%s",&p1->jiguan);  
	} 
}
struct Student* output(Student*pt){
	printf("%ld",pt->num);
}
int main(){
	struct Student*pt;
	pt=creat();
	output();
	int s;
		while(true){
			menu();
			printf("请选择操作:");
			scanf("%d", &s);
			switch (s)
	        {
	    	case 0:
	        exit(0); 
	        case 1:
	            printf("请输入信息,当您输入0,0,0时表示信息输入结束:\n");
	            pt=creat();
	            break;
	        case 2:
	            output(pt);
	            if(pt==NULL){
	            	printf("没有学生数据,请添加");
				}
				else{
					printf("全部学生信息如下:\n");
					printf("学号\t\t姓名\t\t籍贯\n");
				} 
	            break;
	        default:
	            break;
	        }
		} 
        menu();  
    return 0;
} 

  • 21
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
一、学籍管理系统 1.问题提出 为了分析教学效果并进行相应的学籍处理,各学校每到期末都对综合成绩进行分类统计、上报成绩汇总结果等,这给每位老师和学籍管理人员带来很大工作量。使用学籍管理系统可以减少工作者的工作负担。 2.功能要求 循环显示如图7(a)所示的主菜单。 ………………………………………………….        .………………………………………………………        …………………………………………………………. 请输入选项编号(0 ~4):.        . 请输入选项编号(0 ~4):.        .请输入选项编号(0 ~4):. ………………………………………………….        .………………………………………………………        …………………………………………………………. . 1——录入成绩.                . 1——按学号排序.               . 1——生成并打印补考通知单 . . 2——统计成绩.                . 2——计算平均分并排序 .         . 2——生成并打印退学通知单 . . 3——处理学籍.                . 3——统计分数段.               . 3——生成并打印新名册. . 4——创新功能.                . 4——返回.                    . 4——返回. . 0——退出系统.                . 0——退出系统.                 . 0——退出系统. ……………………………………………………         ……………………………………………………….        …………………………………………………………. 图7(a) 学籍管理主菜单            (b)成绩统计子菜单               (c)学籍处理子菜单 在主菜单中选择1:录入成绩。假设某班的原始成绩形式如下: 学号        姓名        高数    英语    物理    编程    马哲 0909339105 Huangying  89      92      85     88     82 0909339102 Zhangchen  72      68      83     90     78 0909339108 Linan      91      84      90     79     81 …… 其中,原始数据的排列是无序的。系统应能够保留原始成绩单。 在主菜单中选择2:进入如图7(b)所示的子菜单,并统计成绩。在此可以计算平均分、统计各分数段、按学号排序、按平均分排序。在子菜单选择1时,将该班学生的成绩按学号升序排序后的顺序存入std.dat文件中,以方便打印。在子菜单选择2时,求出每位学生的平均分,并按平均分从高到低的顺序进行排序后,写入文件sort.dat中。在子菜单选择3时,统计出各门课、各分数段学生的人数,并如表1所示的形式输出。在子菜单选择4时,返回主菜单;选择0,退出整个系统。 在主菜单选择3:进入如图7(c)所示的子菜单,并处理学籍。为不及格的学生打印重考通知单时,应在通知单上写明重考的课程、时间和地点(由键盘输入)。为了参加多门课重考的学生完成补考,应避免时间重复。为3门以上不及格的学生打印退学通知单。通知单上应写明学生的学号、姓名、退学原因(几门课不及格,成绩多少)。删除已退学的学生信息,将该班中升入高年级的学生信息写入文件next.dat中。在子菜单选择4,返回主菜单;选择0,退出整个系统。 在主菜单中选择4:此项功能学生自由发挥,根据本组爱好增加与本题止相关的新功能。 在主菜单中选择0:显示结束信息(如“感谢使用本软件!已正常退出,按任意键结束。”),按任意键后,退出本功能。 表1 各门课、各分数段学生的人数 ……………………………………………………………………………………………………………….   . 90以上. 80~89分.70~79分.60~69分.60分以下. 高数.      .       .       .       .       . 英语.      .       .       .       .       . 物理.      .       .       .       .       . 编程.      .       .       .       .       . 马哲.      .       .       .       .       . ……………………………………………………………………………………………………………….

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

普朗克.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值