반응형

enum을 선언하면 한거번에 여러 상수를 선언할 수 있다.

상수에 각각 값을 하나씩 넣을 수 있지만, 만약 앞에 값을 하나 넣고 뒤에 값을 넣지 않으면 자동으로 뒤에 1씩 증가한다.

예를 들어 아래 ga = 1을 넣고 뒤에 상수들을 쭉 입력하면 자동으로 na, da, ra ...에 2,3,4... 입력된다.

반응형
#include <stdio.h>

/*
	열거형 선언하기.
	enumerate : enum
	enum 으로 선언된 값은, 상수형태로 저장되어 어디에서든 사용할 수 있다.
	목적은, 프로그램의 가독성을 높이는데 있다.
	열거형 예제.
*/


enum  // ga의 값만 정해도 뒤부터는 1씩 증가함.
{
	ga = 1, na, da, ra, ma, ba, sa
};


// typedef를 이용.
// 굳이 typedef를 쓸 필요가 없다. 오히려 다수의 상수를 한번에 표현하는 것이 더 의의가 있다.
typedef enum syllable	// 다수의 상수가 동시에 선언. 도레미파솔라시
{
	Do = 1, Re = 2, Mi = 3, Fa = 4, So = 5, La = 6, Ti = 7	//	이렇게 열거하며 값을 넣을 수 있다.
}Syllable;

void Sound(int sy)
{
	switch (sy)
	{
	case Do:
		puts("도~~!");
		return;
	case Re:
		puts("레@@~");
		return;
	case Mi:
		puts("미$$$~");
		return;
	case Fa:
		puts("파~~~~~~!!");
		return;
	case So:
		puts("솔~~~~~~~~~~~~~~!");
		return;
	case La:
		puts("라~~~~~~~~~~~~~~~~~~!!");
		return;
	case Ti:
		puts("시~~~~~~~~~~~~~~~~~~~~~~!!");
		return;
	}
	puts("노래 부릅세");
}

int main()
{
	int tone;
	for (tone = Do; tone <= Ti; tone += 1)	//	다시말해 for(tone = 1; tone <= 7 ; tone += 1) 과 같다. 상수이기 때문에.
	{
		Sound(tone);
	}

	printf("%d, %d, %d, %d, %d, %d, %d \n", ga, na, da, ra, ma, ba, sa);

	return 0;
}

 

결과)

 

 

 

 

 

반응형
반응형

scanf함수가 오작동할 때 아래 참고.

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

 

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

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

ansan-survivor.tistory.com

 

c언어에서 기본적으로 scanf함수를 이용해 유저가 값을 입력하면 ascii 코드로 들어간다.

즉, 만약 1을 입력하면 실제 정수(int) 1이 아니고, "1"의 ascii 코드인 0x31 (Hex코드) 가 들어가게 된다.

출처 : https://shaeod.tistory.com/228 (이재욱님이 만든 ASCII Table - 아스키코드표 이미지입니다.)

그러나 입력한 값을 연산하기 위해서는 실제 int 타입 또는 float 타입으로 변경하여 진행해야 한다.

아래 코드는 입력받은 ascii를 int나, float로 변환시켜주는 예제 코드이다.

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

/*
	atoi 함수,  atoi 함수,  atof함수
	함수 원형:
	int atoi(const char * str);			Aschii코드 -> int
	iong atol(const char * str);		Aschii코드 -> long
	double atof(const char * str);		Aschii코드 -> float  변환
	※ 주의!
		이 함수들은 모두 stdlib.h 에 정의되어 있으므로 불러와야 함 !!!!!!!!!!!!!!
*/

//예제.
int main()
{
	char str[20];
	printf("정수입력: ");
	scanf("%s", str);

	printf("%d \n", atoi(str));

	printf("실수입력: ");
	scanf("%s", str);

	printf("%g \n", atof(str));

	return 0;
}
반응형

(결과)

유저가 정수와 실수를 입력하면 해당 값이 

 

 

 

반응형
반응형

메모리의 구조는 아래와 같다.

아래 0 부터 max는 메모리 주소값이며, max의 값은 OS 또는 PC에 따라 그 값이 다르다.

https://stackoverflow.com/questions/32413193/what-decides-which-structure-a-process-has-in-memory#

우리가 C언어 코드를 작성하면 그 데이터는 " text" 영역에 들어간다.

그리고 선언하는 전역변수, 즉 static 변수는 " data" 역역에 들어간다.

그리고 다음 주소에서는 heap영역이 시작되고, 젤 마지막 주소에는 stack영역으로 서로 거꾸로 데이터를 채워 나간다.

 

아래 코드의 주석은 코드의 진행 순서이다. 순서를 보고 메모리에 저장이 어떤식으로 작동하는지 생각해본다.

#include <stdio.h>

/*
	C언어의 메모리 구조 이해.
	프로그램 실행에 따른 메모리 상태 변화.
*/

int sum = 25;	//	1. 전역변수 할당 => 데이터영역


					
void fct(int n)		//	9. 다시 함수로 진입 ...
{
	int num2 = 12;	//	5. 지역변수 할당. => 4번 stack 그 위에.
}					//	6. 함수가 종료, void이므로 4번 5번 stack 소멸.


int main()			//	2. 메인함수 호출
{
	int num1 = 10;	//	3. 지역변수 할당 => stack 맨 아래.
	fct(num1);		//	4. 매개변수 할당 => stack 그 위에. (함수로 들어감)
	num1++;			//	7. 맨 아래 있던 stack num1이 ++연산을 함.
	fct(num1);		//	8. 다시 num1위에 매개변수 할당.

	return 0;
}



/*
메모리 구조는
	코드 영역		: 실행할 프로그램의 코드가 저장되는 메모리공간 (CPU가 이 영역의 코드를 하나씩 가져다 수행)
	데이터 영역		: (중간에 소멸시킬 필요가 없는 변수를 저장) 즉, 전역변수, static변수가 할당되어 종료가 될때까지 남아있는 변수가 저장.
	hip 영역		: ** 프로그래머가 원하는 시점에 메모리를 할당하고 소멸시킬 수 있는 영역. (변수의 성격을 프로그래머가 정함)
	stack 영역		: (임시로 할당되어 소멸되는 영역) 즉, 지역변수, 매개변수가 할당되어 함수가 종료되면 같이 소멸되는 영역.
으로 나뉘어진다.
	※ 함수 호출 순서가  main -> fct 1번째 -> fct 2번째  이루어지는데,
	   반환 순서는 그에 역순인, fct2 -> fct1 ->  main으로 이루어 진다.
*/

메모리 구조는
코드 영역

  실행할 프로그램의 코드가 저장되는 메모리공간 (CPU가 이 영역의 코드를 하나씩 가져다 수행)
데이터 영역

  (중간에 소멸시킬 필요가 없는 변수를 저장) 즉, 전역변수, static변수가 할당되어 종료가 될때까지 남아있는 변수가 저장.
hip 영역 :

   ** 프로그래머가 원하는 시점에 메모리를 할당하고 소멸시킬 수 있는 영역. (변수의 성격을 프로그래머가 정함)
stack 영역 :

   (임시로 할당되어 소멸되는 영역) 즉, 지역변수, 매개변수가 할당되어 함수가 종료되면 같이 소멸되는 영역.
으로 나뉘어진다.


※ 함수 호출 순서가  main -> fct 1번째 -> fct 2번째  이루어지는데,
   반환 순서는 그에 역순인, fct2 -> fct1 ->  main으로 이루어 진다.

 

 

 

 

반응형
반응형

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

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

 

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

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

ansan-survivor.tistory.com

 

메모리에 100 by 100 선언 후, 유저의 입력을 받아 행렬의 크기를 정한 후 행렬 내 랜덤 값 부여

각 행렬의 값은 10자리수까지 랜덤 부여

각 행의 수를 오름차순 정렬

각 열의 수를 오름차순 정렬

 

결과적으로 1 by 1 부터 max by max 까지 오름차순 정렬

 

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


void get_ran_num(char arr[][100], int N)
{
	int i = 0, j = 0;

	printf("===난수로 배열 채운 결과===\n");
	for (i = 0; i < N; i++)
	{
		for (j = 0; j < N; j++)
		{
			arr[i][j] = rand() % 100;
			printf("%3d ", arr[i][j]);
		}

		printf("\n");
	}
}

// 행을 순차적으로 정렬 시킴
void sort_row(char arr[][100], int N)
{
	int i = 0, j = 0, k = 0, temp = 0;

	for (i = 0; i < N; i++)
	{
		for (k = 1; k < N; k++)
		{
			for (j; j < N - k; j++)
			{
				if (arr[i][j] > arr[i][j + 1])
				{
					temp = arr[i][j + 1];
					arr[i][j + 1] = arr[i][j];
					arr[i][j] = temp;
				}
			}
			j = 0;
		}
		k = 0;
	}

	printf("===== 행 정렬 결과 =====\n");
	for (i = 0; i < N; i++)
	{
		for (j = 0; j < N; j++)
		{
			printf("%3d ", arr[i][j]);
		}
		printf("\n");
	}


}


// 열을 순차적으로 정렬시킴
void sort_column(char arr[][100], int N)
{
	int i = 0, j = 0, k = 0, temp = 0;

	for (i = 0; i < N; i++)
	{
		for (k = 1; k < N; k++)
		{
			for (j; j < N - k; j++)
			{
				if (arr[j][i] > arr[j + 1][i])
				{
					temp = arr[j + 1][i];
					arr[j + 1][i] = arr[j][i];
					arr[j][i] = temp;
				}
			}
			j = 0;
		}
		k = 0;
	}

	printf("===== 열 정렬 결과 =====\n");
	for (i = 0; i < N; i++)
	{
		for (j = 0; j < N; j++)
		{
			printf("%3d ", arr[i][j]);
		}
		printf("\n");
	}

}


int main(void)
{
	// 메모리에 100 by 100 에 기본값 0부여
	char arr[100][100] = { 0 };
	int N = 0;

	srand((unsigned)time(NULL));

	printf("배열의 크기를 입력하세요 : ");
	scanf("%d", &N);

	get_ran_num(arr, N);
	sort_row(arr, N);
	sort_column(arr, N);

	return 0;
}

 

반응형

 

(결과1)

 

(결과2)

 

 

 

 

반응형
반응형

랜덤으로 수를 생성한다 8자리까지.

수가 2개가 되면 양쪽을 비교하여 홀수일 경우 비트연산을 통해 왼쪽으로 이동시킨다.

비트연산 mask 기법을 사용.

 

 

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

/*
	입력받은 8자리 정수 홀수, 짝수 나눠서 내림차순 정렬하기
*/
int main(void)
{
	char input = 0;							// input : rand함수로 부터 입력받는 값
	unsigned int sort_a = 0, sort_b = 0;	// sort_a : 정렬된 정수, sort_b : 입력받은 정수
	unsigned int a = 0, b = 0;				// a, b : 2개의 정수 비교 변수(a - 낮은 자릿수, b- a보다 1자리 높은 자릿수)
	int i = 0, j = 0;						// i, j : for문 조건 변수
	int mask = 0x0000000f;					// mask : 비교한 자릿수를 0으로 채우기 위한 마스크값

	srand((unsigned)time(NULL));

	/*0~9까지 랜덤한 정수를 변수에 입력*/
	for (i = 0; i < 8; i++)
	{
		input = rand() % 10;

		sort_b = sort_b << 4;
		sort_b = sort_b + input;

		sort_a = sort_b;
		printf("%08x\n", sort_b);
	}

	printf("\n");

	/*4bit(nibble) 한자리씩 비교를 위한 for문 */
	for (j = 6; j >= 0; j--)
	{
		/*각각의 자릿수와 그 앞자릿수를 이동시켜서 a와 b에 저장*/
		for (i = 0; i < j + 1; i++)
		{
			a = (sort_a & (15 << i * 4));
			a = a >> i * 4;
			b = (sort_a & (15 << (i + 1) * 4));
			b = b >> (i + 1) * 4;

			/*
			printf("%08x\n", a);
			printf("%08x\n", b);
			*/

			/*a와 b가 홀수인지 짝수인지 구분하여 홀수이면 왼쪽으로 이동*/
			if (a % 2 > b % 2)
			{
				sort_a = sort_a & ~(mask << (i + 1) * 4);
				sort_a = sort_a | a << (i + 1) * 4;
				sort_a = sort_a & ~(mask << i * 4);
				sort_a = sort_a | b << i * 4;
				/*printf("%08x\n", sort_a);*/
			}

			/*a와 b가 홀수 또는 짝수로 같을 때 내림차순으로 정렬*/
			if (a % 2 == b % 2)
			{
				if (a > b)
				{
					sort_a = sort_a & ~(mask << (i + 1) * 4);
					sort_a = sort_a | a << (i + 1) * 4;
					sort_a = sort_a & ~(mask << i * 4);
					sort_a = sort_a | b << i * 4;
					/*printf("%08x\n", sort_a);*/
				}
			}
		}
	}

	printf("======================\n");
	printf("입력된 정수 : %08x\n", sort_b);
	printf("정렬된 정수 : %08x\n", sort_a);
	printf("======================\n");

	return 0;

}

 

(결과1 )

홀수 4자리는 모두 왼쪽으로 이동, 짝수 4자리는 모두 오른쪽으로 이동되었다.

홀수도 내림차순, 짝수도 내림차순 정렬 이다.

(결과 2)

한번 더 돌려도 마찬가지, 홀수가 5개이니, 5개는 왼쪽으로 내림차순 정렬, 짝수 3개는 오른쪽 내림차순 정렬

 

 

(랜덤으로 생성한 숫자를 내림차순 정렬하기)

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

 

[C언어] 랜덤으로 생성한 8자리 수를 내림차순 정렬하기 예제

rand함수를 통해 임의 숫자 8개를 생성 시킨다. 생성시킨 8자리를 내림차순으로 정렬한다. 비트연산을 통해 정렬 #include #include #include /* 비트연산을 통한 랜덤 생성된 8자리 정수 내림차순 정렬하

ansan-survivor.tistory.com

 

 

 

 

반응형
반응형

rand함수를 통해 임의 숫자 8개를 생성 시킨다.

생성시킨 8자리를 내림차순으로 정렬한다.

비트연산을 통해 정렬

 

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

/*
	비트연산을 통한
	랜덤 생성된 8자리 정수 내림차순 정렬하기
*/
int main(void)
{
	char input = 0;							// input : rand함수로 부터 입력받는 값
	unsigned int sort_a = 0, sort_b = 0;	// sort_a : 정렬된 정수, sort_b : 입력받은 정수
	unsigned int a = 0, b = 0;				// a, b : 2개의 정수 비교 변수(a - 낮은 자릿수, b- a보다 1자리 높은 자릿수)
	int i = 0, j = 0;						// i, j : for문 조건 변수
	int mask = 0x0000000f;					// mask : 비교한 자릿수를 0으로 채우기 위한 마스크값

	srand((unsigned)time(NULL));

	/*0~9까지 랜덤한 정수를 변수에 입력*/
	for (i = 0; i < 8; i++)
	{
		input = rand() % 10;

		sort_b = sort_b << 4;
		sort_b = sort_b + input;

		sort_a = sort_b;
	}


	/*4bit(nibble) 한자리씩 비교를 위한 for문 */
	for (j = 6; j >= 0; j--)
	{
		/*각각의 자릿수와 그 앞자릿수를 이동시켜서 a와 b에 저장*/
		for (i = 0; i < j + 1; i++)
		{
			a = (sort_a & (15 << i * 4));
			a = a >> i * 4;
			b = (sort_a & (15 << (i + 1) * 4));
			b = b >> (i + 1) * 4;

			/*a와 b의 값을 비교하여 낮은 자리의 값이 크면 두 자리를 변경*/
			if (a > b)
			{
				sort_a = sort_a & ~(mask << (i + 1) * 4);
				sort_a = sort_a | a << (i + 1) * 4;
				sort_a = sort_a & ~(mask << i * 4);
				sort_a = sort_a | b << i * 4;
			}
		}
	}

	printf("======================\n");
	printf("입력된 정수 : %08x\n", sort_b);
	printf("정렬된 정수 : %08x\n", sort_a);
	printf("======================\n");

	return 0;

}

(결과)

임의로 랜덤 생성된수와 자동으로 정렬 한 결과

(홀수 짝수를 구분하여 왼쪽 오른쪽 정렬 하고, 내림차순 정렬해주는 예제)

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

 

[C언어] 홀수 짝수 구분하여 sort시키기 예제 (랜덤수 생성, 비트연산)

랜덤으로 수를 생성한다 8자리까지. 수가 2개가 되면 양쪽을 비교하여 홀수일 경우 비트연산을 통해 왼쪽으로 이동시킨다. 비트연산 mask 기법을 사용. #include #include #include /* 입력받은 8자리 정수

ansan-survivor.tistory.com

 

 

 

 

반응형
반응형

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

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

 

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

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

ansan-survivor.tistory.com

 

10진수 숫자를 2진수의 숫자로 변환시켜주는 코드

10진수값을 입력하면 2진수로 변환시켜준다.

비트연산자 << >> 를 이용한 코드

/* 10진수를 2진수로 변환하기(비트 연산자 이용)*/
int main(void)
{
	int integer = 0, i = 0; //integer : 입력받을 10진수 정수, i : 비트 자리, 

	printf("10진수 양의 정수를 입력하세요 : "); //10진수 정수 입력
	scanf("%d", &integer);
	printf("10진수 %d는 2진수로 ", integer);

	for (i = 31; i >= 0; i--) //앞쪽에 0 표기되는 것을 방지하기 위해 2진수가 처음 시작하는 비트 자리 확인
	{
		if (integer&(1 << i))
		{
			break;
		}
	}
	for (i; i >= 0; i--) // 2진수가 시작하는 비트 자리 부터 '&'연산으로 2진수 출력
	{
		if (integer&(1 << i))
		{
			printf("1");
		}
		else
		{
			printf("0");
		}

		if (i%4 == 0) // 2진수를 4자리씩 끊어서 표기
		{
			printf(" ");
		}
	}
	printf("입니다.");
	printf("\n");
}
반응형

(결과)

10진수의 값을 입력받음.

5입력시
24입력시

 

 

비트연산 없이 변환하는 코드.

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

 

[C언어] 10진수를 2진수로 변환, decimal to Binary code

10진수 숫자를 2진수의 숫자로 변환시켜주는 코드 10진수값을 입력하면 2진수로 변환시켜준다. #include /* 10진수를 2진수로 변환하기(goto문, for문 이용)*/ int main(void) { unsigned int integer = 0, sub =..

ansan-survivor.tistory.com

 

 

 

반응형
반응형

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

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

 

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

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

ansan-survivor.tistory.com

 

10진수 숫자를 2진수의 숫자로 변환시켜주는 코드

10진수값을 입력하면 2진수로 변환시켜준다.

#include <stdio.h>

/* 10진수를 2진수로 변환하기(goto문, for문 이용)*/
int main(void)
{
	unsigned int integer = 0, sub = 0, i = 0, k = 0, l = 0, m = 1, n = 0, s = 0;

	printf("10진수를 입력하세요 :");
	scanf("%d", &integer);


	if (integer < 0)
	{
		printf("10진수 양의 정수를 입력하세요 :");
		scanf("%d", &integer);
	}
	if (integer > 0)
	{
		printf("양의 정수 %d는 2진수로 ", integer);
	}

	l = integer;
	sub = integer;
	if (integer == 0)
	{
		printf("양의 정수 0은 2진수로 0입니다.");
	}
	else
	{
	loop:
		m = 1;
		for (i = 1; i >= 0; i++)
		{
			l = l / 2;
			m *= 2;
			if (l == 0)
			{
				printf("1");
				m = m / 2;
				sub = sub - m;
				break;
			}
		}

		n = sub;
		if (sub == 0)
		{
			for (i--; i > 0; i--)
			{
				printf("0");
			}
			l = sub;
			if (sub == 0)
			{
				goto end;
			}
			goto loop;
		}

		else
		{
			for (k = 1; k >= 0; k++)
			{
				n = n / 2;
				if (n == 0)
				{
					break;
				}
			}

			for (i--; i > k; i--)
			{
				printf("0");
			}
			l = sub;
			if (sub == 0)
			{
				goto end;
			}
			goto loop;
		}
	}
end:
	if (integer > 0)
	{
		printf("입니다.");
	}
	printf("\n");
	return 0;
}

(결과)

10진수의 값을 입력받음.

5입력시
24입력시

 

 

비트연산자를 이용한 코드 아래참고

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

 

[C언어] 비트연산자를 이용한 10진수를 2진수로 변환, decimal to binary

(scanf 가 에러 발생시 아래 참고) https://ansan-survivor.tistory.com/899 [Visual Studio 2019] 비주얼 스튜디오 2019 scanf_s 오류, scanf 사용하기 변경 예전에는 scanf 를 상용함에 있어 문제가 없었는데,..

ansan-survivor.tistory.com

 

 

 

 

반응형
1···56789

+ Recent posts