달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

브레드보드와 기판

 

컴퓨터는 기본적으로 회로로 구성되어 있다. 그래서 컴퓨터공학 과정에 디지털회로 이론이 있다.

이러한 회로 실험을 할 때 납땜이 참 곤란한데..이 문제를 해결해 주는 것이 브레드보드 이다.

브레드?빵? 아니다. 회로기판 납땜하면서 연기 좀 마셔봤다 하시는 분들은 들어보았을 것이다.

 

 

요건 납땜없이 선과 선을 연결하고, 각종 소자를 꼽게 해 놓은 것이다.

쉽게 말해…

납땜이 되어 있는 회로의 곳곳에 구녕을 뚫어놓고, 원하는 구녕에 원하는 것을 쑤셔넣을 수 있도록 만든 기판이다.

 

 

설명이 팍팍 꼬치는 군 ㅋㅋ꼬치? 음;;

여튼 바로 아래놈이다.

사용법은 인터넷에 잘 나와있겠지만..간단히 말해,

맨 왼쪽 세로줄이 그라운드선으로 죽 이어져있고, 그 오른쪽 세로줄은 양극선으로 이어져 있다.

그 옆칸으로 건너뛰면.. 이번엔 세로줄이 서로 연결된 것이 아니라 가로줄이 서로 연결되어 있다.

즉, 가로줄 구녕 다섯개는 선으로 연결되어 있다.

 

 

인제 요 브레드보드로 디지털 회로를 설계하고자 한다.

409페이지를 펼쳐보자.

 

 

휘리릭~펼치니 나오는 and 게이트.

요 and게이트를 만들어 볼 거다.

 

 

음 만들어 보았다.

밝기가 약하네.

전구를 하나 더 붙혀서 기존 전구, 추가 전구 둘 다

밝기를 더 밝게 하고 싶다.

추가 전구를 어디에 꽂으면 될까?

힌트. 전구의 밝기<-공급전력<-전류

 

그렇다. 전류를 높여주자. 어떻게?

바로 저항소자의 앞 뒤로 엘이디 양극, 음극을 연결해 주면 된다.

짜잔~ 밝아졌지?

어케 이렇게 될까?

그 이유는 바로, 전구가 저항소자보다 저항값이 훨씬 낳기 때문이다.

그래서 새로운 전구의 음극, 양극 선으로 많은 전류가 흘러 새로운 전구도 밝아지고,

이 전구를 거친 전류가 또 기존 전구로 가게 되어서 종전보다 전구의 붉기가 밝아진 것이다.

 

 

귀에 쏙쏙 들어오는 설명이네요.

이상으로 '브레드보드와 기판 : 전류와 저항'에 대하여 알아보았습니다.

아래 손가락 버튼 눌러주시고, 좋은 하루 보내세요~^^

Posted by C언어 보이
|

헥사뷰:hexaview,포인터, 함수포인터와 void 포인터

 

오늘은 void 포인터와 함수 포인터에 대하여 배웠습니다.

함수 포인터는 함수를 가리키는 포인터 입니다.

즉, '함수의 반환형+(포인터표시*+포인터명)+(인자)' 와 같이 쓰면 됩니다.

그런 후 사용법은 함수와 같이 하면 됩니다. 즉, '함수 포인터이름(인자)'와 같이 하면 됩니다.

Void 포인터는 형이 없는 포인터로서 'void*포인터이름'으로 선언합니다. 즉, 모든 자료형을 대입할 수 있으며, 대입 및 출력에는 원하는 자료형으로 지정을 하면 됩니다 (이를 캐스팅 이라 합니다).

 

아래의 헥사뷰를 예로 설명하겠습니다.

 

헥사뷰 함수를 선언하고, 메인에서 호출합니다.

메인에서 헥사뷰 함수 호출시에 인자로 inum의 주소를 전달했습니다.

 

 

아래 헥사뷰 함수를 보면..

Vpdata의 값(즉, inum의 주소)을 출력합니다.

 

 

아래 반복문에서는 1바이트 char형으로 출력을 하고 있습니다. 즉, 4바이트 숫자를 1바이트 씩 쪼개서 보고 싶기 때문에 이와 같이 쓰는 것입니다.

출력문에서 1바이트 자리만큼 출력을 한 후에 +1을 해주어, 다음 반복문에서 다음 바이트의 값을 나타내도록 하고 있습니다.

이렇게 메인의 inum 변수 메모리 공간의 값을 모두 출력하였습니다..그 후 옆 칸에 아스키 코드 출력을 위하여 아래의 코드를 작성합니다.

 

보면은 값이 32~127 사이 즉 아스키표에서 문자에 할당된 값일 때에만 해당 문자를 출력합니다.

 

함수포인터와 void 포인터 그리고 헥사뷰에서의 활용에 대하여 알아보았습니다.

추천 눌러주세요 ㅋㅋ

 

Posted by C언어 보이
|

배열과 포인터의 다양한 형태와 활용에 대하여 공부하였습니다.

-----------[순서]--------------

[1] 배열

1. 삼차원 배열의 개념

2. 다차원 (이차원) 배열의 활용문제

   

[2] 포인터

1. 다차원 포인터의 개념과 활용

(1) 개념

(2) 활용

2. 다차원 배열과 포인터의 관계

(1) 개념

(2) 포인터 배열 'int * pnum[2]'와 배열 포인터'int(*parr)[2]'

----------------------------------

   

   

[1] 배열

1. 삼차원 배열의 개념

예시로 설명하겠습니다.

-      1차원 배열의 예: 학생의 국, 영, 수 성적을 1차원 배열로 저장하라.

   

   

   

각 각의 번지는 국, 영, 수 순서입니다.

   

-      2차원 배열 : 출석번호 1, 2, 3번 학생들의 국, 영, 수 성적을 2차원 배열로 저장하라.

위 1차원 배열의 구조가 그대로 들어가 있습니다. 다만, 1차원 배열이 원소가 된다는 점만 다릅니다. 참고로 5행, 6행, 7행의 실행결과는 동일합니다. 편한데로 쓰면 되겠습니다.

   

   

 -      3차원 배열: a반과 b반의 출석번호 1, 2, 3번 학생의 국, 영, 수 성적을 입력하라

   

   

'1차원->2차원 배열'과 '2->3차원 배열'은 동일한 관계를 가집니다. 즉, 3차원 배열은 2차원 배열을 원소로 가진다. 소대->중대->연대의 개념이라고 하면 될까요?

이렇듯 배열, 특히 다차원 배열은 자료입력을 하는 데에 용이합니다. 특히, 각종 명부, 신체 사이즈 등 정보의 종류와 구조가 특정되어 있는 경우에 유용합니다.

   

   

2. 다차원 (이차원) 배열의 활용문제

아래는, 이차원 배열의 활용에 관해 3문제 중 한 문제입니다.

학생들의 시험성적을 관리하는 프로그램입니다. 입력된 시험성적을 총점 구하기, 평균 구하기 등에 사용할 수 있습니다.

(상세한 설명은 제 블로그 'http://inocenttome.tistory.com/entry/20140331-03-이차원-배열의-활용-문제-3-성적관리-프로그램' 에 있습니다)

   

   

   

특징.

1.     입력과 출력을 같은 반복문을 쓰지 않고 나누어 코딩하였습니다. 수정과 디버깅의 용이함 때문으로 보이지만 사실 실력이 모잘랐..;

2.     그리고 숫자 외의 정보표현을 위해 name이라는 문자열 배열을 만든 것입니다. 각 각의 반복문에 분기문을 지저분하게 첨가할 수도 있었으나, 가능한 문자정보의 출력을 자동화하고자 노력하였습니다.

   

가벼운 마음으로 코드를 함 슥 보면… Score[i-5] 이 부분은 원래 score[i] 였습니다. 원래 의도한 바가 있어서 [i-5]형태로 쓴 건데, 코딩하다가 그 용도가 없어졌습니다. 이렇듯, 처음 변수를 정의할 때에도 전체 코드에서의 쓰임을 고려하여야 하며, 이를 간과하고 변수를 정의하면 후에 변수의 사용형태가 아래처럼 복잡해 집니다 (타산지석).

   

   

   

아래는 출력용 반복문입니다. 메인은 두 반복문 중에 아래 쪽 반복문입니다.

이중 반복문인데, 살펴보면 안쪽 반복문을 수행하기 전에 (즉, 철수의 각 과목 성적을 출력하기 전에), 사람의 이름이 찍혀야 합니다.

   

   

   

[2] 포인터

1. 다차원 포인터의 개념과 활용

(1) 개념 : 포인터의 포인터를 더블포인터라고 하며, 더블포인터를 가리키는 삼중포인터, 이 삼중포인터를 가리키는 사중포인터 등을 모두 합해 다차원 포인터 라고 합니다. '*'을 100개 까지 붙히면 백중 포인터도 만들 수 있으나 다차원 포인터는 잘 쓰이지 않으며 그나마 쓰이는 것이 더블 포인터 입니다.

(2) 더블 포인터의 활용 :

함수 내의 static 변수 접근을 위해 주로 사용됩니다. 아래 코드식으로 적어보면.. 

---------------[코드시작]----

main

{

int num=100;

int * pnum=&a;

int **ppnum=&pnum;

func(ppnum);

 }

   

void func(int** ppnum)

{

static snum=10;

*ppnum=&snum;  //ppnum이 &pnum이므로, *ppnum은 pnum이다.

                       //즉, 더블포인터로 메인의 싱글 포인터를 접근할 수 있게 된다.

                       //이 pnum에 &snum을 넣게 된다.

}

   

---------------[코드 끝]----

   

   

2. 다차원 배열과 포인터의 관계 

: 예제와 개념이 교재에서 충실히 설명되므로, 제가 이해한 표현으로 적겠습니다. 참고 바랍니다.

(1) 개념

2차원 배열의 이름이 곧 더블 포인터는 아닙니다.

   

크게 두 가지 이유가 있습니다.

1) 첫 번째로 배열명은 포인터와 달리 그 값이 여러 가지를 의미합니다.

포인터는 쉽게 말해 '아래 혹은 위로 타고 들어가는 것'이나 배열명은..

가령, 이차원 배열 'inum[2][2]'의 배열이름 inum은,

'배열 전체의 시작주소'이기도 하며,

'0번째 행의 시작주소inum[0]'이기도 하며,

'0번째 행의 0번째 원소 주소inum[0][0]'이기도 하기 때문입니다.   

   

 2) 두 번째로, 연산 (증가, 감소)의 형태가 다릅니다.

배열명 inum에 +n을 하면 '배열의 전체길이*배열자료형의 크기*n'만큼 주소 값이 건너뜁니다.

하지만 배열명 inum을 가리키는 'int형 싱글 포인터 pinum'(int*pinum=inum)에 +n을 하면 이는 '자료형의 크기*n'만큼 주소 값이 증가할 뿐입니다. 그렇다고 'int형 더블 포인터 ppnum'에 +n을 하여도 마찬가지 크기만큼 증가합니다. 즉, 포인터의 연산은 '자신의 선언형태'에 따라가는 것이지, 가리키는 대상(배열명)에 따라 달라지는 것이 아닙니다. 그럼 포인터의 연산을 배열명과 동일하게 하려면 어떻게 해야 할까요?

따라서 이차원 배열을 가리키는 포인터로 '포인터 배열'이라는 것이 필요해집니다. 아래를 참고.

   

   

(2) 포인터 배열 'int * pnum[2]'와 배열 포인터'int(*parr)[2]'

1) 포인터 배열: 이미 알고 있듯이 배열을 선언할 때에 배열의 자료형을 명시해 주어야 합니다. 가령 '정수형의 배열'은 int num[2] 처럼 말입니다. 즉, '자료형int+배열명+인자의 개수[2]'.

그럼 '정수형 포인터의 배열'의 선언방식은? 똑 같습니다. 즉,  '자료형int*+배열명pnum+인자의 개수[2]' 입니다.

   

2) 배열 포인터: 이미 알고 있듯이 포인터를 선언할 때에 포인터의 자료형을 명시해 주어야 합니다. 가령 '정수형의 포인터'는 int* pnum 처럼 말입니다. 즉, '자료형int+포인터표시*+포인터명pnum'.

그럼 '정수형 배열 포인터'의 선언방식은? 똑 같나요? 예 거의.

즉, '자료형+포인터표시+포인터명'의 위 방식 마지막에...배열 인자의 개수만 더해주면 됩니다. 즉, '자료형int+(포인터표시*+포인터명pnum)+배열인자의 개수[2]' 입니다.

 

잘 보셨으면 손가락을 꾸욱 눌러주세요~~

링크도 많이 많이 해 주세요 ㅎㅎ

   

Posted by C언어 보이
|

이차원 배열의 활용 마지막 문제이다.

자료입력에 적합한 배열의 특성에 맞게 성적관리 프로그램을 짜는 문제이다.

 

문제. 학생 4명 각 각의 4 과목 점수를 입력받고, 과목별 총점, 학생별 총점, 총합 까지 저장되게 하자.

즉, 5*5 배열을 만들어 값을 저장한 후, 출력하라.

 

특징.

  1. 본인은 입력과 출력을 같은 반복문을 쓰지 않고 나누어 코딩하였다. 수정과 디버깅의 용이함 때문으로 보이지만 사실 실력이 모잘랐 ㅠ;;
  2. 그리고 숫자 외의 정보표현을 위해 name이라는 문자열 배열을 만든 것이다. 각 각의 반복문에 분기문을 지저분하게 첨가할 수도 있었으나, 가능한 문자정보의 출력을 자동화하고자 노력하였다. 말이 엄청 거창하게 들리는데, 먼말인지 알거다;;

    일단 가벼운 마음으로 코드를 함 슥 보자. Score[i-5] 이 부분은 원래 score[i] 였다. 원래 의도한 바가 있어서 [i-5]형태로 쓴 건데, 코딩하다가 그 용도가 없어졌다. 그래도 있어 보이므로 그대로 남겨두었다.

 

 

우선 아래 입력용 반복문부터 보자.

기본적으로 행4회, 열4회로 4*4 반복을 하고 있다. 당연하다 4*4 회 입력하고, 나머지 총점들은 알아서 더해지니깐.

변수 때문에 복잡해 보이지만, 기본적으로 [학생0][과목0]~[학생4][과목4] 까지 입력을 받는 코드이다. 다만 각 행의 모든 입력값을 마지막행에 누적해 주자. 또, 바깥 쪽 포문이 1회 돌 때 (즉, 행이 바뀔 때 혹은 즉 i가 ++할 때)에..마지막 원소의 값 (즉 과목별 총점)을 score[4][4]에 더해주면 총점 반영이 된다.

입력용 반복문의 핵심은, 각 원소에 입력된 데이터가 적합한 원소에 적합하게 합산 되는 지가 중요하다.

 

 

참고적으로 아래 코드에서 (i-5)를 그냥 i로 고치고 초기값도 5가 아닌 0을 넣자.

사람이름 배열에 접근하기 위한 변수를 i로 공통으로 썼는데, 역시나 코드가 보기 어려워 졌다.

 

 

그 다음 아래의 출력용 코드를 보자. 메인은 두 반복문 중에 아래 쪽 반복문이다.

이중 반복문인데, 살펴보면 안쪽 반복문을 수행하기 전에 (즉, 철수의 각 과목 성적을 출력하기 전에), 사람의 이름이 찍혀야 한다. 그래서 첫 줄에 프린트문으로 현재 사람이름(철수)을 찍고 들어가는 것이다.

그 외에는 일반적인 형태의 출력용 반복문이다.

 

그리고 윗 부분의 반복문은 과목명 배열을 접근하여 출력하기 위한 코드이다.

즉, 우리의 5*5 성적 배열을 출력하기 전에, 첫 줄에 각 과목명을 찍어 놓는 것이다.

 

이상으로, 이차원 배열의 활용 문제 3 성적관리 프로그램을 만들어 보았다.

잘 보았다 싶으시면 손가락을 꾸욱 눌러주세요 ㅋㅋ

Posted by C언어 보이
|

이차원 배열의 활용 문제 1 구구단 저장 문제이다.

3*9배열에 아래처럼 저장, 출력하라.

 

 

행렬의 위치를 그대로 대입하면 된다.

다만, 2단을 나타내는 행은 [0], 3단에 대해서는 [1]이 된다. 즉, 행의 원소번호에 +2을 해줘야 한다.

마찬가지 원리로 열의 원소번호에는 +1을 해주어야 한다.

그래야만 3*2는, 3(1행+2)*2(1행+1)이 되기 때문이다.

 

이상으로 이차원 배열의 활용 문제 1 구구단 저장 문제를 풀어보았다.

잘 보았다 싶으시면 손가락을 꾸욱 눌러주세요 ㅋㅋ

Posted by C언어 보이
|

이차원 배열은 대입과 관련하여 다양한 알고리즘을 만들 수 있다.

(대표적으로 그래픽 분야에서 응용이 많이 된다. 그림의 화소정보를 각 각의 배열 원소로 넣을 수 있다.)

우선 문제를 보자.

문제 : 2행 4열의 A배열은..{{1,2,3,4},{5,6,7,8}} 처럼 되어 있다.

이를 4*2 배열의 A배열에 아래와 같이 값이 대입되도락 하라.

 

풀이: 핵심은 규칙성을 발견하는 것이다.

잘 보면, A배열의 행과 B배열의 열이 동일하게 값이 변하는 것을 알 수 있다.

(참고로 수학의 '등차수열' 이다.)

그럼 b배열은 a배열과 행과 열을 반대로 적으면 된다.

즉, a배열의 i행 j열의 값을 b 배열의 j행 i열에 넣으면 된다.

참고로 이 방식은 영상처리에서 '화면 좌우반전, 회전' 등의 분야에 그대로 응용할 수 있다.

 

이상으로 이차원 배열의 활용 문제를 풀어보았다.

잘 보았다 싶으시면 손가락을 꾸욱 눌러주세요 ㅋㅋ

 

Posted by C언어 보이
|

문제 : 사용자로부터 7개의 숫자를 입력받아 내림차순으로 정렬하라.

버블정렬을 이용하라. 아래를 참조하라.

 

풀이: 메인의 두 반복문은 일반적인 입력, 출력용 반복문임으로 설명이 불필요하다.

bubblesort함수만 살펴보자.

 

맨 안쪽에 있는 이프문이 스왑함수의 기능을 하는 부분이다.

 

이프문 바로 위의 반복문은 pivot (즉 왼쪽에 있는 기준값)과 대상값(pivot과 비교를 하는 값)을 비교한다. 이 대상값이 안 쪽 반복문에 의해 pivot 오른쪽에서부터 맨 끝의 숫자까지 바뀐다.

그렇게 해서 안쪽 반복문의 모두 수행되면,바깥쪽 반복문은 1회 수행이 완료되면서 i++고 pivot값이 오른 쪽으로 이동한다. 그리고 그 pivot 값을 기준으로 하여 또 나머지 값들에 대한 값 비교 반복문(즉 안쪽 반복문)이 모두 수행된다.

이상으로 내림차순 프로그램: 버블정렬 알고리즘, 스왑 함수에 대해서 알아보았다. 오름차순 또한 스왑함수의 조건식만 다르며 나머지는 다 똑같도.

잘 보았다 싶으시면, 링크추가나 손가락을 눌러주세요ㅋㅋ

 

 

 

Posted by C언어 보이
|

문제:회문검사 프로그램을 작성하라.

아래 참조.

 

풀이: 반복문을 두개로 쪼갠다.

우선, 1차 반복문으로 문자열의 길이(len)를 구한다.

조건식은 해당 배열원소가 0인지를 검사하는 것이다.

2차 반복문에서는 1차에서 구한 길이len만큼 반복하면서 앞뒤비교를 한다.

조건식은 if(word[i]!=word[len-1-i]) 이다. 한번이라도 앞뒤가 다르면 회문이 아니라고 하면서 종료한다.

만약 회문이라면, 앞뒤가 모두 같으면 조건식은 번도 수행되지 않은 상태로 함수가 종료한다.

프로그램은 메인으로 복귀한다. 다음함수인 출력함수로 "회문맞음" 출력하게 된다.

이상으로 회문 검사 프로그램을 작성해 보았다.

 

잘 보았다 싶으시면, 링크추가나 손가락을 눌러주세요ㅋㅋ

Posted by C언어 보이
|

문제 : 10개 정수입력 배열. 홀수면 앞에서부터 체워지고, 짝수는 끝에서부터 체워지게 하라.

풀이: 즉슨, 아래처럼 하라는 뜻이다.

 

두 번째 반복문은 일반적인 출력용 반복문이니 첫 번째 반복문부터 보겠다.

나머지 연산자로 혹수 짝수를 판별한다.

그 다음, 대입순서가 중요한데 간단하다. 홀수 입력시 마다 입력위치(즉 start)를 ++ 해주면 되고, 짝수의 경우에는 반대처럼 하면 된다.

 

이상으로 정수입력과 배열, 나머지 연산자, 배열의 순서에 대해 알아보았다.

잘 보았다 싶으시면, 링크추가나 손가락을 눌러주세요ㅋㅋ

 

Posted by C언어 보이
|

문제 : 10진수를 입력받아 2진수 변환하여 출력하시오

풀이: 결론부터 말하자면 아래와 같이 된다.

 

핵심은, '(2의 n승)>10진수(num)'가 되는 n을 찾는 것이다.

그 10진수의 최초 자리수가 (n-1이다). 그리고 그 n을 배열 순서대로 대입한다.

그 다음 자리수에 대해서도 마찬가지로 구한다. 즉 , 나머지 부분의 숫자'num=이전num-(2의 n-1승)' 이다.

 

 

메인함수의 printarr은 변환된 2진수의 각 자리수를 저장하기 위한 배열이다.

아래 for문으로 최초 자릿수를 구하고, if문에서 그 자릿수에 해당하는 배열 번지에 1을 넣는다.

 

 

그 다음 나머지 부분의 숫자'num=이전num-(2의 n-1승)'를 위와 같은 식으로 돌린다. goto문을 안 쓰고 이중 포문을 쓸 수도 있지만, 설명의 용이성 때문에 (핑계가 좋다ㅋ) goto문을 썼다.

모든 자리수를 구하면 더 이상의 나머지 숫자가 없어지므로 레이블 TWO로 넘어가서 출력을 한다.

이상으로 이진수 변환 프로그램을 짜 보았다. 배열을 단순하게 사용하였으나, '출력의 용도로 배열을 쓸 수 있구나'라는 착안이 중요하다. 또한 진수 변환의 원리를 이해하여 이를 코드화 하는 것이 중요하다. 어렵게 느낀다면 조건문과 반복문의 사용 및 변수 초기화 부분일 것이다.

 

잘 보았다 싶으시면, 링크추가나 손가락을 눌러주세요ㅋㅋ

 

 

Posted by C언어 보이
|