2020. 5. 15.

[방통대] (c 프로그래밍) 출석대체과제 입력정보 정리 프로그램 만들기


처음봣을땐 생각보다 귀찮다.. 포인터, 구조체, 동적변수 c언어의 기본기는 갈아넣은거같다
파이썬을 해보았지만 40시간 정도 걸렸다.
기본 설계는 머리속에서 이미 그려져있는데 c 처음 접하다 보니 별거 아닌거에서 많이 막혔던 것같다.
flow 차트를 그리는거는 인터넷에 있는 플로우차트를 그려주는 사이트를 참조하여
draw.io에서 직접 그려서 냈다.

마래 조-건를 만족하는 프로그댐를 만툴고 프로그댐 -싈햅 예와 같이 동작하는 프로그댐를 
작성 하시오. 
1. 반목문를 미용하며 3뎡의 미루과 학과, 주민등뤀번호를 입력받아 프로그댐 -싈햅 예와 
같이 미를, 생년월일, 윤년 며부, 출생지역(대한민국, 외국), 성별(남자, 머사), 학과 이루를 
※ -제출 내용 각고기뻬 배점이 
있으니 모두 작성하길 바람. 
1) 작성한 프로그댐 소스의 
컴퓨터 
C프로그래멥 
1잫~8잫 
과학과 
출력한다l 
생년월일 
출생 년대 
출생지 역 
주민등뤀번호 앞 6자리 숫자와 7번짜 숫자를 문석하며 
:Ⅸ뚀:년 :Ⅸ월 xxæe 출력 
주민등뤀번호 7번짜 숫자로 남자, 머사, 출생년대, 출생지역 구문 
1딩00년대 줄-행한 남자 
2000년대 줄-행한 남자 
1딩00년대 줄-행한 외국인 남자 
2000년대 줄-행한 외국인 남자 
1800년대 줄-행한 남자 
1딩00년대 줄-행한 머사 
2000년대 줄-행한 머사 
1딩00년대 줄-행한 외국인 머사 
2000년대 줄-행한 외국인 머사 
1800년대 머사 
각 라인에 주석를 달고, 
보고서(한글, MSQ드) 
파일에 넣으시오. 
프로 그 댐의 
-캡쳐하며 보고서 파일에 
윤년은 2월달이 2g일미 되는 하근 
조건 1. 년도가 4로 나누어지고 1 00므로 나누어지면 안됩 
조건 2. 조건 1번과 상관없이 400므로 나누어지면 윤년 
2. 입력 받은 3뎡의 점보를 -생년월일를 기준으로 모루자순므로 출력한다l 
※ -싈햅화텬 갭쟤 주의 사할 
> 입력되는 내용의 첫 한재는 반드시 -제출 학생의 미를, 학과뎡므로 입력하며아 한다 
> 입력하는 주민등뤀번호는 임의의 -칹를 입력한다l 
2) 
3) 
넣으시오. 
프로그댐의 
(flowchart)ä 
순서도 
작성하고 
보고서 파일에 넣으시오.

실행 )

• C부C프로그다 황₩C프로그화 황출석수업나까과까(202이-돈x• 
금정의 학생 정보를 입력하시오 
이름 홍길동 
학과 . 컴퓨터과학과 
주민등록번호 • 980501Bxxxxxx 
홍길동, 1898년 05월 01일. 윤년아님, 대한민국, 남자, 컴퓨터과학과 
이금 • 하이디 
학과 : 경영학과 
주민등록번호 : 0003178)Ⅸ:〈:°Ⅸ 
하이디, 2000년 03월 17일. 윤년. 외국』 여자. 경영학과 
이름 . 이순신 
학과 : 법학과 
주민등롯번호 . 7409301xxxxxx 
이순신, 1374년 09월 30일. 윤년아님, 대한민국. 남자, 법학과 
입력 받은 3행의 정보를 생년월일 기준으로 오름차순으로 출릭 
홍길동, 1898년 05월 01일. 윤년아님, 대한민국. 남자. 컴퓨터과학과 
이순신, 1974년 09월 30일, 윤년아님, 대한민국, 남자, 법학과 
하이디, 2000년 03월 17일. 윤년, 외국. 여자. 경영학과 
「ocess exited after 0.0%76 seconds with return value 0 
계속하려년 아무 키나 누르십시오


일단 그래서 생각을 해봤다.

  1. 플로우 차트를 그린다. ( 설계 ) [drawio ]
  • c 모르면 그냥 코딩하고 그려라 어차피 중간에 막혀서 설계서 바뀐다.
  • 생각보다 c 멍청해서 설계를 조정해야하는 일이 많다.

  1. 코드를 작성한다. 주석은 이때 작성하도록 한다. [visual basic]
  2. 실행하여 예제와 비교하고 정상적으로 작동하는지 예외는 없는지 확인한다.

플로우 차트


실행결과

죠 Wcrosoft Visual Studio 디버그 큰을 
3뎡의 학생 정보를 입력하시오 
학과 : -컴打 국과학과 
Ⅰ工口l 로 호 
, 윤년아님, 
대한민국, 
이름:口h이클 
학과 : 경영학과 
岳뷔퉁복번호 : 0106157XXXXXX 
클, 2001년 6월 15일, 윤년아님, 외국, 
이름 
그 I 보 ^ 
학과 : 사회복지과 
주민 퉁복번호 : BB04270xxxxxx 
口 
남자, 컴퓨터과학과 
김복순, 1日%년 4월 27일, 윤년, 대한민국, 
남자, 경영학과 
여자, 사회복지과 
입력 받은 3뎡의 정보를 생년월일 -기준으로 오름차순으로 출력 
그 I 보수 1 
27일, 윤년, 대한민국, 여자, 사회복지과 
, 윤년아님, 대한민국, 남자, 컴퓨터과학과 
마이클, 2001년 6월 1듬닐, 윤년아님, 외국, 남자, 경영학과 
E:fivisual CW나도 *나도 코딩 .exe(프로세스 日444日가)이(기) 종료되었습니다(코드: 0가) 
디버깅이 중지될 때 
코 소 
자동으로 닫으려면 [도구] -> [옵션] -> [디버깅] > [디버깅이 중지되년 자동으로 콘솔 닫기]를 사용 
하도록 설정합니다 
이 장을 닫으려면 아무 키나 누르세요


소스 코드
 
#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, &regnumtemp);
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;
}
}
 




댓글 없음:

댓글 쓰기