처음봣을땐 생각보다 귀찮다.. 포인터, 구조체, 동적변수 c언어의 기본기는 다 갈아넣은거같다
난 파이썬을 해보았지만 약 40시간 정도 걸렸다.
기본 설계는 머리속에서 이미 다 그려져있는데 c를 처음 접하다 보니 별거 아닌거에서 많이 막혔던 것같다.
flow 차트를 그리는거는 인터넷에 있는 플로우차트를 그려주는 사이트를 참조하여
draw.io에서 직접 그려서 냈다.
실행 예)
일단 그래서 생각을 해봤다.
- 플로우 차트를 그린다. ( 설계 ) [drawio ]
- c를 모르면 그냥 코딩하고 그려라 어차피 중간에 막혀서 설계서 다 바뀐다.
- 생각보다 c는 멍청해서 설계를 조정해야하는 일이 많다.
- 코드를 작성한다. 주석은 이때 작성하도록 한다. [visual basic]
- 실행하여 예제와 비교하고 정상적으로 작동하는지 예외는 없는지 확인한다.
플로우 차트
실행결과
소스
코드
#pragma
warning(disable:4996)
//
2017부터 나오는 위험함수 출력 제거
#include
//기본
함수
#define
MAX 100
//
파일 크기
#include
//문자열을
정수형으로 변경하는 함수 쓰기 위한 헤더파일
//#include
//
strcpy 사용하기 위한 헤더파일
#include
//
거듭제곱 함수 쓰기위한 헤더파일 pow
typedef
struct person
{
char name[MAX]; // 이름
char year[MAX]; // 생년월일
char leap_year[MAX]; // 윤년
char country[MAX]; // 국적
char gender[MAX]; // 성별
char department[MAX]; // 학과
int sort; // 정렬 위한 값
};
//
만든 함수 정의
void
aculyear(int num, char* yearp, char* monp, char* dp, char* yoon);
void
birthday(char* year, char* month, char* day, char* birth);
void
aculkeynumber(int num, int *keynumberp);
void
charcheck(char* genderp, char* country, int* number);
void
numconvert(int temp, int* numbertemppp);
int
main(void)
{
printf("3명의 학생 정보를 입력하시오.\n");
// 전역 변수로 입력받을 값 선언
struct person p1[3];
// 입력 값 받는 루프
for (int i = 0; i < 3; i++) {
printf("--------------------------------------------------");
// 임시 값
char nametemp[MAX] = ""; // 이름 임시값
char departmenttemp[MAX] = ""; // 학과 임시값
char yeartemp[MAX] = ""; // 생년월일 들어갈곳
char year[MAX] = ""; // 년 쪼개진 값
char mon[MAX] = ""; // 월 쪼개진값
char d[MAX] = ""; // 월 쪼개진 값
int keynumber = 0; // 주민번호 뒷자리 1개
char gendertemp[MAX] = "";// 성별 받을 곳
char countrytemp[MAX] = ""; // 국적 받을 곳
int regnumtemp = 0; // 주민번호 임시값
char leap_yeartemp[MAX] = ""; // 윤년 받을 곳
int sorttemp = 0; // 주민번호 9자리 받을 곳
// 실제 입력값 받는 구문
printf("\n이름 : ");
scanf_s("%s", nametemp, sizeof(nametemp));
printf("학과 : ");
scanf_s("%s", departmenttemp,
sizeof(departmenttemp));
printf("주민등록번호 : ");
// 주민등록 번호 입력 받기
for (int z = 13; z > 0; z--)
{
int c = _getch() - '0';
if (z < 7) // 8자리부터 13자리까지 x 표시
{
printf("x");
}
else // 비밀번호 입력중
{
printf("%d", c);
regnumtemp = regnumtemp + (pow(10,(z-7)) * c);
}
}
// keynumber 주민번호 1자리
aculkeynumber(regnumtemp, &keynumber);
// 주민번호 9자리로 변경
numconvert(keynumber, ®numtemp);
sorttemp = regnumtemp;
// keynumber 주민번호 1자리
// 주민번호 1자리로 성별, 국적, 가리기
charcheck(gendertemp, countrytemp, keynumber);
// regnumtemp 주민번호 분리 1993 11 04 / 윤년 판단
aculyear(regnumtemp, year, mon, d, leap_yeartemp);
// 1993 11 04
// 년, 월, 일로 나눠진 것을 각숫자와 날짜로 합친다.
birthday(year, mon, d, yeartemp);
// yeartemp 생년월일
// p1[i] = {nametemp,
yeartemp,"",countrytemp,gendertemp,department // struct 정보 입력
strcpy(p1[i].name , nametemp);
strcpy(p1[i].year , yeartemp);
strcpy(p1[i].leap_year , leap_yeartemp);
strcpy(p1[i].country , countrytemp);
strcpy(p1[i].gender , gendertemp);
strcpy(p1[i].department , departmenttemp);
p1[i].sort = sorttemp;
// 루프 돌기전에 정보 출력
// 이름, 생년월일, 윤년여부, 국적, 성별, 학과
printf("\n");
printf("%s, ", p1[i].name);
printf("%s, ", p1[i].year);
printf("%s, ", p1[i].leap_year);
printf("%s, ", p1[i].country);
printf("%s, ", p1[i].gender);
printf("%s ", p1[i].department);
/*printf("%d ", p1[i].sort);*/
printf("\n");
}
// 입력받은 값 종합 출력
printf("==================================================\n");
printf("입력 받은 3명의 정보를 생년월일 기준으로 오름차순으로
출력\n");
printf("--------------------------------------------------\n");
struct person tmp; // 임시로 들어갈곳
//생년월일 기준으로 오름차순으로 재정렬
for (int i = 0; i < 2; i++) { // 주민번호 기준으로 오름차순 정렬 (
버블 정렬 )
for (int j = 0; j < 2; j++) {
if (p1[j].sort > p1[j + 1].sort) {
tmp = p1[j]; // 생년월일에 따라 오름차순 정렬
p1[j] = p1[j + 1];
p1[j + 1] = tmp;
}
}
}
for (int i = 0; i < 3; i++)
{
printf("%s, ", p1[i].name);
printf("%s, ", p1[i].year);
printf("%s, ", p1[i].leap_year);
printf("%s, ", p1[i].country);
printf("%s, ", p1[i].gender);
printf("%s\n", p1[i].department);
/* printf("%d
", p1[i].sort);*/
}
printf("--------------------------------------------------");
return 0;
}
//
입력받은 뒷자리 1개 분리
//int
aculkeynumber(int num, int *keynumberp)
void
aculkeynumber(int num, int *keynumberp)
{
int k, month, day;
k = (num / 100000);
month = (num - (k * 100000)) / 1000; // 월 판단
day = (num - ((k * 100000) + (month * 1000))) / 10; //
일 판단
*keynumberp = (num - ((k * 100000) + (month * 1000) +
(day * 10)));
return keynumberp;
}
//
생년월일 분리 및 윤년 판단
void
aculyear(int num, char* yearp, char* monp, char* dp, char *yoon)
{
int k, month, day;
k = (num / 100000);
month = (num - (k * 100000)) / 1000; // 월 판단
day = (num - ((k * 100000) + (month * 1000))) / 10; //
일 판단
if (k % 400 == 0) // 윤년 판단
{
strcpy(yoon,"윤년");
}
else if (k % 4 == 0)
{
if(k % 100 == 0)
strcpy(yoon, "윤년아님");
else
{
strcpy(yoon, "윤년");
}
}
else
{
strcpy(yoon,"윤년아님");
}
itoa(k, yearp, 10); // 정수를 문자열로 변환 함수 ( 년도 )
itoa(month, monp, 10); // 정수를 문자열로 변환 함수 ( 월 )
itoa(day, dp, 10); // 정수를 문자열로 변환 함수 ( 일 )
}
//생년월일을
구부하는 한글을 넣어 합치는 함수
void
birthday(char* year, char* month, char* day, char* birth)
{
// 생년월일 판단 함수
char birth_day[MAX];
strcpy(birth_day, year);
strcat(birth_day, "년 ");
strcat(birth_day, month);
strcat(birth_day, "월 ");
strcat(birth_day, day);
strcat(birth_day, "일");
strcpy(birth, birth_day);
}
//
주민번호 앞부터 7자리수를 받아 담는다.
//
성별, 국적 확인 펑션
void
charcheck(char* genderp, char* country, int *number)
{
//
int numberint = number;
// 9번째 주민등록번호를 나눠서 짝수는 여자 홀수는 남자로 구분
if (numberint % 2 == 1)
{
strcpy(genderp, "남자");
}
else if (numberint % 2 == 0)
{
strcpy(genderp, "여자");
}
// 7번째 주민등록번호를 5 ~ 8 외국인
if (numberint == 5 || numberint == 6 || numberint == 7
|| numberint == 8)
{
strcpy(country, "외국");
}
else
{
strcpy(country, "대한민국");
}
}
//
7자리주민번호를 8자리 생년월일 앞자리 6개만 활용
void
numconvert(int temp, int *numbertemppp)
{
// 문자열 정수형으로 변환 함수
// 7번째 자리를 이용하여 년도 계산하여 입력
if (temp == 0 || temp == 9)
{
*numbertemppp = *numbertemppp + 180000000;
}
else if (temp == 1 || temp == 2 || temp == 5 || temp ==
6)
{
*numbertemppp = *numbertemppp + 190000000;
}
else if (temp == 3 || temp == 4 || temp == 7 || temp ==
8)
{
*numbertemppp = *numbertemppp + 200000000;
}
}
댓글 없음:
댓글 쓰기