07-01. if
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int number;
printf("input a positive integer : ");
scanf("%d", &number);
// Todo: print even or odd
if (number % 2 ==0)
printf("Even");
else if (number % 2 != 0)
printf("ODD");
return 0;
}
07-02. getchar(), putchar() example
char을 입력받아서 출력하기
int main()
{
/*
1. Introduc getchar(), putchar()
2. Use while loop to process char sequences
3. Filter a specific character
4. Convert number to asterisks
5. Lower characters to Upper Char
*/
char ch;
while ((ch = getchar()) != '\n') // use '\n' to find the end of a sentence
{
putchar(ch);
}
putchar(ch);
return 0;
}
특정 문자열을 출력하지 못하게 하기
int main()
{
char ch;
while ((ch = getchar()) != '\n') // use '\n' to find the end of a sentence
{
if (ch == 'f')
ch = 'X';
else if (ch == 'F')
ch = 'X';
putchar(ch);
}
putchar(ch);
return 0;
}
입력이 숫자라면 -> *로 바꿔주기
int main()
{
char ch;
while ((ch = getchar()) != '\n') // use '\n' to find the end of a sentence
{
if (ch >= '0' && ch <= '9')
ch = '*';
putchar(ch);
}
putchar(ch);
return 0;
}
for문은 계속 돌아가는 것이기 때문에, 논리구조를 파악한 후 while문을 돌리는 게 선호된다.
영문자가 들어왔을 때 이를 대문자로 출력하기
int main()
{
char ch;
while ((ch = getchar()) != '\n') // use '\n' to find the end of a sentence
{
if (ch >= 'a' && ch <= 'z') //'A' = 65 'a' = 97
ch -= 'a' - 'A';
else if(ch >= 'A' && ch <= 'Z')
ch += 'a' - 'A';
putchar(ch);
}
putchar(ch);
return 0;
}
07-03. ctype.h 문자 함수들
입력받은 문자들을 체크하는 함수들이 있다.(islower, isupper, tolower, toupper, iscntrl, isprint, ...)
#include <ctype.h>
int main()
{
char ch;
while ((ch = getchar()) != '\n') // use '\n' to find the end of a sentence
{
if (islower(ch)) //'A' = 65 'a' = 97
ch = toupper(ch);
else if (isupper(ch))
ch = tolower(ch);
putchar(ch);
}
putchar(ch);
return 0;
}
07-04. 다중 선택 else if
종합소득세를 계산하는 문제를 풀어보자.
07-05. else와 if 짝짓기
VSCode는 Indenting을 지원한다. 하지만, 짝을 제대로 지어주지 않게 되면 컴파일 에러가 나며 잘못 인식한다.
정수 하나를 입력 받으면 크기 비교에 맞게 출력하는 숫자가 있다고 치자.
int main()
{
int number;
scanf("%d", &number);
if (number > 5)
if (number < 10)
printf("Larger than 5 smaller than 10\n");
else
printf("Less than or equal to 5"); //에러가 날 것이다.
// compilers ignore indenting
return 0;
}
이렇게 코드를 짜면, else문에서 error가 날 것이다.
warning: add explicit braces to avoid dangling else [-Wdangling-else]
else
^
1 warning generated.
그래서 이를 해결하기 위해서는 중괄호를 선언하여 else가 어떤 if문의 else인지를 명확하게 지정해주어야 한다.
헷갈릴 여지가 있다면 괄호를 치자!
int main()
{
int number;
scanf("%d", &number);
if (number > 5)
{
if (number < 10)
printf("Larger than 5 smaller than 10\n");
}
else
printf("Less than or equal to 5");
// compilers ignore indenting
return 0;
}
07-06. 소수 판단 예제
논리연산자 익히기
마침표를 찍으면, 이전까지의 공백과 띄어쓰기를 제외한 글자수를 세주는 프로그램 짜기
#include <stdbool.h>
int main()
{
unsigned num;
bool isPrime; //flag, try bool type
scanf("%u", &num);
/*
TODO: Check if num is a prime number
ex) num is 4, try num % 2, num % 3
*/
isPrime = true;
for (unsigned i =2; (i*i) <= num; i++)
{
if (num % i == 0)
{
isPrime = false;
printf("%u is divisible by %u and %u. \n", num, i, num/i);
}
}
if (isPrime)
printf("%u is a prime number. \n", num);
else
printf("%u is not a prime number\n", num);
}
소수인지를 판단하는 문제는 이렇게 해결할 수 있다.
point:
- isPrime = True로 할당하고 시작하기
- for문 내에 (i*i)와 같이 제곱식을 넣어서, 똑같은 게 나오지 않도록 설정하기
07-07. 논리 연산자 Logical operators
#include <ctype.h> //islower()
#include <stdbool.h>
#include <iso646.h> //and, or, not
#define PERIOD '.'
int main()
{
/*
Logical operators
&& : and
|| : or
! : not
*/
bool test1 = 3>2 || 5>6; //true
bool test2 = 3>2 && 5>6; //false
bool test3 = !(5>6); //true, equivalent to 5 <= 6
printf("%d %d %d \n", test1, test2, test3);
/* Character Counting example */
char ch;
int count = 0;
while ((ch = getchar()) != PERIOD)
{
//TODO: make exceptions
if (ch != '\n' && ch != ' ')
count ++;
}
printf("%d", count);
}
/* short circuit evaluation
- Logical expressions are evaluated from left to right
- && and || are sequence points
*/
int temp = (1+2) * (3+4);
printf("before: %d \n", temp);
if (temp == 0 && (++temp == 1024)) //중요한 것은 (++temp) 부분이 실행이 되는지, 되지 않는지이다!!
{
};
++temp가 실행되는지 보자!!
결과를 보면, before, after 모두 21이라는 결과가 나온다. 즉, ++temp 연산이 진행되지 않았다는 것이다!
07-08. 단어 세기 예제
단어를 세는 예제를 만들어보자.
#include <stdbool.h>
#define STOP '.'
int main()
{
char c;
int n_chars = 0;
int n_lines = 0;
int n_words = 0;
bool word_flag = false;
bool line_flag = false;
printf("Enter Text: \n");
while( (c=getchar()) != STOP)
{
if (!isspace(c))
n_chars++;
if (!isspace(c) && !line_flag)
{
n_lines++;
line_flag = true;
}
if (c == '\n')
line_flag = false;
if (!isspace(c) && !word_flag)
{
n_words++;
word_flag = true;
}
if (isspace(c))
word_flag = false;
}
printf("Characters = %d , Words = %d, Lines = %d ", n_chars, n_words, n_lines);
}
07-09. 조건 연산자
temp 변수를 보면, true 뒤에 물음표가 있는 것이 보일 것이다. 이는, true라면 왼쪽 연산을 수행하고, false라면 오른쪽 연산을 수행한다.
이는 ternary라고 불리며, 세 개를 의미한다.
int temp;
temp = true ? 1024 : 7 ; //ternary oprator: 삼항연산자
printf("%d \n", temp);
temp = false ? 1024 : 7 ; //ternary oprator: 삼항연산자
printf("%d \n", temp);
07-10. continue, break
a가 들어가면, 이를 제외한 문자만 출력되도록 할 수 있다.
int main()
{
/* continue */
int count = 0;
while (count < 5)
{
int c= getchar();
if (c == 'a')
continue;
putchar(c);
count++;
}
}
placeholder라는 것은, 하는 것 없지만 자리를 차지하는 것을 의미하며, 해당 자리에 무언가가 들어올 수 있음을 보여주는 용도로 사용한다.(null statement)
07-11. 최대, 최소, 평균 구하기 예제
ternary operator를 통해서 max, min을 정의할 수 있다.
#include <float.h>
#include <stdio.h>
int main()
{
float max = -FLT_MAX;
float min = FLT_MAX;
float sum = 0.0f;
float input;
int n=0;
while (scanf("%f", &input) == 1)
{
max= (input > max) ? input: max;
min = (input < min) ? input: min;
sum += input;
n++;
}
if (n>0)
printf("min = %f, max = %f, ave = %f\n", min, max, sum/n );
else
printf("no input\n");
return 0;
}
07-12. 다중 선택 switch와 case
switch case문을 이용하여 몇 가지 경우의 수에 대해서 프로그래밍이 가능하다. If else문을 나열하는 것에 비해 간단하며, 가독성이 좋다.
int main()
{
char c;
while( (c = getchar()) != '.')
{
printf("You love ");
switch (c)
{
case 'a':
printf("apple");
break;
case 'b':
printf("baseball");
break;
default:
printf("nothing");
}
printf(". \n");
while (getchar() != '\n')
continue;
}
}
'Computer Science > 따라하며 배우는 C' 카테고리의 다른 글
09 function, pointer (0) | 2022.03.31 |
---|---|
08 Input Output (0) | 2022.03.31 |
06 For (0) | 2022.03.31 |
04 연산자 (0) | 2022.03.11 |
03 문자열과 형식 맞춘 입출력 (0) | 2022.03.03 |