반응형

아래 코드를 실행하면 배열 내부의 값들을 모두 출력한다.

for문 내 중간에 있는 i<sizeof(fnd)/sizeof(char) 는 배열안에 갯수를 컴퓨터가 알아서 메모리 크기를 계산하도록

#include <stdio.h>

int main(void)
{
	char fnd[10] = { 0x01, 0x02, 0x03, 0x04, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F };
	int i = 0;

	for (i=0; i<sizeof(fnd)/sizeof(char); i++)
	{
		printf("a is %d\n", fnd[i]);
	}



	return 0;
}

(결과)

 

 

 

 

반응형
반응형

 

C언어 연습으로 유명한 야구게임이 있다.

랜덤 함수가 필요한데, 이는 time.h 를 통해 srand 함수를 사용해야 함으로 import한다.

반응형

이에 대한 코드

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

int main(void)
{
	int u1, u2, u3;
	int c1, c2, c3;
	int strike = 0, ball = 0; // 초기화
	
	srand((unsigned)time(NULL)); // 랜덤 숫자 생성
	
	do{
		c1 = rand() % 10;
		c2 = rand() % 10;
		c3 = rand() % 10;
	}while(c1 == c2 || c2 == c3 || c1 == c3);
	
	printf("Computer : %d %d %d\n", c1, c2, c3);
	
	do{
		strike = ball = 0;
		
		printf("Input : ");
		scanf("%d%d%d", &u1, &u2, &u3); // 3개의 숫자를 입력 받음
		
		// 랜덤의 숫자와 입력한 숫자가 일치하면 스트라이크 증가 아니면 볼 증가
		if(c1 == u1) strike++;			
		else if(c1 == u2) ball++;
		else if(c1 == u3) ball++;
		
		if(c2 == u2) strike++;
		else if(c2 == u1) ball++;
		else if(c2 == u3) ball++;
		
		if(c3 == u3) strike++;
		else if(c3 == u1) ball++;
		else if(c3 == u2) ball++;
		
		printf("\n%dS %dB\n", strike, ball);		
	}while(strike != 3);
}

컴퓨터가 랜덤으로 낸 숫자와 내가 쓴 숫자가 일치하면 스트라이크이다. 그 외는 볼이다.

원래는 사용자가 먼저 숫자를 쓰고, 랜덤으로 컴퓨터가 숫자를 생성하는게 맞는데

그것은 위 코드를 변형해서 바꿔보도록 한다.

 

 

 

 

반응형
반응형

보통 C언어에서 자주 사용되는 입력함수는 scanf이고 출력함수는 printf 일 것이다.

그러나 동일 기능을하는 함수가 있다. 입력 fgets 함수, 출력 fputs 함수이다.

 

앞에 f는 "file"을 뜻하고 뒤에 s는 "string"을 뜻한다.

즉, string타입을 갖고 쓰는 함수라고 볼 수 있다.

 

fputs( ) 함수 원형 : int fputs(const char* str, FILE* pFile)

fgets( ) 함수 원형 : int fgets(char* str, int* num, FILE* pFile)

  아래에서 파일대신 stdout과 stdin을 사용했는데, 이는 출력으로 모니터(stdout)을 쓰고, 입력으로 키보드(stdin)를 사용함 의미

#include <stdio.h>

void ClearLineFromReadBuffer(void);

int main()
{
	char perID[7];							//	ex) 880808'\0' 총 NULL을 포함한 7개 배열 메모리 할당.
	char name[10];

	fputs("주민번호 앞 6자리: ", stdout);	//	모니터에 출력 (stdout)
	fgets(perID, sizeof(perID), stdin);		//	최대 크기 7 byte를 키보드(stdin)로 부터 입력 받음.

	/************/
	ClearLineFromReadBuffer();				//	입력 버퍼를 비우기. 그냥 읽어들임. 반환없이.
	/************/

	fputs("이름 입력: ", stdout);			//	모니터에 출력
	fgets(name, sizeof(name), stdin);		//	최대 크기 10 byte를 키보드로 부터 입력 받음.

	printf("주민번호: %s \n", perID);
	printf("이름: %s \n", name);

	return 0;
}

void ClearLineFromReadBuffer(void)
{
	while (getchar() != '\n');		//	문자열의 끝을 알리는 '엔터키'가 들어올때까지 계속 Read가 되어짐. 즉, 버퍼의 값을 사용하지 않고 그냥 버려짐.
}

/*
	함수 원형: int fflush(FILE * stream);
	성공시 0을 반환, 실패시 EOF 반환

	int fflush(stdout);		//	모니터로 출력 될 버퍼를 비우는 함수! (stdout: 모니터 출력을 의미)
							//	**버퍼를 비운다는 것은, 목적지로 빨리 보냄(다 출력시켜라 를 의미)
*/

유저로부터 입력을 받으면 '\n' (엔터키)가 올때까지 계속 버퍼를 비워버리는 함수

반응형

(결과 확인)

 

 

 

 

 

반응형
반응형

보통 C언어 연습시 함수에 전달인자로 일반 변수를 사용했지만, 이번엔 배열을 전달한다.

배열이름 아래 예를 들면 arr1[] 에서, arr1 자체는 포인터이다. 즉 arr1을 출력하면 해당 배열값들이 시작하는 곳에 대한 주소를 가리키고 있다.

 

그래서 배열을 함수 인자로 받을 때 자료형을 포인터로 써야 한다. 아래와 같이 int* param

 

아래 예시는 배열을 함수의 인자로 받아서 그 배열을 출력하는 예제이다.

#include <stdio.h>

/*
	배열을 함수의 인자로 전달.
	참고사항,
		배열내부 index 갯수를 구하는 방법
		-> sizeof(arr1)/sizeof(int)   이런식으로 구하면 된다.
*/

// 배열인자를 받아 배열 내부를 표시해주는 함수 (포인터를 이용)
void ShowArayElem(int* param, int len)
{
	int i;
	for (i = 0; i < len; i++)
		printf("%d ", param[i]);
	printf("\n");
}

int main()
{
	int arr1[3] = { 1,2,3 };
	int arr2[5] = { 4,5,6,7,8 };

	//	배열내부의 index 갯수를 구하는 방법.
	ShowArayElem(arr1, sizeof(arr1) / sizeof(int));
	ShowArayElem(arr2, sizeof(arr2) / sizeof(int));

	return 0;
}

배열 주소와 해당 배열의 사이즈를 인자로 받아서 출력 테스트

 

반응형

 

그러나 배열을 함수에 전달하는 방법은 아래와 같이 쓸 수도 있다. (위와 동일한 기능)

즉 포인터 (* param) 이 아닌, param[ ] 이러한 형태로 배열을 전달 할 수 있다는 것이다.

이는 둘다 동일한 뜻이며, param[ ] 로 작성하면, 코드를 읽는 사람이 "아~ 배열을 전달하구나~"하며 좀 더 가독성을 향상시킬 수 있다.

#include <stdio.h>

/*
	배열을 함수의 인자로 전달.
	참고사항,
		배열내부 index 갯수를 구하는 방법
		-> sizeof(arr1)/sizeof(int)   이런식으로 구하면 된다.
*/

// 배열을 인자로 받는 다른 방법.
// 인자로 배열을 전달 받는다는 느낌을 강하게 어필하기 위해.
void ShowArayElem(int param[], int len)
{
	int i;
	for (i = 0; i < len; i++)
		printf("%d ", param[i]);
	printf("\n");
}

int main()
{
	int arr1[3] = { 1,2,3 };
	int arr2[5] = { 4,5,6,7,8 };

	//	배열내부의 index 갯수를 구하는 방법.
	ShowArayElem(arr1, sizeof(arr1) / sizeof(int));
	ShowArayElem(arr2, sizeof(arr2) / sizeof(int));

	return 0;
}
반응형
반응형

아래 포스팅에서 배열 선언방법과 그 배열의 크기에 대해서 알 수 있다.

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

 

[C언어] C언어 배열의 크기에 대해서, 배열 크기 보기 sizeof 함수

C언어의 배열(Array)는 보통 행렬 Matrix로 비유해서 설명한다. 아래 예시를 보고 어떤식으로 sizeof 의 크기가 나오는지 알 수 있다. sizeof 의 크기는 자료형에 따라 크기가 다르다. char, int, float 등 아

ansan-survivor.tistory.com

 

보통 배열을 선언할 때, 행과 열의 크기를 선언한다. ex)  arr[3][4]  , 3x4 행렬 배열

배열을 선언할 시 위와 같이 행과 열의 크기를 선언하지만,

column 값만 넣으면 나머지 알아서 할당이 된다. (row값 생략 가능)

즉,  arr[ ][3] 이런식으로 선언할 수 있다.

그러면 가로 길이(row)는 내가 넣은값에따라 컴파일러가 알아서 계산을 해준다. 

 

#include <stdio.h>

/*
	2차원배열 크기를 알려주지 않고 초기화 하기.
	** 세로길이(row)만 생략할 수 있다. column은 표시해주어야 함.
	   
*/

int main()
{
	// 2차원 배열의 초기화방법
	// 가로길이에 대한 정보는 반드시 제공해야한다.
	// 그러면 나머지 길이는 컴파일러가 계산해서 넣음.

	int arr1[][4] = { 1,2,3,4,5,6,7,8 };
		/*
		[1 , 2]		세로의 길이 4
		[3 , 4] 
		[5 , 6]
		[7 , 8]
		*/
	int arr2[][2] = { 1,2,3,4,5,6,7,8 };
		/*
		[1, 2, 3, 4]	세로의 길이 2
		[5, 6, 7, 8]
		*/

	return 0;
}

 

만약 column을 생략하고 row만 넣으면 에러때문에 컴파일이 불가능하다.

(결과)

int는 4 byte이므로, 

4 byte x 8개 = 32 byte 사이즈가 나온다.

 

 

반응형
반응형

C언어의 배열(Array)는 보통 행렬 Matrix로 비유해서 설명한다.

아래 예시를 보고 어떤식으로 sizeof 의 크기가 나오는지 알 수 있다.

 

sizeof 의 크기는 자료형에 따라 크기가 다르다. char, int, float 등

아래 예시는 int 자료형이고, int는 크기가 4 byte이다.

#include <stdio.h>

/*
	2차원 배열의 크기 sizeof에 대해서.
*/

int main()
{
	// 2차원 배열의 sizeof 크기 구해보기.

	int arr1[3][4];
	int arr2[7][9];

	printf("세로3 가로4: %d \n", sizeof(arr1));
	/*
	int형이므로 간격 4씩 차이. (int는 4byte 이므로)
	[ ] [ ] [ ] [ ] 4x4 = 16
	[ ] [ ] [ ] [ ] 4x4 = 16
	[ ] [ ] [ ] [ ] 4x4 = 16
	16+16+16 = 48
	즉, arr1[3][4]의 2차원 배열의 크기는 48 byte
	*/


	printf("세로7 가로9: %d \n", sizeof(arr2));
	/*
	int형이므로 간격 4씩 차이. (int는 4byte 이므로)
	[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] 4x9 = 36 
	[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] 4x9 = 36
	[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] 4x9 = 36
	[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] 4x9 = 36
	[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] 4x9 = 36
	[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] 4x9 = 36
	[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] 4x9 = 36
	36+36+36+36+36+36+36 = 252
	즉, arr2[7][9]의 2차원 배열의 크기는 252 byte
	*/

	return 0;
}

 sizeof 결과는 아래와 같다.

 

(추가)

흔이 자료형의 크기를 말할 때 int는 4 byte, char는 1 byte, float는 8 byte 등 으로 얘기하는데, 이는 구체적인 크기가 딱 정해져 있는 것이 아니다. 자료형은 상대적인 크기이며, 해당 CPU가 무엇이냐에 따라 그 크기는 달라진다

위 일반적인 크기는 우리가 대부분 사용하는 개인용 PC기준이기 때문이다. 만약 임베디드 같은 작은 보드의 CPU의 경우는 자원의 양이 한정되어있고, 자료형의 크기 또한 작아진다.

 

C언어의 charshort의 비교 

short : 2 byte

char : 1 byte

출처:&amp;amp;amp;nbsp;https://ddanzimind.tistory.com/32

 

 

* 단순히 어떤 배열의 내부에 몇개의 인덱스가 들어있는지 알고 싶은 경우. (배열 내 인덱스의 길이)

해당 배열을 타입으로 나누면 된다. (아래의 경우는 선언된 배열이 int형일 경우.)

sizeof(arr)/sizeof(int)
반응형
반응형

컴퓨터는 유한한 자원을 사용함으로 무한대 숫자를 표현할 수 없다.

즉 무한대 값이 계속 나오는 부동소수를 표현할 방법이 없다.

 

e: exponent

m : Mantissa (Significant)

따라서 아래와 같이 2바이트로 숫자 2를 base로 하는 em값을 넣어 정확도의 한계를 정해서 실수를 표현할 수 있다. (맨 앞 비트는 부호로만 쓰인다)

단, 실수값 0.0 을 정확히 표현할 수 없다. (0에 수렴하는 근사값이지 정확히 0은 아니다)

왜냐하면 앞의 1.m 은 이미 1을 고정했기 때문에 0이될 수 없고, 뒤 인지 2^e 을 0으로 만들 수 없다.

 

*주의해야할 점은 C언어에서 0 은 "정수"를 의미,  "0.0"은 실수를 의미 함으로 계산시 주의한다.

 

(테스트 결과)

#include "stdio.h"

int main()
{
	int i;
	float num = 0.0;

	for (i = 0; i < 100; i++)
	{
		num += 0.1;
	}

	printf("0.1 다 더한 결과: %f \n", num);

}

맨 끝에 2가 나왔지만, 이는 정확하지 않다. 그 뒤로 쭉 ... 0이 이어질 수 있다.

 

 

 

 

 

반응형
반응형

값의 크기는 아래와 같다.

2진수로 첫번째 비트는 부호를 뜻하고, 나머지 7개의 비트가 해당 값의 크기를 정한다.

 

 

양의 정수는 1byte로 아래와 같이 표현되며 2진법으로 숫자를 표현한다.

 

MSB (맨 왼쪽 끝) 비트는 0일때 양수, 1일때 음수를 뜻한다.

 

  그러면 양의 정수를 음의 정수로 바꾸는 방법.

1. 해당 양의정수를 1의 보수를 취해준다.

2. +1 비트를 더한다.

이런식으로 음의 정수가 나올 때 비트구조가 어떻게 되어있는지 계산할 수 있다.

 

 

반응형
1···3456789

+ Recent posts