💻 개인공부 💻/C | C++

[C++] 조작자를 이용한 구조체 객체들의 정보 출력 프로그램(feat. struct, setw(), switch)

공대생 배기웅 2020. 6. 21. 03:52
반응형

1. 문제

 

 

2. 요구사항

1.     Namecard의 구조체 작성(이름, 주소, 연락처)

2.     입력할 인원을 입력할 수 있어야 함

3.     입력한 인원들의 정보를 정렬해야 함

4.     이를 출력

5.     위의 요구사항들 + 종료를 실행할 수 있는 메뉴가 있어야 함

 

 

프로그램 설계도

 

 

소스 코드

 

#include<iostream>//C++ 
#include<algorithm>//정렬을 위한 sort함수 헤더함수 
#include<iomanip>//조작자 setw()을 사용하기 위한 헤더함수 
using namespace std; 
struct namecard {//namecard객체 
	char name[30];//namecard의 이름 
    char address[30];//namecard의 주소 
    char tel[20];//namecard의 전화번호 
 }; 
 int menu; //메뉴를 숫자로 할 것이기 때문에 int형으로 설정 
 
 void main() { 
 	while (menu != 4) { 
    //menu로 4를 입력시 종료하기 때문에 위와 같이 입력 
    cout << "1. 입력" << "," << "2. 정렬" << "," << "3. 출력" << "4. 종료" << endl; 
    //메뉴 작성을 위한 안내문 
    int n;//namecard 인원의 수 
    struct namecard list[10000]; 
    //namecard 객체의 수를 n으로 지정하려 하였으나 초기화를 하여 넣어야 한다고 하였으므로 10000으로 설정(어짜피 n까지만 루프를 돌릴 것이므로) 
    cin >> menu;
    //menu입력 
    switch (menu) {
    //사용자가 입력하는 menu값에 다른 switch문 실행 
    case 1: {
    //사용자가 1을 입력하였을 경우 
    cout << "입력을 선택하셨습니다. " << endl; 
    cout << "입력할 인원 수를 입력하세요=>"; 
    cin >> n;
    //namecard 인원 수 입력 
    for (int i = 0; i < n; i++) {
    //n명의 인원의 이름, 주소, 전화번호를 입력! 
    cout << "이름을 입력하세요=>"; 
    cin >> list[i].name; 
    cout << "주소를 입력하세요=>"; 
    cin >> list[i].address; cout << "전화번호를 입력하세요=>"; 
    cin >> list[i].tel; 
    cout << "===============" << endl;
 	} 
	 cout << "===============" << endl; break; 
 } 
 	case 2: {
 	//사용자가 2번을 선택했을 경우 
 	cout << "정렬을 선택하셨습니다" << endl; 
	 struct namecard tmp;
	 //순서를 바꾸기 위해 임의의 저장소 namecard의 또다른 객체인 tmp 생성 
	 for (int i = 0; i < n-1; i++) { 
 	if (list[i].name > list[i + 1].name) { 
   //만약 앞의 순서의 이름이 뒤의 순서의 이름보다 아스키코드가 크다면 
	 tmp = list[i]; 
	 list[i] = list[i + 1]; 
	 list[i + 1] = tmp;//바꾸기 완료!
 	}
 	} 
	 cout << "정렬이 완료되었습니다" << endl;
	 break; 
 } 
	 case 3: {
	 //사용자가 3을 입력하였을 경우 
	 cout << "출력을 선택하셨습니다" << endl; 
	 //출력은 조작자를 이용하였음
	 cout << setw(8) << "이름";//8칸의 width로 이름 넣는 칸 설정 
	 cout << setw(10) << "주소";//10칸의 width로 주소 넣는 칸 설정 
	 cout << setw(15) << "전화번호"<<endl;//15칸의 width로 전화번호 넣는 칸 설정 
 	for (int i = 0; i < n; i++) {
 	//위에서 설정한 width만큼 namecard의 객체들의 이름, 주소, 전화번호를 출력 
 	//남은 공간에는 ' '으로 함으로서 공백으로만 채움 
 	cout << setw(8) << setfill(' ') <<list[i].name; 
 	cout << setw(10) << setfill(' ') << list [i] .address;
 	cout << setw(15) << setfill(' ') << list[i].tel << endl; 
 	} 
 	cout << "===============" << endl; break; 
 			} 
 		} 
 	} 
 }

결과

 

의견

마지막 과제였는데 어려웠다. 구조체를 많이 안쓰다 보니 익숙하지 않아서 그런 듯 하다.

구조체와 구조체의 배열을 설정할 때는 구조체 정의 따로, 구조체 배열 정의 따로 해야 한다.

아스키 코드에 따라 정렬을 하는 부분에서 애를 많이 먹었던 것 같다.

또 메뉴를 설정할 때 switch문을 사용했는데 이 부분은 그렇게 어렵지는 않았지만 역시나 익숙하지 않다는 느낌이 들었다. 하지만 지금까지 수업시간에 내주신 과제 중에서 가장 재미있고 보람 있는 과제인 것 같다.

728x90
반응형