课程设计题目1:学生成绩管理

1、设计1目的

选用C语言或Java语言作为编程工具。于C语言而言,深入领会模块化程序设计的思想,掌握数组、字符串、结构体的应用,掌握文件操作。于Java而言,基本需要两部分内容的掌握:图形用户界面实现,JDBC链接数据库。其中需要熟练运用集合、I/O流、JDBC、GUI,甚至网络编程,通过查找API所提供的方法,完成整个设计。

2、设计1正文

2.1 实验内容

运用C语言或Java语言编程实现学生成绩管理系统的基本功能,能够增、删、改、查、排序,具体如下:

  1. 成绩录入功能:能够录入科目名称和科目数量,然后录入学生成绩。(不少于10名学生)
  2. 成绩浏览功能:可以显示所有录入的成绩。
  3. 成绩排序功能:能够按指定字段排序。例如学号、姓名、总成绩等。(选择法或冒泡法排序)
  4. 成绩查找功能:按照指定字段查找成绩。(折半查找法)
  5. 成绩修改功能:在输入密码正确的情况下,可以对指定成绩进行修改。
  6. 成绩删除功能:在输入密码正确的情况下,删除一个学生的所有成绩。
  7. 成绩统计功能:计算每位同学的总成绩,每门课程的平均成绩等。
  8. 成绩保存功能:将成绩保存在文本文件里。
  9. 成绩读入功能读入成绩文件中的数据。

2.2 实验分析

本设计采用C语言进行编写。

概述:根据需求将整个系统分成不同的模块,每个模块完成一个特定的功能。然后通过主函数调用,分别实现各个功能。

(1)首先定义全局变量n(学生人数)和t(控制函数的退出),一个学生类Class Student;并在其中定义变量有学号、姓名、年龄、性别、C语言、高数,英语、以及总分。

(2)主函数包括初始密码、读取文件、增加信息、查询信息、删除信息、保存信息、浏览信息、修改信息、成绩排序、退出系统,利用的是冒泡排序法分别按学号、姓名、成绩进行排序。

(3)主函数凭借while来实现运行,通过switch实现功能的选取,并且通过menu()来输出菜单界面。

流程图

 

2.3 实验结果与测试

表 1密码

表 2读取文件

表 3增添学生信息

表 4查询学生信息

表 5删除学生信息

表 6保存当前信息

表 7显示当前信息

表 8修改学生信息

表 9统计系统

 完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>//需要用到strcmp函数

#define LEN 15//姓名和学号的最大字符数
#define N 50//最大学生人数

int n = 0, t = 1;//n代表当前学生人数,t用来控制整个程序的执行,以及程序的退出;
char password[LEN]="";//初始密码
//函数声明
void menu();//主菜单函数
void help();//使用帮助
void duqu();//从文件中读取学生信息
void increase();//增加学生信息
void OutputOneStudent(int i);//打印单个学生信息
void seek();//查找学生信息
void de();//删除学生信息
void save();//保存文件
void present();//显示当前信息
void modify();//修改学生信息
void mima();//密码
void tongji();//统计
void paixu();//排序
void chushimima(); //初始密码
void aver();//平均成绩
void tuichu();//退出函数

struct student
{
	char StuID[LEN];//学生学号
	char Stuname[LEN];
	int Stuage;
	char Stusex[LEN];
	float score[3]; //各科成绩
	float sum;
}stu[N];

int main()
{
    chushimima();
	int num;//num是菜单选项
	while (t)//t是全局变量,用tuichu函数来控制循环是否继续
	{
		menu();//输出主菜单界面
		printf("您好,请输入菜单编号:");
		scanf("%d", &num);
		switch (num)
		{
		case 1: help(); break;
		case 2: duqu();break;
		case 3: increase(); break;
		case 4: seek(); break;
		case 5: de(); break;
		case 6: save(); break;
		case 7: present(); break;
		case 8: modify(); break;
		case 9: tongji();break;
		case 10: tuichu(); break;
		default:printf("输入有误,请重新输入!");
		}

	}

	system("pause");
	return 0;
}
void menu()
{
	printf("\n\n");
	printf("*****************************************************\n");
	printf("*                 学生信息管理系统                  *\n");
	printf("*****************************************************\n");
	printf("********************系统功能菜单*********************\n");
	printf("----------------------     --------------------------\n");
	printf("*****************************************************\n");
	printf("**    1、使用帮助       *     2、录入文件          **\n");
	printf("*****************************************************\n");
	printf("**    3、增加学生信息   *     4、查询学生信息      **\n");
	printf("*****************************************************\n");
	printf("**    5、删除学生信息   *     6、保存当前信息      **\n");
	printf("*****************************************************\n");
	printf("**    7、显示当前信息   *     8、修改学生信息      **\n");
	printf("*****************************************************\n");
	printf("**    9、统计系统       *    10、退出系统          **\n");
	printf("*****************************************************\n");
	printf("----------------------     --------------------------\n");

}
void help()
{
	printf("\n这是一个学生信息管理系统,为了帮助您更快的了解使用它,请先仔细阅读以下注意事项:\n");
	printf("\n                  注意事项:                    \n ");
	printf("\n       1、请根据提示进行操作!\n");
	printf("\n       2、初次使用请先选择增加学生信息或者导入文件!\n");
	printf("\n       3、修改或者增加学生信息后切记保存!\n");
	printf("\n       4、如果数据有错误,请先修改再保存!\n");
	printf("\n       5、若您之前使用过,下次进入系统请先刷新学生信息!\n");
	printf("\n       6、保存或者刷新时,输入的文件名后缀请使用.txt,比如: stu.txt,系统会在源程序\n");
	printf("\n          “学生管理系统.exe”的相同目录建立一个.txt文件来保存学生信息,您可以查看\n");
	printf("\n          该文件,但非专业人员不要轻易改动,否则会造成刷新数据异常或刷新失败!\n");
	printf("\n       7、学生信息包括:姓名、学号、性别、年龄、C语言成绩、高数成绩、英语成绩!\n");
	printf("\n       8、最后感谢您的使用!\n");
	system("pause");
}

void duqu()//从文件中读取学生信息
{
	FILE* fp;
	int i=0;
	char filename[50];
	printf("请输入要读取的文件名:\n");
	scanf("%s", filename);
    fp = fopen(filename, "r"); // 打开文件
    if (fp == NULL)
	{
		printf("读取文件失败,请重新输入\n");
		exit(0);
	}
	while(!feof(fp))
    {
    fscanf(fp,"%s",stu[i].StuID);
    fscanf(fp,"%s",stu[i].Stuname);
    fscanf(fp,"%d",&stu[i].Stuage);
    fscanf(fp,"%s",stu[i].Stusex);
    fscanf(fp,"%f",&stu[i].score[0]);
    fscanf(fp,"%f",&stu[i].score[1]);
    fscanf(fp,"%f",&stu[i].score[2]);
    stu[i].sum=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2]);
    i++;
    n++;
    }
	printf("读取成功\n");
	fclose(fp);
	system("pause");
}

void increase()
{
	int i = n, j, flag, m = 0;//i代表增加学生信息过程中任意时刻的学生人数
	printf("\n请输入待增加的学生人数:\n");
	scanf("%d", &m);
	if (m > 0) {
		do {
			flag = 1;
			while (flag)
			{
				flag = 0;
				printf("请输入第%d位学生的学号:\n", i + 1);//第几位学生从1开始计数,而stu[]从零开始,需要加1
				scanf("%s", stu[i].StuID);
				//判断学号是否重复
				for (j = 0; j < i; j++) {
					if (strcmp(stu[i].StuID, stu[j].StuID) == 0) {
						printf("该学号已经存在,请重新输入!\n");
						flag = 1;
						break;
					}
				}
			}
			printf("请输入第%d位学生姓名:\n", i + 1);
			scanf("%s", stu[i].Stuname);
			printf("请输入第%d位学生年龄:\n", i + 1);
			scanf("%d", &stu[i].Stuage);
			getchar();//处理上面输入的换行符,不然系统会把换行符当做一个字符赋值给性别
			printf("请输入第%d位学生性别:\n", i + 1);
			scanf("%s", stu[i].Stusex);
			printf("请输入第%d位学生的C语言成绩:\n", i + 1);
			scanf("%f", &stu[i].score[0]);
			printf("请输入第%d位学生的高数成绩:\n", i + 1);
			scanf("%f", &stu[i].score[1]);
			printf("请输入第%d位学生的大学英语成绩:\n", i + 1);
			scanf("%f", &stu[i].score[2]);
			i++;
			stu[i].sum=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2]);
		} while (i < n + m);//只要当前学生人数还没到达添加后的总人数,就得继续添加
	}
	n += m;// 添加完成,系统人数n的值也要增加
	printf("添加完成!!!\n");
	system("pause");

}

void OutputOneStudent(int i)
{
    printf("学号\t\t姓名\t\t性别\t\t年龄\t\tC语言\t\t高数\t\t英语\t\t总成绩\n");
    printf("%s\t\t%s\t\t%s\t\t%d\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", stu[i].StuID, stu[i].Stuname, stu[i].Stusex, stu[i].Stuage, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].sum);
}

void seek()
{
	int i, num, flag, k=0;
	char s1[LEN + 1];
	printf("*****************************\n");
	printf("**-------1.按学号查询------**\n");
	printf("**-------2.按姓名查询------**\n");
    printf("**-------3.查找C语言成绩最高学生------**\n");
	printf("**-------4.查找高数成绩最高学生------**\n");
	printf("**-------5.查找英语成绩最高学生------**\n");
    printf("**-------6.退出本菜单------**\n");
	printf("***************************************\n");
	while (1)
	{
		flag = 0;
		printf("请输入子菜单:");
		scanf("%d", &num);
		switch (num)
		{
		case 1:
			printf("请输入需要查找学生的学号:\n");
			scanf("%s", s1);
			for (i = 0; i < n; i++)
			{
				if (strcmp(stu[i].StuID, s1) == 0)
				{
					flag = 1;
				OutputOneStudent(i);
				}
			}break;
		case 2:
			printf("请输入需要查找学生的姓名:\n");
			scanf("%s", s1);
			for (i = 0; i < n; i++)
			{
				if (strcmp(stu[i].Stuname, s1) == 0)
				{
					flag = 1;
					OutputOneStudent(i);
				}
			}break;
        case 3:
        for(i=0;i<n;i++)/*查找C语言成绩最高学生*/

       {   if(stu[i].score[0]>stu[k].score[0])

              k=i;

       }
   flag = 1;
       printf("C语言成绩最高学生信息如下:\n");

       OutputOneStudent(k);

       printf("                       输出结束\n");

        printf("  **********************************************************");

    break;
            case 4:
        for(i=0;i<n;i++)

       {   if(stu[i].score[1]>stu[k].score[1])

              k=i;

       }
     flag = 1;
       printf("高数成绩最高学生信息如下:\n");

       OutputOneStudent(k);

       printf("                       输出结束\n");

        printf("  **********************************************************");

    break;
        case 5:
        for(i=0;i<n;i++)

       {   if(stu[i].score[2]>stu[k].score[2])

              k=i;

       }
flag = 1;
       printf("英语成绩最高学生信息如下:\n");

       OutputOneStudent(k);

       printf("                       输出结束\n");

        printf("  **********************************************************");

    break;
		case 6: return;
		default: printf("请在1--6之间输入\n");
		}
		if (flag == 0)
			printf("找不到该学生!\n请重新输入!");
	}
}

void de()
{
    mima();
	int i, j, flag;
	char s1[LEN];
	printf("请输入需要删除的学生学号:\n");
	scanf("%s", s1);
	flag = 0;
	for (i = 0; i < n; i++)
	{
		if (strcmp(s1, stu[i].StuID) == 0)
		{
			flag = 1;
			for (j = i; j < n - 1; j++)
			{
				stu[j] = stu[j + 1];//直接把后面的学生都往前移动一位
			}
		}
		if (flag == 1) break;//说明已经找到了需要删除的学生,结束循环
	}
	if (0 == flag)
	{
		printf("该学号不存在!!!\n");
	}

	if (1 == flag)
	{
		printf("删除成功\n");
		n--;
	}
	system("pause");
}

void save()//把学生信息保存到文件
{
	int i;
	FILE* fp;
	char filename[LEN + 1];
	printf("请输入要保存的文件名:\n");
	scanf("%s", filename);
	if ((fp = fopen(filename, "w")) == NULL) //带w参数打开文件时,该文件会被先清空,若文件不存在会先创建。
	{
		printf("打开文件失败!\n");
		exit(0);
	}
	for (i = 0; i < n; i++)
		if (fwrite(&stu[i], sizeof(struct student), 1, fp) != 1)
			printf("保存失败!!\n");
	printf("保存成功!!!\n");
	fclose(fp);
	system("pause");
}

void present()
{
	int i;

	if (n == 0)
	{
		printf("您好,现在没有学生信息,请先增加学生信息或者刷新再来试试!\n");
	}
	else
	{
		printf("现在共有%d名学生:\n", n);
		printf("学号\t\t姓名\t\t性别\t\t年龄\t\tC语言\t\t高数\t\t英语\t总成绩\n");
		for (i = 0; i < n; i++)
		{
			printf("%s\t\t%s\t\t%s\t\t%d\t\t%.2f\t\t%.2f\t\t%.2f\t%.2f\n", stu[i].StuID, stu[i].Stuname, stu[i].Stusex, stu[i].Stuage, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].sum);
		}
	}

	system("pause");
}

void modify()
{
    mima();
	int i, flag;
	char ID[LEN], name[LEN];
	int age;
	float score;
	printf("请输入需要修改的学生姓名:\n");
	getchar();
	gets(name);

	while (1)
	{
		flag = 0;
		for (i = 0; i < n; i++)
		{
			if (strcmp(name, stu[i].Stuname) == 0)
			{
				flag = 1;
				int num;//用于switch函数的子菜单
				printf("***************************************************\n");
				printf("*----1.修改学号--------  -  -----2.修改性别-------*\n");
				printf("*----3.修改年龄--------  -  -----4.修改C语言成绩--*\n");
				printf("*----5.修改高数成绩----  -  -----6.修改英语成绩---*\n");
				printf("*-------------------7.退出本菜单------------------*\n");
				printf("***************************************************\n\n");
				printf("请输入子菜单:");
				scanf("%d", &num);
				switch (num)
				{
				case 1:
					printf("请输入新的学号:\n");
					getchar();
					gets(ID);
					strcpy(stu[i].StuID, ID); break;
				case 2:
					getchar();
					printf("请输入新的性别:\n");
					scanf("%s",stu[i].Stusex);
					break;
				case 3:
					printf("请输入新的年龄:\n");
					scanf("%d", &age);
					stu[i].Stuage = age; break;
				case 4:
					printf("请输入新的C语言成绩:\n");
					scanf("%f", &score);
					stu[i].score[0] = score; break;
				case 5:
					printf("请输入新的高数成绩:\n");
					scanf("%f", &score);
					stu[i].score[1] = score; break;
				case 6:
					printf("请输入新的英语成绩:\n");
					scanf("%f", &score);
					stu[i].score[2] = score; break;
				case 7:
					return; break;
				default:
					printf("请在1--7之间选择!\n");
				}
				if (num > 0 && num < 7)
					printf("修改成功,记得保存哟!!!\n");
				break;//找到学生,结束循环;
			}
		}
		if (flag == 0)
		{
			printf("没有找到该学生,请重新输入需要修改信息的学生姓名:\n");
			gets(name);
		}
	}
	system("pause");
}


void chushimima()
{
    char mima[LEN];
    printf("请初始化密码:");
    scanf("%s", password);

    printf("确认密码:");
    while(1){
    scanf("%s", mima);

    if (strcmp(password, mima) != 0) {
        printf("密码不一致,请从新输入:");

    }
    else break;
    }
}

void mima()
{
    char mima[LEN];
    while (1) {
        printf("请输入密码:");
        scanf("%s", mima);

        if (strcmp(mima, password) == 0) {
            printf("密码正确!\n");
            break;
        }
        else {
            printf("密码错误,请从新输入:\n");
        }
    }
}

void tongji()

{

    int x;
    printf("**********************************************************\n");
    printf("******************** 欢迎进入统计系统  *****************++\n");
    printf("**********************************************************\n");
    printf("\n");
    printf("  ************请输入所需操作***********\n");/*选择功能菜单*/
    printf("  *************************************\n");
    printf("   1.按总分排序\n");
    printf("   2.查看各科平均分\n");
    printf("   3.返回主菜单\n");
    printf("  **************************************\n");
    printf("  请输入操作选项:");
    scanf("%d",&x);/*用户选择变量*/
    while(t)
    {
        switch(x)
       {
           case 1:
                 paixu();break;/*选择按总分排序操作*/
           case 2:
                aver();break;
           case 3:
                printf("谢谢使用!再见!\n");
               return;/*选择退出操作*/
             default:
                printf("输入错误!请重新输入\n");/*提示错误信息*/

       }
       t=0;
    }
    t=1;
}

void paixu()
{
	int i,j;
	struct student  temp;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n-i;j++)
		{
			if(stu[j].sum<stu[j+1].sum)
			{
				temp=stu[j];
				stu[j]=stu[j+1];
				stu[j+1]=temp;
			}
		}
	}
		for(i=0;i<n;i++)
        OutputOneStudent(i);

}


void aver()
{

       float c, math, eng;
       int p;
       for( p=0; p<n; p++){
        c += stu[p].score[0];
        math +=  stu[p].score[1];
        eng += stu[p].score[2];

    }
        c = c/n;
        math = math/n;
        eng = eng/n;
    printf(" c语言:%.2f   高数:%.2f  英语:%.2f",c, math, eng);
}

void tuichu()
{
	int h;//控制是否确认退出
	printf("即将退出,确认请按1,取消请按0\n");
	scanf("%d", &h);
	if (h == 1)
	{
		t = 0;//t是main函数中while函数是否继续执行的控制条件,是一个全局变量,程序开头已经定义并且赋值位 1
		printf("成功退出,感谢使用!\n");
	}
	if (h == 0)
	{
		printf("退出已取消!\n");
		system("pause");
	}

}

 

 文件读取时汉字显示乱码解决方法:文件的编码格式转换成ANSI

 单击[文件]-->[另存为]选项,见下图,转到下面的步骤。    

 完成上述步骤后,可以看到文件的编码格式,选择“ANSI”格式

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

还没有名字哦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值