기초 C언어 제14주 실습 전처리 및 비트필드, 스트림과 파일 입출력, 동적메모리와 연결 리스트

Slides:



Advertisements
Similar presentations
1/37 한글에는 전문적인 문서 편집을 위한 고급 기능이 있다. 문서를 편리하게 수 정할 수 있도록 도와주는 찾기 / 찾아 바꾸기, 다른 위치로 이동할 수 있는 책 갈피와 하이퍼링크에 대해 알아보자. 그리고 자주 사용하는 서식을 미리 정 해 놓고 쓰는 스타일 활용법과 스타일이.
Advertisements

Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
UNIX 운영 체제의 설계 - Chapter 4. 파일의 내부 표현
기초C언어 제1주 실습 강의 소개, C언어 개요, Cygwin/Eclipse 사용 컴퓨터시뮬레이션학과 2016년 봄학기
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
컴퓨터프로그래밍 1주차실습자료 Visual Studio 2005 사용법 익히기.
Image & Video processing
제14장 동적 메모리.
연결리스트(linked list).
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
컴퓨터 프로그래밍 기초 [Final] 기말고사
Outlook Express 메일 백업 및 복원가이드
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
자료 구조: Chapter 3 (2)구조체, 포인터
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
5장. 참조 타입.
CHAPTER 02 OpenCV 개요 PART 01 영상 처리 개요 및 OpenCV 소개.
P150 문제를 프로그래밍 할 것 Source file (헤더파일포함), 실행화면 (학번_이름_1.txt)
1. C++ 시작하기.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
WinCE Device Driver 실습 #3
자료구조: CHAP 4 리스트 (3) 순천향대학교 컴퓨터공학과 하 상 호.
프로그래밍 랩 – 7주 리스트.
TCP/IP Socket Programming…
13. 연산자 오버로딩.
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
프로그래밍 개요
컴퓨터 개론 및 실습 11. 동적 메모리 할당.
영상처리 실습 인공지능연구실.
24장. 파일 입출력.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
USN(Ubiquitous Sensor Network)
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
Eclipse CDT에서 프로젝트를 Export 하고 Import 하는 방법
C언어 응용 제7주 실습 해보기 제6장.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Chapter 08. 함수.
문자열 컴퓨터시뮬레이션학과 2015년 봄학기 담당교수 : 이형원 E304호,
리스트(List)를 이용한 자료 관리 이점숙 /
컴퓨터 계측 및 실습 디지털 출력 영남대학교 기계공학부.
강의 소개 컴퓨터시뮬레이션학과 2017년 봄학기 담당교수 : 이형원 E304호,
Fucntion 요약.
CHAP 21. 전화, SMS, 주소록.
C언어 응용 제1주 실습 해보기.
Canary value 스택 가드(Stack Guard).
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
OpenCV 설정 2.21 만든이 딩딩.
제 15 강 문자와 코드 shcho.pe.kr.
DK-128 개발환경 설정 아이티즌 기술연구소
문자열 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
Homework #12 (1/2) 프로그램을 작성하고, 프로그램과 실행 결과를 프린트하여 제출한다.
Linux 9.X 기초에서 활용까지 Chapter 06 VI 편집기.
C 프로그래밍 I.
01. 분산 파일 시스템의 개요 네트워크에 분산된 파일을 사용자가 쉽게 접근하고 관리할 수 있게 해준다.
기초C언어 제2주 실습 프로그래밍의 개념, 프로그램 작성 과정 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원
구조체(struct)와 공용체(union)
Chapter 12 파일 입출력.
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
7 생성자 함수.
BoardGame 보드게임 따라가기.
제 10 강 문자 입출력.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

기초 C언어 제14주 실습 전처리 및 비트필드, 스트림과 파일 입출력, 동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2015년 봄학기 담당교수 : 이형원 E304호, hwlee@inje.ac.kr

3 개의 정수 중에 최소 값 찾는 프로그램 사용자가 3 개의 정수를 입력하도록 하시오. 3 개의 정수 중에 최소 값을 찾아주는 매크로 GET_MIN(x,y,z)을 정의하여 사용하시 오. ENGLISH가 정의 되어 있으면 모든 메시지를 영어로, 아니면 모든 메시지를 한글로 출력하도록 하시오.

알고리즘 : main 3 개의 정수를 입력하라는 메시지를 출력한다. 표준출력 버퍼를 비운다. 사용자가 입력한 정수를 읽어 들인다. 표준 입력 버퍼를 비운다. GET_MIN(x,y,z)를 사용하여 최소 값을 출력한다.

필요한 변수 : main 3 개의 정수를 저장할 변수(x,y,z)

매크로 GET_MIN 정의 x > y 이면 y > z 이면 z를 돌려 준다. 아니면 y를 돌려 준다. 아니면 x > z 이면 z를 돌려 준다. 아니면 x를 돌려 준다.

프로젝트 생성 프로젝트명 입력 : min3 Empty Project 선택 Cygwin GCC 콤파일러 선택 생성된 빈 프로젝트

소스 작성(1) main 함수 소스파일명 입력 : min3.c min3.c

소스 작성(2) main 함수 소스수정 생성된 빈 소스 파일 실행프로그램이 되기 위한 최소 내용이 추가된 소스 파일 min3.c min3.c min3.c 소스수정 생성된 빈 소스 파일 실행프로그램이 되기 위한 최소 내용이 추가된 소스 파일

소스작성(3) main 함수 GET_MIN 매크로 정의 ENGLISH가 정의 되어 있으면 영어 메시지를 출력한다. 매크로함수를 호출하여 최소값을 출력한다.

소스작성(4) 전체 소스

실행 하기 소스 저장 min3 프로젝트 빌드 프로그램 실행

프로그램 실행 예

주소록 관리 프로그램을 작성하시오. 추가, 수정, 검색, 종료 세 가지의 메뉴를 출력하도록 하시오. 주소록의 정보는 이름과 전화번호를 포함하고 있고 크기가 고정된 구조체 타입 PERSON을 만들어 사용하시오. 주소록 자료는 “address.dat”에 저장하고 이진파일을 사용하시오. 주소록과 관련한 함수들을 다른 파일(address.c, address.h)에 작성하시오. main 함수는 main.c 에 작성하시오.

알고리즘 : main 주소록 파일을 읽기수정 이진 파일로 연다. 파일이 정상적으로 열리지 않으면 프로그램을 종료 한다. 다음을 무한히 반복한다. 메뉴를 출력한다.(menu()) 메뉴 선택을 받아들인다. 메뉴 선택에 따라 해당하는 함수를 호출한다. 파일을 닫는다.

필요한 변수 : main 사용자 정보를 저장하는 구조체 변수 PERSON 선언 주소록 파일에 대한 FILE 포인터(fp) 메뉴 선택을 저장할 변수(select) 사용자 정보를 저장하는 구조체 변수 PERSON 선언

주소록 관리에 필요한 함수들 메뉴를 출력하고 메뉴를 입력 받는 함수 : menu() 사용자가 입력한 정보를 읽어 들이는 함수 : get_data() 주어진 사용자 정보를 출력하는 함수 : print_record() 사용자가 입력한 사람을 찾는 함수 : search_record() 사용자가 입력한 사람의 정보를 수정하는 함수 : modify_record()

매개변수 및 리턴 값 : menu 매개변수 없음(void) 리턴 값 선택한 메뉴 값(int)

알고리즘 : menu 선택 값을 0으로 초기화 한다. 선택 값이 범위를 벗어나면 다음을 반복한다. 선택 값을 리턴한다. 메뉴 목록을 출력한다. 메뉴를 선택하라는 메시지를 출력한다. 표준 출력 버퍼를 비운다. 메뉴 선택 값을 읽어 들인다. 선택 값이 범위 내에 없으면 메뉴를 다시 선택하라고 출력한다. 표쥰 출력 버퍼를 비운다. 선택 값을 리턴한다.

매개변수 및 리턴 값 : get_data 매개변수 없음(void) 리턴 값 받아들인 사용자 정보 구조체(PERSON)

알고리즘 : get_data 이름 전화번호를 받아서 PERSON 구조체에 저장한다. 받아들인 PERSON 구조체를 리턴한다.

매개변수 및 리턴 값 : print_record 출력할 사람 정보(PERSON) 리턴 값 없음(void)

알고리즘 : print_record 주어진 사람의 정보를 출력한다.

매개변수 및 리턴 값 : add_record 매개변수 리턴 값 자료를 저장할 파일을 가리키는 파일 포인터(FILE *) 함수의 종료 상태를 알리는 정수 값(int)

알고리즘 : add_record 사용자로 부터 추가할 사람의 정보를 받아들인다. 파일의 끝으로 이동한다. 받아들인 사용자 정보를 파일에 저장한다.

매개변수 및 리턴 값 : search_record 자료가 저장되어 있는 파일을 가리키는 파일 포인터(FILE *) 리턴 값 함수의 실행결과를 나타내는 정수(-1:못 찾음, 0: 찾음)

알고리즘 : search_record 찾고자 하는 사람의 이름을 입력 받는다. 파일의 시작 점으로 이동한다. 파일의 끝에 다다를 때 까지 다음을 반복한다. 자료를 하나 읽는다. 자료의 이름이 찾는 사람이면 자료 내용을 출력한다. 정상종료 값인 0을 리턴한다. 찾지 못했다는 메시지를 출력한다. 비정상 종료 값인 -1을 리턴한다.

매개변수 및 리턴값 : modify_record 자료가 저장되어 있는 파일을 가리키는 파일 포인터(FILE *) 리턴 값 함수의 종료 상태를 나타내는 정수 값(-1:자료를 못 찾음, 0:정상적으로 수정)

알고리즘 : modify_record 수정할 사람의 이름을 받아들인다. 파일의 시작 점으로 이동한다. 파일의 끝에 다다를 때 까지 다음을 반복한다. 자료를 하나 읽는다. 자료가 찾는 사람이면 자료를 출력한다. 반복을 종료한다. 자료의 이름이 널이면 찾지 못했다는 메시지를 출력한다. 비정상 종료를 나타내는 -1을 리턴한다. 수정할 정보를 받아들인다. 정보를 읽은 자료에 복사한다. 파일의 위치를 자료크기만큼 앞으로 옮긴다. 파일에 자료를 저장한다. 정상 종료를 나타내는 0을 리턴한다.

프로젝트 생성 프로젝트명 입력 : address Empty Project 선택 Cygwin GCC 콤파일러 선택 생성된 빈 프로젝트

소스 작성(1) main 함수 소스파일명 입력 : main.c address main.c

소스 작성(2) main 함수 소스수정 생성된 빈 소스 파일 실행프로그램이 되기 위한 최소 내용이 추가된 소스 파일 main.c main.c main.c 소스수정 생성된 빈 소스 파일 실행프로그램이 되기 위한 최소 내용이 추가된 소스 파일

소스작성(3) main 함수 주소록 관련 함수에 관한 헤더 파일 메뉴 선택 값을 저장하는 변수 address.dat파일을 읽기 수정 모드로 연다. 열리지 않으면 프로그램을 종료한다. 메뉴선택 값에 따른 함수를 호출한다. 메뉴에서 종료가 선택될 때 까지 무한히 반복한다.

소스작성(4) : 주소록 관련 함수 헤더 및 소스 추가 address.h address.c 헤더파일명 입력 : address.h 소스파일명 입력 : address.c

소스작성(5) : address.h Eclipse 가 자동으로 추가해준 헤더 이중 포함 방지 매크로 이름과 전화번호의 최대 크기 메뉴에 대한 매크로 상수 정의 사람 정보를 저장하는 구조체 데이터 타입 PERSON 선언 주소록에 관련한 함수의 원형 선언

소스작성(6): address.c 프로그램에 필요한 헤더를 포함한다.

소스작성(7): address.c menu() 함수 메뉴 선택 값을 저장하는 변수 선택 값이 범위를 벗어나면 다음을 반복한다 메뉴를 출력하고 선택하라는 메시지를 출력한다 표준 출력 버퍼를 비운다 메뉴 선택을 읽어 들이고 표준 입력 버퍼를 비운다 선택 값이 범위를 벗어나면 메뉴를 다시 선택하라는 메시지를 출력하고 표준 출력 버퍼를 비운다. 메뉴 선택 값을 리턴한다

소스작성(8): address.c get_data() 받아들일 정보를 저장할 구조체 변수의 내용을 널로 초기화 한다. 이름이라는 메시지를 출력하여 이름을 입력하도록 한다. getchar() 함수 호출은 정상적으로 글자를 받아들이게 하기 위함이다. 시스템에 따라서 호출을 하지 말아야 할 수도 있다. 이름을 받아들인다. 휴대폰이라는 메시지를 출력하여 휴대폰 번호를 입력하도록 한다. 휴대폰 번호를 받아들인다. 받아들인 문자열에서 끝의 ‘\r’을 삭제한다. 받아들인 사용자 정보를 리턴한다.

소스작성(9): address.c print_record() 주어진 사용자 정보를 출력한다.

소스작성(10): address.c add_record() 사용자 정보를 저장할 변수 사용자 정보를 받아들인다. 파일의 끝으로 이동한다. 자료를 저장한다.

소스작성(11): address.c search_record() 찾을 사람의 이름을 저장할 변수 찾은 사람의 정보를 저장할 변수 찾은 사람의 이름을 받아들인다. 파일을 시작 위치로 이동한다. 파일의 끝에 다다를 때 까지 다음을 반복한다. 자료를 하나 읽는다. 입력한 이름과 읽은 자료의 이름이 동일하면 자료를 출력하고 0을 리턴한다. 자료를 찾지 못했다는 메시지를 출력하고 -1을 리턴한다.

소스작성(12): address.c modify_record() 수정할 사람의 이름과 번호를 저장할 변수와 읽은 자료를 저장할 변수 수정할 사람의 이름을 받아들인다. 파일의 시작 위치로 이동한다. 읽은 자료의 이름을 널로 초기화 한다. 자료를 읽어서 입력한 이름과 같으면 반복을 종료 하고, 아니면 읽은 자료의 이름을 널로 초기화 한다. 읽은 자료의 이름이 널이면 찾지 못했다고 출력하고 -1을 리턴한다. 수정할 전화번호를 받아들인다. 파일의 위치를 현재 위치에 자료의 크기만큼 앞으로 이동한다. 파일에 자료를 저장한다.

소스작성(13) 전체 소스 : main.c

소스작성(14) 전체 소스 : address.h

소스작성(15) 전체 소스 : address.c

소스작성(16) 전체 소스 : address.c

실행 하기 소스 저장 address 프로젝트 빌드 프로그램 실행

실행 예

사용자로부터 양의 정수를 받아들여서 연결리스트에 저장하고 출력하는 프로그램을 작성하시오. 사용자가 -1을 입력할 때 까지 받아들이도록 하시오. 연결 리스트의 노드 구조체를 작성하여 사용하시오. 연결리스트 관련 함수를 작성하는 소스와 main 소스를 분리하여 다른 파일에 작성 하시오. 프로그램이 종료하기 전에 링크드리스트의 내용을 메모리에서 삭제 하도록 하시오. 다음과 같이 출력하도록 하시오.

알고리즘 : main 다음을 무한히 반복한다. 현재까지 받아들인 연결리스트를 출력한다. 양의 정수를 입력하라는 메시지를 출력한다. 표준 출력 버퍼를 비운다. 정수를 받아들인다. 정수가 -1이면 반복을 종료한다. 정수를 연결 리스트에 추가 한다.(add_data) 현재까지 받아들인 연결리스트를 출력한다.

필요한 변수 : main 양의 정수를 저장하는 링크드 리스트의 노드 구조체 변수 INTEGER_NODE 연결리스트의 헤드 노드(head) 받아들인 정수를 저장할 변수(data) 양의 정수를 저장하는 링크드 리스트의 노드 구조체 변수 INTEGER_NODE

링크드리스트 관리에 필요한 함수들 add 동작 후 새로운 노드를 추가 하는 함수 : add_data() 현재의 리스트 내용을 출력하는 함수 : print_list() 현재 링크드릿트의 메모리를 해제하는 함수 : free_list() add 동작 후

매개변수 및 리턴 값 : add_data 매개변수 리턴 값 헤드 노드 포인터(head) 추가할 자료(d) 함수의 종료 상태 값(0:정상 종료, -1: 오류)

알고리즘 : add_data node 를 head로 설정한다. Node의 next가 NULL 이 아니면 다음을 반복한다. node를 node의 next로 설정한다. 새 노드를 위한 메모리를 할당 받는다. 새 노드의 data에 d를 대입한다. 새 노드의 next를 NULL로 설정한다. node의 next 를 새 노드로 설정한다.

매개변수 및 리턴 값 : print_list 매개변수 헤드 노드 포인터(head) 리턴 값 없음(void)

알고리즘 : print_list node를 head로 설정한다. Node가 NULL이 아니면 다음을 반복한다. 노드의 data를 출력한다. node의 next가 NULL이 아니면 -> 를 출력한다. node를 node의 next로 설정한다.

매개변수 및 리턴 값 : free_list 매개변수 헤드 노드 포인터(head) 리턴 값 없음(void)

알고리즘 : free_list node를 head로 설정한다. node가 NULL이 아니면 다음을 반복한다. temp에 node를 할당한다. node를 node의 next로 설정한다. temp를 메모리 해제한다.

프로젝트 생성 프로젝트명 입력 : linked Empty Project 선택 Cygwin GCC 콤파일러 선택 생성된 빈 프로젝트

소스 작성(1) main 함수 소스파일명 입력 : main.c linked main.c

소스 작성(2) main 함수 소스수정 생성된 빈 소스 파일 실행프로그램이 되기 위한 최소 내용이 추가된 소스 파일 main.c main.c main.c 소스수정 생성된 빈 소스 파일 실행프로그램이 되기 위한 최소 내용이 추가된 소스 파일

소스작성(3) main 함수 링크드리스트 관련 함수에 관한 헤더 파일 헤드노드 포인터를 저장하는 변수 입력한 정수를 저장하는 변수 다음을 무한히 반복한다. 양수를 입력하라는 메시지를 출력하고 정수를 받아들인다. 입력한 정수가 -1이면 반복을 종료 한다. 헤드가 널이면 새로 할당하고 자료를 저장하고 next를 널로 설정한다. 아니면 헤드노드에 자료를 추가한다.

소스작성(4) : 링크드리스트 관련 함수 헤더 및 소스 추가 linked.h linked.c 헤더파일명 입력 : linked.h 소스파일명 입력 : linked.c

소스작성(5) : linked.h Eclipse 가 자동으로 추가해준 헤더 이중 포함 방지 매크로 링크드리스트의 노드를 나타내는 구조체 타입 INTEGER_NODE 선언 링크드리스트에 관련한 함수의 원형 선언

소스작성(6): linked.c 프로그램에 필요한 헤더를 포함한다.

소스작성(7): linked.c add_data() 함수 현재 노드와 새노드를 저장할 포인터 node를 head로 설정한다. node의 next가 널이 아니면 node 를 node의 next로 설정한다. 새노드를 위한 메모리를 할당하고 새노드의 data를 d로 설정하고 next를 널로 설정한다. node의 next를 새노드로 설정하여 노드를 연결한다.

소스작성(8): linked.c print_list() 현재 노드를 저장할 포인터 변수 node를 head로 설정한다. 화면에 메시지를 출력한다. Node가 널이 아니면 node의 data를 출력한다. Node의 next가 널이 아니면 ->를 출력한다.

소스작성(9): linked.c free_list() 현재 노드를 저장할 포인터 변수 node를 head로 설정한다. 현재 노드 포인터를 임시로 저장한다. node를 다음 노드로 설정하고 임시노드를 작제한다.

소스작성(10) 전체 소스 : main.c

소스작성(11) 전체 소스 : linked.h

소스작성(12) 전체 소스 : linked.c

실행 하기 소스 저장 linked 프로젝트 빌드 프로그램 실행

실행 예