풍성한 라벤더농장이 될때까지
article thumbnail

오늘 공부한 내용

 

☁️

[merge 답변] 컴퓨터 💜 2진법

https://lamong.tistory.com/34

 


🫠(개인공부)

프로그래밍실습 과제

 

 

Ex15-3 mini project – 연락처>에 다음 두 개의 함수를 추가하시오.

  • delete_record() : 데이터를 파일에서 삭제한다. 삭제할 연락처의 이름을 입력 받는다. 파일 상의 해당 구조체의 name 멤버에 비어있는 문자열을 저장하는 것으로 삭제되었음을 나타낸다.
  • print_all_records() : 파일에 있는 전체 데이터를 출력한다. 삭제된 데이터는 출력하지 않는다.
  • main(), menu() 함수를 적당히 수정한다.
#include <stdio.h>
#include <string.h>

#define SIZE 100
typedef struct person{ // 연락처 구조체로 표현
    char name[SIZE]; // 이름
    char address[SIZE]; // 주소
    char mobilephone[SIZE]; // 휴대폰
    char desc[SIZE]; // 특징
} PERSON;

void menu();
PERSON get_record();
void print_record(PERSON data);
void add_record(FILE *fp);
void search_record(FILE *fp);
void update_record(FILE *fp);
void delete_record(FILE *fp); 
void print_all_records(FILE *fp);

int main(void){
    FILE *fp;
    int select;
		
		// 이진 파일 추가모드로 오픈
    if((fp = fopen("address.dat", "wb+")) == NULL){
        fprintf(stderr, "입력을 위한 파일을 열 수 없습니다.");
        return 1;
    }

    while(1){
        menu(); // 메뉴를 표시
        printf("번호를 입력하시오: "); // 사용자로부터 정수를 받는다
        scanf("%d", &select);
        while(getchar() != '\n'); // 행의 끝까지 표준입력버퍼의 내용을 읽어 옴
        switch(select){
            case 1: add_record(fp); break; // 데이터 추가
            case 2: update_record(fp); break; // 데이터 수정
            case 3: search_record(fp); break; // 데이터 탐색
            case 4: delete_record(fp); break; // 데이터 삭제
            case 5: print_all_records(fp); break; // 데이터 전체 출력
            case 6: fclose(fp); return 0; // 종료
        }
    }

}

void menu(){
    printf("\n");
    printf("=====================\n");
    printf(" 1. 추가\n");
    printf(" 2. 수정\n");
    printf(" 3. 검색\n");
    printf(" 4. 삭제\n");
    printf(" 5. 출력\n");
    printf(" 6. 종료\n");
    printf("=====================\n");
}

// 데이터 추가 
void add_record(FILE *fp){
    PERSON data;
    data = get_record(); // 사용자로부터 데이터 받아 구조체에 저장
    fseek(fp, 0, SEEK_END); // 파일 끝으로 이동
    fwrite(&data, sizeof(data), 1, fp); // 구조체 데이터 파일에 쓴다
}
// 사용자로부터 데이터 받아 구조체로 반환
PERSON get_record(){
    PERSON data;
    printf("이름: "); gets(data.name);
    printf("주소: "); gets(data.address);
    printf("휴대폰: "); gets(data.mobilephone);
    printf("특징: "); gets(data.desc);
    return data;
}

// 구조체 데이터 화면에 출력
void print_record(PERSON data){
    printf("\n");
    printf("<이름> %s\n", data.name); 
    printf("<주소> %s\n", data.address); 
    printf("<휴대폰> %s\n", data.mobilephone); 
    printf("<특징> %s\n", data.desc);
}

// 데이터 수정
void update_record(FILE *fp){
    char name[SIZE];
    PERSON data;

    fseek(fp, 0, SEEK_SET); // 파일 처음으로 간다
    printf("\n데이터를 수정할 사람의 이름: "); 
    gets(name); // 이름 입력받음

    while(!feof(fp)){ // 파일 끝까지 반복
        fread(&data, sizeof(data), 1, fp);
        if(strcmp(data.name, name) == 0){ // 이름 비교
            print_record(data);
            printf("\n새로운 데이터를 입력하세요.\n");
            data = get_record();
            fseek(fp, -1*sizeof(data), SEEK_CUR);
            fwrite(&data, sizeof(data), 1, fp);
            break;
        }
    }
}

// 데이터 탐색
void search_record(FILE *fp){
    char name[SIZE];
    PERSON data;

    fseek(fp, 0, SEEK_SET); // 파일 처음으로
    printf("\n검색할 사람의 이름: ");
    gets(name); // 이름 입력받음

    while(!feof(fp)){ // 파일 끝까지 반복
        fread(&data, sizeof(data), 1, fp);
        if(strcmp(data.name, name) == 0){ // 이름 비교
            print_record(data);
            break;
        }
    }
}

delete_record(FILE *fp){
    char name[SIZE];
    PERSON data;

    fseek(fp, 0, SEEK_SET);
    printf("\n삭제할 사람의 이름: ");
    gets(name);

    while(!feof(fp)){
        fread(&data, sizeof(data), 1, fp);
        if(strcmp(data.name, name) == 0){
            print_record(data);
            printf("위 연락처를 삭제합니다.\n");
            strcpy(data.name, ""); // 연락처 삭제 (이름을 빈 문자열로 설정)
            fseek(fp, -1*sizeof(data), SEEK_CUR); // 파일 포인터를 방금 읽은 데이터의 시작 위치로 이동
            fwrite(&data, sizeof(data), 1, fp); // 수정한 데이터를 파일에 다시 씀
            break;
        }
    }
}


void print_all_records(FILE *fp){
    PERSON data;

    fseek(fp, 0, SEEK_SET);

    while(fread(&data, sizeof(data), 1, fp) == 1){
        if(strlen(data.name) != 0){
            print_record(data);
        }
    }
}

CS50 1-2 정보의 표현

 

2) 정보의 표현

문자의 표현

ASCII(아스키코드/American Standard Code for Information Interchange)

128개의 부호로 정의되어 있는 문자를 숫자로 표현할 수 있도록 정해진 약속(표준)

A를 지난 강의에서 배운 2진법으로 표현하면,

우선 10진법 기준으로 65이므로

2^6x1 + 2^5x0 + 2^4x0 + 2^3x0 + 2^2x0 + 2x0 + 1x1 (64+1)

로 표현할 수 있다.

따라서 A를 2진법로 표현하면 1000001 이다.

 

이외에도 유니코드라는 표준에서는 더 많은 비트를 사용해 다른 문자들도 표현가능하게 지원하고 있다.(이모티콘 등)

 

그림, 영상, 음악의 표현

우리가 스크린으로 보는 그림은 빨간색, 초록색, 파란색의 수많은 작은 점들(픽셀)이 모여 조합되어 만들어지는 화면.

각각의 픽셀은 세 가지 색을 서로 다른 비율로 조합해 특정한 색을 갖게 된다

이 숫자들을 표현하는 방식을 RGB(Red, Green, Blue)라고 한다.

 

 

profile

풍성한 라벤더농장이 될때까지

@그레이라벤더

느리지만 꾸준히 굴러서 큰 바다가 되고싶은 개발 어린이