C42 스택구조_후위표기식_수식 계산하기(괄호 포함 수식) [2/3] 괄호를 어떻게 해결할지 한참 고민했네요. "괄호가 시작되면 별도의 수식으로 생각한다." 라는 점을 두고 한참 고민하다 답을 찾긴 했습니다. 맞는진 모르겠지만..ㅎㅎ 기본 개념도는 아래와 같습니다. 괄호가 시작될 때마다 새로운 배열로 만들어주고, 괄호가 닫히면 괄호안의 값을 계산해서 앞 수식의 뒤에 붙여주는 방식으로 괄호가 없는 최종 수식을 만들어내면 되네요. 괄호만 잘 골라내주면 어제 만든 계산 수식을 이용해 간단히 짤 수 있었습니다. [ main() ] 수식이 길어져서 소스파일을 나눔 #include "Header.h" int main() { /* 중위표기식 원본 문자열*/ char form[] = "10+21*(2*(15-10)/2)-3"; int result = calculation_all(fo.. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 스택구조_후위표기식_수식 계산하기(괄호 없는 수식) [1/3] [구현 목표] 수식 내 우선순위에 따른 계산 결과 도출 ex) "2 + ((35+65) / 25) * 7" 과 같은 형태의 수식 계산 (엑셀과 비슷) 강의 보기 전에 미리 해보고 있는데 생각보다 엄청 복잡하네요.. 공부 하면서 가장 많이 느끼는 점은 간단해보이는 프로그램들이 실제로는 간단하지 않다는거.. 존경해요 MS.. 괄호까지 한번에 해결하려고 했는데 제 머리로는 답이 안나오네요. 일단 괄호가 없는 식을 계산하는 함수를 만들고, 괄호가 나오면 함수를 통해 괄호가 없는 것처럼 따로따로 계산하는 방식을 사용하기로 했습니다. [ main() ] 입력받을 수식을 저장하는 공간, 후위표기식으로 변환 저장할 공간, 결과값 공간 생성 #include #include #include void postfix(ch.. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 스택구조_괄호 수식 검증 [1/1] 해당 과제는 유투브 '권오흠'님의 자료구조 강의를 참조하였습니다. 닫힌 괄호는 가장 마지막에 나온 열린 괄호와 같은 유형이어야 한다라는 점만 유의하면 간단하게 작성할 수 있습니다. 어차피 스택과 같은 후입선출 개념을 사용할 수밖에 없습니다. 열린 괄호가 나오면 해당 유형 번호를 배열에 순서대로 저장 닫힌 괄호가 나오면 가장 마지막에 나온 열린 괄호와 유형이 같은지 확인 후, 해당 배열값을 제거 해당 순서의 열린괄호와 다른 유형의 닫힌 괄호가 나오면 에러값 반환 짝이 맞지 않아 배열의 값이 남거나 또는 모자랄 경우 에러값 반환 실제 엑셀과 같은 괄호 계산 식의 구현은 다음글들을 참조하시면 됩니다. 2019/12/09 - [C언어/알고리즘 및 자료구조] - 스택구조_후위표기식_수식 계산하기(괄호 없는 수식).. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 연결리스트_일반 배열 vs 연결리스트 [3/3] 일반 배열과 연결리스트는 비슷한 개념이지만, 사용 여부는 '순서'에 따라 달라질 것 같습니다. 일반 배열 : 들어온 순서대로 데이터가 쌓일 때 유리 연결리스트 : 들어온 순서가 관계 없이 특정 기준으로 데이터가 항상 정렬되어야 할 때 유리 [일반배열] 데이터 순서를 변경할 때 해당 순서 뒤의 데이터를 모두 복사-붙여넣기 해줘야함 중간에 데이터가 들어오거나 삭제될 때마다 뒷 순서의 배열을 모두 옮겨주는 작업이 발생 데이터 변경이 많을 수록 비효율적인 구조가 됨 배열의 크기는 미리 정해놔야하기 때문에, 빈 메모리 공간이 발생하여 비효율 초래 배열이 꽉 차 새로 메모리를 할당할 경우, 모든 데이터를 복사하는 작업 발생 ※ Point 따라서 데이터의 순서변경이 잦거나, 쌓이는 데이터의 수량을 적절히 파악하기 힘.. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 연결리스트_다항식_코드 상세 [2/3] 워낙 간단한 수준이라 주요 포인트만 짚어보겠습니다. 해당 과제는 유투브 '권오흠'님의 자료구조 강의를 참조하였습니다. [ 메인 함수 ] 각 다항식을 차수별로 정렬하기 위해 구조체의 연결리스트 방식을 사용 read_line 함수에서 명령어를 읽어서 처리하며, 입력 글자가 없으면 continue #define INPUT 50 #define LIST 10 /* 다항식 각 요소 저장 연결리스트 */ typedef struct Inside { int coef;// 지수 int expo;// 계수 struct Inside* next; }Inside; /* 변수 이름 및 다항식 head 위치 */ typedef struct { char* name; // 변수 이름 Inside* head; // 다항식(연결리스트)의 .. ▸C언어/알고리즘 및 자료구조 2019. 12. 5. 연결리스트_다항식_구현목표 및 전체코드 [1/3] [ 구현 목표 ] 다항식 차수별로 내림차순으로 저장 'printf 변수' 출력 시 해당 형식에 맞게 출력 (존재하지 않는 변수의 경우 경고메세지 출력) '='이 두 개 이상 포함 시 경고 메세지 출력 기존 존재하는 변수에 식을 넣으면 덮어쓰기 기존 변수를 활용한 더하기 기능 명령어 입력 시 띄워쓰기 무시 'calc (변수) (x값) 입력 시 계산결과 출력 및 해당하는 변수가 없을 경우 경고 메세지 출력 'exit' 입력 시 프로그램 종료 [ 전체 코드 ] * 다음 글 코드 상세 참조 #include #include #include #include #define INPUT 50 #define LIST 10 /* 다항식 각 요소 저장 연결리스트 */ typedef struct Inside { int coef.. ▸C언어/알고리즘 및 자료구조 2019. 12. 5. 삼항연산자(3항연산자) 사용법 (if문 대체) 가끔 if문이 길어지면 보기가 불편할 때가 있습니다. 간단한 if문을 대체할 수 있는 삼항연산자의 사용법입니다. [ 문법 ] 조건 ? 참일경우 실행할 내용 : 거짓일경우 실행할 내용; int main() { int a = 200; int b = 100; a > b ? printf("a가 크네") : printf("b가 크네"); } 위와 같이 문법은 매우 간단합니다. 다시 응용을 좀 해보자면 아래와 같이 쓸 수도 있습니다. 1. 실행할 내용이 변수에 값을 넣어줄 때 (변수가 하나) 연산자 우선순위로 인해, c = (a > b ? 1 : 0); 방식으로 실행됨 삼항 연산자부터 실행해서 값을 가져온 뒤, c에다가 넣어줌 int main() { int a = 200; int b = 100; int c = .. ▸C언어/개발 TIP 2019. 12. 5. atoi() 함수 없이 문자열의 숫자를 int타입으로 변환 아래와 같이 char 타입은 int 타입과 같이 바로 정수 계산이 됩니다. 정수형으로 데이터를 저장하기 때문에, 연산자 계산 시 int 타입 계산과 동일 정수형("%d")으로 출력하면 int형과 동일하게 출력됨 (다만 int타입은 4byte, char타입은 1byte) 문자형("%c")으로 출력하면, 저장하고 있는 정수가 표현하는 아스키코드상의 문자를 출력해줌 이러한 특성 때문에 char타입은 int타입과 동일하게 작동하고, 다만 1byte로 사이즈만 작다고 볼 수 있습니다. 하지만 문자열(String)에서는 아래와같이 다른 결과가 나옵니다. 숫자도 무조건 문자로 인식해서 아스키코드의 번호로 저장 (즉, '문자 1 == 아스키코드 49' 로 저장) 출력할때도 하나하나 아스키코드→문자열로 변환해서 .. ▸C언어/개발 TIP 2019. 12. 5. Debug 모드에서 sprintf_s() 함수 사용 시 주의사항 문자열(String) 작업을 하다가 sprintf_s() 함수를 써서 붙이고 진행하는데 계산이 꼬이는 문제가 발생해서 이것저것 해보다보니 신기한게 보여서 정리합니다. 예를 들어 아래 코드를 Debug 모드에서 실행했을 때 결과입니다. 분명 char* str에 할당된 공간을 모두 '\0'값으로 초기화 시켜줬음에도 불구하고 공백이 생겨납니다. void main() { char* str = (char*)malloc(sizeof(char) * 30); /* 초기화 */ for (int i = 0; i < 30; ++i) str[i] = '\0'; printf("\n\n "); int a = 1; sprintf_s(str, sizeof(int), "%d", a); *(str + strlen(str)) = 'a';.. ▸C언어/개발 TIP 2019. 12. 5. string.h_strcmp, strcnmp_문자열 비교 (구현식 포함) [ strcmp ] 문자열 비교 (대소문자 구분) 앞의 문자가 더 크면 1 값이 같으면 0 뒤의 문자가 더 크면 -1 [ strncmp ] 지정한 갯수만큼만 앞에서부터 비교 #include #include int main() { char str1[] = "abcdef"; char str2[] = "abcdaa"; char str3[] = "abcdzz"; char str4[] = "abcdef"; printf("%d ", strcmp(str1, str2));// 1 (앞의 문자가 더 큼) printf("%d ", strcmp(str1, str3));// -1 (뒤의 문자가 더 큼) printf("%d ", strcmp(str1, str4));// 0 (같음) printf("%d ", strncmp(st.. ▸C언어/기본함수 및 구현식 2019. 12. 5. C언어의 메모리_스택 메모리 [2/2] C언어로 만든 프로그램은 함수 호출로 시작해서 함수 호출로 끝난다고 해도 무방합니다. 다른 언어도 근본적으로는 모두 똑같습니다. 함수를 효율적으로 처리하기 위해 사용되는 메모리가 바로 스택 메모리입니다. [ 스택 메모리 ] 앞서 말한 네 가지 영역 중 스택 세그먼트(Stack Segment) 전체를 의미 함수 실행을 위해 동적 할당 되는 메모리 공간 후입선출(LIFO - Last Input First Out) 방식으로 작동 [ 스택 프레임 (Stack Frame)] 스택 영역(Stack Segment) 내에서 하나의 함수 실행을 위해 할당받는 메모리 덩어리 후입선출이란, 이 스택 프레임이 순서대로 쌓이고 마지막 스택 프레임이 먼저 빠지는 것을 의미 [ C언어의 함수란? ] 프로그램 안에서 자주 쓰이는 .. ▸C언어/기본 상식 2019. 12. 5. C언어의 메모리_기본 구조 [1/2] C언어의 메모리 구조를 살펴보겠습니다. 디테일하지 않게 추상화하여 정리했습니다. 먼저 C언어에서 사용하는 메모리의 구조 입니다. 사실 다른 언어들도 같은 구조를 사용하지만 사용하는 방법이나 각 segment를 사용하는 용도가 조금씩 다릅니다. 1. 코드 영역 (Code Segment) 먼저 프로그램이 실행되면 프로그램의 실행 명령어인 바이너리 코드가 코드 영역에 저장됩니다. 코드 자체에 포함된 문자열이나 상수 또한 프로그램 실행 시 절대 변경되면 안되기 때문에 코드 영역에 저장됩니다. 텍스트 영역( (Text Segment)이라고도 함 컴파일되어 바이너리 코드(기계어) 형태로 저장된 영역 코드에 직접적으로 적혀있는 문자열(String)과 상수 또한 코드 영역에 저장됨 프로그램 실행 시 절대 변경되면 .. ▸C언어/기본 상식 2019. 12. 5. 이전 1 2 3 다음 💲 추천 글 반응형