[C언어] 코딩도장 공부 (Unit 21~40)
Unit 21. 논리 연산자
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1, num2;
scanf("%d %d", &num1, &num2);
printf("%s\n", num1 && num2 ? "참" : "거짓");
printf("%s\n", num1 || num2 ? "참" : "거짓");
printf("%s\n", !num1 ? "참" : "거짓");
return 0;
}
&&는 and를 ||는 or을 !은 반대를 의미한다.
Unit 22. 불 자료형
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool b1 = false;
bool b2 = true;
if (b1 != true)
printf("참\n");
else
printf("거짓\n");
printf("%s\n", b2 == false ? "참" : "거짓");
return 0;
}
bool 자료형은 true와 false로 구분된다.
Unit 23. 비트 연산자
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
unsigned int num1, num2;
scanf("%d %d", &num1, &num2);
printf("%u\n", num1 ^ num2);
printf("%u\n", num1 | num2);
printf("%u\n", num1 & num2);
printf("%u\n", ~num1);
return 0;
}
XOR, OR, AND, NOT
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
unsigned long long num1;
scanf("%llu", &num1);
printf("%llu\n", num1 << 20 >> 4);
return 0;
}
왼쪽으로 20 시프트, 오른쪽으로 4 시프트
Unit 24. 비트 연산자 응용
#define __USE_MINGW_ANSI_STDIO 1 // Dev-C++(MinGW)에서 %hhu를 사용하기 위한 설정
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
unsigned char flag = 16;
unsigned char num1, num2;
scanf("%hhu %hhu", &num1, &num2);
flag |= num1 << 3;
flag &= ~(num2 >> 2);
flag ^= 1 << 7;
printf("%u\n", flag);
return 0;
}
왼쪽으로 3시프트 키고, 오른쪽으로 2시프트 끄고,
1자리를 8비트에 맞춰서 한다.
Unit 25. 연산자 우선순위
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
int num2;
int num3;
scanf("%d %d %d", &num1, &num2, &num3);
printf("%d\n", (num1 + num2)*10 - num3);
return 0;
}
Unit 26. switch
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char memu;
scanf("%c", &memu);
switch (memu)
{
case 'f':
printf("환타");
break;
case 'c':
printf("콜라");
break;
case 'p':
printf("포카리스웨트");
break;
default:
printf("판매하지 않는 메뉴");
break;
}
return 0;
}
Unit 27. for
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char text1;
scanf("%c", &text1);
for (int i=0; text1+i<= 'z'; i++)
printf("%c", text1+i);
return 0;
}
a부터 z까지이기 때문에 부등호 있는 <= 연산자를 사용한다.
Unit 28. while
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int balance;
scanf("%d", &balance);
while (balance >= 1200)
{
balance -= 1200;
printf("%d\n", balance);
}
return 0;
}
while 함수 내에 변화식을 작성해준다.
Unit 29. do while
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
unsigned int num1;
unsigned int sum = 0;
scanf("%d", &num1);
unsigned int i = 0;
do
{
sum += i;
i++;
} while (i <= num1);
printf("%d\n", sum);
return 0;
}
Unit 30. break, continue
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
int num2;
int i;
scanf("%d %d", &num1, &num2);
i = num1;
while (1)
{
if (i > num2)
break;
if (i % 10 == 7)
{
i++;
continue;
}
printf("%d ", i);
i++;
}
return 0;
}
10으로 나눈 나머지가 7이면 그냥 ++해주고 continue!
Unit 31. 계단식
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
scanf("%d", &num1);
for (int i = 1; i <= num1; i++)
{
for (int j = i; j < num1; j++)
{
printf(" ");
}
for (int j = 0; j < (i * 2) - 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
j가 입력받은 값보다 작을때 공백으로,
j가 i값 (i*2)-1보다 작을때 *로
이렇게하면 1,3,5보다 작은만큼 별이 출력되어
산 모양의 형태가 된다.
Unit 32. goto
#include <stdio.h>
int main()
{
int num1 = 0;
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
if (num1 == 10)
goto EXIT2;
num1++;
}
}
EXIT1:
printf("100\n");
EXIT2:
printf("200\n");
EXIT3:
printf("300\n");
return 0;
}
Unit 33. FizzBuzz
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1, num2;
scanf("%d %d", &num1, &num2);
for (int i=num1; i<=num2; i++)
{
if ((i % 5 == 0) && (i % 11 == 0))
printf("FizzBuzz\n");
else if (i % 5 == 0)
printf("Fizz\n");
else if (i % 11 == 0)
printf("Buzz\n");
else
printf("%d\n", i);
}
return 0;
}
Unit 34. 포인터
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int *numPtr1;
int **numPtr2;
int num1;
scanf("%d", &num1);
numPtr1 = &num1;
numPtr2 = &numPtr1;
printf("%d\n", **numPtr2);
return 0;
}
중첩 포인터를 사용한건데,
num1에 10이 입력되면 &num1을 가리키게 되고,
numPtr1을 접근시킨다음에 10을 저장한다.
그다음 numPtr2를 접근시키고 값이 저장된 &연산자를 불러온다.
마지막에 **numPtr2로 역참조를 해서 값을 불러온다.
Unit 35. 메모리 사용
변수는 스택에, malloc 함수는 힙에 저장된다.
이때, 스택과 힙의 가장 큰 차이점은 메모리 해제다.
malloc 함수에 선언된 메모리는 해제해주어야 한다.
free(포인터); 와 같은 방법으로 해제한다.
이러한 해제를 해주지 않으면 메모리 누수(memory leak)가
발생하게 된다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num1;
int num2;
int *numPtr1 = malloc(sizeof(int));
int *numPtr2 = malloc(sizeof(int));
scanf("%d %d", &num1, &num2);
*numPtr1 = num1;
*numPtr2 = num2;
printf("%d\n", *numPtr1 + *numPtr2);
free(numPtr1);
free(numPtr2);
return 0;
}
Unit 36. 배열 사용
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int numArr[5];
int smallestNumber;
scanf("%d %d %d %d %d", &numArr[0], &numArr[1], &numArr[2], &numArr[3], &numArr[4]);
smallestNumber = numArr[0];
for (int i = 1; i < sizeof(numArr) / sizeof(int); i++)
{
if (smallestNumber > numArr[i])
smallestNumber = numArr[i];
else
smallestNumber = smallestNumber;
}
printf("%d\n", smallestNumber);
return 0;
}
Unit 37. 2차원 배열
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int matrix[5][5];
scanf("%d %d %d %d %d",
&matrix[0][0], &matrix[0][1], &matrix[0][2], &matrix[0][3], &matrix[0][4]);
scanf("%d %d %d %d %d",
&matrix[1][0], &matrix[1][1], &matrix[1][2], &matrix[1][3], &matrix[1][4]);
scanf("%d %d %d %d %d",
&matrix[2][0], &matrix[2][1], &matrix[2][2], &matrix[2][3], &matrix[2][4]);
scanf("%d %d %d %d %d",
&matrix[3][0], &matrix[3][1], &matrix[3][2], &matrix[3][3], &matrix[3][4]);
scanf("%d %d %d %d %d",
&matrix[4][0], &matrix[4][1], &matrix[4][2], &matrix[4][3], &matrix[4][4]);
for (int i = 0; i < sizeof(matrix[0]) / sizeof(int); i++)
{
for (int k = 0; k < sizeof(matrix) / sizeof(matrix[0]); k++)
{
printf("%d ", matrix[k][i]);
}
printf("\n");
}
return 0;
}
Unit 38. 포인터와 배열 응용
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
int num1;
scanf("%d", &num1);
int **matrix = malloc(sizeof(int*) * num1);
for (int i = 0; i < num1; i++)
{
matrix[i] = malloc(sizeof(int) * num1);
for (int j = 0; j < num1; j++)
{
matrix[i][j] = 0;
}
}
for (int i = 0; i < num1; i++)
{
matrix[i][i] = 1;
}
for (int i = 0; i < num1; i++)
{
for (int j = 0; j < num1; j++)
{
printf("%d ", matrix[i][j]);
}
printf("\n");
}
for (int i = 0; i < num1; i++) {
free(matrix[i]);
}
free(matrix);
return 0;
}
모든 배열의 값이 0으로 초기화 된 다음,
[0][0], [1][1] ... 대각선으로 행렬을 만들어준다.
Unit 39. 문자열
#include <stdio.h>
int main()
{
char s1[] = "Beethoven\n9th\nSymphony";
printf("%s\n", s1);
return 0;
}
Unit 40. 입력 값 저장
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *s1 = malloc(sizeof(char) * 30);
char *s2 = malloc(sizeof(char) * 30);
char *s3 = malloc(sizeof(char) * 30);
char *s4 = malloc(sizeof(char) * 30);
scanf("%s %s %s %s", s1, s2, s3, s4);
printf("%s\n%s\n%s\n%s\n", s1, s2, s3, s4);
free(s1);
free(s2);
free(s3);
free(s4);
return 0;
}
화이팅..!