These are solutions to the problems of Homework 8 that were not assigned from the textbook.
The problem is to use the qsort
routine
to sort 3000 records of the following type:
struct city {
char Name[80] ;
char State[2] ;
}
First, you need a routine to compare the records. The problem
requires us to sort first by city and then by state.
The arguments to this routine are of type void *
as required in the specification of qsort
.
Consequently, we must cast the arguments to type
struct city *
before accessing the
fields of the record.
int cityCmp(const void *R1, const void *R2) {
struct city *P1, *P2 ;
int tempCmpRes ;
P1 = (struct city *)R1 ;
P2 = (struct city *)R2 ;
/* Compare the states. If unequal, return the result of the compare */
if (tempCmpRes = strncmp(P1->State, P2->State, 2))
return tempCmpRes ;
else
return strncmp(P1->Name, P2->Name, 80) ;
}
Assume Cities
is our array of 3000
struct city
records.
Now we only need to call qsort
.
Of course, qsort
expects the
array to be passed as a void *
.
qsort((void *)Cities, 3000, sizeof(struct city), cityCmp) ;
The ASCII values for the letters 'U', 'N', 'C', and 'A' are,
in hex, 0x55
, 0x4e
, 0x43
,
and 0x41
, respectively.
C statement | *key | h | g |
---|---|---|---|
initally | 0x55 or 'U' |
0x00000000 |
|
h = (h << 4) + *key++ ; |
0x4e or 'N' |
0x00000055 |
|
unsigned long g = h & 0xF0000000L ; |
0x4e or 'N' |
0x00000055 |
0x00000000 |
if (g) h ^= g >> 24 ; |
0x4e or 'N' |
0x00000055 |
0x00000000 |
h &= ~g ; |
0x4e or 'N' |
0x00000055 |
0x00000000 |
h = (h << 4) + *key++ ; |
0x43 or 'C' |
0x0000059e |
|
unsigned long g = h & 0xF0000000L ; |
0x43 or 'C' |
0x0000059e |
0x00000000 |
if (g) h ^= g >> 24 ; |
0x43 or 'C' |
0x0000059e |
0x00000000 |
h &= ~g ; |
0x43 or 'C' |
0x0000059e |
0x00000000 |
h = (h << 4) + *key++ ; |
0x41 or 'A' |
0x00005a23 |
|
unsigned long g = h & 0xF0000000L ; |
0x41 or 'A' |
0x00005a23 |
0x00000000 |
if (g) h ^= g >> 24 ; |
0x41 or 'A' |
0x00005a23 |
0x00000000 |
h &= ~g ; |
0x41 or 'A' |
0x00005a23 |
0x00000000 |
h = (h << 4) + *key++ ; |
0x00 |
0x0005a271 |
|
unsigned long g = h & 0xF0000000L ; |
0x00 |
0x0005a271 |
0x00000000 |
if (g) h ^= g >> 24 ; |
0x00 |
0x0005a271 |
0x00000000 |
h &= ~g ; |
0x00 |
0x0005a271 |
0x00000000 |
So, the answer is 0x0005a271
.
The problem would have been more interesting had
the string had more than eight characters.