C 프로그래밍 CTI長 윤진훈
목차 0. 들어가기 전에 1. C 프로그래밍의 방법 2. C 프로그램의 기본 구조 3. printf 함수 4. 변수 5. 연산자 6. scanf 함수 P1. 과제 1차 7. 데이터 표현 방식 8. 기본 자료형 9. 반복문, 조건문 P2. 과제 2차 10. 함수 11. 1차원 배열 12. 다차원 배열 P3 과제 3차 13. 포인터 14. 배열과 포인터의 관계 15. 배열 포인터, 포인터 배열 16. 함수와 포인터의 관계 S1. 세미나 과제 T1. C 프로그래밍 Term
0. 들어가기 전에 학습의 유의사항 학습의 순서 API C MFC C++ 숙제는 인터넷에서 찾지말고 스스로 할 수 있는 데까지 풀어라. 하루에 5시간 이상 코딩한다고 생각하라. 과제는 hosman@nate.com으로 다음 시간 교육 전까지 제출할 것 학습의 순서 C : 가장 기본적인 콘솔 프로그램을 만드는 방법을 배운다. C++ : C에서 확장된 개념을 배운다. API : 윈도우즈에서 사용하는 프로그램을 만드는 방법을 배운다. MFC : 실제 개발자들이 사용하는 라이브러리에 대해 배운다. API C MFC C++
1. C 프로그래밍의 방법 C 언어 프로그래머 프로그램의 완성 과정 작성 컴파일 링크 실행 프로그래밍 언어이다. (컴퓨터와 대화할 수 있는 언어) 절차지향적 프로그래밍이다. (한 줄씩 순서대로 진행.) 프로그래머 프로그래밍 언어를 통해 실생활의 문제를 컴퓨터를 통해 해결하는 사람 프로그램의 완성 과정 프로그램의 작성 : Visual Studio 2003 .net C++을 이용하여 Code 작성 컴파일 : 소스 코드가 맞는 지, 틀렸는 지 검사 (Ctrl + F7) 링크 : 컴파일된 코드를 라이브러리 파일과 연결 실행 파일 생성 : 프로그램을 사용한다. (Ctrl + F5) 작성 컴파일 링크 실행
2. C 프로그램의 기본 구조 C 프로그램의 기본 구조 기억사항 코딩을 시작하면 이것부터 적어 놓고 시작한다!! #include <stdio.h> int main() { printf(“C 프로그래밍 시작 \n”); return 0; } 기억사항 모든 문장은 ;으로 끝난다. (예외 존재) printf() : 화면에 출력하는 함수 “String“ : 문자열 ‘A‘ : 문자 \n : 줄을 바꾸라는 의미 (Enter 키를 누른 효과 발생) 코딩을 시작하면 이것부터 적어 놓고 시작한다!!
3. printf 함수 printf()의 구조 printf()의 사용 예제 기억사항 printf(“나의 나이는 %d세 입니다. \n”, 20); printf(“%d + %d = %d입니다. \n”, 10, 20, 30); printf(“n이 \nm과 같다면 \nn = m이다. =n” ); printf(“1 + 2 = 5 \n”); printf(“%d - %d = %d \n” 50, 20); 기억사항 %d : 숫자를 출력할 때 사용 printf(%d의 갯수 와 콤마(,) 뒤에 오는 숫자의 개수가 같아야 한다) 함수명은 소문자로 적어야 돼고, 오타를 조심하며 꼭 ;는 빼먹지 않도록 주의한다.
4. 변수 변수의 정의 변수의 사용 예제 기억사항 변수 : 데이터를 저장할 수 있는 메모리 공간 프로그래머에 의해 언제든지 값이 변할 수 있다. 단, 메모리 공간의 주소는 바뀌지 않는다. (집 주인은 바뀌지만, 집 주소는 영원하다.) 변수의 사용 예제 int i; // 정수를 저장할 수 있는 메모리 공간. 이름은 i char c; // 문자 1개를 저장할 수 있는 메모리 공간. 이름은 c float f; // 실수를 저장할 수 있는 메모리 공간. 이름은 f 기억사항 변수명으로 사용할 수 있는 것은 알파벳, 숫자, 언더바(_)이다. 대소문자를 구분한다. (Form과 form은 다른 변수이다.) 변수명은 숫자로 시작할 수 없고 키워드(ex. int, printf)를 사용할 수 없다. 공백(space)이 포함될 수 없다. 변수는 초기화하지 않으면 쓰레기값이 들어있다.
5. 연산자 산술 연산자 대입 연산자 관계 연산자 논리 연산자 + : 덧셈 -: 뺄셈 * : 곱셈 / : 나눗셈 % : 나머지 = : 오른 쪽에 있는 값을 왼쪽에 대입 (수학에서의 개념과 틀리다!) 관계 연산자 == : 같은 지를 비교 < >: 크거나 작은 지를 비교 논리 연산자 && : 피연산자가 모두 참이면 true를 반환 || : 피연산자 중 하나라도 참이면 true를 반환
5. 연산자 기타 대입 연산자 증가, 감소 연산자 비트 연산자 기억사항 +=, -=, *=, /=, %= ++a, a++, --a, a— 비트 연산자 ~, &, ^, |, <<, >> 기억사항 앞 페이지의 연산자는 자주 쓰므로 반드시 기억한다. 이 페이지의 연산자는 나중에 좀 더 익숙해지면 필요하므로 그런 게 있다는 것만 기억한다. =과 ==을 혼동하지 말 것 (둘 다 수학의 같다는 개념과 틀리며, 서로 다른 의미로 동작한다.)
6. scanf 함수 기억사항 scanf()의 구조 scanf()의 사용 예제 scanf(“입력받은 값”, &변수); 2번째 인자의 변수 앞에 반드시 &을 붙여야 한다. 사용자가 입력할 때까지 무한 대기한다. scanf()의 사용 예제 scanf(“%d”, &i); // int i가 선언 되어있는 경우 scanf(“%f”, &f); // float f가 선언 되어있는 경우 scanf(“%s”, &c); // char c가 선언 되어있는 경우 (문자이지만 s를 써야함) scanf(“%d, %d, &i, &j); // int i, j가 선언되어 있는 경우 scanf(“%d, %f, &i, &f); // int i, float f가 선언되어 있는 경우 기억사항 두번 째 인자 앞에 & 붙이는 것 절대 잊지 말 것 두 개 이상의 값을 입력 받을 때는 공백(space)로 구분한다.
P1. 과제 1차 연습문제 (p77) 문제 1. 사용자로부터 두 개의 정수를 입력받아서 뺄셈과 곱셈 연산의 결과를 출력하는 프로그램을 작성하라. (모든 프로그램에서 printf()과 scanf()를 사용하라) 문제 2. 사용자로부터 세 개의 정수를 입력받은 다음에 곱과 합을 순서대로 진행해서 그 결과를 출력하는 프로그램을 작성하라. 문제 3. 하나의 정수를 입력받아서 제곱 연산을 한 다음 얻어지는 결과를 출력하는 프로그램을 작성하라. 문제 4. 입력받은 두 개의 정수를 나누었을 때 발생하는 나머지 값을 출력하는 프로그램을 작성하라. (%연산자를사용하라) 문제 5. 입력받은 세 개의 정수를 가지고 (a - b) * (b + c) * (c % a) 연산 결과를 출력하는 프로그램을 작성하라. 복습 1장부터 3장까지 읽고 이해한다.
7. 데이터 표현 방식 컴퓨터가 데이터를 표현하는 방식 데이터의 표현 단위 정수의 표현 방식 실수의 표현 방식 모든 데이터의 표현 및 연산을 2진수로 처리 2진수의 표현 범위 : 0, 1 10진수의 표현 범위 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 16진수의 표현 범위 : 0, 1, 2, 3, 4, 5 ,6, 7, 8, 9, a, b, c, d ,e, f 데이터의 표현 단위 비트(bit) : 2진수 값 하나를 저장할 수있는 메모리 공간 바이트(byte) : 비트가 8개 모인 것 정수의 표현 방식 가장 왼쪽의 비트는 부호 비트 음수는 2의 보수로 표현 실수의 표현 방식 부동소수점 방식 : 적은 비트로 넓은 범위의 실수를 표현할 수 있지만, 부정확하다.
8. 기본 자료형 C 언어의 기본 자료형 sizeof 연산자 ASCII 코드 상수 영어와 특수문자에 대해 문자상수로 정한 표준 규약 상수 리터럴 상수 : 이름이 없는 상수 심볼릭 상수 : const 키워드를 이용하는 방식, 매크로를 이용하는 방식 자료형 할당되는 메모리 크기 표현 가능한 범위 char 1바이트 256가지의 문자 int 4바이트 -21억 ~ +21억 float 3.4 X 10-37 ~ 3.4 X 1038 double 8바이트 1.7 X 10-307 ~ 1.7 X 10308
9. 반복문, 조건문 for문의 구조 if문의 구조 루프의 생략과 탈출 그외의 반복문, 조건문 { 반복하고자 하는 내용 } if문의 구조 if(실행 조건) 실행하고자 하는 내용 루프의 생략과 탈출 break : 가장 가까이 감싸고 있는 반복문 하나를 탈출 continue : 루프의 맨 처음으로 돌아간다 그외의 반복문, 조건문 while, do~while, switch
P2. 과제 2차 연습문제 문제 1. 다음과 같은 출력을 하는 프로그램을 작성하라.(단, 삼각산의 높이는 사용자로부터 입력을 받도록 하며 for문을 이용하라) 문제 2. 사칙연산을 수행하는 프로그램을 작성하라. (단, 사칙연산을 하는 함수를 사용하여야 한다. 각각 ADD(), SUB(), MUL(), DIV()로 구현하라) 문제 3. 구구단 3, 5, 7단을 출력하는 프로그램을 작성하라. (단, 중첩된 for문의 형태로 구현하고, continue또는 break를 사용하라) 문제 4. 다음과 같은 출력을 하는 프로그램을 작성하라. (단, 삼각산의 높이는 사용자로부터 입력을 받도록 하며, for문과 if문을 이용하라) 복습 4장부터 9장까지 읽고 이해한다 * *** ***** ******* ********* ******** *********** *******************
10. 함수 함수의 구조 지역변수와 전역변수 기억사항 int Sum(int a, int b) { return a + b; } 지역변수 : 함수 구역 내에서만 사용 가능 전역변수 : 프로그램의 모든 구역에서 사용 가능 기억사항 함수의 인자값은 복사된 값이다. (Call by Value) 함수가 포함된 프로그램의 실행흐름을 이해한다.
11. 1차원 배열 배열의 정의 배열의 구조 기억사항 같은 자료형들의 모임 int array[10]; 배열의 길이는 오직 상수만 가능 첫 번째 요소는 [0]이다 배열의 초기화 : int array[5] = {0, 1, 2, 3, 4}; 배열의 마지막 요소는 null 문자이다. (문자열의 마지막을 뜻한다.)
12. 다차원 배열 다차원 배열의 형태 기억사항 1차원 배열 arr[2] 2차원 배열 arr[2][3] 어떠한 형태이든 배열은 1차원의 선형으로 접근한다. (논리적으로 나뉠 뿐이다.) arr[0] arr[1] arr[0][0] arr[0][1] arr[1][0] arr[1][1] arr[2][0] arr[2][1]
P3. 과제 3차 연습문제(p435) 복습 문제 1. 달팽이 만들기(단, 사용자로부터 개수를 입력받는다.) 문제 2. 숫자야구 만들기(단, 숫자의 선정은 ramdom()을 써서 랜덤하게 발생시킨다.) 복습 11장, 16장을 읽고 이해한다. 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 정답 : 4 6 8 1번째 도전 : 1 2 3 결과 : 0S 2번째 도전 : 4 5 6 결과 : 1S 1B 3번째 도전 : 4 6 7 결과 : 2S 4번째 도전 : 4 6 8 결과 : 3S
13. 포인터 포인터의 정의 포인터의 구조 포인터 문법의 이해 기억사항 포인터 : 메모리의 주소 값을 저장하기 위한 변수 int *pi = &i; 포인터 문법의 이해 &pi : pi의 주소 *pi : pi가 가리키고 있는 주소의 내용 pi : pi가 가리키고 있는 주소 기억사항 포인터는 4바이트, 포인터는 주소 임의의 한 포인터는 위 문법을 통해 값의 변동없이 3가지 값을 표현가능하다. 10 100번지 (int *pi;) 30 200번지 (int i;)
14. 배열과 포인터의 관계 배열명 포인터와 배열의 관계 기억사항 배열명은 상수 포인터 배열명은 첫 번째 요소의 주소 값을 나타낸다. Arr = &Arr[0] 포인터와 배열의 관계 int arr[3] = {0, 1, 2}; int *parr; parr = arr; // parr이 가리키는 주소는 arr(arr의 첫번째 요소의 주소)이다. arr[i] = *(parr + i) // arr이 포인터, 배열명인 경우 parr[0] : arr의 첫 번째 요소의 값 parr[1] : arr의 두 번째 요소의 값 parr[2] : arr의 세 번째 요소의 값 //parr이란 글자를 arr로 바꾸면 정확히 맞다!! 기억사항 포인터가 배열을 가리킬 때 배열처럼 사용할 수 있다. 포인터 연산은 대상의 크기에 영향을 받는다. 포인터 연산은 “숫자의 변화”가 아닌 “다음으로 넘어간다”는 의미로 받아들이자
15. 배열 포인터, 포인터 배열 포인터 배열 배열 포인터 기억사항 자료형이 포인터인 배열 int *arr[5] : 이름이 arr이고 int *형 자료 5개로 구성된 배열 배열 포인터 배열을 가리키는 포인터 int (*parr)[5] : 2차첨자가 5인 배열을 가리키는 포인터 기억사항 끝 말에 오는 게 핵심이다. 배열 포인터 배열 포인터 배열은 무엇인가? ▷ 배열을 가리키는 포인터의 배열을 가리키는 포인터의 배열이다!! 배열 포인터를 만들때는 반드시 괄호로 싸야 한다. (싸지 않으면 포인터 배열이다!)
16. 함수와 포인터의 관계 호출 방식 scanf()에서 &을 붙이는 이유 기억사항 Call by Value : 값의 복사에 의해 호출된다. Call by Reference : 주소를 전달한다. scanf()에서 &을 붙이는 이유 scanf()는 함수이다. 변수에 입력받은 내용을 담기위해 Call by Reference방식을 사용한다. 주소를 전달해야 하므로 &을 붙여야 한다 문자열은 왜 &을 안 붙일까? : 배열명은 배열의 주소를 나타내기 때문이다. 기억사항 호출 방식에 대한 그림이 그려져야 한다. 함수의 인자가 무엇이냐에 따라 호출 방식이 틀려진다.
S1. 과제 4차 세미나 발표 작성시 유의사항 과제 1. 책의 12, 13, 14장을 읽고 PPT 파일을 작성하라 파워포인트를 이용해서 작성할 것 책의 코드를 옮기지 말고 이해한 내용을 축약해서 표현할 것 과제 당 PPT는 10장 내로 작성할 것 발표시간은 20분으로 맞출 것
T1. C 프로그래밍 Term 도서 관리 프로그램을 작성하시오 조건 메뉴 구성 : 삽입, 삭제, 검색, 종료 삽입 : 동적할당을 이용하여 삽입 기능을 구현한다. 삭제 : memmove()를 이용하여 삭제 기능을 구현한다. 검색 : 저자로 단순 검색하는 기능을 구현한다. 종료 : 파일 입출력을 이용하여 종료 시 책 정보를 파일에 저장한다. 책 정보는 구조체 배열로 구현하며 [책 제목, 저자, 출판사]를 나타낸다. (길이는 #define MAX 50 로 한다) [도서 관리 프로그램] 삽입 삭제 검색 종료 [책 구조체] 제목 : C 프로그래밍 저자 : 홍길동 출판 : 조선사