01. 행렬연산

 

#define _CRT_SEUCRE_NO_WARNINGS
#include <stdio.h>

#define ROWS 3
#define COLS 3

void print_matrix(int arr[ROWS][COLS]);
void add_matrix(int a[ROWS][COLS], int b[ROWS][COLS], int c[ROWS][COLS]);
void sub_matrix(int a[ROWS][COLS], int b[ROWS][COLS], int c[ROWS][COLS]);

int main() {
	int A[ROWS][COLS] = { {1,2,3},{4,5,6},{7,8,9} };
	int B[ROWS][COLS] = { {11,12,13},{14,15,16},{17,18,19} };
	int C[ROWS][COLS] = { 0 };
	
	printf("A = \n");
	print_matrix(A);
	printf("B = \n");
	print_matrix(B);
	
	add_matrix(A, B, C);
	printf("A + B =\n");
	print_matrix(C);
	sub_matrix(B, A, C);
	printf("B - A =\n");
	print_matrix(C);


}

void print_matrix(int arr[ROWS][COLS]) {
	for (int i = 0; i < ROWS; i++) {
		for (int j = 0; j < COLS; j++) {
			printf("%2d ", arr[i][j]);
		}
		puts("");
	}
}

void add_matrix(int a[ROWS][COLS], int b[ROWS][COLS], int c[ROWS][COLS]) {
	for (int i = 0; i < ROWS; i++) {
		for (int j = 0; j < COLS; j++) {
			c[i][j] = a[i][j] + b[i][j];
		}
	}
}
void sub_matrix(int a[ROWS][COLS], int b[ROWS][COLS], int c[ROWS][COLS]) {
	for (int i = 0; i < ROWS; i++) {
		for (int j = 0; j < COLS; j++) {
			c[i][j] = a[i][j] - b[i][j];
		}
	}
}

02.

#define _CRT_SEUCRE_NO_WARNINGS
#include <stdio.h>

#define MAXROWS 100
#define MAXCOLS 100
 
typedef struct matrix {
	int rows, cols;
	int data[MAXROWS][MAXCOLS];
}Matrix;

void print_matrix(Matrix* m);
void add_matrix(Matrix* a, Matrix* b, Matrix* c);
void sub_matrix(Matrix* a, Matrix* b, Matrix* c);

int main() {
	Matrix A = { 3,3, {{1,2,3},{4,5,6},{7,8,9}} };
	Matrix B = { 3,3, { {11,12,13},{14,15,16},{17,18,19} } };
	Matrix C;

	printf("A = \n");
	print_matrix(&A);
	printf("B = \n");
	print_matrix(&B);

	add_matrix(&A, &B, &C);
	printf("A + B =\n");
	print_matrix(&C);
	sub_matrix(&B, &A, &C);
	printf("B - A =\n");
	print_matrix(&C);
	

}

void print_matrix(Matrix* m) {
	for (int i = 0; i < m->rows; i++) {
		for (int j = 0; j < m->cols; j++) {
			printf("%2d ", (*m).data[i][j]);
		}
		puts("");
	}
}

void add_matrix(Matrix* a, Matrix* b, Matrix* c) {
	c->rows = a->rows;
	c->cols = a->cols;
	for (int i = 0; i < a->rows; i++) {
		for (int j = 0; j < a->cols; j++) {
			c->data[i][j] = a->data[i][j] + b->data[i][j];
		}
	}
}
void sub_matrix(Matrix* a, Matrix* b, Matrix* c) {
	c->rows = a->rows;
	c->cols = a->cols;
	for (int i = 0; i < a->rows; i++) {
		for (int j = 0; j < a->cols; j++) {
			c->data[i][j] =a->data[i][j] - b->data[i][j];
		}
	}
}

03. 구조체 연습(img 가 음수인 경우 처리 주의)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

typedef struct complex {
	int real;
	int img;
}COMPLEX;

void print_complex(COMPLEX* c);
COMPLEX add(COMPLEX x, COMPLEX y);
COMPLEX sub(COMPLEX x, COMPLEX y);


void main() {
	COMPLEX x, y, z;
	scanf("%d %d", &x.real, &x.img);
	scanf("%d %d", &y.real, &y.img);

	z = add(x, y);
	print_complex(&x);
	printf(" + ");
	print_complex(&y);
	printf(" = ");
	print_complex(&z);
	printf("\n");

	z = sub(x, y);
	print_complex(&x);
	printf(" - ");
	print_complex(&y);
	printf(" = ");
	print_complex(&z);
}

void print_complex(COMPLEX* c) {  // img 범위 
	printf("(%d ", c->real);
	if (c->img > 0)
		printf("+ %di)", c->img);
	else if (c->img < 0)
		printf("- %di)", -c->img);
	else
		printf(")");
}

COMPLEX add(COMPLEX x, COMPLEX y) {
	COMPLEX z;
	z.real = x.real + y.real;
	z.img = x.img + y.img;
	return z;
}

COMPLEX sub(COMPLEX x, COMPLEX y) {
	COMPLEX z;
	z.real = x.real - y.real;
	z.img = x.img - y.img;
	return z;
}

04. 구조체 선언과 입출력

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct student {
    char name[20];
    int year;
    char no[20];
    char phone[20];
}Student;

void PrintStudent(Student* s);
void InputStudent(Student* s);

void main() {
    int i, count, found;
    char name[20];
    Student* p = NULL;

    printf("몇명: ");
    scanf("%d", &count);

    p = (Student*)malloc(sizeof(Student) * count);

    for (i = 0; i < count; i++) {
        printf("\n자료번호 %d 입력\n", i + 1);
        InputStudent(p + i);
    }

    printf("\n");
    for (i = 0; i < count; i++) {
        PrintStudent(p + i);
    }

    printf("찾을 이름: ");
    scanf("%s", name);
    found = 0;
    for (i = 0; i < count; i++) { // i를 전역 변수로
        if (strcmp(name, p[i].name) == 0) 
            break;
    }
    if (i < count) // 주의
        PrintStudent(p+i); 
    else
        printf("찾는 데이타가 없습니다.\n");

}

void PrintStudent(Student* s) {
    printf("이름:%s ", s->name);
    printf("학년: %d ", s->year);
    printf("학번: %s ", s->no);
    printf("전화: %s\n", s->phone);
}
void InputStudent(Student* s) {
    printf("이름: ");
    scanf("%s", s->name);
    printf("학년: ");
    scanf("%d", &s->year);
    printf("학번: ");
    scanf("%s", s->no);
    printf("전화: ");
    scanf("%s", s->phone);
}

 


05.  한글을 고려한 reverse()함수 작성하기

한글 조건 : (unsigned char)str[i] >= 0x80 && (unsigned char)str[i+1] >= 0x80) 

정확히는 AC00~D7AF

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

void reverse(char to[], char from[]) {
	//int i;
	int len = strlen(from);
	for (int i = 0; i < len; i++) {
		if ((unsigned char)from[len - 1 - i] >= 0x80 && (unsigned char)from[len - 2 - i] >= 0x80) {
			to[i] = from[len - 2 - i];
			to[i + 1] = from[len - 1 - i];
			i++;
		}
		else
			to[i] = from[len - i - 1];
	}
	to[len] = '\0';  // i가 전역변수인 경우 to[i] = '\0'도 가능
}


void main()
{
	char str1[100] = "한성대학교";
	char str2[100] = "University";
	char str3[100] = "Computer";
	char str4[100] = "Engineering";
	char str5[100];
	char str6[100];
	int ret;
	ret = strlen(str1);
	printf("strlen(%s)=%d\n", str1, ret);
	ret = strcmp(str1, str1);
	printf("strcmp(%s, %s) = %d\n", str1, str1, ret);
	ret = strcmp(str1, str2);
	printf("strcmp(%s, %s) = %d\n", str1, str2, ret);
	ret = strcmp(str1, str3);
	printf("strcmp(%s, %s) = %d\n", str1, str3, ret);
	strcpy(str5, str1);
	printf("strcpy str5 = %s\n", str5);
	strcat(str5, " ");
	strcat(str5, str2);
	printf("strcat str5, str2 = %s\n", str5);
	reverse(str6, str5);
	printf("reverse str5 = %s\n", str6);
}

06.

int mystrlen(char* str) {
    char* s = str;
    while (*s)
        s++;
    return (s - str);
}

int mystrlen(char* str) {
    char* s = str;
    int count = 0;
    while (*str++ != '\0') {
        count++;
    }
    return count;
}

int mystrlen(char* str) {
    char* s = str;
    int len = 0;
    while (s[len] != '\0') 
        len++;    
        return len;
}
int mystrcmp(char* s1, char* s2) {
    unsigned char *p1 = (unsigned char *)s1; // 한글 고려 안하면 unsigned 빼면됨
    unsigned char *p2 = (unsigned char *)s2; // unsigned char* 선언 대신, (unsigned char)*s1 방식 사용 가능
    while (*p1 || *p2) {
        if (*p1 < *p2)
            return -1;
        else if (*p1 > *p2)
            return 1;
        p1++;
        p2++;
    }
    return 0;
}


int mystrcmp(char* s1, char* s2) // 한글 고려시, (unsigned char)s1[i]과 같은 방법 쓰면 됨
{
    int len1, len2, i;
    len1 = mystrlen(s1);
    len2 = mystrlen(s2);
    for (i = 0; i <= len1 && i <= len2; i++) {
        if (s1[i] > s2[i])
            return 1;
        else if (s1[i] < s2[i])
            return -1;
    }
    return 0;
}
char* mystrcpy(char* to, char* from) {
    int i, len;
    len = mystrlen(from);
    for (i = 0; i <= len; i++) {
        to[i] = from[i];
    }
    return to;
}

char* mystrcpy(char* to, char* from) {
    char* fp = from;
    char* tp = to;
    while (*fp) {// *fp != '\0'도 가능
        *tp++ = *fp++;
    }
    *tp = '\0';

    return to;
}
char* mystrcat(char* to, char* from) {
    while (*to) {
        to++;
    }
    while (*from) {
        *to++ = *from++;
    }
    *to = '\0';
}

char* mystrcat(char* to, char* from) {
    int i, len1, len2;
    len1 = mystrlen(to);
    len2 = mystrlen(from);
    for (i = 0; i <= len2; i++) {
        to[len1 + i] = from[i];
    }
}
void reverse(char to[], char from[]) {
    unsigned char* p1 = (unsigned char *)to;
    unsigned char* p2 = (unsigned char *)from;
    int len = mystrlen(p2);
    for (int i = 0; i < len; i++) {
        if (p2[len - 1 - i] >= 0x80 && p2[len - 2 - i]) {
            p1[i] = p2[len - 2 - i];
            p1[i + 2] = p2[len - 1 - i];
            i++;
        }
        else
            p1[i] = p2[len - 1 - i];
    }
}


void reverse(char* to, char* from)
{
    char* p;
    p = from + mystrlen(from) - 1; // from 의 끝으로 이동
    while (p >= from) {
        if (*p & 0x80) { // 한글인 경우
            *to = *(p - 1); // two bytes씩 copy
            *(to + 1) = *p;
            to += 2; // two byte 씩 이동
            p -= 2;
        }
        else { // 영문인 경우
            *to = *p;
            to++;
            p--;
        }
    }
    *to = '\0';

}
void main() {
    char str1[100] = "한성대학교";
    char str2[100] = "University";
    char str3[100] = "Computer";
    char str4[100] = "Engineering";
    char str5[100];
    char str6[100];
    int ret;
    ret = mystrlen(str1);
    printf("mystrlen(%s)=%d\n", str1, ret);
    ret = mystrcmp(str1, str1);
    printf("mystrcmp(%s, %s) = %d\n", str1, str1, ret);
    ret = mystrcmp(str1, str2);
    printf("mystrcmp(%s, %s) = %d\n", str1, str2, ret);
    ret = mystrcmp(str1, str3);
    printf("mystrcmp(%s, %s) = %d\n", str1, str3, ret);
    mystrcpy(str5, str1);
    printf("mystrcpy str5 = %s\n", str5);
    mystrcat(str5, " ");
    mystrcat(str5, str2);
    printf("mystrcat str5 = %s\n", str5);
    reverse(str6, str5);
    printf("reverse str5 = %s\n", str6);
}

 


표준 입출력과 파일 입출력

표준 입출력의 문제점:

1) 키보드 입력: 실행 마다 똑같은 데이터를 입력

2) 모니터 출력: 실행 결과 창 스크롤링, 결과 창을 닫으면 출력 내용이 사라짐

해결: 데이터를 저장한 파일로부터 입력을 받고 결과를 파일로 저장하기(파일 입출력)

 

07.  FILE *fp 이용 입/출력

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void main() {
	FILE* fp;
	char buf[100], filename[100];
	int id = 1492001;
	char name[20] = "홍길동";
	char phone[20] = "010-1234-5678";


	fp = fopen("data.txt", "w"); // w를 write mode, a는 추가(append)
	fprintf(fp, "%d\n", id);
	fprintf(fp, "%s\n", name);
	fprintf(fp, "%s\n", phone);
	fclose(fp);
	// 파일에서 입력(read)
	printf("입력 파일 명 : ");
	scanf("%s", filename);
	fp = fopen(filename, "r"); // r은 read mode
	fscanf(fp, "%d", &id);
	printf("학번=%d\n", id);
	fscanf(fp, "%s", buf);
	printf("이름=%s\n", buf);
	fscanf(fp, "%s", buf);
	printf("전화=%s\n", buf);
	fclose(fp);

}

 


08.  구조체(레코드 저장) -> binary (이진) 모드, fread와 fwrite 사용

파일 열기:

 1) fp = fopen(filename, "r+b");

 2) fp = fopen(filename, "w+b");

 

구조체 저장 (data 부분은 항상 주소 형태)

 1) fwrite(void *data, size, n fp);

 2) fread(void *data, size, n fp); 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

void main() {
	FILE* fp;
	char buf[100], filename[100];
	int id = 1492001;
	char name[20] = "홍길동";
	char phone[20] = "010-1234-5678";


	fp = fopen("data.txt", "w+b"); 
	fwrite(&id, sizeof(int), 1, fp);
	fwrite(name, sizeof(char), strlen(name), fp);
	fwrite(phone, sizeof(char), strlen(phone), fp);
	fclose(fp);

	printf("입력 파일 명 : ");
	scanf("%s", filename);
	fp = fopen(filename, "r+b"); 
	fread(&id, sizeof(int), 1, fp);
	printf("학번=%d\n", id);
	fread(name, sizeof(char), strlen(name), fp);
	printf("이름=%s\n", name);
	fread(phone, sizeof(char), strlen(phone), fp);
	printf("전화=%s\n", phone);
	fclose(fp);

}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>


int main() {
	FILE* fp;
	char file[20];
	int id = 1492001;
	char name[20] = "홍길동";
	char tel[20] = "010-1234-5678";
	int temp;
	char buffer[100];

	printf("입력 파일 명: ");
	scanf("%s", file);
	fp = fopen(file, "w+b");
	fwrite(&id, sizeof(int), 1, fp);
	fwrite(name, sizeof(char), strlen(name)+1, fp); // sizeof(name)
	fwrite(tel, sizeof(char), strlen(tel)+1, fp);
	fclose(fp);

	fp = fopen(file, "r+b");
	fread(&temp, sizeof(int), 1, fp);
	printf("학번=%d\n", temp);
	fread(buffer, sizeof(char), strlen(name)+1, fp);
	printf("이름=%s\n", buffer);
	fread(buffer, sizeof(char), strlen(tel)+1, fp);
	printf("전화=%s\n", buffer);
	fclose(fp);


}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

typedef struct student {
	int id;
	char name[20];
	char phone[20];

}Student;

int main() {
	FILE* fp;
	Student s = { 1492001, "홍길동", "010-1234-5678" };
	Student s1;
	char file[20];


	printf("입력 파일 명: ");
	scanf("%s", file);
	fp = fopen(file, "w+b");

	fwrite(&s, sizeof(Student), 1, fp);
    
	fseek(fp,0,SEEK_SET); // 파일 포인터 위치 다시 초기화
	fread(&s1, sizeof(Student), 1, fp);
 
	printf("학번 = %d\n", s1.id);
	printf("이름 = %s\n", s1.name);
	printf("전화 = %s\n", s1.phone);
	fclose(fp);

}

09. Random Access 파일

 

Random Access

  • 순차(Sequential) 파일 -> 처음부터 읽어야 함
  • 랜덤 파일: 원하는 위치에서 읽고/쓸수 있다.

fssek(fp, offset, whence) 사용

  • 파일 입/출력 위치를 whence + offset으로 이동
  • whence 기준점:
  • SEEK_SET: 0 -> 파일 시작지점
  • SEEK_CUR: 1-> 파일의 현재 지점
  • SEEK_END: 2 -> 파일의 끝 지점

fseek(fp, n * sizeof(struct Student), 0);

n번 record로 입/출력 위치를 이동한다.


10.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 24
typedef struct Phone {
	char name[SIZE];
	char phone[SIZE];
} Phone;

void menu()
{
	printf("\n*** 전화번호 ***\n");
	printf("(1) 목록\n");
	printf("(2) 검색\n");
	printf("(3) 추가\n");
	printf("(4) 종료\n");
	printf("--------------\n");
	printf("선택하세요 : ");
}

int main(void) {
	FILE* fp;
	int i, n, filesize, ndata;
	char filename[100], buf[100], buf2[100];
	struct Phone ph;

	fp = fopen("phone_b", "w+b");
	while (1) {
		menu();
		scanf("%d", &n);
		switch (n) {
		case 1:
			printf("\n** 자료 목록 **\n");
			fseek(fp, 0, SEEK_END); 
			filesize = ftell(fp);
			ndata = filesize / sizeof(struct Phone);
			fseek(fp, 0, SEEK_SET);
			for (int i = 0; i < ndata; i++) {
				fread(&ph, sizeof(struct Phone), 1, fp);
				printf("이름: %s \t 전화: %s\n", ph.name, ph.phone);
			}
			break;
		case 2:
			printf("\n** 자료 찾기 **\n");
			printf("찾을 이름 : ");
			scanf("%s", buf);
			fseek(fp, 0, SEEK_END); 
			filesize = ftell(fp);
			ndata = filesize / sizeof(struct Phone);
			fseek(fp, 0, SEEK_SET);
			for (int i = 0; i < ndata; i++) {
				fread(&ph, sizeof(struct Phone), 1, fp);
				if (strcmp(ph.name, buf) == 0) {
					printf("이름: %s \t 전화: %s\n", ph.name, ph.phone);
					break;
				}
			}
			if (strcmp(ph.name, buf) != 0)
				printf("찾는 데이터가 없습니다.\n");
			break;
		case 3:
			printf("\n** 자료 추가 **\n");
			printf("이름: ");
			scanf("%s", ph.name);
			printf("전화 : ");
			scanf("%s", ph.phone);
			fseek(fp, 0, SEEK_END); // ?????? ???
			fwrite(&ph, sizeof(struct Phone), 1, fp);
			break;
		case 4: printf("\n** 자료 종료 **\n");
			break;
		}
		if (n == 4)
			break;
	}
	fclose(fp);
	return 0;
}
printf("\n** 자료 변경**\n");
if (sel == -1) {
	printf("자료를 선택하시오\n");
	continue;
}
fseek(fp, sizeof(Phone) * sel, SEEK_SET);
fread(&p, sizeof(Phone), 1, fp);
printf("이름: %s \t 전화: %s\n", p.name, p.tel);
printf("새로운 데이터 입력\n");
printf("이름: ");
scanf("%s", p.name);
printf("전화: ");
scanf("%s", p.tel);
fseek(fp, sizeof(Phone) * sel, SEEK_SET);
fwrite(&p, sizeof(Phone), 1, fp);
            #define DELETED "DELETED"
            Phone deleted = {DELETED, DELETED};
            
            printf("\n** 자료 삭제**\n");
            if (sel == -1) {
                printf("자료를 선택하시오\n");
                continue;
            }
            fseek(fp, sizeof(Phone) * sel, SEEK_SET);
            fread(&p, sizeof(Phone), 1, fp);
            printf("이름: %s \t 전화: %s\n", p.name, p.tel);
            printf("진짜 삭제?:\n");
            scanf("%d", &del);
            if (del) {
                fseek(fp, sizeof(Phone) * sel, SEEK_SET);
                fwrite(&deleted, sizeof(Phone), 1, fp);
            }
            
            // 자료찾기와 자료 목록 반복문 안에
             if (strcmp(DELETED, p.name) == 0 && strcmp(DELETED, p.tel) == 0)
     			continue;

11.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define SIZE	24
typedef struct phone {
	char name[SIZE];
	char phone[SIZE];
} Phone;

#define FILENAME "phone.txt"
#define DELETED	"DELETED" 

void displaymenu()
{
	printf("\n*** 전화번호 ***\n");
	printf("(1) 목록\n");
	printf("(2) 검색\n");
	printf("(3) 추가\n");
	printf("(4) 변경\n");
	printf("(5) 삭제\n");
	printf("(99) 종류\n");
	printf("---------------\n");
	printf("선택하세요 : ");
}


int getnumberofdata(FILE* fp)
{
	int filesize;
	int n;
	fseek(fp, 0, SEEK_END);
	filesize = ftell(fp); 
	n = filesize / sizeof(Phone);
	return n;

}


void disp_one(Phone* data)
{
	printf("이름: %s   전화: %s\n", data->name, data->phone);
}

void list(FILE* fp)
{
	Phone data;
	int ndata;

	printf("\n** 전체 목록 **\n");
	ndata = getnumberofdata(fp);
	if (ndata == 0) {
		printf("데이터가 없습니다.\n");
		return;
	}
	fseek(fp, 0, SEEK_SET); 
	while (ndata--) {
		fread(&data, sizeof(data), 1, fp);
		if (strcmp(data.name, DELETED) == 0 &&
			strcmp(data.phone, DELETED) == 0)
			continue;
		disp_one(&data);
	}
}


int search(FILE* fp)
{
	Phone data;
	char name[20];
	int n;
	int ndata; 

	printf("\n** 자료 찾기 **\n");
	ndata = getnumberofdata(fp); 
	if (ndata == 0) {
		printf("Data가 없습니다.\n");
		return -1;
	}

	printf("찾을 이름 : ");
	scanf("%s", name);

	fseek(fp, 0, SEEK_SET); 
	for (n = 0; n < ndata; n++) {
		fread(&data, sizeof(data), 1, fp);
		if (strcmp(data.name, DELETED) == 0 &&
			strcmp(data.phone, DELETED) == 0)
			continue;
		if (strcmp(data.name, name) == 0)
			break;
	}
	if (n >= ndata) {
		printf("찾는 데이터가 없습니다.\n");
		return -1;
	}
	disp_one(&data);
	return n;
}

void inputone(Phone* data)
{
	printf("이름 : ");
	scanf("%s", data->name);
	printf("번호 : ");
	scanf("%s", data->phone);
}

int getblank(FILE* fp)
{
	Phone data;
	int n;
	int ndata;

	ndata = getnumberofdata(fp); 
	if (ndata == 0) {
		return -1;
	}
	fseek(fp, 0, SEEK_SET); 
	for (n = 0; n < ndata; n++) {
		fread(&data, sizeof(data), 1, fp);
		if (strcmp(data.name, DELETED) == 0 &&
			strcmp(data.phone, DELETED) == 0)
			return n;
	}
	return -1;
}


void add(FILE* fp)
{
	Phone data;
	int blank_n; 
	printf("\n** 자료 추가 **\n");
	inputone(&data);
	blank_n = getblank(fp);
	if ((blank_n = getblank(fp)) == -1) { 
		fseek(fp, 0, SEEK_END);
	}
	else
		fseek(fp, blank_n * sizeof(Phone), SEEK_SET);
	fwrite(&data, sizeof(data), 1, fp);
}

void updateone(FILE* fp, int n)
{
	Phone data;
	printf("\n** 변경 **\n");
	if (n == -1) {
		printf("변경할 데이터를 찾으세요.\n");
		return;
	}
	printf("변경할 데이터");
	fseek(fp, n * sizeof(Phone), SEEK_SET);
	fread(&data, sizeof(Phone), 1, fp);
	disp_one(&data);
	printf("새로운 데이터 입력\n");
	inputone(&data); // data ???
	fseek(fp, n * sizeof(Phone), SEEK_SET);
	fwrite(&data, sizeof(Phone), 1, fp);
}

void deleteone(FILE* fp, int n)
{
	Phone deletedata = { DELETED, DELETED };
	Phone data;
	int ans;
	int ndata;

	printf("\n** 삭제 **\n");
	ndata = getnumberofdata(fp); //record number
	if (ndata == 0) {
		printf("데이터가 없습니다.\n");
		return;
	}
	if (n == -1) {
		printf("삭제할 데이터를 찾으세요.\n");
		return;
	}
	printf("삭제할 데이터\n");
	fseek(fp, n * sizeof(Phone), SEEK_SET);
	fread(&data, sizeof(Phone), 1, fp);
	disp_one(&data);
	printf("삭제? (1/0) : ");
	scanf("%d", &ans);
	if (ans == 1) {
		fseek(fp, n * sizeof(Phone), SEEK_SET);
		fwrite(&deletedata, sizeof(Phone), 1, fp); // shift down
		printf("삭제되었습니다.\n");
	}
	else
		printf("취소되었습니다.\n");
}
void main()
{
	//Phone data;
	FILE* fp;
	//int i;
	int record_number; // ???? ??? record ???
	int menu;

	record_number = -1; // ????/???? ??? record ???

	// ?????? open, ???ο? ??????? w?? ????
	if ((fp = fopen(FILENAME, "r+b")) == NULL) { // ?????? ??????
		fp = fopen(FILENAME, "w+b"); // ???? ????
		if (fp == NULL) {
			printf("파일을 열 수 없습니다.\n");
			exit(0);
		}
	}

	while (1) {
		do {
			displaymenu();
			scanf("%d", &menu);
		} while (menu != 99 && (menu < 1 || menu>5));
		if (menu == 99) 
			break;
		switch (menu) {
		case 1: list(fp);
			break;
		case 2: record_number = search(fp);
			break;
		case 3: add(fp);
			record_number = -1;
			break;
		case 4: updateone(fp, record_number);
			record_number = -1;
			break;
		case 5: deleteone(fp, record_number);
			record_number = -1;
			break;
		}
	}

	fclose(fp);
}

ACM

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

void make_even(int* p, int n) {
	for (int i = 0; i < n; i++) {
		if (p[i] % 2 == 1) {
			p[i] += 1;
		}
	}
}

void print_arr(int* p, int n) {
	for (int i = 0; i < n; i++) {
		printf("%d ", p[i]);
	}
	printf("\n");
}

void give_arr(int* p, int n) {
	int* temp = (int*)malloc(sizeof(int) * n);
	for (int i = 0; i < n; i++) {
		temp[i] = p[i] / 2;
		p[i] -= temp[i];
	}
	for (int i = 0; i < n; i++) {
		p[(i + 1) % n] += temp[i]; 
	}
	free(temp);
}

int is_equl(int* p, int n) {
	for (int i = 1; i < n; i++) {
		if (p[0] != p[i])
			return 0;
	}
	return 1;
}

int main() { // + 사탕갯수 출력
	int t, n; // 테스트케이스, 인원수
	int* p;
	int count;
	int k;

	printf("중간과정 출력(1/0) : ");
	scanf("%d", &k);
	scanf("%d", &t);

	for (int i = 0; i < t; i++) {
		count = 0;
		scanf("%d", &n);
		p = (int*)malloc(sizeof(int) * n);
		for (int j = 0; j < n; j++) {
			scanf("%d", &p[j]);
		}

		if (k == 1) {
			printf("시작 %d: ", count);
			print_arr(p, n);
		}

		make_even(p, n);
		if (k == 1) {
			printf("짝수 %d: ", count);
			print_arr(p, n);
		}

		while (is_equl(p, n) == 0) {
			count++;
			give_arr(p, n);
			if (k == 1) {
				printf("전달 %d: ", count);
				print_arr(p, n);
			}

			make_even(p, n);
			if (k == 1) {
				printf("짝수 %d: ", count);
				print_arr(p, n);
			}
		}
		printf("%d\n", count);

		free(p);
	}

}

'프로그래밍랩' 카테고리의 다른 글

프로그래밍랩 13주차  (0) 2024.11.25
프로그래밍랩 12주차  (0) 2024.11.19
프로그래밍랩 9주차  (0) 2024.11.07
[프로그래밍 랩] C언어 복습 문제 4  (0) 2024.10.25
[프로그래밍 랩] C언어 복습 문제 5  (0) 2024.10.25

+ Recent posts