ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자료구조 제 5강
    자료구조 2022. 2. 15. 21:42

    전화번호부v2.0

    1. 전화번호 삭제 -> 배열의 다음 인덱스부터 한 칸 씩 앞으로
    2. 정렬된 상태로 전화번호 저장 - strcmp()를 이용해서 사전식으로 정렬 

     

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    
    #define CAPACITY 100
    #define BUFFER_SIZE 20
    
    char* names[CAPACITY];
    char* numbers[CAPACITY];
    int n = 0;
    
    void add();
    void find();
    void status();
    void remove();
    void load();
    void save();
    int search(char* name);
    
    int main() {
    	char buffer[BUFFER_SIZE];
    
    	while (1) {
    		printf("$ ");
    		scanf("%s", buffer);
    		if (strcmp(buffer, "read") == 0)
    			load();
    		else if (strcmp(buffer, "add") == 0)
    			add();
    		else if (strcmp(buffer, "find") == 0)
    			find();
    		else if (strcmp(buffer, "status") == 0)
    			status();
    		else if (strcmp(buffer, "delete") == 0)
    			remove();
    		else if (strcmp(buffer, "save") == 0)
    			save();
    		else if (strcmp(buffer, "exit") == 0)
    			break;
    	}
    	return 0;
    }
    
    void load() {
    	char fileName[BUFFER_SIZE];
    	char buf1[BUFFER_SIZE];
    	char buf2[BUFFER_SIZE];
    
    	scanf("%s", fileName);							//파일 이름을 입력 받는다.
    	FILE* fp = fopen(fileName, "r");				//파일을 연다.
    	if (fp == NULL) {								//파일 open을 실패한 경우
    		printf("Open failed.\n");
    		return;
    	}
    	while ((fscanf(fp, "%s", buf1) != EOF)) {		//파일의 끝(End Of File)에 도달할 때 까지 반복해서 이름과 전화번호를 읽어서 배열에 저장한다.
    		fscanf(fp, "%s", buf2);
    		names[n] = _strdup(buf1);
    		numbers[n] = _strdup(buf2);
    		n++;
    	}
    	fclose(fp);
    }
    
    void save() {
    	int i;
    	char fileName[BUFFER_SIZE];
    	char tmp[BUFFER_SIZE];
    
    	scanf("%s", tmp);									// as 받는 용도
    	scanf("%s", fileName);
    
    	FILE* fp = fopen(fileName, "w");					//파일에 쓰기 위해 "w"로 연다
    	if (fp == NULL) {
    		printf("Open failed.\n");
    		return;
    	}
    	for (i = 0; i < n; i++) {
    		fprintf(fp, "%s %s\n", names[i], numbers[i]);	//파일에 가지고있는 전화번호부 내용을 씀
    	}
    	fclose(fp);
    }
    
    /*데이터를 정렬된 상태로 유지하기
     * 1. bubblesort 등의 정렬 알고리즘 사용 (새로운 데이터가 계속적으로 추가되는 상황에는 부적절)
     * 2. 새로운 데이터가 추가될 때 마다 제자리를 찾아서 삽입하는 방법 (가장 뒤에 데이터부터 한 칸씩 앞으로 가면서 차례대로 비교)
     */
    void add() {
    	char buf1[BUFFER_SIZE], buf2[BUFFER_SIZE];
    	scanf("%s", buf1);		//이름
    	scanf("%s", buf2);		//전화번호
    
    	int i = n - 1;
    	while (i >= 0 && strcmp(names[i], buf1) > 0) {		//사전식 순서로 나보다 큰 항목들은 모두 한 칸씩 뒤로 이동시키고,
    		names[i + 1] = names[i];						//처음으로 나보다 작은 항목이 나오면 그것 바로 뒤에 삽입한다.
    		numbers[i + 1] = numbers[i];
    		i--;
    	}
    	names[i + 1] = _strdup(buf1);
    	names[i + 1] = _strdup(buf2);
    
    	n++;
    	printf("%s was added successfully", names[i]);
    }
    
    void remove() {
    	char buf[BUFFER_SIZE];
    	scanf("%s", buf);
    
    	int index = search(buf);			//배열에 해당 사람이 존재하면 해당 인덱스 저장, 존재하지 않으면 -1 리턴 됨
    	if (index == -1) {
    		printf("No person named ' %s ' exists.\n", buf);
    		return;
    	}
    	int j = index;
    	for (; j < n - 1; j++) {		//j값을 증가시키면서 한 칸씩 앞으로 옮김
    		names[j] = names[j + 1];
    		numbers[j] = numbers[j + 1];
    	}
    	n--;
    	printf(" '%s' was deleted successfully.\n", buf);
    }
    
    void find() {
    	char buf[BUFFER_SIZE];
    	scanf("%s", buf);
    	int index = search(buf);
    	if (index == -1)
    		printf("No person named '%s' exists.\n", buf);
    	else
    		printf("%s\n", numbers[index]);
    }
    
    int search(char* name) {
    	int i;
    	for (i = 0; i < n; i++) {
    		if (strcmp(name, names[i]) == 0) {
    			return i;
    		}
    	}
    	return -1;
    }
    
    void status() {
    	int i;
    	for (i = 0; i < n; i++)
    		printf("%s  %s\n", names[i], numbers[i]);
    	printf("Total %d persons.\n", n);
    }

    '자료구조' 카테고리의 다른 글

    자료구조 제 7강 (구조체)  (0) 2022.02.17
    *자료구조 제 6강  (0) 2022.02.15
    자료구조 제 4강  (0) 2022.01.24
    자료구조 제 3강  (0) 2022.01.09
    자료구조 제2강  (0) 2022.01.09
Designed by Tistory.