728x90
300x250

[C언어] N! 팩토리얼을 이용한 반복문과 재귀함수

반복문 for, while, do while을 쉽게 이해 및 생각해보기 위해 몇자 적었습니다.
! 팩토리얼을 활용하여 반복문을 작성하겠습니다.


 


 

 

준비물 : 연습장, PC, Visual C++


반복문 연습 문제)
변수 조건)
int i = 1, int n = 4, unsigned long nRes, unsigned long factorial;

1. N! 팩토리얼을 순서도로 설계하시요.



2. 반복문과 함수 형식을 사용하여 구현하시요.

출력값 : 4! = 24

 

 



3. 재귀함수로 구현하시요.

출력값 : 4! = 24



반응형
728x90
300x250

[C언어] main()함수의 인자 활용(명령행 인자 : argc, argv)

C언어 책을 보면 Argv, Argc라는 것이 구구절절 설명되어 있다. 이 부분이 설명되어 있는 영역의 주제는 대분류로 보자면 '함수'영역에 있으며 세부분류에 보면 'main()함수의 인자 활용'이라는 곳에 나오는 부분이다.
나는 먼저 인자라는 말을 '조건'이나 '발생하는 원인 요소'로 바꾸고 설명하겠다.

우리가 CUI를 올리든 GUI를 올리든 기본적으로 발생하는 함수의 조건은 main()이다.
main() 또한 역시나 요소(factor)가 존재한다. 그렇지만 main()함수는 구성하는 각각의 요소가 명확히 정해져 있지 않다.

선수 지식 : 포인터나 배열


1. main()함수를 구성하고 있는 요소가 명확하지 않는 이유는 무엇일까?

그 이유는 main()함수가 운영체제에 의해 실행되는 진입점 역할을 하므로 프로그램의 시작과 종료시 다양한 시스템에서의 운영 환경을 수용할 수 있도록 유연해야만 하기 때문이다.

오늘 실습은 main()함수의 인자 활용이라는 주제이기 때문에 argc, argv라는 함수를 활용하는 실습을 해보겠다.
main()함수에서 argc, argv에 대한 다음과 같은 형태의 원형을 지원한다.
int main(int argc, char *argv[]);

콘솔에서는 다음과 같이 사용된다.




2. Argc, Argv를 담고 있는 헤더는 무엇인가?

#include <stdlib.h>

용어 정리)
1. Argc는 무엇인가?
Argument Count
명령행 개수

2. Argv는 무엇인가?
Argument Vector
명령행 메모리 목록(배열)


3. Argc 단독 사용

#include <stdio.h>
#include <stdlib.h>

int main(int argc)
{

 printf("%d", argc);

}



태스트 결과


1번 : 'ch02_01' 입력했을 때?
출력값 : 1
2번 : 'ch02_01 ' 입력했을 때?
출력값 : 1
설명 : [0][0]은 기본값 ch02_01이므로 1
더불어 파일명이기 때문에 자신 스스로임
3번 : 'ch02_01 1' 입력했을 때?
출력값 : 2
설명 : [1][0]
4번 : 'ch02_01 12' 입력했을 때?
출력값 : 2
설명 : [1][0],[1][1]
5번 : 'ch02_01 12 ' 입력했을 떄?
출력값 : 2
설명 : [1][0], [1][1], [1][2]
빈칸은 \n으로 메모리 주소에 기억이 됩니다.
6번 : 'ch02_01 12 3' 입력했을 때?
출력값 : 3
설명 : [2][0]



4. Argc, Argv

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

 printf("[0][0]\n");
 printf("테스트 1번:%d %c\n", argc, argv[0][0]);

}



태스트 결과


설명 : [0][0]이므로 1개, c는 자기 자신(파일명)을 메모리에 주소로서 처리하고 있음.
예) [0][0] = c, [0][1] = h, [0][2] = 0

보충 설명 : char *argv[]를 char **argv로 쓸 수 있음.
포인터의 포인터(**)는 * 포인터의 주소를 저장하기 위해 사용.
배열로서 해석될 수 있는 영역임.


5. 참고) Argc, Argv, Env 활용


Env는 Environment의 약자로서 환경을 의미합니다.
환경설정 내용을 보기위해 사용하는 인자입니다.
main()함수에서 다음과 같은 형식의 원형으로 사용됩니다.

int main(int argc, char **argv, char **env)

소스

#include <stdio.h>

int main(int argc, char **argv, char **env)
{
 for(;env;env++)
  puts(*env);
}



태스트 결과

반응형
728x90
300x250
[C언어] 제어문(if, switch)

리모컨과 같은 원리로서 사용이 되는 문법입니다.


출력 : a, b의 값에 따른 해당 연산 값 출력

반응형
728x90
300x250

[C언어] strcpy()의 함정

#include <stdio.h>
#include <string.h>

main()
{

 char *ccc;

 strcpy(ccc, "hahaha");

}

포인터와 배열의 관계를 이해하시고 위에 strcpy 함수에 대해 접하시게 된다면 Segment오류로 인해 잠시 고뇌하실것입니다.
혹은 아래와 같이 해결할 수도 있을 겁니다.

#include <stdio.h>
#include <string.h>

main()
{

 char ccc[10];

 strcpy(ccc, "hahaha");

}

strcpy()의 원형을 잠시 소개하자면

char *strcpy(char *s1, const char *s2);
strcpy() 함수는 s1인자로 포인터를 받고 s2도 포인터로 받고 있습니다.
즉 첫번째 인자를 두번째 인자로 넘겨줍니다.

*포인터 변수를 다시 생각해보자면, 포인터 변수로 설정이 된 순간부터 이미 우리도 모르는 사이에 주소영역을 사용하고 있을것입니다. 그렇기에 임시로 받아줄 영역을 찾게 되는 것이 아닐까 생각합니다.

imsi 라는 변수는 프로그램이 실행될 때마다 빈 영역의 주소를 찾아 랜덤으로 검색하게 됩니다.
imsi라는 변수 주소중에 비어있는 영역을 찾기위해 아래와 같이 입력할 수 있습니다.

int imsi;
printf("%#010x", &imsi);

찾은 임시 주소가 0x002bfb10와 같다면 아래와 같이 입력할 수가 있습니다.
<string.h> 해더를 불러오지 않을 경우에 심각한 오류가 발생할 수도 있습니다.
(그렇게 심각하지는 않지만 실행이 안되는 경우가 발생하기에 경고 정도로 받아들이시면 되겠습니다.)

#include <stdio.h>
#include <string.h>

main()
{
     int imsi;
     char *ccc;

     imsi = 0x002bfb10;

     ccc = (char *)imsi;

     strcpy(ccc, "hahaha");
     printf(ccc);

}

반응형
728x90
300x250

[C언어] 교환 Swap 알고리즘

#include <stdio.h>

int main()
{

        int a, b, c = 0;
        int *pa, *pb, *pc;
        int swap;
 
        pa = &a;
        pb = &b;
        pc = &c;

        scanf("%d %d %d", pa, pb, pc);

       if(a > b);
      
       else if(a < b)
       {
              swap = b;
              b = a;
              a = swap;
       }
     
       if(a > c);
      
       else if(a < c)
       {
             swap = a;
             a = c;
             c = swap;
       }

       if(b > c);
      
       else if(b < c)
       {
            swap = b;
            b = c;
            c = swap;
       }

       printf("%d %d %d", a, b, c);

}

[출력]
a , b,  c 대로 정렬됨.

반응형

'소프트웨어(SW) > GNU - C, C++' 카테고리의 다른 글

[C언어] 제어문(if, switch)  (9) 2009.07.23
[C언어] strcpy()의 함정  (8) 2009.07.07
[C++] 입출력 - 표준 출력  (8) 2009.07.04
[C언어] 문자열과 포인터 배열  (156) 2009.06.07
[C언어] 문자열에 대해서  (163) 2009.06.07
728x90
300x250
[C++] 입출력 - 표준 출력

언어를 공부하면서 가장 먼저 접하는 것은 바로 표준 입출력을 통한 데이터의 I.O(Input Output)을 수행하는 과정일 것입니다.
그만큼 표준 입출력은 언어를 이용함에 있어서 가장 중요한 부분이자, 얼마만큼이나 사용하기 편리하고 높은 퍼포먼스를 보여주냐가 언어의 관건이
될수 있겠습니다.


C++언어에서는 버퍼를 통한 표준 입출력을 cout, cin을 이용해서 수행할 수가 있습니다.

cout, cin의 맨 앞자는 character를 뜻하는 것으로 문자의 I.O의 전반을 다룬다는 의미로 볼수가 있습니다.
이들 표준 입출력을 위한 전역 개체는 각각 istream과 ostream 헤더에서 정의된 것으로 C 스타일 함수군보다 I.O가 직관적이고, 안전하게 수행할 수 있도록 도와준다고 할수 있습니다.

따라서 인자를 전달하거나 할 때 cout, cin을 복사하지 않도록 주의하시기 바랍니다.

1. 표준 출력
cout은 <iostream>에 선언되어 있는 표준 출력을 담당하는 전역 개체입니다.
이 개체는 char타입으로 데이터를 출력하는 ostream 클래스의 인스턴스로 표준 출력 장치에 연결되어 출력 업무를 수행합니다.(Buffered I/O)

[예제]

#include <iostream>

using namespace std;

int main()
{

    cout << "This is Wresting\n";
    const char *k = "Wresting";
    cout << "This is " << k << '\n';

}


출력 : This is Wresting
         This is Wresting
반응형

'소프트웨어(SW) > GNU - C, C++' 카테고리의 다른 글

[C언어] strcpy()의 함정  (8) 2009.07.07
[C언어] 교환 Swap 알고리즘  (8) 2009.07.05
[C언어] 문자열과 포인터 배열  (156) 2009.06.07
[C언어] 문자열에 대해서  (163) 2009.06.07
[C언어] 포인터 배열 정리  (134) 2009.06.07
728x90
300x250

[C언어] 문자열과 포인터 배열

태스트 환경 : Visual Studio 2008

이 예제는 일반적인 문자 배열에 대한 메모리 낭비를 직접적으로 보여주는 예제이다.
더불어 strcpy 함수에 대한 비밀까지 자세히 수록하고 있는 예제이다...

#include <stdio.h>

main()
{
 int i;

 char name[5][20];

 strcpy(name[0], "Jung Jae Une");
 strcpy(name[1], "Han Woo Ryong");
 strcpy(name[2], "Byun Ji Ha");
 strcpy(name[3], "Lee Do Geun");
 strcpy(name[4], "Hong Jae Mok");

 for(i=0; i<5; i++)
  puts(name[i]);

}

결과 :
Jung Jae Une
Han Woo Ryong
Byun Ji Ha
Lee Do Geun
Hong Jae Mok

반응형
728x90
300x250

[C언어] 문자열에 대해서

태스트 : Visual Studio 2008

소스

#include <stdio.h>

main()
{

 char *imsip;
 char imsi;

 imsip = 'a';     /* 1번 */
 imsip = "a";     /* 2번 */

 imsi = 'a';       /* 3번 */
 imsi = "a";       /* 4번 */

}

설명 :

1번
: 'a' 문자를 할당하려고 하는 것이다. imsip = 'a';의 의미는 'a'에 해당하는 아스키코드 정수 값을 imsip에 넣으려고 하는 것과 같습니다. imsip에는 주소 외에는 다른 값이 할당 될 수 없으므로 문법적으로 옳지 않습니다.
2번 : "a"라는 문자열이 메모리의 어딘가에 저장되고 이 저장된 주소를 imsip에 대해 할당하므로 맞는 문장입니다. "a"는 뒤에 널 문자가 추가된 문자열이며 문자가 아닙니다.
3번 : 'a'문자를 imsi에 할당합니다. 아스키 정수 값이 imsi에 할당되므로 문법적으로 하자가 없습니다.
4번 : "a"는 문자열이며 문자열은 주소 값을 리턴하므로 "a"가 저장된 곳의 주소가 imsi에 할당됩니다. 물론 메모리 접근 오류이므로 에러가 나타나게 되겠습니다.

반응형

+ Recent posts