링크드리스트를 이용한 학생관리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
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,