본문 바로가기

전체 글

(38)
[도전! 프로그래밍 1] 문제7번 윤성우의 열혈 C프로그래밍 p.250 도전7 프로그램 사용자로부터 숫자n을 입력 받는다. 그리고 다음 공식이 성립하는 k의 최댓값을 계산하여 출력하는 프로그램을 작성해보자. 2^k =< n 실행의 예 상수 n 입력: 256 공식을 만족하는 k의 최댓값은 8 코드를 이렇게 짜놨더니 이런 결과가 나왔다 정말이지 화가 잔뜩 났다. 0.000000 일단 문법적 오류는 없으니 숫자쪽을 들쑤셔야 한다는 생각이 들었는데, 계속 바꿔봐도 0.000000만 찍혀서 화가 더 났었다. 그런데 순간 이런 게 보였다. pow(double_X , double_Y) pow(double_X , double_Y) 그래서 바꿔보았다. 이렇게 수정하니까 된다 뭔가 숫자가 좀 어설프지만 답은 맞게 나온다 자료형은 진짜 처음부터 계~속 사람..
재귀함수의 개념 재귀함수란 함수 내에서 자기 자신을 다시 호출하는 함수를 의미한다. 재귀함수를 실행하는 중간에 자기 자신을 호출하게 되면, 자기 자신의 복사본을 만들어서 그 복사본을 실행하게 된다. 이 원리를 통해 완료되지 않은 함수를 다시 호출한다는 것이 가능해진다. 그런데 이렇게 계속 자기 자신을 호출하여 복사본을 깔게 되면 탈출은 어떻게 하는지가 문제가 된다. #include void Recursive(int num) { if(num
static 선언을 추가한 지역변수 (+register변수) 지역변수에 static선언을 추가하면 static변수가 된다. 지역변수 지역변수의 static 선언 선언된 함수 내에서만 접근이 가능하다 해당 함수가 반환하면 메모리에서 소멸된다 딱 1회 초기화되고 프로그램 종료 시까지 메모리에 존재한다 #include void SimpleFunc(void) { static int num1 = 0; // 딱 1회 초기화, 프로그램 종료 시까지 메모리에 존재. -> 저장된 값이 남아 다음 호출 시에, 미리 저장된 값에 계속하여 연산된다. -> 사실은 여기 존재하는 것이 아니라 전역변수로서 존재하는데, 접근 범위를 SimpleFunc함수 내로 제한하기 위해 static을 붙여 여기에 써 놓은 것이다 int num2 = 0; // 얘는 함수가 반환 값을 넘겨주면 메모리에서 사..
전역변수 vs. 지역변수 해당 함수(지역) 내에서는 지역변수로의 접근이 이뤄진다 #include int Add(int val); int num = 1; //전역변수 선언 int main(void) { int num = 5; printf("add num: %d \n", Add(3)); //여기서는 함수Add를 호출하여 함수 결과를 return하기 때문에 전역변수 1이 쓰이는 것도 아니고, main함수에서 다시 정의한 5가 쓰이는 것도 아니다. Add함수 내의 연산 결과가 return될 뿐이다. printf("main num: %d \n", num+9); return 0; } int Add(int val) { int num = 9; //특정 함수 내의 지역변수 선언 num += val; //val은 뭔데?: add함수 호출을 위해 ..
TCP/IP 기본 [socket] 소프트웨어적인 데이터 송수신 방법은 이미 대부분의 운영체제에서 지원하고 있다. 소켓이란 물리적으로 연결된 네트워크상에서의 데이터 송수신에 사용하는 소프트웨어적 장치를 의미한다. 데이터를 주고 받기 위해서는 소켓 디스크립터라는 파일 시스템을 이용해야 하는데, 이를 가능하게 해주는 것이 소켓이라고 이해하면 편하다. 리눅스에서는 모든 장치를 dev 즉, 장치로 인식한다. 따라서 어떤 식의 장치든 결국 열고 닫는 것이 기본이 된다. [TCP] 응답을 주고 받기 때문에 신뢰성이 있다. 데이터를 누락시키는 일이 없도록 해야하는 작업에 사용한다. 응답을 주고 받기 때문에 성능이 저하된다. 여기서의 성능은 속도 등을 의미한다. [UDP] 일방적으로 데이터를 전송하고 전송한 데이터에 대한 신뢰성 검증은 ..
argc / argv가 뭔데? argc argument count의 약자 함수 호출 시 함수에 전달되는 인자의 개수를 의미한다 argv argumnet vector의 약자 정해지지 않은 문자열을 의미한다 TCP/IP의 예제코드를 보면 main함수 부분에 항상 등장한다 int main(int argc, char *argv[ ]) { ....... if(argc != 3) { printf("Usage : %s \n" , argv[0]); } ....... } argc(함수 호출 시에 전달되는 인자의 개수)가 3개가 되지 않으면 argv[0](문자열)을 출력하는 코드 부분이다. 아직은 c언어에 대한 가장 쉬운 부분만 알고 있을 뿐 복잡한 함수 선언과 포인터, 스트럭처에 대해선 아는 것이 없기 때문에 보이는 내용을 해석하는 정도를 목표로 한..
break는 '반복문'을 탈출한다 #include int main(void) { int sum = 0; int num = 0; while(1) { sum+=num; if(sum>5000) break; break는 if문(조건문)을 탈출하는 것이 아니라 while문(반복문)을 탈출한다 num++; } printf("sum:%d\n", sum); printf("num:%d\n", num); return 0; } 정리: break문은 반복문 안에서 사용되며 반복문을 탈출한다
strcmp함수 구현해보기 /* 실습) 주어진 두 문자열의 사전상의 순서를 비교 해 주는 함수 mystrcmp(s, t)를 만드시오 */ #include #include int cus_strcmp(char[], char[]); int main(void) { char s[50]; char t[50]; int i = 0; int j = 0; int total; printf("첫 번째 문자열 입력: \n"); while ((s[i++] = getchar()) != '\n'); s[--i] = '\0'; printf("두 번째 문자열 입력: \n"); while ((t[j++] = getchar()) != '\n'); t[--j] = '\0'; total = cus_strcmp(s, t); if (total == 1) { printf("..