C Board  

Go Back   C Board > General Programming Boards > C Programming

Reply
 
LinkBack Thread Tools Display Modes
Old 07-01-2002, 07:54 AM   #1
Registered User
 
Join Date: Jun 2002
Posts: 7
Help with an Array

my program below currently sorts the records in the array in ascending order prior to searching, I am having trouble changing it so that the it sorts the array into descending order. if you have help it would be appreciated.



/* The PHONE program reads NUMB_RECS records from
the file students.dat into the two-dimensional
array students. The records occur one to a line,
with a maximum length of MAX_REC_SIZE and fields
formatted as follows:

25 chars 25 chars 12 chars
<last name> <first name> <phone number>

Column 1 Column 26 Column 51

MAX_REC_SIZE is thus LNAME_SIZE + FNAME_SIZE + PNUM_SIZE.
One record occurs per line.

PHONE sorts the records—as character strings—in ascending
order and then does lookups. It prompts for a last name,
padding it if necessary with blanks to LNAME_SIZE, and then
searches the array. If the name is found, the entire record
is written to the terminal in their file column positions. If the
name is not found, a message is written.

PHONE uses selection sort for the sorting and binary search
for the searching. The program consists of the functions:
Main, selection_sort, binary_search, and swap. */

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

#define NUMB_RECS 30 /* number of records in students.dat */
#define LNAME_SIZE 25 /* first 25 chars */
#define FNAME_SIZE 25 /* next 25 chars */
#define PNUM_SIZE 12 /* last 12 chars */
#define MAX_REC_SIZE (LNAME_SIZE + FNAME_SIZE + PNUM_SIZE)
#define NO_FIND (-999) /* flag to signal lookup failure */
#define BLANK ‘ ‘ /* used to pad candidate name so
it, to has LNAME_SIZE chars */
void selection_sort ( char array [ ] [ MAX_REC_SIZE + 2], int size1 );
void swap (char array [ ] [ MAX_REC_SIZE + 2 ], int current, int low );

int binary_search(char candidate [ ],
char array [ ][ MAX_REC_SIZE + 2],
int sixe );
main ()
{
/* student records (+2 is for the newline and the
null terminator) */
char students [ NUMB_RECS ] [ MAX_REC_SIZE + 2];

/* candidate in search (+2 is for the newline and the
null terminator) */
char candidate [ LNAME_SIZE + 2];

int cand_len; /* length of candidate’s name */
int index; /* index into students */
int i;

FILE* fp;

/* read the names of NUMB_RECS records into array students */
fp = open(”students.dat”, “r”);

FOR (i = 0; i < NUMB_RECS; ++1)
fgets( students [i], MAX_REC_SIZE + 2, fp);

/* sort the records into ascending order, by name */
selection_sort( students, NUMB_RECS);

/* Prompt the user for a student’s name and look for it in the
array students. Halt when the user signals EOF at the
prompt. */

printf( “\n\n Enter a student’s name,”
“or signal EOF to halt: “);
while ( fgets(candidate, LNAME_SIZE + 2, stdin) !=NULL) {

/* Pad candidate with blanks to LNAME_SIZE chars. */
cand_len = strlen( candidate ) – 1; /* -1 for newline stored by fgets */

for ( i = cand_len; i < LNAME_SIZE; i++ )
candidate [ i ] = BLANK;
candidate [ LNAME_SIZE ] = ‘\0’; /*null terminate */

index = binary_search ( candidate, students, NUMB_RECS );
if ( index ! = NO_FIND)
printf( “\nRecord: %s”, students [ index] );
else {
candidate [ cand_len ] = ‘\0’; /* knock off blanks */
printf ( “\n\t%s is not in our directory.”,
candidate);

}
return EXIT_SUCCESS;
}
/* selection_sort ( array, size1)

The function expects an array and its size. It sorts the
elements into ascending order. it does not return a value.

The algorithm can be sketched as follows:
1. Repeat steps 2 and 3 for ind equals 0, 1,..., size1 –2.
2. Select the smallest item among
array [ind], array [ind + 1],..., array[ size1 – 1 ].
3. Swap the smallest with array[ ind].
*/

void selection_sort (char array [ ] [ MAX_REC_SIZE + 2 ], int size1 )
{
int smallest_index; /* index of smallest string seen */
int i, j;

/* loop size1; /* index of smallest string seen */
for ( i = 0; i < size1 – 1; ++i ) {
/* assume ith string is smallest */
smallest_index = i;
/* compare smallest against remaining strings */
for ( j = i + 1; j < size1; ++j )
/* look for smaller string */
if (strcmp ( array [ j ], array[ smallest_index] ) < 0 )
smallest_index = j;
/* put smallest at index i */
if ( i != smallest_index )
swap( array, i, smallest_index );
}
}

/* Swap array [current ] and array [ low ]. */

void swap9 char array [ ] [ MAX_REC_SIZE + 2]. int current, int low)
{
char temp[ MAX_REC_SIZE + 2];

strcpy ( temp, array [current ] );
strcpy (array [current ], array[low] );
strcpy (array [ low], temp );
}
/* binary_search ( candidate, array, size )
the function searches the sorted array
array [0], array [ 1 ],..., array [ size – 1 ]
omalleys is offline   Reply With Quote
Old 07-01-2002, 08:31 AM   #2
Guest
 
Sebastiani's Avatar
 
Join Date: Aug 2001
Posts: 4,923
Perhaps the easiest way would be a simple reversing function, ie:


Code:
void Reverse(char *array[], int count, int maxlen)
{
  int x, z;
  char temp[count][maxlen];  

  for( x = 0; x < count, x++ )   //...copy original to temp
     strcpy(temp[x], array[x]);

  x = 0;

  for( z = count; z != 0; x++, z-- )   //...copy to original in reverse...
      strcpy(array[x], temp[z]);

}
Sebastiani is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
allocation and reallocation of memory dynamically of an integer array zamir C++ Programming 16 05-29-2009 07:25 PM
Array coping into another array?or function returning array baniakjr C++ Programming 6 11-09-2006 03:28 AM
[question]Analyzing data in a two-dimensional array burbose C Programming 2 06-13-2005 07:31 AM
Unknown Memory Leak in Init() Function CodeHacker Windows Programming 3 07-09-2004 09:54 AM
Quick question about SIGSEGV Cikotic C Programming 30 07-01-2004 07:48 PM


All times are GMT -6. The time now is 01:05 PM.


Powered by vBulletin® Version 3.8.1
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.0 RC2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22