* cin.peek()

 

제일 앞 글자 하나만 문자로 가져온다.

 

 

예)

#include <iostream>
using namespace std;

 

int main()
{
 char test;
 cout<<"무엇이든 입력하세요: ";
 test = cin.peek();
 cout << endl << test;
}

 

156 입력 ==> 1 출력

apple 입력 ==> a 출력

 

 

응용)

#include <iostream>
#include <string>
using namespace std;

 

int main()
{
 char test;
 double number;
 string str;


 cout<<"무엇이든 입력하세요: ";
 test = cin.peek();


 if(test>='0' and test <= '9'){
  cin >> number;
  cout << "입력한 숫자는" << number << endl;
 }


 else{
  cin >> str;
  cout << "입력한 단어는" << str << endl;
 }

}

 

3.14 입력 ==> 3.14 출력

apple 입력 ==> apple 출력

 

 

 

* cin.ignore()

 

원하는 것이 나올 때까지 건너뛴다.

'Engineering > C++' 카테고리의 다른 글

[C++] cout.width() 출력할 값의 길이 지정  (1) 2016.05.27
[C++] sqrt (제곱근) 사용하기  (0) 2016.05.27

printf 함수는 %5d, %2f 등으로 출력할 숫자의 자릿수를 지정할 수 있다.

반면 cout은 그 방법이 묘연했는데, 다음과 같은 함수를 사용할 수 있다는 것을 발견.

 

 

cout.width(number)

 

예)

#include <iostream>
using namespace std;

int main()
{
 cout.width(5);
 cout<<1.23578797;
}

 

출력: 1.23579

 

cout.width를 선언한 바로 다음 한 번의 출력에만 적용된다.

* 헤더파일: #include <cmath>

* 형식: std::sqrt(number)

 

* using namespace std; 선언하면, sqrt(number)로 사용 가능

 

* sqrt(152.2756L)과 sqrt(152.2756)의 차이:

 

 

시간에 따라 변하는 현상을 보기 위해서, 

한 페이지에 한 번에 20개 정도의 선을 plot 할 때가 있습니다.


자동으로 시간에 따라 gradation으로 색이 변하게 plot하는 방법을 찾아보던 중

저에게 딱 맞는 방법을 찾았습니다.


가령, 다음과 같이 부터 까지 한번에 plot을 하되,

색이 점차적으로 변하도록 해보겠습니다.






우선 MATLAB 명령 창에 입력하는 코드는 다음과 같습니다. 



>> x = [-30:30];                   : plot할 x의 범위는 -30부터 30까지

>> fx = @(x) -x.^2;              :  정의

>> C=jet;                            : 내장된 색깔 불러오기 (64가지 색)

>> for i = 1:20                     : i = 1부터 20까지

y = i*fx(x);                             : y을 계산하고

CC = C(ceil((i/20)*64),:);           : 64가지 색을 대략 20등분하여 차례로 사용하기 

                                             (ceil을 통해 i/20을 정수로 바꿔주었습니다)

plot(x,y,'Color',CC);                 : color는 방금 계산한 CC가 가리키는 색

hold on; drawnow;                  : plot 유지시키고, loop 돌며 바로바로 plot시키기

end





참고로 jet는 명령창에서 호출하면 다음과 같이 생겼습니다.


>> jet


ans =


         0         0    0.5625

         0         0    0.6250

         0         0    0.6875

         0         0    0.7500

         0         0    0.8125

         0         0    0.8750

         0         0    0.9375

         0         0    1.0000

         0    0.0625    1.0000

         0    0.1250    1.0000

         0    0.1875    1.0000

         0    0.2500    1.0000

         0    0.3125    1.0000

         0    0.3750    1.0000

         0    0.4375    1.0000

         0    0.5000    1.0000

         0    0.5625    1.0000

         0    0.6250    1.0000

         0    0.6875    1.0000

         0    0.7500    1.0000

         0    0.8125    1.0000

         0    0.8750    1.0000

         0    0.9375    1.0000

         0    1.0000    1.0000

    0.0625    1.0000    0.9375

    0.1250    1.0000    0.8750

    0.1875    1.0000    0.8125

    0.2500    1.0000    0.7500

    0.3125    1.0000    0.6875

    0.3750    1.0000    0.6250

    0.4375    1.0000    0.5625

    0.5000    1.0000    0.5000

    0.5625    1.0000    0.4375

    0.6250    1.0000    0.3750

    0.6875    1.0000    0.3125

    0.7500    1.0000    0.2500

    0.8125    1.0000    0.1875

    0.8750    1.0000    0.1250

    0.9375    1.0000    0.0625

    1.0000    1.0000         0

    1.0000    0.9375         0

    1.0000    0.8750         0

    1.0000    0.8125         0

    1.0000    0.7500         0

    1.0000    0.6875         0

    1.0000    0.6250         0

    1.0000    0.5625         0

    1.0000    0.5000         0

    1.0000    0.4375         0

    1.0000    0.3750         0

    1.0000    0.3125         0

    1.0000    0.2500         0

    1.0000    0.1875         0

    1.0000    0.1250         0

    1.0000    0.0625         0

    1.0000         0         0

    0.9375         0         0

    0.8750         0         0

    0.8125         0         0

    0.7500         0         0

    0.6875         0         0

    0.6250         0         0

    0.5625         0         0

    0.5000         0         0


jet의 사이즈를 통해 총 64개의 색이 RGB값으로 저장되어있음을 알 수 있습니다.


>> size(jet)


ans =


    64     3



'Engineering > Matlab' 카테고리의 다른 글

Matlab 내장합수: ceil  (0) 2016.05.24
Matlab: drawnow, 실시간으로 그래프 그리기  (0) 2016.05.09
Mablab: 그래프 편집하기  (1) 2016.05.09

우선 matlab에서 help ceil 을 통해 ceil이 어던 함수인지 살펴보았습니다.



>> help ceil

ceil   Round towards plus infinity.

    ceil(X) rounds the elements of X to the nearest integers

    towards infinity.

 


간단히 말하자면, 올림을 해주는 함수입니다.


ceil(5.3) = 6

ceil(2.9) = 6

ceil(-5.2) = -5

ceil(-0.7) = 0


간혹 유용하게 쓰일 일이 있을 것 같네요.



drawnow




for 루프가 다 돌고 그래프가 그려진다



for i = 1:11

plot ([time(i),time(i)],[kmsd(i),kpsd(i)],'r.-');

hold on;

end






drawnow가 호출되는 시점마다 그래프가 그려진다.



for i = 1:11

plot ([time(i),time(i)],[kmsd(i),kpsd(i)],'r.-');

hold on;

drawnow;

end



● 그래프 이름 지정

title('그래프 이름');

ex) title('Spiraea's lab');



● x축, y축 제목 지정 (labeling)

xlabel('x축 제목');

ylabel('y축 제목');

ex) xlabel('this is x-axis');

ylabel('this is y-axis');



● x축, y축 범위 지정

axis([xmin, xmax, ymin, ymax]); ==> axis([x축 최솟값, x축 최댓값, y축 최솟값, y축 최댓값]);

ex) axis([0,810,0.995,1.025])



● 글자 크기 조정

1) 범례(legend)의 글자 크기: set(legend이름, 'FontSize', 글자크기);

(이것을 사용하기 위해서는 legend 지정을 할 때, legend 이름을 설정해주어야 한다.)

 ex) legend_A = legend('A');

set(legend_A, 'FontSize', 15);


2) 전체 글자 크기 조절: set(gca,'FontSize',글자크기);

ex) set(gca,'FontSize',20);



● 축의 간격 조정

1) x축:

> set(gca,'XTick',[최솟값:간격:최댓값]);

> set(gca,'XTick',[원하는 값 나열]);

ex) set(gca,'XTick',[-5:0.5:7]);

set(gca,'XTick',[0 1 3 8]);

2) y축은 XTick 대신 YTick 사용



● 축의 눈금 변경

1) x축: set(gca,'XTickLabel',눈금 이름);

ex) set(gca, 'XTickLabel', {'h','e','l','l','o'});


2) y축은 XTick 대신 YTick 사용



● 축의 유효 숫자 변경

1) x축의 유효 숫자 변경

ex) set(gca, 'XTickLabel', num2str(get(gca, 'XTick')', '%.3f'));


2) y축의 유효 숫자 변경

ex) set(gca, 'YTickLabel', num2str(get(gca, 'YTick')', '%.3e'));




<참고>

>> num2str : number to string (숫자에서 문자열로 바꿔주는 함수)

num2str(get(gca, 'YTick')', '%.3e') : y축의 숫자를 소수점 3자리 까지의 지수형식의 문자열로 변환.


num2str Convert numbers to a string.


    T = num2str(X) converts the matrix X into a string representation T

    with about 4 digits and an exponent if required.  This is useful for

    labeling plots with the TITLE, XLABEL, YLABEL, and TEXT commands.

 

    T = num2str(X,N) converts the matrix X into a string representation

    with a maximum N digits of precision.  The default number of digits is

    based on the magnitude of the elements of X.

 

    T = num2str(X,FORMAT) uses the format string FORMAT (see SPRINTF for

    details).

 

    Example 1:

        num2str(randn(2,2),3) produces a string matrix such as

 

         1.44    -0.755

        0.325      1.37

 

    Example 2:

        num2str(rand(2,3) * 9999, '%10.5e\n') produces a string matrix

        such as

 

        8.14642e+03

        1.26974e+03

        6.32296e+03

        9.05701e+03

        9.13285e+03

        9.75307e+02








적용




>> plot(x,y);

>> title('random number');

>> xlabel('sequence');

>> ylabel('probability');

>> axis([0 11 -0.1 1.1]);

>> set(gca,'FontSize',12);

>> set(gca,'YTick',[0:0.1:1]);

>> set(gca,'XTickLabel',{'a','b','c','d','e','f'});

>> set(gca, 'YTickLabel', num2str(get(gca, 'YTick')', '%.3e'));




< 배열 포인터와 포인터 배열 - 1>


한번에 모두 다루기엔 많아서 나눠서 포스팅 할 계획입니다. 참고해주세요~


배열 포인터와 포인터 배열 - 1 ; 배열 포인터의 기본적인 개념

배열 포인터와 포인터 배열 - 2 ; 포인터 배열의 기본적인 개념

배열 포인터와 포인터 배열 - 3 ; 배열 포인터, 포인터 배열의 추가 예시, 설명




# 우선 배열포인터와 포인터 배열의현법을 보겠습니다.


- 배열 포인터: int(*p)[5] = a;      >> 5개 묶음 배열의 포인터

- 포인터 배열: int* p[5];             >> 포인터 5개 묶음



도대체 이 두개가 어떻게 다른건지 감이 잘 안오실 수도 있습니다. 





# 포인터의 기본적인 부분부터 다시 되집어보면 이렇습니다.


int형 변수 a1을 가리키는 포인터를 정의하는 방법:  int a1;    int* p = &a1;  


int형 1차원 배열 a2를 가리키는 포인터를 정의하는 방법: int a2[5];    int* p = a2;


(배열명은 주소이기 때문에 배열에 대한 포인터를 정의할 때는 &가 필요없죠!)





# 그렇다면, 아래와 같이 정의된 a3라는 int형 2차원 배열은 포인터를 

  어떻게 정의하면 좋을까요?


int a3[3][5]


1번) int* p = a3;

2번) int(*p)[5] = a3;


각각의 경우에 대해 천천히 따져봅시다.




1번) int* p = a3;   


이 경우에는 p가 int형 포인터가 됩니다. 

그래서 p가 1씩 증가할 때마다 가리키는 주소는 int의 크기만큼 (여기서는 4) 증가합니다.  


p = &a3


p+1 = &a3 + 4


p+2 = &a3 + 8

    


2번)  int(*p)[5] = a3;   


이 경우에는 p가 1씩 증가할 때마다 가리키는 주소는 int의 크기의 5배 만큼 (여기서는 20) 증가합니다. 

[5]로 p가 가리키는 주소가 sizeof(int)*5씩 증가하도록 지정을 해준 것이죠. 


p = &a3


p+1 = &a3 + 20


p+2 = &a3 + 40


이러한 것을 바로 배열 포인터라고 합니다. 

a3라는 2차원 배열에서 a3의 한 원소는 int 5개 만큼의 크기를 가지고 있으니 

포인터도 그에 따라 주소를 가리키라고 컴퓨터에게 알려주는거죠!






# 그렇다면, 아래와 같이 정의된 a3라는 char형 2차원 배열은 포인터를 

  어떻게 정의하면 좋을까요?


int형에 대해서 말고 char형에 대해서도 예시를 볼까요? 이번에도 차근차근 짚어봐요~


char형 변수 b1을 가리키는 포인터를 정의:  char b1;    char* p = &b1;  


char형 1차원 배열 b2를 가리키는 포인터를 정의: char b2[5];    char* p = b2;


(여기서도 마찬가지로 배열명은 주소이기 때문에 배열에 대한 포인터를 정의할 때는 &가 필요없죠!)



char형 2차원 배열 b3를 가리키는 포인터를 정의: char b3[3][10]; 


 char(*p) [10] = b3;  

>> 배열포인터


p = &b3

p+1 = &a3 + 10

p+2 = &a3 + 20





배열 포인터는 2차원 배열에 대해서 포인터가 가리키는 주소를 
사용자가 의도한 대로 지정할 수 있게 하는 역할을 한다고 정리할 수 있겠네요~

추후 내용 수정/추가 가능하니 의견 있으면 남겨주세요!





BAEKJOON ONLINE JUDGE


C언어, Compiler: DeV-C++



<입/출력 받아보기>

3. A-B

문제

A-B를 계산하시오.

입력

첫째 줄에 A와 B가 주어진다. (0< A,B < 10)

출력

첫째 줄에 A-B를 출력한다.



C언어 소스코드




6번 줄: scanf함수와 printf 함수를 이용하기 위한 선언

9번 줄: A, B라는 변수를 int형으로 선언한다.

11번 줄: scanf 함수를 이용하여 정수 A와 B를 입력 받는다. 

12번 줄: printf함수를 이용하여 A-B 값을 정수 형태로 출력한다. 

(%d: 정수형)

14번 줄: 프로그램이 정상적으로 실행되었다면 0을 반환한다.


컴퓨터 쪽에 급 관심이 생기게 되었습니다. 필요에 의한 관심이지만, 오랜만에 전공 외의 분야를 공부하는 것이라 재미있네요. 

C언어에 이어 리눅스를 공부해보기로 했습니다.

가상 머신은 Oracle사의 Virtual Box를 이용했고, linux는 UBUNTU를 설치했습니다.


생각보다 쉽지 않더라고요. 지뢰처럼 터져나오는 예상치 못한 오류들..

저를 당황케하고, 그냥 하지 말까? 라는 마음이 들게 했던 오류와 그 해결법을 공유합니다.


저와 같은 오류가 발생하신 분들께 도움이 되길 바랍니다.



발생한 에러는 크게 두 종류입니다. 


(에러1)


This kernel requires the following features not present on the CPU: 

pae

Unable to boot - please use a kernal appropriate for your CPU.





(해결 방법)


설정 >시스템> 마더보드(M) >부팅순서(B) 설정 확인


저의 경우에는 디스크이미지파일(iso)를 이용해서 실치하려고 했기 떄문에 CD/DVD만 체크하고, 나머지는 해제하였습니다.


우선순위가 더 위에 있으면 정상적으로 작동해야할 것 같은데, 그렇게 해도 오류가 나더라고요..그래서 그냥 사용할 것만 남기고 체크 해제!




저의 경우 iso 파일이 D드라이브에 있었기 때문에 하드 디스크를 선택해야 한다고 생각했었는데, iso파일을 가상 드라이브(CD롬)에 마운트하는 것이기 때문에 CD/DVD로 선택해야 정상 작동 하는 것으로 보입니다.  







(에러 2)


가상 머신 <지정한 이름>의 세션을 열 수 없습니다.

Failed to load VMMR0.r0 (VERR__LDR_MISMATCH_NATIVE).





(해결 방법)


여기서 좌절하며 몇 번을 삭제하고 다시 까는 것을 반복했는데요...생각보다 손쉬운(?) 방법으로 해결했습니다. 

바로, 설정 >시스템 > 프로세서(P) > 확장된 기능: PAE/NX 사용하기(E) 에 체크하는 것입니다!


지금 제가 쓰는 컴퓨터는 64bit인데, 설치하는 UBUNTU는 32bit이기 때문에 발생한 문제였던 것 같습니다. 

저 PAE/NX가 그로 인해 발생하는 메모리 상의 문제를 해결시켜주는가봅니다..(?) 

앞으로 계속 이쪽 분야를 공부하다보면 저게 왜 그런건지 유창하게 설명하게 되지 않을까 싶습니다...

아직은 잘 모르겠어요. 허허


어쨋든 해결해서 기쁩니다!





이렇게 문제를 해결하고, 우분투가 깔립니다. 신나서 단계별로 캡쳐! 


012345678




그런데..이게 끝이 아니었어요! 저를당황하게 했던 다시 시작된 오류메세지...OTL


(오류3) 

 

FATAL: Could not read from the boot medium! System halted.


(해결 방법)

첫 번째 오류랑 비슷해보였어요. 

그래서 하드에 깔린 우분투를 못 읽어서 그러는건가?라고 생각하며 

설정 > 시스템 > 마더보드(M) > 부팅순서 > 하드디스크 체크!


문제 해결되었네요!





이렇게 일단은 우분투를 사용할 수 있게 되어서 기쁩니다!


가상 머신에 설치 이후로 몇번 사용했는데, 아직까지는 다른 문제는 없네요. 

앞으로도 순조롭기를!




+ Recent posts