배열, 구조체, 포인터에 대한 문제풀이 내용이다.
배열(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 |