제어문
~-> 선택문(if,switch), 반복문(while), 분기문(break,continue,goto,return)
조건에 따라 명령을 제어한다.
단독
return ;
if-else
if(a==b) return a;
else return b;
이때 else에는 조건을 쓰지 않는다.
if(a==b) return a;
else if(a!=b) return b;
else return c;
switch(a){
case 1:
a=1; break;
case 2:
a=2; break;
default :
a=1024;
}
#include <stdio.h>
int main(){
int a,b,answer;
char op;
printf("사칙연산 입력(정수) : ");
scanf("%d%c%d",&a,&op,&b); //입력
switch(op){
case '+': answer=a+b; break;
case '-': answer=a-b; break;
case '*': answer=a*b; break;
case '/': answer=a/b; break; //피연산자가 전부 정수라서 정수값 반환
}
printf("%d%c%d=%d",a,op,b,answer); //출력
return 0;
}
//또다른 풀이
#include <stdio.h>
int main(){
int a,b,answer;
char op;
printf("사칙연산 입력(정수) : ");
scanf("%d%c%d",&a,&op,&b); //입력, 같다.
answer = (op=='+')?a+b:(op=='-')?a-b:(op=='*')?a*b:(op=='/')?a/b: -4444; //-4444는 예외처리
printf("%d%c%d=%d",a,op,b,answer); //출력
}
종류 : while, for, do-while
while - 조건 강조
for - 실행 횟수 강조
- 분기문(break(주변에 블록하나를 깨트림)
continue(블록끝에서 실행)
do~while - 한 번 무조건 실행을 강조
1.첫번째 풀이
int main(){
printf("* *");
printf(" * * ");
printf(" * ");
printf(" * * ");
printf("* *");
return 0;
}
이렇게 쓸 수 있지만 문제의 목적에 맞지 않으므로 풀이가 틀린답이겟져.?😢
2. 두번째 풀이
#include <stdio.h>
int main(){
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
if((i+j)==4 || i==j)
printf("*");
else
printf(" ");
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main(){
int number;
printf("2 이상의 정수를 입력하세요 : ");
scanf("%d",&number);
int br=0;
for(int i=2; i<number; i++){
if(number%i){
int cnt = 0;
for(int D=2; D<i; D++){
if(D%i)
cnt ++;
}
if(!cnt==0)
printf("%2d ",i);
}
}
return 0;
}
이유
문제 재정의
예제의 목표 : 입력한 수까지의 소수를 전부 출력한다. (2이상)
소수란 : 1과 자신만을 약수로 가지는 수
HOW : for문으로 입력한 수까지 증가하면서 해당 숫자가 1과 자기 자신을
약수로 가지고 있는지 확인해야한다.
HOW2 : 어떻게 1과 자기 자신을 약수로 가졌는지 확인할 것인가?
1. 해당 수를 범위로 for문을 돌리며 나누었을때(해당 수와 증가값) 0으로 나눠지면 안된다.
-> 중첩문 사용!
#include <stdio.h>
#include <stdbool.h>
int main(){
int n;
printf("숫자 입력 : ");
scanf("%d",&n);
//*n과 i의 인과관계는 없다.
int br = 0; //줄바꿈
for(int i=2; i<n; i++){
bool flag = true; //나눠지는 지 여부를 조사하는 flag // 소수라는 가정으로 true
for(int j=2; j<i; j++){
if(i%j==0)
flag = false;
}
if(flag){
printf("%2d ",i);
br++;
if(br%5==0)
printf("\n");
}
}
return 0;
}
주목점 : for문에 증가하는 i는 n과 인과관계가 없다. -> n은 for문의 범위이다.
flow :
1. 전체 for문은 입력된 숫자 n
만큼 2부터 증가한다.
2. 전체 for문 안에서 flag
를 사용하여 판별 여부를 알 수 있다.
3. i를 입력 받았다면 i
가 소수인지 판별한다. (약수가 1과 자신외에 없는가?)
4. 있다면 flag를 false로 바꾼다. 있다면 조건문에 의해 출력된다.