-
투자노트 금융공학 프로그래밍 과정 7주차금융공학 퀀트 프로그래밍 과정 2020. 5. 3. 22:52
# 제출안내
1. 방법 : 본인 블로그에 작성 후 본 게시판에 링크를 업로드
또는 본 게시판에 작성. 제목은 '투자노트 금융공학 퀀트 프로그래밍 과정 x주차과제' 등으로 작성
(※ 본 게시판에 작성한 내용은 주기적으로 삭제 및 정리되오니 강의 내용을 가지고
있으시려면 본인 블로그에 작성하시오)
2. 양 : 최종과제 스크린샷 1장 이상 첨부. 스크린샷을 반드시 첨부하시오.
3. 기한 : 매주 일요일 오후 12시 전까지
# 기본과제 및 제출 양식
1. while의 사용방법은
while( 조건식 )
{
조건식이 참일때 실행할 문장
}
과 같다. 이를 암기하시오. 또한 아래 문제를 해결하시오.(3시간 소요)
가. 100, 97, 94... 와 같은 등차수열이 있다.
An = a + (n-1)*d; a=초항, d=공차임을 이용하여 등차수열의 일반항을 수기로 구하시오. 위 수열에서 초항은 100, 공차는 -3이다. 이 때, n값을 숫자로 넣으면 A를 계산해주는 프로그램을 for문을 이용하여 구하시오. 예를들어, n=3 이면 94를 출력해야함.
int An, i, n = 0;
printf("n입력 : ");
scanf("%d", &n);
An = 100;
for (i = 0; i < n-1; i++) {
An += -3;
}
printf("An = %d", An);
return 0;
나. S1 = 100;
S2 = 100 + 97;
S3 = 100 + 97 + 94;
Sn = A1 + A2 + A3 + ... + An; 임을 이용하여 S1, S2, S3 .... S34, S35 를 for문을 이용하여 구하시오. '가'에서 만들어놓은 일반항 프로그램을 재사용 하여 구현하시오. (예를들어, Sum = Sum + A; A = 103-3N; 과 같이 구하면 됨) 예를들어, n=5 이면 470을 출력해야함. (=100+97+94+91+88)
main() {
int An, i, sum=0, n = 0;
//printf("n입력 : ");
//scanf("%d", &n);
n = 5;
An = 100;
sum = 100;
printf("S1 = %d\n", sum);
for (i = 0; i < n-1; i++) {
An += -3;
sum += An;
printf("S%d = %d\n", i + 2, sum);
}
//printf("An = %d", An);
return 0;
}
다. S34은 100+97+94...1 이어서 모든 수가 양수가 더해지고 있고, S35는 100+07+94+...1+ (-2) 처럼 되어 음수를 처음으로 더하게 되므로 Sn의 최대값은 S34이다. Sn의 최대값을 구하기 위해 어디까지 Sum하여야 하는지 수기로 계산하여야 하는 불편함이 있다. '나'에서 만든 프로그램을 조건식 A>0으로 주고 while문을 이용하여 똑같은 기능을 하는 프로그램을 구현하시오.
main() {
int An, i=0, sum=0, n = 0;
//printf("n입력 : ");
//scanf("%d", &n);
An = 100;
sum = 100;
printf("S1 = %d\n", sum);
/*
for (i = 0; i < n-1; i++) {
An += -3;
sum += An;
printf("S%d = %d\n", i + , sum);
}
*/
while (An > 1) {
i++;
An += -3;
sum += An;
printf("S%d = %d\n", i+1, sum);
}
//printf("An = %d", An);
return 0;
}
라. '다'를 개조하여, 초항과 공차를 입력받아
공차가 양수이거나 초항과공차가 모두 음수인경우 S1,S2,S3... S20를 출력하고,
초항이 양수이고 공차가 음수이면 수열의 값이 0 이상일때까지만 합해지도록 하여 부분합S를 출력해 보시오. for과 while중 구현하기 유리한 것을 선택하여 사용해 보시오.
main() {
int An, i=0, sum=0, n = 0, d=0, a=0;
printf("공차입력 : ");
scanf("%d", &d);
printf("초항입력 : ");
scanf("%d", &a);
An = a;
sum = a;
printf("S1 = %d\n", sum);
if (d > 0 || (a < 0 && d < 0)) {
for (i = 0; i < 20; i++) {
An += d;
sum += An;
printf("S%d = %d\n", i +1 , sum);
}
}
else {
while (An > 1) {
i++;
An += d;
sum += An;
printf("S%d = %d\n", i + 1, sum);
}
}
return 0;
}
마. 코딩 중, for문과 while문 중 어떤 반복문을 어떨때 사용하는 것이 더 유리한지 50자 이내로 정리해보시오.
for문의 경우 반복횟수가 정해져 있을 때 사용하면 유리하고, while문의 경우 반복횟수가 정해져 있지 않은 대신 반복을 제한하는 한계조건이 정해져 있을 때 사용하면 유리하다.
2. Do while문의 사용법은
Do{
조건식이 참이거나 첫 실행일때 실행할 문장
}while( 조건식 )
과 같다. 이를 암기하시오. 또한 아래 문제를 해결하시오. (1시간 소요)
가. Do While문 바깥에 char password = 'a' 를 주시오. char input=0을 주시오.
char password = 'a';
char input = 0;
나. Do While문 안쪽에서 input를 scanf하시오.
다. input의 값이 password가 아니면 '나'를 반복하고 "입력한 값은 ~이며 암호가 틀렸습니다"를 출력하고, a 이면 반복문을 종료하도록 하는 적당한 조건식을 작성하시오. do~while문 뒤쪽 바깥에 "a를 입력하였으므로 종료되었습니다"를 출력하시오.
main() {
char password = 'a';
char input = 0, enter=0;
do{
printf("pw : ");
scanf("%c", &input);
scanf("%c", &enter);
if (input != 'a') {
printf("입력한 값은 %c이며 암호가 틀렸습니다.\n", input);
}
}while (input != 'a');
printf("a를 입력하였으므로 종료합니다.");
return 0;
}
라. while문은 언제 끝나게 될지 모를 경우 조건식을 통해 종료조건을 줄 수 있다는데에 의의가 있으며 do~while문은 반드시 한 번 이상은 실행해야 하는경우, 예를들어 패스워드 검증 등에 쓰인다는 데에 의의가 있다. for, while, do while에 대해 언제 어떤 반복문을 사용하는 것이 더 유리한지 100자 이내로 정리해 보시오.
for문의 경우 반복횟수가 정해져 있는 프로그램을 짤 때 유리하다. 반면, while문과 do~while문은 반복횟수는 정해져 있지 않고, 반복을 제한하는 한계조건이 있는 프로그램을 짤 때 유리한데, while문은 조건을 확인하고 반복문을 수행하는데 반해, do~while문은 반복을 수행하고 조건을 확인하는 순서의 차이가 있어, do~while문은 최소 한 번 이상 반복을 실행하므로, 비밀번호 등을 검증할 때 유리하다.
# 심화과제 제출 양식( 안해도 됨 )
1. 원주율을 계산하시오.
가. 1,3,5,7,9.... 가 나오는 수열을 만드시오
나. math.h를 include하고, '가'를 이용하여 1,-3,5,-7,9... 가 나오는 수열을 만드시오. (-1)을 거듭제곱하면 얻을 수 있음. pow와 for을 이용하시오.
다. '나'를 이용하여 1 - 1/3 + 1/5 - 1/7 + 1/9 가 나오는 수열을 for로 만드시오. 1/나 를 하면 얻을 수 있음.
라. 아래 공식중 위의 것을 이용하여 PI/4를 계산하시오. while을 이용하시오.
마. 계산된 PI/4 값에 4를 곱하여 PI계산값을 구하시오.
main() {
float a = 1,b=1, i=0, c=1, d;
while (i<1000) {
a += 2;
b = a * pow(-1, i+1);
c += 1 / b;
i++;
}
printf("π/4 = %lf", 4*c);
}
바. 3.14와 비교하여 계산PI값과의 차이가 0.01 이하가 되는 때(반복횟수)를 구하고 while문을 탈출하도록 하시오. 한편, PI와 반복횟수를 출력하시오.
main() {
float a = 1,b=1, i=0, c=1, d=0;
while (fabs(3.14-4*c) > 0.01) {
a += 2;
b = a * pow(-1, i+1);
c += 1 / b;
i++;
}
printf("π/4 = %lf\n", 4*c);
printf("반복횟수 = %lf", i);
}
아. math.h를 include하고, 1제곱, 2제곱, 3제곱.. 가 나오는 수열을 pow와 for로 만드시오.
자. '아'를 이용하여 1/1제곱, 1/3제곱, 1/5제곱.. 가 나오는 수열을 만드시오.
차. '자'를 이용하여 1/1제곱 + 1/3제곱 + 1/5제곱.. 가 나오는 수열을 만드시오.
카. '라'의 공식 중 아래의 것을 이용하여 PI제곱/6 값을 계산하시오. while을 이용하시오.
타. math.h를 include하고, 계산된 PI제곱/6값에, 6을 곱하고 sqrt 하여 계산된 PI값을 구하시오.
파. 3.14와 비교하여 계산PI값과의 차이가 0.01 이하가 되는 때(반복횟수)를 구하고 while문을 탈출하도록 하시오. 한편, PI와 반복횟수를 출력하시오.
하. '바'에서 계산한 라이프니츠 공식과, '파'에서 구한 오일러 공식의 수렴성을 비교하시오.
2. 369 게임을 만드시오. (범위 : 99까지)
가. 1~99까지의 수의 십의자리를 읽어주는 프로그램을 만드시오.
x번째 수에 대해, x를 10으로 나눈 몫 n이 십의 자리이다.
n=1이면 '십', n=2이면 '이십', n=3이면 '삼십'....과 같이 십의 자리를 읽어주도록 만드시오.
나. 1~99까지의 수의 일의자리 m를 읽어주는 프로그램을 만드시오. 나머지 연산자를 이용하시오.
m=1이면 '일' m=2이면 '이', m=3이면 '삼'.... 과 같이 일의 자리를 읽어주도록 만드시오.
다. 어떤수의 십의 자리가 3또는 6또는 9인 경우, 숫자를 읽지 말고 '짝' 을 출력하도록 만드시오. '가'를 재사용하여 만드시오. if else를 이용하면 됨.
라. 어떤수의 일의 자리가 3또는 6또는 9인 경우, 숫자를 읽지 말고 '짝' 을 출력하도록 만드시오. '나'를 재사용하여 만드시오. if else를 이용하면 됨.
마. '다~라' 에서, 출력문이 '짝일' '짝이' '짝사' ... '십짝' '이십짝' '사십짝' ... 처럼 나오지 않기 위해 예외처리를 하시오. if ~ elseif ~ else를 이용하면 됨.
바. 1~99에 대해 369 게임의 결과를 모두 출력하시오. for, while, do while 중 본인이 생각하기에 가장 간결한 코드가 되도록 반복문의 종류를 골라 작성하시오.
사. 33,36,39, 63,66.... 등에 대해 '짝짝' 이 출력되는지 확인하시오.
'금융공학 퀀트 프로그래밍 과정' 카테고리의 다른 글
투자노트 금융공학 퀀트 프로그래밍 과정 8주차 (0) 2020.05.10 투자노트 금융공학 퀀트 프로그래밍 과정 6주차 (0) 2020.04.26 투자노트 금융공학 퀀트 프로그래밍 과정 5주차 (0) 2020.04.19 투자노트 금융공학 퀀트 프로그래밍 과정 4주차 과제 (0) 2020.04.12 투자노트 금융공학 퀀트 프로그래밍 3주차 과제 (0) 2020.04.05