반응형
Recent Posts
Recent Comments
Link
관리 메뉴

공머씨의 블로그

내가 공부한 옥타브2 17.제어문 다루기 본문

내가 공부한 옥타브(매틀랩)/내가 공부한 옥타브 시리즈2 (공업수학1)

내가 공부한 옥타브2 17.제어문 다루기

공머씨 2020. 4. 11. 11:09
반응형

if와 for의 의미에 대해서는 이미 c언어에서 공부했으므로 잘 알고 있을 것이라고 가정하고 설명합니다.

약간의 문법 차이에 유의하면 됩니다.

 

 

단계별로 쪼개서 기본적인 틀을 만들고 상세한 내용을 추가하는 접근방법을 가지면

쉽게 작성할 수 있습니다.

1번에선 정수값을 입력하는 코드를 작성하면 됩니다.

 

2,3,4번은 n값에 따라서 서로 다른 일을 합니다.

무슨 일을 하는지에 대한 디테일은 빼고 입력된 n값에 따라서 분기하는 모습만 틀을 잡아서 하면 됩니다. 일단 아래와 같이 보고 따라 해 봅니다.

input함수에 대해 설명하면

작은따옴표 안의 메시지를 화면에 비추고 사용자가 입력한 숫자를 변수 n에 저장합니다.

 

disp함수는 

작은따옴표 안의 메시지를 화면에 내보내고, 따옴표 문자와 다른 것을 덧붙이려면 대괄호로 묶습니다.

int2 str(n)이 지정하는 함수를

변수에 들어있는 숫자를 문자열로 바꾸어주는 기능을 하는 함수입니다.

 

%ex12번의 if문 입니다.
n=input('Please input an integer n.'); %정수n값을 입력하도록 요구, 입력값을 변수 n에 저장

if(n>0) %만약 n이 양수이면
  disp(['sum of integres from 1 to'int2str(n)])
  %나중에 2단계에서 이부분 채워넣습니다.
  
else if(n==0) %만약 n이 0이면
  y=0
  
  
else %만약n이 양수도 아니고 0도 아니면(음수이면)
  disp(['sum of odd integers from 1to'int2str(-n)])
  %나중에 3단계에서 이 부분을 채워넣습니다.
  
end

 

 

 

 

 

 

 

 

 

2단계로 넘어가겠습니다.

합의 초기치를 0으로 두고

1부터 n까지 for문을 이용해서 돌게 하면 됩니다.

총합은 그 이전의 합에 돌아오는 i값을 더한 값입니다.

이 값을 y에 집어넣습니다.

c언어 스타일로하면 다섯 줄인데

매트랩에서는 한 줄로 표현할 수 있습니다.

sum(1:n)

1부터 n까지 모든 합을 구하는 함수입니다.

 

 

3단계로 넘어가겠습니다.

mod(k,2)라는 함수는 k를 2로 나눈 나머지를 출력하는 함수입니다.

k가 짝수이면 2로 나눈 나머지가 0이 되니까 

0 곱하기 k는 0 이므로 따라서 짝수는 더하지 않게 됩니다.

 

k가 홀수이면 k를 2로 나눈  나머지가 1이 되므로 

1⨉k를 더하게 됩니다.

1부터 -n까지 반복하면서 홀수만 골라내서 더하는 효과를 갖게 됩니다.

 

매트랩으로는 다음과 같은 스타일로 할 수 있습니다.

y=sum(1:2:m)

1부터 m까지 2의 증분을 갖고 더해라

ex) 1,3,5.... m

 

 

전체코드입니다.

%ex12번의 if문 입니다.
n=input('Enter an integer n:'); %정수n값을 입력하도록 요구, 입력값을 변수 n에 저장
 disp(['20191015ParkGuyBin ex12'])
if(n>0)               %만약 n이 양수이면
  disp(['sum of integres from 1 to',int2str(n)])
  sum=0;               %comand window창에 y값만 나와있다.
  for ii=1:n           %변수ii는 1부터 n까지 1씩 증가한다.
    sum=sum+ii;        %ii씩 더한값을 sum이라는 변수에 저장한다.
  endfor
   y=sum 
   
elseif(n==0)           %만약 n이 0이면
  y=0
  
else                     %만약n이 양수도 아니고 0도 아니면(음수이면)
  disp(['sum of odd integers from 1to',int2str(-n)])
  sum=0;
  for k=1:(-n);           %comand window창에 k가 변하는 과정이 없이 y값만 나와있다.
    sum=sum+mod(k,2)*k;  %comand window창에sum이 변하는 과정이 없이 y값만 나와있다.
  end
  y=sum
  
  
end

 

Matlab스타일로 실행한 전체코드입니다.

clear;clc;close all

n=input('Enter an number')
if n>0
   disp(['sum ofintegers from 1 to',int2str(n)])
   y=sum(1:n);
   y
elseif n<0
   disp(['sum ofintegers from 1 to',int2str(-n)])
   y=sum(1:2:(-n));
   y
else
   y==0;  
   
endif

 

 


while을 사용하여 반복하는 루프에 대해 알아보겠습니다.

위의 예제 13a를 풀어보면서 알아보겠습니다.

 

전체코드입니다.

clear;clc;close all;

%13a에 대한 코드입니다.
while(1)
  n=input('Enter an integer:');
 if(n==0)
    break;
 endif
  disp(['haha!! ','enterde ' int2str(n)])  %입력된 정수값을 출력
endwhile
 disp('Tank you!')

 

만약에 입력된 정수가 0이면break를 실행하게 됩니다.

break는 가장 가까운 반복문을 빠져나오라는 의미입니다.

 

입력된 정수가 0이 아니면if조건을 만족하지 못하기 때문에

while루프를 무한히 반복하게 됩니다.

 

이후에 계속 순차적으로 실행됩니다.

그리고 disp함수안에 있는 내용을 출력합니다.

end로가서 while문까지 빠져나온다음 Thankyou!를 출력합니다.

 


예제 13b는 

 

 

 

 

 

 

 

사용자가 추측한 값을 비교해서 큰지, 작은지. 같은지를 출력하는 게임입니다.

프로그램이 1과 100 사이의 랜덤 정수를 출력하는 코드를 입력하면 되겠습니다.

사용자에게 추측해보라는 메시지를 내보내고 값을 입력받습니다. (사용자는 자신이 추측한 값을 입력합니다.)

6번까지 반복합니다.

중간에 만약 사용자가 입력한 값과 

correct를 출력한 뒤 루프를 빠져나옵니다.

반복하다가 6번을 지나면 루프를 빠져나옵니다. (게임오버)

 

추측을 몇 번 했는지 count변수에 저장합니다.

할 줄 안다면 스스로 작성해보면 되겠습니다.

 

 

그렇지 않으면 다음의 힌트를 참고하시면 되겠습니다.

이 보다 더 짧고 효율적인 코드를 만들 수 있습니다

x=Randi(n)라는 함수는 1부터 n까지 랜덤으로 정수를 생성하는 함수입니다.

생성한 숫자를 x라는 변수에 대입합니다.

 

입력받은 값이 R보다 큰지 같은 지 작은 지 알아내는 코드를 작성합니다.

중간에 빠져나가면 count값이 1과 6 사이가 됩니다.

만약 맞추지 못하고 게임오버가 되었다면 count에 저장된 변수는 7이 되겠습니다.

 

 

 

 

전체코드입니다.

%ex13b 코드입니다.
R=randi(100); 
disp('"I have a number between 1 and 100"')
count=1;
while count<=6
N=input('Guess my number:');

 if (N>R)
   disp('"Too big!"')
 
 elseif(N<R)
   disp('"Too small!"')
   
 else
  disp('"Correct!"')
 break
 end
count=count+1;
end

if count==7
 disp("no award")
 disp('incorrect guess in 6 atttempt No prize');
 else 
   prize=20232023;
   disp(['Count guess on attampt' int2str(count) '!']);
   disp(['Your prinze is ' int2str(prize) 'dollars']); 
 end

 

 

반응형
Comments