반응형
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
반응형
'💻 개인공부 💻 > C | C++' 카테고리의 다른 글
[C++] string 클래스 (feat. copy, getline, substr, find, replace) (0) | 2020.06.24 |
---|---|
[C++] 예외 처리 (Exception) (0) | 2020.06.21 |
[C++] 제네릭 함수 (feat. template) (0) | 2020.06.21 |
[C++] 상속(Inheritance) - 2 (feat. 가상 함수와 추상클래스) (0) | 2020.06.20 |
[C++] 상속(Inheritance) - 1 (feat. 개념, 상속 접근 지정자) (0) | 2020.06.19 |