[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;
}
완성
오랜시간 고민해서 만든 코드가 제대로 작동할 때만큼 기분이 좋은적은 없다.
오늘은 여기까지