c언어 ch07 반복문

암영·2022년 4월 23일
0

c언어

목록 보기
4/21

07-1 while 반복

while문 이란

while문은 특정조건을 주고 그 조건을 만족하는 동안, 특정영역을 계속해서 반복하는 구조이다.

ex

#include <stdio.h>
int main()
{
	int num = 0;
	while (num<5)
	{
		printf("hello world! %d \n", num);
		num++;

	}
	return 0;

}

실행결과
hello world! 0
hello world! 1
hello world! 2
hello world! 3
hello world! 4

반복문의 구성에 있어 중요한 조건!: 반복의 조건을 무너뜨리기위한 최소한의 연산

while 반복문의 흐름구조

#include <stdio.h>
int main()
{
	int num = 0; //1.0으로 초기화
    //2. 비교연산, 실행여부 결정
    //4.비교연산, 실행여부 결정
    //6. 비교연산, 실행여부 결정
    //8. 비교연산, 실행여부 결정
	while (num<3)
	{
		printf("hello world! %d \n", num);
		num++;

	}
    //3.while문 문장 실행후 반복여부 재확인
    을 위해 이동 이때 num=1
    //5. while문 내 문장 실행후, 반복여부 재확인 위해 이동 이때, num=2
    //7. while문 내 문장 실행후, 반복여부 재확인을 위해 이동 이때, num=3
    //9.조건이 성립하지 않으므로, 반복영역 실행하지 않고 탈주(??)
	return 0;

문제 07-1

  1. 프로그램 사용자로부터 양의 정수 하나를 입력받아서, 그 수 만큼 "hello world!"를 풀력하는 프로그램을 작성해보자.
  2. 프로그램 사용자로부터 양의 정수를 하나 입력받은 다음, 그수 만큼 3의 배수를 출력하는 프로그램은 작성해보자. 예를 들어서 5를 입력받았다면 3 6 9 12 15 출력해야 한다.

3.프로그램 사용자로부터 계속해서 정수를 입력받는다. 그리고 그 값을 계속해서 더해나간다. 이러한 작업은 사용자가 0을 입력할때 까지 계속 되어야하며, 0이 입력되면 입력된 모든 정수의합을 출력하고 프로그램을 종료시킨다.
4.프로그램 사용자로부터 입력 받은 숫자는 구구단을 출력하되, 역순으로 출력하는 프로그램을 작성해보자.
5.프로그램 사용자로부터 입력받은 정수의 평균을 출력하는 프로그램은 작성하되 다음 두가지 조건을 만족시켜야 한다.
"몇개의 정수를 입력할것인지 프로그램 사용자에게 묻는다. 그리고 그 수만큼 정수를 입력받는다."
"평균값은 소수점이하까지 계산해서 출력한다."

정답

1. (내가 쓴것-정상출력)

#include <stdio.h>
int main()
{
	int num,i=0;
	printf("양의 정수를 입력하시오");
	scanf_s("%d", &num);

	while (i <= num)
	{
		printf("hello world! \n");
		i++;
	}
	return 0;

}

2.(내가 쓴것-정상출력)

#include <stdio.h>
int main()
{
	int num,i=1;
	printf("양의 정수를 입력하시오");
	scanf_s("%d", &num);
	while (i <= num)
	{
		printf("%d\n", 3 * i);
		i++;
	}
	return 0;

}

3. (내가 출력- 정상출력)

#include <stdio.h>
int main()
{
	int num;
	int total = 0;
	printf("정수를 입력하시오");
	scanf_s("%d", &num);
	while (num != 0)
	{
		total = total + num;
		printf("정수를 입력하시오");
		scanf_s("%d", &num);

		
	}
	printf("총합은 %d 이다.", total);
	return 0;

}

4. 내가 출력-정상출력

#include <stdio.h>
int main()
{
	int dan, num = 9;
	printf("출력할 구구단 단수를 입력하시오");
	scanf_s("%d", &dan);
	while (num >= 1)
	{
		printf("%dx%d=%d \n", dan, num, dan * num);
		num--;

	}
	return 0;
	

}

5

#include <stdio.h>
int main()
{
	int num,i=0;
	int total=0;
	printf("몇개의 정수를 입력하시겠습니까?");
	scanf_s("%d", &num);
	
	while (i < num)
	{
		int input;
		printf("수를 입력하세요");
		scanf_s("%d", &input);
		total = total + input;
		i++;


	}
	printf("지금까지 입력한 숫자들의 평균은 %f이다.", (double)total / num);
	return 0;

}

while문의 중첩

while문 안에 while문이 포함된 상황
ex)구구단 출력

#include <stdio.h>
int main()
{
	int cur = 2;
	int is = 0;
	while (cur < 10)
	{
		is = 1; //새로운 단의 시작을 위해서
		while (is < 10) //각 단의 1부터 9의 곱을 표현
		{
			printf("%dx%d=%d \n", cur, is, cur * is);
			is++;
		}
		cur++; //다음단으로 넘어가기 위한 증가
	}
	return 0;

}

문제 07-2

1.프로그램 사용자로부터 총 5개의 정수를 입력받아서, 그 수의 합을 출력하는 프로그램은 작성해보자. 단! 한가지 조건이 있다. 정수는 반드시 1 이상 이어야 한다. 만약에 1 미만의 수가 입력되는 경우에는, 이를 입력으로 인정하지 않고 재입력을 요구해야한다. 그래서 결국 1이상의 정수 5개를 모두 입력 받을 수 있도록 프로그램을 완성해야 한다.
2.아래의 출력을 보이는 프로그램으로 작성해보자.

정답

1. 내가 쓴것-출력 정상


#include <stdio.h>
int main()
{
	int i = 1,sum=0;
	int num;
	while (i <= 5)
	{
		printf("정수를 입력하시오");
		scanf_s("%d", &num);
		while (num < 1)
		{
			printf("1이상의 정수를 입력하십시오");
			scanf_s("%d", &num);
		}
        sum+=num;
        num=0;
		i++;
	}
	return 0;


}

1. 답지

# include <stdio.h>

int main()
{
	int n1=0;
	int n2=0,total=0; //n2를 0으로 초기화하면 주석처리한 부분 쓸 필요 없음
	while (n1 < 5)
	{
		//printf("정수를 입력하시오");
		//scanf_s("%d", &n2);
		while (n2 < 1)
		{
			printf("0보다 큰수를 입력하시오");
			scanf_s("%d", &n2);
		}
		total += n2;
		n2 = 0;
		n1++;
	}
	printf("총합 %d", total);

	return 0;
}

++ int n2를 첫번째 while문 안에서 선언하면 지역변수 특성으로 인해 n2=0을 쓰지 않아도 출력됨.

2. 내가 쓴것-출력정상

#include <stdio.h>
int main()
{
	int num=0;
	int i = 0; //다시 시작하려면 초기화 해야함

	while (num<5)
	{
		i = 0;
		while (i<num)
		{
			printf("o");
			i++;//i가 늘어나야 while문을 빠져나올수 있음.
		}
        //답지는 여기에서 i=0이라고 초기화 했던데.. 뭐가 다를까//?
		printf("*\n");
		num++;
	}
	return 0;


}

07-2 do~while에 의한 문장의 반복

do~while vs while

-> 반복조건을 검사하는 시점!

1) do~while의 기본 구성
while-반복조건을 앞에서 검사-조건에 맞지 않으면 처음부터 실행할수 없음
do~while-반복조건을 뒤에서 검사-반복영역을 최소한 한번은 실행하는 구조

#include <stdio.h>
int main()
{
	int num = 0;
	//1.일단 실행
	//3.다시 실행
	//5.다시실행
	do 
	{
		printf("hello world! \n");
		num++; //num값은 0 ->1

	} while (num < 3);
	//2.반복여부 확인후, 재실행을 위해 이동 
	//4.반복여부 확인후,재실행을 위해 이동 num=2
	//num=3 반복여부 확인후, 반복문 탈주

	return 0;


}

do~while문이 자연스러운 상황

반복영역이 무조건 한번 이상 실행되어야 할때!

ex)

//usefuldowhile.c
#include <stdio.h>
int main()
{
	int total = 0, num = 0;
	do
	{
		printf("정수입력 (0 to quit)");
		scanf_s("%d", &num);
		total += num;

	} while (num != 0);
	printf("합계:%d \n", total);
	return 0;


}

문제 7-3

1.바로위에 보인 예제를 usefuldowhile.c를 while문 기반으로 재 구현할 경우, 생각해 볼수 있는 구현의 형태는 두가지이다. 그 두가지 방법은 다음과 같다.
방법1
변수 num값을 적절히 초기화 해서 첫번째 반복조건의 검사결과가 '참'이 되게 한다.
방법2
while 문에 진입하기 전에 프로그램 사용자로부터 값을 1회 입력받게 한다.

이 방법을 이용해 usefuldowhile.c를 while문으로 재구현 해보자.
2. 0이상 100이하의 정수중에서 짝수의 합을 출력하는 프로그램을 구현하되, do~while문 기반으로 구현해보자. 참고로 덧셈의 결과는 2550이 되어야 한다.
3. while문의 중첩관련 예제 2단에서 9단까지 출력하는 것 을 do~while문의 중첩 기반으로 재구현해보자.

정답

1.

방법 1

#include <stdio.h>
int main()
{
	
	int total = 0, num = 1; //num값을 1로 설정해서 첫번쨰 반복조건의 검사결과가 '참'이 되게 만들었다.
	while (num != 0);
	{

		printf("정수입력 (0 to quit)");
		scanf_s("%d", &num);
		total += num;

	}
	printf("합계:%d \n", total);
	return 0;
    


}

방법2

#include <stdio.h>
int main()
{
	
	int total = 0, num;
	printf("정수 1개를 입력하시오.");
	scanf_s("%d", &num);
	total += num;
	while (num != 0);
	{

		printf("정수입력 (0 to quit)");
		scanf_s("%d", &num);
		total += num;

	}
	printf("합계:%d \n", total);
	return 0;


}

2.내가 푼것 -정답

#include <stdio.h>
int main()
{
	int num = 0;
	int total = 0;
	
	do
	{
		total += num;
		num += 2;

	} while (num <= 100);
	printf("0부터 100까지 정수 중 짝수의 합은 %d 이다", total);
	return 0;


}

3.

#include <stdio.h>
int main()
{
	int dan = 2;
	int is = 1;
	do
	{
		do {

			printf("%dx%d=%d \n", dan, is, dan * is);
			is++;

		} while (is <= 9);
		is = 1;
		dan++;

	} while (dan <= 9);


}

07-3 for문에 의한 문장의 반복

for문의 구조와 이해

for문의 필수요소
1.초기식 반복을 위한 변수의 선언 및 초기화에 사용
2.조건식 반복의 조건을 검사하는 목적으로 선언된
3.증감식 반복의 조건을 '거짓'으로 만드는 증가 및 감소연산

#include <stdio.h>
int main()
{
	for (int num=0;num<3;num++)
	{
		printf("hi~");
		//반복의 대상이 되는 문장들
	}

}
//첫번째 반복의 흐름 int num=0 - num<3 -num++-for문 실행-num=1
//두번째 반복의 흐름 num<3 - for문 실행 -num++ - num=2
//세번째 반복의 흐름 num<3 - for문 실행 -num++ - num=3
//네번째 반복의 흐름 num=3 따라서 반복문 탈주!

+일부 컴파일러 에서는 초기식 위치에 변수선언을 허용하지 않고 있으므로 for문 앞에 변수 선언을 해줘야 모든 c컴파일러에서 컴파일이 가능.

  • 반복의 횟수가 정해진 경우 for문이 최선이다!
  • 불필요하다면 for(이부분)을 비워도 됨
  • for문 중간에 위치한 '조건식'이 비워지면 무조건 '참'으로 인식하여 무한루프를 형성한다.

문제 07-4

  1. 프로그램 사용자로부터 두개의 정수를 입력받아 두 정수를 포함하여 그 사이에 존재하는 정수들의 합을 계산해서 출력하는 프로그램을 작성해보자. 예를 들어 3과 5과 입력되면 3+4+5의 결과가 출력 되어야 한다. 문제를 조금 간단히 하기 위해서 첫번째 입력되는 정수보다 두번쨰 입력되는 정수가 더 커야한다는 조건을 걸기로 하겠다.
    2.다음은 팩토리얼을 계산하는 프로그램을 작성해보자.
    n!=1x2x3x...(n-1)xn
    프로그램 사용자로부터 n에 해당하는 정수를 입력받는다. 그러면 계승 n!를 계산해서 출력이 이뤄져야 한다.

정답

1.

#include <stdio.h>
int main()
{
	int num1, num2;
	int total=0;
	printf("두개의 정수를 입력하시요");
	scanf_s("%d %d", &num1, &num2);
	for (total=0 ; num1 <= num2; num1++)//여기에 ;입력하면 안됨!!!
	{
		total += num1;

	}
	printf("총합 %d", total);
	return 0;
}

궁금한점

초기식에 total=0 말고 num넣으면 안되나..?

2.(답은 맞는데 실행여부가 확인이 안됬음)

#include <stdio.h>
int main()
{
	int num1;
	int i;
	int total=1;
	printf("n!계산하기 n을입력하시오");
	scanf_s("%d ", &num1);
	for (i=1 ; i<=num1; i++)//여기에 ;입력하면 안됨!!!
	{
		total= total* i;

	}
	printf("총곱 %d!: %d",num1 ,total);
	return 0;
}

for문의 중첩

2-9단까지 출력하는 예제를 for 문으로 출력해보기

#include <stdio.h>
int main()
{
	int cur, is;
	for (cur = 2; cur < 10; cur++)
	{
		for (is = 1; is < 10; is++)
		{
			printf("%dx%d=%d", cur, is ,cur * is);
			printf("\n");
		}
	}
	return 0;
}
profile
just do! -얼레벌레 굴러가는 공대생

0개의 댓글