#include <stdio.h>
#define	MAX_COUNT 10

void bubblesort(int arry[] , int cnt)
{
	int step = 0, i = 0, temp = 0, comparison=0;
	char flag = 0;
	for (step = 0; step < cnt -1 ; step++) //총 비교 단계는 항목 -1 
	{
		for (i = 0; i < cnt - step - 1; i++)//단계별로 비교 횟수 =항목의 개수 -1 - 단계 	(단계가 증가할수록 비교횟수는줄어드니깐)
		{
			if (arry[i] > arry[i + 1])
			{
				flag = 1; //값이 바뀌었다면 1로 값을줌.
				temp = arry[i];
				arry[i] = arry[i + 1];
				arry[i + 1] = temp;

				comparison++;//몇번 비교했는지
			}
			
		}
		if (flag == 0)break; //만약 비교시 비교 안되었다면 구문 종료.
	}
	printf("\n\n     compare     %d\n", comparison);
	
}

void main()
{
	int data[MAX_COUNT] = {2,7,1,5,4,11,8,9,21,22};
	printf("\n버블정렬 하기전\n");
	for (int i = 0; i <MAX_COUNT ; i++)
	{
		printf(" %d ", data[i]);
	}

	bubblesort(data, MAX_COUNT);
	printf("\n버블정렬 한 후\n");
	for (int i = 0; i < MAX_COUNT; i++)
	{
		printf(" %d ", data[i]);

	}

}

 

문제

자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.

출력

첫째 줄부터 N번째 줄 까지 차례대로 출력한다.

예제 입력 1 복사

5

예제 출력 1 복사

1 2 3 4 5

출처

  • 문제를 만든 사람: baekjoon
  • 잘못된 데이터를 찾은 사람: rory143

 

#include <stdio.h>
void sum(int N)
{

	int sum = 0, i = 1;
	for (i; i <= N; i++)
	{
		printf("%d\n", i);
	}
	
}



int main()
{
	int N = 0;
	scanf("%d", &N);	
	sum(N); //구할 값 전달
	return 0;
}

'C_Language > one_day-one-cording' 카테고리의 다른 글

11021번: A+B-7  (0) 2019.12.11
2742번: 기찍 N  (0) 2019.12.10
8393번 :합  (0) 2019.12.09
10950번 A+B -3 문제!  (0) 2019.12.08
(2739)구구단  (0) 2019.12.07

안녕하세요 Stimpack 입니다.!  

#include <stdio.h>

void num(short pack)  //매개변수로 pack = stim 
{
	pack = 2 ;     // pack = 2로 생각으로는 stim에 2가 대입될것으로 생각

}



void main()	
{
	
    short stim = 4; 
    num(stim);  //num 함수 호출 매개변수로 stim 전달
    printf("%d",stim) ;  // stim은 4가 아닌 3이 출력!
}​

위에 간단한 예제를 만들어 봤습니다. 

 

c언어에서는 메모리를 직접 주소를 지정하거나 간접적으로 지정할수 있습니다. 

직접적으로 주소를 지정하는 방식은 우리가 흔히 만드는 변수를 정의하는 방법입니다. 

예를 들어 short stim= 4 라고 stim 변수를 초기화 했다면, 

(signed)short 크기의(2byte = 16bits) 자료형에 변수 stim이라는 이름의 공간입니다.

우리는 이 공간 속에 2byte 즉 -32,768 ~ 32,767 값을 넣을수가 있습니다.  (표현범위입니다..저는 저 값들이 다 들어가는줄 알았네요..)

즉 직접적으로 해당 변수 이름을 주면 언제든 그 주소를 호출할수 있습니다. 

 

하지만 함수 범위내에 있는 변수만 사용할수 있고 다른 함수는 호출할수 없습니다. (2번)

(지역변수이기 때문...)

#include <stdio.h>  //2번

void num(short pack)  //매개변수로 pack = stim 
{
	printf("%d", pack); //4 출력 값은 잘 전달받음 .
	pack = 2;     // pack = 2로 생각으로는 stim에 2가 대입될것으로 생각
	printf("%d", pack);  // 2 출력 재 초기화 완료!
}



void main()
{

	short stim = 4;
	num(stim);  //num 함수 호출  stim 값 전달( main함수를 호출자 , num을 피호출자라고한다.)
	printf("%d", stim);  // stim은 2가 아닌 4출력! num 함수에서 값 전달이 안된것을 확인.
}

이러한 문제에 대해 해결하기 위한 방법은 바로! 포인터를 사용하는 것 입니다. 

 

포인터란 하나의 변수를 그 변수가 대신 원하는 다른 변수의 주소의 값을 저장시키는 것 입니다.

즉 다른 변수(메모리)의 주소값을 저장하는 문법입니다. 

가리키는 대상의 자료형을 앞에 적고 다른 변수와 구분하기 위해 * 를 사용해주고 포인터 변수 이름을 적으면 됩니다. 

short * stimpack  short의 자료형 가진 변수를 가리키는 stimpack 이라는 포인터 변수를 만들었습니다.

( 보통 포인터 약자인 ptr이라고 많이 씁니다.)

#include <stdio.h>  //3번

void num(short *stimpack)  //short의 크기의 자료형을 가진 변수를 *stimpack이라는 포인터변수에 주소값을 저장하겠다. 
							//short *stimpack = &stim
{
	*stimpack = 1; //포인터 변수가 가리키는 주소의 값을 1로 바꾸겠다라는 뜻입니다.
}



void main()
{
	
	short stim = 4;
	num(&stim);  //num 함수 호출  stim 주소 값 전달(값이 아닌 stim의 주소값을 전달하겠다는 뜻.)
	printf("%d", stim);  // stim은 4가 아닌 1출력! 간접적으로 주소를 통한 값 변경이기 때문.
}

값이 잘 전달된 것을 확인할수 있습니다. 

포인터는 변수이고,(32bits 운영체제라면 주소값이 4byte이기 때문에 기본적으로 포인터변수 크기는 4byte)

변수이기 때문에 안에 값을 넣을수 있는데 주소값을 넣습니다. 

*stimpack 이라고 선언하면 stimpack 포인터 변수가 가리키는 변수의 값을 바꾸겠다.! 의미입니다. 

만약 stimpack 으로 선언하면 변수이기 때문에 포인터 변수가 가리키고 있는 주소의 값을 바꾸겠다는 뜻입니다. 

* stimpack과 stimpack은 다른 용도로 쓰입니다.

 

'C_Language' 카테고리의 다른 글

메모리 할당  (0) 2020.02.04
stimpack C언어 시작하기  (0) 2018.11.22


  안녕하세요 stimpack 입니다.!    


오늘은 캐스팅에 대해서 알아보는 시간을 갖도록 하겠습니다.! 



자료형에서의 형 변환은 자동 형 변환과 강제 형 변환이 있습니다.


우선 여기서는 포인터를 사용할때 자료형을 강제로 형 변환하는 캐스팅에 대해 알아 보겠습니다.!


char stim= 0x1234를 선언했습니다. 크기가 1byte인 변수기 때문에 정수 1 2 는 짤리고 3 4만 저장되겠죠!


여기서 포인터 변수 cp를 선언하고 stim변수의 주소를 가리키게 선언했습니다.(포인터변수는 32bits운영체제에서 다루는 주소의 크기는 4byte입니다)


하지만 오류가 출력 되는데 이유는 서로의 형이 다르기 때문입니다. 


2019/01/15 - [C_Language] - 20th Tips Programming 4회차 -20190114 (참고하세요)


그래서 강제로 형 변환을 해줍니다. 


short *cp = (short*)&stim;   이렇게 변수앞에 (short*)를 사용해주면 가르키는 대상인 stim 변수를 short으로 형변환 해주게 됩니다.


이러면 밑에 예제를 보시면 에러가 사라집니다.! 




int pack 는 12345678이 저장되고 포인터 *ip는 pack 변수를 가리키게 됩니다. 



cp = (short *)ip;   이렇게 선언해줍니다! (설명은 위에 소스에 있습니다.)


이 명령을 통해 포인터 변수 cp 와 ip는 변수 pack를 가리키게 됩니다. 


이제  printf("%x\n", *(short*)ip);

printf("%x\n", *(int*)cp);

printf("%x\n", *(short*)cp);


명령문을 통해 테스트를 해봅니다.  여기서 *(자료형*)ip 는 가르키는 대상을 원하는 자료형만큼 끊어서 읽게 됩니다.


(c언어는 리틀인디안 방식임으로 데이터가 거꾸로 저장됩니다. )


만약 printf("%x\n", *(short*)ip) 라고 하면 5678이 printf("%x\n", *(int*)ip) 라고 명령하면 12345678이 출력이 됩니다!. 



즉*  (자료형*) 은  포인터변수가 가리키는 대상의 크기를 강제로 형변환.! 

    *(자료형*)은 포인터변수가 가리키는 대상을 원하는 자료형만큼 끊어서 읽기


한번 테스트 해보시기 바랍니다.! 꿀잼.! 

'C_Language > Tips' 카테고리의 다른 글

동적 메모리 할당!  (0) 2019.01.23


  안녕하세요 stimpack 입니다.!    


오늘은 포인터에 대해서 알아보는 시간을 갖도록 하겠습니다.! 


포인터를 배우기전 우리는 자료형과 변수를 선언함으로써 메모리에 데이터를 저장하거나 읽었습니다.! 


사용한 변수들은 컴파일을 통해 메모리 주소로 바뀌어서 사용되었습니다.


이렇게 주소를 저장하는 방식을 직접 주소 지정 방식이라고 합니다.!


사용자가 직접 변수를 선언함으로써 컴파일러에게 주소를 기억해! 라고 명령하는 것과 같습니다.


직접주소를 지정하는 방식에는 한계가 있습니다.


     


(메모리주소는 임의 주소입니다)

위에 소스를 보시면 빌드시 실패한 것을 알수 있습니다.  


error를 보시면 'pack': 선언되지 않은 식별자 입니다. 라고 나옵니다. 이것은 main함수에서만 선언되고 stimpack 함수에서는 선언되지 않았기에 


컴파일러가 main함수를 시작으로 stimpack 함수의 호출로 인해 컴파일시 pack라는 변수가 stimpack 함수안에서 선언되지 않았기에 에러를 


표출하게 됩니다.


즉 pack 변수는 main에서 선언된 지역변수이기 때문에 c언어 문법적으로 다른 지역간에 호출은 불가합니다.! '



물론 매개변수를 이용하여 함수를 호출한다면 main함수에서 선언한 pack변수를 사용하여 값을 변경할수 있습니다.


하지만 pack를 다시 초기화하려고 하면 지역변수이기 때문에 안됍니다..



이때 직접 주소 지정방식에 한계를 느끼게 됩니다 .! 


그래서 사용할수 있는 간접 주소 지정 방식 포인터를 사용하시면 됩니다. ! 


포인터란



예를 들어 우리는 목욕탕을 갔습니다. 주인은 38번 사물함 열쇠를 주고 우리는 38번열쇠를 보고 38번 사물함으로 이동합니다.


즉 여기서 포인터의 역할은 38번 열쇠와 같습니다.! 


우리가 직접적으로 38번 사물함을 가는 것은 좀전에 설명한 직접 주소 방식 (일반 변수) 와 같습니다. 


하지만 C언어 문법상 우리는 다른 함수에서 선언된 변수는 사용하지 못하는 문제가 있었습니다. 


하지만 간접적으로 사물함의 열쇠를 가지고 접근한다면 다른 함수내에서도 사용할수가 있게 됩니다.! 



이렇게 포인터를 사용하여 main함수에 있는 지역변수 pack를 stimpack 함수에서 값을 변경할수 있게 되었습니다.! 



메모리상 보시면 포인터 변수는 pack의 주소를 가르키기 때문에 stimpack 변수에서 포인터를 이용하여 값을 변경할수가 있게됩니다. 


(여기서 포인터 변수의 크기가 4byte 인 이유는 32bits 운영체제에서 사용하는 주소의 크기는 4byte 이기 때문에 기본적으로 가르키는 대상의 주소를 


저장하려면 4byte로 할당됩니다. )


포인터 문법은 


가르키는 대상의 자료형 * 포인터변수이름 으로 구성되어 있습니다. (ex short *ptr ;) 


예를 들어 


int stim =10 ;


int *ptr ;


ptr = &stim ; ( & 이 연산자는 해당 변수의 주소값을 나타내는 연산자 입니다. 즉 ptr 포인터 변수에 시작주소를 저장하겠다)


(이렇게 사용하고  위에 두줄은 int *ptr = &stim;  이렇게 줄여서 사용할수도 있습니다. )


여기서 포인터 변수는 두가지의 의미를 가질수 있습니다.


*ptr   ptr  


*ptr은 가르키는 대상의 값을 뜻합니다. 


ptr은 가르키는 대상의 변수의 값을 (시작주소) 바꾸겠다는 뜻입니다.


그래서 위에 ptr = &stim; 이라고 사용한게 시작주소를 stim의 주소로 저장한다는 뜻 입니다.





여기서 ptr = &stim 즉 ptr변수가 가르키는 시작주소는 stim의 주소 (0x0010001)을 포인터 변수에 저장한다는 뜻입니다.


*ptr은 가르키는 대상 즉 stim의 값을 변경한다는 뜻입니다. 



이렇게 포인터 변수를 이용하여 주소값을 바꿀수도 있고 가르키는 대상의 값도 바꿀수있습니다.!





  안녕하세요 stimpack 입니다.!    


오늘은 배열에 대해서 알아보는 시간을 갖도록 하겠습니다.! 



  안녕하세요 stimpack 입니다.!    


오늘은 표준입출력 함수에 대해서 알아보는 시간을 갖도록 하겠습니다.! 



*표준 출력 함수 


우선 표준 출력 함수에 대해서 알아 보겠습니다.



우선 맨위에 보이는 #include <stdio.h> 에 대해서 알아 보겠습니다.!


#include 란 전처리기라고 합니다! 


컴파일 하기전에 컴파일러에게 직접적으로 명령하는 것 입니다. 


include란 포함하다는 뜻으로 옆에 <stdio.h>을 포함해서 컴파일 하라는 뜻입니다. 


여기서 <stdio.h>란 Standard Input Output Header  표준 입출력 함수란 뜻 입니다.


이로써 우리는 printf, putchar, putc, puts 등 입출력 함수를 사용할수 있게 됩니다.! 


문득 보면 이런 입출력함수가 c언어 문법 같지만 사실은 함수로 만든것 입니다!!! 


자세한 내용은 따로 내용을 만들겠습니다!. 


간단하게 말하자면 putchar, putc 는 단일 문자 출력함수 입니다.!


이걸 기반으로 printf 함수를 만들었습니다!!


puts 는 문자열 출력함수 입니다. 이 함수를 사용하면 자동으로 줄바꿈이 일어납니다. 



예제로 한번 작성하였습니다. 


putchar는 단일 문자 출력 함수로써 제가 문자 'A'를 입력하여 A를 호출하였고 


제가 65를 적어서 컴파일러는 아스키코드로 대문자 A를 출력하였습니다. (아스키코드 A = 65) 


Hello~! stimpack이 줄바뀜 없이 바로 이어서 나왔습니다.


하지만 puts 와 자리를 바꿔서 입력하니 줄이 자동으로 바뀌어서 출력 된 것을 확인 할수 있습니다! 


만약 printf함수를 사용시 \n 라는 제어문을 사용하시면 줄바꿈을 사용하실수 있습니다. 


printf 함수를 사용할때 변수에 저장된 문자나 숫자를 출력할수 있습니다.! 출력하기 위해서는 프로그래머가 어떤 서식으로 출력할 것인지 결정해야 합니다!


 

이렇게 형식을 잘못 적으면 이상한 값이 나오게 됩니다! (이것은 약속이니 꼭 지켜주셔야 합니다!)





문약에 변수 2개이상에 내용을 출력하고 싶으시면 순차적으로 적으시면 됩니다! 


+ Recent posts