Download presentation
Presentation is loading. Please wait.
1
기초 C언어 제14주 실습 전처리 및 비트필드, 스트림과 파일 입출력, 동적메모리와 연결 리스트
컴퓨터시뮬레이션학과 2015년 봄학기 담당교수 : 이형원 E304호,
2
3 개의 정수 중에 최소 값 찾는 프로그램 사용자가 3 개의 정수를 입력하도록 하시오.
3 개의 정수 중에 최소 값을 찾아주는 매크로 GET_MIN(x,y,z)을 정의하여 사용하시 오. ENGLISH가 정의 되어 있으면 모든 메시지를 영어로, 아니면 모든 메시지를 한글로 출력하도록 하시오.
3
알고리즘 : main 3 개의 정수를 입력하라는 메시지를 출력한다. 표준출력 버퍼를 비운다.
사용자가 입력한 정수를 읽어 들인다. 표준 입력 버퍼를 비운다. GET_MIN(x,y,z)를 사용하여 최소 값을 출력한다.
4
필요한 변수 : main 3 개의 정수를 저장할 변수(x,y,z)
5
매크로 GET_MIN 정의 x > y 이면 y > z 이면 z를 돌려 준다. 아니면 y를 돌려 준다. 아니면 x > z 이면 z를 돌려 준다. 아니면 x를 돌려 준다.
6
프로젝트 생성 프로젝트명 입력 : min3 Empty Project 선택 Cygwin GCC 콤파일러 선택 생성된 빈 프로젝트
7
소스 작성(1) main 함수 소스파일명 입력 : min3.c min3.c
8
소스 작성(2) main 함수 소스수정 생성된 빈 소스 파일 실행프로그램이 되기 위한 최소 내용이 추가된 소스 파일
min3.c min3.c min3.c 소스수정 생성된 빈 소스 파일 실행프로그램이 되기 위한 최소 내용이 추가된 소스 파일
9
소스작성(3) main 함수 GET_MIN 매크로 정의 ENGLISH가 정의 되어 있으면 영어 메시지를 출력한다.
매크로함수를 호출하여 최소값을 출력한다.
10
소스작성(4) 전체 소스
11
실행 하기 소스 저장 min3 프로젝트 빌드 프로그램 실행
12
프로그램 실행 예
13
주소록 관리 프로그램을 작성하시오. 추가, 수정, 검색, 종료 세 가지의 메뉴를 출력하도록 하시오.
주소록의 정보는 이름과 전화번호를 포함하고 있고 크기가 고정된 구조체 타입 PERSON을 만들어 사용하시오. 주소록 자료는 “address.dat”에 저장하고 이진파일을 사용하시오. 주소록과 관련한 함수들을 다른 파일(address.c, address.h)에 작성하시오. main 함수는 main.c 에 작성하시오.
14
알고리즘 : main 주소록 파일을 읽기수정 이진 파일로 연다. 파일이 정상적으로 열리지 않으면 프로그램을 종료 한다.
다음을 무한히 반복한다. 메뉴를 출력한다.(menu()) 메뉴 선택을 받아들인다. 메뉴 선택에 따라 해당하는 함수를 호출한다. 파일을 닫는다.
15
필요한 변수 : main 사용자 정보를 저장하는 구조체 변수 PERSON 선언 주소록 파일에 대한 FILE 포인터(fp)
메뉴 선택을 저장할 변수(select) 사용자 정보를 저장하는 구조체 변수 PERSON 선언
16
주소록 관리에 필요한 함수들 메뉴를 출력하고 메뉴를 입력 받는 함수 : menu()
사용자가 입력한 정보를 읽어 들이는 함수 : get_data() 주어진 사용자 정보를 출력하는 함수 : print_record() 사용자가 입력한 사람을 찾는 함수 : search_record() 사용자가 입력한 사람의 정보를 수정하는 함수 : modify_record()
17
매개변수 및 리턴 값 : menu 매개변수 없음(void) 리턴 값 선택한 메뉴 값(int)
18
알고리즘 : menu 선택 값을 0으로 초기화 한다. 선택 값이 범위를 벗어나면 다음을 반복한다. 선택 값을 리턴한다.
메뉴 목록을 출력한다. 메뉴를 선택하라는 메시지를 출력한다. 표준 출력 버퍼를 비운다. 메뉴 선택 값을 읽어 들인다. 선택 값이 범위 내에 없으면 메뉴를 다시 선택하라고 출력한다. 표쥰 출력 버퍼를 비운다. 선택 값을 리턴한다.
19
매개변수 및 리턴 값 : get_data 매개변수 없음(void) 리턴 값 받아들인 사용자 정보 구조체(PERSON)
20
알고리즘 : get_data 이름 전화번호를 받아서 PERSON 구조체에 저장한다. 받아들인 PERSON 구조체를 리턴한다.
21
매개변수 및 리턴 값 : print_record
출력할 사람 정보(PERSON) 리턴 값 없음(void)
22
알고리즘 : print_record 주어진 사람의 정보를 출력한다.
23
매개변수 및 리턴 값 : add_record 매개변수 리턴 값 자료를 저장할 파일을 가리키는 파일 포인터(FILE *)
함수의 종료 상태를 알리는 정수 값(int)
24
알고리즘 : add_record 사용자로 부터 추가할 사람의 정보를 받아들인다. 파일의 끝으로 이동한다.
받아들인 사용자 정보를 파일에 저장한다.
25
매개변수 및 리턴 값 : search_record
자료가 저장되어 있는 파일을 가리키는 파일 포인터(FILE *) 리턴 값 함수의 실행결과를 나타내는 정수(-1:못 찾음, 0: 찾음)
26
알고리즘 : search_record 찾고자 하는 사람의 이름을 입력 받는다. 파일의 시작 점으로 이동한다.
파일의 끝에 다다를 때 까지 다음을 반복한다. 자료를 하나 읽는다. 자료의 이름이 찾는 사람이면 자료 내용을 출력한다. 정상종료 값인 0을 리턴한다. 찾지 못했다는 메시지를 출력한다. 비정상 종료 값인 -1을 리턴한다.
27
매개변수 및 리턴값 : modify_record
자료가 저장되어 있는 파일을 가리키는 파일 포인터(FILE *) 리턴 값 함수의 종료 상태를 나타내는 정수 값(-1:자료를 못 찾음, 0:정상적으로 수정)
28
알고리즘 : modify_record 수정할 사람의 이름을 받아들인다. 파일의 시작 점으로 이동한다.
파일의 끝에 다다를 때 까지 다음을 반복한다. 자료를 하나 읽는다. 자료가 찾는 사람이면 자료를 출력한다. 반복을 종료한다. 자료의 이름이 널이면 찾지 못했다는 메시지를 출력한다. 비정상 종료를 나타내는 -1을 리턴한다. 수정할 정보를 받아들인다. 정보를 읽은 자료에 복사한다. 파일의 위치를 자료크기만큼 앞으로 옮긴다. 파일에 자료를 저장한다. 정상 종료를 나타내는 0을 리턴한다.
29
프로젝트 생성 프로젝트명 입력 : address Empty Project 선택 Cygwin GCC 콤파일러 선택
생성된 빈 프로젝트
30
소스 작성(1) main 함수 소스파일명 입력 : main.c address main.c
31
소스 작성(2) main 함수 소스수정 생성된 빈 소스 파일 실행프로그램이 되기 위한 최소 내용이 추가된 소스 파일
main.c main.c main.c 소스수정 생성된 빈 소스 파일 실행프로그램이 되기 위한 최소 내용이 추가된 소스 파일
32
소스작성(3) main 함수 주소록 관련 함수에 관한 헤더 파일 메뉴 선택 값을 저장하는 변수
address.dat파일을 읽기 수정 모드로 연다. 열리지 않으면 프로그램을 종료한다. 메뉴선택 값에 따른 함수를 호출한다. 메뉴에서 종료가 선택될 때 까지 무한히 반복한다.
33
소스작성(4) : 주소록 관련 함수 헤더 및 소스 추가
address.h address.c 헤더파일명 입력 : address.h 소스파일명 입력 : address.c
34
소스작성(5) : address.h Eclipse 가 자동으로 추가해준 헤더 이중 포함 방지 매크로
이름과 전화번호의 최대 크기 메뉴에 대한 매크로 상수 정의 사람 정보를 저장하는 구조체 데이터 타입 PERSON 선언 주소록에 관련한 함수의 원형 선언
35
소스작성(6): address.c 프로그램에 필요한 헤더를 포함한다.
36
소스작성(7): address.c menu() 함수
메뉴 선택 값을 저장하는 변수 선택 값이 범위를 벗어나면 다음을 반복한다 메뉴를 출력하고 선택하라는 메시지를 출력한다 표준 출력 버퍼를 비운다 메뉴 선택을 읽어 들이고 표준 입력 버퍼를 비운다 선택 값이 범위를 벗어나면 메뉴를 다시 선택하라는 메시지를 출력하고 표준 출력 버퍼를 비운다. 메뉴 선택 값을 리턴한다
37
소스작성(8): address.c get_data()
받아들일 정보를 저장할 구조체 변수의 내용을 널로 초기화 한다. 이름이라는 메시지를 출력하여 이름을 입력하도록 한다. getchar() 함수 호출은 정상적으로 글자를 받아들이게 하기 위함이다. 시스템에 따라서 호출을 하지 말아야 할 수도 있다. 이름을 받아들인다. 휴대폰이라는 메시지를 출력하여 휴대폰 번호를 입력하도록 한다. 휴대폰 번호를 받아들인다. 받아들인 문자열에서 끝의 ‘\r’을 삭제한다. 받아들인 사용자 정보를 리턴한다.
38
소스작성(9): address.c print_record()
주어진 사용자 정보를 출력한다.
39
소스작성(10): address.c add_record()
사용자 정보를 저장할 변수 사용자 정보를 받아들인다. 파일의 끝으로 이동한다. 자료를 저장한다.
40
소스작성(11): address.c search_record()
찾을 사람의 이름을 저장할 변수 찾은 사람의 정보를 저장할 변수 찾은 사람의 이름을 받아들인다. 파일을 시작 위치로 이동한다. 파일의 끝에 다다를 때 까지 다음을 반복한다. 자료를 하나 읽는다. 입력한 이름과 읽은 자료의 이름이 동일하면 자료를 출력하고 0을 리턴한다. 자료를 찾지 못했다는 메시지를 출력하고 -1을 리턴한다.
41
소스작성(12): address.c modify_record()
수정할 사람의 이름과 번호를 저장할 변수와 읽은 자료를 저장할 변수 수정할 사람의 이름을 받아들인다. 파일의 시작 위치로 이동한다. 읽은 자료의 이름을 널로 초기화 한다. 자료를 읽어서 입력한 이름과 같으면 반복을 종료 하고, 아니면 읽은 자료의 이름을 널로 초기화 한다. 읽은 자료의 이름이 널이면 찾지 못했다고 출력하고 -1을 리턴한다. 수정할 전화번호를 받아들인다. 파일의 위치를 현재 위치에 자료의 크기만큼 앞으로 이동한다. 파일에 자료를 저장한다.
42
소스작성(13) 전체 소스 : main.c
43
소스작성(14) 전체 소스 : address.h
44
소스작성(15) 전체 소스 : address.c
45
소스작성(16) 전체 소스 : address.c
46
실행 하기 소스 저장 address 프로젝트 빌드 프로그램 실행
47
실행 예
48
사용자로부터 양의 정수를 받아들여서 연결리스트에 저장하고 출력하는 프로그램을 작성하시오.
사용자가 -1을 입력할 때 까지 받아들이도록 하시오. 연결 리스트의 노드 구조체를 작성하여 사용하시오. 연결리스트 관련 함수를 작성하는 소스와 main 소스를 분리하여 다른 파일에 작성 하시오. 프로그램이 종료하기 전에 링크드리스트의 내용을 메모리에서 삭제 하도록 하시오. 다음과 같이 출력하도록 하시오.
49
알고리즘 : main 다음을 무한히 반복한다. 현재까지 받아들인 연결리스트를 출력한다.
양의 정수를 입력하라는 메시지를 출력한다. 표준 출력 버퍼를 비운다. 정수를 받아들인다. 정수가 -1이면 반복을 종료한다. 정수를 연결 리스트에 추가 한다.(add_data) 현재까지 받아들인 연결리스트를 출력한다.
50
필요한 변수 : main 양의 정수를 저장하는 링크드 리스트의 노드 구조체 변수 INTEGER_NODE
연결리스트의 헤드 노드(head) 받아들인 정수를 저장할 변수(data) 양의 정수를 저장하는 링크드 리스트의 노드 구조체 변수 INTEGER_NODE
51
링크드리스트 관리에 필요한 함수들 add 동작 후 새로운 노드를 추가 하는 함수 : add_data()
현재의 리스트 내용을 출력하는 함수 : print_list() 현재 링크드릿트의 메모리를 해제하는 함수 : free_list() add 동작 후
52
매개변수 및 리턴 값 : add_data 매개변수 리턴 값 헤드 노드 포인터(head) 추가할 자료(d)
함수의 종료 상태 값(0:정상 종료, -1: 오류)
53
알고리즘 : add_data node 를 head로 설정한다. Node의 next가 NULL 이 아니면 다음을 반복한다.
node를 node의 next로 설정한다. 새 노드를 위한 메모리를 할당 받는다. 새 노드의 data에 d를 대입한다. 새 노드의 next를 NULL로 설정한다. node의 next 를 새 노드로 설정한다.
54
매개변수 및 리턴 값 : print_list 매개변수 헤드 노드 포인터(head) 리턴 값 없음(void)
55
알고리즘 : print_list node를 head로 설정한다. Node가 NULL이 아니면 다음을 반복한다.
노드의 data를 출력한다. node의 next가 NULL이 아니면 -> 를 출력한다. node를 node의 next로 설정한다.
56
매개변수 및 리턴 값 : free_list 매개변수 헤드 노드 포인터(head) 리턴 값 없음(void)
57
알고리즘 : free_list node를 head로 설정한다. node가 NULL이 아니면 다음을 반복한다.
temp에 node를 할당한다. node를 node의 next로 설정한다. temp를 메모리 해제한다.
58
프로젝트 생성 프로젝트명 입력 : linked Empty Project 선택 Cygwin GCC 콤파일러 선택
생성된 빈 프로젝트
59
소스 작성(1) main 함수 소스파일명 입력 : main.c linked main.c
60
소스 작성(2) main 함수 소스수정 생성된 빈 소스 파일 실행프로그램이 되기 위한 최소 내용이 추가된 소스 파일
main.c main.c main.c 소스수정 생성된 빈 소스 파일 실행프로그램이 되기 위한 최소 내용이 추가된 소스 파일
61
소스작성(3) main 함수 링크드리스트 관련 함수에 관한 헤더 파일 헤드노드 포인터를 저장하는 변수
입력한 정수를 저장하는 변수 다음을 무한히 반복한다. 양수를 입력하라는 메시지를 출력하고 정수를 받아들인다. 입력한 정수가 -1이면 반복을 종료 한다. 헤드가 널이면 새로 할당하고 자료를 저장하고 next를 널로 설정한다. 아니면 헤드노드에 자료를 추가한다.
62
소스작성(4) : 링크드리스트 관련 함수 헤더 및 소스 추가
linked.h linked.c 헤더파일명 입력 : linked.h 소스파일명 입력 : linked.c
63
소스작성(5) : linked.h Eclipse 가 자동으로 추가해준 헤더 이중 포함 방지 매크로
링크드리스트의 노드를 나타내는 구조체 타입 INTEGER_NODE 선언 링크드리스트에 관련한 함수의 원형 선언
64
소스작성(6): linked.c 프로그램에 필요한 헤더를 포함한다.
65
소스작성(7): linked.c add_data() 함수
현재 노드와 새노드를 저장할 포인터 node를 head로 설정한다. node의 next가 널이 아니면 node 를 node의 next로 설정한다. 새노드를 위한 메모리를 할당하고 새노드의 data를 d로 설정하고 next를 널로 설정한다. node의 next를 새노드로 설정하여 노드를 연결한다.
66
소스작성(8): linked.c print_list()
현재 노드를 저장할 포인터 변수 node를 head로 설정한다. 화면에 메시지를 출력한다. Node가 널이 아니면 node의 data를 출력한다. Node의 next가 널이 아니면 ->를 출력한다.
67
소스작성(9): linked.c free_list()
현재 노드를 저장할 포인터 변수 node를 head로 설정한다. 현재 노드 포인터를 임시로 저장한다. node를 다음 노드로 설정하고 임시노드를 작제한다.
68
소스작성(10) 전체 소스 : main.c
69
소스작성(11) 전체 소스 : linked.h
70
소스작성(12) 전체 소스 : linked.c
71
실행 하기 소스 저장 linked 프로젝트 빌드 프로그램 실행
72
실행 예
Similar presentations