실습#1: 파일 입력 및 출력1. 기존에 있는 Text file을 읽어서 Binary file에 출력하는 함수를 만든다.2. 위의 Binary file을 읽어서 Text file에 출력하는 함수를 만든다.3. Project 폴더 내 기존의 text file, 새로 만들어진 binary file, text file이 있는지확인한다.플로우차트소스코드/*제 목: .txt파일을 읽어2진수.dat 파일로 쓰고 다시 2진수.dat파일을 읽어.txt파일로 쓴다.작성자: 박보용작성일: 12. 3. 20목 적: 전자전기프로그래밍실습#1*/#include #include #include int readTXTwriteBIN(char *, char *);//.txt를 읽어 2진수.dat 파일을 쓰는 함수int readBINwriteTXT(char *, char *);//2진수.dat 파일을 읽어.txt 파일을 쓰는 함수void main(void){char *input_file;// 처음의.txt 파일을 저장할 포인터 변수 선언char *binary_file;// 2진수.dat 파일을 저장할 포인터 변수 선언char *output_file;// 마지막으로 출력할.txt 파일을 저장할 포인터 변수 선언input_file="infile.txt";//input_file에 infile.txt를 저장binary_file="binary.dat";//binary_file에 binary.dat를 저장output_file="outfile.txt";//output_file에 outfile.txt를 저장if(!readTXTwriteBIN(input_file, binary_file))//함수가 1을 return 하므로//만약 !1이면, 즉0 이면exit(1);//if문을 탈출하라printf("nnRead text file and write to binary file.n");//다음 문구 출력if(!readBINwriteTXT(binary_file, output_file))//함수가 1을 return 하므로//만약 !1이면, 즉0 이면exit(1);//if문을탈출하라printf("Read binary file and write to text file.n");//다음 문구 출력}int readTXTwriteBIN(char *input_file, char *binary_file){//.txt파일을 읽어//2진수.dat 파일로 쓰는 함수FILE *input=NULL;//읽어올 파일을 저장할 FILE형 구조체 선언과 초기화FILE *binary=NULL;//쓸 파일을 저장할 FILE형 구조체 선언과 초기화char buf[100]={0};//읽어올 메모리 번지 선언과 초기화;//buf의 길이가 100을 넘지 않는다고 가정했으므로 길이를 100으로 지정int len;//출력할 메모리 길이 선언; len: buf값만큼 문자를 읽게되면 쓰레기값까지//읽힐 수있으므로 그 길이를 제한하여 쓰레기값이 출력되는 것을 방지한다.input=fopen(input_file, "rt"); //input_file을 텍스트 형식으로 읽어서(rt) input에 저장하라binary=fopen(binary_file, "wb");//binary_file을 binary 형식으로 생성하여(wb) 열고 //binary에 저장하라len=fread(buf, sizeof(char), 100, input); //fread: input으로부터 한꺼번에 데이터를 읽는다.;//buf로 충분한 메모리공간을 확보한후, input으로부터 크기가//sizeof(char)인 데이터항목 100개를 buf가 가리키는 메모리로 읽어들인다. //그 값(읽은 항목의 개수)을 len에 저장한다.fwrite(buf, sizeof(char), len, binary);//buf에 들어있는 크기가 sizeof(char)인 데이터를 len개만큼 binary에 출력한다.fclose(input);//개방한 input 스트림을 닫아라fclose(binary);//개방한 binary 스트림을 닫아라return 1;//1을 return한다.}int readBINwriteTXT(char *binary_file, char *output_file){//2진수.dat파일을 읽어.txt파일로 쓰는 함수FILE *binary=NULL;//읽어올 파일을 저장할 FILE형 구조체 선언과 초기화FILE *output=NULL;//쓸 파일을 저장할 FILE형 구조체 선언과 초기화char buf[100]={0};//읽어올 메모리번지 선언과 초기화;//buf의 길이가 100을 넘지 않는다고 가정했으므로 길이를 100으로 지정int len;//출력할 메모리 길이 선언; len: buf값만큼 문자를 읽게되면 쓰레기값까지//읽힐 수 있으므로 그 길이를 제한하여 쓰레기값이 출력되는 것을 방지한다.binary=fopen(binary_file, "rb");//binary_file을 binary형식으로 읽어서(rb)//binary에 저장하라output=fopen(output_file, "wt");//output_file을 텍스트형식으로 생성하여(wt)//열고 output에 저장하라len=fread(buf, sizeof(char), 100, binary);//fread: binary으로부터 한꺼번에 데이터를 읽는다.;//buf로 충분한 메모리공간을 확보한 후, binary으로부터 크기가//sizeof(char)인 데이터항목 100개를 buf가 가리키는 메모리로 읽어들인다.//그 값(읽은 항목의 개수)을 len에 저장한다.fwrite(buf, sizeof(char), len, output);//buf에 들어있는 크기가 sizeof(char)인 데이터를 len개만큼 output에 출력한다.fclose(binary);//개방한 binary 스트림을 닫아라fclose(output);//개방한 output 스트림을 닫아라return 1;//1을 return한다.}프로그램을 실행시켰을 때의 화면프로그램을 실행시키기 전 화면: infile.txt만 존재프로그램을 실행시킨 후 화면: binary.dat, outfile.txt 생성Infile.txtOutfile.txt
1. 실습내용동적 메모리 할당 및 포인터를 이용하여 프로그램을 만든다.학생의 수와 그 학생들의 각각의 국어, 영어, 수학 점수를 입력 받는다. 그 학생의 모든 과목의 총점 및 평균, 각 과목에 대한 모든 학생들의 총점 및 평균을 구하여 출력한다.2. 실습목적포인터와 더블포인터의 역할 및 사용방법을 이해한다.동적 메모리 할당을 이용해 메모리 할당을 하고 해제를 하는 법을 이해한다.3. 과제 해결방안1) 알고리즘2) 해결과제main함수 내 오류부분 수정학생의 정보를 가지고 있는 배열들의 메모리를 동적 할당해준다.배열의 요소들(Number, 국어, 영어, 수학 점수, 총점)을 저장할 메모리를 동적 할당해준다.총점을 저장할 배열의 메모리를 동적 할당해준다.평균을 저장할 배열의 메모리를 동적 할당해준다.※ pScore의 구조getScores 함수 작성1) Number를 학생 수만큼 지정해준다.2) 국어, 영어, 수학의 성적을 각각 입력 받는다.totalScores 함수 작성1) 한 학생의 총점을 입력할 메모리를 초기화한다.2) 각 과목과 학생들의 총점의 총점을 초기화한다.3) 한 학생의 총점의 메모리에 각 과목의 점수를 더한 값을 저장한다.4) 각 과목과 학생들의 총점의 총점의 메모리에 그 값들의 합을 저장한다.getAve 함수 작성1) 각각의 총점을 학생 수로 나눈 값을 각각 저장한다.memFree 함수 작성1) 학생의 정보를 가지고 있는 배열들의 메모리 해제2) 배열의 요소들(Number, 국어, 영어, 수학 점수, 총점)을 저장한 메모리 해제3) 총점을 저장한 배열의 메모리 해제4) 평균을 저장한 배열의 메모리 해제4. 코드분석Main 함수int main(){char *title[] = {"Number", "국어", "영어", "수학", "총점"};// 학생의 정보int **pScore = NULL;// 학생들의 수, 정보를 저장할 변수를 더블포인터형으로 선언int *tSub = NULL;// 각 과목의 점수의 총합을 저장할 변수를 포인터로 선언double *aveSub;// 각 과목의 평균을 저장할 변수를 포인터로 선언int *tempScore = NULL;// 학생 성적 정렬을 위한 임시 저장 포인터int num = 0; // 학생 총 인원 수int i, j; // loop문을 위한 카운터// 학생들 숫자 입력printf("학생인원: ");scanf("%d",&num);// 학생의 수를 입력 받는다.printf("n");// 메모리 할당pScore = (int**)malloc(num*sizeof(int*));// 학생의 정보를 가지고 있는 배열들의 메모리를 동적할당: 입력받은// 학생의 수만큼의 메모리가 필요하므로 num*sizeof(int)의 크기만큼 할당tSub = (int*)malloc(4*sizeof(int));// 총점을 저장할 배열의 메모리를 동적할당: 국어, 영어, 수학의 점수와 총점// 이렇게4개의 총점을 저장할 변수이므로 4*sizeof(int)의 크기만큼 할당aveSub = (double*)malloc(4*sizeof(double));// 평균을 저장할 배열의 메모리를 동적할당: 국어, 영어, 수학의 점수와// 총점의 평균 이렇게 4개의 총점을 저장할 변수이므로 4*sizeof(double)의// 크기만큼 할당 평균값은 소수점이 나올 수 있으므로 double형으로 선언for(i=0 ; i
제 1장 회계 정보의 이해제 1절 회계의 필요성1. 회계보고의 책임회계보고의 필요성: 돈의 흐름이 복잡해졌기 때문회계: 돈의 흐름을 기록하여 보고하는 역할수탁책임: 회계 직원이 재산을 맡아 관리하는 책임수탁책임 중 회계보고책임: 재산에 대한 기록과 보고의 책임2. 회계정보의 유용성회계: 재산의 변동을 화폐로 측정하여 이를 보고하는 시스템회계정보의 필요성: 자기 기업의 재산이 어떤 상태에 있는지를 알고 싶고 그에 따라 앞으로의 행동을 결정하기 위함.회계정보의 유용성: 의사결정에 필요한 회계의 역할경제적 의사결정: 개인이나 조직이 보유한 경제적 자원의 가치를 극대화시키려는 의사결정비계량적 정보: 업종의 성격, 경제환경, 기업의 경영방침, 조직구조, 기술수준회계정보: 재무상태나 영업성과 및 현금의 흐름상태를 알려주는 정보*재무상태: 일반적인 재산상태 얼마의 돈이 있고, 부채 또는 자산 등이 어떻게 구성되어 있는지 나타내는 상태재무상태표 등식: 자산 = 부채+자본*경영성과 (영업성과): 수익-비용 = 순이익제 2절 회계시스템의 역할경제활동의 주체: 가계, 기업 및 정부회계시스템의 역할 (인식 및 측정, 저장 및 처리, 보고: 회계시스템)제 3절 회계정보의 제공자와 이용자1. 투자 및 신용의사결정과 재무회계재무회계: 투자자와 금융기관의 의사결정에 대한 회계정보를 중심과제로 하는 회계2. 기업경영과 관리회계관리회계: 경영관리에 필요한 회계정보를 중심과제로 하는 회계3. 세금계산을 위한 세무회계세무회계: 기업의 과세소득을 기준으로 하여 정부에 납부할 세금을 산출하는 데 필요한 정보를 생산하는 회계4. 정부활동에 관한 정부회계5. 일반 이해관계자와 회계정보6. 교회, 학교, 병원 등 비영리기관의 회계7. 회계의 영역별 분류분류중심과제재무회계투자자와 금융기관 등 외부의 정보이용자를 위한 일반목적의 회계관리회계경영자의 내부 의사결정을 위한 회계회계감사정보의 신뢰성을 높이기 위한 외부검증세무회계세금의 계산, 납부 및 계획을 위한 회계비영리회계국가나 비영리법인의 회계국제회계국제간의로 발생 당기순이익은 이들의 발생빈도와 크기에 따라서 해마다 변동이 심할 수 있다.제 4절 자본변동표기초 (1/1) 자본과 기말 (12/31) 자본이 어떻게 변화했는지 자세한 정보를 알려주는 자료1. 자본변동표자본은 주주들이 납입한 자본금과 영업활동으로부터 벌어들인 이익의 사내유보분에 해당하는 이익잉여금으로 구성된다.2. 재무제표간의 연관성제 5절 현금흐름표1. 현금흐름표의 형식과 구성내용현금흐름표: 기업의 현금이 일정기간에 어떻게 변화했는지를 보여주는 보고서현금유입액 – 현금유출액 = 현금증감액(현금흐름)2. 현금흐름 정보의 활용흑자도산: 이익이 발생했는데도 현금이 부족하여 기업이 망하는 경우가 생길 수 있다.이익의 질: 손익계산서에 보고된 당기순이익과 현금흐름표에 표시된 영업활동으로 인한 현금흐름의 괴리가 크면 클수록 보고된 이익의 질이 낮다.제 6절 회계기준과 공시제도1. 회계기준이란 무엇인가?일반적으로 인정된 회계원칙 (GAAP): 회계정보의 산출기준으로서 전문가들의 권위 있는 지지를 받으며 회계 실무에서 받아들여지는 내용을 갖춘 기준2. 관련 법규 및 공시제도: 회계기준에 영향을 주는 법규1. 상법상행위를 영위하는 모든 개인과 크고 작은 회사들이 결산재무제표를 작성하여 이사회의 승인을 얻도록 의무화하고 있다.2. 주식회사의 외부감사에 관한 법률 (외감법)독립된 외부감사인으로 하여금 주식회사가 작성한 재무제표에 대해 회계감사를 실시. 회계처리의 적정성을 통한 기업 이해관계자의 보호와 기업의 건전한 발전을 위해 제정된 법률재무제표의 종류, 준수되어야 할 기업 회계기준, 외부감사인의 자격 및 회계감사기준 등을 규정.- 직전 연도의 자산총액이 100억원 이상인 주식회사- 직전 연도의 자산총액이 70억~100억원인 주식회사 중에서 부채총액이 70억원 이상이거나 종업원수가 300명 이상인 회사3. 자본시장통합법유가증권을 거래하고 있는 상장회사를 주요 대상으로 제정.정기공시제도: 회계기간 종류일 90일 이내에 연차재무제표를 포함한 사업보고서를, 매 반기 및 분기에에 따라 정리하여 재무상태표를 작성수정분개: 이미 장부에 기록한 회계기록 중 변동된 사실이 있거나 회계장부에 아직 기록하지 않았지만 현실적으로 자산, 부채, 자본에 변동을 일으킨 사실이 확인되는 사항에 대해서 회계기말에 장부를 수정하는 분개.제 4장 영업활동과 회계정보제 1절 영업활동과 운전자본1. 기업의 경영활동과 관련 자원영업활동: 기업의 주요 사업목적인 재화나 용역의 수익창출활동투자활동: 영업활동과 관련된 자산과 현금을 제외한 나머지 자산의 취득과 처분 활동재무활동: 영업 및 투자 활동에 필요한 자금을 조달하거나 부채를 상환하는 활동(1) 영업활동 관련 자산과 부채영업활동 관련 자산: 경영활동의 직접 대상이 되는 자산- 재고자산: 고객에게 판매할 목적으로 보유한 자산- 매출채권: 상품을 외상으로 판매하여 발생하는 ‘돈을 받을 권리’: 외상매출금, 받을어음- 매입채무: 상품이나 원재료를 외상으로 매입할 때 발생하는 ‘돈을 지급해야 할 의무’(2) 투자활동 관련 자산투자활동 관련 자산: 영업활동을 지원하기 위해 기본적으로 투자되어야 하는 자산- 유형자산: 물리적 형태가 있는 자산 (기계, 토지, 수송기, 선박 등)- 무형자산: 물리적 형태가 없는 자산 (영업권, 산업재산권, 개발비, 특허권 등)- 투자자산: 영업활동과 직접적인 관련은 없지만 투자를 통해 이윤을 얻기 위해 보유하는 자산 (주식, 금융자산, 투자를 위한 땅 등)* 고기로 파는 닭: 재고자산 / 달걀을 낳는 닭: 유형자산(생물자산)(3) 재무활동 관련 부채와 자본재무활동 관련 부채/자본: 자금조달 및 상환과 관련된 자원- 부채 or 타인자본: 다른 사람들로부터 돈을 빌리는 것(상환 날짜가 정해짐. 대가: 이자(확정된 금액))- 자본 or 자기자본: 기업의 소유주가 자신의 자금을 투자하는 경우(상환 날짜가 정해지지 않음. 대가: 주주들에게 배당금 지급(배당금: 확정되지 않음))2. 영업주기영업주기: 현금으로 영업을 시작하여 여러 가지 활동을 통해 다시 현금을 벌어들이기까지의 연속적인 과정영업주기가 준발생기준: 실질적으로 수익이 실현되는 시점을 기준으로 인식하는 기준현금기준보다 발생기준을 채택하는 이유: 기업의 성과를 측정할 때 발생기준을 적용하면 특정기간 동안의 경영성과가 더 잘 나타날 수 있기 때문제 5장 투자활동과 회계정보제 1절 기업의 투자활동투자활동: 금융자산, 유형자산 또는 무형자산의 취득과 처분 활동제 2절 투자활동과 관련된 자산1. 금융자산 (현금, 주식, 사채 등)(1) 현금 및 현금성자산현금: 통화뿐만 아니라 은행이 발행한 자기앞수표 등 타인발행수표와 당좌예금, 보통예금과 같이 수시입출금이 가능한 예금까지 모두 포함한다.현금성자산: 취득시점에 3개월 이내에 만기가 도래하여 현금화하기 쉬운 채권일반적으로 현금 및 현금성자산은 영업활동과 관련된 자산으로 분류한다.(2) 증권형 금융자산① 증권형 금융자산의 종류증권형 금융자산: 주식이나 사채와 같은 증권증권형 금융자산의 종류발행자취득자사채비유동부채 이자수익채무형 금융자산주식자본 배당금지분형 금융자산이러한 금융자산은 기업에 여유자금이 있을 때 금융자산으로부터 수익을 얻기 위해 취득한다.② 증권형 금융자산의 평가2. 유형자산유형자산: 기업 고유의 영업활동을 달성하기 위하여 장기간 사용할 목적으로 보유중인 물리적 형체가 있는 자산(1) 유형자산의 취득원가취득원가 = 구입가격 + 부대비용(2) 취득 후의 지출지출의 성격에 따라 해당 유형자산의 원가에 가산하거나 이를 단순히 비용으로 처리한다.자본적 지출: 해당 유형자산의 원가에 가산하는 지출 자산의 내용연수가 증가하거나 해당자산의 미래 경제적 효익이 실질적으로 증가하는 경우의 지출수익적 지출: 일반적으로 일상적인 수선, 유지를 위한 지출 금액이 적고 사소한 지출(3) 가치의 감소시간이 경과하거나 사용을 하면 유형자산의 가치가 감소한다.따라서 재무제표에 표시되는 자산의 금액도 점차 감소시켜 주어야 하는데, 이를 감가상각이라고 한다.3. 무형자산무형자산: 유형자산과 그 보유목적은 같으나 물리적 형체가 없는 자산개발비, 영업권, 특허권, 저작권, 상호와 같기업에서 자금이 필요해 빌린 ‘단기차입금’단기부채 상환능력(유동비율) = 유동자산/유동부채: 기업의 유동성을 평가하는 데 이용된다.일반적으로 2:1 (200%) 이상이면 만족스럽다고 여겨진다.2. 비유동부채(1) 장기차입금장기차입금: 원금을 재무제표 보고기간일로부터 1년 이후의 일정시점에 상환하게 되어 있는 채무(2) 사채: 기업은 다수의 일반대중으로부터 거액의 장기적인 자금을 조달하기 위하여 사채증권을 발행하고 자금을 차입할 수 있다.사채증서: 액면금액, 이자율, 이자지급일, 만기일액면금액: 사채의 만기시에 지급하는 금액액면이자율 = 시장이자율: 액면발행액면이자율 < 시장이자율: 할인발행액면이자율 > 시장이자율: 할증발행제 3절 재무활동과 관련된 자본1. 주식(1) 보통주보통주: 주식회사가 표준이 되는 한 종류의 기본적인 주식. 기업이 기업운영에 실패하면 최종적인 위험을 부담하게 되고, 성공하면 이익을 받는 잔여지분의 성격을 갖는다.보통주를 소유한 주주들은 지분소유비율만큼 의결권을 행사할 수 있으며, 배당을 통하여 이익잉여금을 분배받을 권리가 있다.(2) 우선주우선주: 보통주에 비하여 특정한 권리가 우선하여 적용되는 주식보통주에 우선하여 일정률의 배당금을 지급받을 권리가 보장된다.2. 자본금과 주식자본금 = 주식수 X 액면금액발행금액 > 액면금액: 할증발행발행금액 = 액면금액: 액면발행발행금액 < 액면금액: 할인발행할증발행일 경우액면금액은 ‘자본금’으로 기재액면금액을 초과하는 금액은 주식발행초과금으로 기록, ‘자본잉여금’3. 자본잉여금자본잉여금: 영업활동이 아닌 재무활동을 통하여 얻어진 잉여금 (주식발행초과금)4. 이익잉여금이익잉여금: 기업의 영업활동을 통해서 획득한 이익으로써 기업 밖으로 유출되지 않고 기업내부에 유보되어 있는 금액이익잉여금 = sum(순이익 – 배당금)제 4절 자본과 기업가치기업가치 = 주가 X 발행주식수그 회사의 주식 100%를 모두 취득하면 그 회사를 취득한 것이고, 그 금액이 기업의 가치가 된다.주식의 과반수만 가지고 있어도 사실상 총부채
1. 실습내용주어진 main2.txt 파일에는 사람들의 이름과 각각의 성적이 쓰여져 있다. 이 파일을 읽어 다음의 항목들을 구해 출력한다.성적의 평균 값, 표준편차 값평균에 가장 근접한 사람의 성적과 이름편차 범위 내에 있는 사람의 이름 목록2. 실습목적C 프로그램에서 사용되는 memory model(Register, Code, Data, Stack, Heap)을 이해한다.Pointer의 역할을 이해한다.Dynamic memory allocation을 통한 memory할당에 대하여 이해한다.3. 과제 해결방안1) 알고리즘2) 해결과제main함수 내 오류부분 수정사람의 이름을 저장할 배열 names[k]의 동적 메모리는 할당되어 있다. 그러나 그 배열을 저장할 메모리가 할당되어 있지 않다. names는 더블포인터 형으로 선언되어 있기 때문에 동적 메모리를 한 번 더 할당해 주어야 한다.names=(char **)malloc(num_persons*sizeof(char*));for문 내부에 성적을 저장하는 배열이 존재한다. 그러나 이 배열의 메모리가 할당되어 있지 않다. 따라서 grades의 동적 메모리를 할당해 주어야 한다.grades=(int*)malloc(num_persons*sizeof(int));편차 범위 내에 있는 사람의 이름을 저장하는 메모리 names_in_range가 동적할당되어 있는데, 이 메모리가 해제되지 않고 있다. malloc()으로 동적 메모리를 한 번 할당을 해 주었으면 한 번 free()로 그 메모리를 해제해주어야 한다. 메모리 낭비를 방지하기 위함이다.memory_free(names_in_range);get_average 함수 작성총점, 평균, 편차를 저장할 변수를 각각 sum, ave, dev로 선언 후 0으로 초기화한다.for문을 이용해 각각의 성적을 더한다.sum+=grades[k];구한 총점 값으로 평균을 구한다.ave=sum/사람 수;총점, 평균 값을 이용해 편차를 구한다.dev+=pow(grades[k]-ave, 2);반환하 수, 문자열의 길이를//저장할 변수를int형으로 각각 선언char *who; //평균과 가장 근접한 사람의 이름을 저장할 포인터 변수를 char형으로 선언char the_name[512]; //이름을 저장할 배열을 char형으로 선언int num_persons; //읽을 파일 내에 첫줄의 사람수를 저장할 변수를 int형으로 선언char **names; //이름을 저장할 배열의 포인터를 저장할 더블포인터를 char형으로 선언int *grades; //성적을 저장할 배열의 포인터를 int형으로 선언char **names_in_range; //편차범위내의 사람들의 이름을 저장할 변수를 char형으로 선언//(names를 저장해야 하기 때문에 **사용)fp = fopen("main2.txt", "r");//FILE형 구조체 fp에 main2.txt 파일을 읽어서 기입한다.fscanf(fp, "%d", &num_persons);//fp에 저장된 내용의 첫번째줄의 숫자를 읽어온다.//(전체사람의 숫자를 의미)grades=(int*)malloc(num_persons*sizeof(int));//성적을 저장할 메모리를//사람수*(int의크기: 4byte)만큼 동적할당한다.names=(char **)malloc(num_persons*sizeof(char*));//사람의 이름의 배열을 저장할 메모리를//사람수*(char*의크기: 4byte)만큼 동적할당한다./* 이름과 성적을 각각의 배열에 저장하는 for문*/for(k = 0 ; k < num_persons ; k++) { //사람수만큼 for문을 실행한다fscanf(fp, "%s", the_name); //fp에 저장된 문자열을 the_name 배열에 저장한다.len = strlen(the_name); //the_name의 문자열의 길이를 계산해 len에저장names[k] = (char *)malloc((len+1)*sizeof(char));//names[k]를 저장할 메모리를//(len+1)*(char의크기: 1byte)만*/names_in_range = (char **)malloc(num_persons*sizeof(char *));//names_in_range(편차범위내의 사람 이름)을 저장할 메모리를//사람수*(char*의크기: 4byte)만큼 동적할당한다.assert(names_in_range); //name_in_range값(편차범위내의 사람수)이 0이면 프로그램을 종료한다.num_in_range = get_in_range(names, grades, num_persons, average, std_dev, names_in_range);//get_in_range 함수를 호출하여 return된 값(편차범위내에 있는 사람의 수)을 //num_in_range(편차범위내에 있는 사람의 수)에 저장for(k = 0 ; k < num_in_range ; k++)//편차범위내에 있는 사람의 수만큼 for문 실행printf("%sn", names_in_range[k]);//편차범위내에 있는 사람의 이름을 출력memory_free(names_in_range);//할당해준 names_in_range의 동적메모리를 해제./* 동적할당된 메모리를 해제하는 함수*/dispose_memories(grades, names, num_persons);//dispose_memories 함수를 호출check_memory();//check_memory 함수 호출}1) 함수의 목적프로그램의 시작과 끝을 알린다. 내부에서 필요한 변수들 및 함수를 호출한다.2) 선언한 변수 및 함수에 대한 추가 설명FILE *fp;파일을 읽어오기 위해서는 fopen 함수를 사용한다. fopen 함수는 스트림을 개방하고 FILE형 구조체를 만들어 개방한 스트림에 관한 정보를 기입한 후 그 포인터를 리턴한다. 따라서 FILE형 포인터를 우선 선언해 주어야 한다. FILE *fp는 fp라는 이름을 가진 FILE형 포인터를 선언해 주는 의미이다.double average, std_dev;평균값과 표준편차값은 소수점까지 나타내어야 하기 배열의 주소값을 가리키는 포인터를 다시 가리키는 포인터의 메모리를 동적할당하는 함수이다. 필요한 만큼의 메모리를 사용자가 임의로 할당한다. names는 사람의 이름을 저장하는 변수이므로 char형으로 메모리를 할당해준다. 이 때, names는 더블포인터 (**)로 선언되어있기 때문에 동적할당을 해줄 때에도 포인터를 하나 더 붙여주어야 한다.len = strlen(the_name);strlen은 문자열의 길이 즉, 문자열의 선두부터 NULL 문자 사이의 문자 개수를 읽어오는 함수이다. the_name 배열에 저장된 문자열의 길이를 읽어 len에 저장한다. 이 len 값은 names 배열을 동적할당 할 때 사용되는 변수이다.names[k] = (char *)malloc((len+1)*sizeof(char));사람의 이름을 저장할 배열의 주소값을 가리키는 포인터의 메모리를 동적할당하는 함수이다. 필요한 만큼의 메모리를 사용자가 임의로 할당한다. 이 때, 위에서 저장한 len의 길이를 이용한다. 메모리가 남는 것을 방지하기 위한 방법이다.average = get_average(grades, num_persons, &std_dev);get_average 함수에서는 성적들의 평균값이 return 된다. 이 값이 average 변수에 저장된다. 또한, std_dev는 함수 내에서 계산된 표준편차를 가리킨다. call by reference 를 통해 표준편차값도 가져올 수 있게 해주는 함수 형태이다.grade_of_who = find_nearest(names, grades, num_persons, average, &who);find_nearest 함수에서는 평균값에 가장 근접한 사람의 성적값이 return 된다. 이 값이 grade_of_who 변수에 저장된다. 또한, who는 함수 내에서 그 성적을 가지고 있는 사람의 이름을 가리킨다. call by reference 를 통해 이름값도 가져올 수 있게 해주는 함수 형태이다.names_in_range = (char **)ma코드, 함수)스택 영역(지역변수, 매개변수)데이터 영역(전역변수, 정적변수)힙 영역(동적 메모리 할당)프로그램 실행 코드 또는 함수들이 저장되는 영역잠깐 사용되고 메모리에서 소멸시킬 데이터가 저장되는 영역프로그램이 종료될 때까지 유지되어야 하는 데이터가 저장되는 영역프로그램이 실행되는 동안에 프로그래머가 동적으로 메모리를 할당할 수 있는 영역* 동적메모리 할당이 필요한 이유는?배열을 사용하는 경우 문제점이 생길 수 있다. 배열은 메모리를 할당하게 되면 고정된 메모리를 할당받게 된다. 이 때, 배열의 단점은 다음과 같다.메모리의 낭비: 선언된 배열 요소의 수가 사용된 요소의 수보다 많은 경우메모리의 부족: 선언된 배열 요소의 수가 사용된 요소의 수보다 적은 경우배열 길이에 변수를 선언할 경우 에러 발생이 것을 종합해보면 “필요한 메모리 크기를 예측할 수 없다는 것”이다. 이 때문에 동적 메모리 할당을 사용하는 것이다. 또한 동적 메모리 할당을 지원하는 영역은 힙 영역인데, 필요한 시점에 필요한 크기만큼 메모리를 할당할 수 있고, 메모리의 시작 주소를 포인터로 저장할 수 있는 장점이 있다.* 일반적으로 void* malloc(size_t size) / void free(void* p) 함수를 사용한다.void* malloc(size_t size)이 함수는 호출 성공시 메모리의 시작 주소를 반환하고 호출 실패(할당할 메모리 공간이없는 경우)에는 NULL을 반환한다. 이 때, 반환되는 주소는 void형이다. 즉, 어떤 자료형의 주소인지 결정하지 못한다. 따라서 프로그래머가 필요한 자료형으로 알아서 형변환을하여 사용해야 한다.void free(void* p)이 함수는 malloc() 함수를 통해 동적 메모리가 할당된 공간을 해제한다. 이 때, 포인터변수 p가 힙 영역의 시작주소를 가지고 있기 때문에 free(p)는 p에 저장된 시작 주소의힙 영역을 해제하라는 의미이다. malloc() 함수를 통해 할당된 동적 메모리를 해제하지않으면 그만큼의 메모리가 낭비되기 때문에 해}}
1. 실습내용Birth 또는 Salary 메뉴의 일정 범위를 입력 받아 main.txt 파일에 있는 내용들에서 그 범위 내에 있는 사람들의 정보를 출력한다.연도를 2개 입력 받는다. 그 범위 내에 있는 사람들을 찾아 남자의 수, 여자의 수, 남자와 여자 모두의 수를 출력한다. 그리고 남자일 경우, 수염이 있는 사람과 없는 사람의 수를 각각 출력한다. 여자일 경우, 가지고 있는 아이의 수에 따라 해당되는 여자의 수를 출력한다.봉급을 2개 입력 받는다. 그리고 출력하는 내용의 위 내용과 같다.2. 실습목적구조체와 공용체를 이용하여 서로 다른 타입의 data를 하나로 묶어서 다룰 수 있는 능력을 배양한다. 이미 작성되어 있는 구조체와 공용체의 형태를 이해하고 각각의 값에 접근하는 방법을 익힌다.3. 과제 해결방안1) 알고리즘printBirth 함수와 printSalary 함수는 입력 받는 n1, n2값만 제외하고 모두 동일한 단계로 이루어진다.2) 해결과제printBirth 함수 작성입력 받은 연도의 범위 내에 있는 남자의 수와 여자의 수, 그리고 남자와 여자의 수의 총 합을 구한다.남자일 경우 수염이 있는 남자와 없는 남자의 수를 구한다.여자일 경우 아이의 수에 따라 각각 여자의 수를 구한다.위의 값들을 모두 출력한다.printSalary함수 작성입력 받은 봉급의 범위 내에 있는 남자의 수와 여자의 수, 그리고 남자와 여자의 수의 총 합을 구한다.남자일 경우 수염이 있는 남자와 없는 남자의 수를 구한다.여자일 경우 아이의 수에 따라 각각 여자의 수를 구한다.위의 값들을 모두 출력한다.4. 코드분석printBirth 함수void printBirth (PERSON *persons, int total_persons, int n1, int n2)// 태어난 년도에 따라 내용을 출력하는 함수{int i=0, j=0;int count_m=0, count_f=0, count_total=0; // 범위 내에 있는 남자의 수,// 여자의 수, 남자와 여자 모두의 수를 저장할// int형 변수 선언 및 초기화int count_with_beard=0, count_without_beard=0; // 수염이 있는 남자와 없는 남자의// 수를 저장할 int형 변수 선언 및 초기화int count_children[6]={0}; // 여자의 아이가 몇 명이 있는지를 저장하는 배열// 선언 및 초기화: 가장 많은 아이의 수가 6명이므로// 6의 크기만큼 배열 메모리 할당for(i=0 ; i=n1 && persons[i].date_of_birth[0]