본문 바로가기

임베디드 시스템반도체 개발자 과정 by 서울기술교육센터/후기

68일차

9월 27일

 

1. 사원 정보를 입력 받는다. 전체 사원 정보를 출력하는 함수를 만든다. 엘리트 사원을 출력하는 함수를 만든다.

#include <iostream>
#include <string.h>
#include <string>

using namespace std;

#define NUMBER 10 

typedef struct profile
{
	char name[20];
	int english;
	double score;
	char department[80];
} t_profile;

t_profile p1[NUMBER];

int add()
{
    int i = 0;
    while(1)
    {
        printf("Enter Name(종료: end): ");
        scanf("%s", p1[i].name);
        if(strcmp(p1[i].name, "end") == 0)
        {
            break;
        }
        printf("Enter English: ");
        scanf("%d", &p1[i].english);
        printf("Enter Score: ");
        scanf("%lf", &p1[i].score);
        printf("Enter Department: ");
        scanf("%s", p1[i].department);
        i++;
        if(i >= NUMBER)
        {
            break;
        }
    }
    return i;
}

void all_person(t_profile* p, int num)
{
    printf("===== 사원 관리 프로그램 =====\n");
    printf("이름  영어  학점  부서명\n");
    printf("==== ==== ==== =========\n");
    for(int j = 0; j<num;j++)
    {
        cout<< p[j].name << " " << p[j].english << " " << p[j].score << " " << p[j].department << endl;
    }
    printf("========================\n");
}

void elite_person(t_profile* p, int num)
{
    int i;
    printf("​========= elite 사원 ========\n");
    printf("이름  영어  학점  부서명\n");
    printf("==== ==== ==== =========\n");
    for(i = 0;i < num;i++)
    {
        if(p[i].english >= 900 && p[i].score >= 4.5)
        {
            cout<< p[i].name << " " << p[i].english << " " << p[i].score << " " << p[i].department << endl;
        }
    }
    printf("========================\n");
}

int main()
{
    int i;
	i = add();
    all_person(p1, i);
    elite_person(p1, i);
    return 0;
}

 2. 명령어를 통해 각 led를 제어하고 그 상태를 출력해라.

#include <iostream>
#include <string.h>
#include <string>

using namespace std;

struct  
{
    unsigned led0: 1;
    unsigned led1: 1;        
    unsigned led2: 1;
    unsigned led3: 1;
    unsigned led4: 1;
    unsigned led5: 1;
    unsigned led6: 1;
    unsigned led7: 1;
} s;

enum {OFF, ON};

void led_on_off(int i, int j)
{
	if(i == 0)
	{
		s.led0 = j;
	}
	
	if(i == 1)
	{
		s.led1 = j;
	}
	
	if(i == 2)
	{
		s.led2 = j;
	}
	
	if(i == 3)
	{
		s.led1 = j;
	}
	
	if(i == 4)
	{
		s.led1 = j;
	}
	
	if(i == 5)
	{
		s.led1 = j;
	}
	
	if(i == 6)
	{
		s.led1 = j;
	}
	
	if(i == 7)
	{
		s.led7 = j;
	}
}

void led_status()
{
	
    printf("           === LED Status ===           \n");
	printf("LED7 LED6 LED5 LED4 LED3 LED2 LED1 LED0\n");
	if(s.led7 == 1)
	{
		cout << "ON  ";
	}
	else
	{
		cout << "OFF ";
	}
	
	if(s.led6 == 1)
	{
		cout << "ON  ";
	}
	else
	{
		cout << "OFF ";
	}
	
	if(s.led5 == 1)
	{
		cout << "ON  ";
	}
	else
	{
		cout << "OFF ";
	}
	
	if(s.led4 == 1)
	{
		cout << "ON  ";
	}
	else
	{
		cout << "OFF ";
	}
	
	if(s.led3 == 1)
	{
		cout << "ON  ";
	}
	else
	{
		cout << "OFF ";
	}
	
	if(s.led2 == 1)
	{
		cout << "ON  ";
	}
	else
	{
		cout << "OFF ";
	}
	if(s.led1 == 1)
	{
		cout << "ON  ";
	}
	else
	{
		cout << "OFF ";
	}
	
	if(s.led0 == 1)
	{
		cout << "ON  ";
	}
	else
	{
		cout << "OFF ";
	}
	printf("\n");
}

void command()
{
	while(1)
	{
		char buff[30];
		printf("command: ");
		scanf("%s", buff);
		if(strcmp(buff,"ledstatus") == 0)
		{
			led_status();
		}
		
		if(strcmp(buff,"ledallon") == 0)
		{
			led_on_off(0,ON);
			led_on_off(1,ON);
			led_on_off(2,ON);
			led_on_off(3,ON);
			led_on_off(4,ON);
			led_on_off(5,ON);
			led_on_off(6,ON);
			led_on_off(7,ON);
			led_status();
		}
		
		if(strcmp(buff,"ledalloff") == 0)
		{
			led_on_off(0,OFF);
			led_on_off(1,OFF);
			led_on_off(2,OFF);
			led_on_off(3,OFF);
			led_on_off(4,OFF);
			led_on_off(5,OFF);
			led_on_off(6,OFF);
			led_on_off(7,OFF);
			led_status();
		}
		
		if(strcmp(buff,"led1on") == 0)
		{
			led_on_off(1,ON);
			led_status();
		}
		if(strcmp(buff,"led1off") == 0)
		{
			led_on_off(1,OFF);
			led_status();
		}
		
		if(strcmp(buff,"led2on") == 0)
		{
			led_on_off(2,ON);
			led_status();
		}
		if(strcmp(buff,"led2off") == 0)
		{
			led_on_off(2,OFF);
			led_status();
		}
		
		if(strcmp(buff,"led3on") == 0)
		{
			led_on_off(3,ON);
			led_status();
		}
		if(strcmp(buff,"led3off") == 0)
		{
			led_on_off(3,OFF);
			led_status();
		}
		
		if(strcmp(buff,"led4on") == 0)
		{
			led_on_off(4,ON);
			led_status();
		}
		if(strcmp(buff,"led4off") == 0)
		{
			led_on_off(4,OFF);
			led_status();
		}
		
		if(strcmp(buff,"led5on") == 0)
		{
			led_on_off(5,ON);
		}
		if(strcmp(buff,"led5off") == 0)
		{
			led_on_off(5,OFF);
			led_status();
		}
		
		if(strcmp(buff,"led6on") == 0)
		{
			led_on_off(6,ON);
			led_status();
		}
		if(strcmp(buff,"led6off") == 0)
		{
			led_on_off(6,OFF);
			led_status();
		}
		
		if(strcmp(buff,"led7on") == 0)
		{
			led_on_off(7,ON);
			led_status();
		}
		if(strcmp(buff,"led7off") == 0)
		{
			led_on_off(7,OFF);
			led_status();
		}
	}
}

int main()
{
	command();
}

3.숫자를 입력받고, bubble sort로 오름차순 정렬 후 binary search로 원하는 숫자가 있는지 여부를 따져라.

#include <iostream>
#include <string.h>
#include <string>

using namespace std;

#define NUMBER 20

void sort(int *ary, int NUM)
{
	int i, j;
	int temp;
	for(i = 0; i<NUM-1;i++)
	{
		for(j=0;j<NUM-1-i;j++)
		{
			if(ary[j] > ary[j+1])
			{
				temp = ary[j];
				ary[j] = ary[j+1];
				ary[j+1] = temp;
			}
		}
	}
}

bool binary_search(int *ary, int num)
{
    int str = sizeof(ary) /  sizeof(int);
    int low = 0;
    int middle = low + str / 2;
    while(1)
    {
        int middle = low + str / 2;
        if(ary[middle] == num)
        {
            return true;
        }
        else if(ary[middle] < num)
        {
            low = middle;
        }
        else if(ary[middle] > num)
        {
            str = middle;
        }
    }
    return false;
}

int main(void)
{
	int array[NUMBER];
	int num = 0;
	int i;
	int j;
	for (i=0; i < NUMBER;i++) 
	{
        scanf("%d", &num);
        if (num == -1)
            break;
        array[i]=num;
	}
	sort(array, i);    // ascending order
	printf("찾고자 하는 숫자 입력: ");
	scanf("%d", &num);
	
	if(binary_search(array, num))
    {
        printf("TRUE\n");
    }
    else
    {
        printf("FALSE\n");
    }
}

https://gmlwjd9405.github.io/2018/05/06/algorithm-bubble-sort.html

 

[알고리즘] 버블 정렬(bubble sort)이란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

https://cjh5414.github.io/binary-search/

 

이진 탐색(Binary Search) 알고리즘 개념 이해 및 추가 예제

Jihun's Development Blog

cjh5414.github.io

4.main이 실행되도록 클래스를 만들되, 문자열 크기에 맞게 동적 할당을 해라.

 

//동적할당 변수 크기 확인
#include <malloc.h>
printf("size,, : %d\n", _msize(inname));
#include <iostream>
#include <string.h>
#include <string>

using namespace std;

namespace COMP_POS
{
    enum {CLERK, SENIOR, ASSIST, MANAGER};
}

class NameCard
{
private:
    char* inname;
    char* incompany;
    char* inphone_number;
    int inrank;

public:
    NameCard(char* name, char* company, char* phone_number, int rank);
    ~NameCard();
    void ShowNameCardInfo();
};

NameCard::NameCard(char* name, char* company, char* phone_number, int rank)
{
    inname = new char[strlen(name) + 1];
    strcpy(inname, name);
    incompany = new char[strlen(company)+1];
    strcpy(incompany, company);
    inphone_number = new char[strlen(phone_number)+1];
    strcpy(inphone_number, phone_number);
    inrank = rank;
}

NameCard::~NameCard()
{
    delete inname;
    delete incompany;
    delete inphone_number;
}

void NameCard::ShowNameCardInfo()
{
    printf("이름 : ");
    cout << inname << endl;
    printf("회사 : ");
    cout << incompany << endl;
    printf("전화번호 : ");
    cout << inphone_number << endl;
    printf("직급 : ");
    if(inrank == 0)
    {
        cout << "사원" << endl;
    }
    if(inrank == 1)
    {
        cout << "주임" << endl;
    }
    if(inrank == 2)
    {
        cout << "대리" << endl;
    }
    if(inrank == 3)
    {
        cout << "팀장" << endl;
    }
}


int main(void)
{    
    NameCard manClerk("Lee", "ABCEng", "010-1111-2222", COMP_POS::CLERK);
    NameCard manSENIOR("Hong", "OrangeEng", "010-3333-4444", COMP_POS::SENIOR);
    NameCard manAssist("Kim", "SoGoodComp", "010-5555-6666", COMP_POS::ASSIST);
    manClerk.ShowNameCardInfo();
    manSENIOR.ShowNameCardInfo();
    manAssist.ShowNameCardInfo();
    return 0;
}

5.

#include <iostream>
#include <string.h>
#include <string>

using namespace std;

class Calculator
{
private:
    int add_cnt;
    int div_cnt;
    int min_cnt;
    int mul_cnt;

public:
    Calculator();
    virtual ~Calculator();
    void Init();
    double Add(double a, double b);
    double Div(double a, double b);
    double Min(double a, double b);
    double Mul(double a, double b);
    void ShowCount();
};

Calculator::Calculator()
{
}

Calculator::~Calculator()
{

}


void Calculator::Init()
{
    add_cnt = 0;
    div_cnt = 0;
    min_cnt = 0;
    mul_cnt = 0;
}
double Calculator::Add(double a, double b)
{
    add_cnt++;
    return a + b;
}
double Calculator::Div(double a, double b)
{
    div_cnt++;
    return a / b;
}
double Calculator::Min(double a, double b)
{
    min_cnt++;
    return a - b;
}
double Calculator::Mul(double a, double b)
{
    mul_cnt++;
    return a * b;
}

void Calculator::ShowCount()
{
    printf("덧셈 %d번, 뺄셈 %d번, 곱셈 %d번, 나눗셈 %d번 실행됐습니다.\n", add_cnt, min_cnt, mul_cnt, div_cnt);
}


int main()
{
	Calculator cal;

	cal.Init();

	cout << "3.3 + 2.8 = " << cal.Add(3.3, 2.8) << endl;
	cout << "3.5 / 1.7 = " << cal.Div(3.5, 1.7) << endl;
	cout << "2.1 - 1.1 = " << cal.Min(2.1, 1.1) << endl;
	cout << "2.1 * 1.1 = " << cal.Mul(2.1, 1.1) << endl;

	cal.ShowCount();

	return 0;
}

https://codingsense0529.tistory.com/25

 

[c++] 문자열 동적 할당하여 저장하기

문자열을 동적 할당하여 저장하는 것을 알아보겠다. NameCard(const char* myname) { int len = strlen(myname) + 1; name = new char[len]; //name= new char[strlen(myname)+1]로 줄일 수 있다. strcpy(name,myn..

codingsense0529.tistory.com

 

cf)공부해보라고 알려준 개념.

https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0

 

블로킹 Vs. 논블로킹, 동기 Vs. 비동기

와 드디어 이해했다 속이 후련~

velog.io

6. OSI 7 LayerTCP/IP protocl stack 의 연관 관계를 그림으로 작성 하시오.

https://velog.io/@jakeseo_me/OSI-7%EA%B3%84%EC%B8%B5-%EC%8B%9C%EB%A6%AC%EC%A6%88-5-%EC%84%B8%EC%85%98-%ED%91%9C%ED%98%84-%EC%9D%91%EC%9A%A9-%EA%B3%84%EC%B8%B5

 

OSI 7계층 시리즈 #5 세션, 표현, 응용 계층

사실 OSI 7계층 모델은 이미 시장에서 도태된 네트워크 시스템이다. 현대에는 OSI 7계층 모델의 일부를 계승한 TCP/IP 모델을 대부분 사용한다. 또, TCP/IP 모델에서도 한번 업데이트가 이루어져 사실

velog.io

 

7. TCP 프로토콜이 동작하는데 있어서 슬라이드 윈도우 알고리즘이 사용 되고 있다. 슬라이드 윈도우에대해 자료 조사 후 기술 하시오.

 TCP의 전송 제어 방법에는 흐름제어, 오류 제어 혼잡제어가 있다. 슬라이드 윈도우(Sliding Window)는 흐름 제어와 관련된 내용이다.

 수신 측의 데이터 처리 속도보다 송신 측이 더 빠른 경우, 수신 측의 버퍼가 언젠가는 다 차버리게 된다. 수신 측의 버퍼가 꽉 찬 상태에서는 데이터를 더 이상 담아둘 공간이 없기 때문에 폐기 처분된다. 송신 측이 데이터를 다시 보내주기야 하겠지만 미연에 방지할 수 있다면 더 좋을 것이 자명하다.

 수신 측은 자신이 처리할 수 있는 데이터의 양을 송신 측에게 알려준다. 이를 Window size라고 한다. 송신 측은 수신 측에서 보내준 Window size와 네트워크의 상황에 따라 최종 Window size를 정해 그에 맞게 수신 측에게 데이터를 보내준다.

흐름 제어에는 크게 Stop and wait, Sliding window 방식이 있다. Stop and wait는 송신 측이 데이터를 보내고 수신 측으로부터 반응이 올 때까지 대기하는 방식이다. 간단한 만큼 구현도 쉽고 제어도 쉽지만 비효율적이란 단점이 있다. Sliding window 방식은 송신 측에서 수신 측의 Window size를 안다는 점이 Stop and wait 방식과의 차이다. Window size를 알기 때문에 수신 측에서 처리 가능하다는 반응을 해주지 않아도 데이터를 보내기 전부터 처리될지 어떨지 예측이 가능하다.

 송신 측은 Window size만큼의 데이터를 수신 측의 응답 없이 보낼 수 있다. 사진에서 보듯 Window size3이라고 하자. 그렇다면 송신 측은 0,1,2를 보낸다. 이때, 수신 측에서 하나를 처리했다는 응답이 오면 3을 추가로 보낸다. 이렇게 window를 이동하며 데이터를 보내기 때문에 Sliding Window 방식이라고 한다. 수신 측에서 4를 응답해도 Window size3이기 때문에 4개를 보내지는 못한다. 하지만 이런 경우 Window size를 유동적으로 조절해 통신하는 것도 가능하다.

 정리하면 송신측의 버퍼의 상태를 보자면 아래와 같이 3가지로 나뉜다.

 

출처

https://evan-moon.github.io/2019/11/22/tcp-flow-control-error-control/

 

패킷의 흐름과 오류를 제어하는 TCP

은 원활한 통신을 위해 전송하는 데이터 흐름을 제어하고 네트워크의 혼잡 상태를 파악해서 대처하는 기능을 프로토콜 자체에 포함하고 있다.

evan-moon.github.io

https://m.blog.naver.com/gaegurijump/110188012832

 

TCP 슬라이딩 윈도우(Sliding Window)

슬라이딩 윈도우 슬라이딩 윈도우는 두개의 네트워크 호스트간의 패킷의 흐름을 제어하기 위한 방법입니다....

blog.naver.com

 

'임베디드 시스템반도체 개발자 과정 by 서울기술교육센터 > 후기' 카테고리의 다른 글

70일차  (0) 2022.09.29
69일차  (0) 2022.09.28
67일차  (0) 2022.09.26
65일차  (0) 2022.09.22
63일차  (0) 2022.09.20