카테고리 없음

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

에푸 2022. 5. 3. 13:55

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

 

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

 

//윤년 계산 

int year, result;

printf("연도 입력: ");
scanf_s("%d", &year);

result = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);

// 4로 떨어지는 년도이면서 100년 단위가 아닐 때거나, 400년 단위일 때거나 둘 중 하나를 만족하면 윤년

(result == 1) ? printf("%d년은 윤년입니다", year) : printf("%d년은 윤년이 아닙니다", year);

 

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

 

// 비트연산자

int x = 9; // 1001
int y = 10; // 1010

 

이진변환된 숫자에서 X와 Y를 비트연산 시 논리 비교


printf("비트 AND = %08x\n", x & y); // 00001000    // x와 y 둘다 1일 때
printf("비트  OR = %08x\n", x | y); // 00001011       // x와 y 둘 중 하나가 1일 때
printf("비트 XOR = %08x\n", x ^ y); // 00000011     // x와 y 둘이 다를 때
printf("비트 NOT = %08x\n", ~x); // 11110110        // x중 0인 값



int x = 4; // 0100
printf("비트 << = %#08x\n", x << 1); // 1000    // x의 1을 왼쪽으로 한 칸
printf("비트 >> = %#08x\n", x >> 1); // 0010    // x의 1을 오른쪽으로 한 칸

 

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

 

char c;
int i;
float f;
c = 10000;
i = 1.23456 + 10;
f = 10 + 20;
printf("c = %d \ni = %d \nf = %f\n", c, i, f); //컴파일러 자동형변환

f = (float)i; //강제 형변환
i = (int)f;
printf("f = %f\ni = %d\n", f, i);

 

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

// 조건문

 

int num;

printf("정수 입력: ");
scanf_s("%d", &num);

if (num > 0) {
printf("%d은(는) 양수입니다\n", num);
}
else if (num == 0) {
printf("%d은(는) 0입니다\n", num);

}
else {
printf("%d은(는) 음수입니다\n", num);
}

 

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

// switch문

 

int x, y, result = 0;
char op;
printf("2+5 형식으로 입력: ");
scanf_s("%d %c %d", &x, &op, 1, &y);

 

switch (op) {
case '+': result = x + y; break;
case '-': result = x - y; break;
case '*': result = x * y; break;
case '/': result = x / y; break;
default: printf("잘못된 연산자입니다");
} //switch end

printf("%d %c %d = %d", x, op, y, result);

 

//

 

int number;
printf("넘버: ");
scanf_s("%d", &number);

switch (number) {
case 0: printf("없음"); break;
case 1: printf("하나");               // break를 안 쓸 경우 그다음 문장으로 넘어가서
case 2: printf("둘"); break;         // break가 나올 때까지 실행한다
default: printf("그외"); break;
}

 

//월별 날짜 계산기 if 문 안에 switch문 넣어서 잘못된 값 검출

 

int month;

printf("몇 월인지 입력: ");
scanf_s("%d", &month);

if (month > 12) {
printf("입력이 잘못되었습니다\n");
}
else {
switch (month) {
case 2: printf("2월은 28일입니다"); break;
case 4:                                                                  // 4월, 6월, 9월, 11월이 입력될 경우 모두 30일이기 때문에  
case 6:                                                                  // 모두 30일로 출력되도록 break문을 쓰지 않음
case 9:
case 11: printf("%d월은 30일입니다", month); break;
default: printf("%d월은 31일입니다", month); break;
}
}

 

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

// 기본 스왑알고리즘 

// temp 임시변수 활용

 

int big, small, temp;

printf("첫번째 수: ");
scanf_s("%d", &big);
printf("두번째 수: ");
scanf_s("%d", &small);

if (big < small) {
temp = big;
big = small;
small = temp;
}
temp = 0;
printf("큰 수 = %d\n작은 수 = %d", big, small);

 

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

 

//scanf_s로 여러 개의 정보를 입력받을 시
//표준입력버퍼에 잔여문자가 남게 되어 오류가 발생한다
//그럴 때 scanf 입력 후 rewind(stdio)함수를 사용하여
//잔여문자를 지우고 그다음 scanf를 처리하도록 한다

 

int age, fee;
char local;
fee = 10000;

printf("나이: ");
scanf_s("%d", &age);


rewind(stdin);


printf("지역주민 여부(y/n):");
scanf_s("%c", &local, 1);

if (age >= 60) {
fee -= 5000;
}

if (local == 'y') {
fee -= 5000;
}

printf("요금: %d", fee);

 

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

 

//do~while문
int i = 0;

do {
printf("1---새로 만들기\n");
printf("2---  파일 열기\n");
printf("3---  파일 닫기\n");
printf("하나를 선택하세요\n");
scanf_s("%d", &i);
} while (i < 1 || i > 3); {
printf("선택된 메뉴 = %d \n", i);
}

 

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

 

// !n 구하기 


long fact = 1;
int i, n;

printf("정수를 입력하시오: ");
scanf_s("%d", &n);

for (i=1;i<=n;i++) {
fact = fact * i;
}
printf("%d!는 %d입니다\n", n, fact);


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

 

//무한반복
    for (;;) {
    printf("HELLO!");
}


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

 

//시드머니가 10배가 되면 빠져나옴

 

const int SEED_MONEY = 1000000;
int year = 0, money = SEED_MONEY;

while (1) {
     year++;
    money += money *0.3;
    if (money > 10 * SEED_MONEY) {
        break;
    }
}
printf("%d년 만에 10배 수익 창출됨: %d 원\n", year, money);

 

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

 

//continue문 예제
int i;
for (i = 0; i < 10; i++) {
if (i % 3 == 0) {
continue;
}
printf("%d", i);
}

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

//함수

// C언어에서는 컴파일러가 미리 인식할 수 있도록 함수를 메인함수보다 앞에서 원형을 선언하고 메인함수에서

// 해당 함수를 호출하여 컴파일한다 또한 함수부가 너무 뚱뚱해지지 않도록 메인함수 밑에서 따로 함수를 정의하는

// 방법을 쓴다

 

void add(int x, int y);                             // 함수원형
void sub(int x, int y);
void mul(int x, int y);
void div(int x, int y);

 

int main() {
int a = 5, b = 10;                                 // 함수호출
add(a, b);
sub(a, b);
mul(a, b);
div(a, b);

}

 

void add (int x, int y) {                           // 함수정의
int result = x + y;
printf("%d + %d = %d\n", x, y, result);
}
void sub(int x, int y) {
int result = x - y;
printf("%d - %d = %d\n", x, y, result);
}
void mul(int x, int y) {
int result = x * y;
printf("%d * %d = %d\n", x, y, result);
}
void div(int x, int y) {
int result = x / y;
printf("%d / %d = %d\n", x, y, result);
}

 

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

 

#include <stdio.h>           //표준 입출력
#include <stdarg.h>         // 함수 선언 시 가변인자를 받을 수 있다
#include <math.h>          // 수학공식 관련 라이브러리
#include <time.h>           // 시간 관련 라이브러리

 

int main() {
//로또값 (45까지 난수출력돼야 해서 %45 이용)
                                                                                                            
srand((unsigned)time(NULL));        //seed값 (타임함수 포함 난수 계속 바뀜)
for (int i = 0; i < 6; i++) {
printf("%d ", 1+rand()%45);          // 0이 출력되면 안 돼서 1+
}

 

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

// auto: 기본 변수

// static: 정적 변수(내 파일에서만 사용가능)

// register: 레지스터 변수(레지스터에 직접 접근)

// extern: 다른 파일에 있는 변수를 해당 파일에서 사용가능하게 함

 

int all_files;                   //전역변수이고 다른 파일에서 사용가능
static int those_files;       //전역변수이며 내 파일에서만 사용가능
extern void sub();          // 다른 파일에 있는 sub();함수를 가져옴

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

// 포인터 ( 배열의 경우 배열변수 자체가 배열이 시작하는 주소값을 나타냄 )

// &a: a 변수의 주소값

// int* p에서 '*': 주소값을 받을 수 있는 포인터 변수

// ex) int* p = &a: a변수의 주소값을 p포인터 변수에 집어넣음

// p는 a주소가 가리키는 곳의 값을 나타낼 수 있게 됨

 

void swap(int *x, int *y);    // 함수 선언부에서 포인터로 받겠다고 하지 않으면 오류남

int main() {
int a = 5, b = 10;

printf("a = %d, b = %d\n", a, b);

swap(&a, &b);

printf("a = %d, b = %d\n", a, b);

return 0;
}

void swap(int *x, int *y) {
int temp = 0;
temp = *x;
*x = *y;
*y = temp;
}