C언어 이론 #4 (4월 요약)

2022. 5. 5. 11:41카테고리 없음

4월에 배운 내용을 요약하는 글입니다

 

//===========================================================================

// 커스텀 헤더파일 import

 

#include <stdio.h>
#define MAX 100
#define MIN 5
#define PI 3.14159

 

#include "my.h"                         // 커스텀 헤더파일을 임포트할 때는 <>대신 큰따옴표를 사용한다


double area(double r);
double around(double r);

void main() {
puts("=======include지시자\n");
test();
}

 

//===========================================================================

// 매크로 ( 전역 함수 )

 

#include <stdio.h>
#define SQUARE(x) ((x)*(x))             //괄호를 써야 오류 안 남
#define ABS(x) ((x)<0 ? (-x):(x))

void main() {
int n;
puts("숫자입력: \n");
scanf_s("%d", &n);
printf("제곱: %d\n", SQUARE(n));
printf("절대값: %d\n", ABS(n));
}

 

//===========================================================================

// 문자열 검사

 

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

int main() {
int c;

printf("대문자 소문자 검사: \n");
while ((c = getchar()) != EOF) {
if (islower(c)) {
printf("%c : 소문자\n", c);
}
else if (isupper(c)) {
printf("%c : 대문자\n", c);
}
}


printf("대문자 변환: \n");
while ((c = getchar()) != EOF) {
if (islower(c)) {
c = toupper(c);
}
putchar(c);
}

printf("\n\n\n");

 

char s1[10] = "world";
char s2[20] = "hello ";

strcat(s2, s1);
printf("src = %s \n", s1);
printf("dst = %s \n", s2);

printf("%d\n", strlen(s1));                // 문자열 길이 반환 널문자 빼고 셈
printf("%d\n", strlen(s2));
printf("%d\n", strlen("hello"));

char s1[10] = "world";
char s2[20] = "hello ";

if (strcmp(s2, s1) == 0) {                // 문자열 비교
printf("동일한 배열\n");
}
else {
printf("다른 배열\n");
}
printf("s1 = %s\n", s1);
printf("s2 = %s\n", s2);

 


char s1[10] = "100";
char s2[20] = "12.9";
int num1;
double num2, result;

num1 = atoi(s1);
num2 = atof(s2);
result = num1 + num2;

printf("%d + %.2f = %.2f\n", num1, num2, result);


int i;
char menu[5][10] = {
"init",
"open",
"close",
"read",
"write"
};

for (int i = 0; i < 5; i++) {
printf("%d번째 메뉴: %s\n", i+1, menu[i]);
}

char s1[30] = "The Little Prince";
char* ptr = strtok(s1, " ");                // 두번째 인자에 입력한 단위로 token을 분할함

while (ptr != NULL) {
printf("%s\n", ptr);
ptr = strtok(NULL, " ");
}

return 0;
}

 

//===========================================================================

 

#include <stdio.h>
//#define ASSERT(exp) { if(!(exp))\
{printf("가정(" #exp ")이 소스파일 %s %d번째 줄에서 오류\n"\           // 디버깅
,__FILE__, __LINE__), exit(1);}}
//#define INFO 2

#define DEBUG
#define USA

//int average(int x, int y);

#ifndef PI                                 // PI를 define하지 않았다면 PI를 3.14로 define해라
#define PI 3.14
#endif                                     // endif 반드시 사용

#ifndef SQU
#define SQU(x) ((x)*(x))
#endif

void area(double r) {
double result = 0.0;
#ifdef DEBUG
#ifdef USA
result = r * r * PI;
printf("area = %lf\n", result);
#else
result = r * r * PI;
printf("면적 = %lf\n", result);
#endif
#endif

}

int main() {
/*
int sum = 0;
ASSERT(sum == 1);
*/
/*
printf("file name = %s\n", __FILE__);             // _ 두개
printf("date = %s\n", __DATE__);
printf("time = %s\n", __TIME__);
printf("Line = %d\n", __LINE__);
*/
/*
char* data;
#if(INFO == 1) 
data = "wonderful";
printf("data = %s\n", data);
#elif(INFO == 2)                                    // else if == elif
data = "try";
printf("data = %s\n", data);
#else
printf("data의 내용은 없음\n");
#endif
*/
//average(5, 6);
area(9);



return 0;
}
/*
int average(int x, int y) {
#ifdef DEBUG
printf("x = %d, y = %d\n", x, y);
#endif
#undef DEBUG
#ifdef DEBUG
printf("x = %d, y = %d\n", x, y);
#endif
printf("기존 처리 방식으로 실행되는 줄\n");
}

 

//===========================================================================

// 파일 생성 및 읽기

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main() {
FILE* fp = NULL;                       // 초기화 
fp = fopen("open1.txt", "w");        // open1.txt 파일 write으로 생성
if (fp == NULL) {
puts("파일생성실패\n");
}
else {
puts("파일생성성공\n");
}
fputc('h', fp);
fputc('e', fp);
fputc('l', fp);
fputc('l', fp);
fputc('o', fp);

fclose(fp);

fp = fopen("open1.txt", "r");           // open1.txt파일 read로 생성

if (fp == NULL) {
puts("파일읽기실패\n");
}
else {
puts("파일읽기성공\n");
}

int i = 0;
while ((i = fgetc(fp)) != EOF) {
putchar(i);
}

fclose(fp);                             // 닫아줘야 함

return 0;
}
*/

 

//=========================================================================== // 텍스트 파일 내용 복사

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
FILE* fp1 = NULL;                            // 생성할 파일포인터 초기화
FILE* fp2 = NULL;

char file1[30], file2[30], buffer[50];
printf("원본 파일 이름 입력: ");
scanf("%s", file1);
printf("복사 파일 이름 입력: ");
scanf("%s", file2);

if ((fp1 = fopen(file1, "r")) == NULL) {             // read로 file1에 입력했던 것 생성
puts("파일 열기 실패\n");
exit(1);
}
else {
puts("파일 읽기 성공\n");
}

if ((fp2 = fopen(file2, "w")) == NULL) {            // write로 file2에 입력했던 것 생성
puts("파일 생성 실패\n");
exit(1);
}
else {
puts("파일 생성 성공\n");
}

while (fgets(buffer, 50, fp1) != NULL) {           // fp1에 있던 것을 읽었을 때 null이 아닐 때까지 buffer에 저장 후            fputs(buffer, fp2);                                  //buffer에 있는 것을 fp2에 출력
}

fclose(fp1);
fclose(fp2);

return 0;
}

 

//===========================================================================

// 텍스트 파일 내에서 단어 검색

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
FILE* fp = NULL;


char filename[20], buffer[100], word[10];
int line = 0;
printf("파일 이름 입력: ");
scanf("%s", filename);                               // filename으로 찾아서 해당 파일을 찾고 검색어를 받음
printf("검색어 입력: ");
scanf("%s", word);

if ((fp = fopen(filename, "r")) == NULL) {
puts("파일 열기 실패\n");
exit(1);
}
else {
puts("파일 읽기 성공\n");
}

while (fgets(buffer, 100, fp)) {
line++;
if (strstr(buffer, word)) {
printf("%s 파일의 %d번째 줄에서 단어 %s발견됨\n",
filename, line, word);
}
}
return 0;
}

 

//===========================================================================

// 파일 생성해서 파일 내용 조작

 

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

int main() {
FILE* fp = NULL;
int number, count = 0;
char name[20], fname[30];
float score, total = 0.0;

printf("성적 파일 명을 입력: ");
scanf("%s", fname);
if ((fp = fopen(fname, "w")) == NULL) {
fprintf(stderr, "%s 파일을 찾지 못함", fname);            // 파일 찾기
exit(0);
}
while (1) {
printf("학번 이름 성적 입력(음수 입력 시 종료): ");
scanf("%d", &number);
if (number < 0) {
break;                                  // 음수 입력 시 종료
}
scanf("%s %f", name, &score);

fprintf(fp, "%d %s %.2f\n", number, name, score);
}
fclose(fp);

if ((fp = fopen(fname, "r")) == NULL) {
fprintf(stderr, "%s파일을 열 수 없음", fname);
}
while (!feof(fp)) {
fscanf(fp, "%d %s %f", &number, name, &score);
total += score;
count++;
}

printf("\n평균 = %.2f\n\n", total / count);

fclose(fp);

return 0;
}

 

//===========================================================================

// 구조체 종합

 

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

struct student {                                                 // 구조체 선언
int num;
char name[20];
double grade;
};
// 함수에 구조체를 직접 값을 넣기(call by value)보단 >> 구조체를 통째로 쓰게 됨
// 포인터 사용이 좋음(call by reffernce)


int equal(struct student s1, struct student s2) {
if (s1.num == s2.num) {
return 1;
}
else {
return 0;
}
}


int equal(struct student *p1, struct student *p2) {
if (p1->num == p2->num) {                                  // 구조체 함수 
return 1;
}
else {
return 0;
}
}

struct student create() {                                        // 구조체 호출용
struct student s;
s.num = 3;
strcpy(s.name, "kim");
s.grade = 3.5;

return s;
}

union example {                         // 공용체와 구조체 비교용
char c;
int i;
int j;
};
struct exam_s {
char c;
int i;
int j;
};

enum days {SUN = 7, MON = 2, TUE, WED, THU, FRI, SAT};    // 열거형


void main() {
/*
struct student s = { 24,"kim",4.3 };

printf("학번: %d\t", s.num);
printf("이름: %s\t", s.name);
printf("학점: %.2f\n", s.grade);

struct student* p;
p = &s;

printf("학번: %d\t", (*p).num);
printf("이름: %s\t", (*p).name);
printf("학점: %.2f\n", (*p).grade);

printf("학번: %d\t", p->num);
printf("이름: %s\t", p->name);
printf("학점: %.2f\n", p->grade);


struct student s1 = { 1,"park",4.3 };
struct student s2 = { 2,"lee", 3.2 };
struct student s3 = create();

printf("학번: %d\n", s3.num);
printf("이름: %s\n", s3.name);
printf("학점: %.2f\n", s3.grade);

if (equal(&s1, &s2) == 1) {
printf("구조체 번호 같음\n");
}
else {
printf("구조체 번호 다름\n");
}

union example e = { 'a' };

printf("공용체 출력: %c\t %d\t %d\t\n", e.c, e.i, e.j);

e.i = 500;

printf("공용체 출력: %c\t %d\t %d\t\n", e.c, e.i, e.j); // char는 최대 255

printf("\n\n\n");

struct exam_s e1;
union example e2;

printf("구조체 메모리 = %d\n", sizeof(e1)); // 구조체와 공용체의 메모리 비교
printf("공용체 메모리 = %d\n", sizeof(e2));
printf("\n\n\n");

enum days today;
today = TUE;

printf("%d\n", today);

}