반응형

C언어는 문자열을 표현하기 위해 배열(Array)를 활용한다.

 

그리고 문자열을 표현하기 위해 보통 1byte 크기인 'char' 타입을 사용한다.

문자열의 끝은 NULL을 사용한다. (문자열 마지막에 \0 이 있으면 문자열의 끝으로 인식)

고로 문자열의 크기는 마지막 1개가 더 필요하다. ("hello world!"의 경우에는 각 알파벳 + 띄어쓰기 + NULL 하여 총12개 필요)

각 배열에 들어가는 문자 하나하나는 모두 아스키코드이다. (아스키코드 번호임)

 

선언하고 만드는 방법은 아래와 같다.

<타입> <배열이름 [배열크기] >

// NULL과 띄어쓰기를 포함하여 총 13개의 char 크기가 필요
char str[13] = "Hello world!";

배열의 크기는 미리 정하지 않고 배열을 입력하면 알아서 사이즈가 잡히게 된다.

char str2[] = "hello world!";
반응형

아래 예시 코드를 돌려서 크기를 확인

#include <stdio.h>

/*
	배열은 보통 char형을 사용.
	알파벳 하나하나가 배열 한칸에 할당.
	문자열 구조는 맨 끝에 NULL문자( '\n' )가 들어가야 함
*/

int main()
{
	// NULL문자를 포함한 13개 배열이 할당되어야 함.
	char str1[13] = "nice to meet";
	// 배열크기 자동조절, hello NULL 문자 총 6개 배열이 할당됨. str2라는 주소에 값 할당.
	char str2[] = "hello world!";

	printf("배열 크기 : %d", sizeof(str1));
	printf("배열 크기 : %d", sizeof(str2));

	return 0;
}

 

(결과)

 

* 문자열을 scanf로 받는 방법.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	// 아래와 같은 배열명 선언은 배열 변수명 자체가 주소값으로 저장됨.
	char str[50];
	int index = 0;

	printf("문자열 쓰시오. :");
	// 문자열 변수명 str은 그자체가 주소값을 지칭하므로 &없이 사용. 즉, &str 으로 사용하지 않음.
	scanf("%[^\n]", str);
	printf("입력받은 문자열 : %s\n", str);

	printf("문자 단위 출력: ");
	while (str[index] != '\0')
	{
		printf("%c", str[index]);
		index++;
	}
	printf("\n");

	return 0;
}

(결과)

아래에서 scanf에 %[^\n]  을 입력한 이유는, 띄어쓰기 키가 와도 문자열을 계속 이어서 str에 저장하기 위함.

 

 

 

 

 

 

 

반응형
반응형

앞서 재귀함수에 대한 예시를 설명했다.

https://ansan-survivor.tistory.com/1234

 

[C언어] 재귀함수란? 재귀함수 예시, 쉬운 설명

재귀함수란? 영어로 Recursive Function이며, 뜻 Recursive : 반복되는, 되풀이되는 이다. 즉, 자기자신을 호출하여 계속 불러오는 함수. 그러나 말이 너무 어렵다. 함수는 반환이 되어야 비로소 끝이 난

ansan-survivor.tistory.com

 

위에서 설명했던 재귀함수는 그러면 과연 어디에 쓸 것인가?

대표적인 사례로 펙토리얼 계산에 대표적으로 사용된다.

(펙토리얼 계산해주는 사이트)

https://www.inchcalculator.com/factorial-calculator/

반응형
 

Factorial Calculator - Solve n!

Calculate the factorial n! of any positive whole number, plus learn how to use the formulas to solve factorials.

www.inchcalculator.com

 

펙토리얼 계산을 일반항으로 모델링을 하면 아래와 같다.

펙토리얼의 정의

펙토리얼은 계속해서 f(n) 함수 내에서 f(n-1)을 연산 하므로 재귀함수의 성질을 갖고있다.

이를 C언어 재귀함수로 표현이 가능하다는 것이다.

#include <stdio.h>

// Recursive라는 함수를 만듦
int Factorial(int n)
{
    // n이 0이면 1을 리턴
    if (n == 0)
        return 1;
    else
    // n이 0이 아닐 경우 n x f(n-1) 계산을 계속 진행
        return n * Factorial(n-1) ;
}

int main(void)
{
    // 각 펙토리얼 계산 결과 확인
    printf("factorial 3! = %d\n", Factorial(3));
    printf("factorial 5! = %d\n", Factorial(5));
    printf("factorial 10! = %d\n", Factorial(10));

    return 0;
}

 

(결과)

결과가 맞는지는 아래 펙토리얼 계산 사이트를 이용해본다.

https://www.inchcalculator.com/factorial-calculator/

 

Factorial Calculator - Solve n!

Calculate the factorial n! of any positive whole number, plus learn how to use the formulas to solve factorials.

www.inchcalculator.com

 

 

반응형
반응형

재귀함수란?

영어로 Recursive Function이며, 뜻 Recursive : 반복되는, 되풀이되는 이다.

즉, 자기자신을 호출하여 계속 불러오는 함수.

 

그러나 말이 너무 어렵다.

 

함수는 반환이 되어야 비로소 끝이 난다. 그러나 첫번째 함수는 Recursive( )를 만나면 첫번째 함수는 끝나지 않고 계속 자신을 메모리 다른곳에 복사 시켜 또 실행이 된다. 이것은 반복적으로 실행되며, 최종적으로 함수가 마지막에 리턴이 되어야 종료가 된다.

(리턴 조건이 없으면 모든 자원을 다 가져가서 컴퓨터가 맛이 갈것이다)

즉 이러한 호출이 가능한 이유는 바로 메모리에 "복사본을 만들기 때문" 이다.

 

 

* 아래 리턴조건이 들어가 있는 재귀함수의 예시

#include <stdio.h>

// Recursive라는 함수를 만듦
void Recursive(int num)
{
    if (num <= 0)
        return;
    printf("Recursive func num %d\n", num);
    Recursive(num - 1);    // Recursive()함수를 실행 (자신을 다시 실행)
}

int main(void)
{
    Recursive(5);
    return 0;
}

(과정)

아래와 같이 Main함수가 진행하다가 Recursive를 만나서 5값이 입력되면,

Recursive 내 5-1 연산이 반복적으로 4-1 , 3-1, 2-1, ... 1-1 = 0 이 되어 Return 조건에 만족하면

클릭하면 확대

이제 num값으로 0이 계속 입력 되므로 if 조건에 만족한다. 그래서 계속 함수를 빠져나오는 return문을 반복함으로써 처음 시작했던 main이 있던 자리로 가서 main함수를 끝낸다.

클릭하면 확대

 

 

(결과)

반응형

 

 

 

재귀함수의 활용, 펙토리얼 계산 (Factorial calculation)

https://ansan-survivor.tistory.com/1235

 

[C언어] C언어 재귀함수의 활용, 사용 용도, 예제 (재귀함수 팩토리얼 Factorial 계산, n!)

앞서 재귀함수에 대한 예시를 설명했다. https://ansan-survivor.tistory.com/1234 [C언어] 재귀함수란? 재귀함수 예시, 쉬운 설명 재귀함수란? 영어로 Recursive Function이며, 뜻 Recursive : 반복되는, 되풀이..

ansan-survivor.tistory.com

 

 

 

반응형
반응형

* break문, Continue 은 반드시 반복문 내에 있을때 사용이 가능하다.

 

두 함수의 큰 공통점은 남은 작업을 생략하고 조건검사지점까지 검사를 하고, 완전히 반복문을 빠져나갈지, 아니면 반복문 초기상태로 올라와서 다시 할지 차이이다.

break문은 끝내고 while 반복문 밖으로 나가서 나머지 아래 작업들을 계속 진행.
Continue문은 처음 while 반복문이 시작했던 지점으로 다시 돌아와서 작업을 계속 하라는 것.

 

특정 반복문이 계속 될 때, 어느 조건이 만족되면 탈출할 수 있는 문이 break 이다.

아래는 i가 1이 계속 증가하다가 100을 넘어서면 탈출한다.

#include <stdio.h>


int main(void)
{
    int i = 0;

    while (1)
    {
        if (i > 100)
        {
            break;
        }

        i++;
        printf("%d\n", i);
    }



    return 0;
}

(결과)

반응형

 

반면에 continue문은 어떤 조건을 체크했을때 조건이 맞다면 다시 계속 반복하던것을 계속 하라고 할 수 있다.

 

 

 

 

 

 

 

 

 

반응형
반응형

대부분의 조건연산자는 if, else if, else 문으로 분기하여 사용한다.

그러나 잘 쓰지 않지만 (잘 보기 힘들지만) 한줄짜리로 똑같은 역할을 하는 조건연산자를 만들 수 있다.

이를 보통 "삼 항 연산자" 항이 3개인 연산자 라고 하여.. 불린다.

 

사용법은 간단하다.

 

그저 한줄에 =>     ( 조건 ) ? ( a  ) : ( b  ); 이러한 형식으로 입력하면 된다.

그리고 조건이 참이면 왼쪽값 a가 반환되고, 거짓인 경우 오른쪽 b가 반환된다.

#include <stdio.h>


int main(void)
{
    int a = 2;
    int b = 3;

    int result = 0;

    // 조건이 맞냐?  참이면 왼쪽 반환, 거짓이면 오른쪽 반환
    result = (a>b) ? (a) : (b);

    printf("%d\n", result);

    return 0;
}
반응형

 

 

반응형
반응형

C언어 함수의 구조는 

[return 타입] 함수명( [input타입 변수명] )

ex)   int   main(   int a   )

 

 

함수명은 말 그대로 함수 이름 지정.

input 은 이 함수가 실행되기 위한 입력 값을 지정하는것.

return 타입은 이 함수가 연산이되어 return되는 값의 타입.

 

 

C언어 함수 만들기 템플릿은 아래와 같다.

 

<함수 선언>

<Main 함수>

<함수 정의>

 

아래 예를 보면 알기 쉽다.

#include <stdio.h>

// 함수의 선언
int Increment_num(int n);

int main(void)
{
    int a = 2;
    int num;

    num = Increment_num(a);
    printf("%d\n", num);

    return 0;
}

// 선언한 함수의 실제 정의 (몸통)
int Increment_num(int n)
{
    // 위에서 받는인자 n이 오면 증가시켜 리턴
    n++;
    return n;
}

int a 값이 함수에가서 계산되는 형태.

값이 어떻게 연산되는지 순서를 나타냄.

a값의 변화는 없다. a는 단지 함수의 입력인자(input)이 되었을 뿐이다.

그리고 함수는 a에 들어있는 값 2가 연산이 되어 n으로 리턴한다.

리턴된 값 3은 최종적으로 num에 저장된다.

 

아래와 같이 2개 그리고 그 이상의 input인자도 받을 수 있다. 다만 2개 이상의 return은 불가능하다.

아래와 같이 if 문에 맞는 결과를 따로 return하도록 함.

int Increment_num(int n, int m)
{
    if (n > m)
    {
        n++;
        return n;
    }
    else
    {
        m--;
        return m;
    }
}

* 알아두기.

 - 로컬함수 내에서 선언한 변수는 해당 함수가 수행되는 동안 유효하며, 결과를 리턴하면 메모리를 해제 하여 사라진다.

 - 변수를 전체 함수에서 사용하고 싶다면 "전역변수"으로 선언해야 함.

 

반응형
반응형

C언어는 동일한 자료형끼리 연산이 가능하다. 만약 서로 다른 자료형끼리 연산을 한다면 서로 데이터크기(byte)가 다르기 때문에 오차가 발생하여 연산이 불가능하다.

그래서 접미구에 자료형을 붙여 정확한 연산을 할 수 있다. (아래 참고)

https://ansan-survivor.tistory.com/1222

 

[C언어] C언어 소수 자료형 float와 double의 차이점. ('double'에서 'float'(으)로 잘립니다.)

일반적으로 C언어에서의 소수점 자료형 표현은 float와 double을 쓴다. 그런데 크기는 float가 작고, double이 크다. 다시말해 double이 표현할 수 있는 소수점 자리가 많다. (double > float) 그러나 기본적으

ansan-survivor.tistory.com

만약 int a = 3.0 또는 double b = 5를 넣는다면, 자료형이 맞지 않아도 알아서 출력이 된다.

3.0 은 기본적으로 "double" 자료형이지만, a는 int 자료형이기 때문에 자동으로 int로 변환되어 3이 출력된다.

마찬가지로 아래 5도 int 이지만, b가 double이기 때문에 5.000000 으로 출력된 것이다.

 

하지만 C언어에서는 강제로 형변환하는 기능이 있다.

매우 간단하다 그저 앞에 괄호 + 자료형 을 추가하면 된다.

-> (자료형)변수

-> (자료형)값

#include <stdio.h>

int main(void)
{
	// 강제로 형 변환하기
	int a = (int)3.0;
	double b = (double)5;
	
	printf("%d, %f", a, b);

	return 0;
}

 

<알아두기>

 - 바이트가 큰 자료형이 우선시 된다. ( 크기가 큰거(double)와 작은게(int) 있을 때 큰것으로 바뀜 )

 

 

 

반응형
반응형

일반적으로 C언어에서의 소수점 자료형 표현은 float와 double을 쓴다.

그런데 크기는 float가 작고, double이 크다. 다시말해 double이 표현할 수 있는 소수점 자리가 많다. (double > float)

 

그러나 기본적으로 소수점을 아래와 같이 입력하면, 컴파일러는 숫자를 자료형 double로 인식한다.

그러면 연산에 문제가 있다. C언어는 서로 같은 자료형끼리만 연산이 가능하다. (int는 int끼리, char는 char끼리 등등)

하지만 위 연산은 그냥 숫자를 입력하면 해당 숫자는 기본적으로 double 형태의 자료형이 입력된다.

실행하면 아래와 같은 에러를 띄운다.

에러 메세지

그렇다면 내가 저장할 변수의 자료형을 float로 했으니, 계산할 값들도 역시 float값을 넣어야 한다.

그러면 숫자 뒤에 f 또는 F를 넣으면 해당 숫자가 자료형이 double이 아닌 float가 된다.

#include <stdio.h>

int main(void)
{
	float num1 = 5.789f;
	float num2 = 3.24F + 5.12f;


	return 0;
}

위처럼 계산을 하면 이제 에러가 발생하지 않음을 알 수 있다. 서로 같은 자료형이 되기 때문에...

 

그 외 각종 접미사를 통해 자료형을 명확히 지정할 수 있다.

(정수)

접미사 자료형 예시
U unsigned int unsigned int a = 123U
L long long b = 123L
UL unsigned long unsigned long c = 123UL
LL long long long long d = 123LL
ULL unsigned long long unsigned long long e = 123ULL
반응형

(소수)

접미사 자료형 예시
F float float f = 1.23U
L Long double long double g = 1.231L

 

 

 

 

 

반응형
123456789

+ Recent posts