눈으로 하는 코딩이 아닌! 직접 타이핑하는 코딩은 실력 향상에 엄청난 도움이 됩니다.




안녕하세요~! 정선생이예요. 이번에는 함수 이후에 다뤘어야했던 변수의 유효범위를 알아볼거예요.

제가 작성한 줄 알고 넘어가는 바람에 게시글 순서가 살짝 꼬였네요.. 죄송합니다 ( __ )

일단 이 글은 배열 전에 읽어주시기를 바라고 함수 - 재귀함수 게시글을 보신 후에 보시는 것을 추천드립니다.

이전 게시글 보기 => ( 함수 ) ( 재귀함수 )



변수에 대해서는 두가지 종류가 있어요. 전역 변수와 지역 변수.

함수 외부에 변수를 정의 한 것은 전역 변수, 함수 내부에 변수를 정의 한 것은 지역 변수라고 해요.

글로는 주절주절 쓴 것 밖에 안되니까 바로 예제를 확인해보죠.


#include <stdio.h>
int x = 20;
int main() {
	printf("main block에서의 현재 x의 값 => %d\n", x);
	if(true){
		int x = 5;
		printf("if block에서의 x의 값 => %d\n", x);
	}
        int x = 10;
	printf("main block에서의 현재 x의 값 => %d\n", x);
	return 0;
}

결과값을 보시기 전에 미리 예측 해보고 하시는걸 추천합니다.


결과값을 보셨나요? ' 컴파일러는 각 블록에 있는 변수를 우선적으로 쓰게 된다. '

음.. 말이 어렵나요? 어떠한 변수를 쓰게되면 자신의 블록을 최우선으로 먼저 봅니다. 그런데 자신의 블록에 해당 변수가 없다면 그 상위 블록으로 나가서 확인을 해요.

2번째 줄의 int x = 20; 이 전역변수예요.

전역 변수와 지역 변수 차이점 중 하나가 지역 변수는 처음에 초기화를 해주지 않는다면 쓰레기 값이 생기는 반면, 전역 변수는 처음에 초기화를 해주지 않는다면 보통 0으로 자동 초기화가 됩니다.

int x = 20; 을 int x; 로 바꾸고 실행해보세요.


그리고 다음 예제를 봐보죠.


#include <stdio.h>
int main() {
	if(true){
		int x = 5;
		printf("if block에서의 x의 값 => %d\n", x);
	}
	printf("main block에서의 현재 x의 값 => %d\n", x);
	return 0;
}

아마 printf("main block~~") 줄이 에러가 날꺼예요. 왜냐면 현재 블록에서는 x가 없고, 그 상위 블록에도 x가 없으니까요.

" 아! 지역 변수가 해당 블록을 떠나면 사용 할 수 없구나. "

이해 되시나요?ㅎ



'Programming > C' 카테고리의 다른 글

[C] 배열(Array)  (0) 2018.05.24
[C] 재귀함수(Recursion)  (0) 2018.05.22
[C] 함수  (0) 2018.05.15
[C] 반복문  (0) 2018.05.06
[C] 조건문  (0) 2018.05.04


눈으로 하는 코딩이 아닌! 직접 타이핑하는 코딩은 실력 향상에 엄청난 도움이 됩니다.




안녕하세요~! 정선생이예요. 앞서했던 내용들은 C의 기초였어요. 앞으로는 좀 더 심화된 내용을 다룰꺼예요.

그 심화된 내용의 첫 번째. 바로 배열(Array)입니다.

정말 단순하게 '둘 이상의 변수를 모아둔 것'을 배열이라고 해요. 그런데 변수들과는 다르게 선언법과 접근법이 달라요. 


배열이 왜 필요하게 됐는지가 중요하겠죠?

초등학교로 예를 들어볼게요. 각 학년별 반(class) 인원을 저장하는 변수들이 필요하다고 생각해보죠.


우선 1학년만 10개의 반이 있다고 가정할게요. 

int class101, class102, class103, ...;

선언하는 것도 한세월이 걸리겠네요..

그런데 이걸 한 번에 해결해주는게 배열이예요.


배열의 선언법은 간단합니다.

데이터타입 배열명[배열의길이];

즉, [    int   class1[10];    ]. 

이 말은 다음 그림 예시와 같아요.



간단하게 number[5]는 5개의 방을 가졌고. 0호 방, 1호 방, 2호 방, 3호 방, 4호 방이 있다. 라고 생각하면 더 편합니다.

그런데 이 방은 int형이다.. 정도?

배열은 메모리 주소에 연속되서 적재되요. 적재된다는 얹어진다고 보면 되요.


 메모리 주소

(Byte 단위)

내용 

 1000

number[0] 

 1001

 1002

 1003

 1004

 number[1]

 1005

 1006

 1007


이런식으루요 ㅎㅎ 4바이트인 이유는 int형이기 때문!


배열의 선언만 알아서는 안되겠죠. 초기화를 알아야합니다.

초기화 방법은 다음과 같이 몇가지가 있어요.

 방법 1.

int arr[] = { 1, 2, 3, 4, 5 }; // arr[0]에는 1, arr[1]에는 2, ... , arr[4]에는 5가 차례대로 대입되면서 5개의 길이를 가진 배열임을 알게됨.

 방법 2.

int arr[5] = { 1, 2, 3, 4, 5 }; // 길이가 5인 배열을 만들면서 그 배열 속에 1~5까지 넣음.

 방법 3.

int arr[5]; // 길이가 5인 배열이 만들어짐

int i;  // 반복문을 돌면서 0번~4번 배열에 1, 2, 3, 4, 5를 대입.

for(i = 0; i < 5; i++)

    arr[i] = i + 1;


출력은 각각의 방 번호(인덱스라고 합니다)를 직접적으로 넣으면 됩니다.

[      printf("%d", arr[4]);     ] 처럼 말이죠ㅎㅎ 물론 상수가 넣어져있는 변수에도 가능해요.

[      printf("%d", arr[n]);     ] 처럼요.


주의할 점은 해당 배열의 길이를 넘어서면 안됩니다. 다른 메모리를 건드려 시스템이 맛탱이가 갈수도 있어요 :( 진짜 가장 중요합니다.



초기화 방법에 출력방법까지 알았겠다.. 그렇다면 이제 활용을 해봐야겠죠?

1~10이 저장되어 있는 배열에서 사용자가 입력한 숫자를 찾는 예제가 가장 적합해보여요. 소스를 봐보죠.


#include <stdio.h>

int main() {
    int arr[10] = { 2, 3, 1, 4, 7, 5, 8, 6, 10, 9};
    int n;
    int i;
    scanf("%d", &n);
    for(i = 0; i < 10; i++){
        if(arr[i] == n){
            printf("찾음!\n");
            break;
        }
    }
    if(i == 10)
        printf("못찾음!\n");
    return 0;
}

배열을 초기화 한 후에 입력을 받네요.

i = 0 ~ 9까지 1씩 증가하면서 arr[i]의 값과 n을 비교하네요. 같으면 찾는 값이니 '찾음!'을 출력하고, 아무것도 못 찾고 for문을 빠져나오면 i는 10이겠죠?

그러니 못찾음이 출력되고 끝납니다. ㅎ 이해 되시나요?  ㅎ


" 쌤 그러면 정렬도 가능하겠네요?! "

 => 당연히 가능합니다. 다음 게시글에서 정렬을 다루게 될 예정이예요. 혹여나 못 다루게 되면 그 다음 게시글에 꼭 다룰거예요.



다음으로 다차원 배열이라는게 있어요.

2차원 배열, 3차원 배열이 대표적이고 보통은 2차원 배열까지만 쓰죠.

2차원 배열은 여러개의 1차원 배열이 합쳐진거라고 보면되요.

다시말해서..

int arr[3][5]; 라고 치면은

arr[5] 라는 배열이 3개가 더 있는거예요

즉 다음과 같은 느낌으로 배열이 표현이 되겠죠?


arr[0][0]

arr[0][1]

arr[0][2] 

arr[0][3] 

arr[0][4] 

arr[1][0]

arr[1][1] 

arr[1][2] 

arr[1][3] 

arr[1][4] 

arr[2][0]

arr[2][1]

arr[2][2]

arr[2][3]

arr[2][4] 


행렬로 표현이 된다고도 하죠?

그렇지만 메모리에는 일자로 되있겠죠? 메모리가 행렬처럼 2차원적으로 존재하지는 않으니까요 ㅎ


arr[0][0]

arr[0][1] 

arr[0][2] 

arr[0][3] 

arr[0][4] 

arr[1][0] 

... 

... 

... 

... 

... 

... 

... 

... 

arr[2][4] 


이렇게 저장이됩니다 :) 이건 언제 쓰냐구요?? 음.. 아까 학급에 대한 예를 계속 들어보도록하죠!


각 학년별로 학급은 10개 반이라고 치면,

1학년 10개, 2학년 10개, 3학년 10개, ... , 6학년 10개. 총 60개의 인원 저장 변수가 필요해요.

그렇다면 arr[60]으로 해도 되겠죠?

그치만 조금 더 가독성있게, 보는 사람도 편한 느낌이 들게 정의해보자구요.

arr[6][10];

arr[0][?] 라인은 1학년

arr[1][?] 라인은 2학년

...

arr[5][?] 라인은 6학년.

오히려 접근성이 편하겠죠? 이해하기도 쉽구요.


이차원 배열에 대한 접근이나 초기화는 반복문을 중첩해서 합니다. 다음과 같이요.

#include <stdio.h>

int main() {
   int arr[6][10];
   int i, j;
   int num=1;
   for(i = 0; i < 6; i++){
      for(j = 0; j < 10; j++)
         arr[i][j] = num++; 
   }
   for(i = 0; i < 6; i++){
      for(j = 0; j < 10; j++)
         printf("%d ", arr[i][j]);
   }
    return 0;
}

" 쌤 아까 메모리에는 일자로 되어있다고 했는데 그러면 1차원 배열로 호출해도 되지 않나요? arr[1][0] 을 arr[10]처럼요!! "

 => 이 질문에 대해서는 다음의 코드를 작성해보도록 하죠!


#include <stdio.h>
int main() {
   int arr[6][10];
   int i, j;
   int num = 1;
   for (i = 0; i < 6; i++) {
      for (j = 0; j < 10; j++)
         arr[i][j] = num++;
   }
   for (i = 0; i < 60; i++) {
	printf("%d ", arr[i]);
   }
   return 0;
}

아마도 결과는 8자리정도 되는 숫자가 일정한 규칙으로 나올꺼예요. 다음처럼ㅎㅎ



결과처럼 나온 이유는, 현재 값이 얹어져있는 메모리 위치를 출력해준거예요. 그리고 일정한 규칙으로 커지고 있어요. 이건 2차원 배열 arr[6][10]에서 10의 숫자를 바꿔보면서 출력하면 제가 어떤 얘기를 하려했는지 알꺼예요. ^.^

그리고 조금 더 자세한 내용은 추후 포인터 부분에서 다룰꺼예요.

지금은 2차원 배열에서는 arr[i][j] 방식으로 출력한다를 꼭 지켜주시구요.



배열에 대한 내용은 앞으로 함수와 배열, 정렬에 대한 기초를 해드리고 배열 내용을 마치려합니다.







게시글을 보시다가 궁금한 내용, 이게 맞나? 하는 내용, 이건 틀렸어!하는 내용들은 과감하게 댓글 달아주시면 감사하겠습니다.


이론적인 내용에 대한 궁금증은 검색을 통해 궁금증을 해결하는 것이 좋아요!!

실습적인 내용에 대한 궁금증은 최대한 생각을 해보고 검색을 하는 것이 좋아요!!

'Programming > C' 카테고리의 다른 글

[C] 변수의 유효범위 ( 미완성 )  (0) 2018.05.29
[C] 재귀함수(Recursion)  (0) 2018.05.22
[C] 함수  (0) 2018.05.15
[C] 반복문  (0) 2018.05.06
[C] 조건문  (0) 2018.05.04


눈으로 하는 코딩이 아닌! 직접 타이핑하는 코딩은 실력 향상에 엄청난 도움이 됩니다.




안녕하세요~! 정선생이예요. 이번에는 재귀함수를 배워볼꺼예요.

일단 재귀함수의 사전적 정의를 봐보죠!! 재귀란, 수학이나 컴퓨터 과학 등에서 자신을 정의할 때 자기 자신을 재참조하는 방법을 뜻한다. (출처바로가기)

음.. 마지막이 중요해요. 자기 자신을 재참조한다. 프로그래밍에서는 자기 자신을 재호출한다. 로 바꿔서 해석할 수 있어요. 이게 뭔소린지 예제소스를 보면서 알아가봐요!!


가장 많은 예시로 사용되는 코드는 계승(Factorial)이예요. 표시는 n! 로 합니다. 자세히 들어가면 수학시간이 되버리니까 구글링으로 정의를 알아보도록해요 ㅎㅎ 자 일단은, 3! = 1 x 2 x 3 이구요. 5! = 1 x 2 x 3 x 4 x 5 가 됩니다.

" 아하! n! 이란 1~n 까지를 곱한거구나. "

이해 가시나요?

1~n까지 1씩 증가하면서 곱한 값을 출력해주는거니까 반복문으로 해결 할 수가 있겠죠?


#include <stdio.h>

int main() {
    int n=10;
    int i, fact=1;
    for(i = 2; i <= n; i++)
        fact = fact * i;
    printf("10! = %d", fact);
    return 0;
}

 출력

10! = 3628800


자 반복문으로 작성했으니 10!을 구하는 함수를 작성해봅시다.

#include <stdio.h>
int fact(int n){
    int i, result;
    result = 1;
    for(i = 2; i <=n) i++)
        result *= i;
    return result;
}

int main() {
    printf("10! = %d", fact(10));
    return 0;
}

이제 이 함수를 재귀함수로 바꿀수가 있는데요. 이게 쉽다고 단정을 짓기도 애매하고, 어렵다고 확정 짓기도 애매합니다.. 


일단 재귀함수란, 자기 자신을 계속 호출하는건데 어떤식으로 호출하는지 코드를 볼게요.

#include <stdio.h>
int fact(int n){
    if(n == 1)
        return 1;
    else
        return n * fact(n-1);
}

int main() {
    printf("10! = %d", fact(10));
    return 0;
}

코드는 생각보다 엄청 간결해졌어요.  fact함수는 매개변수로 정수형 변수 하나를 받네요.

맨 처음은 fact(10)

if에서는 false니까 넘어가겠죠?

그리고 return n * fact(n-1) 을 해주는데 현재 n은 10이죠?

그러면 fact(9)를 호출하겠네요. 그렇다면 return 10 * fact(9)

fact(9)에서는 9 * fact(8)

fact(8)에서는 8 * fact(7)

...

fact(2)에서는 2 * fact(1)

fact(1)에서는 if문의 true가 되니까 1을 리턴합니다.

자 그러면 계산된 값들을 역으로 올라가봅니다.

fact(1)은 1이니까 fact(2)에서는 2 * 1이 되요.

fact(3)에서는 3 * fact(2). 즉 3 * 2 * 1.

fact(4)는 4 * fact(3). 즉 4 * 3 * 2 * 1.

...

fact(9)는 9 * fact(8). 즉 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1.

fact(10)은 10 * fact(9). 



재귀함수는 여러 문제를 봐보면서 어떤 방식으로 동작하는지를 파악해야해요.

코드 자체를 외운다기보다는 공책 펴놓고 거기에서 n이 10일때, 9일때, 8일때, ... 각각의 n에 대해 함수가 어떻게 작동하는지를 디버깅 해보면 이해가 쉽게 될거예요. 컴퓨터 코딩이라고 손코딩이 중요하지 않은 것은 아니예요. 손코딩도 그만큼 중요합니다 ^.^



======================================== 5월 29일에 추가된 내용 ==========================================


현재 제가 작성 한 줄 알고 넘어갔던 변수의 유효범위와 관련된 게시글을 재귀함수 다음으로 읽어주시고 배열 파트로 넘어가시길 권장합니다.

죄송합니다 ( __ )

( 변수의 유효범위 게시글로 바로가기 )




게시글을 보시다가 궁금한 내용, 이게 맞나? 하는 내용, 이건 틀렸어!하는 내용들은 과감하게 댓글 달아주시면 감사하겠습니다.


이론적인 내용에 대한 궁금증은 검색을 통해 궁금증을 해결하는 것이 좋아요!!

실습적인 내용에 대한 궁금증은 최대한 생각을 해보고 검색을 하는 것이 좋아요!!

'Programming > C' 카테고리의 다른 글

[C] 변수의 유효범위 ( 미완성 )  (0) 2018.05.29
[C] 배열(Array)  (0) 2018.05.24
[C] 함수  (0) 2018.05.15
[C] 반복문  (0) 2018.05.06
[C] 조건문  (0) 2018.05.04


눈으로 하는 코딩이 아닌! 직접 타이핑하는 코딩은 실력 향상에 엄청난 도움이 됩니다.




안녕하세요! 정선생이예요. 오늘은 함수에 대해서 알아볼겁니다! 이 함수라는 것은 우리가 앞서서 많이 사용해봤어요.

printf()도 함수고 scanf()도 함수예요. c에서 제공해주는 함수인거죠. 이 외에도 되게 많답니다 :)

함수(Function)는 '첫 번째 집합의 임의의 한 원소를 두 번째 집합의 오직 한 원소에 대응시키는 대응 관계' 라는 수학적인 정의예요. 수학적인 정의도 좋지만 일단 프로그래밍에서의 함수 개념을 알아야겠죠?


독립되어 있는 프로그램의 일부분을 모듈(Module)이라고 해요. 이 모듈을 사용하는 프로그래밍 기법을 모듈러 프로그래밍 이라고하구요.

예를 들어서 블록쌓기를 생각해보시면 좋아요.


어떤 느낌인지 아시겠나요? 이 프로그래밍의 장점이 있어요.

  • 각 모듈들은 독자적으로 개발이 가능하다.
  • 다른 모듈과 독립적으로 변경이 가능하다.
  • 유지 보수가 쉬워진다.
  • 모듈의 재사용이 가능하다.
제가 이걸 왜 말씀드렸냐면, C에서는 모듈이란 개념을 함수랑 동일시한다는 겁니다. 함수(Function)는 특정한 작업을 수행하는 독립적인 부분이예요. 모듈이랑 비슷하죠? :) 함수에는 기본적으로 제공해주는 함수와 사용자가 직접 정의해서 쓰는 사용자 정의 함수가 있어요. 사용자 정의 함수에 대해서만 알아볼거예요.

일단은 함수가 왜 필요한지가 중요하겠죠? 소스코드로 보여드릴게요.
#include <stdio.h>

int main() {
    int i;
    for(i = 0; i < 10; i++)
        printf("*");
    for(i = 0; i < 10; i++)
        printf("*");
    for(i = 0; i < 10; i++)
        printf("*");
    return 0;
}

코드롤 보시면 같은 작업을 3번이나 반복하네요. 중복되는 부분을 하나의 모듈로 빼서 정의하는거예요. 다음과 같이요


#include <stdio.h>
void print_star(){
    int i;
    for(i = 0; i < 10; i++)
        printf("*");
}
int main() {
    int i;
    print_star();
    print_star();
    print_star();
    return 0;
}

어때요 훨씬 더 깔끔해진게 보이나요? ^.^


main문에서 print_star(); 이 구문은 print_star() 함수를 호출한다. 라는 뜻이예요.


함수는 두 가지의 정의를 가질 수 있어요. 위의 코드처럼 선언과 동시에 함수의 내용을 작성하는 방법(무조건 main 함수 위에 있어야해요.) 함수에 대한 정의만 해놓고 main 함숨 아래에다가 함수의 내용을 작성하는 방법이 있어요.

후자의 얘기는 코드로 보여드릴게요

#include <stdio.h>
void print_star(); // 함수 원형(Function prototype)이라고 합니다.
int main() {
    int i;
    print_star();
    print_star();
    print_star();
    return 0;
}
void print_star(){
    int i;
    for(i = 0; i < 10; i++)
        printf("*");
}

이해 되셨나요? :) 


초반에 main 함수에 대한 설명을 드릴때 함수의 구조를 대강 알려드렸는데 여기서 자세하게 말씀드려볼게요.

반환형(Return type), 함수 헤더(Function header), 함수 몸체(Function body)로 구성되어 있어요.


반환형 함수이름(매개변수){

    함수의 내용

}


예시로 봐볼게요. 두 개의 정수를 매개변수로 받아서 두 정수의 합을 구해서 반환해주는 함수를 작성해보죠

#include <stdio.h>
// main함수에서 add(5, 3) 은
//add함수에서 x를 5, y를 3으로 정의하고 사용하겠다.는 뜻
int add(int x, int y){
    int result;
    result = x + y;
    return result;
}
int main() {
    printf("5 + 3 = %d\n", add(5, 3));
    return 0;
}

add라는 함수에서 [    int add(int x, int y)    ] 부분은 함수 헤더라고 하구요 맨 앞에 있는 [   int    ]는 반환형이라고 해요. 그 아래 함수의 내용은 함수 몸체라고 합니다.



반환형의 종류에는 int, long, short, double, float, char, char *, void, ... 등이 있습니다. 변수 선언할 때의 자료형과 비슷하네요 :)



그런데 void라는 반환형은 무엇이냐면, 아무것도 없다는 소리예요. 즉 반환하는 값이 없다. 라는 것이 되겠죠?

그러나 해당 함수를 종료시키려면 return;만 작성시켜주면 되요. 다음과 같이요.

#include <stdio.h>
void print_star(){
    int i;
    for(i = 0; i < 10; i++){
        if(i == 5)
            return ;
        printf("*");
    }
}
int main() {
    print_star();
}

매개변수에는 변수를 넣을수도 있어요. 자료형에 맞는 것을 넣어줘야합니다. int라면 int를 매개변수로, double이라면 double을 매개변수로 넣어줘야합니다.


함수를 작성하다보면 조건을 통해 return이 달라지게끔 하고 싶어요. 최댓값을 출력하는 함수를 작성해보죠.

#include <stdio.h>
int get_max(int x, int y){
    if(x>y) return x;
    else return y;
}
int main() {
    int x, y;
    scanf("%d %d", &x, &y);
    printf("max(%d, %d) => %d\n", x, y, get_max(x, y));
}

해당 예제는 각각의 case마다 return이 꼭 존재해야한다는게 중요한 포인트여서 보여드리는거예요.

if -> return;

else -> return;

이런 방식으로 작성이 되어야해요. 

int fun(){

    if(조건)

        return;

    else if(조건)

        ~~~~

    else

        return ; 

}

이렇게 else if(조건)의 내용에 return이 존재하지 않고 함수가 끝난다면 최소한 컴파일 warning이 뜨고 99%이상으로 컴파일 error가 뜰껍니다.

제가 방금 말씀드렸던 각각의 case마다 return이 존재해야하는 이유인거죠.


이번 게시글에서 준비한 내용은 여기까지입니다. 마지막으로 함수를 사용하는 이유에 대해 정의를 하고 마무리를 짓도록할게요 :) 모두 고생하셨습니다!!

  • 소스 코드의 중복을 없애준다.
    • 한 번 만들어진 함수를 여러 번 호출하여 사용할 수 있다.
  • 한 번 작성된 함수를 다른 프로그램에서도 사용할 수 있다.
  • 복잡한 문제를 단순한 부분으로 분해할 수 있다.


이번 게시글의 문제~!

 문제

정선생은 3가지의 숫자를 입력 받아 중간값을 출력하는 프로그램을 작성하려한다. 중간값을 구하는 함수를 구현하라.

(main함수에는 scanf()와 printf(), 함수를 호출하는 구문만 있어야한다.)

 입력

30 50 40

 출력

40




P.S - 더 자세하게 다뤄야 되는 내용이 있다면 바로바로 추가해서 올리도록할게요.




게시글을 보시다가 궁금한 내용, 이게 맞나? 하는 내용, 이건 틀렸어!하는 내용들은 과감하게 댓글 달아주시면 감사하겠습니다.


이론적인 내용에 대한 궁금증은 검색을 통해 궁금증을 해결하는 것이 좋아요!!

실습적인 내용에 대한 궁금증은 최대한 생각을 해보고 검색을 하는 것이 좋아요!!

'Programming > C' 카테고리의 다른 글

[C] 배열(Array)  (0) 2018.05.24
[C] 재귀함수(Recursion)  (0) 2018.05.22
[C] 반복문  (0) 2018.05.06
[C] 조건문  (0) 2018.05.04
[C] 변수와 형식지정자  (0) 2018.04.30
전체적인 문제의 조건 : 적절한 조건문과 반복문을 활용하여 해결하기.


일반 문제

 문제

원하는 구구단을 입력하면 그에 맞는 구구단을 출력한다.( 숫자의 제한은 1이상이여야 한다. )

 입력

3

 출력

3*1=3

3*2=6

3*3=9

3*4=12

3*5=15

3*6=18

3*7=21

3*8=24

3*9=27




심화 문제

 문제

구구단 표를 출력하라.

결과는 예시와 같다.

 입력

(존재하지 않음)

 출력

1단    2단    3단

4단    5단    6단

7단    8단    9단




'Programming > Problem' 카테고리의 다른 글

[Problem] 피라미드  (0) 2018.05.08
[Problem] 소수  (0) 2018.05.08
[Problem] 약수  (0) 2018.05.08
[Problem] 숫자 분할 / 큰 값 출력  (0) 2018.05.08

전체적인 조건 : 적절한 반복문과 조건문을 사용하여 프로그램을 작성하라.



 문제

라인의 수를 입력하여 해당 라인만큼의 직각 삼각형을 그리시오.

 입력

3


5

 출력

  *

 **

***


    *

   **

  ***

 ****

*****




 문제

위의 문제를 변형하여 피라미드를 출력하시오.

 입력

3


5

 출력

  *

 ***

*****



    *

   ***

  *****

 *******

*********


'Programming > Problem' 카테고리의 다른 글

[Problem] 구구단  (0) 2018.05.09
[Problem] 소수  (0) 2018.05.08
[Problem] 약수  (0) 2018.05.08
[Problem] 숫자 분할 / 큰 값 출력  (0) 2018.05.08
전체적인 조건 : 적절한 반복문과 조건문을 사용하여 문제를 해결 할 것.

 문제

1과 자기 자신을 제외한 약수는 존재하지 않는 숫자를 소수라고 한다. 정선생은 입력 받은 숫자가 소수인지가 궁금해졌다. 입력 받은 숫자가 소수인지 판별하는 프로그램을 작성하라.

단, 입력 받은 숫자는 정수형이다.

 입력

20

19

 출력

소수가 아닙니다.

소수입니다.




(어렵다면 생략)

 문제

정선생은 앞서 만들었던 소수 프로그램을 조금 더 업그레이드 하고 싶어졌다. 3 이상의 숫자 하나를 입력 받으면 1부터 해당 숫자까지 소수들을 출력하는 프로그램을 작성하라.

 입력

2

17

3

 출력

3 이상의 숫자를 입력하세요

2 3 5 7 11 13 17

2 3


'Programming > Problem' 카테고리의 다른 글

[Problem] 구구단  (0) 2018.05.09
[Problem] 피라미드  (0) 2018.05.08
[Problem] 약수  (0) 2018.05.08
[Problem] 숫자 분할 / 큰 값 출력  (0) 2018.05.08
전체적인 조건 : 조건문과 반복문을 적절히 사용하여 해결한다.

 문제

어떤 수를 나누었을때 나누어 떨어지게 하는 자연수를 약수라고 한다. 입력 받은 숫자의 약수를 출력하는 프로그램을 작성하라. 

 입력

12

5

15

 출력

1 2 3 4 6 12

1 5

1 3 5 15




다음 문제에서 2개의 입력으로 2줄의 출력이 나온다.

 문제

주어진 두 숫자의 공통된 약수 중 가장 높은 약수를 두 수의 최대공약수라고 하고, 두 숫자의 공통된 배수 중 가장 낮은 배수를 두 수의 최소 공배수라고 한다. 두 수가 주어지면 최대 공약수와 최소 공배수를 구하는 프로그램을 작성하라.

단 입력 받는 두 숫자는 정수형이다.

유클리드 호제법을 이용한 최대 공약수, 최소 공배수 공식은 다음과 같다.

GCD(a, b) = GCD(b, r)              [ r = (a % b) ]

LCM(a, b) = a * b / GCD(a, b)

 입력

10 20


20 10

 출력

GCD : 10

LCM : 20


GCD : 10

LCM : 20


'Programming > Problem' 카테고리의 다른 글

[Problem] 구구단  (0) 2018.05.09
[Problem] 피라미드  (0) 2018.05.08
[Problem] 소수  (0) 2018.05.08
[Problem] 숫자 분할 / 큰 값 출력  (0) 2018.05.08

문제의 전체적인 조건 : 배열은 쓰지 말 것. 기초 연산만으로 해결 할 것.


일반 문제1.

 문제

정선생은 문득 입력 받은 세 자리 숫자를 분할하고 싶어졌다. '123'을 입력하게 된다면 '1 2 3'으로 분할하는 프로그램을 작성하라.

단, 입력 받는 세 자리 숫자는 정수형이다.

 입력 

123

345

 출력

1 2 3

3 4 5


앞으로의 문제에서 입력과 출력은 특별한 조건 없다면 1:1로 대응합니다.

즉 '123'을 입력으로 넣으면 '1 2 3' 이라는 출력이 나와야하고, '345'를 입력으로 넣으면 '3 4 5'가 출력으로 나와야합니다.



일반 문제2.

 문제

정선생은 2개의 숫자를 입력 받아 큰 값을 먼저 출력하고 싶다. '20 30'을 입력하게 된다면 '30 20'이 출력이 되어야 합니다.

단, 입력 받는 숫자 2개는 정수형입니다.

 입력 

10 20

30 10

 출력

20 10

30 10



심화 문제.

 문제

방금 일반 문제2에서 풀었던 문제에 숫자 하나를 더 추가해서 3개의 숫자를 정렬하고 싶다. 그러나 아직 배열을 배우지 않은 상황이라 배열을 쓰지 않고 문제를 해결해야한다.

 입력

10 30 20

40 10 20

 출력

30 20 10

40 20 10



Enjoy Coding~! :)

'Programming > Problem' 카테고리의 다른 글

[Problem] 구구단  (0) 2018.05.09
[Problem] 피라미드  (0) 2018.05.08
[Problem] 소수  (0) 2018.05.08
[Problem] 약수  (0) 2018.05.08



html에 대한 게시글들은 최종적인 html 결과물을 보여드리고 어떻게 만들어가는지를 설명해드릴꺼예요.

눈으로 하는 코딩 말고!! 직접 타이핑하는 코딩을 하시면 실력향상에 무척이나 도움이 된답니다.^^7


기본 태그 소개


<table>

표 형태의 데이터를 표시하는 데 사용되는 태그이다.

<tr>

Table Row의 약자. 하나의 행을 표현한다.

<td>

Table Data의 약자. 행 안의 데이터를 표현(하나의 셀이라 봐도 무방)

<th>

Table Header의 약자. 테이블 열제목. 첫 번째<tr>~</tr> 사이에 위치한다.

<caption>

테이블의 제목을 삽입하는 태그.

border 속성

테이블에 경계선을 만드는 속성

colspan 속성

열을 병합한다.

rowspan 속성

행을 병합한다.



안녕하세요 정선생이예요~ 이번 게시글에서는 표를 표시해주는 테이블 태그에 대해 알아볼꺼예요.

테이블은 초기의 웹페이지에서는 전체 페이지 레이아웃을 지정할 때 많이 사용했어요.

그렇지만 HTML5로 넘어오면서 부터는 단순히 표를 표현 할 때만 사용하는 것 같아요.



오늘의 결과물입니다!!



결과물의 코드예요.


일단 표는 <table>~</table> 로 표현을 합니다.

그리고 각 하나의 행을 표현해주는 태그는 <tr>~</tr>예요.

하나의 행을 표시했다면 그 행에 데이터를 넣어줘야겠죠? 그 데이터를 넣게 해주는 태그는 <td>~</td>예요.


그렇다면 기본적인 틀은 아래와 같겠죠?

<table>

    <tr>

        <td>데이터!!!</td>

    </tr>

</table>


그리고 table 태그 속에서 속성이 몇 가지가 있는데 자주 쓰이는 것을 소개해드릴꺼예요. ( 그렇지만 css로 정의하는 것이 원칙이예요. )

<table border=?> 이 속성은 테이블(표)의 라인, 즉 경계선을 얘기해요. 이 경계선 크기를 ?로 설정해주겠다는 것이예요. ?에는 숫자가 들어가요.

<table width=?> 이 속성은 표 전체의 가로길이를 ?로 지정하겠다. 이구요

그렇다면 세로도 있겠죠? <table height=?> 예요. ^^


그리고 테이블에서 가장 중요한 내용!!

rowspan 속성과 colspan 속성이예요.

rowspan은 현재 위치에서 아래로 가면서 행을 합쳐버려요. 예제를 봐보시면 아하! 하실꺼예요

colspan은 rowspan의 반대니까, 열을 합쳐버리는거겠죠? 이건 아래로 갈 수 없으니 현재 위치에서 오른쪽으로 가요.

셀들을 합친다는 얘기를 병합한다. 라고해요. 엑셀류에서 많이 쓰는 용어죠? :)


각 셀들에 다른 태그들을 넣을 수도 있어요.

예를들면 사진을 넣을 수도 있죠.


<table>

    <tr>

        <td><img src="경로"></td>

    </tr>

</table>


리스트도 가능하고, 추후에 배울 비디오라던지, 오디오라던지, 등등. 다른 태그들을 사용 할 수 있어요.

활용 할 수 있는 부분이 되게 많죠?? 그만큼 기본적인 구조만 잘 알아두면 어디든 활용 할 수 있다는 사실!




테이블은 여기까지 준비해봤어요. 어렵지 않은 부분이라 직접 코딩 해보면서 결과물 확인하시면 금방 이해하실거예요!!

모두 고생하셨습니다 ^^7





게시글을 보시다가 궁금한 내용, 이게 맞나? 하는 내용, 이건 틀렸어!하는 내용들은 과감하게 댓글 달아주시면 감사하겠습니다.


이론적인 내용에 대한 궁금증은 검색을 통해 궁금증을 해결하는 것이 좋아요!!

실습적인 내용에 대한 궁금증은 최대한 생각을 해보고 검색을 하는 것이 좋아요!!

'WEB > HTML' 카테고리의 다른 글

[HTML] 리스트, 링크 관련 태그  (0) 2018.04.24
[HTML] 텍스트 관련 태그  (0) 2018.04.08
[HTML] 문서편집기  (0) 2018.04.06
[HTML] 기본 구조  (0) 2018.04.06

+ Recent posts