컴퓨터를 공부하고자 마음먹은지 N일차

[9일차](홍정모의따배c) 반복문-1 본문

🖥C

[9일차](홍정모의따배c) 반복문-1

졸린새 2020. 9. 17. 05:28
728x90

[9일차](홍정모의따배c)반복문

 

 

 

*본 강의수기는 교수님의 모든 ppt나 코드 화면을 붙인게 아닙니다. 따로 출처 표시나 과제표시

안한 모든 코드와 사진자료의 출처는 본 강의의 교수님 입니다.

정리는 다시한번 제가 보기위함과 어떤강의인지 알려드리는 것이고

제가 적은건 이해를 돕기 위한 부연설명과 제가 이해한 몇개의 중심적인 내용이 다소

생략이 되었습니다. 이 수기를 통해 공부하려 하지말고 흥미로운 내용이라면

'인프런- 홍정모의 따라하며 배우는c' 과정을 수강하시길 바랍니다.

 

 

while 반복 루프에서 scanf()의 반환값 사용하기

 

  • 강의전 문제

위 화면처럼가능하게

 

조건1. 자유로운 숫자입력이가능

조건2.q를 입력하면 프로그램이 종료되면서 입력한 숫자들의 합을 대입

 

while문을 사용해서 계속 입력하게 해야하고

입력받는 number가 q가 아닐동안 계속 입력 받아야 한다

 

근데 = 부등식은 아는디

아니다 할때 부등식은 도통 뭔지모른다

구글링 ㄲ

 

오호라

바로 코드 ㄲ

 

#include <stdio.h>

int main()
{
    int number;
    int sum = 0;
    char quit = 'q';
    
    
    printf("\nEnter an integer (q to quit) :");
    scanf("%i", &number);
    
    while(number != quit)
    {
        printf("\nEnter next integer (q to quit) :");
        scanf("%i", &number);
        sum = sum + number;
        
    }
    
    printf("Sum = %i", sum);
    
    
    
    
    return 0;
}

첫 시도 만에 됐으면 좋겠다

 

어림도 없지 ㅋㅋㅋ다시 점검해보자

증상은 이렇다

q를 입력하면 다음 정수를 입력하라는 말이 무한하게 나온다..ㅎ

 

일단 문제점 1 내가 구글링해서 찾은 저건 논리연산 분기문에서 사용되는거다 정보검색에 실패했다 옳바른 검색을 해보자

 

혹시나 싶어서 이렇게도 바꿔봤다

#include <stdio.h>

int main()
{
    int number;
    int sum = 0;
    char quit = 'q';
    
    
    printf("\nEnter an integer (q to quit) :");
    scanf("%i", &number);
    
    while(scanf("%c", &quit))//안에 집어넣었다.
    {
        sum = sum + number;
        printf("\nEnter next integer (q to quit) :");
        scanf("%i", &number);
        
    }
    
    printf("Sum = %i", sum);
    
    
    
    
    return 0;
}

어림도 없다..

 

sum은 계속 입력받은 숫자를 더해간다

그런데 q라는 문자를 입력받고 프로그램이 꺼지게 하려면...

while에 도대체 뭘넣어야 하나..

 

모르겠다 gg

 

#include <stdio.h>

int main()
{
    int number;
    int sum = 0;
    
    
    printf("\nEnter an integer (q to quit) :");
    
    while (scanf("%d", &number) == 1)
        //여기서 scanf의 반환값이 1이냐 아니냐를 묻는다
        //scanf가 제대로된 수를 받았을땐 1이고 아닐땐 0이다
    {
        sum = sum + number;
        
        printf("\nEnter next integer (q to quit) :");
        
    }
    
    printf("Sum = %d", sum);
    
    
    
    
    return 0;
}

scanf의 반환값을 사용해서 코딩하는게 정말 흥미로웠다.

다만 이해하는데 1시간걸린거같다 ㅎ..

 

 

관계연산자

 

 

파이를 맞추는 코딩을 보자

 

#include <stdio.h>
#include <math.h>

int main()
{
    const double PI = 3.14159265358979323846264338327950;
    
    double guess;
    
    printf("Input PI");
    scanf("%lf", &guess);
    
    while(PI != guess)//이렇게 하면 너무 가혹하게 
//소수점이 정확하게 맞아야 다음 단계로 통과한다
    {
        printf("Fool, try again!");
        scanf("%lf", &guess);
    }
    
		printf("Good boy");
    
    return 0;
}

초 하드코어 파이맞추기 되시겠따

보기만 해도 너무하니까

 

이걸사용해보자

  • fabs

얘는 실수 간의 차이데이터를 양수로 저장한다

 

#include <stdio.h>
#include <math.h>

int main()
{
    const double PI = 3.14159265358979323846264338327950;
    
    double guess;
    
    printf("Input PI");
    scanf("%lf", &guess);
    
    while(fabs(guess - PI) > 0.001)
    {
        printf("Fool, try again!");
        scanf("%lf", &guess);
    }
    
    printf("Good boy\n");
    
    return 0;
}

 

좀더 느슨하게 칭찬을 받을 수 있다.

 

 

for루프

 

 

#include <stdio.h>

int main()
{
		int i = 1;
		
		while(i >= 10)
    {
			printf("%i")
			i++;
		}

		return 0;
}

while 반복루프다

이걸 for 로 바꾸면

 

#include <stdio.h>

int main()
{
		for(int i = 1; i <= 10; i++)//가운데 쉼표안넣게 주의
//마지막 세미콜론 생략인거 주의
				{
					printf("%i", i);
				}

}

 

간편하다..! for문

문법하나하나 새로배울때마다 흥미롭고 재밌다.

 

 

for문의 유연성

 

  • for문의 규칙

for(initialize; test; update)

statement

  • initialize는 처음 한번만 실행된다.
  • 업데이트를 하고 그 다음에 테스트를 한다!

 

 

while문과 for문은 이식성이 높다.

 

 

제논의 역설 예제

 

  • 문제1

 

이 조건으로

위와같이 컴파일 ㄱ ㄱ

 

내코드

#include <stdio.h>

int main()
{
    for(double speed = 1, dt = 1, distance = 1, elapestime = 0;\
distance <= 10; distance += speed * dt)
//너무길어서 잘랐다
    {
        elapestime++;
//같이넣을 수 있는지 없는지 몰라서 따로 뺐다.
        printf("Elapesed time=%lfs/,Distance =%lfm\n", elapestime, distance);
    }
    
    
}

 

다행히

정상작동한다!

 

교수님코드

		const double speed = 1.0;
    const unsigned repeat_max = 10;
    
    double dt = 1.0;
    double time = 0.0;
    double dist = 0.0;
    
    for (unsigned i = 0; i < repeat_max; ++i){
        
        dist += speed * dt;
        time += dt;
        
        printf("Elapesed time = %.10fs, Distance = %.10fm\n", time, dist);

확실히 뭘의미하는지 알아보기 쉽다. 기호상수를 사용해 더 직관적으로

보기 편하다

 

나는 거리를 위주로 생각했고,

교수님은 반복수와 흐르는 시간위주로 생각하신거같다.

 

  • 문제 2

위 교수님 코드에서 한줄만 고쳐서

제논의 역설을 구현하라

 

 

내 풀이

 

#include <stdio.h>

int main()

    const double speed = 1.0;
    const unsigned repeat_max = 10;
    
    double dt = 1.0;
    double time = 0.0;
    double dist = 0.0;
    
    for (unsigned i = 0; i < repeat_max; ++i){
        
        dist = dist + speed * dt;
        time += dt;
        dt = dt / 2;//이라인 위치를 어디놓냐에따라 결과 달라진다.
        //실수니까 2보단 2.0이좋다 나누기보다 *0.5가 더좋다.
        printf("Elapesed time = %.10fs, Distance = %.10fm\n", time, dist);

    }
    
    
    
}

 

 

탈출조건 루프 do while

 

  • 문제1

 

 

 

중첩된 루프들

 

  • 문제1

조건1. A부터 입력한 원하는 문자까지 출력할수있게

조건2. 그걸 또 원하는 횟수만큼 반복가능

  • 내 코드

 

#include <stdio.h>

int main()
{
    char inputchar, outputchar;
    int repeatcount, inputnumber;
    
    printf("Input any character :");
    scanf("%c", &inputchar);
    printf("Input any number :");
    scanf("%i", &inputnumber);
    
    for(repeatcount = 0; repeatcount != inputnumber;++repeatcount)
    {//부호가 잘못됐었다 while문이 아니다이건 뒤에 반복횟수에붙은 연산자도 바꿈
        for(outputchar = 'A';inputchar != outputchar; outputchar++){
            printf("%c", outputchar);
        }
        
        printf("\n");
    }
    return 0;
}

뭐여 이게

+수정1

#include <stdio.h>

int main()
{
    char inputchar, outputchar;
    int repeatcount, inputnumber;
    
    printf("Input any character :");
    scanf("%c", &inputchar);
    printf("Input any number :");
    scanf("%i", &inputnumber);
    
    for(repeatcount = 0; inputnumber >= repeatcount; repeatcount++)
    {
        for(outputchar = 'A';inputchar >= outputchar; outputchar++){
            printf("%c", outputchar);
        }
        
        printf("\n");
    }
    return 0;
}

완전 재밌다!!!!!!!!!

느릿느릿한 영타로

힘겹게 쳐서 구현되는 코드는

그자체로 희열을 느끼게 해준다..!!

 

 

  • 교수님코드

 

와 교수님이 내준 문제는 이런게 아니었다

그냥 화면그대로 구현하라는 거였는데

문제를 잘못 이해 했지만,

내가생각한대로 구현이 되는 그 순간이 너무 행복하다..!

 

 

화면그대로 5줄에 A부터 K까지 출력하는건데

잘못 이해하고 원하는 줄에 원하는 문자까지 출력하는 코드를 짰다.

 

 

  • 문제2

 

위 화면을 구현하라

 

  • 내코드

 

아까 원하는대로 구현하니 재밌어서

이번에도 원하는 알파벳을 넣고 그 알파벳까지 삼각형을 만드는 형식으로 구현하고 싶다..!

 

 

#include <stdio.h>

int main()
{
		char inputchar, outputchar;
    int repeatcount;
    
    printf("Input any Character :");
    scanf("%c", &inputchar);
    
    for(repeatcount = 'A'; repeatcount <= inputchar ;++repeatcount){
        for(outputchar = 'A'; repeatcount >= outputchar; outputchar++){
        printf("%c", outputchar);
        }
        printf("\n");
    }
    
    
    
    return 0;
}

완성

 

 

오랜시간 고민해서 만든 코드가 제대로 작동할 때만큼 기분이 좋은적은 없다.

 

오늘은 여기까지

Comments