전공/C

과제 1 - variable (6 ~ 9) (범위포함 x)

yha97 2021. 6. 21. 11:39

교수님의 착각으로 올리신 문제들이다.

 

주로 for문을 통한 문제들이며 혹시나 하는 마음에 풀어서 제출했었다.

 

int형 변수를 입력받은 후 그 변수 값만큼 1부터 증가시키면서 출력하는 프로그램이다.

 

#include <stdio.h>

int main(){
	int n;
	int cnt=1, i=0;
	
	printf("Enter number: "); // inputs number
	scanf("%d", &n);
	
	while(cnt < (n+1)){ // repeats when cnt coincides with n
		for(i=1; i<(cnt+1); i++){
			printf("%d", i); // prints number from 1 to cnt
		}
		printf("\n"); // goes to next line after arrives end
		cnt++;
	}
	
	return 0;
}

int형 변수 n, 반복문을 위한 변수 cnt와 i를 선언, n을 입력받았다.

 

그 이후 while문을 통해 n개의 line을 실행하고, 첫째줄에는 1, 둘째줄에는 12, 셋째줄에는 123을 출력하기 위해 for문을 추가적으로 넣었다.

 

또한 개행을 표현하기 위해 for문이 끝난 이후 printf("\n"); 을 넣음으로써 구분을 할 수 있도록 하였다.

 

단순히 이중 for문을 사용했으면 편했겠지만 while문 연습을 위해 일부러 사용하였다.

 

 

Q6 문제에 추가적으로 ' ', 즉 공백을 추가적으로 반복하여 넣어야 하는 문제이다.

 

#include <stdio.h>

int main(){
	int n;
	int cnt=1, i=0;
	
	printf("Enter N: "); // inputs number
	scanf("%d", &n);
	
	while(cnt < (n+1)){ // repeats when cnt coincides with n
		for(i=n-cnt; i>0; i--){ // prints space with desc times
			printf(" ");
		}
		for(i=1; i<(cnt+1); i++){
			printf("%d", i); // prints number from 1 to cnt
		}
		printf("\n"); // goes to next line after arrives end
		cnt++;
	}
	
	return 0;
}

이전에 작성했던 Q6의 코드에 여백 출력을 위한 for문을 추가적으로 넣음으로써 문제를 해결했다.

 

맨 처음 i값을 n-cnt로 설정함으로써 첫째줄에는 n-1개의 여백을, 둘째줄에는 n-2개의 여백을 출력하였고 마지막에는 0개의 여백을 출력하는 형식으로 문제를 해결하였다.

 

그리고 while문이기에 cnt를 증가시김으로써 의미없는 반복을 제거하였다.

 

 

for문 연습문제의 꽃이라고 할 수 있는 다이아몬드 만들기이다.

 

#include <stdio.h>

int main(){
	int c;
	int i, j;
	
	printf("Enter number of columns:"); //inputs value of columns
	scanf("%d", &c);
	
	//upper triangle from 1 to c (ascending)
	for(i=0; i<c; i++){
		for(j=0; j<(i+1); j++)
			printf("*"); // prints star j times repeatly
		printf("\n"); // goes to next line
	}
	
	//lower triangle from (c-1) to 1 (descending)
	for(i=(c-1); i>0; i--) {
		for(j=i; j>0; j--)
			printf("*"); // prints star j times repeatly
		printf("\n"); // goes to next line
	}
	
	return 0;
}

column의 값을 입력받고 출력하였다.

 

먼저 이 문제를 풀기 위해 간단히 짚고 넘어가야 할 점이 있다. 

 

나는 보통 다이아몬드를 만들때 삼각형과 역삼각형을 더함으로써 다이아몬드를 만드는 방식을 사용한다.

 

때문에 위 주석을 본다면 upper triangle과 lower triangle이 있다는 것을 확인할 수 있을 것이다.

 

본격적으로 풀어본다면 column을 구분하는 첫 번째 for문이 있고 그 안에 *을 출력하는 두 번째 for문이 있다.

 

다만, 이렇게만 한다면 단순히 삼각형 모양만 출력되기 때문에 다이아몬드를 만들기 위해서는 이를 반대로 만드는 이중 for문을 넣어야 한다.

 

그렇기 때문에 첫 번째 이중 for문에서는 i값이 증가하는 형식이었다면, 두 번째 이중 for문에서는 i값을 c-1 로 설정, 0까지 감소시키는 방식으로 함으로써 역삼각형을 만들었고, 이를 모두 출력했을 때 다이아몬드와 같은 모양이 나올 수 있도록 하였다.

 

맨 처음 다이아몬드를 만들 때 처음 upper triangle은 수월하게 출력할 수 있었지만 lower triangle은 맨 처음 i값을 어떤 값으로 설정해야 하는지, 어디까지 줄여야 하는지 감이 잡히지 않아 어려움이 있던 기억이 있다.

 

 

Q8에서 여백만 추가한다면 완성되는 문제다.

 

#include <stdio.h>

int main(){
	int c;
	int i, j;
	printf("Enter number of columns : ");
	scanf("%d", &c);
	
	//upper triangle from 1 to c (ascending)
	for(i=0; i<c; i++){
		for(j=(c-i-1); j>0; j--) // prints space with descending sequence
			printf(" ");
		for(j=0; j<(i+1); j++)
			printf("*"); // prints star j times repeatly
		printf("\n"); // goes to next line
	}
	
	//lower triangle from (c-1) to 1 (descending)
	
	for(i=(c-1); i>0; i--) {
		for(j=(c-i); j>0; j--)// prints space with ascending sequence
			printf(" ");
		for(j=i; j>0; j--)
			printf("*"); // prints star j times repeatly
		printf("\n"); // goes to next line
	}
}

이전문제처럼 해당 for문에 여백을 추가하기 위한 for문을 추가적으로 넣음으로써 문제를 해결할 수 있을 것이다.