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 |