2학년 2학기213 10-5장 문자열과 포인터 문자열 배열에 문자열 char s[] = "HelloWorld";//요소 변경 가능 Os[1] = 'E'; // HElloWorld//할당 연산자 사용 불가능 Xs = "HelloWorld_2"; //오류 위의 코드처럼 요소는 변경 가능하지만 할당 연산자로 문자열 자체를 변경하는 건 안된다. 포인터에 문자열: 문장이 변하지 않음이 보장되는 경우에 사용한다. char* p = "HelloWorld";//할당 연산자 사용 가능 Op = "HelloWorld_2"; // HelloWorld_2//요소 변경 불가능 Xp[1] = 'E'; //오류위의 코드처럼 할당 연산자로 문자열이 가리키는 주소의 값(즉, 문자열 자체)은 변경할 수 있지만, 문자를 변경하는건 안된다. 2024. 11. 5. 윈폼 블로그 https://andjjip.tistory.com/category/%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B3%BC%EC%A0%95%EC%A4%80%EB%B9%84/WinForm 2024. 11. 4. 10-4장 문자열을 수치로 변환 atoi(문자열): 특정 숫자 형태의 문자열을 정수로 변경해주는 것 sscanf(문자열, "%d", 정수형 변수) ⭐️⭐️⭐️: 특정 숫자 형태의 문자열을 정수형 변수에 저장해주는것 sprintf(문자열 변수, "%d", 정수) ⭐️⭐️⭐️: 특정 숫자를 문자열 변수에 저장해주는 것 #include #include int main(){ char s[] = "100"; char t[100] = ""; int i; printf("%d\n", atoi("100")); sscanf(s, "%d", &i); //문자열을 정수로 변경해서 저장 sprintf(t, "%d", 102); //정수를 문자열로 변경해서 저장 printf("i: %d\n", i); //i: 100 .. 2024. 11. 4. 10-3장 문자열 처리 라이브러리 strlen(s): 문자열의 길이#include #include int main(){ char s[] = "abcdefgh"; int len = strlen(s); printf("문자열 %s의 길이 = %d", s, len); //문자열 abcdefgh의 길이 = 8} strcpy(s1, s2): 문자열을 복사#include #include int main(){ char src[] = "Hello"; char dst[6]; strcpy(dst, src); printf("복사된 문자열 = %s", dst); //복사된 문자열 = Hello} strcat(s1, s2): 문자열을 연결#include #include int main(){ char s[11.. 2024. 11. 4. 10-2장 문자 입출력과 문자열 입출력 1. 문자 입출력[getchar()와 getch()]getchar(): 입력된 문자들이 buffer에 쌓이다가, enter 키가 입력되면 buffer에 저장되어 있던 문자들이 선입선출형식으로 하나씩 출력된다. getch(): 입력된 문자들이 바로바로 출력된다. [putchar()와 putch()]putchar(): 출력 버퍼를 사용하여 여러 문자를 모았다가 한번에 문자들을 출력한다.putch(): 버퍼 없이 바로바로 출력한다. 2. 문자열 입출력[scanf()와 gets_s()]scanf(): 문자열을 읽어서 배열 s[]에 저장한다. 단! space, tab, newline과 같은 입력을 구분하는 문자들은 입력되지 않는다.gets(문자열, 문자열 길이): 문자열을 읽어서 배열 s[]에 저장한다. .. 2024. 11. 4. 10-1장 문자열과 NULL 문자 1. 문자열 표현 방법#includeint main(){ char str[6] = "Hello"; //동일한 기능 - char str[6] = {'H', 'e', 'l', 'l', 'o'};} 각 배열은 문자가 각각 입력되지만 아스키 코드로도 확인할 수 있다.#includeint main(){ char str[6] = "Hello"; printf("%c", str[0]); // 'H' printf("%d", str[0]); // 72} 2. NULL 문자: 문자열이 끝나기 전에 반드시 NULL 문자(\0)라는 특수한 값으로 끝나야한다. 문자열의 크기가 5개라도 NULL문자를 생각해서 크기를 6개로 설정해야한다. char str[6] = "Hello"; ❓ 왜 N.. 2024. 11. 4. 9주차 - split, apply, pivot table을 이용해서 실습해보기 초반에는 모든 사전 자료형을 열거해서 데이터 프레임을 만들었지만, 사전자료형의 하나의 키에 여러 값을 리스트로 추가해서 데이터 프레임을 만드면 추후 행을 추가할 때 각 리스트의 요소들만 추가하면 되기 때문에 아래의 방식이 더 개선된 방식이다. 9.1은 split을 통해 구분된 데이터들을 기반으로 apply로 연산을 하는 것이 주요 포인트이다. 내가 한 방식은 특정 열의 행 값에 따라서 값을 부여해주었다. 하지만, 교수님은 Product로 행을 만들어주고 groupby(category_mapping)에서 category_mapping을 전달하면 pandas는 인덱스의 각 값에 대해 category_mapping 딕셔너리를 참조하여 자동으로 새로운 카테고리 값으로 매핑을 수행합니다. 따라서 그렇게 .. 2024. 10. 31. Scaffold vs Surface의 차이 우리가 이전에 MainActivity.kt에서 onCreate()메서드에 Scaffold를 봤을 것이다. 이 Scaffold외에 Surface도 있다. Scaffold: 전체화면의 주요 UI 컴포넌트를 배치할 수 있는 프레임워크를 제공하여 앱의 구조를 쉽게 설정할 수 있다. 주로, 앱의 메인 레이아웃을 설정할 때 사용된다. 예를 들어 상단 bar, 하단 navigation bar, floating action button을 포함한 화면을 구성할 때 유용하다. 위의 형태로 topBar, bottomBar, flaotingActionButton, Content 등을 구성할 수 있다. Surface: 개별 UI 컴포넌트의 스타일과 배경을 설정하는데 사용되는 기본 구성요소이다. 주로 카드, 버튼, 박.. 2024. 10. 30. Compose 기초 기본적으로 프로젝트를 생성하고 MainActivity.kt를 열어보면 위와 같은 파일 형태가 나온다. "onCreate() {}": 애뮬레이터의 화면 레이아웃을 담당한다. (여기서 아무리 코드를 바꿔도 Preview에서는 반영되지 않는다.) "@Composablefunc Greeting(...) { }": View의 구성을 담당한다. "@Preview(...)@Composablefunc GreetingPreview() {...}": Preview 화면의 레이아웃을 담당한다. (여기서 아무리 바꿔도 실제 애뮬레이터에서는 반영되지 않는다.) "onCreate메소드" override fun onCreate(savedInstanceState: Bundle?) { //시뮬레이터 용 super.onCr.. 2024. 10. 30. [pandas] Pivot Tables Pivot Tables: 특정 행과 열을 기준으로 우리가 원하는 연산을 하는 것이다. 자세하게 말하면, 데이터를 요약하고 집계하기 위해 특정 행과 열을 기준으로 그룹화해서 다양한 연산(합, 평균, 개수)을 수행하는 테이블이다. 데이터 프레임 명.pivot_table(연산할 컬럼, index=기준이 되는 행, columns=기준이 되는 열) 이렇게 pivot table을 이용하면, 간단하게 행과 열을 기준으로 특정 값에 대한 연산을 할 수 있다. pivot table의 기본 연산은 mean이기 때문에 아무 코드 추가 없이도 생존자 여부의 평균을 계산할 수 있다. 각각에 다른 연산 적용 또한 같은 기준에 각각의 값에 다른 연산을 적용할 수도 있다. 정한 기준에 대한 전체에 대한 연산 적용 이렇게 ma.. 2024. 10. 29. [pandas] GroupBy: Apply 이전에 배웠던 기준에 따라 선택된 데이터들끼리 연산하는 것이 Apply이다. Aggregation: sum, median, max, min 같이 값들을 하나로 요약하는 과정이다. 이런 식으로 aggregate와 함께 연산을 써주면, key로 분류된 데이터들 각각에 min, medianm, max 연산을 해주고 그 결과를 보여준다. 이렇게 모든 열(data1, data2)에 같은 연산을 한번에 할 수도 있지만, 각 열에 다른 연산도 가능하다. 이렇게 data1에는 min연산을하고, data2에는 max연산을 해줄 수도 있다. Filter: 그룹을 기준으로 특정 조건에 맞는 데이터만 남기는 과정이다. 예들 들면 그룹 별 평균이 특정 값 이상인 데이터만 남기는 것 왜 groupby된 데이터 .. 2024. 10. 29. [pandas] GroupBy: Split ❓ Split이란?: 데이터 중 내가 원하는 기준에 있는 일부 데이터를 선택하는 것이다. 기존 값을 기준으로 split이런 식의 데이터가 있을 때, key를 기준으로 split을 한다면 아래와 같이 같은 키를 가진 행끼리 나누어 진다.keydataA0A3 keydataB1B4 keydataC2C5 사용자가 정의한 값을 기준으로 split기존에는 열중 하나의 값으로 겹치는 행끼리 split을 했다. 하지만 사용자가 직접 정의한 값을 기준으로 split을 할 수 있다. 위의 데이터가 있을 때 직접 정의한 L을 기준으로 값을 나눌 수 있다. 0은 0끼리, 1은 1끼리, 2는 2끼리 나눌 수 있다. [0인 것들]keydata1data2A05C23C59[1인 것들]keydata1data2B10A3.. 2024. 10. 29. 9-7장 이중 포인터 이중 포인터: 포인터를 가르키는 포인터이다. 즉, 주소를 갖고 있는 메모리의 주소를 갖고있는 메모리를 의미한다. #includeint main(){ int a = 3; int* p = &a; int** pp = &p; printf("%d\n", *p); //3 printf("%d\n", **pp); //3 } 이처럼 pp가 이중 포인터이다. a의 주소를 담고 있는 p의 주소를 담고 있는 pp이다. 따라서, 간접 참조 연산자를 2개 써줘야하는데, **pp는 pp의 값을 접근하고, 다시 그 값은 주소이니깐 그 주소의 값을 접근하는 형태이다. [예제]#includeint globlal_value = 30;void call_by_value(int* val){ //매개변수가 포.. 2024. 10. 29. 9-6장 함수 포인터 함수 포인터: 함수 포인터란, 함수를 가르키는 포인터이다. 즉 함수의 주소를 가질 수 있다. [형식]반환형 (* 함수 포인터 이름)(매개 변수1, 매개 변수2, ...);//예시int (*pf)(int, int); 함수 포인터는 따로 body가 필요하지 않다.또한 배열처럼 함수 이름 자체가 주소이기 때문에 주소 연산(&)는 필요하지 않다. [예시 - 1]#includevoid A(){ printf("A입니다.");}void B(){ printf("B입니다.");}void C(){ printf("C입니다.");}int main(){ int x = 0; void(*p)(); printf("함수 명을 선택하시오. (A: 0, B: 1, C: 0): "); scanf("%.. 2024. 10. 29. 9-5장 함수가 포인터를 반환하는 경우 함수가 포인터를 반환하는 경우: 함수 종료시에도 남아 있는 변수의 주소를 반환해야한다. 만일 지역 변수의 주소를 반환한다면 함수가 종료되면 소멸되므로, 오류가 발생할 수 있다. [지역 변수]#include//결과를 result 저장하고 그 주소를 반환int* add(int x, int y){ int result; result = x + y; return &result;}int main(){ int* p = add(3, 4); printf("%d", *p); //오류 발생} [전역 변수]#include//결과를 result 저장하고 그 주소를 반환int result;int* add(int x, int y){ result = x + y; return &result;}i.. 2024. 10. 29. 9-4장 배열과 포인터 배열의 이름이 바로 포인터이다. 즉, 배열은 따로 주소가 없이 배열 이름자체가 주소이다. #includeint main(){ int a[] = {10, 20, 30, 40, 50}; printf("배열의 이름 = %u\n", a); // 배열의 이름 = 1868132144 printf("첫 번째 원소의 주소 = %u\n", &a[0]); // 첫 번째 원소의 주소 = 1868132144} 따라서, 포인터도 배열처럼 사용할 수 있다. #includeint main(){ int a[] = {10, 20, 30, 40, 50}; int *p; p=a; printf("a의 첫 번째 원소 = %u\n", a[0]); // 10 printf("p의 첫.. 2024. 10. 28. 9-3장 포인터와 함수 함수 호출 시 인수 전달 방법1. 값에 의한 호출: 인수의 값이 매개 변수로 복사된다. 따라서 함수가 종료되면 매개 변수의 값은 사라진다. 즉, 실제 인자들의 값은 유지됨. 2. 참조에 의한 호출: 인수의 주소가 매개 변수로 복사된다. 따라서 함수에서 인자로 받은 주소를 이용해서 값을 변경하면 실제 인자들의 변수 값도 변경된다. 포인터 사용시 주의할 점🚨 초기화가 안된 포인터를 사용하면 안된다.🚨 초기화 되지 않은 포인터 변수에 값을 넣으면 그 포인터가 어느 곳에 있는지 모르기 때문에 해당 포인터가 프로그램에서 중요한 연산에 있는 메모리를 할당하고 있는 상황에서 값을 넣으면 프로그램이 망가질 수 있기 때문에 주의해야한다. 🚨 포인터가 아무것도 가리키고 있지 않은 경우에는 NULL로 초기화해야 한다.🚨 예.. 2024. 10. 28. 9-2장 포인터의 연산 포인터연산에는 증가(++), 감소(--), 덧셈(+), 뺄셈(-) 연산이 있다. 증감 연산의 경우 포인터가 가르키는 객체의 크기가 1의 의미를 가지게 된다. int x = 10; int *p = &x; //1000++p; //1000 + sizeof(int) = 1004 포인터의 증감 연산 간접 참조 연산자와 증감 연산자 2024. 10. 28. 9-1장 포인터란? ❓포인터란?: 주소 그 자체이다. 즉, 메모리의 주소이다. ❓포인터 변수란?: 메모리의 주소를 가지고 있는 변수를 의미한다. 메모리: 변수가 저장되는 공간을 의미한다. 메모리는 byte 단위로 접근할 수 있다. 메모리에는 데이터 영역, Heap 영역, Stack영역이 있다. 데이터 영역: 전역 변수 및 static 변수가 할당되는 영역 (프로그램의 시작 시 할당되어 종료 시 소멸된다.) Heap영역: 프로그래머가 할당하는 영역(프로그래머가 명시적으로 할당하고 소멸시킨다.) Stack 영역: 함수 호출 시 생성되는 지역 변수 및 매개 변수가 저장되는 영역( 함수 호출이 완료되면 소멸된다.) 자료형 별 메모리에 저장되는 형식int main(void){ int i = 10; char.. 2024. 10. 28. 5.10 Design of accumulator logic 해당 부분을 확대해보면 아래와 같다. 자, 이제 이전에 설계했던 방식대로 " AC ← ? " 형태인 수식을 모두 가져와서 분류하는 작업을 해보자. 이렇게 분류된 것을 바탕으로 논리 회로를 설계해보면 아래와 같다. 위의 식은 식의 왼쪽 조건의 경우만 따져서 만든 논리 회로이기 때문에 정확한 설계가 아니다. 따라서 AND와 ADD 다양한 연산을 신제 피연산자와 만든 논리 회로는 아래의 사진과 같다. 2024. 10. 27. 5.9 Design of basic computer 1. 기본적인 컴퓨터의 구성요소 2. Register의 LD, INR, CLR 설계AR의 LD, INR, CLRAR을 변경한다는 것은 " AR ← ? " 형태의 모든 수식들이다. 따라서, 이전에 배웠던 " AR ← ? " 형태를 모두 가져와보면 아래와 같다. 이렇게 "AR ← ?" 가져왔을 때 상위 3개는 Load에 관한 내용이고, RT₀은 Clear에 관한 내용, D₅T₄ 는 Increment에 관한 내용이라는 것을 알수 있다. 그래서 분류를 해보면 위의 사진과 같고 이를 논리 게이트로 표현해보자. 이런식으로 해당 레지스터를 변경시키는 모든 수식을 가져오고 그 변경된 값을 LD, INR, CLR로 분리하여 논리 게이트를 만들 수 있다. 3. Memory의 Read 설계 Memory를.. 2024. 10. 27. 5.8 Complete computer description 전체적인 Flowchart 전체적인 Functions 이표를 보고 외우는 것은 어렵지만, 이 표를 보고 어떤 동작인지, 각각의 변수들의 의미하는 것이 무엇인지는 알아야한다. 2024. 10. 27. 5.7 Input-output and interrupt 1. 기존의 방식(비효율적인 방법) AC, INPR, OUTR의 기본 역할 AC(누산기): 16bit 크기의 레지스터로, 컴퓨터의 계산과 명령어 수행중 발생하는 중간 결과를 일시적으로 저장하는 역할을 한다. INPR(입력 레지스터): 8bit 크기의 레지스터로, 키보드에서 입력된 데이터를 잠시 보관해두는 공간이다. OUTP(출력 레지스터): 8bit 크기의 레지스터로, 프린터로 데이터를 보내기 전에 일시적으로 데이터를 저장하는 공간이다. FGI와 FGO 플래그의 역할 FGI(Input Flag): 키보드로부터 입력이 완료되었을 때 1로 설정한다. FGI가 1이 되면 컴퓨터는 입력된 데이터를 처리할 준비가 되었다는 신호로 인식한다. FGO(Output Flag): 프린터로 데이터를 보낼 준비가 되.. 2024. 10. 27. 5.6 Memory reference instructions Memory reference instructions란? 위 format에서 Opcode의 값이 0 0 0 ~ 1 1 0으로 명령어가 결정이 되고, I의 값이 0이면 직접 참조, 1이면 간접 참조인 Instruction이다. AND(Opcode의 값이 0 0 0인 경우): 유효 주소가 가리키고 있는 메모리의 값과 AND 연산을 한 후 AC에 저장하는 것 Opcode의 값이 0 0 0 으로 동일하지만 I의 값에 따라서 16진수 표현 방식이 달라진다.즉, 간접 참조라면 1 0 0 0 x x x으로 8 x x x가 되고 직접 참조라면 0 0 0 0 x x x으로 0 x x x가 된다. ADD(Opcode의 값이 0 0 1인 경우): 유효 주소가 가리키고 있는 메모리의 값과 ADD 연산을 한 후 .. 2024. 10. 27. 5.5 Instruction cycle + Register reference instruction 하나의 Instruction(명령어)는 하나의 사이클로 이루어져있다. 하나의 사이클을 지나면서 명령어가 수행된다. 사이클의 종류 Fetch & Decode(모든 명령어에 똑같이 적용) [T₀: AR ← PC] [T₁ : IR ← M[AR], PC ← PC + 1] [T₂ : D₀ ,…, D₇ ← Decode IR(12 - 14), AR ← IR(0 - 11), I ← IR(15)] 명령어 사이클의 전체적인 Flow chart Register reference instruction: I가 0이고, Opcode가 1 1 1인 경우 Bⁱ는 Register operation의 12bit에서 i 번째를 제외한 나머지는 0인 것이다. 즉, B₂는 0 0 0 0 0 0 0 0 0 1 0.. 2024. 10. 27. 이전 1 2 3 4 5 6 7 ··· 9 다음