👩‍💻 알고리즘/🔠 C

[한빛미디어 혼공학습단_혼공C] 6주차 스터디 ch9 포인터

오브 🧙‍♂️ 2024. 2. 18. 16:23

저번에 했었던 파트 뒤부터 해보겠다!
 
포인터로 값을 교환하는 예제를 풀어봤다.
1차로 코드를 훑어보고, 2차로 한 줄씩 뜯어서 그림 그리면서 이해해보고, 3차로 출력값을 생각하며 손코딩을 했다.


마지막으로 다시 복습할 겸 코드 쳐보기!

 
포인터의 대입 규칙
1.포인터는 변수의 형태가 같을 때만 대입해야 한다. (int는 int형끼리,double은 double끼리)
2.모든 주소와 포인터의 크기는 같다. 
3. 형 변환을 사용한 포인터의 대입은 가능하다.
 
포인터는 함수 간에 효과적으로 데이터를 공유할 수 있어 임베디드 프로그램에 반드시 필요하다. 
왜 임베디드는 효과적으로 데이터를 공유할 수 있어야 하지?에 대한 의문이 들었다. 그래서 gpt한테 물어봄

  1. 자원 절약: 임베디드 시스템은 주로 작고 제한된 자원을 가지고 있습니다. 메모리, 프로세서 속도, 전력 등이 그 예입니다. 함수 간 데이터를 효과적으로 공유하면 메모리 사용을 최적화할 수 있고, 더 적은 전력을 소비하며 더 빠른 실행 속도를 달성할 수 있습니다.
  2. 모듈화: 함수 간 데이터 공유를 통해 모듈 간의 독립성을 유지할 수 있습니다. 각 모듈은 필요한 데이터에만 접근하여 작업하고, 다른 모듈의 내부 구현에 대해 알 필요가 없습니다. 이는 코드의 유지보수성과 확장성을 높여줍니다.
  3. 실시간 처리: 임베디드 시스템은 종종 실시간 응답이 필요합니다. 함수 간 데이터 공유를 효율적으로 관리하면 데이터를 실시간으로 전달하고 처리할 수 있어 시스템의 응답 시간을 최적화할 수 있습니다.
  4. 효율적인 통신: 함수 간 데이터 공유는 효율적인 통신을 가능하게 합니다. 특히, 임베디드 시스템에서는 데이터 전송에 사용되는 프로토콜의 오버헤드를 줄이기 위해 최소한의 데이터를 전송하는 것이 중요합니다.

라고 한다.
 
자동차,정수기 등에 대입해서 생각해보았다.
1. 자동차의 속력을 사용자가 줄이고자 할 때, 지연시간이 길어지면 사고가 날 수 있을 것이다.
2. 정수기는  사용자가 뜨거운 물과 차가운 물을 섞어마시고자 할 때, 뜨거운 물을 멈추는 버튼을 눌렀음에도 반응이 빠르게 나오지 않아 원하는 양보다 많이 출력된다면 원하는 온도의 물을 마실 수 없을 것이다..
 
이런 의미에서 실시간 처리와 효율적인 통신이 강조되는 것 같다.
 
자원 절약은 정수기나 스마트워치 등 크기가 작은 기기에서도 시스템이 효율적으로 돌아가야 하기 때문에 그런 듯 하다. 
 
모듈화에 대한 부분이 이해가 안 가서 조금 더 물어봤다. 
모듈화란 큰 프로그램을 작은 조각으로 나누는 것을 의미합니다. 이는 소프트웨어를 관리하고 이해하기 쉽게 만들어줍니다. 모듈화의 핵심 아이디어는 다음과 같습니다:

  1. 기능 단위 분리: 모듈화는 소프트웨어를 기능적인 부분으로 분리합니다. 각 모듈은 특정한 작업이나 기능을 수행합니다. 이렇게 하면 각 모듈의 역할과 책임이 명확해지고, 개발자들은 작업을 분담하거나 재사용하기 쉬워집니다.
  2. 독립성 유지: 각 모듈은 다른 모듈과 독립적으로 개발하고 테스트할 수 있습니다. 이는 모듈 간의 의존성을 줄이고, 개발과 유지보수를 간편하게 만듭니다. 만약 한 모듈에 문제가 생기더라도 다른 모듈에 영향을 미치지 않습니다.
  3. 재사용성: 모듈화는 코드의 재사용성을 높입니다. 비슷한 기능이 필요한 다른 프로젝트에서는 같은 모듈을 사용할 수 있습니다. 이는 개발 시간을 단축하고 코드의 일관성을 유지하는 데 도움이 됩니다.
  4. 유지보수성 향상: 소프트웨어가 모듈화되면 특정 기능을 수정하거나 개선할 때 해당 모듈만 수정하면 됩니다. 다른 모듈에는 영향을 주지 않으므로 전체 시스템을 파악하는 데 필요한 시간과 노력을 줄일 수 있습니다.

아 그래서 헤더파일이랑 소스 파일이 존재하고, 함수가 쓰이는구나..!
서로 떨어져있던 개념들이 연결되어 이해가 됐다. !!
 
푸는 김에 도전 예제까지 풀었다. (261p)

#include <stdio.h>

void swap(double *pa, double *pb);
void line_up(double *maxp, double* midp, double* minp);

int main(void)
{
	double max, mid, min;

	printf("실수 값 3개 입력: ");
	scanf_s("%lf%lf%lf", &max, &mid, &min);
	line_up(&max, &mid, &min);
	printf("정렬된 값 출력 : %.1lf, %.1lf, %.1lf\n", max, mid, min);
	
	return 0;
}

void swap(double* pa, double* pb)
{
	double temp;

	temp = *pa;
	*pa = *pb;
	*pb = temp;
}

void line_up(double* maxp, double* midp, double* minp)
{
    double tem;

    if (*maxp < *midp) {
        tem = *maxp;
        *maxp = *midp;
        *midp = tem;
    }

    if (*maxp < *minp) {
        tem = *maxp;
        *maxp = *minp;
        *minp = tem;
    }

    if (*midp < *minp) {
        tem = *midp;
        *midp = *minp;
        *minp = tem;
    }
	

}

'👩‍💻 알고리즘 > 🔠 C' 카테고리의 다른 글

백준 11718  (0) 2024.02.11
백준 5597  (0) 2024.02.11
[한빛미디어 혼공학습단_혼공C] 5주차 스터디 ch8 배열  (0) 2024.02.07
백준 10951  (0) 2024.02.04
백준 11382  (0) 2024.02.03