Language

언어 수업자료/C언어

C++ 25-02

초코렛맛 2025. 2. 15. 14:54

수업자료

비주얼 스튜디오 다운로드

C라이브러리

 

 

 

  2월 15일 - 1일차



구조체 메모리 할당

함수 사용시 마다 메모리를 할당 후 추가 되는 구조체 

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

int ix = 0;

typedef struct {
    int a;
    char* n;
}s;

s* f(s* a, int b, char* c) {
    s* n = malloc(sizeof(s) * (++ix));
    for (int i = 0; i < ix - 1; i++) {
        n[i].a = a[i].a;
        n[i].n = malloc(10);
        n[i].n = a[i].n;
    }
    n[ix - 1].a = b;
    n[ix - 1].n = malloc(10);
    n[ix - 1].n = c;
    free(a);
    return n;
}

void pr(s* s) {
    for (int i = 0; i < ix; i++) {
        printf("이름 : %s\n", s[i].n);
        printf("나이 : %d\n\n", s[i].a);
    }
}

void main() {

    s* a = malloc(sizeof(s));
    a = f(a, 22, "홍길동");
    a = f(a, 33, "백두산");
    a = f(a, 11, "안녕");
    pr(a);


}

 

추가 수정 삭제 가능한 구조체

함수 사용시 마다 메모리를 할당 후 추가 되는 구조체 

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

typedef struct {
    int number;
    int age;
    char name[10];
}st;

st z[3] = { {1,20,"홍길동"},{2,30,"백두산"},{3,40,"한라산"}};
st* a = z;
int id = 3;

void pr() {
    for (int i = 0; i < id; i++) {
        printf("번호 : %d 나이 : %d 이름 : % s\n", a[i].number, a[i].age, a[i].name);
    }
}

void sc() {
    printf("검색 번호 : ");
    for (int i = 0; i < id; i++) {
        printf("%d ", a[i].number);
    }
    printf("몇번 >> ");
    int asd;
    scanf("%d", &asd);
    printf("번호 : %d 나이 : %d 이름 : % s\n", 
        a[asd - 1].number, a[asd - 1].age, a[asd - 1].name);
}

void del() {
    printf("검색 번호 : ");
    for (int i = 0; i < id; i++) {
        printf("%d ", a[i].number);
    }
    printf("몇번 >> ");
    int asd;
    scanf("%d", &asd);
    st* ne = malloc(sizeof(st) * (id-1));
    int c = 0;
    for (int i = 0; i < id; i++) {
        if (i == asd - 1) continue;
        ne[c].number = c + 1;
        ne[c].age = a[i].age;
        for (int j = 0; j < 10; j++) {
            ne[c].name[j] = a[i].name[j];
        }
        c++;
    }
    id--;
    a = ne;
}

void ip() {
    
    st* ne = malloc(sizeof(st)*(++id));
    for (int i = 0; i < id - 1; i++) {
        ne[i].number = i + 1;
        ne[i].age = a[i].age;
        for (int j = 0; j < 10; j++) {
            ne[i].name[j] = a[i].name[j];
        }
    }
    ne[id - 1].number = id;
    printf("이름 입력 >> ");
    scanf("%s", ne[id - 1].name);
    printf("나이 입력 >> ");
    scanf("%d", &ne[id - 1].age);
    
    a = ne;
    
}

void play() {
    int num;
    while (1) {
        printf("====메뉴===\n");
        printf("1.입력 2. 출력 3. 검색 4. 삭제 5. 종료\n");
        printf("선택 >> ");
        scanf("%d", &num);
        switch (num) {
        case 1:
            ip();
            break;
        case 2:
            pr();
            break;
        case 3:
            sc();
            break;
        case 4:
            del();
            break;
        case 5:
            return;
        }
        printf("\n\n");
    }
}

void main() {
    
    play();

}

 

연결형 리스트

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

typedef struct {
	char* data;
	struct st* next;
}st;

void pr(st* a) { // 전체 출력
	a = a->next;
	while (a != NULL) {
		printf("%s\n", a->data);
		a = a->next;
	}
}
void add(st* a, char* data) { //뒤에 자료 추가
	while (a->next != NULL) { 
		a = a->next;
	}
	st* ad = malloc(sizeof(st));
	a->next = ad;
	ad->next = NULL;
	ad->data = data;
}
void del(st* a) { // 맨뒤에 삭제
	st* b;
	while (a->next != NULL) {
		b = a;
		a = a->next;
	}
	b->next = NULL;
	free(a);
}
void ldel(st* a, char* data) { // 데이터가 맞는 곳 뒤 삭제
	while (a->data != data) {
		a = a->next;
	}
	st* b = a->next;
	a->next = NULL;
	while (b->next != NULL) { // 밑에있는 데이터 닫기
		st* c = b;
		b = b->next;
		free(c);
	}
	free(b); // 가장 밑에 있는 것 닫기
}

void can(st* a, char* data) { // 자신의 데이터만 삭제 밑에는 연결
	st* b;
	while (a->data != data) {
		b = a;
		a = a->next;
	}
	b->next = a->next;
	free(a);

}

int main() {

	st* head = malloc(sizeof(st));
	
	st* n1 = malloc(sizeof(st));
	head->next = n1;
	n1->data = "이순신";

	st* n2 = malloc(sizeof(st));
	n1->next = n2;
	n2->data = "백두산";

	st* n3 = malloc(sizeof(st));
	n2->next = n3;
	n3->data = "한라산";
	
	n3->next = NULL;

	add(head, "설악산");
	can(head, "백두산");
	pr(head);
	

	return 0;
}

 

 

 

 

 

 

  2월 16일 - 2일차


c언어의 확장

출력 std::cout << ""'; // printf("");

#include <iostream>


int main(void) {

	std::cout << "hello c1";
	std::cout << "hello c2" << std::endl;
	std::cout << "hello c3\n";
	printf("hello c1");
	printf("hello c2");

	
	return 0;
}

==========출력==========

hello c1hello c2
hello c3
hello c1hello c2

 

using namespace std;
string d (스트링 계열 변수 선정)

#include <iostream>
using namespace std;

int main() {

	int a = 1;
	float b = 3.14;
	char c = 'a';
	string d = "안녕하세요";
	
	cout << a << b << c << d << endl;
	printf("%d %f %c %s", a, b, c, d.c_str());
	return 0;
}

==========출력==========

13.14a안녕하세요
1 3.140000 a 안녕하세요

 

 

출력에 대한 함수

s[0] 인덱스에 맞는 값 출력
s.at(1) 인덱스에 맞는 값 출력 (s[1] 동일)
s.front() 첫번째 값 출력
s.back() 맨 뒤 값 출력
s.length() 길이 출력

#include <iostream>

int main() {

	string sa = "hello";

	// 출력
	cout << sa[0] << endl;
	cout << sa.at(1) << endl;
	cout << sa.front() << endl;
	cout << sa.back() << endl;
	cout << endl;

	cout << sa.length() << endl;


	return 0;
}

==========출력==========

h
e
h
o

5



 

입력

cin >> a a에 입력값을 넣으시오

#include <iostream>
using namespace std;

int main() {

	int a, b;
	cout << "정수를 입력하세요"<< endl;
	cin >> a >> b;
	cout << "입력한 값은 " << a << ", " << b << "입니다." << endl;
	scanf("%d", &a);
	scanf("%d", &b);
	printf("%d, %d", a, b);
    
    return 0;
	
}

==========출력==========

정수를 입력하세요
1
2
입력한 값은 1, 2입니다.
2
3
2, 3

 

 

문자열 입력 / 한글입력시 2개의 인덱스를 갖음

#include <iostream>
using namespace std;

int main() {

	string a;

	cout << "문자열을 입력해 주세요" <<endl;
	cin >> a;

	cout << a[0] <<endl;
	cout << a[0] << a[1] << endl;
	cout << a << endl;

	return 0;

}

==========출력==========

문자열을 입력해 주세요
안녕하세요

안
안녕하세요

==========출력==========

문자열을 입력해 주세요
hellow c
h
he
hellow

 

 

 

자료형 변수 초기화

자료형 변수 = 초기값
자료형 변수(초기값)

#include <iostream>
using namespace std;

int main() {

	int a = 10;
	cout << a << endl;

	int b(20);  //초기화에서 만 쓰임
	cout << b << endl;

	b = 30;
	cout << b << endl;

	string c("안녕하세요");
	cout << c << endl;

	return 0;

}

==========출력==========

10
20
30
안녕하세요


 

레퍼런스(reference) 변수 :: 참조 변수

자료형& 변수이름 = 복사할 변수
int i = 10;
int& re = i;

#include <iostream>
using namespace std;

int main() {

	int a = 10;
	int* b = &a;
	int& r = a;

	cout << a << endl;
	cout << *b << endl;
	cout << r << endl;

	a = 20;
	cout << a << endl;
	cout << *b << endl;
	cout << r << endl;

	*b = 30;
	cout << a << endl;
	cout << *b << endl;
	cout << r << endl;

	r = 1;
	cout << a << endl;
	cout << *b << endl;
	cout << r << endl;

	
	return 0;
}

==========출력==========

10
10
10
20
20
20
30
30
30
1
1
1

 

 

 

 

레퍼런스 (참조) 할 수 없는 것

상수, 함수, 식

#include <iostream>
using namespace std;

int add() {
	int a;
	a = 1 + 2;
	return a;
}

int main() {

	const int a = 1; //상수
	int& r = a; //에러
	int* p = &a; //에러
	int& r2 = add(); //함수 에러
	int& r3 = 1+2; //공식 에러
	
	return 0;
}

==========출력==========

에러

int& r = a (a라는 변수의 주소)
r = add() 함수의 값을 a변수에 넣는다.
&r

#include <iostream>

using namespace std;

int add() {
	int a;
	a = 1 + 2;
	return a;
}

int main() {
	
	int a;
	int& ra = a;
	int* pa = &a;
	a = 10;
	cout << a << endl;
	cout << ra << endl;

	ra = a + 16; // *pa = a + 1 동일
	cout << a << endl;
	cout << ra << endl;
	cout << endl;

	ra = add();
	cout << ra << endl;
	cout << &ra << endl;

	// &re = a + 1; // 에러  pa = a + 1 동일

	return 0;
}

==========출력==========

10
10
26
26

3
00000009B32FF784

 

 

레퍼런스 다른변수 주소 및 값 입력

다른 변수의 주소를 넣을 수 없음

#include <iostream>

using namespace std;


int main() {
	
	int v1 = 1;
	int v2 = 2;

	int& r = v1;
	&r = &v2;       //에러발생

	return 0;
}

 

다른 변수에 넣으면 그 값으로 변경 주소는 동일

#include <iostream>

using namespace std;


int main() {
	
	int v1 = 1;
	int v2 = 2;

	int& r = v1;
	cout << "v1 : " << v1 << endl;
	cout << "v2 : " << v2 << endl;
	cout << "r  : " << r << endl;
	cout << endl;

	r = v2;
	cout << "v1 : " << v1 << endl;
	cout << "v2 : " << v2 << endl;
	cout << "r : " << r << endl;
	cout << endl;

	r = 3;
	cout << "v1 : " << v1 << endl;
	cout << "v2 : " << v2 << endl;
	cout << "r  : " << r << endl;

	cout << "v1주소 : " << &v1 << endl;
	cout << "v2주소 : " << &v2 << endl;
	cout << "r 주소 : " << &r << endl;

	return 0;
}

==========출력==========

v1 : 1
v2 : 2
r  : 1

v1 : 2
v2 : 2
r : 2

v1 : 3
v2 : 2
r  : 3
v1주소 : 00000043A08FF614
v2주소 : 00000043A08FF634
r 주소 : 00000043A08FF614

 

레퍼런스를 함수에서 사용

#include <iostream>

using namespace std;


void change(int& r, int a) {
	r = a;
}

int main() {
	
	int n = 5;

	cout << n << "\n";

	change(n, 2);
	cout << n << endl;

	return 0;
}

==========출력==========

5
2

 

레퍼런스 함수 선언과 구성

void change(int&);   // 선언

void change(int& r) {  //정의
	r = 10;
}

 

레퍼런스 2개를 받아 값을 변화시키는 함수

#include <iostream>

using namespace std;

void sw(int& a, int& b) {
	int temp = a;

	a = b;
	b = temp;
}


int main() {
	
	int a = 1, b = 3;
	cout << "a : " << a  << "   &a : " << &a << endl;
	cout << "b : " << b  << "   &b : " << &b << endl;

	sw(a, b);
	cout << "a : " << a << "   &a : " << &a << endl;
	cout << "b : " << b << "   &b : " << &b << endl;


	return 0;
}

==========출력==========

a : 1   &a : 000000D9BF8FFB04
b : 3   &b : 000000D9BF8FFB24
a : 3   &a : 000000D9BF8FFB04
b : 1   &b : 000000D9BF8FFB24


 


for문

 

기본

for (초기조건; 반복조건; 증가 / 감소) {
반복내용
}

for (변수(원소) : 반복 가능한 객체) {
반복 내용;
}

#include <iostream>

using namespace std;


int main() {
	
	int arr[10] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };

	for (int i = 0; i < 10; i++) {
		cout << arr[i] << " ";
	}

	cout << endl;

	// 배열에 있는 값에 대해서 받음
	for (int i : arr) {
		cout << i << " ";
	}

	cout << endl;

	for (int j : arr) {
		cout << j << " ";
		++j;
	}

	cout << endl;


	for (int& k : arr) {
		++k;
		cout << k << " ";
	}

	cout << endl;

	return 0;
}



==========출력==========

10 20 30 40 50 60 70 80 90 100
10 20 30 40 50 60 70 80 90 100
10 20 30 40 50 60 70 80 90 100
11 21 31 41 51 61 71 81 91 101

 

 

함수

오버로드

#include <iostream>
using namespace std;

void swap(int& a, int& b) {
	int temp = a;

	a = b;
	b = temp;
}


void swap(double& a, double& b) {
	double temp = a;

	a = b;
	b = temp;
}

void swap(char& a, char& b, char& c) {
	char temp = a;

	a = b;
	b = c;
	c = temp;
}

void swap(string& a, string& b, string& c) {
	string temp = a;

	a = b;
	b = c;
	c = temp;
}

int main() {

	int a = 1, b = 2;
	swap(a, b);
	cout << a << " " << b << endl;

	double ad = 1.1, bd = 2.2;
	swap(ad, bd);
	cout << ad << " " << bd << endl;

	char ac = 'a', bc = 'b', cc = 'c';
	swap(ac, bc, cc);
	cout << ac << " " << bc << " " << cc << endl;

	string as = "안녕", bs = "백두산", cs = "한라산";
	swap(as, bs, cs);
	cout << as << " " << bs << " " << cs << endl;


	return 0;
}

==========출력==========

2 1
2.2 1.1
b c a
백두산 한라산 안녕


디폴트 매개변수

#include <iostream>
using namespace std;

// 디폴트 매개변수는 뒤에서 부터 차례대로 지정
void dc1(int a, int b = 0) {
	cout << a << " " << b << " " << endl;
}

void dc2(int a, int b, int c = 0) {
	cout << a << " " << b << " " << c << endl;
}

int main() {

	dc1(1);
	dc1(1, 2);
	dc2(20, 100);
	dc2(40, 10, 30);

	return 0;
}

==========출력==========

1 0
1 2
20 100 0
40 10 30

 

 

 

네임 스페이스 만들기

#include <iostream>
using namespace std;

namespace student {
	string name[10];
	int cs[10];
	int ix = 0;
	void pr() {
		for (int i = 0; i < ix; i++) {
			cout << "이름 : " << name[i] << " 반 : " << cs[i] << endl;
		}	
	}
	void in(string i1, int i2) {
		name[ix] = i1;
		cs[ix] = i2;
		ix++;
	}
	void del() {
		ix--;
	}
	void del(string a) {
		for (int i = 0; i < ix; i++) {
			if (a == name[i]) {
				for (int j = i+1; j < ix; j++) {
					name[j-1] = name[j];
					cs[j - 1] = cs[j];
				}
				ix--;
				break;
			}
		}
	}
}
int main() {
	student::in("홍길동", 3);
	student::in("백두산", 8);
	student::in("한라산", 2);
	student::del("백두산");
	student::pr();
	
	return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  2월 22일 - 3일차

 

스텍

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

int stack[5];
int top = -1;

void add() {
	if (top == 4) {
		printf("스택이 가득 참");
	}
	else {
		printf("저장 >> ");
		scanf("%d", &stack[++top]);
	}
}
void pr() {
	if (top == -1) {
		printf("자료가 없습니다.");
	}
	else {
		for (int i = 0; i <= top; i++) {
			printf("%d  ", stack[i]);
		}
	}
}
void del() {
	if (top == -1) {
		printf("비어있다.");
	}
	else {
		printf("%d가 삭제 됨", stack[top--]);
	}
}

void main() {
	printf("\n------------메뉴----------\n");
	int cho;
	while (1){
		printf("\n\n1.삽입 2.삭제 3.데이터 4. 종료\n");
		printf("입력 >> ");
		scanf("%d", &cho);
		switch (cho) {
		case 1:
			add();
			break;
		case 2:
			del();
			break;
		case 3:
			pr();
			break;
		case 4:
			return 0;
		}
	}

}

 

 

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

int stack[5];
int s = 0, e = 0;

void add() {
	if ((e + 1) % 5 == s) {
		printf("큐가 가득 참");
	}
	else {
		printf("자료 >> ");
		scanf("%d", &stack[e]);
		e = ++e % 5;
	}
}
void pr() {
	for (int i = s; i != e; i = ++i % 5) {
		printf("%d  ", stack[i]);
	}
}
void del() {
	if (s == e) {
		printf("큐가 비어있음");
	}
	else {
		s++;
		s %= 5;
	}
}

void main() {
	printf("\n------------메뉴----------\n");
	int cho;
	while (1){
		printf("\n\n1.삽입 2.삭제 3.데이터 4. 종료\n");
		printf("입력 >> ");
		scanf("%d", &cho);
		switch (cho) {
		case 1:
			add();
			break;
		case 2:
			del();
			break;
		case 3:
			pr();
			break;
		case 4:
			return 0;
		}
	}
}

 

 

 

기본 변형 (네임스페이스 미리 정의된 변수의 값 변경)

#include <iostream>
#include <iomanip>
using namespace std;

namespace num {
	int x = 100;
	int y = 222;
	void sum(int, int);
}

namespace num2 {
	void numx() {
		num::x = 50;
	}
}


int main() {

	cout << num::x <<endl;
	cout << num::y << endl;
	num::sum(1, 2);
	num::sum(1, 5);
	cout << endl;
	num2::numx;
	cout << num::x << endl;

	return 0;

}

void num::sum(int a, int b) {
	cout << a << " + " << b << " = " << a + b << endl;
}

==========출력==========

100
222
1 + 2 = 3
1 + 5 = 6

100

 

네임스페이스 중첩

기본

#include <iostream>
using namespace std;

namespace na {
	int a = 1;
	void sum(int a, int b) {
		cout << a + b << endl;
	}
	namespace nb {
		void nbf() {
			na::a = 2;
		}
	}
}


int main() {

	cout << na::a << endl;

	na::nb::nbf();
	cout << na::a << endl;


	return 0;
}

==========출력==========

1
2

 

기본 변형 (nc 추가, a값 변동, b값 변동)

#include <iostream>
using namespace std;

namespace na {
	int a = 1;
	void sum(int a, int b) {
		cout << a + b << endl;
	}
	namespace nb {
		int b = 10;
		void nbf() {
			na::a = 2;
		}
		namespace nc {
			void ncf() {
				na::a = 3;
				na::nb::b = 20;
			}
		}
	}
}


int main() {

	cout << na::nb::b << endl;
	na::nb::nc::ncf();
	cout << na::a << endl;
	cout << na::nb::b << endl;


	return 0;
}

==========출력==========

10
3
20

 

기본 변형 (using namespace na::nb::nc 선정 함수만 사용으로 발동)

#include <iostream>
using namespace std;

namespace na {
	int a = 1;
	void sum(int a, int b) {
		cout << a + b << endl;
	}
	namespace nb {
		int b = 10;
		void nbf() {
			na::a = 2;
		}
		namespace nc {
			void ncf() {
				na::a = 3;
				na::nb::b = 20;
			}
		}
	}
}
using namespace na::nb::nc;

int main() {

	cout << na::nb::b << endl;
	ncf();
	cout << na::a << endl;
	cout << na::nb::b << endl;


	return 0;
}

==========출력==========

10
3
20



객체지향 프로그래밍

더보기
c++은 객체지향언어로 객제지향 프로그래밍이 무엇이고 왜 필요한지에 대해서는 이전에 사용하던 절차적 프로그래밍 방식을 알면 이해하기 쉽다.

 

 

객체지향 이전의 프로그래밍 패러다임

프로그래밍 패러다임

프로그램밍 패러다임은 프로그램을 어떤 절차와 구조로 만들것인지에 대한

스타일이나 접근 방법을 나타낸다.

 

집을 짓는 방법이 여러가지 이듯이 프로그래밍 패러다임도 여러가지가 있으며

복잡도와 필요성에 따라 변화 발전했다.

 

각 패러다임은 언어가 지원하는 기능, 코드의 구조,

문제 해결, 접근 방식등에 차이가 있으며,

각 패러다임이 무엇이 좋고 나쁜지 보다는 방식이 다른 것임

 

 

비구조적 프로그래밍

코드를 구조화 하지 않고 작성하는 방법

첫번째 줄 부터 마지막 줄까지 차례대로 실행되어 코드의 흐름을 이동

어셈블리, 포틀란 등 

 

 

절차적 프로그래밍

소스 코드를 여러 부분으로 나누어서 활용하는 패러다임으로

프로시저를 이용해 구조화 하는 방식임

프로시저 : 일련의 코드 묶음 보통 함수를 의미

 

코드의 논리 구조를 모듈화 할 수 있으며

모듈화 하면 같은 기능을 수행하는 코드를 다시 작성하지 않아도 재사용할 수 있음

 

라이브러리처럼 누군가가 만들어 놓은 기능을 사용하면 프로그램을 더 쉽게 개발하고

구조화 된 코드는 다른사람이 쉽게 읽을 수 있음

 

기능을 프로시저 단위로 나누어 구현하면

기능을 변경할 때 프로그램의 전체 흐름은 그대로 두고

프로시저를 구현하는 코드만 수정하여 관리 해도 됨


절차적 프로그래밍 한계

코드가 점점 복잡해지고 다양해지면서 프로시저도 대폭늘어가고

거기에 맞춰 프로시저간의 관계도 복잡해 지고 있음.

프로젝트에 참여하는 모든 개발자가

프로그램의 복잡한 논리구조를 정확하게 이해하고 접근해야 한다.

 

 

 

 

객체지향 프로그래밍

객체지향 프로그래밍 개념

객체라는 논리적인 개념으로 코드를 구성 

데이터와 함수를 포함하는 객체를 활용하는 프로그래밍 패러다임으로다양한 객체간의 관계를 소스코드로 구성하여 프로그래밍을 완성함

 

절차적 프로그래밍은 프로그램이 수행할 기능을 프로시저라는 단위로 쪼개어 문제를 해결한다면

객체지향 프로그래밍은 객체라는 논리적인 단위를 먼저 정의하여 이를 조합해

프로그램이 수행할 기능을 만드는 방법

 

절차적은 전체 기능을 모두 파악한 후

이를 구현하지 위해 작은 단위로 만드는 것이라면

객체지향은 독립적인 객체를 정의하고 거기에 맞는 기능을 만드는 방식

 

절차적은 자동차의 모든 기능과 관계를 구성해서 프로그래밍한다면

객체지향은 자동차의 논리적인 단위를 정의 (엔진, 뼈대, 동력장치등)

엔진은 연료에 따라 다양한 가스, 휘발유, 디젤, 전기 엔진으로 변경할 수 있음



클래스 연습

#include <iostream>

using namespace std;

class c1 {int arr[10];int ix;
	void ipix(int a) {
		if (a >= 0 && a <= 9) { ix = a; }
		else { ix = 0; }
	}
public:
	void apr() { for (int i : arr) {	cout << i << " ";} }
	void add(int a=0) {	for (int& i : arr) {i = a;}	}
	void iadd(int a, int b) {
		ipix(a);
		arr[ix] = b;
	}
	void ipr(int a, int b) {
		if (a < 0 || b>9) {

		}
		else {
			for (int i = a; i <= b; i++) {
				cout << arr[i] << " ";
			}
		}
		cout << endl;
	}
};

int main() {
	c1 a;
	a.add(0);
	a.iadd(3, 10);
	a.iadd(2, 22);
	a.iadd(1, 17);
	a.ipr(1,4);
	 
		
	return 0;
}

 

 

 

 


생성자와 소멸자

클레스명(){
생성자
}
객체가 초기화 된다.

 

~클레스명(){
소멸자
}
객체가 할당 받은 메모리를 해제한다.

#include <iostream>
using namespace std;

class ts {

	int test;

public:

	ts() {
		cout << "생성자 호출" << endl;
	}

	~ts() {
		cout << "소멸자 호출" << endl;
	}

};

ts global;


int main() {

	cout << "main 함수 시작" << endl;


	cout << "main 함수 종료" << endl;

	return 0;
}

==========출력==========

생성자 호출
main 함수 시작
main 함수 종료
소멸자 호출
#include <iostream>
using namespace std;

class ts {

	int test;

public:

	ts() {
		cout << "생성자 호출" << endl;
	}

	~ts() {
		cout << "소멸자 호출" << endl;
	}

};

ts global;

void pr() {

	cout << "print 함수 시작" << endl;

	//ts local; // 지역객체

	cout << "print 함수 끝" << endl;

}

int main() {

	cout << "main 함수 시작" << endl;

	pr();

	cout << "main 함수 종료" << endl;

	return 0;
}

==========출력==========

생성자 호출
main 함수 시작
print 함수 시작
print 함수 끝
main 함수 종료
소멸자 호출


==변경== // 지역객체 주석 풀면 시행

생성자 호출
main 함수 시작
print 함수 시작
생성자 호출
print 함수 끝
소멸자 호출
main 함수 종료
소멸자 호출

 

 

 

클래스

생성자를 활용한 초기화

#include <iostream>
#include <string>
using namespace std;

class num {

	int a;
	int b;

public:
	int getA() {
		return a;
	}

	num() : a(0), b(0) {
	}

	num(int x, int y) : a(x), b(y) {
	}
};


int main() {

	num a1;
	cout << a1.getA() << endl;
	num a2 = num(15, 20);
	cout << a2.getA() << endl;

}

==========출력==========

0
15

 

 

클래스 상속

먼저 만들어진 클래스의 맴버(변수, 메서드)를 물려받아 사용
부모 클래스 : 물려주는(상속하는) 클래스
자식 클래스 : 물려받는(상속받는) 클래스

접근 제어 지시자
public : 어디서든 접근이 가능
private : 클래스 내부에 정의된 함수에서만 접근허용
protected : 기본적으로 private이지만 상속관계에 놓여 있을때 허용
class 상속 클래스명 : public 상위클래스

#include <iostream>

using namespace std;

#define Pr(a) cout << a << endl;

class prt {
public:
	int pn;

	void prtf() {
		Pr("부모 클래스");
	}
};

class chd : public prt {
public:
	int cn;

	void chdf() {
		Pr("자식 클래스");
	}
};

class gchd : public chd {
public:
	int gn;

	void gchdf() {
		Pr("손자 클래스");
	}
};

int main() {
	prt a;	// 부모클래스
	a.pn = 50;
	Pr(a.pn);
	a.prtf();
	Pr(' ');

	chd b;
	b.pn = 52;
	Pr(b.pn);
	b.prtf();
	
	b.cn = 31;
	Pr(b.cn);
	b.chdf();
	Pr(' ');

	gchd c;
	c.pn = 48;
	Pr(c.pn);
	c.prtf();
	
	c.cn = 29;
	Pr(c.cn);
	c.chdf();
	
	c.gn = 3;
	Pr(c.gn);
	c.gchdf();

	return 0;
}

==========출력==========

50
부모 클래스

52
부모 클래스
31
자식 클래스

48
부모 클래스
29
자식 클래스
3
손자 클래스


 

 

 

 

 

 

 

  2월 23일 - 4일차

■ 영화관 티켓팅 자료

○ Ticket 클래스 제작 1

- 클래스 제작 및 protected 변수 생성자 제작

Ticket을 제작하고 변수로는 title[7]배열 영화제목 저장

seat char 배열 8-6으로 제작하고

생성자를 활용하여 문자 'O' 으로 초기화 하시오

seatShow() 함수를 제작하고 출력

#include <iostream>
using namespace std;

class Ticket {
protected:
	string title[7] = {"아바타","어벤져스","겨울왕국","인터스텔라","탑건","스파이더맨","아이언맨"};
	char seat[8][6];
public:
	Ticket() {
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 6; j++) {
				seat[i][j] = 'O';
			}
		}
	}
	void seatShow() {
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 6; j++) {
				cout << i+1<<j+1 << " : " << seat[i][j] << "  ";
			}
			cout << endl;
		}
	}
};

int main() {
	Ticket a = Ticket();
	a.seatShow();
	return 0;
}
11 : O  12 : O  13 : O  14 : O  15 : O  16 : O
21 : O  22 : O  23 : O  24 : O  25 : O  26 : O
31 : O  32 : O  33 : O  34 : O  35 : O  36 : O
41 : O  42 : O  43 : O  44 : O  45 : O  46 : O
51 : O  52 : O  53 : O  54 : O  55 : O  56 : O
61 : O  62 : O  63 : O  64 : O  65 : O  66 : O
71 : O  72 : O  73 : O  74 : O  75 : O  76 : O
81 : O  82 : O  83 : O  84 : O  85 : O  86 : O

 

 

 

- reserve 멤버 함수 제작

reserve를 실행하면 시트를 보여주고 행열을 넣어주면

11미만 86초과 또는 1의 자리가 6을 넘어가던지 0이면 잘못된 좌석 선택메시지

잘할때 까지 무한 반복

제대로 입력하면 좌석에 X문자 저장 후 시트를 보여주고 종료

 

void reserve() {
    seatShow();		
    while (1) {
        int i = 0;
        cout << "예약할 행과 열을 입력 하세요 >> ";
        cin >> i;
        if (i < 11 || i > 86 || i % 10 > 6 || i % 10 == 0) {
            cout << "잘못된 좌석을 선택하였습니다." << endl;
        }
        else {
            seat[i / 10 - 1][i % 10 - 1] = 'X';
            seatShow();
            break;
        }
    }		
}

 

 

 

- reserveAdd() 멤버함수 제작

숫자를 넣으면 인덱스에 X를 넣어주고 seatReserve에 저장 srindex는 증가

setReserve에 값이 있으면 미실행

seatReserve에 있는 값을 넣어주면 예약된 좌석임을 출력하도록 reserve 함수 변경

	int seatReserve[48] ={};
	int srindex = 0;
	void reserveAdd(int a) {
		if (!reserveCheck(a)){
			seat[a / 10 - 1][a % 10 - 1] = 'X';
			seatReserve[srindex++] = a;
		}
	}
	void reserve() {
		seatShow();		
		while (1) {
			int i = 0;
			cout << "예약할 행과 열을 입력 하세요 >> ";
			cin >> i;
			if (i < 11 || i > 86 || i % 10 > 6 || i % 10 == 0) {
				cout << "잘못된 좌석을 선택하였습니다." << endl;
			}
			else if (reserveCheck(b)) {
				cout << "예약 된 좌석입니다." << endl;
			}
			else {
				seat[i / 10 - 1][i % 10 - 1] = 'X';
				seatReserve[srindex++] = i;
				seatShow();
				break;
			}
		}		
	}

 

-reserveCheck(int) 좌석 체크하여 bool 형 반환 함수

bool reserveCheck(int a) {
    bool b = false;
    for (int i : seatReserve) {
        if (i == a) {
            b = true;
        }
    }
    return b;
}

 

 

 

 

 

- 랜덤한 숫자 나오기

srand(time(NULL));
for (int i = 0; i < 10; i++) {
	int n = rand()%90;
	cout << n << "  " << endl;
}

 

 

- randomReserve(int) 멤버함수 제작

int 값에 맞게  reserveAdd() 메서드 실행

당연히 이전 예약 되어 있으면 미실행 int에 넣은 값 만큼 예약되기

void randomReserve(int a) {

    for (int i = 0; i < a; ) {
        int n = rand() % 90;
        if (n < 11 || n > 86 || n % 10 > 6 || n % 10 == 0) {

        }
        else if(!reserveCheck(n)) {
            reserveadd(n);
            i++;
        }
    }
}



int main(){
    srand(time(NULL));
    return 0;
}

 

 

- seatReserveCheck() 좌석 예약 체크 출력 함수 제작

void seatReserveCheck() {
    for (int i = 0; i < srindex; i++) {
        cout << seatReserve[i] << "  ";
    }
    cout << endl;
}

 

 

-removeReserve(int) 제작

좌석번호를 받아서 예약된 좌석 삭제 그 이후 배열내용 이동

protected에 제작

void removeReserve(int a) {
	for (int i = 0; i < srindex; i++) {
		if (seatReserve[i] == a) {
			for (int j = i; j < srindex; j++) {
				seatReserve[j] = seatReserve[j + 1];
			}
		}
	}
	srindex--;
}

 

 

-cancelReserve() 제작

현재 예약된 좌석이 출력되고

취소할 좌석 입력

체크 해서 제대로 입력 되었으면

remove 함수 이용 삭제 후 삭제 되었는지 출력

잘못 입력시 예약된 좌석이 아님을 알리고 재입력은 0을 눌러서 함수 재실행

void cancelReserve() {
    seatReserveCheck();
    cout << endl << "취소할 좌석 번호 입력 >> ";
    int s;
    cin >> s;
    if (reserveCheck(s)) {
        cout << s << " 좌석예약이 취소" << endl;
        removeReserve(s);
        seatReserveCheck();
        seat[s / 10 - 1][s % 10 - 1] = 'O';
    }
    else {
        cout << "예약된 좌석이 아닙니다. (재입력은 0) >> ";
        cin >> s;
        if (!s) cancelReserve();
    }

}

 

-play() 제작

1. 예약석확인
2. 예약
3. 취소
4. 몇명랜덤 예약
5. 현황 확인
6. 종료

 

void play() {
    while (1) {
        cout << endl << endl << "==메뉴==" << endl;
        cout << "1. 예약석 확인 \n2. 예약 \n3.취소\n4.랜덤예약\n5.현황 확인\n6.종료" << endl;
        cout << "입력 >> ";
        int a;
        cin >> a;
        switch (a) {
        case 1:
            seatReserveCheck();
            break;
        case 2:
            reserve();
            break;
        case 3:
            cancelReserve();
            break;
        case 4:
            cout << "몇명 >> ";
            int r;
            cin >> r;
            randomReserve(r);
            break;
        case 5:
            seatShow();
            break;
        case 6:
            break;
        }
        if (a == 6) {
            break;
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

  3월 1일 - 5일차

 

'언어 수업자료 > C언어' 카테고리의 다른 글

C언어 25-01 방특  (0) 2025.01.31
C언어 25-01 주말  (0) 2025.01.11
C언어 3  (0) 2024.06.15
C언어 2  (0) 2024.05.18
C언어 1  (0) 2024.04.20