반응형

아래 예제는 유저가 줄의 갯수를 입력하면 갯수만큼 삼각형의 *을 만들어준다.

 

(scanf 가 에러 발생시 아래 참고)

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

 

[Visual Studio 2019] 비주얼 스튜디오 2019 scanf_s 오류, scanf 사용하기 변경

예전에는 scanf 를 상용함에 있어 문제가 없었는데, 비쥬얼스튜디오가 계속업그레이드가 되면서 scanf_s를 사용하지 않으면 오류를 일으킨다. 따라서 이 에러를 해제 시키고 예전처럼 scanf를 사용

ansan-survivor.tistory.com

 

#include <stdio.h>


/* 입력받은 수 만큼 별표 출력 */
int main(void)
{
	int input = 0;
	int i = 0, j = 0, k = 0;

	printf("라인수 입력 : ");
	scanf("%d", &input);

	i = input;
	for (i; i > 0; i--)
	{
		j = i - 1;
		for (j; j > 0; j--)
		{
			printf(" ");
		}

		k = 2 * (input - i) + 1;
		for (k; k > 0; k--)
		{
			printf("*");
		}
		printf("\n");
	}

	return 0;
}

(실행 결과)

20줄 입력시

5줄 입력시

 

(단순 하나의 별 막대는 아래 참고)

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

 

[C언어] c언어 입력한대로 막대 별찍기

유저가 막대의 갯수를 1~50개 사이로 입력하면 별 막대가 생성됨. #include int main() { int i, j, x; int k; i = 1; for (j = 0; j < i; j++) { printf("막대의 높이(종료: -1):"); scanf("%d", &x); if (x < 1..

ansan-survivor.tistory.com

 

 

반응형
반응형

 

C언어로 간단하게 달력 만드는 코드이다.

필요하면 수정해서 사용한다.

 

전처리기에 #define 에 달의 일수가 30인지 31일 인지 정하면 된다.

 

#include <stdio.h>
#define START_DAY 1      // 첫째날이 수욜(3)
#define DAYS_OF_MONTH 31 // 달의 일수 31일까지

int main(void)
{
	int day, date;

	printf("===========================\n");
	printf("일 월 화 수 목 금 토\n");
	printf("===========================\n");

	for (day = 0; day < START_DAY; day++)    //  1일 시작전까지는 공백으로 체움. day=0 일욜~day=7 토욜
	{
		printf("   ");
	}
	for (date = 1; date <= DAYS_OF_MONTH; date++)  // DAYS~초기값 31
	{
		if (day == 7)
		{
			printf("\n");
			day = 0;
		}
		day++;
		printf("%2d ", date);

	}
	printf("\n");

	return 0;
}

 

 

(결과)

 

반응형
반응형

2차원 배열은 선언하고 출력하는 방법은 아래 참고.

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

 

[C언어] C언어 2차원 배열 선언 및 초기화

아래와 같이 2차원 배열 형태로 선언할 수 있다. 그렇다고 실제 메모리 주소값이 저렇게 생긴 것이다 아니다. 메모리 주소값은 아래와 같이 byte가 증가하며, 다음 배열은 그 뒤에 이어서 쭉 증가

ansan-survivor.tistory.com

 

 

배열의 크기를 보는 방법에 대한 예시

sizeof 로 크기를 확인하는데, 확인 방법과 해석은 아래와 같다.

#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씩 차이.
	[ ] [ ] [ ] [ ] 4x4 = 16
 	[ ] [ ] [ ] [ ] 4x4 = 16
	[ ] [ ] [ ] [ ] 4x4 = 16
	16+16+16 = 48
	즉, arr1[3][4]의 2차원 배열의 크기는 48 byte
	*/


	printf("세로7 가로9: %d \n", sizeof(arr2));

	return 0;
}

int는 4 byte 이므로 int 배열 [3][4] 이면 Row(가로줄) 3줄, Column(세로줄) 4줄이다.

그러면 그림을 아래와 같이 표시할 수 있다.

[ ] [ ] [ ] [ ] 4개 x 4byte = 16
[ ] [ ] [ ] [ ] 4개 x 4byte = 16
[ ] [ ] [ ] [ ] 4개 x 4byte = 16

모두 합치면 총 48 byte.

 

단, PC의 OS별 int 기준 크기가 다를 수 있다.

반응형

(결과)

 

32bit PC 기준 byte 크기

출처: https://myblog.opendocs.co.kr/archives/1230

byte 크기에 대한 자세한 정보는 아래 블로그 참고

https://myblog.opendocs.co.kr/archives/1230

 

[C++ 정리] 자료형의 크기 및 범위 | Opendocs

__int64 8 byte -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

myblog.opendocs.co.kr

 

 

 

 

반응형
반응형

 

const 선언이 갖는 의미, 안정성.
const 선언은 추가적인 기능을 제공하기 위한것이 아니라,
코드의 안정성을 높이기 위한 것이다. 따라서 이러한
const의 선언을 소홀히 하기 쉬운데, const선언과 같이
코드의 안전성을 높이는 선언은 가치가 매우 높다.
즉, 내가 상수라고 생각하는, 즉 값이 바뀌지 않는다는 값
반드시 const선언을 해서 안전성을 높이는 습관을 갖도록 하자.

 

예를들면 아래 pi 값은 누가 뭐래도 3.1415... 으로 정해져 있는 상수값이다.

이 pi의 값을 실수로 누군가 pi라는 변수를 사용해서 바뀌는 것을 방지.

#include <stdio.h>

int main()
{
	const double PI = 3.1415;  // PI는 영원히 3.1415이다. 어떠한 경우에도 값이 바뀔일이 없는데, 이런 경우 const를 선언해서 나중에 PI값에 실수를 하는 것을 막아준다.
	double rad;

//	PI = 3.1454;  즉, 이와 같이 값에 이상한 값을 실수로 넣는 것을 방지.
	

	return 0;
}

 

 

<포인터에서 갖는 const 선언에 대한 의미>

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

 

[C언어] C언어에서 포인터 Const 선언이 갖게 되는 의미

C언어에서 Const 로 선언 하는 부분에 있어서는 특별하다. 어떤 특정 변수를 바뀌지 않는 "상수"로 선언하는 부분에 있어 보통 사용한다. 보통은 해당 코드에 대한 "안전성"을 위해 선언한다. 자세

ansan-survivor.tistory.com

 

반응형
반응형

보통 흔히 선언하는 int, float 등은 현재 컴퓨터의 자원을 고려하여 컴퓨터가 유동적으로 알아서 해주는데,

임베디드 시스템 등의 제한된 메모리를 갖는 MCU는 그 자원을 최대한 아껴써야 한다.

한정된 자원을 효율적으로 쓰기 위해서는 딱 맞는 메모리를 부여해야한다.

 

임의로 비트를 지정한 선언을 아래와 같이 할 수 있다.

또한 printf문으로 출력시 아래와 같이 할 수 있다.

#include <stdio.h>
#include <Stdint.h>		//메모리를 고정적으로 설정하기 위한 라이브러리.

/*
	이식성을 염두해 둔 코드를 작성할때.
	컴파일러 환경에 따라, char, short, int, long, long long 의 메모리크기가 다르게 설정될 수 있는데,
	이를 강제적으로 고정된 메모리에 할당하게 만들어주는 라이브러리.
*/

int main()
{
	int8_t num1 = -128;                    // 8비트(1바이트) 크기의 부호 있는 정수형 변수 선언
	int16_t num2 = 32767;                  // 16비트(2바이트) 크기의 부호 있는 정수형 변수 선언 
	int32_t num3 = 2147483647;             // 32비트(4바이트) 크기의 부호 있는 정수형 변수 선언
	int64_t num4 = 9223372036854775807;    // 64비트(8바이트) 크기의 부호 있는 정수형 변수 선언

														 // int8_t, int16_t, int32_t는 %d로 출력하고 int64_t는 %lld로 출력
	printf("%d %d %d %lld \n", num1, num2, num3, num4);	 // -128  /  32767  /  2147483647  /  9223372036854775807

	uint8_t num5 = 255;                      // 8비트(1바이트) 크기의 부호 없는 정수형 변수 선언
	uint16_t num6 = 65535;                   // 16비트(2바이트) 크기의 부호 없는 정수형 변수 선언
	uint32_t num7 = 4294967295;              // 32비트(4바이트) 크기의 부호 없는 정수형 변수 선언
	uint64_t num8 = 18446744073709551615;    // 64비트(8바이트) 크기의 부호 없는 정수형 변수 선언

															// uint8_t, uint16_t, uint32_t는 %u로 출력하고 uint64_t는 %llu로 출력
	printf("%u %u %u %llu \n", num5, num6, num7, num8);		// 255  /   65535  /   4294967295  /   18446744073709551615

	return 0;
}

 

 테스트 결과

 

 

 

반응형
반응형

C언어의 선언된 모든 변수 타입별 printf문에서 어떻게 출력되는지, 표준출력의 예를 모아두었다.

정수, 실수, 문자, 문자열 등 여러 C언어의 선언 및 값 저장의 출력 Form

 

#include <stdio.h>

/*
C언어 printf (표준출력) 에 대해.
*/

int main()
{
	int a = 100;
	int A = 123;
	float b = 0.12;
	double B = 0.1234;
	char c = 'c';
	const char * C = "hello world";
	double d = 0.123442123541231;
	double D = 10230.4938593804985;
	float num1 = 0.123123;
	double num2 = 0.321321;
	float * ptr1 = &num1;
	double * ptr2 = &num2;


	printf("%d, %i \n", a, a);		//	[%d , %i] : int형식을 decimal 십진수 출력
	printf("%ld %lld \n", a, a);	//	[%ld, %lld] : int값중 엄청 큰값을 출력
	printf("%o \n", a);				//	[%o] : Octal 8진수 출력
	printf("%x \n", A);				//	[%x] : hexadicimal 16진수 출력
	printf("%X \n", A);				//	[%X] : 16진수 대문자 출력
	printf("%u \n", a);				//	[%u] : unsigned int형 10진수 출력

	printf("%f \n", b);				//	[%f] : float, double 실수 출력, 소수점 6째짜리까지 디폴트로 출력
	printf("%F \n", B);				//	[%F]
	printf("%lf \n", B);			//	[%lf]
	printf("%g \n", b);				//	[%g] : 실수형태를 소수점자리 까지 알아서 잘라서 표현. (%f 와 %e 값의 표현이 귀찮을?, 자동으로 표현하고자 할? 사용)
	printf("%G \n", B);				//	[%G] : 실수형태를 소수점자리 까지 알아서 잘라서 표현.
	printf("%.3f \n", 123.456789);	// [%.3f] : 부동 소수점 3자리 이후 부터 출력

	printf("%e \n", d);				//	[%e] : 10자승 수학연산, 유효숫자 소수점 6자리 이후 10의 자승으로 표현.
	printf("%E \n", D);				//	[%E] : (E 알파벳 대문자 표현)

	printf("%c \n", c);				//	[%c] : character 문자 표현 (아스키코드)
	printf("%s \n", C);				//	[%s] : String 문자열 표현

	printf("%p \n", ptr1);			//	[%p] : void 포인터 표현, 메모리주소를 16진수로 표현
	printf("%p \n", *ptr1);
	printf("%p \n", num1);

	printf("================flag====================\n");
	// % 공백 d 출력, (즉 왼쪽부터 공백을 넣을때) 
	printf(" %8d \n", 1);			// 출력:        1 
	printf(" %8d \n", 1234);		// 출력:     1234
	printf(" %8d \n", 43214321);	// 출력: 43214321

	printf("2. flag에 -를 지정하여 10진수로 출력	: %-8d \n", 123123);	// - 는 출력필드를 왼쪽배치함. (Default는 오른쪽)
	printf("3. flag에 +를 지정하여 10진수로 출력	: %+d\n", 123);			// + 는 언제나 부호필드를 출력
	printf("4. flag 지정하지 않고 8진수로 출력	: %o\n", 123);				//	출려값: 173
	printf("5. flag에 #을 지정하여 8진수로 출력	: %#o\n", 123);			//	출력값: 0173
	printf("6. flag 지정하지 않고 16진수로 출력	: %X\n", 123);			//	출력값: 7B
	printf("7. flag에 #을 지정하여 16진수로 출력	: %#X\n", 123);			//	출력값: 0X7B

	printf("1.flag #을 지정하여 16진수로 출력(소문자)				: %#x \n", 0x123456);		//	출력값: 0x123456
	printf("2.flag #, modifier h를 지정하여 16진수로 출력(대문자)	: %#hX \n", 0x123456);		//	출력값: 0X3456
	printf("3.flag #, width 12 지정하여 16진수로 출력(대문자)		: %#12X \n", 0x123456);		//  출력값: 0X123456
	printf("4.flag #, width 012 지정하여 16진수로 출력(대문자)		: %#012X \n", 0x123456);	//	출력값: 0X0000123456

	//	백스페이스 /b 사용
	printf(" \b  \n");	

	// 특수 문자 출력
	printf("30%% \n", a);		//	%%	:  %(퍼센트)를 출력.
	printf(" \"  \n");			//  \"	:  "(큰따옴표)를 출력
	printf(" \'  \n");			//	\'	:  '(작은따옴표)를 출력
	printf(" \?  \n");			//	\?  :  ?(물음표) 출력
	printf(" \\  \n");			//	\\	:  \(역슬레쉬) 또는 원화표시 출력
	printf(" \n ");				//	개행
	printf(" \r ");				//	캐리지 리턴
	printf("1234\b\b  \n");		//	백스페이스, 
	printf("\a");				//	경고음. 


	return 0;
}

(Visual Studio에서 출력 테스트 결과)

결과를 보면서 어떤식으로 출력되는지 확인해본다.

 

 

 

반응형
반응형

복잡하게 Visual Studio를 설치할 필요 없이 웹에서 바로 컴파일을 하고 코드를 돌려볼 수 있다.

 

https://csacademy.com/workspace/

 

CS Academy

 

csacademy.com

사용방법은 간단하다.

간단한  C언어를 연습 및 테스트 할 때 좋다.

 

1. 언어선택

2. 코드 작성

3. 컴파일

4. 돌려보기

 

(테스트)

반응형

(컴파일 에러 발생시)

고의적으로 c 선언을 누락했을 때

 

 

 

 

 

반응형
반응형

디지털회로의 기초를 배울 때 보통 LED로 실습을 많이 한다.

이 같은 원리를 C언어로 구현해보았다.

 

#include<stdio.h>

int ANDgate(int a, int b)
{
	int output = (a * b);
	return output;
}

int ORgate(int a, int b)
{
	int output = a + b;
	if (output == 2)
		return 1;
	return output;
}

int NANDgate(int a, int b)
{
	int output;
	output = ANDgate(a, b);
	if (output == 0)
		output = 1;
	else
		output = 0;
	return output;
}

int NORgate(int a, int b)
{
	int output;
	output = ORgate(a, b);
	if (output == 0)
		output = 1;
	else
		output = 0;
	return output;
}

int main()
{
	int a = 0;
	int b = 0;
	int result = 0;

	// 입력
	printf("1 또는 0값을 입력하시오:\n");
	scanf_s("%d %d", &a, &b);

	// 예외처리
	if (a > 1 || b > 1)
	{
		printf("잘못 입력하셨습니다.");
		return 0;
	}

	// 결과출력
	result = NORgate(a, b);
	printf("%d", result);


	return 0;
}

 

 

 

 

반응형
1···6789

+ Recent posts