본문 바로가기

카테고리 없음

게임개발반 프로그래밍 06 - C언어 입출력에서 여러가지 서식 문자의 활용, while문 숙련하기

3월 22일자 수업 내용입니다.

 

정수 두개를 각각 2번 입력 받아서 직사각형 넓이 구하기

좌표계에서 정수 두개를 각각 2번 입력 받아서 직사각형의 넓이 구해보기

 

#include<stdio.h>

int main(void)
{
	int xpos1;
	int ypos1;
	int xpos2;
	int ypos2;
	int area;

	//좌표계에서 정수 두개를 각각 2번 입력 받아서 
	//직사각형 넓이를 구하기

	printf("좌표계에서 좌상단 좌표를 입력 하십시오: \n");
	printf("X좌표: "), scanf_s("%d", &xpos1);
	printf("Y좌표: "), scanf_s("%d", &ypos1);

	printf("좌표계에서 우하단 좌표를 입력 하십시오: \n");
	printf("X좌표: "), scanf_s("%d", &xpos2);
	printf("Y좌표: "), scanf_s("%d", &ypos2);

	area = (xpos2 - xpos1) * (ypos2 - ypos1);
	
	printf("직사각형의 넓이는 %d 입니다.", area);

	



	return 0;

}

sanf함수와 printf 함수, 변수에 대입하여 계산만 할 수 있다면 간단하게 풀어 볼 수 있는 문제다.


숫자를 입력 받아서 문자로, 문자를 입력받아서 숫자로 변환해보기

#include<stdio.h>

int main()
{
	char asci;
	int jungsu;

	printf("문자를 입력 하세요: \n");
	scanf_s("%c", &asci,sizeof(char));

	printf("숫자를 입력 하세요: \n");
	scanf_s("%d", &jungsu);

	printf("문자를 숫자로 변환 결과: %d\n", asci);
	printf("숫자를 문자로 변환 결과: %c", jungsu);




}

scanf 함수에서 %c 서식문자를 활용하여 문자값을 받게 될경우 sizeof(char) 라는 인자값이 하나 더 있다.

자료형의 크기를 정해주는것. 얼마나 큰 데이터를 받을 수 있는지를 매개변수로 취하는 것이다.

 


배열

#include<stdio.h>

int main()
{
	char str[20]; //배열
	printf("문자열을 입력 하시오: "), scanf_s("%s", str, sizeof(str));
    //&이 없는 이유는 배열 이름 자체가 주소값이기 때문이다.
	printf("입력받은 문자열 출력 :%s\n", str);

}

scanf_s는 문자열을 입력받을 때, 인자값이 3개이다.

스페이스바를 입력하여 띄어쓰기를 적용하면 

 

위와 같이 출력된다. 공백을 인식하지 못하기 때문에 scanf 함수는 문자열을 입력받을 때는 적절하지 않다.

배열 이름 자체가 주소값을 가지고 있어서 scanf를 사용할 때 &을 사용하지 않았다.


서식문자의 종류

 

서식 문자 예제

#include<stdio.h>

int main()
{
	int num1 = 7, num2 = 13;
	printf("%o %#o \n", num1, num2);
	printf("%x %#x \n", num2, num2);
	return 0;
	
}

 


서식문자 예제2

실수의 표현을 위한 서식 문자들

#include<stdio.h>

int main()
{
	printf("%f \n", 0.1234);
	printf("%e \n", 0.1234);
	printf("%f \n", 0.12345678);
	printf("%e \n", 0.12345678);

	return 0;
}

 

 

 

 

#include<stdio.h>

int main()
{
	double d1 = 1.23e-3; // 0.00123
	double d2 = 1.23e-4; // 0.000123
	double d3 = 1.23e-5; // 0.0000123
	double d4 = 1.23e-6; // 0.00000123
	
	printf("%g \n", d1); // %f 스타일 출력
	printf("%g \n", d2); // %f 스타일 출력
	printf("%g \n", d3); // %e 스타일 출력
	printf("%g \n", d4); // %e 스타일 출력

	return 0;
}

 


 

서식문자 예제3

#include<stdio.h>

int main()
{
	printf("%-8s %14s %5s \n", "이 름", "전자공학과", "학년");
	printf("%-8s %14s %5d \n", "김동수", "전자공학", 3);
	printf("%-8s %14s %5d \n", "이을수", "컴퓨터공학", 2);
	printf("%-8s %14s %5d \n", "한선영", "미술교육학", 4);

	return 0;
}

서식문자에서 알파벳과 % 사이에 정수가 들어갈 경우자리 확보를 의미 합니다.

예를들면 %8d 에 100을 대입 한다고 하면

(빈칸)(빈칸)(빈칸)(빈칸)(빈칸) (1) (0) (0)

이 출력 되는거죠.

음수를 대입하면 그만큼 자리를 확보하고 왼쪽부터 정렬입니다.

%-8d에 100을 대입하면

(1) (0) (0) (빈칸)(빈칸)(빈칸)(빈칸)(빈칸)

이 됩니다.

 


서식문자 예제4

 

#include<stdio.h>

int main()
{
	float num1;
	double num2;
	long double num3;

	printf("실수 입력1(e 표기법으로): ");
	scanf_s("%f", &num1);
	printf("입력된 실수 %f \n", num1);

	printf("실수 입력2(e표기법으로): ");
	scanf_s("%lf", &num2);
	printf("입력된 실수 %lf \n", num2);

	printf("실수 입력3(e표기법으로): ");
	scanf_s("%Lf", &num3);
	printf("입력된 실수 %Lf \n", num3);

	return 0;

}

 


While문제 풀어보기

 

문제1번의 답

더보기
#include <stdio.h>

int main()
{
	int i = 0;	//5번 정수를 받기 위한 첫 While문의 조건 변수
	int scan1 = 0;	//사용자로 부터 입력받는 변수, 2중 while문에 처음 접근하기 위해 0으로 초기화 한다.
	int sum = 0;	//입력받은 값을 누적시키는 변수
	
	// 정수 5개를 입력받고 그 수에 합을 구해야 한다. 정수는 반드시 1이상
	printf("1이상의 정수 5개를 입력 하세요. \n");

	while (i++ < 5)	//1~5 다섯번 반복 할 것
	{
		while (scan1 < 1) //0으로 초기화 했기 때문에 진입 가능한 While문.
		//입력 받은 수가 0보다 작으면 탈출할 수가 없게 된다.(무한 루프됨)
		{
			printf("%d 번째 정수를 입력 하세요: ", i);
			scanf_s("%d", &scan1);
			if (scan1 < 1)
				printf("다시 입력하세요. 1이상의 정수를 입력해야 합니다.\n");
			//입력값이 1보다 작으면 경고문 출력 후 무한 루프, 1보다 크면 if문을 실행하지 않고 일단 내부 while문을 탈출함
		}
		sum += scan1;
		//내부while문을 탈출하자마자 만나는 덧셈 누적 구간
		scan1 = 0;
		//일단 내부 while문을 탈출 했기 때문에 밖으로 나가기 전에 다시 내부 while문을 만났을 때 접근할 수 있도록 초기화 한다.
	}

	printf("정수의 총합은 %d 입니다.", sum);

	return 0;
}

 

문제1번을 for문으로도 전환해보자

더보기
#include <stdio.h>

int main()
{
	int scan1;	//내부 for문에서 사용되지만 탈출 후에도 값누적을 위해 필요하기에 전역변수로 설정했다.
	int sum = 0;	//입력받은 값을 누적시키는 변수
	
	// 정수 5개를 입력받고 그 수에 합을 구해야 한다. 정수는 반드시 1이상
	printf("1이상의 정수 5개를 입력 하세요. \n");

	for (int i = 1; i <= 5; i++)	//다섯번 반복함
	{
		for (scan1 = 0; scan1 < 1; scan1++)	//
		{
			printf("%d 번째 정수를 입력 하세요: ", i);	//출력 프린트
			scanf_s("%d", &scan1);	//입력값 받기
			if (scan1 < 1)	//입력값 받았는데 1미만인 경우
			{
				printf("다시 입력하세요. 1이상의 정수를 입력해야 합니다.\n");//문구출력
				scan1--;	//내부 for문을 반복해야 하기 때문에 scan값을 한번 줄인다.
				printf("\nif문 진입!\n");
			}
		}
		printf("\n내부 for문 %d번 끝났다!\n", i);
		sum += (scan1-1);//내부 for문 탈출하자마자 값누적. '-1'을 해주는 이유는 for문에서 탈출하면서 +1 되는 조건이기 때문
		printf("\n지금 누적된 값은 %d다!\n", sum);
	}
	
	printf("정수의 총합은 %d 입니다.", sum);	//최종 출력

	return 0;
}

 

풀이과정을 보여드리기 위해 일부러 디버깅 출력문을 남겼습니다.

출력 화면은 이렇습니다.

 

 

문제2번의 답

더보기
#include<stdio.h>

int main()
{

	int i = 0;	//미리 초기화
	int j = 0;

	while (i < 5) //0~4 까지 반복
	{
		while(j < i)	//내부 while문 둘다 0일 때는 진입 불가
		{
			printf("0 ");	//0 찍기
			j++;
		}

		printf("*\n");	// * 찍기
		i++;
		j = 0;
        
        //마지막에 *을 찍고 외부 while문 1회 종료

	}

	return 0;

}

 

 

 

 

 


 

 

 

문제 1번의 답

더보기
#include<stdio.h>

int main()
{
	int num1;
	printf("정수를 입력 하시오: ");
	scanf_s("%d", &num1);

	while (num1 > 0)
	{
		printf("Hello world! \n");
		num1--;
	}
    return 0;



}

 

문제2번 답

더보기
#include<stdio.h>

int main()
{
	int scan1;
	int i = 0;
	int exp = 0;

	printf("양의 정수를 입력 하시오: ");
	scanf_s("%d", &scan1);

	while (i++ < scan1)
	{
		exp = i * 3;
		printf("%d ", exp);
	}


	return 0;



}

출력 화면입니다.

우리가 필요한 건 n * 3 의 나열인데 n 이 지속적으로 증가해야 하죠.

i를 0으로 초기화 하고 i++ 후위증가를 통해 조건을 설정 했습니다. scan1은 입력받은 정수 값인데

입력받은 정수보다 작을 때로 while문의 조건을 설정해서 횟수를 맞춰 주었고

후위증가가 완료된 상태로 while문 안쪽으로 진입하게 되니까 실제 계산식에서 i값은 1부터 시작하게 되죠.

 

문제3번 답

더보기
#include <stdio.h>

int main()
{
	int i = 1; //while 무한루프의 조건이자 입력 받는 정수 대입 역할, while 조건을 만들어야 하기에 1로 초기화 함
    //1이 아니라 다른 수여도 상관 없다. 9999 여도 코드는 문제없이 잘 동작함
	int sum = 0; //계속 더한 값을 저장하는 변수 

	while (i!=0)
	{
		printf("정수를 입력 하세요: ");
		scanf_s("%d", &i);//전역 변수로 while이 1로 초기화 되었지만, 연산되기 전에 여기서 어차피 한번더 초기화 된다.
		//0이 입력 될 경우 자동으로 while문을 탈출 할 수도 있게 된다.
		sum += i;//sum값으로 합이 대입되며, 0이 합쳐져도 값은 변함이 없다.
	}
	printf("입력된 모든 정수의 합은 %d 입니다.", sum);


	return 0;
}

 

 

출력 화면입니다.

 별다른 브레이크가 없는 한 계속 반복되어야 하기 때문에 while 문의 조건에 에 bool 값을 가진 개체가 필요했습니다.

bool값을 사용하려면 헤더파일이 하나 더 필요하기 때문에 논리연산을 하는 방법으로 while을 무한반복 시켜 주었습니다.

 

4번

문제 정답

더보기
#include <stdio.h>

int main()
{
	int gudan; //사용자가 입력하는 숫자
	int i = 10; //while문의 조건에 해당할 변수. 역순이기 때문에 10으로 초기화 했다.

	//구구단 출력 그런데 역순
	printf("숫자를 입력 하세요: ");
	scanf_s("%d", &gudan);

	while (--i > 0) // 전위 연산을 통해서 9부터 시작 되게 하였다. 9부터1까지 9번 반복 된다.
	{
		printf("%d × %d = %d \n", gudan, i, gudan*i); //9부터 내림차순으로 구구단이 출력된다.
	}
		


	return 0;
}

 

출력화면입니다.

만약 전위연산이 아니라 후위 연산을 사용했다면 코드는 아래와 같습니다.

#include <stdio.h>

int main()
{
	int gudan; //사용자가 입력하는 숫자
	int i = 9; //while문의 조건에 해당할 변수. 후위연산을 하기 위해 9부터 시작했다.

	//구구단 출력 그런데 역순
	printf("숫자를 입력 하세요: ");
	scanf_s("%d", &gudan);

	while (i-- > 0) //이번엔 i값이 while문 안에서 8부터 0까지 9번 반복 된다.
	{
		printf("%d × %d = %d \n", gudan, i+1, gudan*(i+1)); //9부터 내림차순으로 구구단이 출력된다.
	}
		


	return 0;
}

 

5번 정답

더보기
#include <stdio.h>

int main()
{
	//입력 받은 정수의 평균을 구해보자
	int scan1; //사용자의 입력값 첫번째
	int scan2; //사용자의 입력값 두번째
	int sum = 0; //사용자의 입력값의 총합
	int i = 0; //오름차순을 표현 하기 위한 변수(n번째)

	printf("몇개의 정수를 입력받으시겠습니까? :");
	scanf_s("%d", &scan1);	//scan1 갯수만큼 정수를 입력 받게 할 것이다.


	while (i++ < scan1)
	{
		printf("%d번째 정수를 입력 하세요. \n", i);
		scanf_s("%d", &scan2);	//입력받은 scan2는 합연산의 재료로 쓰인다.
		sum += scan2;	//모든 scan2의 합이 누적된다.
	}

	printf("평균 값은 %f 입니다.", (float)sum / scan1); //float 자료형으로 명시적 형변환을 시도했다.
	//서식문자도 %f으로 바꿔 주어야 한다.

	return 0;
}

 

 

scan1값은 나중에 평균값 계산에 쓰이기 때문에 건드려서는 안된다.

i 라는 변수를 하나 더 생성했다. 0에서 시작, 1부터 scan1까지 반복한다.