C# - 학생 성적처리, 관리 프로그램 소스
/*
* made by so_Sal
*/
/*
* C#도 코딩한번 해볼겸, 타학교 과제를 설렁설렁 만든 코드라 부족한점이 많습니다.
* 학생 정보 삭제기능은 없으며, 학생 성적순으로 sort하는정도입니다.
* 처음부터 20개의 객체배열을 생성하고 시작합니다.
*/
using System;
class Program
{
static public void Menu()
{ //메뉴 출력루틴
Console.WriteLine("************성적 관리 프로그램***********");
Console.WriteLine("******* 1.학생 정보 입력 *******");
Console.WriteLine("******* 2.학생 성적 입력 *******");
Console.WriteLine("******* 3.학생 성적 계산 *******");
Console.WriteLine("******* 4.학생 정보 출력 *******");
Console.WriteLine("******* 5.학생 성적 출력 *******");
Console.WriteLine("******* 6.종료 *******");
Console.WriteLine("*****************************************");
}
static public void sort(Student[] stu)
{
for (int k = 0; k < Student.count; k++)
{
if (stu[k].number != 0)
{
stu[k].Grade.aver = stu[k].Grade.english +
stu[k].Grade.korean + stu[k].Grade.math;
stu[k].Grade.aver /= (double)3; //언수외 3과목 평균
}
} //학생의 평균 계산
for (int k = 0; k < Student.count; k++)
{
for (int j = 0; j < 20 - (k + 1); j++)
//이미 가장 오른쪽 정렬이 되어있기 때문에 length-(i+1)까지
if (stu[j].Grade.aver < stu[j + 1].Grade.aver)
swap(stu[j], stu[j + 1]);
} //학생 언수외 평균성적으로 정렬. 거품(버블)정렬
for (int p = 0; p < Student.count - 1; p++)
{
stu[p].number = p + 1;
} //언수외 성적순으로 학생의 번호도 다시 새로 정렬
}
static public void swap(Student stu1, Student stu2)
{ //성적순으로 sorting 하는 과정에서 사용하는 함수
Student temp = new Student();
temp.Insert(stu1);
stu1.Insert(stu2);
stu2.Insert(temp);
//tmp를 이용하여 swap.
}
static void Main(string[] args)
{
int menu;
int i;
Student[] stu;
stu = new Student[20]; //최대 20개의 객체 생성
for (i = 0; i < 20; i++)
stu[i] = new Student();
bool[] check_gr = new bool[20]; // grade 확인 배열
while (true)
{
i = 0;
Menu(); // 프로그램이 한번 회전할 때, 메뉴 출력
Console.Write("메뉴를 입력하세요 : ");
menu = Convert.ToInt32(Console.ReadLine()); //메뉴 입력
switch (menu) //메뉴에 따른 case 실행
{
case 1:
if (Student.count == 21)
{ //학생수 최대 20명 생성가능
Console.Write("학생수가 20명을 넘었습니다.");
continue;
}
stu[Student.count - 1].Setinfo(); //학생 정보 입력
break;
case 2:
Console.Write("학생의 번호를 입력하세요 1~20: ");
i = Convert.ToInt32(Console.ReadLine());
if (i > Student.count - 1)
{
Console.WriteLine(i + "번 학생이 존재하지 않습니다.");
} //학생 정보가 존재하는 데이터에만 정보 입력 가능
else
{
stu[i - 1].Grade.SetGrade(stu[i - 1]);
} //학생 성적 입력
check_gr[Student.count] = true;
break;
case 3:
sort(stu); // 정렬함수
break;
case 4:
Console.WriteLine("************************");
Console.WriteLine("n 학번\t이름\t나이\t주소\t성별");
Console.WriteLine("************************");
for (int k = 0; k < 20; k++)
{
if (stu[k].number != 0)
{
Console.Write(stu[k].number + " ");
stu[k].Getinfo();
}
} // 학생의 정보 출력
break;
case 5:
Console.WriteLine("************************");
Console.WriteLine("n 학번\t이름\t국어\t영어\t수학\t평균");
Console.WriteLine("************************");
for (int k = 0; k < Student.count; k++)
{
if (stu[k].number != 0)
{
Console.Write(stu[k].number + " ");
stu[k].Grade.GetGrade();
}
} //학생의 성적정보 출력
break;
case 6:
Console.WriteLine("수고하셨습니다.");
return;
default:
continue;
}
}
}
}
class Student
{
public static int count = 1;
public int number;
public grade Grade; //성적 객체를 포함한다.
public string Id;
public string Name;
public string Age;
public string Address;
public string Sex; //student객체의 변수들
public Student(Student input)
{
//number = input.number;
Id = input.Id;
Name = input.Name;
Age = input.Age;
Address = input.Address;
Sex = input.Sex;
Grade.Id = input.Grade.Id;
Grade.Name = input.Grade.Name;
Grade.korean = input.Grade.korean;
Grade.math = input.Grade.math;
Grade.english = input.Grade.english;
Grade.aver = input.Grade.aver;
Grade = new grade(this); //생성과 동시에 객체 생성
} //생성자를 오버로딩하여 2개의 경우를 두었다.
//위 경우는 생성과 동시에 객체를 삽입하는경우.
public Student()
{
Grade = new grade(this); //생성과 동시에 객체 생성
} //생성자 함수에 오버로딩 사용
//생성과 동시에 Setinfo()함수를 메인에서 불러주므로
//따로 초기화하지 않음.
public void Insert(Student input)
{
number = input.number;
Id = input.Id;
Name = input.Name;
Age = input.Age;
Address = input.Address;
Sex = input.Sex;
Grade.Id = input.Grade.Id;
Grade.Name = input.Grade.Name;
Grade.korean = input.Grade.korean;
Grade.math = input.Grade.math;
Grade.english = input.Grade.english;
Grade.aver = input.Grade.aver;
} //객체 복사함수. swap에 사용된다.
public void Setinfo()
{
Console.Write("학번 : ");
Id = Console.ReadLine();
Grade.Id = Id;
Console.Write("이름 : ");
Name = Console.ReadLine();
Grade.Name = Name;
Console.Write("주소 : ");
Address = Console.ReadLine();
Console.Write("나이 : ");
Age = Console.ReadLine();
Console.Write("성별 : ");
Sex = Console.ReadLine();
number = Student.count;
Student.count++;
} //학생의 정보를 입력한다.
public void Getinfo()
{
Console.Write(Id + "\t");
Console.Write(Name + "\t");
Console.Write(Address + "\t");
Console.Write(Age + "\t");
Console.WriteLine(Sex);
} //학생 정보를 출력한다.
}
class grade
{
public string Name;
public string Id;
public int korean;
public int english;
public int math;
public double aver;
public grade(Student stu)
{
Name = stu.Name;
Id = stu.Id;
korean = 0;
english = 0;
math = 0;
aver = 0;
} //생성과 동시에 변수 초기화
public void SetGrade(Student stu)
{
Console.Write("국어 : ");
korean = int.Parse(Console.ReadLine());
Console.Write("영어 : ");
english = int.Parse(Console.ReadLine());
Console.Write("수학 : ");
math = int.Parse(Console.ReadLine());
Name = stu.Name;
Id = stu.Id;
} //학생의 성적 정보를 삽입하는 함수.
public void GetGrade()
{
Console.Write(Name + "\t");
Console.Write(Id + "\t");
Console.Write(korean + "\t");
Console.Write(english + "\t");
Console.Write(math + "\t");
Console.WriteLine(aver);
} //학생의 성적을 얻어오는 함수
}