동작 방식 : 앞서 했던 알고리즘은 배열의 크기를 미리 할당한 후 사용하였습니다. 만약 배열의 크기가 더 커질 필요가 있을때 이 알고리즘은 제대로 동작하지 못합니다. 즉, 배열을 미리 선언할때 동적할당을 하여 선언합니다. 또한 명령어,이름,번호 3가지 모두 한줄에 입력하여 사용할 수 있게 수정합니다. 생각해야될 점 2가지 ! 1. 어떻게 동적할당 할 것인가 ? > malloc을 사용합니다. 2. 명령어 이름 번호를 어떻게 한줄에 입력하여 사용할 것인가 즉, 어떻게 구분 할 것인가 ? > 명령어 (공백) 이름 (공백) 번호 식으로 공백으로 각 명령어와 입력 인자를 구분합니다. #include #include #include #include #define CAPACITY 100 #define BUFFER_S..
동작 방식 : 파일을 로드하고 저장하는 기능을 추가하며, 정렬이 알파벳 순으로 되도록 추가합니다. 생각해야 할점 3가지! 1. 어떻게 알파벳 순서로 add 할 것인가 ? 알파벳 순의 add는 version1.0과 가장 큰 차이점 입니다. 위와 같이 index i를 이용해 해당 칸에 존재하는 값과 새로 들어오는 값을 비교하여 추가합니다. 2. 특정 값을 삭제할때 어떻게 삭제할 것인가 ? version 1.0에서는 맨 뒤에 값을 삭제할 값에 넣어 해결하였지만 이렇게 하면 애쓴 알파벳 정렬이 깨질 위험이 커집니다. 즉 삭제할 값 뒤쪽에 존재하는 배열을 한 칸씩 왼쪽으로 당겨야 합니다. 3. 어떻게 파일을 load하고 save할 것인가 ? 앞에서 했던 file 입출력 프로그램을 기억합니다. #include #i..
동작 방식 : 명령어 입력받고 각 기능에 해당되는 값들을 추가로 받는다. 생각해야 될점 2가지! 1. names와 numbers배열을 어떻게 처리할 것인가 ? 위와 같이 names와 numbers배열은 각각의 칸에 이름과 전화번호가 남긴 배열이 들어가야 한다. 즉, names numbers의 배열의 타입이 일반적인 char형이 아니라 cahr* 형이 되어야한다. 2. names와 numbers배열에 키보드에서 입력받은 이름과 전화번호를 넣을때 strdup를 쓰는 이유 ? buffer 배열들은 함수내에서 선언된 것들이기 때문에 함수가 종료 된후 모두 사라진다. 즉, 키보드로 입력받은 이름과 전화번호들이 소멸되기 때문에 제대로 저장할 수 없다. 이는 strdup함수를 쓰면서 해결할 수 있는데 이는 buffe..
디코더 n비트로 된 2진 코드는 서로다른 2**n개의 정보를 표현할 수 있다. 디코더는 입력선에 나타나는 n비트 2진코드를 최대 2**n가지 정보로 바꿔주는 조합논리회로이다. 인에이블(enable)단자를 가지고 있는 디코더와 각종 코드를 상호 변환하는 디코더도 있다. 1. 1X2 디코더 1X2 디코더는 입력 1개와 출력2개로 구성된다. 입력 1개에 따라 출력 2개 중 하나가 선택된다. 2, 2X4 디코더 2X4 디코더는 입력2개와 출력4개로 구성된다. 두 입력에 따라 출력 4개 중 하나가 선택된다. 하지만 실제IC들은 AND게이트가 아닌 NAND게이트로 구성되어 있으며, 출력은 다음 그림과 같이 반대로 된다. 대부분의 디코더 IC는 인에이블 입력이 있어서 회로를 제어한다. 다음 그림과 같이 인에이블이 0..
조합논리회로는 AND,OR,NOT 세 가지 기본 논리회로의 조합으로 만들어지며, 입력신호 논리게이트 및 출력신호로 구성된다. 논리게이트는 입력신호를 받아서 출력신호를 생성하며, 이과정에서 2진 입력데이터를 조합하여 원하는 2진 출력 데이터를 생성한다. 이번 장에서는 조합논리회로의 기본이 되는 가산기(adder),비교기(comparator),디코더(decoder),인코더(encoder),멀티플렉서(multiplexer),디멀티플렉서(demultiplexer),코드 변환기(code converter)등의 회로를 설계하는 방법과 이들 회로를 이용하는 방법에 대해서 알아본다. 가산기 1. 반가산기 한 자리 2진수 2개를 입력하여 합과 캐리를 계산하는 덧셈 회로. 캐리C는 입력A,B모두 1인 경우에만 1이 되고,..
문제 1. #define _CRT_SECURE_NO_WARNINGS #include #include int main(void) { char buffer[40]; while (1) { printf("$ "); //scanf("%s", buffer); // scanf는 공백 기준으로 나누므로 우리가 원하는 게 아니다. fgets(buffer,10,stdin); // gets는 라인별로 입력받는다. but 코드가 안정하지 않다. printf("%s:%d\n", buffer, strlen(buffer)); } return 0; } ============================= $ adfdfas adfdfas :8 위의 코드의 출력값을 보면 adfdfas : 8이 위 아래로 띄어쓰기 되어 있는데 이는 우리..
이전 장에서는 불 대수의 법칙을 이용하여 논리식을 간소화하는 과정을 살펴보았다. 불대수를 이요하여 간소화하는 방법은 복잡하고 실수할 확률도 높으며, 간소화되었는지 검증하기도 어렵다. 그래서 빠른 간소화 방법인 카르노 맵과 퀸- 맥클러스키방법을 사용합니다. 카르노 맵 카르노 맵은 함수에서 사용할 최소항들을 각 칸 안에 넣어서 표로 만들어 놓은 것이다. 2변수는 4개 3변수는 8개 4변수는 16개의 칸이 필요하다. 카르노 맵을 사용하는 방법을 알아보자. 함수의 출력이 1이 되는 최소항의 카로노 맵에 1을 넣는다. 나머지 빈 곳은 0으로 채우거나 비워도 된다. 무관(don't care)항인 경우에는 x나d로 표기한다. 무관항이란 입력값이 0이어도 되고 1이어도 되는 즉, 입력이 결과에 영향을 미치지 않는 최소..
문자열은 char타입의 배열의 각 칸마다 문자 하나씩 저장되는 형식입니다. C언어는 문자열을 생성하는 편리한 방법을 제공합니다. literal이라는 말은 일반적으로 수정이 불가능하다고 생각하면 됩니다. C언어에서 string.h라이브러리는 문자열을 다루는 다양한 함수를 제공합니다. #include #include int main() { char word[10]; word[0] = 'h'; word[1] = 'e'; word[2] = 'l'; word[3] = 'l'; word[4] = 'o'; //word[5] = '\0'; printf("% s", word); return 0; } ====================================== hello儆儆儆儆儆?虧V綜[ 앞에서 봤드이 마지막 문..
변수를 선언하는 대신 프로그램의 요청으로 메모리를 할당할 수 있다. 이것을 동적 메모리 할당이라고 부릅니다. malloc 함수를 호출하여 동적메모리할당을 요청하면 요구하는 크기의 메모리를 할당하고 그 시작 주소를 반환합니다. malloc함수의 리턴값이 주소값이므로 당연히 포인터 변수를 사용해야 합니다. 동적으로 할당된 배열은 공간이 부족할 경우 더 큰 배열을 할당하여 사용할 수 있습니다. 엄밀히 말하면 배열의 크기를 확장할 수 없습니다. 더큰 배열을 새롭게 만들어서 대체하는 방식으로 접근해야 합니다. 배열의 확장을 코드로 살펴봅시다. #include #include int main(void) { int* array = (int*)malloc(4 * sizeof(int)); array[0] = 1; arr..
C언어를 리뷰하기전 다음 3가지를 알면 c언어를 이해하는데 큰 도움이 됩니다. - 컴퓨터의 메모리는 데이터를 보관하는 장소 - 바이트(8bits)단위로 주소가 지정됨 - 모든 변수는 주소를 가짐 예를들어 정수는 4바이트를 할당되고, 메모리의 4바이트 공간에 sum변수가 할당됩니다. 이때 가장 앞의 번지가 그 변수의 주소가 됩니다. 포인터는 메모리 주소를 값으로 가지는 변수이고, 포인터 변수는 다음과 같이 선언됩니다. type-name * variable-name variable-name은 선언된 포인터 변수의 이름이며, *는 variable-name이 포인터 변수임을 표시하고, type-name은 포인터 변수 variable-name에 저장될 주소에 저장될 데이터의 유형을 지정합니다. ex) int * ..