반응형

【 C 언어 】 #38 구조체 이해하기



 구조체는 구조적인 프로그래밍을 작성하기 위해 사용되며, 배열과 비슷한 구조를 띄고 있다. 배열과 다른 점은,  배열은 동일한 데이터형에 대하여 여러개를 정의 하는 것이고, 구조체는 서로 다른 데이터형을 하나의 묶음으로 처리(관리)하기 위해 사용되는 차이점이 있다. 또한 C++에서의 클래스(class)라는 개념으로 바뀌어 사용된다. 


▶ 문제  : 국,영,수 3과목 성적 값의 평균을 구하는 문제를 구조체를 사용하여 작성하라.



▶ 포인트 


- 구조체는 같은 유형의 데이터가 아니더라도 하나의 묶음(구조)으로 관리 할 수 있어 , 좀 더 편하게 프로그래밍을 짤 수 있게 해준다. 

- 묶어야 할 요소들을 "struct XXX" {  ...   };  형태로 선언 한다. 

- 메인 함수내에서 변수명과 함께 선언하게 되면(struct XXX YY; )  , 

  YY.kor = 100;   형태로 구조체 내에 있는 요소들을 활용 할 수 있다.



▶ 프로그램 : 




▶ 실행 결과 :


▶ 보충설명 :


- 구조체 이름은 서로 다를 수 있는 개체들을 묶은 템플릿의 이름에 해당 된다. 

  (주의 : 구조체 선언의 끝( '}' )에 ';' 세미콜론을 넣어야 한다.


- 구조체를 사용하기 위해서는 변수명을 하나 정하여 구조체를 선언해야 사용할 수 있다.   ( struct Average SCORE; )   주의 : 반드시 선언부 끝에 세미 콜론이 들어감.


- 구조체 사용은 SCORE.kor 형태로 ,  선언명(SCORE) 과 사용하고자 하는 요소값을 ' . ' 로 연결하여 사용한다.  

 (예, 국어 점수 kor에 100점 입력하기 : SCORE.kor = 100; )


 - 구조체를 배열 형태로 사용할 수 도 있다. 

 (예,  struct Average KOR[10];     : 국어 점수 10개를 배열 형태로 사용할  수 있다.  KOR[0] , KOR[1] , ....  KOR[9]   )

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



▶ 응용 연습 문제 1 :   위 프로그램을 기본으로 국어 점수 3개를 구조체 배열을 사용하여 평균값을 구하여라. 



▶ 프로그램1 :  (아래 코딩에서 빠진 영어, 수학 성적도 추가 해 넣으면 된다.)




▶ 실행 결과1 :




▶ 소스코드 다운로드 :  


38 구조체 이해하기.cpp


38 구조체 이해하기2.cpp






반응형

【 C 언어 】 #37 NULL 널 문자 이해하기

Language/C & C++ 2018. 5. 3. 11:03 Posted by 엑소더스팩토리
반응형

【 C 언어 】 #37 NULL 문자 이해하기



 문자열 길이를 구하는 문제를 통해 NULL 문자에 대해 이해 할 수 있다.  


▶ 문제  : 문자열 길이(예, abcdefg: 길이 7) 를 구하는 코드를 작성하라. 



▶ 포인트 


- 문자열의 끝은 항상 NULL('\0')문자 로 종료된다.

NULL 문자는 아스키 코드 값  '0' 이다

- 문자열 길이를 구하는 함수를 따로 작성하여 코딩한다.

- 문자형 포인터 변수(*pstr)를 사용하여 코딩한다.

- *pstr 은 pstr이 가리키는 번지에 저장되어 있는 값을 의미한다. 



▶ 프로그램 : 


# 이미지를 클릭하면 확대 되어 선명하게 보실 수 있습니다.


▶ 실행 결과 :


▶ 보충설명 :


- *pstr 은 pstr이 가리키는 번지에 저장되어 있는 값을 의미한다.  따라서 pstr은 번지(주소) 라는 것을 이해 해야 한다.

- pstr은 문자열의 선두 번지를 가리키고 있기 때문에, pstr의 번지가 1씩 증가(pstr++)함에  따라 *pstr의 값은 첫 번째 값 a 부터...  b, c, d, e, f, g, \0  처럼 된다.

- while문에서 NULL문자('\0') 의 아스키 값은 '0' 이기 때문에 문자열 끝을 알리는 NULL 문자를 만나면 while 문을 빠져 나오게 된다.

- pstr++;   은 pstr의 번지를 1만큼 증가 시킨다(pstr은 포인터 변수 이기 때문)

- len++;   은 문자열 길이 값을 1만큼 증가 시킨다


 문자열 'abcdefg' 가 메모리에 저장된 모습을 그림으로 그려 보면 아래와 같다.

문자열의 첫 번째 a가 저장된 번지를 '1000'번지라고 가정 해 보자.


# 이미지를 클릭하면 확대 되어 선명하게 보실 수 있습니다.


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



▶ 소스코드 다운로드 :  


37 NULL 넌 문자 이해하기-코드.cpp






반응형

【 C 언어 】 #36 문자열 포인터 이해하기

Language/C & C++ 2018. 4. 23. 17:28 Posted by 엑소더스팩토리
반응형

【 C 언어 】 #35 문자열 포인터 이해하기



 포인터 는 C언어에서 종종 중요하게 사용된다. 포인터를 이용하여 메모리로 직접 접근이 용의하고 하드웨어적인 부분을 직접 컨트롤 할 수 있기 때문이다.

다만 처음 개념 이해가 어려울 수 있으나 예제 내용을 바꾸어가며 테스트해 보면 비교적 쉽게 이해될 것이다. 

 앞선 글에서 정수형 변수를 가지고 포인터를 활용하는 법을 설명하였는데, 문자열도 문자열 포인터 변수로 선언하여 분신으로 사용 가능하다.  단, 이때는 분신연산자(&)를 붙이지 않고 선언한다. 예를 들면, "RasINO"를 'RINO'라는 문자열 포인터로  선언하게 되면, "RasINO"를 사용할 모든 곳에 RINO라고 사용할 수 있다.  또한 배열 포인터 형태로 사용하면 된다.


▶ 문제  : 문자열 "RasINO" 를 문자열 포인터 변수로 선언하고 출력하라.



▶ 포인트 


- 문자나 문자열은 puts();  함수를 이용하여 출력한다. 

- 문자열은 "  " 이중따움표로 표시한다.

- 문자열"RasINO"를 배열에 넣고 배열을 문자열 포인터로 지정한다



▶ 프로그램 : 




▶ 실행 결과 :


▶ 보충설명 :


string[0] 과 pstr[0]은 그 값이 같다

문자열 포인터 선언시에는 분신연산자 '&'를 사용하지 않음에 유의 한다. 

단, 배열의 특정 요소부터 출력시킬 때는 '&'를 사용해야 한다. 

(예, pstr2 = string; 

     puts (&psr2[1])   // 'sINO'  가 출력 됨)





+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



▶ 소스코드 다운로드 :  


36 문자열 포인터 이해하기-코드.cpp





반응형

【 C 언어 】 #35 포인터 이해하기

Language/C & C++ 2018. 4. 23. 14:02 Posted by 엑소더스팩토리
반응형

【 C 언어 】 #35 포인터 이해하기



 포인터 는 C언어에서 종종 중요하게 사용된다. 포인터를 이용하여 메모리로 직접 접근이 용의하고 하드웨어적인 부분을 직접 컨트롤 할 수 있기 때문이다.

다만 처음 개념 이해가 어려울 수 있으나 예제 내용을 바꾸어가며 테스트해 보면 비교적 쉽게 이해될 것이다. 

포인터 변수는 원변수의 분신의 역할을 하게 되고 원변수가 가지는 똑같은 값을 지닌다. 즉, 원변수의 값이 바뀌면 포인트 변수의 값이 똑 같은 값으로 바뀌며, 그 반대도 마찬 가지다. 


▶ 문제  : 변수 두 개를 선언후 각각의 포인터 변수를 선언하고 변수 내용을 바꾸면 포인터 변수의 내용도 바뀌는지 확인하는 프로그램을 작성하라.


▶ 포인트 


- mainA 변수에 포인터 변수 *ghost, mainB 변수에 포인터 변수 *pman 을 지정


- 포인터 변수 선언 :   int* ghost

- 지정 방법 :  변수명에 '&'를 붙이고 포인트 변수에 대입 ghost =&mainA 



▶ 프로그램 : 




▶ 실행 결과 :



▶ 보충설명 :


ghost = &manA; // manA의 분신으로 포인터 변수인 ghost를 지정 

*ghost = 1;       //분신 관계 이므로 *ghost에 입력한 1값이 manA에도 저장 됨

printf("manA = %d, *ghost=%d \n\n",manA, *ghost);  // 값 확인 

manA = 2; // manA에 2를 입력해도 분신 *ghost에 2가 저장됨 

printf("manA = %d, *ghost=%d \n\n",manA, *ghost);

pman = &manB; // manB의 분신으로 포인터 변수인 pman을 지정 

*pman = 3; // 분신인*pman에 3를 입력하면 manB에도 3이 저장됨 

printf("manB = %d, *pman=%d \n\n",manB, *pman);

pman = &manA; //manB의 분신으로 지정한 pman을 manA에 추가로 분신                      // 지정 하면 manB에는 분신이 없는(해제) 상태가 되고 

       // manA는 기존 분신 *ghost에 ,  *pman까지 새로 추가된다. 

*pman = 4;       // pman은 현재 manA의 분신이다. 

printf("manA=%d, *pman=%d, *ghost=%d, manB=%d,  \n\n", manA, *pman, *ghost, manB);

manA = 5;      // manA의 분신으로 ghost, pman 두개가 지정 되어 있다. 

printf("manA=%d, *pman=%d, *ghost=%d, manB=%d,  \n\n", manA, *pman, *ghost, manB);  

*ghost = 6;

printf("manA=%d, *pman=%d, *ghost=%d, manB=%d,  \n\n", manA, *pman, *ghost, manB);

manB = 7;     // manB 값을 바꾸어도 분신해제된 pman값은 변하지 않는다  

printf("manA=%d, *pman=%d, *ghost=%d, manB=%d,  \n\n", manA, *pman, *ghost, manB);



[ 코드에 실행시 결과 값 표시 ]




+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



▶ 소스코드 다운로드 :  


35 포인터 이해하기.cpp


반응형