카테고리 없음

c언어 정리4

dywm23 2025. 3. 13. 12:13
  • 반복문
#include <stdio.h>
// 반복문에서 while은 무한한 상황에서, for는 유한한 상황에서 많이 사용.

int main(){
    int age;
    // for(초기값;조건식;증감식){ } 초기값을 미리 int age = 0;으로 설정해주면 넣어줄 필요 없지만 ;은 계속 남아있는 상태여야한다. (넣어도 ok)
    // 초기값은 반복문이 실행될 떄 맨처음에만 실행이 되고, 조건식은 반복문을 계속 반복할지 그만둘지 검사하는것, 증감식은 한번의 반복 끝날때마다
    // 실행될 코드가 있다면 증감식에다 넣어주는것. 굳이 넣어줄 필요는 없음.
    for(age = 0; age <20; age++){
        //조건식 참일 때 실행
        printf("현재 나이는 >>> %d\n", age); //age :


    }

    printf("이제 성인입니다.\n");
    printf("%d",age);




    return 0;
}

현재 나이는 >>> 0
현재 나이는 >>> 1
현재 나이는 >>> 2
현재 나이는 >>> 3
현재 나이는 >>> 4
현재 나이는 >>> 5
현재 나이는 >>> 6
현재 나이는 >>> 7
현재 나이는 >>> 8
현재 나이는 >>> 9
현재 나이는 >>> 10
현재 나이는 >>> 11
현재 나이는 >>> 12
현재 나이는 >>> 13
현재 나이는 >>> 14
현재 나이는 >>> 15
현재 나이는 >>> 16
현재 나이는 >>> 17
현재 나이는 >>> 18
현재 나이는 >>> 19 
이제 성인입니다.
20             #age가 19까지 나온 후 다시 반복될때 age++ 로 20이 되고 반복문은 종료된다. (조건문이 참이 아니므로 20은                     표시되지 않는다.)

                 #따라서 반복문이 끝나고 age를 printf를 하면 20이 나옴.

 

초기값에서 int age를 선언해도 똑같이 작동한다.

#include <stdio.h>


int main(){
   

    for(int age=0; age <20; age++){
        //조건식 참일 때 실행
        printf("현재 나이는 >>> %d\n", age); //age :


    }

    printf("이제 성인입니다.\n");
    //printf("%d",age);  age가 선언이 안에서만 되있기 때문에 오류가 뜸 for문에서 임시적으로 int age를 선언한 것이기에 for문 끝나면 age는 사라짐.
    //age가 for문 바깥에서 선언되면 main 함수 안에 계속 저장돼있기에 오류 발생하지 않음.



    return 0;
}

 

 

#include <stdio.h>


int main(){
    int total =1;
    int goal =10000;
    int count =0;

    for(;total < goal; count++){ //증감식을 굳이 여기에 안 넣어도 된다. total이후에 넣는것이 더 바람직함.
        total *=2;
        printf("total >>> %d\n", total);

    }
    printf("총 몇번 곱해졌나요? : %d",count);




    return 0;
}

total >>> 2
total >>> 4
total >>> 8
total >>> 16
total >>> 32
total >>> 64
total >>> 128
total >>> 256
total >>> 512
total >>> 1024
total >>> 2048
total >>> 4096
total >>> 8192
total >>> 16384
총 몇번 곱해졌나요? : 14

 

  • for문으로 업 다운 게임 만들기
#include <stdio.h>

// 업다운게임
int main(){
    int goal = 75;         #정답이 되는 숫자
    int input = 0;
    int count = 0;

    for(count =1; count < 21; count++){  //조건문 부분에 break 대신에 && input!=goal 적어도 되긴 하지만, 세련된 방법은 아니다.
        printf("enter number:");
        scanf("%d", &input);

        if (input > goal){

            printf("down\n");
        }
        else if (input < goal){
            printf("up\n");
           
        }
        else{
            printf("correct\n");
            break; // 반복문종료
        }
    }
    printf("try count : %d\n",count); //for문이 종료될 때 몇번만에 맞췄는지 알려주는 코드.
    // for문 바깥에 있기에 for문이 끝나면 실행 된다.
    // break 대신에 조건문 부분에 && input!=goal을 적을 때에는 for문에서 count를 1부터 센 다음에 한 반복이 끝나면 숫자가 더해지고 이 코드가 실행되기에
    // count-1로 작성해준다.
    // 하지만 for문에 break를 작성하면 다음 코드로 실행되지 않고 즉각 종료되기 때문에 다시 for문으로 넘어가지 않으니 count로 작성해준다.





    return 0;
}

enter number:10
up
enter number:50
up
enter number:90
down
enter number:75
correct
try count : 4

 

 

 

  • continue
#include <stdio.h>


int main(){
    int total=0;
    int count=0;
    printf("%d\n", total);

    for(count=1; count <21; count++){
        if(count %2==0){
            //짝수일 때
            continue; // continue를 통해 바로 아래줄이 아닌 17번째 줄로 내려감. 그리고 다시 for문이 실행된다.
        }             // 즉 continue는 지금 하는 반복을 끝내고 다음 반복으로 넘어가고 break는 아얘 반복문 자체를 종료시킨다.
        total += count; //total=total+count
        printf("+%d = %d\n", count, total);

    }              #여기가 17번째 줄





    return 0;
}

0
+1 = 1
+3 = 4
+5 = 9
+7 = 16
+9 = 25
+11 = 36
+13 = 49
+15 = 64
+17 = 81
+19 = 100

 

 

  • while 

for문을 배울 때 while은 무한하게 반복하는 경우에 많이 쓰인다고 하였다. 

정확히 말하자면 while은 무한하게 또는 유한하게 반복하는 두가지 경우를 둘 다 표현할 수 있지만

어떠한 상태에 따라서 반복을 실행할 것인지 멈출 것인지 결정하는 반복문일 때 가장 적합하다고 할 수 있다.

 

#include <stdio.h>


int main(){
int age;
age=0;
while(age<20){
    printf("현재 나이는 >>> %d\n", age);
    age++;  //이걸 주석처리하면 age는 0으로 무한반복된다. ctrl c로 종료가능하다. 이걸 살리고 age<20을 1(true의 숫자)로 하면 숫자가 무한으로 늘어남.
}
printf("이제 성인입니다.\n");
printf("%d",age);




    return 0;
}

현재 나이는 >>> 0
현재 나이는 >>> 1
현재 나이는 >>> 2
현재 나이는 >>> 3
현재 나이는 >>> 4
현재 나이는 >>> 5
현재 나이는 >>> 6
현재 나이는 >>> 7
현재 나이는 >>> 8
현재 나이는 >>> 9
현재 나이는 >>> 10
현재 나이는 >>> 11
현재 나이는 >>> 12
현재 나이는 >>> 13
현재 나이는 >>> 14
현재 나이는 >>> 15
현재 나이는 >>> 16
현재 나이는 >>> 17
현재 나이는 >>> 18
현재 나이는 >>> 19
이제 성인입니다.
20

 

#include <stdio.h>


int main(){
    int total=1;
    int goal = 10000;
    int count = 0;

    while(total < goal){

        total*=2;
        count++;
        printf("total >>> %d\n", total);
    }
    printf("총 몇번 곱해졌나요? : %d",count);


    return 0;
}

total >>> 2
total >>> 4
total >>> 8
total >>> 16
total >>> 32
total >>> 64
total >>> 128
total >>> 256
total >>> 512
total >>> 1024
total >>> 2048
total >>> 4096
total >>> 8192
total >>> 16384
총 몇번 곱해졌나요? : 14

 

  • while을 사용한 무한 반복 업다운 게임
#include <stdio.h>

//무한반복 업다운게임
int main(){
    int goal = 75;
    int input = 0;
    int count = 0;

   while(1){
    count++;
    //if(count == 21){       //while문을 작성할 때는 언제 끝나는지 구현을 한 후에 메인 로직을 구현하는 것이 바람직함.
    //   break;              주석시 무한반복
    //}
    printf("enter number:");
    scanf("%d", &input);

    if (input > goal){

        printf("down\n");
    }
    else if (input < goal){
        printf("up\n");
       
    }
    else{
        printf("correct\n");
        break; // 반복문종료
   }
}

    printf("try count : %d\n",count); //for문이 종료될 때 몇번만에 맞췄는지 알려주는 코드.
   




    return 0;
}

enter number:1
up
enter number:1
up

.

.

.enter number:75
correct
try count : 40   # 무한 반복이므로 count는 무한히 늘어나고 정답을 맞출때까지 scanf구문이 실행된다.

 

 

  • while을 사용한 비밀번호 만들기

먼저 입력한 문자열의 길이를 구해보는 식을 만들어보자.

#include <stdio.h>
#include <string.h> //strlen("abc") -> 이 함수 쓸 수 있는 패키지 장착한것임.
//비밀번호 입력 -> 8자 이상! >미만 다시 입력 > 8자 이상 입력 통과

int main(){
    char password[20] ="";
    printf("enter password : ");
    scanf("%s", password); // scanf에서 배열을 사용할 때에는 &주소값을 안붙힌다. string 입력할때에는 포맷코드 %s



    int result =strlen(password);
    printf("strlen(password) = %d",result);
    return 0;
}

enter password : oasis
strlen(password) = 5

 

 

그 후 조건문을 통해 길이가 맞지 않으면 반복문을 통해 다시 비밀번호를 만들게 해보자.

 

#include <stdio.h>
#include <string.h> //strlen("abc") -> 이 함수 쓸 수 있는 패키지 장착한것임.
//비밀번호 입력 -> 8자 이상! >미만 다시 입력 > 8자 이상 입력 통과

int main(){
    char password[20] ="";

    //최소 글자 제한 8자 이상
    while(1){
        printf("enter password : ");
        scanf("%s", password);
       
        if(strlen(password)>=8){
            break;
        }
        printf("8글자 이상으로 입력하세요.\n");          #여기서 else printf를 넣어도 된다. 어차피 if문 조건이 거짓이면 다음 코드                                                                              로 내려가기에 굳이 적어주지 않은 것.
    }

    printf("비밀번호 입력이 제대로 되었습니다.");




 
    return 0;
}

enter password : a
8글자 이상으로 입력하세요.
enter password : oasisssss
비밀번호 입력이 제대로 되었습니다.

 

 

  • 무한반복 업다운게임(정답숫자를 랜덤하게 부여해보자.)
#include <stdio.h>
#include <stdlib.h> //많은 라이브러리 파일 사용가능
#include <time.h> // 랜덤값을 만드려면 필요함.

//무한반복 업다운게임
int main(){
    srand(time(NULL)); //랜덤 시드값을 초기화 해주는 코드. 괄호안에 cd값을 넣어줘야됨. 0(정수)을 넣으면 실행할때마다 랜덤은 랜덤이지만 동일한 랜덤값이 나옴.
    //즉 게임을 실행했을때 정답이 다음 게임을 실행했을때랑 같음. 따라서 현재시간을 이용한 랜덤값을 사용한다. 매번 다를 테니까.
   
    int goal = rand() %100 +1; //1부터 100까지 랜덤한 정수생성 rand는 랜덤한 정수값이 나오고 100으로 나누면 나머지가 0부터 99가 나오고 +1을 해주면
    // 비로소 1부터 100까지 랜덤값을 생성할 수 있게 되는 것이다.
    int input = 0, count = 0;

    //오프닝
    printf("1부터100까지 랜덤한 숫자를 맞춰보세요.\n");
   while(1){
    count++;
    //if(count == 21){       //while문을 작성할 때는 언제 끝나는지 구현을 한 후에 메인 로직을 구현하는 것이 바람직함.
    //   break;              주석시 무한반복
    //}
    printf("enter number:");
    scanf("%d", &input);

    if (input > goal){

        printf("down\n");
    }
    else if (input < goal){
        printf("up\n");
       
    }
    else{
        printf("correct\n");
        break; // 반복문종료
   }
}

    printf("try count : %d\n",count); //for문이 종료될 때 몇번만에 맞췄는지 알려주는 코드.
   




    return 0;
}

1부터100까지 랜덤한 숫자를 맞춰보세요.
enter number:59
down
enter number:49
down
enter number:30
down
enter number:20
up
enter number:24
up
enter number:28
down
enter number:26
down
enter number:25
correct
try count : 8

 

 

  • 랜덤값이 어떻게 나오는지 출력을 통해 확인해보자.

 

 

time(null)을 하면 초단위로 숫자가 바뀌고 있는 모습을 확인할 수있다.
r1은 0~99의 랜덤값, r2는 2~101의 랜덤값, r3는 200~300의 랜덤값을 출력한다.
srand(time(NULL));은 이러한 랜덤값이 고정되지 않고 매번 다르게 나오도록 해주는 코드이다.