1 设计题目:学生成绩管理系统。
2 设计目的:
1. 巩固C#语言编程知识,提高面向对象编程能力,提高分析与解决实际问题的能力。
2. 掌握循环、子程序等结构的程序设计方法。
3. 掌握数组、结构体等数据结构的设计方法。
4. 掌握排序检索等程序设计技术。
3 项目实现的功能:
1. 学生类的实现;
2. 输入10个学生的学号、姓名、各门课程的成绩;
3. 计算学生的总成绩和平均成绩;
4. 按总成绩排序并显示;
5. 检索功能,可以按姓名、学号进行检索。
6. 能够插入、修改和删除学生信息
7. 能够正常退出程序。
4 设计原理:
1. 建立一个学生类,利用List动态数组存储学生的学号,姓名,数学成绩,英语成绩,C#成绩。
2. 在学生类里面定义函数:operate()函数当做菜单,input()函数用来输入信息,insert()函数用来插入信息,index()函数用来检索并返回索引值,index_show()函数用来输出索引结果,index_remove()函数用来删除学索引处的生信息,move()函数用来排序,move_Sum()函数用来按总成绩排序,move_show()函数用来输出排序后的信息。
3. operate()函数中用swish语句选择应用选项,用goto Return返回主菜单;input()函数中用Add添加信息;insert()函数中用insert插入信息;index()函数中用IndexOf来检索并返回索引值;index_show()函数中用for循环来输出索引结果;index_remove()函数中用RemoveAt来删除学索引处的生信息;move()函数中用嵌套式双重for循环来排序;
4. 用Console.Clear();来清屏。
5 程序流程图;
6 使用及调试说明;
1.开始调试程序
2.输入学生信息
3.查看输入结果
4.排序
5.查询个人信息
6.删除学生信息
7.插入及修改学生信息
7 源程序代码;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace Student_score_management
{
public class Student //定义了一个学生类
{
List ID = new List(3); //把学生的学号,姓名,英语、数学、C#成绩分别放在动态数组中。
List Name = new List(3);
List English_Score = new List(3);
List Math_Score = new List(3);
List VisualCshap_Score = new List(3);
public void Menu() //主菜单
{
Console.WriteLine("主菜单:");
Console.WriteLine("1.编写学生信息。");
Console.WriteLine("2.查看学生信息。");
Console.WriteLine("3.删除学生信息。");
Console.WriteLine("4.生成学生成绩单。");
Console.WriteLine("5.安全退出。");
Console.WriteLine("______________________________________");
Console.WriteLine("请选择(以回车键结束)。");
}
public void Menu1() //小菜单1
{
Console.WriteLine("1.添加学生信息。");
Console.WriteLine("2.插入学生信息。");
Console.WriteLine("3.修改学生信息。");
Console.WriteLine("______________________________________");
Console.WriteLine("请选择(以回车键结束)。");
}
public void Menu2() //小菜单2
{
Console.WriteLine("1.按学号查询");
Console.WriteLine("2.按姓名查询");
Console.WriteLine("______________________________________");
Console.WriteLine("请选择(以回车键结束)。");
}
public void Menu3() //小菜单3
{
Console.WriteLine("1.按学号删除");
Console.WriteLine("2.按姓名删除");
Console.WriteLine("______________________________________");
Console.WriteLine("请选择(以回车键结束)。");
}
public void Menu4() //小菜单4
{
Console.WriteLine("1.按录入顺序输出成绩单");
Console.WriteLine("2.按总成绩排序输出成绩单");
Console.WriteLine("3.按英语成绩输出成绩单");
Console.WriteLine("4.按数学成绩输出成绩单");
Console.WriteLine("5.按C#成绩输出成绩单");
Console.WriteLine("______________________________________");
Console.WriteLine("请选择(以回车键结束)。");
}
public void input() //添加学生信息的函数
{
Console.Write("学号:\t");
ID.Add(Console.ReadLine());
Console.Write("姓名:\t");
Name.Add(Console.ReadLine());
Console.Write("英语成绩:\t");
English_Score.Add(Console.ReadLine());
Console.Write("数学成绩:\t");
Math_Score.Add(Console.ReadLine());
Console.Write("visual C#成绩:\t");
VisualCshap_Score.Add(Console.ReadLine());
}
public void insert(int i) //插入学生信息的函数,使用动态数组插入函数
{
Console.Write("学号:\t");
ID.Insert(i, Console.ReadLine());
Console.Write("姓名:\t");
Name.Insert(i, Console.ReadLine());
Console.Write("英语成绩:\t");
English_Score.Insert(i, Console.ReadLine());
Console.Write("数学成绩:\t");
Math_Score.Insert(i, Console.ReadLine());
Console.Write("visual C#成绩:\t");
VisualCshap_Score.Insert(i, Console.ReadLine());
}
public void index_show(int i) //输出索引结果的函数
{
double Sum;
double Ave;
Sum = (Convert.ToDouble(English_Score[i]) + Convert.ToDouble(Math_Score[i]) + Convert.ToDouble(VisualCshap_Score[i]));
Ave = (Convert.ToDouble(Sum) / 3);
Console.WriteLine("学号:\t姓名:\t英语:\t数学:\tC#分:\t总分:\t平均分:\t");
Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6:#.00}\t", ID[i], Name[i], English_Score[i], Math_Score[i], VisualCshap_Score[i], Sum, Ave);
}
public void move_show() //输出排序后信息的函数
{
for (int i = 0; i < ID.Count; i++)
{
double Sum;
double Ave;
Sum = (Convert.ToDouble(English_Score[i]) + Convert.ToDouble(Math_Score[i]) + Convert.ToDouble(VisualCshap_Score[i]));
Ave = (Convert.ToDouble(Sum) / 3);
Console.WriteLine("学号:\t姓名:\t英语:\t数学:\tC#分:\t总分:\t平均分:\t");
Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6:#.00}\t", ID[i], Name[i], English_Score[i], Math_Score[i], VisualCshap_Score[i], Sum, Ave);
}
}
public void index_remove(int i) //删除学生信息的函数
{
ID.RemoveAt(i);
Name.RemoveAt(i);
English_Score.RemoveAt(i);
Math_Score.RemoveAt(i);
VisualCshap_Score.RemoveAt(i);
}
public void move(List temp) //排序的函数
{
for (int i = ID.Count - 1; i > 0; i--) //冒泡排序法
{
for (int j = 0; j < i; j++)
{
if (Convert.ToDouble(temp[j]) < Convert.ToDouble(temp[j + 1]))
{
object Temp;
Temp = ID[j];
ID[j] = ID[j + 1];
ID[j + 1] = Temp;
Temp = Name[j];
Name[j] = Name[j + 1];
Name[j + 1] = Temp;
Temp = English_Score[j];
English_Score[j] = English_Score[j + 1];
English_Score[j + 1] = Temp;
Temp = Math_Score[j];
Math_Score[j] = Math_Score[j + 1];
Math_Score[j + 1] = Temp;
Temp = VisualCshap_Score[j];
VisualCshap_Score[j] = VisualCshap_Score[j + 1];
VisualCshap_Score[j + 1] = Temp;
}
}
}
}
public void move_Sum(List temp1, List temp2, List temp3) //按总成绩排序的函数
{
for (int i = ID.Count - 1; i > 0; i--)
{
for (int j = 0; j < i; j++)
{
if (Convert.ToDouble(temp1[j]) + Convert.ToDouble(temp2[j]) + Convert.ToDouble(temp3[j]) < Convert.ToDouble(temp1[j + 1]) + Convert.ToDouble(temp2[j + 1]) + Convert.ToDouble(temp3[j + 1]))
{
object Temp;
Temp = ID[j];
ID[j] = ID[j + 1];
ID[j + 1] = Temp;
Temp = Name[j];
Name[j] = Name[j + 1];
Name[j + 1] = Temp;
Temp = English_Score[j];
English_Score[j] = English_Score[j + 1];
English_Score[j + 1] = Temp;
Temp = Math_Score[j];
Math_Score[j] = Math_Score[j + 1];
Math_Score[j + 1] = Temp;
Temp = VisualCshap_Score[j];
VisualCshap_Score[j] = VisualCshap_Score[j + 1];
VisualCshap_Score[j + 1] = Temp;
}
}
}
}
public int index(List temp) //检索方法,返回索引值
{
int T;
return T = temp.IndexOf(Console.ReadLine());
}
public void operate() //《《主程序方法》》
{
Student student = new Student(); //学生类初始化对象
Return: Console.Clear(); // goto Return;用于返回主菜单的语句的标签所在
student.Menu();
byte Number;
Number = Convert.ToByte(Console.ReadLine());
switch (Number)
{
case 1: //实现编写学生信息的代码
Console.Clear();
student.Menu1();
Number = Convert.ToByte(Console.ReadLine());
switch (Number)
{
case 1: //实现添加学生信息的代码。
Console.Clear();
Console.WriteLine("请输入学生信息(以回车键结束)。");
student.input();
Console.WriteLine("是否继续输入?是请输入‘y’返回主菜单请输入‘n’(以回车键结束!)");
char ch = char.Parse(Console.ReadLine());
while (ch == 'y')
{
Console.Clear();
student.input();
Console.WriteLine("是否继续输入?是请输入‘y’返回主菜单请输入‘n’(以回车键结束!)");
ch = char.Parse(Console.ReadLine());
}
break;
case 2: //实现插入学生信息的代码。
Console.Clear();
Console.WriteLine("1.按学号插入学生信息。");
Console.WriteLine("2.按索引插入学生信息。");
Console.WriteLine("______________________________________");
Console.WriteLine("请选择(以回车键结束)。");
Number = Convert.ToByte(Console.ReadLine());
switch (Number)
{
case 1:
Console.WriteLine("请输入要插入的学生的前一个人的学号");
int j = student.index(student.ID); //没有找到时返回值是-1
if (j == -1)
{
Console.WriteLine("查无此人!无法插入信息。");
}
else
{
Console.Clear();
Console.WriteLine("请输入要插入的学生信息。(以回车键结束。");
student.insert(j + 1);
}
Console.WriteLine("按回车键返回主菜单");
Console.ReadLine();
break;
case 2:
Console.Clear();
Console.WriteLine("请输入要插入信息的位置(索引从0开始,以回车键结束!)");
int i = int.Parse(Console.ReadLine());
Console.WriteLine("请输入要插入的学生信息。(以回车键结束)");
student.insert(i);
Console.WriteLine("按回车键返回主菜单");
Console.ReadLine();
break;
}
break;
case 3: //实现修改学生信息的代码
Console.Clear();
Console.WriteLine("请输入要修改信息的学生学号");
int n = index(student.ID);
Console.WriteLine("请输入要修改的学生信息");
student.index_remove(n);
student.insert(n);
Console.WriteLine("按回车键返回主菜单");
Console.ReadLine();
break;
default:
Console.WriteLine("输入错误!请按回车键返回主菜单");
Console.ReadLine();
break;
}
goto Return;
case 2: // 2.查看学生信息。
Console.Clear();
student.Menu2();
Number = Convert.ToByte(Console.ReadLine());
switch (Number)
{
case 1: Console.Clear(); //实现按学号查询的代码
Console.WriteLine("请输入学生学号(以回车键结束)。");
int j = student.index(student.ID); //没有找到时返回值是-1
if (j == -1)
{
Console.WriteLine("查无此人!");
}
else
{
student.index_show(j);
}
Console.WriteLine("按回车键返回主菜单");
Console.ReadLine();
break;
case 2: Console.Clear(); //实现按姓名查询的代码
Console.WriteLine("请输入学生姓名以回车键结束)。");
j = student.index(student.Name);
if (j == -1)
{
Console.WriteLine("查无此人!");
}
else
{
student.index_show(j);
}
Console.WriteLine("按回车键返回主菜单");
Console.ReadLine();
break;
}
goto Return;
case 3: //3.删除学生信息。
Console.Clear();
Console.WriteLine("3.删除学生信息。");
student.Menu3();
Number = Convert.ToByte(Console.ReadLine());
switch (Number)
{
case 1: // 实现按学号删除的代码
Console.Clear();
Console.WriteLine("请输入学生学号(以回车键结束)。");
int j = student.index(student.ID); //没有找到时返回值是-1
if (j == -1)
{
Console.WriteLine("查无此人!无法删除!!!");
}
else
{
student.index_remove(j);
}
Console.WriteLine("按回车键返回主菜单");
Console.ReadLine();
break;
case 2: //实现按姓名删除的代码
Console.Clear();
Console.WriteLine("请输入学生姓名(以回车键结束)。");
j = student.index(student.Name); //没有找到时返回值是-1
if (j == -1)
{
Console.WriteLine("查无此人!无法删除!!!");
}
else
{
student.index_remove(j);
}
Console.WriteLine("按回车键返回主菜单");
Console.ReadLine();
break;
}
goto Return;
case 4: //4.查看学生成绩单,学生成绩排序。
Console.Clear();
student.Menu4();
Number = Convert.ToByte(Console.ReadLine());
switch (Number)
{
case 1: //实现按录入顺序输出成绩单的代码
Console.Clear();
student.move_show();
Console.WriteLine("按回车健返回主菜单");
Console.ReadLine();
break;
case 2: //实现按总成绩排序输出成绩单的代码
Console.Clear();
student.move_Sum(student.English_Score, student.Math_Score, student.VisualCshap_Score);
student.move_show();
Console.WriteLine("按回车键返回主菜单");
Console.ReadLine();
break;
case 3: //实现按英语成绩输出成绩单的代码
Console.Clear();
student.move(student.English_Score);
student.move_show();
Console.WriteLine("按回车键返回主菜单");
Console.ReadLine();
break;
case 4: //实现按数学成绩输出成绩单的代码
Console.Clear();
student.move(student.Math_Score);
student.move_show();
Console.WriteLine("按回车键返回主菜单");
Console.ReadLine();
break;
case 5: // 实现按C#成绩输出成绩单的代码
Console.Clear();
student.move(student.VisualCshap_Score);
student.move_show();
Console.WriteLine("按回车键返回主菜单");
Console.ReadLine();
break;
}
goto Return;
case 5: //安全退出
Console.Clear();
Console.WriteLine("5.安全退出。");
Environment.Exit(0);
break;
default:
Console.WriteLine("输入错误!请重输。");
goto Return;
}
}
}
class Program
{
static void Main(string[] args)
{
Student stud = new Student();
stud.operate(); //调用主程序函数的语句
}
}
}
8 设计总结:
这次实训是大学以来第一次实训,也是我第一次连续两周学习同一个内容,对我来说是个不小的挑战。
在编写学生成绩管理系统的过程中总是出错在超出索引上,通过不断思考代码的意义和试验总算能不报错的运行了。不过程序本身还是有一些缺陷,我还会继续研究。
这次实训过程中我还认识到在开始编写程序之前应该思考好实现功能的方案,可以用更好的方法代替笨方法。
长时间做一件事确实能很快让人提高,独立思考能让我发现很多事,能让我独立找出问题所在。
这次实训深化了我对类、对象、数组尤其是动态数组的理解对以后的学习有很大帮助。
9 参考文献:
《C#新手开发实战演习》:
其中有很多对List的函数用法
《叩响C#之门》:
其对C#汇编语言基础知识有详尽讲解
《C#程序设计案例教程》以及百度文库:
让我知道了清屏等代码
本文来源:https://www.2haoxitong.net/k/doc/fc17c00b4b35eefdc8d333f1.html
文档为doc格式