프로그래밍 언어 활용 - 2
포인터
변수의 주소를 포인터라고 하며, 포인터를 저장할 수 있는 변수를 포인터 변수라고 한다.
- C 문제
#include <stdio.h>
main()
{
int a = 50;
int *b = &a;
*b = *b + 20;
printf("%d, %d\n", a, *b);
char *s;
s = "ksw";
for (int i = 0; i < 3; i += 2)
{
printf("%c, ", s[i]);
pritnf("%c, ", *(s + i));
printf("%s\n", s + i);
}
}
- 풀이 및 답
- *b = &a 이므로 b가 가리는 주소는 a이며, a의 값은 50이다.
- b = b + 20 = &a + 20 = 50 + 20 = 70
- 따라서 a와 *b는 각각 70, 70이다.
- s = ksw
- ksw는 각각 &s[0], &s[1], &s[2]
- 따라서 s[i]는 s[0]의 값을 문자로 출략 후 쉼표와 공백 한 칸 출력
- printf("%c, ", s[i])는 k,
- *(s + i)는 (s + 0)이 가리키는 곳의 값을 문자로 출력 후 쉼표와 공백 한 칸 출력
- printf("%c, ", *(s + i))는 k, k,
- (s + i)는 (s + 0)의 위치부터 문자열의 끝까지 모든 문자를 하나의 문자열로 출력 후 커서를 다음줄의 처음으로 옮긴다.
- 최종적으로 출력되는 값은 다음과 같다.
70, 70
k, k, ksw
구조체
- 개요
자료의 종류가 다른 변수의 모임
- 정의
정의한다는 의미는 int나 char같은 자료형을 하나 만드는 것을 의미함
- 변수 선언
int a와 같이 선언 후 사용하는 것처럼 구조체 변수를 사용하려면 먼저 정의한 구조체에 대한 변수를 선언해야한다.
- 멤버의 지정
구조체의 멤버는 모든 요소들이 개별적인 이름을 가지고 있으므로 구조체
- '.'에 의한 지정 : 구조체 일번 변수를 이용해 구조체 멤버를 지정할 때
- '->'에 의한 지정 : 구조체 포인터 변수를 이용해 구조체 멤버를 지정
- 구조체의 포인터 변수는 일반 포인터 변수처럼 *를 사용하여 멤버를 지정할 수 있음
- C 문제
#include <stdio.h>
struct jsu
{
char nae [12];
int os, db, hap, hhap;
};
int main()
{
struct jsu st[3] = {{"data1", 95, 88}, {"data2", 84, 90}, {"data3", 85, 75}};
struct jsp* p;
p = &st[0];
(p + 1)->hap = (p + 1)->os + (p + 2)->db;
(p + 1)->hhap = (p + 1)->hap + p->os + p->db;
printf("%d", (p + 1)->hap + (p + 1)->hhap);
}
- 해설 및 답
- 구조체 jsu 자료형으로 3개짜리 배열 st를 선언 후 초기화
- 구조체 jsu의 포인터 변수 p를 선언
- p에 st배열의 첫 번째 요소의 주소를 저장
- p+1이 가리키는 곳의 멤버 hap에 p+1이 가리크는 곳의 멤버 os값과 p+2가 가리키는 곳의 멤버 db값을 합한 후 저장
- p가 st[0], p+1은 st[1], p+2는 st[2]를 각각의 값으로 더한 159를 st[1]에 저장
- p+1이 가리키는 hhap에 p+1이 가리키는 hap의 값과 p가 가리키는 os와 db값을 모두 더한 후 저장
- 각각의 값을 모두 저장한 342를 st[1] hhap에 저장
- p+1이 가리키는 hap과 hhap의 값을 더한 후 정수로 출력
- 따라서 159 + 342더한 값을 출력
501
사용자 정의 함수
- 개요
사용자가 직접 만들어 사용하는 함수
- C 문제
재귀 함수를 이용해 팩토리얼 연산을 수행하는 프로그램의 실행 결과 확인
#include <stdio.h>
int factorial(int n);
main()
{
int (*pf)(int);
pf = factorial;
printf("%d", pf(3));
}
int factorial(int n)
{
if (n <= 1)
return 1;
else
return n * factorial(n - 1);
}
- 해설 및 답
- 정수형 인수 한 개를 받는 정수형 함수 포인터 pf 선언
- factorial()의 시작 주소를 포인터 pf에 저장
- 3을 인수로 하여 pf()함수를 호출해 돌려받은 값을 정수형으로 출력
- factorial()이 3을 전달 받았으므로 n = 3
- if()의 조건에 따라 n * factorial(n - 1) 수행
- factorial(n - 1) = 2이므로 factorial(2)인 상태로 호출
- 따라서 n = 2d이며, if()의 조건에 따라 factorial(1)인 상태로 호출
- 7번 결과에 따라 n = 1이고 if()문의 조건에 따라 1을 반환
- 1을 반환했으므로 2를 반환하며 제어를 factorial(2)를 호출했던 단계로 재귀
- 2를 반환했으므로 6을 반환하며 제어를 factorial(3)를 호출했던 단계로 재귀
- 6을 반환했으므로 돌려받은 값 6을 정수형으로 출력 후 프로그램 종료
6
Author And Source
이 문제에 관하여(프로그래밍 언어 활용 - 2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@swkiim/programming-lang-2
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
자료의 종류가 다른 변수의 모임
정의한다는 의미는 int나 char같은 자료형을 하나 만드는 것을 의미함
int a와 같이 선언 후 사용하는 것처럼 구조체 변수를 사용하려면 먼저 정의한 구조체에 대한 변수를 선언해야한다.
구조체의 멤버는 모든 요소들이 개별적인 이름을 가지고 있으므로 구조체
- '.'에 의한 지정 : 구조체 일번 변수를 이용해 구조체 멤버를 지정할 때
- '->'에 의한 지정 : 구조체 포인터 변수를 이용해 구조체 멤버를 지정
- 구조체의 포인터 변수는 일반 포인터 변수처럼 *를 사용하여 멤버를 지정할 수 있음
#include <stdio.h>
struct jsu
{
char nae [12];
int os, db, hap, hhap;
};
int main()
{
struct jsu st[3] = {{"data1", 95, 88}, {"data2", 84, 90}, {"data3", 85, 75}};
struct jsp* p;
p = &st[0];
(p + 1)->hap = (p + 1)->os + (p + 2)->db;
(p + 1)->hhap = (p + 1)->hap + p->os + p->db;
printf("%d", (p + 1)->hap + (p + 1)->hhap);
}
- 해설 및 답
- 구조체 jsu 자료형으로 3개짜리 배열 st를 선언 후 초기화
- 구조체 jsu의 포인터 변수 p를 선언
- p에 st배열의 첫 번째 요소의 주소를 저장
- p+1이 가리키는 곳의 멤버 hap에 p+1이 가리크는 곳의 멤버 os값과 p+2가 가리키는 곳의 멤버 db값을 합한 후 저장
- p가 st[0], p+1은 st[1], p+2는 st[2]를 각각의 값으로 더한 159를 st[1]에 저장
- p+1이 가리키는 hhap에 p+1이 가리키는 hap의 값과 p가 가리키는 os와 db값을 모두 더한 후 저장
- 각각의 값을 모두 저장한 342를 st[1] hhap에 저장
- p+1이 가리키는 hap과 hhap의 값을 더한 후 정수로 출력
- 따라서 159 + 342더한 값을 출력
501
- 개요
사용자가 직접 만들어 사용하는 함수
- C 문제
재귀 함수를 이용해 팩토리얼 연산을 수행하는 프로그램의 실행 결과 확인
#include <stdio.h>
int factorial(int n);
main()
{
int (*pf)(int);
pf = factorial;
printf("%d", pf(3));
}
int factorial(int n)
{
if (n <= 1)
return 1;
else
return n * factorial(n - 1);
}
- 해설 및 답
- 정수형 인수 한 개를 받는 정수형 함수 포인터 pf 선언
- factorial()의 시작 주소를 포인터 pf에 저장
- 3을 인수로 하여 pf()함수를 호출해 돌려받은 값을 정수형으로 출력
- factorial()이 3을 전달 받았으므로 n = 3
- if()의 조건에 따라 n * factorial(n - 1) 수행
- factorial(n - 1) = 2이므로 factorial(2)인 상태로 호출
- 따라서 n = 2d이며, if()의 조건에 따라 factorial(1)인 상태로 호출
- 7번 결과에 따라 n = 1이고 if()문의 조건에 따라 1을 반환
- 1을 반환했으므로 2를 반환하며 제어를 factorial(2)를 호출했던 단계로 재귀
- 2를 반환했으므로 6을 반환하며 제어를 factorial(3)를 호출했던 단계로 재귀
- 6을 반환했으므로 돌려받은 값 6을 정수형으로 출력 후 프로그램 종료
6
Author And Source
이 문제에 관하여(프로그래밍 언어 활용 - 2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@swkiim/programming-lang-2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)