버블 정렬법(bubble sort)은 제 1단계에서 처음 것을 인접한 그 다음 번 위치의 데이터와 비교하여 선택 정렬 때와 같은 요령으로 맞바꾸기한 후 그 중에서 뒤의 데이터와 다시 인접한 그 다음 번 데이터를 끝(n번째)까지 비교하여 가장 뒤에 위치할 데이터를 결정하는 방법입니다.

쉽게말해서
5 4 3 2 1
4 5 3 2 1
4 3 5 2 1
4 3 2 5 1
4 3 2 1 5

인접해 있는 두수를 비교해가는 정렬법을 뜻합니다
 

앞서 했던 선택정렬에서 조금만 수정하면됩니다 오히려 선택정렬이 더 어렵습니다
버블 정렬의 경우 비교되는 2데이터를 차례대로 이중for문을 이용하여 변수 ij를 선언하여 돌려주기만 하면 됩니다

시작 -> 데이터 입력 -> ( 가로for -> 비교 -> 세로for ) -> 출력

.생각할점!
1가지 짚고 넘어가야될점이 있는데 그것은 기존의 코드대로면 정렬이 되는 도중에 정렬이 완료가 되었음에도 불구하고 남은 for문을 통하여 일일이 쓸모없이 비교를 하기 때문입니다 5개 정도의 데이터라면 문제가 없지만 10만개 100만개의 데이터라면 앞에 1만번째 데이터에서 정렬이 완료 되었는데 나머지 9만번 99만번을 수행을 하기 때문입니다 이것을 처리하는 부분을 추가하였습니다

변수를 하나 선언해서 1세트(데이터범위)가 돌아가는 동안 정렬을 한번도 하지 않았다면 break를 걸어주도록 하면됩니다


결과보기>>
5 4 3 2 1을 한번도 정렬을 하지않습니다 그래서 1세트에 나면지를 검사하여보고 정렬할 필요가 없어서 프로그램이 정지되었습니다

뒤에 2개의 데이터만 자리를 바꾸면 끝나게 됩니다 그래서 1세트에서 정렬을 끝내고 2세트에서 아무 변화가 없어서 2세트에서 정지하고 총 8번 검색을 하였습니다 

 
소스보기>> 

#include <stdio.h>

int main()
{
  int iCnum;
  int i;
  int j;
  int iSw;
  int iCnt = 0;
  int iCnt2 = 0;

  int temp;
  int iBuf[10];

  printf("The number of data :");
  scanf("%d",&iCnum);

  fflush(stdin);
  printf("%d Data Write!\n",iCnum);  
  for(i=0;i<iCnum;i++)
  {
    printf("Data in [%d]: ",i);
    scanf("%d",&iBuf[i]);
    fflush(stdin);
  }

  printf("(오름)Decrease 1 / (내림)Increase 2: ");
  scanf("%d",&iSw);

  switch(iSw)
  {
    case 1:
      printf("큰수 - > 작은수\n");
      for(j=1;j<iCnum;j++)
      {
        for(i=1;i<iCnum;i++)
        {  
          if(iBuf[i-1]<iBuf[i])
          {
            temp = iBuf[i-1];
            iBuf[i-1= iBuf[i];
            iBuf[i] = temp;
            iCnt++;
          }
          iCnt2++;
        }
          
        if(iCnt == 0)
        {
          printf("%d세트에서 정지\n",j);
          break;
        }
        iCnt = 0;
      }
      printf("%d검색하였습니다\n",iCnt2);
      break;
    
    case 2:
      printf("작은수 - > 큰수\n");
      for(j=1;j<iCnum;j++)
      {
        for(i=1;i<iCnum;i++)
        {  
          if(iBuf[i-1]>iBuf[i])
          {
            temp = iBuf[i-1];
            iBuf[i-1= iBuf[i];
            iBuf[i] = temp;
          }
        }
        if(iCnt == 0)
        {
          printf("%d세트에서 정지\n",j);
          break;
        }
        iCnt = 0;
      }
      printf("%d검색하였습니다\n",iCnt2);
      break;
  }
  for(i=0;i<iCnum;i++)
  {
    printf(" %d ",iBuf[i]);
  }
  printf("\n");
  return 0;
}

Posted by mantwo
데이터가 있고 그데이터를 처리하는 방법은 많이 있습니다 데이터를 처리하는 방법중 정렬을 하는 방법에 대하여 다루어 보겠습니다

데이터의 정렬이란 특정한 규칙에의해 데이터를 재배열하는것을 뜻하는데 숫자의 대소를 가지고 내림 혹은 오름차순으로 정리하는것이 기본입니다 그리고 정렬에도 여러가지 종류가 있는데 선택정렬법을 사용한 정렬을 해보도록 하겠습니다

.선택정렬법
:선택 정렬법(selection sort)은 가장 앞에 있는 데이터 A1부터 시작하여 모든 데이터 A2~An를 차례대로 비교하면서 그 위치에 놓여질 데이터를 결정한 후, 그 다음 데이터 A2로 이동하여 같은 방법을 적용합니다.

처음 데이터 A1를 그 다음 번 째 데이터와 비교하여 오름차순일 때는 A1이 더 크면 맞바꾸고 내림차순일 때는 A1이 더 작으면 서로 맞바꿉니다.


예를들어 1 2 3 4 5의 데이터가 있으면
1을 중심으로 1과2 1과3 1과4 1과5등으로 비교를 하는것이 선택 정렬법입니다

즉 1이 기준이라면
1 2 3 4 5

1 2 3 4 5

1 2 3 4 5

비교하고 대소를 구분하여 자리를 바꾸게 됩니다 선택정렬이외에 버블 정렬이란것도 있습니다

.소스구상
:소스를 작성하기전에 어떻게 구현 할것인지 생각해보았습니다

1)입력받는 데이터의 갯수를 정할수 있도록한다 -변수
2)입력받는 데이터를 원하는 수로 입력한다  -scanf
3)원하는 지점(데이터)부터 정렬해나간다    -변수 선언및 for
4)내림차순 오름차순을 선택하도록 한다      -switch()

.정렬
정렬의 기본은 값을 저장할 temp 변수와 데이터 A1 A2를 비교하여 서로의 값을 교환하는 것입니다
if(A1<A2)
{
    temp = A1;
    A1 = A2;
    A2 = temp;
}
여기서 선택 정렬을 적용한다면
A1의 값은 그대로 둔체  A2를 가리키는 값을 바꾸어주면 됩니다
A1 < A(i)  //i++

결과보기>>
1번 배열부터 오름차순 sort 경우


3번 배열부터 오름차순 sort 경우
앞에 1 과 2는 정렬되지 않았습니다












소스보기>>
#include <stdio.h>

int main()
{
  int iCnum;
  int iSp;
  int i;
  int j;
  int iSw;

  int temp;
  unsigned int iBuf[];

  printf("The number of data :");
  scanf("%d",&iCnum);

  fflush(stdin);
  printf("%d Data Write!\n",iCnum);  
  for(i=0;i<iCnum;i++)
  {
    printf("Data in [%d]: ",i);
    scanf("%d",&iBuf[i]);
    fflush(stdin);
  }
  
  printf("Sort Point in: ");
  scanf("%d",&iSp);
  fflush(stdin);
  
  iSp--;

  printf("Decrease 1 / Increase 2: ");
  scanf("%d",&iSw);

  switch(iSw)
  {
    case 1:
      for(j=iSp;j<iCnum;j++)
      {
        for(i=0;i<iCnum-iSp;i++)
        {  
          if(iBuf[iSp]<iBuf[iSp+i])
          {
            temp = iBuf[iSp];
            iBuf[iSp] = iBuf[iSp+i];
            iBuf[iSp+i] = temp;
          }
        }
        iSp++;
      }
      break;
    
    case 2:
      for(j=iSp;j<iCnum;j++)
      {
        for(i=0;i<iCnum-iSp;i++)
        {  
          if(iBuf[iSp]>iBuf[iSp+i])
          {
            temp = iBuf[iSp];
            iBuf[iSp] = iBuf[iSp+i];
            iBuf[iSp+i] = temp;
          }
        }
        iSp++;
      }
      break;
  }

  for(i=0;i<iCnum;i++)
  {
    printf(" %d ",iBuf[i]);
  }
  printf("\n");
  return 0;
}



Posted by mantwo


달팽이 배열의 업그레이드 버전인 2차원동적배열 달팽이배열을 작성하여 보겠습니다

기존의 달팽이 배열에서는 여러번 실행시키는 반복문으로 만들게되면 에러가 발생하게됩니다
계속해서 배열이 중첩되어 선언되고 선언된 배열만큼 넘어가버리면 넣을수가 없게 됩니다

하지만 동적배열을 활용하게 되면 원하는 만큰 배열을 선언하여 값을 넣을수 있습니다

malloc를 이용하면 되는데

선언은
int **arr;

 초기화는 
arr=(int**)malloc(sizeof(int)* j);
for(i=0;i<j;i++)
arr[i]=(int*)malloc(sizeof(int)* j);
  
이렇게 하면 됩니다

여기에 추가로
   1. 정수j를 넣으면 원하는 길이만큼 배열이 나오고 계속해서 동작하도록 합니다
   2. 0이나 음수를 넣게 되면 프로그램을 종료하도록 합니다
   3. 끝에는 free로 메모리를 해제하여 줍니다

달팽이이차원동적배열!!

소스보기


결과>>

결과보기


 


Posted by mantwo


배열의 응용인 달팽이 모양의 배열을 가지는 프로그램을 작성해 보겠습니다


달팽이 배열이란 아래 그림과 같이 배열이 선언된 배열을 뜻합니다


배열을 가리키는 화살 모양대로 1부터 16까지 값을 저장한


그림과 같이 출력하면 됩니다

이 숫자들을 분석하면

 

4칸 이동: y값이 1증가하는 배열   arr[x][y+1]    (0,0) (0,1) (0,2) (0,3)

3칸 이동: x값이 1증가하는 배열   arr[x+1][y]    (1,3) (2,3) (3,3)


3
칸 이동: y값이 1감소하는 배열   arr[x][y-1]    (3,2) (3,1) (3,0)

2칸 이동: x값이 1감소하는 배열   arr[x-1][y]    (2,0) (1,0)


2
칸 이동: y값이 1증가하는 배열   arr[x][y+1]    (1,1) (1,2)

1칸 이동: x값이 1증가하는 배열   arr[x+1][y]    (2,2)


1
칸 이동: y값이 1감소하는 배열   arr[x][y-1]    (2,1)


위와 같은 형태를 보입니다

x y기준으로
xy문이 반복적으로1씩 증가(+) 감소를 (-) 반복합니다
1칸씩 이동간격이 줄어듭니다( 4 33 22 11 )

변수를 선언해보겠습니다
int arr[x][y]   //배열선언
int u = 1         //+1을 해주는 변수

int j = 4          //4칸이동부터 시작하기 때문에 
int i               //j와 비교하여 for문을 돌리기 위하여

int num         // arr에 저장할 정수 값

예상구조는 크게 두부분으로 나눌수 있습니다

int main()

1) 배열의 값을 저장 하는 부분

for(4번 실행 그후 33 22 11 번 실행)
    for(y축으로 이동하며 y값증가 및 감소)
    j--; (4 33 22 11순으로 칸이동)
    for(x축으로 이동하며 x값증가 및 감소)
    u = u*-1; (2줄씩 +1, 그다음 2줄 -1 반복 // 양수와 음수를 1씩 더해주기 위해)


2) 배열의 값을 출력만 하는 부분

for()
   for() printf("%d"arr[x][y])

   printf("\n")

저장후에 출력하는 것이 좋다고 판다되어 2부분으로 나누었습니다

이구조를 바탕으로 하여 작성하면 아래와 같습니다>>>

#include <stdio.h>

 

 int  main()

{

  int arr[30][30];

  int i;

  int x = 0;

  int y = -1;

  int u = 1;

  int num = 1;                   //초기 시작값은1

  int j = 4;

 /*       저장 부분       */

for(;0<=j;)

{

             for(i=0;i<j;i++)         //

             {

                           y=y+u;

                           arr[x][y]=num;

                           num++;

             }

             j--;                      //4 33 22 11번 실행            

            for(i=0;i<j;i++)        //

           {

                        x=x+u;

                        arr[x][y]=num;

                        num++;

            }

   

            u=u*-1;                 //양수 음수변환

}

 /*       출력 부분       */
              
for(x=0;x<4;x++)
             {   

                           for(y=0;y<4;y++)

                         {

                                      printf("%4d",arr[x][y]);

                         }

            printf("\n");

             }

 

            return 0;

}



정상적으로 출력이 됩니다

보너스로 가로세로 10줄을 가지는 복잡한 달팽이 배열도 조금만 수정하면 간단하게 바꿀수 있습니다

1)배열수정
int arr[30][30] //넉넉하게 배열 선언

2)변수값 수정
int j=10;          //10 99 88 77 순으로 저장하기 위해서

3)출력부분 수정
for(x=0;x<10;x++)
             {   

                           for(y=0;y<10;y++)

                         {

이상 3가지를 수정하면 조금 더 복잡한 달팽이 배열을 만들수 있습니다


Posted by mantwo

C언어로 Lotto 번호를 생성하는 프로그램을 작성하도록 하겟습니다


Lotto란 1부터 45까지의 수가 적힌 공을 차례로 6번 꺼내어 나오는 조합인데....;
중요한 포인트가 있습니다

일단 ! 예상출력 모습입니다



1. 사용자에게 로또 게임 수를 입력받아 게임의 횟수별로 임의로 6개의 수(1~45)를 자동 하지만 , 생성된 난수는 모두 다른 값이어야 합니다

2. 로또 번호는 수형 배열을 선언하여 설정하도록 합니다

3. 0이나 음수를 입력 받으면 게임을 종료하도록 합니다

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

 

int main()

{

         int Lotto[6];

         int iNum;

         int i;

         int j;

         int k;

         long seed;

        

         printf ("*** LOTTO NUMBER GENERATOR ***\n");

         while(1)

         {

                  printf ("Enter the game count : ");

                  scanf ("%d", &iNum);

 

                  if(iNum <= 0) break;                           // 입렵된 정수가 0이거나 음수면 프로그램 종료

                  printf ("=============================\n");

                  seed = time (NULL);                          // seed는 시간을 넣음

                  srand (seed);                                   // rand함수 seed값 설정

                  k = 0;

 

                  for (iNum; 0 < iNum; --iNum)

                  {

                           k++;

                           printf ("Game  %2d : ", k);

                           for (i = 0; 6 > i; ++i)

                           {

                                   Lotto[i] = rand() % 45 + 1;               // 45이하의 난수생성

                                   for (j = 0; i > j; ++j)

                                   {

                                            if (Lotto[j] == Lotto[i])           // 같은 숫자일시 난수생성

                                            {

                                                     Lotto[i] = rand() % 45 + 1;

                                                     j = -1;                        //j++하게되어 0부터다시 생성됩니다

                                            }

                                   }

                                   printf ("%2d ", Lotto[i]);

                           }

                           printf ("\n");

                  }

                  printf ("=============================\n");

                  printf ("\n");

         }

         return 0;

}

 


요약하자면 이렇습니다
for (i = 0; 6 > i; ++i)에서 Lotto[i]에 값을 난수로 넣어 주고 그다음 for (j = 0; i > j; ++j)에서 i=j가 같은 값이 있는지 검사를 합니다 그래서 있게되면 다시 돌리게되어 같은수가 나오지 않게 됩니다

쉽게말해 Lotto[]라는 열에

Lotto[i] = 1 42 42 25 26 26

i = 0    j = 0

i = 1    j = 0 1        1

i = 2    j = 0 1 2      1 42

i = 3    j = 0 1 2 3    1 42 42 같은 숫자 발생 0으로 초기화 하고 다시 난수 발생
.....

i 3에는 42가 들어 있는데 j 2에서 42가 대입되어 
같은수가 발견 되어 초기화 하게 됩니다  

추가로
1. 보너스 숫자 생성
2. 입력되는 정수의 오름 및 내림차순 정리 등을 추가 하면 좀더 완성도 있는 프로그램이 될듯 합니다

Posted by mantwo


char형 데이터 두 개를 입력받은 다음 서로 바꾸는 swap 함수를 만드는 프로그램을 작성하여 보겠습니다


출력)    문자 입력 ch1 : A
          
문자 입력 ch2 : C
          
swap   :  ch1=A, ch2=C

           swap   :  ch1=C, ch2=A

          
           문자 입력
ch1 : D
           
문자 입력 ch2 : E
           swap   :  ch1=D, ch2=E

           swap   :  ch1=E, ch2=D

위와 같이 출력되는데 중요한 점은
char변수 ch1과 ch2를 main()에 선언하고 swap()함수를 선언하여 main에 입력되어 있는 ch1과 ch2를 값을 바꾸도록하겠습니다. 이러한 방법은 포인터를 이용하면 가능합니다

추가로 동일 문자 입력 받을시 중지 하도록 하겠습니다

#include<stdio.h>

 

void swap(char *px, char *py);

 

int main()

{

           char ch1, ch2;

 

           printf("문자입력 ch1 : ");

           scanf("%c", &ch1);

           fflush(stdin);

           printf("문자입력 ch2 : ");

           scanf("%c", &ch2);

          

           if(ch1==ch2)

           {

                     printf(“-----동일문자입력!!-----\n”);

                     break;

          

           }
          
printf("swap 전 : ch1 = %c ch2 = %c\n", ch1, ch2);

 

           swap(&ch1,&ch2);

 

           printf("swap 후 : ch1 = %c ch2 = %c\n", ch1, ch2);

 

           return 0;

}

 

void swap(char *px, char *py)

{

           int temp = *px;

           *px = *py;

           *py = temp;

}


 

Posted by mantwo

0℃에서 100℃까지의 섭씨 온도를 화씨 온도로 바꾸어서 5℃ 간격으로 출력하고 그 반대의 경우도 가능한 프로그램을 작성하겠습니다

출력>>



먼저 섭씨와 화씨는 모두 온도의 단위입니다.

1)섭씨(centigrade)는 스웨덴의 천문학자 Anders Celsius(1701~1744)의 고안에 따른 것입니다.
이 셀시우스가 만든 온도계가 중국에 알려졌을 때, 중국사람들이 셀시우스를 '섭씨'라고 부른 것이 "섭씨"라는 말의 기원이라고 합니다.

2)화씨(Fahrenheit)는 the Fahrenheit scale을 고안한 독일의 물리학자 Gabriel Daniel Fahrenheit(1686~1736)의 이름을 딴 것인데, 섭씨의 경우와 마찬가지로 파렌하이트를 중국사람들이 '화륜해'라고 부르게 되어 '화씨'가 되었다.


섭씨(攝氏) 10도는 10℃, 10 degrees centigrade(Centigrade로도 씀),
화씨(華氏) 10도는 10℉, 10 degrees Fahrenheit로 쓰게 됩니다.

0℃ = 32℉
즉 변환공식은 아래와 같습니다
화씨 -> 섭씨 : 섭씨 = (화씨-32)/1.8
섭씨 -> 화씨 : 화씨 = (섭씨*1.8)+32

#include<stdio.h>

 

void CtoF();

 

int C , F = 0;

char b;

 

int main()

{

           printf("섭씨온도 = C, 화씨온도 = F : ");

           scanf("%c", &b);

           CtoF();                    

          

           return 0;

}

void CtoF()

{

           if((b == 'C')||(b == 'c'))

           {

                     printf("** Celsius To Fahrenheit **\n");

          

                     for(C=0;C<=100;C=C+5)

                     {

                                F = (C*1.8)+32;

                                printf("%3d℃ => %3d℉\n", C, F);

                     }

           }

 

           else if((b == 'F')||(b == 'f'))

           {

                     printf("** Fahrenheit To Celsius **\n");

          

                     for(F=32;F<=212;F=F+9)

                     {

                                C = (F-32)/1.8;

                                printf("%3d℉ => %3d℃\n", F, C);

                     }

           }

           return ;

}



Posted by mantwo


두 개의 정수를 입력받고 두 정수 사이를 나타내고 두 정수 사이의 부호를 다음과 같이 바꿔가면서 계산한 식과 계산학 식의 결과를 출력하는 프로그램을 작성하겠습니다

 

출력)      정수(2) 입력 : 1 10

             X = 1 2 + 3 4 + 5 6 + 7 8 + 9 10

             X = -5

 

정수(2) 입력 : 2 6

             X = 2 3 + 4 5 + 6

             X = 4

즉 두 정수 사이에 +와 -를 번갈아가면서 나타내게 됩니다

#include <stdio.h>

 

int main()

{

             int n1,n2,i=0;

             int sum;

             printf("정수 2개를 입력하세요 : ");

             scanf("%d %d",&n1,&n2);

            

             printf("X=%d",n1);

             sum = n1;

             n1++;

             for(; n1 <= n2;n1++)

             {

                           if(i%2 == 1)

                           {

                                        printf("+%d",n1);

                                        sum  = sum + n1;

                           }

                           else

                           {

                                        printf("-%d",n1);

                                        sum = sum - n1;

                          }

                           i++;

            

             }

             printf(" X=%d\n",sum);

 

             return 0;

}


간단합니다 두정수사이를 나타내되 if문을 이용하여 2로 나누어질경우(%2) 즉 짝수일경우는 + 그외는 -로 하여 작성하면 됩니다
Posted by mantwo


입력된 정수의 2의 보수를 구한다음에 10진수, 16진수의 형태로 각각 출력하는 프로그램을 작성하겠습니다.

 

출력) Input Number :  1

        2s complement(10진수) :  -1

        2s complement(16진수) :  ffffffff

위와 같이 출력을 하게되고 10진수는 %d 16진수는 %x를 이용하여 출력하겠습니다
보수를 구하는 부분은 따로 함수를 선언하여 포인트로 받겠습니다

#include<stdio.h>

 

void compliment(int *pN, int *pC);

 

int main()

{

             int N, C = 0;

            

             printf("Input Number : ");

             scanf("%d",&N);

 

             compliment(&N, &C);

 

             printf("2's complement(10진수) : %d \n", C);

             printf("2's complement(16진수) : %x \n", C);

 

             return 0;

}

 

void compliment(int *pN, int *pC)

{

 

             *pC = 1 + ~*pN;

             return;

 

}



Posted by mantwo


1. 두 개의 정수를 입력받고 두 정수 사이에 5의 배수의 개수를 출력하는 프로그램을 작성해보겠습니다.
 

출력)    정수(2) 입력 : 5 21

           출력 : 3

두값사이의 5의 배수는 10 15 20 입니다!

두값사이이니 두값은 포함하지 않겠습니다!! 그리고 중요한점은 5 21일 경우도 있고 21 5일 경우도 있습니다
앞자리가 큰수가 나오든 작은수가 나오든 두값사이의 5의 배수를 구해야합니다

#include<stdio.h>

 

int main()

{

           int n1, n2, a=0;

          

           printf("정수(2) 입력 : ");

           scanf("%d %d", &n1, &n2);

           if(n1>n2)

           {

                     a =  n1 - n2;

                     a = a/5;

           }

           else if(n1<n2)

           {

                     a =  n2 - n1;

                     a = a/5;

           }

 

          if(n1%5==0||0==n2%5) a = a+1;

 

           printf("출력 : %d\n", a);

 

           return 0;

}



추가로 main의 계산하는 부분을 따로 함수를 선언하여 main아래에 선언해보겠습니다
추가로 포인터를 사용하여 main 함수의 변수 값을 바꾸는 형태로 해보겠습니다

#include<stdio.h>

 

void processCount(int *pn1, int *pn2, int *pCount);

 

int main()

{

           int n1, n2, count = 0;

          

           printf("정수(2) 입력 : ");

           scanf("%d %d", &n1, &n2);

          

           processCount(&n1, &n2, &count);

           printf("Multiple of 5 : %d \n", count);

 

           return 0;

}

 

void processCount(int *pn1, int *pn2, int *pCount)

{

 

           int temp, i;      

          

           if(*pn1>*pn2)

           {

                     temp = *pn1;

                     *pn1 = *pn2;

                     *pn2 = temp;

           }

 

           for(i=(*pn1+1);i<(*pn2);i++)

           {

                     if(i%5==0)

                     {

                                 *pCount  = *pCount + 1;

                     }

           }

 

           return ;

}


Posted by mantwo


티스토리 툴바