[ 1Àå, 2Àå, 3Àå, 4Àå, 5Àå, 6Àå, 7Àå, 8Àå, 9Àå, 10Àå, 11Àå, 12Àå, 13Àå, 14Àå, 15Àå, 16Àå, 17Àå, 18Àå, 19Àå, 20Àå, 21Àå, 22Àå, 23Àå, 24Àå, 25Àå, 26Àå, 27Àå, ºÎ·ÏA, ºÎ·ÏB,C, ºÎ·ÏD, GNU C ¶óÀ̺귯¸® ¸ñ·Ï ]

À̱ÛÀº ÇÏÀÌÅÚ ¼ÒÇÁÆ®¿þ¾îµ¿È£È¸ÀÇ ¼Ò¸ðÀÓÀÎ Á÷ÀåÀÎÀ» À§ÇÑ ¾¾¸ðÀÓ¿¡¼­ ÀåÀå 2³â°£ÀÇ ´ëÀåÁ¤À¸·Î ¹ø¿ªµÇ¾îÁø ¹®¼­ÀÔ´Ï´Ù. Áö±ÝÀº Á÷¾¾ÀåÀ» Áö³»°í ÀÖ´Â ±è¼Ò¿µ(flpigy)´Ô°ú Á¶¿øºÀ(thirnine)´Ô, °í¼®°©´Ô(sukgab)ÀÇ °øµ¿¹ø¿ªÀÔ´Ï´Ù.

15.Ž»ö°ú Á¤·Ä.

ÀÌ ÀåÀº ¹è¿­À» Ž»öÇϰí Á¤·ÄÇϱâ À§ÇÑ ÇÔ¼öµéÀ» ¼³¸íÇϰí ÀÖ´Ù. ´ç½ÅÀº ¹è¿­¿¡ ÀÖ´Â objectsÀÇ Å© ±â¿Í ¿ä¼ÒÀÇ Àüü°¹¼ö¿Í ÇÔ²², Àμö·Î½á Àû´çÇÑ ºñ±³ ÇÔ¼ö¸¦ ÁÙ¼ö ÀÖ´Ù.

15.1 ºñ±³ ÇÔ¼ö Á¤ÀÇÇϱâ.

¹è¿­À» Á¤·ÄÇÏ´Â ¶óÀ̺귯¸® ÇÔ¼ö¸¦ »ç¿ëÇϱâ À§Çؼ­, ´ç½ÅÀº ¾î¶»°Ô ±× ¹è¿­ÀÇ ¿ä¼ÒµéÀ» ºñ±³ÇÒ°Í ÀÎÁö ¾Ë·ÁÁà¾ß¸¸ ÇÑ´Ù. À̰ÍÀ» ÇϱâÀ§ÇØ, ´ç½ÅÀº ¹è¿­ÀÇ µÎ °³ÀÇ ¿ä¼Ò¸¦ ºñ±³Çϱâ À§ÇÑ ºñ±³ÇÔ¼ö¸¦ °ø±ÞÇÑ´Ù. ±× ¶óÀ̺귯¸®´Â ºñ±³Çϱâ À§ÇÑ µÎ °³ÀÇ ¹è¿­ ¿ä¼ÒµéÀ» °¡¸®Å°´Â Æ÷ÀÎÅͰ¡ Àμö·Î½á ÁÖ ¾îÁö¸é, ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ °ÍÀÌ´Ù. ´ç½ÅÀÇ ºñ±³ÇÔ¼ö´Â strcmp( 5.5Àý [String/Array Comparison] 49 ÆäÀÌÁö ÂüÁ¶.)°¡ ÇÏ´Â ¹æ¹ýÀ¸·Î °ªÀ» ¸®ÅÏÇϴµ¥, ±× ¹æ¹ýÀ̶õ: ù ¹øÂ° Àμö°¡ µÎ ¹øÂ° Àμöº¸´Ù ÀÛ À¸¸é À½¼ö¸¦ ¸®ÅÏÇϰí, ¸¸ÀÏ °°À¸¸é 0À» ¸®ÅÏÇϰí, ù ¹øÂ°°¡ Å©¸é ¾ç¼ö¸¦ ¸®ÅÏÇÑ´Ù.

À̰÷¿¡¼­´Â double ÇüÀÇ ¼ýÀÚµé·Î ÀÌ·ç¾îÁø ¹è¿­À» °¡Áö°í ÀÛ¾÷ÇÏ´Â ºñ±³ÇÔ¼öÀÇ ¿¹°¡ ÀÖ´Ù.

int

compare_doubles (const double *a, const double *b)

{

return (int) (*a - *b);

}

Çì´õÆÄÀÏ 'stdlib.h'´Â ºñ±³ÇÔ¼öµéÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀ» À§ÇÑ À̸§À» Á¤ÀÇÇϰí ÀÖ´Ù. ÀÌ Å¸ÀÔÀº GNU È® ÀåÀÌ´Ù.

int comparison_fn_t (const void *, const void *);

15.2 ¹è¿­ Ž»ö ÇÔ¼ö.

Á¤·ÄµÈ ¹è¿­¿¡¼­ Ű(key)°ª°ú °°Àº ¿ä¼Ò¸¦ Ž»öÇϱâ À§Çؼ­´Â, bsearchÇÔ¼ö¸¦ »ç¿ëÇ϶ó. ÀÌ ÇÔ¼ö¸¦ À§ÇÑ ÇÁ·ÎÅäŸÀÔÀº Çì´õÆÄÀÏ 'stdlib.h'¿¡ ÀÖ´Ù.

ÇÔ¼ö : void *bsearch (const void *key, const void *array, size_t count, size_t size, comparison_fn_t compare)

bsearch ÇÔ¼ö´Â key ¿Í µ¿µîÇÑ ¿ÀºêÁ§Æ®¸¦ Á¤·ÄµÈ ¹è¿­ array¿¡¼­ ã´Â´Ù. ±× ¹è¿­Àº size ¹ÙÀÌÆ®ÀÇ Å©±â¸¦ °¡Áø, count °³ÀÇ ¿ä¼Ò¸¦ °®´Â´Ù. compare ÇÔ¼ö´Â ºñ±³¸¦ ¼öÇàÇϴµ¥ »ç¿ëµÈ´Ù. ÀÌ ÇÔ¼ö´Â µÎ °³ÀÇ Æ÷ÀÎÅÍ Àμö·Î È£ÃâµÇ°í ù ¹øÂ° Àμö°¡ µÎ ¹øÂ° Àμöº¸´Ù Àû°Å³ª, °°°Å³ª, ¶Ç´Â Å­¿¡ ÇØ´ç ÇÏ´Â Á¤¼ö¸¦ ¸®ÅÏÇÑ´Ù. ¹è¿­ÀÇ ¿ä¼ÒµéÀº ÀÌ ºñ±³ÇÔ¼ö¿¡ ÀÇÇÏ¿© ¿À¸§Â÷¼øÀ¸·Î ¹Ì¸® Á¤·ÄµÇ¾îÁ®¾ß¸¸ ÇÑ´Ù.

¸®ÅϰªÀº key°ª°ú °°Àº ¹è¿­ÀÇ ¿ä¼Ò¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ À̰ųª, ¶Ç´Â °°Àº ¿ä¼Ò¸¦ ¹ß°ßÇÏÁö ¸øÇÏ¸é ³Î Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ¸¸ÀÏ ±× ¹è¿­ÀÌ key°ª°ú °°Àº °ÍÀ» ÇÑ °³ ÀÌ»ó °¡Áö°í ÀÖ´Ù¸é, ¸®ÅÏµÈ °Í Àº Á¤ÇØÁöÁö ¾Ê¾Ò´Ù. ÀÌ ÇÔ¼ö´Â ¹ÙÀ̳ʸ® Ž»ö ¾Ë·Î¸®ÁòÀ» »ç¿ëÇØ¼­ µ¿ÀÛÇѴٴ°Ϳ¡ ±âÀÎÇÏ¿© bsearch¶ó´Â À̸§ÀÌ À¯·¡µÆ´Ù.

15.3 ¹è¿­ Á¤·Ä ÇÔ¼ö

ºñ±³ ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¹è¿­À» Á¤·ÄÇϱâ À§Çؼ­´Â, qsort ÇÔ¼ö¸¦ »ç¿ëÇ϶ó. ÀÌ ÇÔ¼ö¸¦ À§ÇÑ ÇÁ·ÎÅäŸ ÀÔÀº 'stdlib.h'¿¡ ÀÖ´Ù.

ÇÔ¼ö : void qsort (void *array, size_t count, size_t size, comparison_fn_t compare)

qsort ÇÔ¼ö´Â ¹è¿­ array¸¦ Á¤·ÄÇÑ´Ù. ±× ¹è¿­Àº sizeÀÇ Å©±â¸¦ °¡Áø count°³ÀÇ ¿ä¼Ò¸¦ °®´Â´Ù.

compare ÇÔ¼ö´Â ¹è¿­ ¿ä¼ÒµéÀÇ ºñ±³¸¦ ¼öÇàÇϴµ¥ »ç¿ëµÈ´Ù. ÀÌ ÇÔ¼ö´Â µÎ °³ÀÇ Æ÷ÀÎÅÍ Àμö·Î È£ ÃâµÇ°í ù ¹øÂ° Àμö°¡ µÎ ¹øÂ° Àμö¿Í ºñ±³Çؼ­ Å«Áö, °°ÀºÁö, ÀûÀºÁö¸¦ ¾Ë ¼ö ÀÖ´Â °ªÀ» ¸®ÅÏÇÑ´Ù.

ÁÖÀÇ: ¸¸ÀÏ µÎ °³ÀÇ ¿ÀºêÁ§Æ®°¡ °°´Ù¸é, Á¤·ÄµÈ ÈÄÀÇ ±×µéÀÇ ¼ø¼­´Â ¿¹ÃøÇÒ ¼ö ¾ø´Ù. ±×°ÍÀº ÀÌ Á¤·ÄÀÌ ¾ÈÁ¤ÀûÀÌÁö ¸øÇÏ´Ù´Â °ÍÀ» ¸»Çϰí ÀÖ´Ù. ¹è¿­ÀÇ ´ÜÁö ÇѺκи¸À» °¡Áö°í ºñ±³¸¦ ÇÒ ¶§ µÎ °³ÀÇ ¿ä¼Ò°¡ °°´Ù°í ³ª¿À´Â °æ¿ì, ±×µéÀº ´ÜÁö key °ª¸¸ °°Àº »ÓÀÌÁö ´Ù¸¥ Á¡¿¡ À־´Â Â÷À̰¡ ÀÖÀ» °ÍÀÌ´Ù.

¸¸ÀÏ ´ç½ÅÀÌ ¾ÈÁ¤ÀûÀÎ Á¤·ÄÀ» ¿øÇÑ´Ù¸é, ´ç½ÅÀº µÎ °³ÀÇ ¿ä¼Ò»çÀÌ¿¡ ºÎÁ·ÇÑ ´Ù¸¥ Ãø¸éÀÇ Â÷À̳ª, ±× µéÀÇ ÁÖ¼Ò·Î ±×µéÀ» ºñ±³ÇÏ´Â °Í°ú °°Àº ºñ±³ ÇÔ¼ö¸¦ ½á¼­ ÀÌ °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù.

À̰÷Àº À§¿¡ Á¤ÀÇµÈ ºñ±³ ÇÔ¼ö¸¦ »ç¿ëÇØ¼­, ¼ýÀÚ ¼ø¼­·Î doubleÇüÀÇ ¹è¿­À» Á¤·ÄÇÏ´Â ¿¹¸¦ º¸¿©ÁÖ°í ÀÖ´Ù. ( 15.1 [Comparison Functions] 217 ÆäÀÌÁö ÂüÁ¶.)

{

double *array;

int size;

. . .

qsort (array, size, sizeof (double), compare_doubles);

}

qsort ÇÔ¼ö´Â "Äü ¼ÒÆ®(quick sort)" ¾Ë°í¸®ÁòÀ» »ç¿ëÇØ¼­ µ¿ÀÛÇÑ´Ù´Â »ç½Ç¿¡ ±âÀÎÇÏ¿© qsort¶ó´Â ÀÌ ¸§ÀÌ À¯·¡µÇ¾ú´Ù.

15.4 Ž»ö°ú Á¤·ÄÀÇ ¿¹.

À̰÷¿¡¼­´Â ±¸Á¶Ã¼ÀÇ ¹è¿­¿¡ qsort ¿Í bsearch¸¦ »ç¿ëÇÏ´Â ¿¹¸¦ º¸¿©ÁÖ°í ÀÖ´Ù. ¹è¿­ÀÇ ¿ÀºêÁ§Æ® µéÀº strcmp ÇÔ¼ö¸¦ »ç¿ëÇØ¼­ ±×µéÀÇ À̸§À» ºñ±³ÇÔÀ¸·Î½á Á¤·ÄµÇ¾îÁ³´Ù.

±×·¯¸é, ¿ì¸®´Â ±×µéÀÇ À̸§¿¡ ±âÃÊÇÑ °³°³ÀÇ ¿ÀºêÁ§Æ®µéÀ» »ìÆìº¼ ¼ö ÀÖ´Ù.

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

/* Á¤·ÄÇÒ critterµéÀÇ ¹è¿­À» Á¤ÀÇÇ϶ó. */

struct critter

{

const char *name;

const char *species;

};

struct critter muppets[] =

{

{"Kermit", "frog"},

{"Piggy", "pig"},

{"Gonzo", "whatever"},

{"Fozzie", "bear"},

{"Sam", "eagle"},

{"Robin", "frog"},

{"Animal", "animal"},

{"Camilla", "chicken"},

{"Sweetums", "monster"},

{"Dr. Strangepork", "pig"},

{"Link Hogthrob", "pig"},

{"Zoot", "human"},

{"Dr. Bunsen Honeydew", "human"},

{"Beaker", "human"},

{"Swedish Chef", "human"}

};

int count = sizeof (muppets) / sizeof (struct critter);

/* À̰ÍÀº Á¤·Ä°ú Ž»öÀ» À§ÇØ »ç¿ëÇÏ´Â ºñ±³ÇÔ¼öÀÌ´Ù. */

int

critter_cmp (const struct critter *c1, const struct critter *c2)

{

return strcmp (c1->name, c2->name);

}

/* critter¿¡ ´ëÇÑ Á¤º¸¸¦ ÇÁ¸°Æ®Ç϶ó. */

void

print_critter (const struct critter *c)

{

printf ("%s, the %s\n", c->name, c->species);

}

/* Á¤·ÄµÈ ¹è¿­À» »ìÆìº¸¶ó */

void

find_critter (const char *name)

{

struct critter target, *result;

target.name = name;

result = bsearch(&target, muppets, count, sizeof (struct critter),

critter_cmp);

if (result)

print_critter (result);

else

printf ("Couldn't find %s.\n", name);

}

/* Main ÇÔ¼ö */

int

main (void)

{

int i;

for (i = 0; i < count; i++)

print_critter (&muppets[i]);

printf ("\n");

qsort (muppets, count, sizeof (struct critter), critter_cmp);

for (i = 0; i < count; i++)

print_critter (&muppets[i]);

printf ("\n");

find_critter ("Kermit");

find_critter ("Gonzo");

find_critter ("Janice");

return 0;

}

ÀÌ ÇÁ·Î±×·¥ÀÇ Ãâ·ÂÀº ´ÙÀ½°ú °°´Ù.

Kermit, the frog

Piggy, the pig

Gonzo, the whatever

Fozzie, the bear

Sam, the eagle

Robin, the frog

Animal, the animal

Camilla, the chicken

Sweetums, the monster

Dr. Strangepork, the pig

Link Hogthrob, the pig

Zoot, the human

Dr. Bunsen Honeydew, the human

Beaker, the human

Swedish Chef, the human

Animal, the animal

Beaker, the human

Camilla, the chicken

Dr. Bunsen Honeydew, the human

Dr. Strangepork, the pig

Fozzie, the bear

Gonzo, the whatever

Kermit, the frog

Link Hogthrob, the pig

Piggy, the pig

Robin, the frog

Sam, the eagle

Swedish Chef, the human

Sweetums, the monster

Zoot, the human

Kermit, the frog

Gonzo, the whatever

Couldn't find Janice.