C

C - 자료구조 3장 연습문제 풀이

해변 2022. 4. 7. 17:27

1.

int a[10][20]에서 배열이 차지하는 메모리 공간의 크기는 얼마인가?
정답은 4(int 자료형의 크기)x10x20 = 800바이트

2.

float a[100]으로 선언된 배열의 시작 주소를 1000번지라고 할 때, 배열의 10번째 요소의 주소는 몇 번지인가?
float 자료형의 크기는 4이다.
1000+(4*10) 이므로 정답은 1040번지이다.

3.

다음의 배열 중에서 크기가 가장 큰 배열은?
(1)int array1[10] 			(2)double array2[10]
(3)char array3[40]			(4)float array4[10]

(1)4*10 = 40
(2)8*10 = 80
(3)1*40 = 40
(4)4*10 = 40
이므로 정답은 (2)이다.

4.

크기가 10인 배열 two를 선언하고 여기에 2의 제곱 값들을 저장해보자. 즉 배열의 첫번째 요소에는 2^0을
저장하고 두번째 요소에는 2^1값을 저장한다. 마지막 요소에는 2^9값을 저장한다.
for문을 이용하여 two[]배열의 전체 요소의 값을 출력하는 프로그램을 작성하라

void print(int two[]) {
	for (int i = 0; i < 10; i++) {
		printf("%d", two[i]);
	}
}

5.

person이라는 구조체를 만들어보자. 이 구조체에는 문자 배열로 된 이름, 사람의 나이를 나타내는 
정수값, 각 개인의 월급을 나타내는 float 값 등이 변수로 들어가야한다

typedef struct {
	char name[10];
	int age;
	float money;
}person;

6.

C언어의 typedef를 이용하여 complex라고 하는 새로운 자료형을 정의하라. complex 자료형은
구조체로서 float형인 real 변수와 역시 float형인 imaginary 변수를 갖는다.
complex 자료형으로 변수 c1과 c2를 선언하여보라.

typedef struct {
	float real;
	float imaginary
}complex;

int main(void) {
 
	complex c1;
	complex c2;
}

7.

복소수를 구조체로 표현해보자. 복소수 a와 복소수 b를 입력받아서 a+b를 계산하는 함수를
작성해보자. 함수는 구조체를 반환할 수 있다. 복소수는 real+imag*i와 같은 형태를 가진다.

#include <stdio.h>

typedef struct {
	float real;
	float imaginary
}complex;

complex complex_add(complex a, complex b) {
	complex result;
	result.real = a.real + b.real;
	result.imaginary = a.imaginary + b.imaginary;
	return result;
}

8.

크기가 n인 배열 array에서 임의의 위치 loc에 정수 value를 삽입하는 함수 insert()를 작성하라.
정수가 삽입되면 그 뒤에 있는 정수들은 한 칸씩 뒤로 밀려야 한다.
현재 배열에 들어있는 원소의 개수는 items개라고 하자.(items << n 이라고 가정)


void insert(int array[], int loc, int value) {
	int temp;
	for (int i = items - 1; i >= loc; i--) {
		array[i + 1] = array[i];
	}
	array[loc] = value;
	items++;
    return temp;
}

9.

앞의 문제에서 구현한 insert() 함수의 시간 복잡도는?

배열에 들어있는 원소의 개수를 n개라고 가정하면 loc = 0(최악의 경우)일 때
모든 n개의 원소를 한칸씩 뒤로 밀어내야 하므로 시간복잡도는 O(n)이다,

10.

크기가 n인 배열 array에서 임의의 위치 loc에 있는 정수를 삭제하는 함수 delete()를 작성하라.
정수가 삭제되면 그 뒤에 있는 정수들은 한칸씩 앞으로 이동하여야 한다.
현재 배열에 들어있는 원소의 개수는 items개라고 하자.(items << n라고 가정)

void delete(int array[], int loc) {
	int temp = array[loc];
	for (int i = loc; i<items-1; i++) {
		array[i] = array[i+1];
	}
	array[items-1] = 0;
	items--;
	return temp;
}

11.

앞의 문제에서 구현한 delete() 함수의 시간 복잡도는?

배열에 들어있는 원소의 개수를 n개라고 가정하면 loc = 0(최악의 경우)일 때
가장 앞에 있는 원소를 삭제하는 경우 나머지 원소(n-1)를 한칸씩 앞으로 당겨야 하므로
시간 복잡도는 O(n)이다.

12.

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
	int num;
	char str[20];
}a;

int main(void) {
	a* A;
	A = (a*)malloc(sizeof(a));
	A->num = 100;
	strcpy(A->str, "just testing");
	printf("%d\n", A->num);
	printf("%s", A->str);
	free(A);
}

출력 결과

100
just testing