링크드리스트를 이용한 학생관리Pro
#include <iostream>
#include <iomanip>
#include <cstring> // 문자 비교함수 이용.
using namespace std;
struct student
{
char name[20]; // 이름
char s; // 성별
int y; //연령
char c[20]; //출생지
student *p;
};
student *p1;
enum menu {add_student, del_student, n_student, s_student, c_student, show_all, quit};
//메뉴 - 학생추가, 선택삭제 및 중복 삭제, 이름검색, 성비검색, 출생지 명수, 전체보기, 나가기
menu showMenu();
//bool Mystrcmp(char x[], char y[]); // 문자 비교함수 제외 하고 제공해주는 strcmp(a,b)==0 문자 비교함수 이용
bool addStudent(student *sp, int maxsize, int &num); // 학생 추가함수
bool delStudent(student *sp, int maxsize, int &num); // 삭제 함수
void namechcak(student *sp, int num); // 이름 중복 체크 함수
void c_chcak(student *sp, int num); // 도시 중복 체크 함수
void n1_student(student *sp, int num); // 이름 검색함수
void s1_student(student *sp, int num); // 성비 검색함수
void c1_student(student *sp, int num); // 출생지 명수보기함수
void showall(student *sp, int num); // 전체 출력함수
int main()
{
int size=0;
cout << " 몇 명의 사람을 입력하겠습니까??" << endl;
cin>> size; //동적 메모리 할당 크기 지정
student *slist= new student[size]; //동적 메모리 할당
int numofstudents = 0; //입력받은 학생수
bool flag = false; //종료시 사용되는 flag
menu select;
while(true)
{
select = showMenu(); //메뉴함수 콜
switch(select)
{
case add_student :
{
bool success;
success= addStudent(slist, size, numofstudents); //타입이 bool addStudent()인 함수 출력
namechcak(slist, numofstudents); //함수 중복 체크
c_chcak(slist, numofstudents); //함수 중복 체크
break;
}
case del_student : //선택 삭제 및 중복 삭제
{
bool success1;
success1 = delStudent(slist, size, numofstudents);
break;
}
case n_student :
{
n1_student(slist, numofstudents); //타입이 void인 함수 출력
break;
}
case s_student :
{
s1_student(slist, numofstudents); //타입이 void인 함수 출력
break;
}
case c_student :
{
c1_student(slist, numofstudents); //타입이 void인 함수 출력
break;
}
case show_all :
{
showall(slist, numofstudents); //타입이 void인 함수 출력
break;
}
case quit :
{
flag=true;
break;
}
default :
cout << "올바르지 않은 입력입니다." << endl;
break;
}//switch 끝
if(flag==true)
{
break;
}
}//while 끝
delete [] slist; //동적 할당 해제
return 0;
}
menu showMenu()
{
menu ret;
bool flag = false;
while(true)
{
cout << endl;
cout << "--------메뉴--------"<<endl;
cout << "1.입력" <<endl;
cout << "2.선택 삭제" <<endl;
cout << "3.이름으로 검색" <<endl;
cout << "4.성비 검색" <<endl;
cout << "5.출생지 명수보기" <<endl;
cout << "6.전체 표시" << endl;
cout << "Q.프로그램 종료(q/Q)" <<endl;
cout << "원하는 작업의 번호를 입력하세요: ";
cout << endl;
char select;
cin>> select;
switch(select)
{
case '1' :
{
ret = add_student;
flag = true;
break;
}
case '2' :
{
ret = del_student;
flag = true;
break;
}
case '3' :
{
ret = n_student;
flag = true;
break;
}
case '4' :
{
ret =s_student;
flag = true;
break;
}
case '5' :
{
ret =c_student;
flag = true;
break;
}
case '6' :
{
ret = show_all;
flag = true;
break;
}
case 'q' :
case 'Q' :
{
ret = quit;
flag = true;
break;
}
default :
cout << "올바르지 않은 입력입니다." << endl;
break;
}
if(flag==true)
{
break;
}
}
return ret;
}
//
// bool Mystrcmp(char x[], char y[]) // 문자열 비교함수(전지훈 선배의 조언!)
//
//{
// int a, b;
//
// bool ret;
//
// for(a=0; x[a] != '\0'; a++); // 널이 아닐때까지 루프 돌기
//
// for(b=0; y[b] != '\0'; b++); // 널이 아닐때까지 루프 돌기
//
// if( a < b)
// {
// for(int k = 0 ; k <= b; k++)
//
// {
// if(x[k] != y[k]) // 같지 않을 때
// {
// ret = false;
// return ret;
// }
// }
// ret = true;
// return ret;
// }
// else
// {
// for(int k = 0 ; k <= a; k++)
// {
// if(x[k] != y[k]) // 같지 않을 때
// {
// ret = false;
// return ret;
// }
// }
// ret = true;
// return ret;
// }
//}
void namechcak(student *sp, int num)
{
for(int i=0; i<num; i++)
{
if(strcmp((sp+i+1)->name, (sp+i)->name)==0) //// 입력 받은 내용을 strcmp(a,b)==0를 이용하여 문자 비교
{
cout << "이름이 중복 데이터는 다음과 같습니다." <<endl; // 0 이라면 출력
cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl; // 0 이라면 출력
cout << endl;
}
}
}
void c_chcak(student *sp, int num)
{
for(int i=0; i<num; i++)
{
if(strcmp((sp+i+1)->c, (sp+i)->c)==0) // 입력 받은 내용을 strcmp(a,b)==0를 이용하여 문자 비교
{
cout << "도시가 중복 데이터는 다음과 같습니다." <<endl; // 0 이라면 출력
cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl; // 0 이라면 출력
cout << endl;
}
}
}
bool addStudent(student *sp, int maxsize, int &num)
{
bool ret;
if(num >= maxsize) // 할당된 크기보다 num이 클경우
{
cout << maxsize << "명까지의 성적만 받습니다."<<endl;
ret = false;
}
else
{
//포인터를 이용하되 포인터 값의 변경없이 입력받기 (화살표사용)
cout << num << "번 학생의"<< endl;
cout <<"-----1. 이름 입력-----"<<endl;
cin >> (sp+num)->name;
cout << "-----2. 성별(남(m,M)/여(F,f))입력-----"<<endl;
cin >> (sp+num)->s;
cout <<"-----3. 나이 입력-----" <<endl;
cin >> (sp+num)->y;
cout <<"-----4. 출생지 입력-----"<<endl;
cin >> (sp+num)->c;
num++;
ret = true;
}
return ret;
}
bool delStudent(student *sp, int maxsize, int &num) //선택삭제 및 중복 삭제
{
bool ret;
char name[20];
student temp;
cout << "삭제하고 싶은 사람의 이름 : ";
cin>> name;
for(int i=0;i< maxsize;i++)
{
if(strcmp(name, (sp+i)->name)==0) //// 입력 받은 내용을 strcmp(a,b)==0를 이용하여 문자 비교
{
for(int k=i;k<num;k++)
{
temp = sp[i]; //삭제할 내용을 temp로 빼고 그 뒤에 있는 내용을 앞으로 올림.
sp[i] =sp[i+1];
}
cout << "삭제 되었습니다."<<endl;
num--; //올라온 뒷자리를 없어지게 함.
}
}
ret = true;
return ret;
}
void n1_student(student *sp,int num)
{
char name[20];
cout << "찾고자 하는 이름 : ";
cin>> name;
for(int i=0; i<num; i++)
{
if(strcmp(name, (sp+i)->name)==0) // 입력 받은 내용을 strcmp(a,b)==0를 이용하여 문자 비교
{
cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl; // 0 이라면 출력
}
}
}
void s1_student(student *sp,int num)
{
float f=0;
float m=0;
float tf=0.00;
float tm=0.00;
for(int i=0; i<num; i++)
{
if(sp[i].s=='f' || sp[i].s=='F') // f또는 F 일때
{
f++; // 중복 수만큼 증가
//cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl;
}
if(sp[i].s=='m' || sp[i].s=='M') // m또는 M 일때
{
m++; // 중복 수만큼 증가
//cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl;
}
}
tf=(f/(f+m))*100; //여자비율
tm=(m/(m+f))*100; //남자 비율
cout << "여성 : 남성 "<< tf <<':'<< tm <<endl;
}
void c1_student(student *sp,int num)
{
char cs[20];
int count=0;
cout << "찾고자 하는 출생지는?? : ";
cin>> cs;
for(int i=0; i<num; i++)
{
if(strcmp(cs, (sp+i)->c)==0)
{
count++; //중복 수 만큼 증가
// cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl;
}
}
cout << "도시,"<< cs <<"의 거주자 수 :" << count <<endl;
}
void showall(student *sp, int num)
{
cout.precision(2);
cout << fixed;
cout <<setw(5) <<" ________전체 표시_______"<<endl;
cout <<setw(5) <<" 번호 이름 성별 연령 출생지"<<endl;
for(int i=0; i< num; i++)
{
//포인터의 증가를 이용하여 입력받기
cout <<setw(5) <<i+1 << setw(5) << sp->name << setw(5) << sp->s << setw(5) << sp->y << setw(5) << sp->c <<endl;
sp++;
}
cout <<setw(5) <<" _________________________"<<endl;
}
'1. IT Story > Development' 카테고리의 다른 글
C# 채팅 프로그램(Server 확장) (4) | 2012.03.07 |
---|---|
C# 채팅 프로그램(Client) (0) | 2012.03.07 |
선택정렬응용 (0) | 2012.03.07 |
이름정렬 (0) | 2012.03.07 |
링크드리스트(Linked list) (0) | 2012.03.07 |
이진탐색+Recrusion (되부름 알고리즘) (0) | 2012.03.07 |
C# 채팅 프로그램(Server) (2) | 2012.03.06 |
Update Instructions - Mango Beta 2 for WPDevs - 2.0 (0) | 2011.08.22 |