-
투자노트 금융공학 퀀트 프로그래밍 과정 6주차금융공학 퀀트 프로그래밍 과정 2020. 4. 26. 22:49
# 제출안내
1. 방법 : 본인 블로그에 작성 후 본 게시판에 링크를 업로드
또는 본 게시판에 작성. 제목은 '투자노트 금융공학 퀀트 프로그래밍 과정 x주차과제' 등으로 작성
(※ 본 게시판에 작성한 내용은 주기적으로 삭제 및 정리되오니 강의 내용을 가지고
있으시려면 본인 블로그에 작성하시오)
2. 양 : 최종과제 스크린샷 1장 이상 첨부. 스크린샷을 반드시 첨부하시오.
3. 기한 : 매주 일요일 오후 12시 전까지
# 기본과제 및 제출 양식
1. for의 사용방법은
for(초기값;종료조건;증감값)
{
반복할 내용
}
과 같다. 이를 암기하시오. 또한 아래 문항을 해결하시오. (0.5시간 소요)
가. int start를 선언하고 1을 주시오.
나. int end를 선언하고 10을 주시오.
다. for문의 초기값에 int i=start를 주시오.
라. for문의 종료조건에 i<=end를 주시오.
마. for문의 증감값은 i++를 주시오.
바. 가~마를 이용하여, 1부터 10까지 출력되게 하시오. '반복할 내용'에 printf를 이용하여 구현하면 됨.
main() {
int start = 1;
int end = 10;
for (int i = start; i <= end; i++) {
printf("%d\t", i);
}
return 0;
}
2. for를 이용하여 숫자들의 합을 구하는 프로그램을 구현하시오. (1시간 소요)
가. int sum을 for문 이전에 선언하고 0을 주시오.
나. '1.바'를 이용하여 sum에 1부터 10까지의 합을 구하시오. 이를 printf 하시오. (힌트 : sum = sum+i 처럼 하면 됨.) 참고자료 : https://wikidocs.net/11368
main() {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum = sum + i;
}
printf("sum=%d", sum);
return 0;
}
다. '1.가', '1.나'를 개조하여, 합을 구할 시작숫자와 끝 숫자를 scanf하시오. 시작숫자와 끝 숫자 사이에 있는 모든 값의 합을 구하시오. 이를 printf 하시오.
main() {
int sum = 0;
int start = 0, end = 0;
printf("start : ");
scanf("%d", &start);
printf("end : ");
scanf("%d", &end);
for (int i = start; i <= end; i++) {
sum = sum + i;
}
printf("sum=%d", sum);
return 0;
}
3. continue의 사용방법은 다음과 같다.
for(초기값;종료조건;증감값)
{
if(반복문을 띄워넘을 조건)
{
continue;
}
}
이를 암기하시오. 또한 아래 문항을 해결하시오. https://wikidocs.net/11613를 참조하시오. (1.5시간 소요)
가. int i=1 ~ 9 까지 나오도록 for 문을 만드시오.
나. int j=1 ~ 9 까지 나오도록 '가'에서 만든 for문 안에, for문을 하나 더 만드시오.
다. 가,나를 이용하여 i*j를 만들고 구구단을 출력하도록 해 보시오
main() {
int i = 0, j = 0;
for ( i = 1; i <= 9; i++) {
for ( j = 1; j <= 9; j++) {
printf("%d * %d = %d\t", i, j, i * j);
}
}
return 0;
}
라. '다'에서 구구단 3단이 출력되지 않도록 continue를 사용해 보시오.
main() {
int i = 0, j = 0;
for ( i = 1; i <= 9; i++) {
for ( j = 1; j <= 9; j++) {
if (i == 3) {
continue;
}
printf("%d * %d = %d\t", i, j, i * j);
}
}
return 0;
}
마. 논리연산자 &&,||,! 에 대해 조사하시오. 이를 이용하여 구구단 3,5,7단이 출력되지 않도록 해보시오.
논리연산자란 AND, OR, NOT을 표현하는 연산자이다.A && B : A와 B가 모두 참이면 연산결과로 참을 반환(AND)
A || B : A와 B 둘 중 하나라도 참이면 연산결과로 참을 반환(OR)
! A : A가 참이면 거짓, A가 거짓이면 참을 반환(NOT)
main() {
int i = 0, j = 0;
for ( i = 1; i <= 9; i++) {
for ( j = 1; j <= 9; j++) {
if (i == 3 || i==5 || i==7) {
continue;
}
printf("%d * %d = %d\t", i, j, i * j);
}
}
return 0;
}
바. 구구단 4,8단만 출력되도록 continue를 사용해 보시오. (! 연산자를 사용하시오.)
main() {
int i = 0, j = 0;
for ( i = 1; i <= 9; i++) {
for ( j = 1; j <= 9; j++) {
if (!(i==4 || i==8) ) {
continue;
}
printf("%d * %d = %d\t", i, j, i * j);
}
}
return 0;
}
4. break의 사용방법은 다음과 같다.
for(초기값;종료조건;증감값)
{
if(반복문을 종료할 조건)
{
break;
}
}
이를 암기하시오. 또한 아래 문항을 해결하시오. https://wikidocs.net/11613를 참조하시오. (1시간 소요)
가. for문의 종료조건에 숫자1 또는 true를 주어 무한루프를 만드시오.
나. 무한루프 이전의 밖에서 char password=0을 만드시오.
다. 무한루프 안에서 password를 scanf하시오.
라. password의 값이 a가 아니면 '다'를 반복하고 "입력한 값은 ~이며 암호가 틀렸습니다"를 출력하고, a 이면 break를 하여 반복문을 종료하도록 하시오. for문 뒤쪽 바깥에 "a를 입력하였으므로 종료되었습니다"를 출력하시오.
main() {
char password = 0, enter;
for (int i=0 ; i = 1;) {
printf("pw : ");
scanf("%c", &password);
scanf("%c", &enter);
if (password == 'a') {
break;
}
else {
printf("입력한 값은 %c이며, 암호가 틀렸습니다. \n", password);
}
}
printf("%c를 입력하였으므로 종료합니다.", password);
return 0;
}
# 심화과제 제출 양식( 안해도 됨 )
1. 어떤 수의 모든 약수를 출력하는 프로그램을 만드시오. http://tujanote.cafe24.com/bbs/board.php?bo_table=pds2&wr_id=62&sca=C 를 참조하시오.
가. num=10 을 선언하시오. 2~num 까지 i가 출력되도록 하시오. num을 i로 나눈 나머지가 0인지 검사하시오. 이 때, 나머지가 0이면 약수이므로 이를 출력하시오.
main() {
int num = 10;
printf("%d의 약수는 1, ",num);
for (int i = 2; i <= 10; i++) {
if (num % i == 0) {
printf("%d,", i);
}
}
printf("입니다.");
return 0;
}
나. num=2~100까지 증가시키며 각 수의 모든 약수를 찾으시오. 이를 printf 하시오. 예를들어, "~의 약수는 ~,~,~ 입니다." 처럼 출력하시오. (힌트 : 출력문은 '~의 약수는'과 '~,~,~'과 '입니다'로 나뉨. '입니다'는 루프가 끝난 후 삽입하면 됨. '~의 약수는 1,'는 1은 모든수의 약수이므로 항상 삽입하면 됨. )
main() {
for (int num = 2; num <= 100; num++) {
printf("%d의 약수는 1, ", num);
for (int i = 2; i <= num; i++) {
if (num % i == 0) {
printf("%d, ", i);
}
}
printf("입니다.\n");
}
return 0;
2. 소수를 출력하는 프로그램을 만드시오. http://tujanote.cafe24.com/bbs/board.php?bo_table=pds2&wr_id=65&sca=C 를 참조하시오.
가. 특정 숫자가 소수인지 아닌지 판별하시오. 예를들어, '1.가'에서 2~num까지 탐색할 때 단 한번이라도 num을 i로 나눈 나머지가 0이 나오면 소수가 아니다. 따라서, 단 한번이라도 0이 나오면 2~num의 루프를 break 하면 된다.
나. 2~100 까지 숫자 중 모든 소수를 출력하도록 해 보시오. 이를 printf 하시오.
main() {
int num, i, signal=1;
printf("소수입력 : ");
scanf("%d", &num);
for (i = 2; i < num; i++) {
if (num % i == 0) {
signal = 0;
break;
}
}
if (signal == 1) {
printf("소수 " );
}
else {
printf("소수아님 ");
}
return 0;
}
다. '가'에서 2~num 까지 탐색하지말고 2~num/2+1 까지만 탐색하여도 결과가 같음을 보이시오. 한편, 그 이유를 설명하시오.
num의 최대공약수는 num을 2로 나눈 값을 초과할 수 없고, 어떤 수를 공약수로 나눠서 소수를 판별할 때 최대공약수를 초과하는 값은 소수의 판별수가 될 수 없으므로, 2~num/2+1 까지만 탐색하여도 결과가 같다.
3. 점화식 A n+1 = pAn + q를 푸시오.
가. p와 q를 입력받으시오.
나. int A=1 에서 시작하시오.
다. 항번호 n을 입력받으시오.
라. for문을 이용하여 n번까지 A = p*A + q 를 반복하여 푸시오.
main() {
int A = 1;
int p=0, q=0, n=0;
printf("p : ");
scanf("%d", &p);
printf("q : ");
scanf("%d", &q);
printf("n : ");
scanf("%d", &n);
for (int i = 1; i < n; i++) {
A = p * A + q;
}
printf("A : %d",A);
return 0;
}
마. 복합산술연산자에 대해 조사하시오. https://wikidocs.net/11597를 참조하시오.
복합 산술연산자에는 *=, /=, %/, -=가 있다. a += b 등의 형태로 쓰이며, a에 저장된 값을 b만큼 증가시키는 연산식으로 a = a + b를 간략하게 표현한 연산식이다.
바. '라'에서 A *= p, A += q 를 사용하여도 동일한 결과가 나옴을 확인하시오.
'금융공학 퀀트 프로그래밍 과정' 카테고리의 다른 글
투자노트 금융공학 퀀트 프로그래밍 과정 8주차 (0) 2020.05.10 투자노트 금융공학 프로그래밍 과정 7주차 (0) 2020.05.03 투자노트 금융공학 퀀트 프로그래밍 과정 5주차 (0) 2020.04.19 투자노트 금융공학 퀀트 프로그래밍 과정 4주차 과제 (0) 2020.04.12 투자노트 금융공학 퀀트 프로그래밍 3주차 과제 (0) 2020.04.05