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언어] 포인터 배열 정리

[소스]

#include <stdio.h>

#define print(imsi) printf(#imsi "\t%08x %d\n", imsi, sizeof(imsi))

main()
{

 int imsi_1[2] = { 5, 7 };
 int imsi_2[3] = { 45, 67, 25 };
 int imsi_3[4] = { 27, 34, 87, 25 };

 int *temp[3];

 temp[0] = imsi_1;
 temp[1] = imsi_2;
 temp[2] = imsi_3;


 print(temp);
 print(&temp);
 print(*temp);
 print(temp[0]);
 print(&temp[0]);

}


결과 :

temp    0012ff1c 12
&temp   0012ff1c 4
*temp   0012ff5c 4
temp[0] 0012ff5c 4
&temp[0]        0012ff1c 4


[설명]

1. temp
Temp는 포인터 변수들의 모임인 포인터 배열의 모 배열입니다. 대상체는 temp 배열 전체이므로 12가 출력됩니다.
2. &temp
temp가 저장된 곳의 주소를 출력하라는 뜻으로 사용했지만 temp는 배열명으로써 메모리 할당을 받지 않기 때문에 temp와 같은 값을 출력하게 되지요. 의미상으로는 맞지 않지만 ANSI에서 새로 추가하여 에러는 발생하지 않습니다... 또한 주소 값에 대한 sizeof()이므로 당연히 4가 출력됩니다.
3. *temp
temp가 가리키는 것은 temp[0]입니다. temp는 temp[0], temp[1], temp[2] 전체를 대상으로 하기 때문에 12가 출력되었지만 *temp가 가리키는 대상체는 temp[0]이며 이것이 할당된 메모리 영역은 4바이트이므로 4가 출력됩니다.

Tip) temp 자체에 대한 대상체를 * 연산자를 이용하여 출력하려면 다음과 같이 하면 되겠습니다.

물론 2차원 배열에 대한 주소 값을 받은 상태라면 이것은 행 전체에 대한 크기를 출력해 줄 것입니다.

printf("%d\n", sizeof(*&temp));

4. temp[0]
temp[0]은 포인터 변수이다. temp[0]을 위해서 할당된 메모리 영역은 4바이트이므로 4가 출력됩니다.

5. &temp[0]
temp[0]에 &연산자를 사용하여 메모리를 출력하고 있습니다. 이 메모리에 대한 메모리 할당은 당연히 4바이트이므로 4가 출력되겠습니다.
반응형
728x90
300x250

[C언어] 꼭 알아야 할 배열 포인터

태스트 : Visual Studio 2008.

#include <stdio.h>

main()
{

 int i, j;

 int imsi[3][2] = {{6, 3}, {9, 1}, {7, 2}};

 int (*imsip)[2];

 imsip = imsi;

 for(i = 0; i < 3; i++)
  for(j = 0; j < 2; j++)
   printf("[ %d][ %d] %d\n", i, j, *(*(imsip + i) + j));

 printf("################################################\n");

 for(i = 0; i < 3; i++)
  for(j = 0; j < 2; j++)
   printf("[ %d][ %d] %d\n", i, j, *(imsip[i] + j));

 printf("################################################\n");

 for(i = 0; i < 3; i++)
  for(j = 0; j < 2; j++)
   printf("[ %d][ %d] %d\n", i, j, imsi[i][j]);

 printf("################################################\n");

 for(i = 0; i < 3; i++)
  for(j = 0; j < 2; j++)
   printf("[ %d][ %d] %d\n", i, j, imsip[i][j]);

}


출력

[ 0][ 0] 6
[ 0][ 1] 3
[ 1][ 0] 9
[ 1][ 1] 1
[ 2][ 0] 7
[ 2][ 1] 2
################################################
[ 0][ 0] 6
[ 0][ 1] 3
[ 1][ 0] 9
[ 1][ 1] 1
[ 2][ 0] 7
[ 2][ 1] 2
################################################
[ 0][ 0] 6
[ 0][ 1] 3
[ 1][ 0] 9
[ 1][ 1] 1
[ 2][ 0] 7
[ 2][ 1] 2
################################################
[ 0][ 0] 6
[ 0][ 1] 3
[ 1][ 0] 9
[ 1][ 1] 1
[ 2][ 0] 7
[ 2][ 1] 2


2. 2차원 배열 포인터 변수에 주소 할당

#include <stdio.h>

main()
{

 int imsi[3];

 int *imsip;


 imsip = imsi;


 printf("%d\n", sizeof(imsi));
 printf("%d\n", sizeof(imsip));
 printf("%d\n", sizeof(*imsip));

}


결과

12
4
4

설명 :
imsi[0] + imsi[1] + imsi[2] 이므로 4 + 4 + 4 = 12Byte
imsip, *imsip 는 포인터 변수이므로 무조건 4Byte로 할당됩니다.
반응형
728x90
300x250
[C언어] 포인터 변수 관계

태스트 환경 : Visual Studio 2008.

#include <stdio.h>

main()
{

/* 변수 선언 */

 int imsi;
 int *imsip;

/* 1. 주소 */

 printf("[1. Address]\n");
 printf("IMSI : %#010x\n", imsi);
 printf("*IMSIP : %#010x\n", imsip);

 imsip = &imsi;

/* 2. 주소 */

 printf("[2. Address]\n");
 printf("IMSI : %#010x\n", imsi);
 printf("*IMSIP : %#010x\n", imsip);

 *imsip = 1024;

/* 3. 주소 */

 printf("[3. Address]\n");
 printf("IMSI : %#010x\n", imsi);
 printf("*IMSIP : %#010x\n", imsip);
 printf("Result : %d\n", *imsip);

}

출력 결과 :

[1. Address]
IMSI : 0xcccccccc
*IMSIP : 0xcccccccc
[2. Address]
IMSI : 0xcccccccc
*IMSIP : 0x0012ff60
[3. Address]
IMSI : 0x00000400
*IMSIP : 0x0012ff60
Result : 1024

반응형
728x90
300x250

C언어 입문을 시작합니다.

C언어를 자세히 소개하자면 너무나 방대하므로 이하 생략하겠습니다.
(추후 글에서 소개할 수 있으면 하겠습니다.)
프로그래밍을 빨리 입문하는 방법은 직접 프로그램을 작성해보는 것입니다.

#include <Stdio.h>

main()
{
       printf("Hello, world\n");
}

이 프로그램을 editor(비주얼스튜디오와 같은 프로그래밍 편집기 혹은 메모장 등)로 작성한 다음에 Hello.c라고 저장합니다.

잠깐......
Unix기반에서는 컴파일을 할때는 어떻게 하나요?

cc Hello.cc

라고 입력하면 컴파일이 됩니다.

#include <stdio.h>

라고 써준 부분은 표준 입출력 라이브러리(Stdio.h)를 불러오는 것입니다.

위 프로그램은 함수이름이 main()로 되어 있으므로 메개변수가 없다는 말이 됩니다.
메개변수가 없을 때에도 괄호는 꼭 있어야 합니다.
중괄호 { } 는 문장들을 묶어서 하나의 덩어리(복합문 또는 블록)로 만들어 주는 역할을 합니다.
이것은 PL/1의 DO-END나 Algol, Pascal의 begin-end와 비슷합니다.

printf는 함수를 호출하는 명령어이며
메개변수는 "Hello, World\n" 입니다.

인용부호 사이에서는 줄을 바꾸어 쓰면 안됩니다.

예제2)

#include <Stdio.h>

main()
{
       printf("Hello, ");
       printf("world");
       printf("\n");

}

반응형

+ Recent posts