반응형

www.acmicpc.net/problem/2164

 

2164번: 카드2

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가

www.acmicpc.net

 

 

N=4일 경우 

 

1 2 3 4

 

규칙 : 아래 반복 

맨 위 카드 버림 --> 맨 위 카드를 맨 아래로 이동 --> 맨 위카드 버림 --> 맨 위카드를 맨 아래로 이동 

 

1 2 3 4

맨 위 카드 버림

2 3 4

맨 위 카드 맨 아래 

3 4 2

맨 위 카드 버림

4 2

맨 위 카드 맨 아래로

2 4

맨 위 카드 버림

4

 

#include <iostream>
#include <queue>
#include <cstring>

using namespace std;
#define MAX_N 100
queue<int> q;


int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);


	int i,n,tmp;
	cin >> n;



	for(i =1; i <= n; i++ ){
		q.push(i);
	}

	while( 1 ){
		if( q.size() ==1)
			break;

		q.pop();
		tmp = q.front();	
		q.pop();
		q.push(tmp);
	}

	cout << q.front();
		
	return 0;
}
반응형

'Algorithm > queue,dequeu' 카테고리의 다른 글

[c++]dequeue (double-ended queue)  (0) 2021.04.12
[c++]baekjoon 10866  (0) 2021.04.11
[c++]baekjoon 1021  (0) 2021.04.11
[c++]baekjoon 11866  (0) 2021.04.11
[c++]baekjoon 18258  (0) 2021.04.11
반응형

www.acmicpc.net/problem/18258

 

18258번: 큐 2

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

queue사용 기본 동작 확인하는 문제이다. 

 

아래와 같이 풀면 되는데, c++인데 printf,scanf는 c용 함수를 쓰는게 좀 아닌 것 같아서 다시 수정을 해 봤습니다.

/*baekjoon 18258 queue*/
#include <iostream>
#include <queue>
#include <cstring>

using namespace std;
#define MAX_N 100

int main()
{

	int n,i,dt;
	char str[10];

	cin >> n;

	queue<int> q;


	for(i =0; i < n; i++ ){


			scanf("%s", str);

		if( !strcmp(str, "push") ){
			scanf("%d", &dt);
			q.push(dt);
		}else if( !strcmp(str, "front") ){
			if(!q.empty()){
				printf( "%d\n", q.front() );
			} else{
				printf("-1\n");
			}
		}else if(  !strcmp(str, "back") ){
			if(!q.empty()){
				printf( "%d\n", q.back() );
			} else{
				printf("-1\n");
			}
		}else if( !strcmp(str, "size") ){
			printf( "%ld\n", q.size() );
		}else if( !strcmp(str, "empty") ){
			printf( "%d\n", q.empty() );
		}else if( !strcmp(str, "pop") ){
			if(!q.empty()){
				printf( "%d\n", q.front() );
				q.pop();
			} else{
				printf("-1\n");
			}
		}
	}

	return 0;
}

 

printf--> cout, scanf-->cin으로 변경해서 다시 제출해 봤습니다.  시간 초과 발생해서 googling 해 보니 아래를 추가해야 한다고 합니다.

	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

<시간 초과 발생>

/*baekjoon 18258 queue*/
#include <iostream>
#include <queue>
#include <cstring>

using namespace std;
#define MAX_N 100

int main()
{
	int n,i,dt;
	char str[10];
	cin >> n;

	queue<int> q;


	for(i =0; i < n; i++ ){

		cin >> str;

		if( !strcmp(str, "push") ){
			cin >> dt;
			q.push(dt);
		}else if( !strcmp(str, "front") ){
			if(!q.empty() ){
				cout << q.front() << '\n' ;
			}else{
				cout << "-1" << '\n';
			}
		}else if( !strcmp(str, "back") ){
			if(!q.empty() ){
				cout << q.back() <<  '\n';
			}else{
				cout << "-1" << '\n';
			}
		}else if( !strcmp(str, "size") ){
			cout << q.size() << '\n';
		}else if( !strcmp(str, "empty") ){
			cout << q.empty() << '\n';
		}else if( !strcmp(str, "pop") ){
			if(!q.empty() ){
				cout << q.front() << '\n';
				q.pop();
			} else {
				cout << "-1" << '\n';
			}
		}
	}

	return 0;
}

추가하고 다시 시도 했을 때 정답이라고 뜨네요. 왜 그러지는 좀 더 확인 해 봐야겠습니다.

 

/*baekjoon 18258 queue*/
#include <iostream>
#include <queue>
#include <cstring>

using namespace std;
#define MAX_N 100

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);


	int n,i,dt;
	char str[10];
	cin >> n;

	queue<int> q;


	for(i =0; i < n; i++ ){

		cin >> str;

		if( !strcmp(str, "push") ){
			cin >> dt;
			q.push(dt);
		}else if( !strcmp(str, "front") ){
			if(!q.empty() ){
				cout << q.front() << '\n' ;
			}else{
				cout << "-1" << '\n';
			}
		}else if( !strcmp(str, "back") ){
			if(!q.empty() ){
				cout << q.back() <<  '\n';
			}else{
				cout << "-1" << '\n';
			}
		}else if( !strcmp(str, "size") ){
			cout << q.size() << '\n';
		}else if( !strcmp(str, "empty") ){
			cout << q.empty() << '\n';
		}else if( !strcmp(str, "pop") ){
			if(!q.empty() ){
				cout << q.front() << '\n';
				q.pop();
			} else {
				cout << "-1" << '\n';
			}
		}
	}

	return 0;
}
반응형

'Algorithm > queue,dequeu' 카테고리의 다른 글

[c++]dequeue (double-ended queue)  (0) 2021.04.12
[c++]baekjoon 10866  (0) 2021.04.11
[c++]baekjoon 1021  (0) 2021.04.11
[c++]baekjoon 11866  (0) 2021.04.11
[c++]baekjoon 2164  (0) 2021.04.11
반응형

www.acmicpc.net/problem/1874

 

1874번: 스택 수열

1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.

www.acmicpc.net

이 문제는 여러 우여곡절 끝에 답을 찾은 문제 입니다.

for loop에 39,43 라인에 원래 cout을 사용했더니 시간초과로 정답이 안되는 문제가 있어서 여기저기 찾아보니

endl이 시간을 많이 소모해서 문제가 된다고 하여 printf로 수정했습니다. 

endl을 '\n'으로 바꾸셔도 되고 아예 printf문으로 다 바꿔도 됩니다. 

cout이 편리해서 잘 사용하고 있었는데, 이런 문제가 있네요. 참고로 하시기 바랍니다.  

아래 코드도 아직 틀렸다고 하는데 왜 틀렸는지 잘 모르겠네요. 혹시 아시는 분은 아래 답변 좀 부탁드립니다. 

 

cout << dtout[i] << endl;

cout << "NO" << endl;

 

  1 /*baekjoon 1874*/                                                                         
  2 #define _CRT_SECURE_NO_WARNINGS
  3 #include <iostream>
  4 #include <stack>
  5 #include <string.h>
  6 
  7 using namespace std;
  8 #define MAX 100001
  9 int dt[MAX];
 10 char dtout[MAX];
 11 stack<int> s;
 12 
 13 
 14 int main()
 15 {
 16     int i,j=0,k=0, n;
 17     int size;
 18 
 19     /* input size*/
 20     cin >> n;
 21 
 22     /* input data*/
 23     for(i= 0; i<n; i++ ){
 24         cin >> dt[i];
 25     }
 26 
 27     for( i=1; i <= n; i++){
 28         s.push(i);
 29         dtout[k++] = '+';
 30         while( !s.empty() && s.top() == dt[j] ){
 31             s.pop();
 32             dtout[k++] = '-';
 33             j++;
 34         }
 35     }
 36 
 37     size = strlen( dtout );
 38     if( !s.empty() ) {
 39         printf("NO");
 40         return 0;
 41     }else{
 42         for( i = 0; i< size; i++) {
 43             printf("%c\n", dtout[i]);
 44         }
 45     }
 46 
 47     return 0;
 48 }
반응형

'Algorithm' 카테고리의 다른 글

[c++]baekjoon 17298  (0) 2021.04.05
[c++]baekjoon 9012  (0) 2021.04.04
[c++]baekjoon 10773  (0) 2021.04.04
[c++]baekjoon 10828  (0) 2021.04.04
[c++]baekjoon 4949  (0) 2021.04.03
반응형

프로그램 실행 시 아래 메시지 찍고 동작 안할 때 디버깅 방법 
세그멘테이션 오류 (코어 덤프됨)


l  코어파일 분석하기

 
코어파일은 충돌할 당시 프로세스의 메모리 이미지를 덤프한 것이다. 코어파일을 gdb와 함께 사용하여 프로그램의 상태를 조사하고 실패 원인을 규명할 수 있다. 어떤 예기치 않은 일이 발생하여 비정상적인 종료가 발생할 때 운영체계는 디스크에 코어 파일을 남긴다.메모리에 관한 문제는 Checker 패키지를 사용하여 예방할 수 있다. 하지만 메모리 fault를 일으키는 경우에는 충돌하면서 파일을 덤프한다. 코어파일은 일반적으로 프로세스를 실행시킨 현재 작업 디렉토리에 생성되지만 프로그램 내에서 작업 디렉토리를 바꾸는 경우도 있다.

보통 리눅스는 부팅시에 코어 파일을 만들지 않도록 세팅되어 있다. 코어 파일 생성을 가능케 하려고 한다면 그것을 다시 가능케 하는 셀의 내장 명령을 사용한다.

만약C쉘 호환 쉘(tcsh)을 쓰고 있다면 다음과 같이 명령을 내린다.

%  limit core unlimited

만약 본쉘류( sh , bash , zsh , pdksh )를 사용하고 있다면,

$  ulimit –c unlimited

와 같은 명령을 내린다.

코어파일을 함께 사용하기 위해선 다음과 같이 한다.

% gdb program core

 
참고로 ulimte -a 를 하면 현재 설정값을 볼 수 있다. core file size가 설정전 default값은 '0'이다.

core dump로 저장을 하려면 이 값을 unlimited로 변경해야 저장이 된다.

변경 방법은 아래와 같이 하면되고 변경 후의 값은 ulimit -a로 확인 가능하다. 

ulimit -c unlimited

$ulimit -c 0 $ulimit -c unlimited
$ulimit -a
core file size          (blocks, -c) 0

data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 79408
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 95
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 79408
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
$ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 79408
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 95
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 79408
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
$ulimit -c
$0
$ulimit -c
$unlimited

 

반응형

'gdb' 카테고리의 다른 글

[GDB] display array(display *input@i)  (0) 2021.03.29
GDB commands  (0) 2021.03.28
GDB help  (0) 2021.03.28
GDB란 ?  (0) 2021.03.28
반응형

www.acmicpc.net/problem/17298

www.youtube.com/watch?v=XwG-QcBQ9-I&t=716s

 

아래 문제를 브루터포스로 구현해서 제출을 하니 시간초과가 나와서 새로운 방법을 찾다가 우연히 유튜브에서 정답을 확인해서 아래와 같이 정리 했습니다.

 

psudo code

for(i =0; i <N; i++){
    while( stk.size() >0 && stk.top() < dt[i] ){
    
        오큰수 찾음;
        저장;
       }
   }
  1 #include <iostream>                                                                                                                                                                
  2 #include <stack>
  3 
  4 using namespace std;
  5 
  6 #define MAX 1000000
  7 int dt[MAX];    // input data
  8 int rlt[MAX];   // dt[i]의 오큰수는 rlt[i]에 저장 
  9 
 10 int main()
 11 {
 12     int n=0,i,j=0;
 13     int min =0;
 14 
 15     cin >> n ;
 16 
 17     stack<int> stkNotFound;     //오큰수를 아직 찾지 못한 수들 
 18     stack<int> stkNotFoundIdx;  //오큰수를 아직 찾지 못한 수들의 인덱스 
 19 
 20     for(int i =0; i < n; i++){
 21         cin >> dt[i];
 22     }
 23 
 24     for(int i =0; i < n; i++){
 25         int idx = i;
 26         cout << "stkNotFound.size : " << stkNotFound.size() << endl;
 27         //cout << "stkNotFound.top: " << stkNotFound.top() << endl;
 28     
 29         while (( stkNotFound.size() > 0 ) && ( stkNotFound.top() < dt[idx] )) {
 30             rlt[stkNotFoundIdx.top()] = dt[idx];
 31             stkNotFound.pop();
 32             stkNotFoundIdx.pop();
 33         }
 34 
 35         stkNotFound.push(dt[idx]);
 36         stkNotFoundIdx.push(idx);
 37             
 38     }
 39 
 40     while(stkNotFoundIdx.size() > 0 ){
 41         rlt[stkNotFoundIdx.top()] = -1;
 42         stkNotFoundIdx.pop();
 43     }
 44 
 45 
 46     //마지막 수의 오큰수는 항상 -1
 47     rlt[n-1] = -1;
 48 
 49 
 50     for( int i =0; i < n; i++) {
 51         cout << rlt[i] << ' ';
 52     }
 53 
 54     return 0;
 55 }                         
반응형

'Algorithm' 카테고리의 다른 글

[c++]baekjoon 1874  (0) 2021.04.10
[c++]baekjoon 9012  (0) 2021.04.04
[c++]baekjoon 10773  (0) 2021.04.04
[c++]baekjoon 10828  (0) 2021.04.04
[c++]baekjoon 4949  (0) 2021.04.03
반응형

www.acmicpc.net/problem/9012

아래 코드로 돌렸을 때 segmentation fault 발생 해서 gdb로 디버깅 한 결과입니다.

일단 은 어느 코드에서 문제가 발생한 정도로만 확인이 가능한데, 이정도만 추적을 해도 코드 수정하는데 많은 도움이 된다고 보입니다. 

 

  1 #include <iostream>                                                                                                                                                                                    
  2 #include <stack>
  3 #include <string.h>
  4 
  5 using namespace std;
  6 
  7 int main()
  8 {
  9     int n=0,i,j, check=0, count;
 10     char input[51];
 11 
 12     stack<char> s;
 13     cin >> count;
 14 
 15     for(j=0; j<count; j++)
 16     {
 17         check = 0;
 18         cin >> input;
 19         n = strlen(input);
 20 
 21         for(i=0; i<n; i++)
 22         {
 23             if ( input[i] == '(')
 24                 s.push(input[i]);
 25             else if(i == 0 && input[i] == ')')
 26             {
 27                 s.push(input[i]);
 28                 break;
 29             }
 30             else if( i !=0 && input[i]  == ')' )
 31             {
 32                 if( s.top() == '(' )
 33                     s.pop();
 34                 else
 35                     s.push(input[i]);
 36             }
 37         }   
 38         
 39         if( s.empty() )
 40             cout << "YES" << endl;
 41         else
 42             cout << "NO" << endl;
 43             
 44     }
 45     return 0;
 46 }   

 

#gdb ./a.out

gdb b main

gdb r

 

input값은 각각 count와 input 입력시 넣어 주시면 됩니다. 

1 <-- count

(())()) <-- input

 

 

step을 해보면서 segmentation fault발생한 지점이 32 line s.top()에서 문제가 발생한 것을 알았으며

s.top()이 stack에  아무것도 없을 경우 값이 이상한 값을 return하므로 조건문을 s.empty()인지를 추가해 주면 해결 될 것으로 판단해서 코드 수정을 해 주시면 될 것 같습니다.

Breakpoint 1, main () at 9012.cpp:8
8	{
(gdb) n
9		int n=0,i,j, check=0, count;
(gdb) n
12	    stack<char> s;
(gdb) n
13	    cin >> count;
(gdb) n
1
15	    for(j=0; j<count; j++)
(gdb) n
17	        check = 0;
(gdb) n
18	        cin >> input;
(gdb) n
(())())
19	        n = strlen(input);
(gdb) n
21	        for(i=0; i<n; i++)
(gdb) disp n
1: n = 7
(gdb) n
23	            if ( input[i] == '(')
1: n = 7
(gdb) n
24	                s.push(input[i]);
1: n = 7
(gdb) n
21	        for(i=0; i<n; i++)
1: n = 7
(gdb) n
23	            if ( input[i] == '(')
1: n = 7
(gdb) disp *input@i
2: *input@i = "("
(gdb) n
24	                s.push(input[i]);
1: n = 7
2: *input@i = "("
(gdb) disp i
3: i = 1
(gdb) n
21	        for(i=0; i<n; i++)
1: n = 7
2: *input@i = "("
3: i = 1
(gdb) n
23	            if ( input[i] == '(')
1: n = 7
2: *input@i = "(("
3: i = 2
(gdb) n
25	            else if(i == 0 && input[i] == ')')
1: n = 7
2: *input@i = "(("
3: i = 2
(gdb) n
30	            else if( i !=0 && input[i]  == ')' )
1: n = 7
2: *input@i = "(("
3: i = 2
(gdb) n
32	                if( s.top() == '(' )
1: n = 7
2: *input@i = "(("
3: i = 2
(gdb) n
33	                    s.pop();
1: n = 7
2: *input@i = "(("
3: i = 2
(gdb) n
21	        for(i=0; i<n; i++)
1: n = 7
2: *input@i = "(("
3: i = 2
(gdb) n
23	            if ( input[i] == '(')
1: n = 7
2: *input@i = "(()"
3: i = 3
(gdb) n
25	            else if(i == 0 && input[i] == ')')
1: n = 7
2: *input@i = "(()"
3: i = 3
(gdb) n
30	            else if( i !=0 && input[i]  == ')' )
1: n = 7
2: *input@i = "(()"
3: i = 3
(gdb) n
32	                if( s.top() == '(' )
1: n = 7
2: *input@i = "(()"
3: i = 3
(gdb) n
33	                    s.pop();
1: n = 7
2: *input@i = "(()"
3: i = 3
(gdb) n
21	        for(i=0; i<n; i++)
1: n = 7
2: *input@i = "(()"
3: i = 3
(gdb) n
23	            if ( input[i] == '(')
1: n = 7
2: *input@i = "(())"
3: i = 4
(gdb) n
24	                s.push(input[i]);
1: n = 7
2: *input@i = "(())"
3: i = 4
(gdb) n
21	        for(i=0; i<n; i++)
1: n = 7
2: *input@i = "(())"
3: i = 4
(gdb) n
23	            if ( input[i] == '(')
1: n = 7
2: *input@i = "(())("
3: i = 5
(gdb) n
25	            else if(i == 0 && input[i] == ')')
1: n = 7
2: *input@i = "(())("
3: i = 5
(gdb) n
30	            else if( i !=0 && input[i]  == ')' )
1: n = 7
2: *input@i = "(())("
3: i = 5
(gdb) n
32	                if( s.top() == '(' )
1: n = 7
2: *input@i = "(())("
3: i = 5
(gdb) n
33	                    s.pop();
1: n = 7
2: *input@i = "(())("
3: i = 5
(gdb) n
21	        for(i=0; i<n; i++)
1: n = 7
2: *input@i = "(())("
3: i = 5
(gdb) n
23	            if ( input[i] == '(')
1: n = 7
2: *input@i = "(())()"
3: i = 6
(gdb) n
25	            else if(i == 0 && input[i] == ')')
1: n = 7
2: *input@i = "(())()"
3: i = 6
(gdb) n
30	            else if( i !=0 && input[i]  == ')' )
1: n = 7
2: *input@i = "(())()"
3: i = 6
(gdb) n
32	                if( s.top() == '(' )
1: n = 7
2: *input@i = "(())()"
3: i = 6
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
main () at 9012.cpp:32
32	                if( s.top() == '(' )
1: n = 7
2: *input@i = "(())()"
3: i = 6
(gdb) 

 

문제점 수정한 코드는 아래와 같으면 결과가 잘 출력되는 걸 확인 했습니다.

  1 #include <iostream>
  2 #include <stack>
  3 #include <string.h>
  4 
  5 using namespace std;
  6 
  7 int main()
  8 {
  9     int n=0,i,j, check=0, count;
 10     char input[51];
 11 
 12     stack<char> s;
 13     cin >> count;
 14 
 15     for(j=0; j<count; j++){
 16         check = 0;
 17         cin >> input;
 18         n = strlen(input);
 19 
 20         for(i=0; i<n; i++){
 21             if ( input[i] == '(')
 22                 s.push(input[i]);
 23             else if(i == 0 && input[i] == ')'){
 24                 s.push(input[i]);
 25                 break;
 26             }
 27             else if( i !=0 && input[i]  == ')' ){
 28                 if( s.empty() ){
 29                     s.push(input[i]);
 30                 }
 31                 else{
 32                     if( s.top() == '(' )
 33                         s.pop();
 34                     else
 35                         s.push(input[i]);
 36                 }
 37             }
 38         }                          
 39 
 40         if( s.empty() )
 41             cout << "YES" << endl;
 42         else
 43             cout << "NO" << endl;
 44 
 45         while( !s.empty() )
 46             s.pop();
 47     }
 48     return 0;
 49 }                              
반응형

'Algorithm' 카테고리의 다른 글

[c++]baekjoon 1874  (0) 2021.04.10
[c++]baekjoon 17298  (0) 2021.04.05
[c++]baekjoon 10773  (0) 2021.04.04
[c++]baekjoon 10828  (0) 2021.04.04
[c++]baekjoon 4949  (0) 2021.04.03
반응형
#include <iostream>
#include <stack>

using namespace std;

int main()
{
		int count,val,i,total=0;

        stack<int> s;
		//scanf("%d", &count);
        cin >> count;

		while(count>0)
		{
			//scanf("%d", &val);
            cin >> val;

			if( val > 0)
				s.push(val);
			else if (val == 0)
				s.pop();

			count--;
		
		}

		while(!s.empty())
		{
			total += s.top();
            s.pop();
		}

        cout << total << endl;

		return 0;
}
반응형

'Algorithm' 카테고리의 다른 글

[c++]baekjoon 17298  (0) 2021.04.05
[c++]baekjoon 9012  (0) 2021.04.04
[c++]baekjoon 10828  (0) 2021.04.04
[c++]baekjoon 4949  (0) 2021.04.03
[c++]stack 사용  (0) 2021.04.02
반응형

c++ stack함수들을 이용해서 풀어 본 문제입니다.

여기서 구현 시 주의 할 점 몇가지를 정리해 봤습니다.

pop() return값이 void형태이어서 출력값이 없어서 top()으로 먼저 출력 후 pop()을 호출해야 합니다.

그리고 top()호출시 stack이 비워있을 경우 호출 시 segment fault발생하므로 stack이 비워있다면 -1을 출력하도록 예외 사항을 추가해 줘야 합니다. 

 

#include <iostream>
#include <stack>
#include <string.h>

using namespace std;


int main()
{
	char input[10];
	int val,count;
	stack<int> s;

	// input number
	cin >> count;

	for( int i = 0; i < count; i++ )
	{
		cin >> input;

		if ( !strcmp("push", input) ){
			cin >> val;
			s.push(val);
		}
		else if( !strcmp(input, "pop") ){
			if( !s.empty() )
			{
				cout << s.top() << endl;
			 	s.pop();
			}else{
				cout << "-1" << endl;
			}
		}
		else if( !strcmp(input, "size") ){
			cout << s.size() << endl;
		}
		else if( !strcmp(input, "empty") ){
			cout << s.empty() << endl;
		}
		else if( !strcmp(input, "top") ){
			if( !s.empty() )
				cout << s.top() << endl;
			else
				cout << "-1" << endl;
		}

	}

	return 0;
}
반응형

'Algorithm' 카테고리의 다른 글

[c++]baekjoon 9012  (0) 2021.04.04
[c++]baekjoon 10773  (0) 2021.04.04
[c++]baekjoon 4949  (0) 2021.04.03
[c++]stack 사용  (0) 2021.04.02
thread  (0) 2019.03.01
반응형

여기서 주의 할 점...

stack에 push된 게 없는 경우 top()이 호출되면 segmentation fault가 발생한다. 

그래서  if( !s.empty() )조건을 주고 s.top()함수를 호출하도록 추가했다. 여기서 많이 해맸는데, 좀더 좋은 방법이 있으신분은 댓글로 답변 부탁드립니다.

 

#include <iostream>
#include <stack>
#include <string.h>

using namespace std;

int main()
{
	int n=0,i = 0, count = 0;

	stack<char> s;
	char input[200];


	while( fgets(input, sizeof(input), stdin ) != NULL )
	{
		count = 0;
		if(input[0] == '.' ) break;

		for( i=0; i < strlen(input); i++)
		{
			if( input[i] == '(' || input[i] == '[' )
			{
				s.push( input[i] );
				//cout << "stack : " << s.top() << endl;
			}
			else if( input[i] == ')' || input[i] == ']' )
			{
				if( s.empty() ) 
				{
					count++;
					break;
				}
				else if( !s.empty() )
				{
					if( s.top() == '(' && input[i] == ')' )
					{
					//	cout << "stack is : " << s.top() << endl;
						s.pop();
					}
					else if( s.top() == '[' && input[i] == ']' )
					{
					//	cout << "stack is : " << s.top() << endl;
						s.pop();
					}
					else if( s.top() == '(' && input[i] == ']' )
					{
						count++;
						break;
					}
					else if( s.top() == '[' && input[i] == ')' )
					{
						count++;
						break;
					}
					else
					{
						count++;
						break;
					}
				}

			}
		}

		if( s.empty() && count == 0 )
			cout << "yes\n";
		else 
			cout << "no\n";

		if( !s.empty() )
		{
			//cout << "Stack is not empty!!" << endl;
			while( !s.empty() )
				s.pop();

			//cout << "Stack size is !!" << s.size() << endl;
		}
	}

	return 0;
}
반응형

'Algorithm' 카테고리의 다른 글

[c++]baekjoon 9012  (0) 2021.04.04
[c++]baekjoon 10773  (0) 2021.04.04
[c++]baekjoon 10828  (0) 2021.04.04
[c++]stack 사용  (0) 2021.04.02
thread  (0) 2019.03.01
반응형

C++ stack에서 사용할 수 있는 함수들입니다.  

C++ Stack

#include <stack>
stack<int> s;
s.push(a);  값을 stack에 집어 넣기 
s.pop(); 값을 스택에서 하나 빼오기 
b=s.top(); 스택 가장 위쪽 값 
s.empty(); 값이 비어 있는 지 여부를 확인 할 수 있다.
s.size(); 스택에 저장된 데이타 크기 

http://www.cplusplus.com/reference/stack/stack/

stack을 사용한 예제 입니다.

#include <iostream>                                                                                                                                                                                        
#include <stack>

using namespace std;

int main()
{
    int test;
    char aa; 

    stack<char> s;

    s.push('a');
    s.push('s');
    s.push('x');
    s.push('k');
    s.push('p');

    while( !s.empty()  )
    {   
        cout << s.top();
        s.pop();
    }   
    return 0;
}

실행 결과 : pkxsa

반응형

'Algorithm' 카테고리의 다른 글

[c++]baekjoon 9012  (0) 2021.04.04
[c++]baekjoon 10773  (0) 2021.04.04
[c++]baekjoon 10828  (0) 2021.04.04
[c++]baekjoon 4949  (0) 2021.04.03
thread  (0) 2019.03.01
반응형

예제 코드

file name : test.c

#include <stdio.h>

int main()
{
    char input[100];
    int i = 0;
    scanf("%[^.]s", input);
    
    while(input[i] != '0')
    {   
        printf("%c", input[i]);
        i++;
    }   
    
    return 0;
}

compile 방법

#gcc test.c -o test -g

gdb 실행

#gdb test
#b main
#run
#n
...
scanf함수까지 이동한 후 아래와 같이 임의 문장을 입력한다.
#Test code is.
#display i
#display *input@i
#n
....
이후 next를 입력하면서 값이 변하는 것을 확인하시면 됩니다.

 

 

반응형

'gdb' 카테고리의 다른 글

[gdb]coredump 생성 및 분석 방법  (0) 2021.04.07
GDB commands  (0) 2021.03.28
GDB help  (0) 2021.03.28
GDB란 ?  (0) 2021.03.28
반응형

GDB 사용하는데 많이 사용하는 command 위주로 정리를 했으며 사용하면서 필요한 정보는 gdb의 help를 이용해서 참조하면서 사용하시면 될 것 같습니다.

 

1.compile 방법 

compile시 -g debug option을 꼭 추가해야 합니다. 
#gcc test.c -g -o test
-g : debug option(-O optimization 은 주면 안됨)
-o : 실행 파일 이름 설정 

*debug option적용된 file인지 확인 방법 
#objdump -g test
.debug_xxx section들이 존재해야 한다.
<예>
.debug_arranges
.debug_info
.debug_str

 

2. gdb 시작/종료 

-시작 

gdb [프로그램명]

gdb [프로그램명] [core 파일명]

gdb [프로그램명] [프로세스 PID]

[example]
#gdb test

 

-종료 

(gdb)quit

(gdb)ctrl+d

 

 

3. 각 class별로 commands

-running

 

 

advance

advance 20 현재 파일의 20라인을 만날 때까지 진행

advance file.c:20 file.c 파일의 20라인을 만날 때까지 진행

 

continue

c 다음 breakpoint 를 만날 때까지 실행

u 현재 loop를 빠져 나감

finish 현재 함수를 수행하고 빠져 나감

return 현재 함수를 수행하지 않고 빠져 나감

return 123 현재 함수를 수행하지 않고 빠져 나감, 리턴 값은 123

si 현재의 instruction을 수행, 함수 호출 시 함수 내부로 들어감.

ni 현재의 instruction을 수행, 함수 호출 시 함수 내부로 들어가지 않음.

 

next

다음 행을 수행한다. 서브루틴을 호출하면서 계속 수행한다.

호출이 발생하지 않으면 step와 같다.

next n : 이를 n번 수행하라는 의미

n 현재 행 수행 후 멈춤, 함수 호출 시 함수 수행 후 다음 행으로 감

n 6 n을 6번 입력

 

run

[프로그램 시작/종료]
프로그램을 시작한다.(break가 있다면 break까지 실행)

run/r 프로그램 시작 

r arg1 arg2 arg1,arg2 를 인자로 프로그램 실행

run arg : 새로운 인수를 가지고 프로그램을 시작한다.

arg는 “*”나 “[…]”를 포함할 수도 있다.

쉘의 사용까지도 확장될 수 있다.

“<”,“>” , “>>”같은 입출력 방향 재지정기호도 또한 허용된다.

step

한 줄씩 실행 시킨다.

함수를 포함하고 있으면 함수 내부로 들어가서 한 줄씩 실행시킨다.

- gdb 프로그램 진행

s 현재 행 수행 후 멈춤, 함수 호출 시 함수 내부로 들어감

s 6 s를 6번 입력

kill

디버깅 중인 프로그램의 실행을 취소한다.
k 프로그램 종료

list

- gdb 소스 보기
현재 위치에서 소스 파일의 내용을 10줄 보여준다                          

list 2, 15 : 소스 파일의2 ~ 15 까지를 보여준다.

 

l 현재 함수를 기점으로 소스 출력

l 10 10행을 기준으로 출력

l func func 함수의 소스를 출력

l - 출력된 행의 이전 행을 출력

l file.c:func file.c 파일의 func함수 부분을 출력

l file.c:10 file.c 파일의 10행을 기준으로 출력

 

break

- gdb breakpint

b func func 심볼의 시작 부분에 breakpoint 설정

b 10 10행에 breakpoint 설정

b file.c:func file.c 파일의 func 심볼에 breakpoint 설정

b file.c:10 file.c 파일의 10행에 breakpoint 설정

b +2 현재 행에서 2행 이후 지점에 breakpoint 설정

b -2 현재 행에서 2행 이전 지점에 breakpoint 설정

b *0x8049000 0x8049000 주소에 breakpoint 설정

b 10 if var == 0 10행에 breakpoint 설정하는데, var 변수의 값이 0일 때 동작

rb fun* *fun* 에 해당하는 모든 심볼에 breakpoint 설정

rb ^fun fun 으로 시작하는 모든 심볼에 breakpoint 설정

rb TestClass:: TestClass에 해당하는 모든 심볼에 breakpoint 설정


특정 라인이나 함수에 정지점을 설정한다.

break function : 현재 파일 안의 함수 function에 정지점을 설정한다.

break file:function : 파일file안의 function에 정지점을 설정한다.

watch : 감시점 설정(감시점은 어떤사건이 일어날 때에만 작동한다)

until : 실행중 line까지 실행

watch

- gdb watch point

watch [변수명] 변수에 값이 써질 때, break 걸림

rwatch [변수명] 변수의 값을 읽을 때, break 걸림

awatch [변수명] 변수의 값을 읽거나 쓸 때, break 걸림

 

clear

특정 라인이나 함수에 있던 정지점을 삭제한다.

delete

몇몇 정지점이나 자동으로 출력되는 표현을 삭제한다.

print

next

print expr : 수식의 값을 보여준다.

display

- gdb display

display [변수명] s/n 명령으로 진행하면서 변하는 변수값 확인


현재 display된 명령의 목록을 보여준다.

bt

프로그램 스택을 보여준다. (backtrace)

file

file program : 디버깅할 프로그램으로서 파일을 사용한다.

help

명령에 관한 정보를 보여주거나 일반적인 정보를 보여준다.

 

 

- gdb 변수/레지스터 값 검사

info locals 지역 변수 값 출력

info variables 전역 변수 값 출력

p [변수명] 변수의 값 출력

p [함수명] 함수의 주소 출력

p *[포인터변수명] 포인터변수의 내용을 출력

p $[register] register의 값 출력

info registers register 값 전체 출력

info all-registers MMX register를 포함해 거의 모든 register 값 출력

p *ptr_to_array@n 배열에 대한 pointer인 ptr_to_array에서 배열 원소의 수(n)를 입력으로 해서 출력

 

- gdb 변수 값 설정

p [변수명] = 값 변수명의 값을 설정

 

- gdb x

x/[범위][출력형식][범위의 단위]

메모리 특정 범위 확인

범위: 출력할 개수를 의미

범위의 단위: b(byte), h(half word = 2byte), w(word = 4byte), g(giant word = 8byte)

 

- gdb print/display/x 명령의 형식 지정

t 2진수로 출력

o 8진수로 출력

d 부호가 있는 10진수로 출력

u 부호가 없는 10진수로 출력

x 16진수로 출력

c 최초 1byte 값읅 문자옇으로 출력

f 부동소수점 값 형식으로 출력

a 가장 가까운 심볼의 오프셋을 출력

s 문자열로 출력

i 어셈블리 형식으로 출력

 

- gdb stack frame

frame [n] n번 stack frame 으로 변경

up 상위 stack frame 으로 이동

up [n] n번 상위 stack frame 으로 이동

down 하위 stack frame 으로 이동

down [n] n번 하위 stack frame 으로 이동

info frame stack frame 정보 출력

info args 함수가 호출될 때 인자를 출력

info locals 함수의 지역변수 출력

info catch 함수의 예외 핸들러를 출력

bt 전체 호출 stack frame 출력

 

- gdb 지원 함수들

disas [함수명] 함수의 어셈블리 코드 출력

call [함수명] 함수를 호출

signal [signal] 프로세스에 signal 전송

set {type}[addr]=[값] addr 주소를 type으로 인식하고 값을 저장

 

반응형

'gdb' 카테고리의 다른 글

[gdb]coredump 생성 및 분석 방법  (0) 2021.04.07
[GDB] display array(display *input@i)  (0) 2021.03.29
GDB help  (0) 2021.03.28
GDB란 ?  (0) 2021.03.28
반응형

GDB진입 후 help/h 입력하면 명령들의 클래스 리스트가 출력된다. 

(gdb) help
List of classes of commands:

aliases -- Aliases of other commands.
breakpoints -- Making program stop at certain points.
data -- Examining data.
files -- Specifying and examining files.
internals -- Maintenance commands.
obscure -- Obscure features.
running -- Running the program.
stack -- Examining the stack.
status -- Status inquiries.
support -- Support facilities.
tracepoints -- Tracing of program execution without stopping the program.
user-defined -- User-defined commands.

Type "help" followed by a class name for a list of commands in that class.
Type "help all" for the list of all commands.
Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Type "apropos -v word" for full documentation of commands related to "word".
Command name abbreviations are allowed if unambiguous.

 

각 클래스의 도움말을 확인하려면 해당 클래스를 입력하면 된다.

(gdb) help class 

 

예를 들어 클래스 status에 대한 help를 해 보면 아래와 같습니다.

(gdb) help status
Status inquiries.

List of commands:

info -- Generic command for showing things about the program being debugged.
info address -- Describe where symbol SYM is stored.
info all-registers -- List of all registers and their contents, for selected stack frame.
info args -- All argument variables of current stack frame or those matching REGEXPs.

...

macro -- Prefix for commands dealing with C preprocessor macros.
show -- Generic command for showing things about the debugger.
show ada -- Generic command for showing Ada-specific settings.

...

show watchdog -- Show watchdog timer.
show width -- Show number of characters where GDB should wrap lines of its output.
show write -- Show writing into executable and core files.

Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Type "apropos -v word" for full documentation of commands related to "word".
Command name abbreviations are allowed if unambiguous.

 

i 로 시작하는 명령어들을 찾을 때는 complete 사용하면된다. 

(gdb)complete i

(gdb)complete i
if
ignore
inferior
info
init-if-undefined
interpreter-exec
interrupt

 

참고로 help로 화면 빠져 나가려면  "q + enter"를 입력하면 된다. 

 

 

반응형

'gdb' 카테고리의 다른 글

[gdb]coredump 생성 및 분석 방법  (0) 2021.04.07
[GDB] display array(display *input@i)  (0) 2021.03.29
GDB commands  (0) 2021.03.28
GDB란 ?  (0) 2021.03.28
반응형

 

GDB, GNU 프로젝트 디버거이며, 프로그램 수행 중에 안에서 일어나고 있는 것들을 보여 주거나 크래쉬가 난 순간에 프그램이 어떤일을 하고 있었는지를 보여준다.

GDB는 버그를 잡는데 도움이 되는 4가지 종류의 일을 한다:

  • 프로그램을 시작하고 프로그램의 동작에 영향을 줄 수 있는 것을 지정할 수 있다.
  • 지정된 조건에서 프로그램을 멈추게 할 수 있다.
  • 프로그램이 중지 되었을 때, 어떤 일이 벌어졌는 지 확인 할 수 있다.
  • 프로그램의 내용을 변경하여 버그를 수정하고 다른 버그에 대해 알아보는 실험을 계속할 수 있다.  

 

 

이러한 프로그램은 GDB(기본), 다른 시스템(원격) 또는 시뮬레이터와 동일한 시스템에서 실행될 수 있습니다. GDB는 맥 OS X뿐만 아니라 가장 인기 있는 유닉스 및 마이크로소프트 윈도우에서 실행될 수 있다.

GDB가 지원하는 언어는 무엇인가?

GDB가 지원하는 언어 (알파벳 순서):

  • Ada
  • Assembly
  • C
  • C++
  • D
  • Fortran
  • Go
  • Objective-C
  • OpenCL
  • Modula-2
  • Pascal
  • Rust

GDB는 1988년에서 리처드 스톨만이 처음 작성한 것으로, GNU 일반 공중 사용 허가서 하에 배포되는 자유 소프트웨어이다. 1990년부터 1993년까지는 시그너스 솔루션즈에서 근무하는 존 길모어가 관리하였다.

위 기능을 이용하면 프로그램 개발 시 코드를 좀 더 깊게 이해 할 수 있으며 프로그램에서 문제 발생시 문제 해결 할 수 있는 좋은 도구이므로 꼭 사용 법을 숙지해서 사용했으면 합니다.

[참조]

GDB homepage : http://www.gnu.org/software/gdb/

Wikipedia : https://ko.wikipedia.org/wiki/GNU_%EB%94%94%EB%B2%84%EA%B1%B0

 

반응형

'gdb' 카테고리의 다른 글

[gdb]coredump 생성 및 분석 방법  (0) 2021.04.07
[GDB] display array(display *input@i)  (0) 2021.03.29
GDB commands  (0) 2021.03.28
GDB help  (0) 2021.03.28
반응형

program이란 단순 코드를 의미할 수도 있고, 일반적으로 특정 디바이스에서 동작하는 앱을 프로그램이라고 통상적으로 얘길 한다.

processor는 cpu와 기타 기능을 포함하는 HW를 말하며 process는 실행 중인 program을 의미한다.

processor에는 전역변수, 열린 파일, 시그널, 주소공간 그리고 하나 이상의 실행중인 thread등을 포함한다.

thread는 process 안에 있는 활동을 가진 객체를 지칭하며 각 thread는 고유 PC(Program Counter), Stack 그리고 process register를 갖는다.

커널은 프로세스가 아닌 각각의 thread를 scheduling 한다.



gcc thread.c -o thread -lpthread

 1 #include <pthread.h>
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <unistd.h>
  5
  6 void *firstThreadRun()
  7 { 
  8    while(1)
  9    { 
 10       sleep(1);
 11       printf("start first thread\n");
 12    }
 13    return 0;
 14 }
 15
 16
 17 void *secondThreadRun()
 18 { 
 19    while(1)
 20    { 
 21       sleep(3);
 22       printf("start second thread\n");
 23    }
 24    return 0;
 25 }
 26
 27
 28 int main(void)
 29 { 
 30    pthread_t firstThread, secondThread;
 31    int threadErr;
 32
 33    if(threadErr = pthread_create(&firstThread, NULL, firstThreadRun, NULL))
 34    { 
 35       printf("thread error= %d", threadErr);
 36    }
 37
 38
 39    if(threadErr = pthread_create(&secondThread, NULL, secondThreadRun, NULL))
 40    { 
 41       printf("thread error= %d", threadErr);
 42    }
 43
 44    while(1);
 45    return 0;
 46 }


output

start first thread
start first thread
start second thread
start first thread
start first thread
start first thread


반응형

'Algorithm' 카테고리의 다른 글

[c++]baekjoon 9012  (0) 2021.04.04
[c++]baekjoon 10773  (0) 2021.04.04
[c++]baekjoon 10828  (0) 2021.04.04
[c++]baekjoon 4949  (0) 2021.04.03
[c++]stack 사용  (0) 2021.04.02
반응형

start_kernel


reset_init

{

kernel_thread(kernel_init, NULL, CLONE_FS)


}




pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
{
	return _do_fork(flags|CLONE_VM|CLONE_UNTRACED, (unsigned long)fn,
		(unsigned long)arg, NULL, NULL, 0);
}



반응형
반응형

1. overview

C 발생 과정

ALGOL60 → CPL → BCPL → B → C


①ALGOL60 : 1960년 국제위원회에서 개발한 언어로서 FORTRAN보다 세련된 과학 계산용 언어이나 추상적인 언어이어서 소프트웨어 개발용으로는 적절하지 못하다.

②CPL(Combined Programming Language) : 1963년 런던 대학과 캠브리지 대학에서 공동으로 개발한 언어이며 ALGOL60의 추상적인 부분을 보완하기 위해 개발한 언어이나 명령어가 많고 사용하기 어려운 형태로 되어있다.

③BCPL(Basic CPL): 1967년 캠브리지 대학의 마틴 라챠드 교수가 개발했으면 CPL을 좀 더 쉽게 표현하고자 나온 언어로서 명령을 간단한 형태로 구사할 수 있게 만들었는데 특정 문제 처리 가능한 제한적 언어이다.

④B : 1970년 벨 연구소의 Ken Thompson이 개발한 언어이며 하드웨어 제어 프로그램까지도 가능하나 포인터와 주소 연산을 지나치게 많이 사용하여 프로그램 작성하기 어렵다.

⑤C : 1973년 벨 연구소의 Dennis Ritchie가 개발한 언어로 프로그램 작성도 쉬우며 기능도 막강한 언어이다.

특징

고급 언어이면서 저급 언어의 특성을 모두 가지고 있다.

풍부한 연산자를 가지고 있다(약 40개)

구조화되었다.

간결하고 일관된 데이타 처리가 가능하다.

동적 처리가 가능하다.

호환성이 강하다.

컴파일러 종류

ANSI C, VAX C, TURBO C, BORLAND C,  MS C,LATTICE C,INSTANT C,RUN C,UNIX C

2. basic

C언어에서 사용되는 문자

①영문자 : a~z A~Z
②숫자 : 0~9
③특수문자 : keyboard상에서 영문자와 숫자를 제외한 나머지 문자(! @ # $ * ^ + - & % > < ~ / \ ? ; " = ( ) : , { } _ | [ ]…)

예약어

어떤 의미를 지니고 있는 단어들이며 사용자 정의 명칭으로 사용할 수 없다. 예약어들은 모두 소문자이다.


(1)기억류 예약어

auto

register

static

extern

(2)제어문 예약어

goto

if ~ else

switch ~ case

for

while

do ~ while

break

continue

return


(3)자료형 예약어

char

int

short

long

unsigned

float

double

struct

union

enum

void

(4)기타 예약어

sizeof()

typedef

사용자 정의 명칭

프로그램  작성 시 사용자가 임의로 만들어서 사용하는 이름을 말하며 레이블, 변수, 매크로, 형, 배열, 구조체, 공용체, 함수 등의 이름을 정의 명칭입니다.

[규칙]

영문자와 숫자의 조합으로 만든다

첫 글자는 숫자가 올 수 없다.

특수 문자는 사용할 수 없으며, 단 under score(_)만 사용 가능하다.

문자 사이에 공백을 둘 수 없다.

예약어는 사용할 수 없다.

대문자와 소문자는 다른 문자로 취급한다.

글자 길이 제한은 컴파일러마다 차이가 있으나 일반적으로 32자까지 가능하다.



3. data type

자료형은 크게 상수(constant)와 변수(variale)가 있다.


상수

고유한 의미나 크기를 가지고 있는 변할 수 없는 값을 말하며 아래 종류가 있다.



기본형















 

 산술형















 문자형

 하나의 글자,' '속에 기재, 2Bytes차지하며 하위 1byte에 표현됨

일반문자 : 'A'  제어문자:'n', 'r', '\a', '\f', '\b', '\t'

 char(-128~127)

 %c

 unsigned char(0~255)

 %c

 문자열형

 하나 이상의 글자, 따옴표(" ")에 기재, 문자열 상수 마지막에 NULL이어서 memory상에 문자열수 보다 1byte 더 크다.

 

 %s

  정수형

소수점이나 지수가 없는 수

10진수(11),8진수(013),16진수(0xB) 등으로 표현

 short

 %hd

 int

 %d

 long

 %ld

 unsigned short
 %hu
 unsigned int

 %u

 unsigned long

 %lu

 실수형

 소수점이나 지수가 있는 수

(실수의 맨 뒤에 f가 붙어있다면 float, l이 붙어있다면 long double, 아무것도 붙어있지 않다면 double입니다.)

1.98f(float),  5.98283l(long double), 3.782e+12(double)

 float %f %e %g
 double%f

 long double

 %Lf
 나열형

 enum 이름{상수1, 상수2, ....}

enum 이름{상수1=값1,상수2 = 값2, ...}

 enum %d
 무치형

 void

   

 합성형





 array

    

 function

    

 pointer

    
 struct    
 union    


변수

상수값을 기억시키기 위한 기억장소를 말하여 메모리상의 임의의 위치로부터 일정 byte수 만큼의 공간을 확보해 놓은 후 해당 공간을 칭하는 이름이다.


[변수 선언 형식]
자료형 이름 변수이름;


자료 형변환(Data type Coversion)

(1)typedef
기존에 사용하고 있는 자료형 이름 대신에 다른 이름을 부여하여 사용하도록 하는 것
[ 형식]
typedef 기존형 이름 새로운 이름1, 새로운 이름2, ...;


(2)auto data type conversion

연산이나 대입시에 자료형이 자동적으로 바뀌어서 처리되는 것을 말하며 묵시적 형변환(Implicit Data Type Conversion) 이라고 한다.

자료형은 연산시 자료형의 크기가 큰 쪽으로 바뀌어서 연산 된다.

자료형의 크기 순서는 아래와 같다.

char →unsigned char → short → unsigned short → int → unsinged int → long → unsinged long → float → double


(3)User data type conversion

특정 자료의 형을 사용자가 강제적으로 바꾸어 주는 것으로 명시적 형변환(Explicit Data Type Conversion)이라고 한다.

Cast 연산자라고 주로 사용한다.

[ 형식]
(자료형 이름) 변환 대상체

4. operator

연산처리를 하기 위한 문자를 말하며 C언어의 연산자는 기계 코드연산 명령과 1:1 대응되도록 설계되어 있기 때문에 연산 처리속도가 상당히 빠르다.


연산자

 연산자 종류

 동등우선

 

 

 최우선 연산자

 [ ], ( ), ->, .

 →






 

 단항 연산자

 !, ~, +, -, ++, --, *, &, sizeof(),(자료형)

 ←

 



 산술연산자

 *, /, %

 →

 

 +, -

  →

 

 시프트 연산자

 <<, >>

  →

 

 관계 연산자

 >, <, >=, <=

  →

 
 !=, ==
  → 
 논리 연산자
 이진 논리 연산자 : & > ^ > |
  → 
 일반 논리 연산자 : && > ||
  → 
 삼항 연산자

 ?:

 ← 
 대입연산자 =, +=, -=, *=, /=, %/, &=, ^=, |=, <<=, >>=
 ← 
 컴머 연산자
 , → 


5. input/ouput function

입/출력 처리란 어떤 데이터를 외부 장치(키보드, 마우스, 디스크 등)로 부터 program 내부(memory)로 읽어 들이거나 memory에 있는 data를 외부 장치로 내보내 주는 작업을 말한다.

[ 입/출력 처리]
입력장치((keyboard, mouse, disk etc) →  기억장소(Memory) →  출력장치(Monitor, Disk, printer)


출력함수

name

 usage

 output

 putchar()

 putchar('charatr'); 화면에 한 글자 출력, putchar('A');

 monitor

 puts()

 puts("strings"); 화면에 문자열 출력, puts("Korea");

 printf

 printf("메시지");printf("출력서식 및 메시지", 대상체1,대상체2,...);

화면에 한 글자나 문자열 출력, printf("Korea"); printf("%s", "Korea");

 fputc()

 화일에 한 글자 출력, fputc('charter',화일변수 포인터);

 file

 fputs

 화일에 문자열을 출력, fputs("strings",화일변수 포인터);

 fprintf()

 화일에 문자나 문자열 그리고 숫자등을 출력,

fprintf(화일변수 포인터, "출력서식 및 메시지", 대상체1,대상체2,...);



입력함수

name

 usage

 output

 getchar()

 getchar('charatr'); 화면에 한 글자 출력, putchar('A');

 from keyboard

 gets()

 gets("strings"); 화면에 문자열 출력, puts("Korea");

 scanf

 scanf("메시지");scanf("출력서식 및 메시지", 대상체1,대상체2,...);

화면에 한 글자나 문자열 출력, scanf("Korea"); printf("%s", "Korea");

 fgetc()

 화일에 한 글자 출력, fgetc('charter',화일변수 포인터);

 from file

 fputs

 화일에 문자열을 출력, fgets("strings",화일변수 포인터);

 fscanf()

 화일에 문자나 문자열 그리고 숫자등을 출력,

fscanf(화일변수 포인터, "출력서식 및 메시지", 대상체1,대상체2,...);



6. 제어문

프로그램의 실행 순서를 바꾸어 주는 문을 말한다.


 

 

 

 goto

 무조건 분기문

 goto label;

 if ... else

 조건문

 if(조건식) 명령1

 switch ... case

 조건문

 switch(수식){

           case value 1: command1;command2;...commandn;break;

           case value 2: command1;command2;...commandn;break;

            :

            case value n: command1;command2;...commandn;break;

            default: command1;command2;...commandn;break;

            }

*break가 있으면 switch문 끝으로 이동하고, 없으면 다음 case를 지속 수행한다.

 for

 조건, 반복문

 for(초기식; 조건식; 증감식)

           명령1;

 while

 조건,반복문

 while(조건식)

      명령1;

*while문의 조건식이 거짓이 될때까지 loop내의 명령을 반복 수행한다. 거짓이 되면 빠져나옴.

 do ... while

 반복, 조건문

 do{

      command 1;

     }while(조건식)

 

*do...while문의 조건식이 거짓이 될때까지 loop내의 명령을 반복 수행한다. 거짓이 되면 빠져나옴.

 break

 탈출문

 *while문의 조건식이 거짓이 될때까지 loop내의 명령을 반복 수행한다. 거짓이 되면 빠져나옴.

 continue 게속문

 *for, while, do..while에서 사용되며, block의 끝 부분을 만난 것으로 인식한다. 그러므로 continue를 만나면 조건식으로 이동하여 다음 조건을 수행한다.


 while(조건식){

      1;

      continue;

      command 2;

     }

 return 제어 반환문
 



7. function


8. 기억류(Storage class)


9.선처리부(Preprocessor part)

10. Array

11. Structured type

반응형
반응형

  1 import matplotlib.pyplot as plt
  2 import numpy as np
  3
  4
  5 Fs = 8000
  6 f = 3
  7 sample = 8000
  8 x = np.arange(sample)
  9 y = np.sin(2 * np.pi * f * x / Fs)
 10 plt.plot(x, y)
 11 plt.xlabel('sample(n)')
 12 plt.ylabel('voltage(V)')
 13 plt.show()

 

 

 

 

 

반응형

'python > python basic' 카테고리의 다른 글

[python]class  (0) 2022.08.11
[python]PyMYSQL  (0) 2022.08.07
python basic  (0) 2018.11.12
python programming  (0) 2018.11.12
[python][serial]serial port list  (0) 2018.11.12
반응형

index
my_name[0]

index slicing
my_name[0:5]

docstring
"""this is docstring"""
#19 end escape code
print('This is test') #뒤에 /n이 붙어 있다
print('This is test', end= '')
print('This is test', end='/')

print('This is/n test') #enter
This is
test
print('This is\t test') #Tab
This is  test

print('This', end='\t') print('is')

#20 list
[val1, val2,...]
my_list=[1,2,3]

#20 list add
my_list=[1,2,3]

my_list.append('7')

#my_list
[1,2,3,'7']

#24 tuple
list(mutable)와 동일하게 값을 저장하지만 값을 변경할 수 없는 게 다름

#my_tuple=()

#type(my_tuple)
#class 'tuple'

#my_tuple=(1,2,3)
#my_tubple=1,2,3

#25 packing unpacking
#my_tuple=(1,2,3)
#my_tubple=1,2,3

위 tuple 자체가 packing이다

unpacking은 아래와 같이 packing된 값을 각각의 변수에 대입하는 과정이다.
#num1,num2,num3=my_tuple
#num1
#1
#num2
#2
#num3
#3


만약 num1=1, num2=2의 값을 서로 변경할 경우는
#num1,num2=num2,num1
#num1=2
#num2=1
이렇게 변경된 것을 확인할 수 있다.

#26 for
#
for 변수 in 컨테이너
    실행할 명령어1
    실행할 명령어2
    ...
실행할 명령어  앞에는 space 4개
 또는 tab을 꼭 사용해야 하며 섞어서 사용하면 안되고 1가지로만 사용해야 한다.

#for i in [1,2,3]
    print(i)
#1
#2
#3

#27 range
#range(0,3) # 0,1,2

#
for i in range(1,3)
    print(i)

#28 for x2
#for j in range(2,10)
#    
for i in range(1,10)
#           print('{} * {} = {}' .format{j,i,j*k))

for 2번째 줄은 스페이스 4칸 그 다음줄은 스페이스 8칸을 해야함.

#29 comprehension
나중에 공부하자


#30 할당 연산자(operator)
= += -= *= /=

#31 산술 연산자(operator)
 +  -  *  /
#2+2
#14/3

**(제곱) //(몫만 표시) %
(나머지)
#3**2
#9
#
#32 %
 +  -  *  /
#2+2
#14/3


#33 문자열 연산자
 +  *
#'
hong'+'gil'+'dong'
#honggildong
#'good'*3
#goodgoodgood

#34 비교 연산자(comparison operator)
 ==(같냐?)  != (다르냐?) >(크냐) < (작냐?) >=(크거나 같냐?) <=(작거나 같냐?)


#35 논리 연산자(logical operator)
and or not
#T
rue and True
#True
#True and False
#False
#True or True
#True

#True or False
#True

#not True
#False

#36 맴버쉽 연산자(membership operator)
#member_list=['cat','dog','lion','elephant','lizard']
#'cat' in member_list

#True
#'dong' in member_list

#Flase

#37 if
#if condition:
#    실행할 명령1
#    실행할 
명령2
#        .
#        .
#        .

#38 else, elif
#if condition:
#    실행할 명령1
#    실행할 
명령2
#elif condition:
#    실행할 명령1
#    실행  
명령2

실행할 조건 앞에는 띄어쓰기 4칸을 해야함(권장사항)


#39 while
#while condition:
#    실행할 명령1
#    실행할 
명령2
#elif condition:
#    실행할 명령1
#    실행  
명령2


#40 continue break
continue를 만나면 조건문으로 다시 감.
break 만나면 무한 반복문을 빠져나감.



반응형

'python > python basic' 카테고리의 다른 글

[python]PyMYSQL  (0) 2022.08.07
[python][graph]sine wave  (0) 2018.12.02
python programming  (0) 2018.11.12
[python][serial]serial port list  (0) 2018.11.12
[python][cv2]ImportError:No module named cv2  (0) 2018.11.12
반응형

1.python 특징과 설치

객체 지향언어
대화기능의 인터프리터 언어
동적인 데이터 타입 결정 지원
플랫폼에 독립적
개발 기간 단축에 초점을 둔 언어
간단하고 쉬운 문법
고 수준의 내장 객체 데이터형 제공
메모리 자동 관리(RC)
무료

시스템 관리(스크립팅)-상당히 많은 분야에 사용됨
GUI(pyhQT)
인터넷 프로그래밍
DB 프로그래밍
각종 텍스트 프로세싱
분산처리
수치연산, 그래픽스

2. 데이타 타입
-명명규칙
[_a-zA-Z0-9]*,한글
변수명의예:a,a1,my_name,your_job
잘못된 변수명 : 1abc,@abc,%x
# 주석

-데이터타입
정수
a=10
실수
a=3.14
복소수
a=3+j4
print(a)
print(type(a))
print(a.img)
print(a.real)
print(a.conjugate())
#객체: 속성+메소드
객체.속성
객체.메소드

-문자열 데이터타입
문자열
str
순서있는 데이터 타입
immutable 데이터 타입

#복합(시퀀스) 여러개의 데이터
#순서있는 데이터 타입(인덱스, 슬라이싱)
#[시작:끝:증가치]
#+,*,%
a=10
b=3.14
s='abc'
s1='a=%d b=%f s=%s'%(a, b,s)

s1='abcdefghi'
print(s1[0:4:1])
print(s1[1:4])
print(s1[:5:2])
print(s1[1:])
print(s1[-1:-4:-1])

s = b'abc'
print(s)
print(type(s))
b'abc'
class 'bytes'

s1 = 'abc'
s1 = s1.encode('utf-8')
print(s1)
print(type(s1))
'abc'
class 'bytes'

5강. 시퀀스 데이타타입
순서있는 데이터 타입(인덱스,슬라이싱)
리스트,튜플,문자열,바이트

순서없는 데이터 타입(인덱스,슬라이싱 X)
세트,딕셔너리


변경가능한(mutable) 데이터타입
리스트,딕셔너리,세트

변경불가능한(immutable) 데이터타입
튜플,문자열,바이트


튜플 타입

-오브젝트의 리스트를 저장
-() 또는 tuple() python 내장함수를 이용
-순서있는 데이터 타입
-변경불가능한(immutable) 데이터 타입
-함수의 인자, 리턴에 주로 사용

myT=(10,20,30,40)
print(myT)


packing, unpacking
a,b,c = ( 100,200,300 )# unpacking
a = ( 100,200,300 )# packing


Dictionary Type

-오브젝트를 키와 값으로 저장
-{키:값} 또는 dict() python 내장함수를 이용
-순서없는 데이터 타입
-변경가능한(mutable) data type

myD={10:'aa',20:'bb',30:'cc'}
print(myD.pop(20)) #20요소 삭제됨.
print(myD.keys()) #key값만 출력
print(myD.values()) #value 값만 출력
print(myD.items()) #key값만 출력

Set  Type
-중복없는 데이터를 저장
-{} 또는 set() python 내장함수를 이용
-순서없는 데이터 타입
-변경가능한 데이터 타입
-집합관련 연산자 사용
mySet={10,20,30}
print(mySet[0]) # 순서없는 데이타 타입이므로 에러발생

week#1_exercise

1. 아래의 문자열에 대해 다음을 수행하시오.
s='abcd efgh ijklm'

1)공백을 기준으로 자르시요(리스트의 문자열로).
2)'efgh'문자열을 추출하시요.
   print(s[5:9:1])
3)'ac fhikm'문자열을 추출하시요.
   print(s[::2])
4)'mlkji'문자열을 출출하시요.
    print(s[:8:-1])

2.문자열 객체 변수명이 s인 임의의 하나의 문자열이 주어진 경우 공백 기준으로 자른 뒤 맨 마지막 문자열을 추출하도록 프로그램을 작성하시오.

(예: s='abc def ghi'인 경우 ghi 문자열이 출력되어야 한다.)

Quiz
7.문자열을 bytes type으로 변환하고자 할 때 사용하는 것 
   encode
8.리스트에 요소를 추가하는 리스트 객체 맴버함수명이 아닌것은?
append, put, insert, extend
myList=[1,2,3,4]
my_list.append(50)
myList.insert(1,200)
myList.extend([1,2,3])
myList=myList + [1,2,3]
myList =myList*3
myList.remove(4) #해당 인텍스의 인자를 삭제함.
myList.pop() # 마지막 인자를 삭제
myList.pop(1) #해당 인덱스의 객체를 삭제
del( myList[0] ) #해당 인덱스의 인자를 삭제
n=myList.index(20) #해당값이 있는 인덱스를 리턴해줌
n=len(myList) #요소의 갯수를 리턴



9.아래에 해당하는 데이터 타입에 맞는 것은?
 - 순서있는 데이터 타입
 -변경 불가능한 데이터 타입
 -함수의 인자, 리턴에 주로 사용
 - 함수의 인자, 리턴에 주로 사용
 - 패킹과 언패킹 지원

10.아래의 출력 결과로 맞는 것은?

myD={10:'aa',20:'bb',30:'cc'}
myD[40]='dd'
print(myD)
{40: 'dd', 10: 'aa', 20: 'bb', 30: 'cc'}



함수와 모듈

def 함수명( 인자):

    함수구현부

    return 결과값

함수의 특징

- 두개이상의 값 리턴 가능
- 명시적 인자 호출
- 디폴트인자
- 가변인자
- 정의되지않은 인자

#두개이상의 값 리턴 가능

함수기본

<iframe width="800" height="300" src="http://pythontutor.com/iframe-embed.html#code=def%20hello%28%29%3A%0A%20%20%20%20print%28'hello'%29%0A%20%20%20%20print%28'fn'%29%0A%0Ahello%28%29%0Ahello%28%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=false&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false"frameborder="0"></iframe>함수기본(리턴과 인자)


================================
def hello():
    print('hello')
    print('fn')

def hap(a,b):
    return a+b

rst=hap(10,20)

def fn1():
    return 10,20,30

rst=fn1()
#hello()
#hello()

=====================================

함수의 특징
-두개 이상의 값 리턴 가능
-명시적 인자 호출
-디폴트인자
-가변인자
-정의되지않은 인자


13강. 파일, 디렉터리 다루기

1.파일객체 = open(파일명, 모드,인코딩)
파일객체를 리턴
2. 파일객체 멤버함수
write
readline
readlines
seek
tell
close
파일열기모드
r
w
a


14강. 시간과 날짜
date():날짜 정보만 가지는 datetime.date 클래스 객체 반환
time():시간 정보만 가지는 datetime.date 클래스 객체 반환
now():날짜 정보만 가지는 datetime.date 클래스 객체 반환

python datetime strtime


시스템과 랜덤함수

sys 모듈 import sys 

- argv: 명령행 인자
- getrefcount(): 참조 개수 반환
- path: 파이썬 패스
- stdin, stdout, stderr: 표준 입력, 출력, 에러 객체

- exit: 스크립트 종료

<sysRandomTest1>

import sys print( sys.argv ) my = sys.argv print( my[1]) 

<sysRandomTest2>

import sys myList = [10,20,30] print( sys.getrefcount(myList)-1 ) 

<sysRandomTest3>

import sys myList = [10,20,30] myList1 = myList print( sys.getrefcount(myList)-1 ) 

<sysRandomTest4>

import sys myList = [10,20,30] myList1 = myList print( sys.getrefcount(myList)-1 ) sys.stdout.write('aa\n') sys.stdout.write('bb'
 

random 모듈 import random

- randrange(시작,끝): 범위의 숫자 반환
- shuffle(시퀀스): 시퀀스를 임의로 배치
- choice(시퀀스 ): 임으로 선택
- Sample(시퀀스,개수): 임으로 갯수만큼선택

<sysRandomTest5>

import sys import random for n in range(5): print( random.randint(1,5) ) 

<sysRandomTest6>

import sys import random myList = [ 1,2,3,4,5] print( myList ) random.shuffle( myList ) print( myList ) 

<sysRandomTest7>

import sys import random myList = [ 1,2,3,4,5] print( myList ) print( random.sample( myList,2 )) 

<sysRandomTest8>

import sys import random #롯또 1~16 임으로 6개선택 rotto = [ n for n in range(1,17)] pr


반응형

'python > python basic' 카테고리의 다른 글

[python][graph]sine wave  (0) 2018.12.02
python basic  (0) 2018.11.12
[python][serial]serial port list  (0) 2018.11.12
[python][cv2]ImportError:No module named cv2  (0) 2018.11.12
[python]SyntaxError:Non-ASCII charater '\xec'  (0) 2018.11.12

+ Recent posts