2019 C프로그래밍

IVIS wiki

Top

강의 개요

  • 수강생 여러분은 이 교과목을 통해서 다음과 같은 내용을 익히게 됩니다
  • 오랜 역사와 수많은 사용자를 가진 C 프로그래밍 언어를 배우게 됩니다.
  • C 프로그래밍을 통해 문제해결을 할 수 있는 능력을 익힌다
    • 기초적인 자료형의 이해와 프로그래밍의 원리를 익히도록 한다.

강의 진행

  • 강사의 강의와 토론 그리고 프로그래밍 실습을 통하여 프로그래밍 기법을 익힌다
    • 주당 3시간의 강의이며 이론 강의와 프로그래밍 실습을 병행한다.
  • 강의실 : 51호관 310호실
    • 강의시간 : 매주 월요일 오후 12:00-14:45

강사

  • 정보통신공학과 교수 박동규
  • 이메일 : dongupak at gmail.com
    • 수시상담 환영

강의조교(TA)

  • 여러분의 강의를 도와줄 조교입니다
  • 박연진, 윤소정 조교님
    • 강의와 실습중 궁금한 점을 해결해 주실겁니다.
    • 실습중 문제가 있으면 손을 들어서 알려주십시오.

강의 교재

  • 쉽게 풀어쓴 C 언어 Express
    • 저자: 천인국(생능출판)
    • 정가 30,000원

2019 C textbook.jpg

  • 배우게 될 내용
    • 수강생 여러분은 이 교과목을 통해서 다음과 같은 내용을 익히게 됩니다.
      • C 프로그래밍 프로그래밍을 통하여 다양한 문제를 접하면서 자연스럽게 프로그래밍 기법을 익힌다.
      • C 언어를 통한 기초적인 자료형의 이해와 프로그래밍의 원리를 익히도록 한다.
      • C 프로그래밍 언어를 이용하여 다양한 문제해결 능력을 익힌다.

과제관련

  • 과제 제출 기간은 제출일로부터 일주일
  • 각 문제 마다 아래 채점 기준을 만족 못할 시 한 문제당 1점씩 감점

  • 과제 표지
    • 매 표지 마다 과제 번호를 기입한다. ex) #1, #2, ...
    • 스탠플러는 왼쪽 상단에 찍는다.
  • 이론 문제
    • 문제와 답을 적는다.
      • 문제를 적지 않을 시 감점
      • 타이핑 가능
      • 스캔 불허
  • 실습 문제
    • 문제와 소스코드을 적는다.
      • 문제를 적지 않을 시 감점
      • 타이핑 가능
      • 스캔 불허
    • 실행 결과를 캡쳐하여 삽입한다.
      • 배경은 흰색으로 한다.
    • 코드에는 주석을 달도록한다.
      • 주석 달지 않을 시 감점
    • 각 실습문제마다 느낀점이나 어려웠던 점을 2문장 이상 적어서 제출한다.
      • 느낀점을 적지 않을시 감점
      • 풀지 못한 문제나 어려운 문제도 반드시 느낀점을 적도록 한다.
  • 과제 샘플

2017 VP Reportform1.png 2017 VP Reportform2.png

맥 활용

1주차 강의(9월 2일 월요일)

  • 개학 인사
  • 한학기 강의에서 다루게될 내용, 교재등에 대한 소개
  • 프로그래밍을 알아야 하는 이유
    • 컴퓨터 프로그래밍의 간단한 역사등
    • 강의에 대한 소개
  • Xcode 다루기
  • Xcode 를 이용하여 다음 프로그램을 직접 짜보도록 합니다.
    • 짜볼 프로그램
      • 널널한 교수의 기초 C 언어 03_1, 04_1, 04_2, 04_3, 05_1, 05_2, 06_1에 있는 LAB 코드를 입력하고 실행하시오.
      • 모든 입력 코드는 03_1_1, 03_1_2 와 같은 프로젝트 명으로 만든 프로젝트에서 만들고 조교에게 검사를 받도록 하시오.

강의자료

널널한 교수의 기초 C 프로그래밍 강좌안내

과제 #1

  • 제목 : 널널한 교수의 C언어 기초 강의 01_1에서 04_1장 수강평 남기기
  • youtube 널널한 교수의 기초 C강의 01_1에서 04_2장까지 6개 시청 후 감상문 제출
    • 제출일 : 9월 9일 월요일 강의시작 전에 제출
    • youtube 동영상 각각에 대하여 동영상을 시청한다
    • 시청 후 수강평을 남기고 5개의 동영상에 대한 수강평을 캡쳐하여 1페이지에 모아서 제출할 것
    • 수강평에는 다음과 같은 내용이 남도록 수강평을 적어주세요(본인의 이름이 반드시 들어갈 것)
수강 : 홍길동
수강평 : 0000000 에 대해 자세히 알게되었으며, 000에 대해서 0000라고 생각합니다.
  • 제출시에는 6개의 동영상의 핵심 내용을 2개 이상의 문장으로 정리하여 제출하시오.

2주차 강의(9월 9일)

강의자료 2장

과제 #2

  • 제목 : 교재 2장 Exercise, Programming
    • P 87 - 89 쪽의 문제 풀이와 프로그래밍
    • 소스코드와 실행결과 해결과정의 느낀점을 제출하세요.
  • 각자 개인 PC에서 Xcode나 Visual Studio등의 개발도구를 사용하세요.

3주차 강의(9월 16일)

  • 프로그래밍 기초
    • 자료형과 변수선언
    • 기본 자료형과 상수 표현방법
    • C프로그래밍 언어의 구성
    • 함수와 함수 호출

참고

강의자료 3장

과제 #3

  • 제목 : 교재 3장 연습문제 풀이
    • 문제 : 교재 3장 Programming 문제 1-6번 풀이
  • 제출일자 : 2019년 9월 23일(월)
  • 화면의 바탕색상은 흰색, 글씨는 검정색으로 하여라
  • 과제를 하면서 느낀점과 어려웠던 점을 2문장 이상 적어서 제출할 것
  • 모든 문제에 대하여 주석문을 2개 이상 달아야 합니다.

4주차 강의(9월 23일)

  • C 전처리와 입력 출력
    • 예제 circle_area.c과 같은 경우 "code04_circle_area" 이름의 프로젝트로 만드세요
    • 실습문제 4-1과 같은 경우 "lab4-1"
    • 퀴즈 4-5와 같은 경우 "quiz4-5"
    • 과제 "연습문제"의 경우 "exam4-1"와 같이 일관성있게 작명하도록 한다

맥 에디터 단축 키

강의자료 4장

과제 #4

수강 : 홍길동
수강평 : 0000000 에 대해 자세히 알게되었으며, 000에 대해서 0000라고 생각합니다.
궁금한점 : 0000000에 관한 부분이 잘 이해가 안됩니다. 0000000는 0000이 아닌가요? “등
형식으로 질문을 해 주시면 됩니다.

5주차 강의(9월 30일)

  • 수식과 연산자의 개념을 이해한다
    • 대입, 산술, 증감, 관계, 논리 연산자를 사용할 수 있다
    • 연산자의 우선순위와 결합관계를 이해한다.

강의자료(5장)

퀴즈

  • 강의중에는 프로그래밍 퀴즈가 있습니다.(3시간소요)

6주차 강의(10월 7일)

  • 5장 연산자
    • C의 연산자에 대해 알아봅니다
    • 연산자, 피연산자, 연산식
    • 다항연산자, 이항연산자, 삼항연산자등
  • 6장 조건문
    • if문, if-else 를 사용한 제어문
    • 다양한 문제 풀이

강의자료(5장)

과제 #5

  • 제목 : 교재 6장 조건문 연습문제 풀이
    • 내용 : 6장 프로그래밍 1-5번, 8번 문제풀이
    • 연습문제 6장의 1번 코드의 경우 ex6-1, 2번 코드의 경우 ex6-2, .. 와 같이 프로젝트명을 정합니다
    • 프로그램 작성후 소스코드와 그 결과를 캡쳐하여 제출합니다.
    • 모든 연습문제에 대하여 느낀점과 어려웠던 점을 2문장 이상 적어서 제출할 것
  • 제출일 : 10월 14일 월요일

7주차 강의(10월 14일)

  • 7장 반복문

강의자료 (7장)

과제 #6

  • 제목 : 교재 7장 연습문제 풀이
    • 내용 : 7장 프로그래밍 연습문제 1에서부터 12번까지 프로그램 문제풀이
    • 프로그램 작성 후 소스코드와 그 결과를 캡쳐하여 제출합니다.
    • 모든 연습문제 각각에 대하여 느낀점과 어려웠던 점을 2문장 이상 적어서 제출할 것
    • 제출일 : 10월 21일 월요일

8주차 강의(10월 21일) - 중간시험

  • 시험 범위
    • 교재의 1장 - 7장까지 입니다
    • 주관식 문제와 객관식 문제의 혼용
    • C언어 문법과 코딩 문제입니다
    • 교재의 Exercise와 Programming을 참고하시기 바랍니다. 이와 유사한 유형의 문제를 내겠습니다.
    • 시험시간 : 10월 21일 12:30 - 14:30(2시간)

9주차 강의(10월 28일)

  • 8장 함수, 9장 함수와 변수
  • 함수 활용
    • 함수를 활용하여 다양한 문제를 해결해 본다
    • 함수와 매개변수
    • 재귀함수
    • 문자함수, 다양한 수학함수들

강의자료 (8장, 9장)

참고: 소수구하는 코드

//
//  main.c
//  hello
//
//  Created by dongupak on 20/04/2019.
//  Copyright © 2019 it. All rights reserved.
//

#include <stdio.h>

// 매우 매우 단순한 소수 구하기 알고리즘
int is_prime1(unsigned int number)
{
    // number를 2부터 number-1까지의 수로 나누어 본다
    for (int i=2; i <number; i++) {
        if (number % i == 0)
            return 0;
    }
    return 1;
}

// 조금 복잡하지만 좀 빠른 소수 구하기 알고리즘
int is_prime2(unsigned int number)
{
    // 2와 3은 소수이므로 바로 1을 반환함
    if (number <= 3 && number > 1)
        return 1;
    else if (number%2==0 || number%3==0)
        return 0;     // 2나 3으로 나누어지는가를 먼저 본다
    else {
        // number를 5부터 2씩 증가시키며 number-1까지의 수로 나누어 본다
        for (int i=5; i <number; i+= 2) {
            if (number % i == 0)
                return 0;
        }
    }
    return 1;
}


// 매우 빠른 소수 검사 프로그램으로 number가 소수이면 1을
// 그렇지 않으면 1을 반환하는 함수임
int is_prime3(unsigned int number)
{
    // 2와 3은 소수이므로 바로 1을 반환함
    if (number <= 3 && number > 1)
        return 1;
    else if (number%2==0 || number%3==0)
        return 0;     // 2나 3으로 나누어지는가를 먼저 본다
    else {
        unsigned int i;
        // 이제 i를 5부터 6씩 증가시키며 number로 나누어 본다
        // 이때 i*i <= number일 때 까지만 검사하면 충분하다.
        // 모든 정수는 (6k + i) 로 표현 가능하다
        // 모든 k에 대해 i = −1, 0, 1, 2, 3, 4;
        // 2 divides (6k + 0), (6k + 2), (6k + 4); and 3 divides (6k + 3).
        for (i=5; i*i<=number; i+=6) {
            if (number % i == 0 || number%(i + 2) == 0)
                return 0;
        }
        return 1;
    }
}

#define MAX_NUM     300 // 최대 소수의 크기

int main(int argc, const char * argv[])
{
    printf("알고리즘 1번 :\n");
    for(unsigned int n=2; n <MAX_NUM; n++)
        if( is_prime1(n) == 1)
            printf("%d ", n);
    printf("\n");
    
    printf("알고리즘 2번 :\n");
    for(unsigned int n=2; n <MAX_NUM; n++)
        if( is_prime2(n) == 1)
            printf("%d ", n);
    printf("\n");
    
    printf("알고리즘 3번 :\n");
    for(unsigned int n=2; n <MAX_NUM; n++)
        if( is_prime3(n) == 1)
            printf("%d ", n);
    printf("\n");
    
    return 0;
}

과제 #7

  • 제목 : 8장, 9장 연습문제 풀이
    • 8장 프로그래밍 연습문제 1-12번 풀이
    • 9장 프로그래밍 연습문제 1-6번 풀이
      • 문제와 자신이 생각한 답을 적도록 한다
      • 프로그래밍 문제는 프로그램과 코드를 제출하고 느낀점과 어려웠던 점을 손으로 적도록 한다

10주차 강의(11월 4일) : 10장 배열

  • 이번 강의에서는 10장 배열에 대해 살펴보겠습니다.
  • 여러분이 이미 배운 파이썬의 리스트와 어떤 차이가 있는가도 알아봅시다.

강의자료 (10장)

과제 #8

  • 10장 연습문제 풀이
    • 10장 프로그래밍 연습 1-6번 풀이

과제 #9

  • 제목 : 널널한 교수의 C언어 기초 강의 10_1, 10_2, 10_3, 11_1, 11_2장 동영상 강의 듣고 수강평 남기기
수강 : 홍길동
수강평 : 0000000 에 대해 자세히 알게되었으며, 000에 대해서 0000라고 생각합니다.
궁금한점 : 0000000에 관한 부분이 잘 이해가 안됩니다. 0000000는 0000이 아닌가요? “등
형식으로 질문을 해 주시면 됩니다.
  • 11장은 예습차원에서 동영상을 시청해 주십시오.

11주차 강의(11월 11일)

강의자료 (11장)

과제 #10

  • 제목 : 교재 11장 1-6 연습문제 풀이
    • 프로그램 코드와 실행결과, 느낀점 어려웠던 점을 적어서 제출하세요

12주차 강의(11월 18일)

  • 12장 문자와 문자열

강의자료 (12장)

참고자료(시저 암호- 경고 수정한 코드)

#include <stdio.h>

void encrypt(char cipher[], int shift);

int main (void)
{
    char cipher[50];
    int shift=3;

    printf("문자열을 입력하시오: ");
    //gets(cipher);  // 한줄 전체 입력
    fgets(cipher, (sizeof cipher / sizeof cipher[0]), stdin);  // 수정된 부분
    encrypt (cipher, shift);
    return 0;
}

void encrypt (char cipher[], int shift)
{
    int i = 0;
    while (cipher[i] != '\0') {
        if( cipher[i] >= 'A' && cipher[i] <= 'z'){
            cipher[i] += shift;
            if( cipher[i] > 'z' )
                cipher[i] -= 26;
        }
        i++;
    }
    printf("암호화된 문자열: %s", cipher);
}

13주차 강의(11월 25일)

  • 13장 구조체

강의자료 (13장)

참고 동영상

14주차 강의(12월 2일)

  • 14장 포인터 활용
  • 15장 스트림과 파일
  • 17장 포인터 활용과 동적 메모리 관리

강의자료 (15장)

발표자료 : 마지막 강의

15주차 강의(12월 9일)

  • 보충강의
    • 수업에서 다 다루지 못한 부분을 다루어 봅시다

16주차(12월 16일) : 기말시험

  • 12월 16일 월요일 13:00 - 15:00, 328강의실
    • 시험범위 : 교재 7장 - 15장까지
    • 주관식과 객관식 혼용
    • 중긴시험 문제의 패턴과 유사하게 출제될 예정입니다