C언어 이론 #2 (2월 요약)
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;
}