C 프로그래밍 언어

1장 C언어 소개

2장 C언어의 기초
- main 함수 (Hello World 프로그램)
- 개발 환경 사용법
- 프로그램의 기본 구조 : 입력 -> 계산 -> 출력
scanf, printf, 형식지정자
- 기본 자료형 (int char float double), 변수, 상수
- 문장, 식, 연산자와 피연산자
- 연산자의 우선순위 규칙과 결합규칙
- + : int -> int -> int 또는 double -> double -> double
형변환 : 자동 형변환과 수동 형변환(형변환 연산자)
예제) 섭씨와 화씨 온도 변환 수학 공식을 C언어로 작성
[2장 복습]

- 종합문제 1번 :
달의 중력이 지구 중력의 17%. 지구에서의 몸무게를 입력
받아 달에서의 몸무게를 계산하고 출력하는 프로그램을 작성

3장 입출력문과 라이브러리 함수
- 프로그램의 기본 구조 : 입력 -> 계산 -> 출력 (라이브러리 함수 사용)

[printf 출력 형식 지정자 설명할 때 2장의 상수 복습]

- scanf / printf 형식 지정자 예제
- 삼각형 한 변의 길이 구하는 프로그램
- 가위바위보 (랜덤, n회 반복, 결과 출력)
- 주사위 게임
4장
- 프로그램의 구조 : 조건문 if / switch, 반복문 for / while

1) 내포 구조의 if : 4사분면 분류하는 프로그램 예제

- 조건식

- 반복문 사용 패턴 (종료 조건에 따른 4가지)
1) 횟수 고정
2) 횟수 지정
3) 마지막 데이터를 지정 (-1)
4) 입력의 끝 (EOF)

- 디버깅 기능 (breakpoint, step, go into, go up)

- 구구단 곱셈 테이블

- 틱택토 게임

5장 함수
- 함수 원형, 호출, 정의

- a+b 더하는 함수
- 별그리기 함수 print_star

- 가위,바위,보 게임 프로그램에 함수를 추가하기

int win(int p1, int p2);

void print(int p, char str[]);

- 값에 의한 호출 (복사)
- 지역변수, 전역변수 (이름 영역 Scope)
- static은 skip
- 재귀 함수 : fac, fib, printdigit 함수 수열
- 인셉션 영화
- 꿈속에 선언된 변수 n가 현실에서 선언된 변수 n은 다르다.
- 재귀함수 호출 = 꿈꾸기
돌아오기 = 꿈에서 깨어나기

6장 배열
- 주사위 숫자 빈도수 프로그램

- 1차원 배열 총합과 평균
=> 중간고사 점수 데이터를 입력
=> 전체 평균
=> 구간별 인원 수 (100~90, 89~80, ...)

- 2차원 배열 학생 평균과 과목 평균 (초기화)
=> 가상의 퀴즈 점수와 기말고사 점수를 생성해서 출력
=> 중간, 퀴즈, 기말 합계 기준 성적
=> 기말 점수는 랜덤
=> 중간 점수에 맞추어 기말 점수를 랜덤하게 생성

- int input(int arr[], int arr_length); (전자 칠판 참고 예제)
void output(int arr[], int arr_length);
int find(int arr[], int arr_length);
void sort(int arr[], int arr_length);
void reverse(int arr[], int arr_length);

- tictactoe 프로그램의 배열 버전

- 함수의 배열 인수 (search)
- 배열인수와 보통인수의 차이점 예제
- 1차원 배열에서 탐색 함수

- 행렬 덧셈, 곱셈
7장 문자열
- 문자와 문자열

'A' 와 "A"

"A"는 'A','\0'이므로 'A'와 다르다!
- 문자열 입출력

#include <stdio.h>

scanf, printf
gets, puts

(기타: sscanf, ssprintf)

#include <string.h>

strlen
strcpy
strcmp
strcat

(기타: atoi, atof)

- 문자처리

#include <ctype.h>

isalpha
isalnum
isdigit
islower
isspace
isupper

tolower
toupper
- 문자열 배열

문자열 자체가 1차원이므로
여러 문자열을 저장하는 배열은 2차원

 

- 단어 단위로 입력 받아 출력 하는 프로그램

- 줄 단위로 입력 받아 출력하는 프로그램
=> 웹사이트 영문 뉴스 텍스트를 입력
- 단어 빈도수를 세는 프로그램

1) 단어 길이를 기준으로 빈도수를 세는 프로그램
2) 단어별 빈도수를 세는 프로그램
필터링
1) 소문자로 변환
2) 알파벳이 아닌 문자가 포함된 경우 제외

- 고급 과제

1) 정렬된 순서로 단어별 빈도를 보여주기
8장.
- 복소수를 구조체로 표현하는 프로그램 [참고 예제]

makeComplex
printComplex
addComplex
mulComplex

- 성적 처리 프로그램 [참고 예제]

#define MAX_ID_LEN 20

struct StudScore {
char studid[MAX_ID_LEN];
double mid;
double quiz;
double final;
double score; // 100점 만점 환산 기준
};

- sizeof 연산자 [참고 예제]

- typedef [참고 예제]

1) typedef [***긴 타입***] [타입이름];
예: typedef struct Complex CPX;

- enum

1) enum [타입 이름] { 상수1, 상수2, 상수3, ..., 상수n };

enum DAY { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY };

enum DAY d; // 변수 d 선언

d = MONDAY;

if (d == TUESDAY) {
...
}

 

9장 포인터
- 포인터형 변수 선언

// 세가지 모든 동일. int 포인터 변수 p_i 선언
int* p_i; // <=== 권장하는 형태
int * p_i;
int *p_i;

p_i는 주소를 담을 수 있는 박스이고, 그 주소를 따라가면 int 값을 만나게 되는
그러한 변수이다.

- int x;
int* p_i;

x = 123;

x; // x의 값 123 ==> int 형
& x; // x의 주소 0x510000033 번지 ==> int* 형

p_i = & x; // 포인터 변수 p_i에 x의 주소를 저장
// p_i의 타입은 int*, & x의 타입도 int*

*p_i; // p_i에 들어 있는 주소를 따라가서 만나는 값, 123
*p_i = 124; // p_i에 들어 있는 주소로 가서 그 안에 있는 값을 124로 바꿈
// 이 결과 x의 값도 124로 바뀜!!!

-----------------------------
포인터 형 | 포인터 연산자
-----------------------------
* (1) | * (2)
| & (3)
-----------------------------

(1) int* p_i;

(2) *p_i; // p_i의 타입? int*, * p_i의 타입? int

(3) &p_i; // p_i의 타입? int*, & p_i의 타입? int**
- 포인터와 배열 (포인터와 문자열)

int arr[10]; // arr[0], arr[1], ...은 모두 int 형
// arr은 &arr[0]와 동일
// 따라서, arr은 int* 형
int* ptr_i;

ptr_i = & arr[1]; // int* = int*
*ptr_i = 123; // arr[1] = 123; 과 동일
*(ptr_i + 1) = 234; // arr[1 + 1] = arr[2] = 234; 와 동일
*(ptr_i - 1) = 345; // arr[1 - 1] = arr[0] = 345; 와 동일
- 포인터의 배열 (포인터와 배열이 아니라, 포인터의 배열!)

int* ptr_arr[10]; // int* 형의 주소를 10개 담을 수 있는 배열 ptr_arr
// int형 값을 10개 담는 것이 아님

int a0, a1, a2, a3, a4, ... ;
int arr[10];
ptr_arr[0] = &a0;
ptr_arr[1] = arr;
...
- 구조체 포인터

struct Student {
char id[MAX_ID_LEN];
char name[MAX_NAME_LEN];
int mid;
int quiz;
int final;
double score;
};

struct Student s;
struct Student* ptr_str;

ptr_str = & s;

strcpy( (*ptr_str).id, "2015253001" );
strcpy( ptr_str->id, "2015253001" ); // (*ptr_str).id 는 ptr_str->id와 동일

// 괄호를 빼서 *ptr_str.id로 작성하면
// *(ptr_str.id)로 해석해서 컴파일 에러 발생!
strcpy( ptr_str->name, "Hong, Gil-Dong" );
ptr_str->mid = 75;
ptr_str->quiz = 50;
ptr_str->final = 100;
ptr_str->score = ptr_str->mid * 0.3 + ptr_str->quiz * 0.1 + ptr_str->final * 0.3;
- 포인터와 함수
// int를 입력받는 함수 작성 (잘못 작성한 예)

void getint( int arg_i ) {
scanf("%d", &arg_i );
}
// 메인 함수 코드 예
int i = 0;

getInt( i );

printf("%d", i); // i는 항상 0.
// 포인터 형 함수 인자를 사용하여 제대로 작성한 예

void getint( int* ptr_i ) { // ptr_i이 int* 포인터형!!!
scanf("%d", ptr_i ); // ptr_i는 이미 주소 이므로 &를 붙이지 않는다.
}
// 메인 함수 코드 예
int i = 0;

getInt( & i ); // 정수를 입력 받을 변수(i)의 주소 (& i)를 함수에 전달

printf("%d", i); // i는 입력 받은 정수

 

Q. 종합문제 1번 포인터 사용 코드 예에서 잘못된 예를 찾기
Q. ptr_test.c 예제
====================================================================
1) 기본 자료형
int, char, double, float

2) 확장 자료형

2-1) 배열
int a[10], char c[10][20];

2-2) 구조체형
struct MyStrName {
int i;
char c[10];
double d;
}
(cf. 구조체 배열)
struct MyStrName arr[10]; // struct MyStrName형 원소 10개

2-3) 포인터형
int* p_i;
double* p_d;
struct MyStrName* p_s;

(cf. 포인터 배열)
int* a[10]; // int* 원소 10개를 담는 배열 a

(cf. 포인터를 멤버로 갖는 구조체)
struct YourStrName {
int* p_i;
double d;
char* p_c;
};

2-4) 열거형
enum MONTH { JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };
(cf. int x = JAN; x의 값은 0
int y = FEB; y의 값은 1
int z = MAR; z의 값은 2)

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *