본문 바로가기

학습공간/C, 자료구조와 알고리즘

[3장] 배열, 구조체, 포인터

반응형

배열, 구조체, 포인터에 대한 문제풀이 내용이다.
배열(Arrays)이란?

 - 같은 형의 변수를 여러개 만드는데 사용된다. 반복 코드 등에서 배열을 사용하면 효율적 프로그래밍이 가능하다.

구조체(Struct)이란?

 - 하나 이상의 변수를 묶어서 좀더 편하게 사용할 수 있도록 도와주는 도구이다.

 - 똑같은 구조의 변수를 여러번 사용할 경우 유용하다.

포인터(Pointer)이란?

 - 변수의 주소를 가리키는 것이다.

 - 포인터 변수를 선언하여 주소를 저장하게 되면 그 변수의 주소를 가리키게 되는 것이다.

아래 문제들을 풀어보자.

 

01. C 언어에서의 배열에 대하여 다음 중 맞는 것은?
(1) 3차원 이상의 배열은 불가능하다.
(2) 배열의 이름은 포인터와 같은 역할을 한다.
(3) 배열의 인덱스는 1에서부터 시작한다.
(4) 선언한 다음, 실행 도중에 배열의 크기를 변경하는 것이 가능하다.

02. 다음 중 배열에 관한 문장 중 문법에 맞지 않는 것은?
(1) int a[]={1,2,3,4};
(2) char b[10], c[10];
(3) char **pa[10];
(4) char *pb[10]="I am a student";


03. float a[100] 으로 선언된 배열의 시작 주소를 1000번지라고 할 때, 배열의 10번째 요소의 주소는 몇 번지인가?
(1) 1000번지
(2) 1010번지
(3) 1020번지
(4) 1040번지


04. 구조체에 관한 내용 중 틀린 것은?
(1) 구조체의 배열이 가능하다.
(2) 구조체 변수에 대하여 비교연산이나 산술연산을 할 수 있다.
(3) 구조체 안에 배열을 넣을 수 있다.
(4) 서로 다른 데이터 형도 묶을 수 있다.


05. int i = 10; int *p; p = &i; *p = 8;의 문장이 수행되면 i값은 얼마인가?
(1)11 (2)10 (3)9 (4)8


06. int i = 10; int *p; p = &i; (*p)-- = 5;의 문장이 수행되면 i값은 얼마인가?
(1)11 (2)10 (3)9 (4)8


07. int a[10]; int *p; p = a; *p++ = 5;의 문장이 수행되면 변경되는 배열의 요소는?
(1)a[0] (2)a[1] (3)a[2] (4)a[3]


08. int a[10]; int *p; p = a; *++p = 5;의 문장이 수행되면 변경되는 배열의 요소는?
(1)a[0] (2)a[1] (3)a[2] (4)a[3]


09. int a[10]; int *p; p = a; (*p)++;의 문장이 수행되면 변경되는 배열의 요소는?
(1)a[0] (2)a[1] (3)a[2] (4)a[3]


10. int a[10]; int *p; p = a; *(p+1)++;의 문장이 수행되면 변경되는 배열의 요소는?
(1)a[0] (2)a[1] (3)a[2] (4)a[3]


11. int a[10]; int *p; p = a; (*(p+1))++;의 문장이 수행되면 변경되는 배열의 요소는?
(1)a[0] (2)a[1] (3)a[2] (4)a[3]


12. struct { int fa; int fb;} a; int *p=&a; 라고 할때 fa를 수정하는 문장으로 맞는 것은?
(1) p.fa = 10; (2) p->a.fa = 10; (3) (*p).fa = 10; (4) p[0].fa = 10;


13. 다음과 같은 문장을 수행하고 난 뒤의 a[0]의 값은?
void sub(int b[])
{ b[0] = 0; }
void main()
{ int a[] = {1,2,3,4,5,6}; sub(a); }
(1)0 (2)1 (3)2 (4)3


14. 다음과 같은 문장을 수행하고 난 뒤의 a.field1의 값은?
struct test { int field1; };
void sub(struct test b)
{ b.field1 = 1; }
void main()
{ struct test a = {0}; sub(a); }
(1)-1 (2)0 (3)1 (4)2


15. 다음과 같은 문장을 수행하고 난 뒤의 a.field1의 값은?
struct test { int field1; };
void sub(struct test *b)
{ b->field1 = 1; }
void main()
{ struct test a = {0}; sub(&a); }
(1)-1 (2)0 (3)1 (4)2


16. 다음 코드에서 잘못된 곳을 찾아라.
main()
{ int i, a[10];
for(i=0; i<=10; i++)             <--- for(i=0; i<10; i++)
a[i] = 0;
}


17. 다음과 같이 정의된 배열의 10번째 요소의 주소는? 단 배열의 시작 주소는 1000번지.
(a) char a[100]; 1010번지
(b) short b[100]; 1020번지
(c) int c[100]; 1040번지
(d) float d[100]; 1040번지


18. 크기가 5인 정수 배열을 생성하고 {1,2,3,4,5}로 초기화하는 문장을 쓰시오.
int a[5] = {1,2,3,4,5};


19. 구조체 배열을 만들어 보자. 정수 항목인 number와 문자열 항목인 name을 가지는 구조체를 정의하고 크기가 100인 이 구조체의 배열을 생성해보라.
struct student {
int number;
char *name;
};
struct student a[100];

 

22. 다음의 각각의 문장들을 수행한 다음에 변수들과 포인터들이 서로 연결된 모습을 그림으로 그려라.
void main()
{
 int i = 10, j = 20;
 int *pa = &i, *pb = &j;
 *pa = *pb;
 pa = pb;
}


23. 포인터 p1과 p2가 선언되어 있을 때 다음의 문장의 의미를 구별하여 설명하여 보라.
(1) p1 = p2;  p1이 가리키는 값의 주소에 p2가 가리키는 값의 주소를 대입.
(2) *p1 = *p2;  p1이 가리키는 값에 p2가 가리키는 값을 대입.

 

26.

#include <stdio.h> 
void main()
{
 char s,*p;
 char x[6]={1,2,3,4,5,6};
 
 p=&x[2];
 s= *(p+3) * *(p-2);
 printf("*(p+3) = %d\n",*(p+3));
 printf("*(p-2) = %d\n",*(p-2));
 printf("*(p+3) X *(p-2) = %d\n",s );
}

 

27. 1개의 정수와 최대크기가 20인 문자열로 이루어진 구조체를 저장할 수 있도록 동적 메모리를 할당받고 여기에 정수 100과 문자열 "just testing"을 저장한 다음, 동적 메모리를 반납하는 프로그램을 작성하라.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

 

struct person{
int age;
char name[20];
};

void main()
{
struct person *A;
A=(struct person *)malloc(sizeof(struct person));

A->age = 100;
strcpy(A->name, "just testing");
printf("%d\n %s\n", A->age, A->name);

free(A);
}

28. C 언어의 typedef을 이용하여 complex라고 하는 새로운 자료형을 정의하라.

complex 자료형은 구조체로서 float형인 real변수와 역시 float형인 imaginary 변수를 갖는다. complex 자료형으로 변수 c1과 c2를 선언하여 보라.
typedef struct{
float real;
float imaginary;
}complex;

complex c1,c2;

29. person이라는 구조체를 만들어보자. 이 구조체에는 문자 배열로 된 이름, 사람의 나이를 나타내는 정수 값, 각 개인의 월급을 나타내는 float 값 등이 변수로 들어가야 한다.
struct person{
char name[10];
int age;
float money;
};


다항식의 덧셈
#include <stdio.h>
#include <stdlib.h>

#define MAX(a,b) (((a) > (b))?(a):(b))
#define MAX_DEGREE 101

typedef struct {
int degree;
float coef[MAX_DEGREE];
} polynomial;
polynomial poly_add1 (polynomial A, polynomial B)
{
polynomial C;

int Apos =0, Bpos = 0, Cpos = 0;
int degree_a = A.degree;
int degree_b = B.degree;
C.degree = MAX(A.degree, B.degree);

while(Apos <= A.degree && Bpos <= B.degree)
{
if(degree_a > degree_b)
{
C.coef[Cpos++] = A.coef[Apos++];
degree_a--;
}
else if(degree_a == degree_b)
{
C.coef[Cpos++] = A.coef[Apos++] + B.coef[Bpos++];
degree_a--; degree_b--;
}
else 
{
C.coef[Cpos++] = B.coef[Bpos++];
degree_b--;
}
}
return C;
}

void poly_print(polynomial *c)
{
int i, j=0;
for(i=c->degree;i>=0;i--)
{
if(i == 0)
{
printf("%.0f\n",c->coef[j]);
break;
}
if(c->coef[j] != 0)
{
printf("%.0fx**%d + ",c->coef[j], i);
}

j++;
}
}

void main()
{
polynomial a = {5, {3, 6, 0, 0, 0, 10}};
polynomial b = {4, {7, 0, 5, 0, 1}};
polynomial c;
c = poly_add1(a,b);
poly_print(&c);
}

반응형

'학습공간 > C, 자료구조와 알고리즘' 카테고리의 다른 글

[5장] 큐  (0) 2019.11.22
[4장] 스택  (0) 2019.11.22
[2장] 순환  (0) 2019.11.21
[1장] 자료구조와 알고리즘  (3) 2019.11.21
[Intro] 자료구조 학습공간  (0) 2019.11.21