Вопрос

I am making a small ANSI C application using GCC in Ubuntu. The program finds the value of occurrences for each letter in a string, and then is supposed to sort them in descending order based on the number of occurrences.

My main.c file:

/*
* preprocessor directives
*/
#include "bubbleSort.h"

/*
* global variables
*/
char Ar[] = "All Gaul is divided into three parts, one of which the Belgae inhabit, the Aquitani another, those who in their own language are called Celts, in our Gauls, the third. All these differ from each other in language, customs and laws. The river Garonne separates the Gauls from the Aquitani; the Marne and the Seine separate them from the Belgae. Of all these, the Belgae are the bravest, because they are furthest from the civilization and refinement of [our] Province, and merchants least frequently resort to them, and import those things which tend to effeminate the mind; and they are the nearest to the Germans, who dwell beyond the Rhine , with whom they are continually waging war; for which reason the Helvetii also surpass the rest of the Gauls in valor, as they contend with the Germans in almost daily battles, when they either repel them from their own territories, or themselves wage war on their frontiers. One part of these, which it has been said that the Gauls occupy, takes its beginning at the river Rhone ; it is bounded by the river Garonne, the ocean, and the territories of the Belgae; it borders, too, on the side of the Sequani and the Helvetii, upon the river Rhine , and stretches toward the north. From 'Caesar's Conquest of Gaul', Translator. W. A. McDevitte. Translator. W. S. Bohn. 1st Edition. New York. Harper & Brothers. 1869. Harper's New Classical Library. Published under creative commons and available at http://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:1999.02.0001";

/*
* main function
*/
int main(void) {
    /*array to hold count of each letter in alphabet*/
    int ABStats[ALPHABET_SIZE] = { 0 };

    /*array to hold letters of alphabet*/
    char chAlphabet[ALPHABET_SIZE] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

    /*pointers for use in finding frequency of characters*/
    char *pAr = Ar;
    char *pAlphabet = chAlphabet;
    int *pABStats = ABStats;

    GetFrequency(pAr, pABStats); /*get the frequency of each letter*/
    DisplayVHist(pABStats, ALPHABET_SIZE); /*display the frequency of each letter*/

    int i, j;
    for (i = ALPHABET_SIZE-1; i >= 0; i--) {
        for (j = 0; j < i; j++) {
            if (*(pABStats+j) < *(pABStats+j+1)) {
                Swap(pABStats+j, pABStats+j+1);
            }
        }
    }

    DisplayVHist(pABStats, ALPHABET_SIZE); /*display the frequency of each letter*/

    return EXIT_SUCCESS; /*return zero*/
}

My bubbleSort.c file:

/*
* preprocessor directives
*/
#include "bubbleSort.h"

/*
* functions
*/
int GetFrequency(char *pAr, int *pABStats) {
    int chNum = 0;
    for (; *pAr != '\0'; pAr++) { /*check if at the end of the array*/
        char ch = *pAr; /*store current letter as a char*/
        if (isalpha(ch)) /*if character is a letter*/
            chNum = (toupper(ch) - 'A'); /*return ascii code of specified letter*/
        pABStats[chNum]++; /*store ascii value in array and increment array*/
    }
    return chNum;
}

void DisplayVHist(int *pABStats, int size) {
    int i, j;
    const float lengthAr = strlen(Ar); /*store length of array as a float*/
    for (i = 0; i < size; i++) { /*for each letter in the alphabet*/
        float chPercent = 100 * (*pABStats / lengthAr); /*calculate percentage*/
        printf("'%c' --> %6.3f percent --> %3d occurances --> ", (i + 'A'), chPercent, *pABStats);
        for (j = 0; j < (*pABStats / 2); j++) { /*for every two values being pointed to by pointer*/
            printf("%c",'*'); /*print asterisk*/
        }
        printf("\n");
        pABStats++;
    }
}

void Swap(int *pA, int *pB) {
    int temp;
    temp = *pA;
    *pA = *pB;
    *pB = temp;
}

My bubbleSort.h file:

/*
* preprocessor directives
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define ALPHABET_SIZE 26

/*
* global variables
*/
extern char Ar[];

/*
* function prototypes
*/
int GetFrequency(char*, int*);
void DisplayVHist(int*, int);
void Swap(int*, int*);

What it currently does is it sorts the occurrence values in descending order, which is what I want, but then when I display the results, 'A' would have the highest value, which would be wrong. I want the letters to be sorted in the same way as the occurrences are, so that the letter with the highest occurrences (which is 'E') would appear at the top of the list along with its occurrences. I created a char array called chAlphabet in case I need it for this purpose.

I am required to use pointers for this application, even though it may not be the most efficient way to go about this application. I also am required to use the Sort() function inside bubbleSort.c for my sorting.

Any help would be appreciated. I'm fairly new to C programming. Thank you.

Это было полезно?

Решение

Okay, so already can swap pABStats, the stats of each letter, now all you need to do is swapping the Alphabet as well. To do that, you'll need an array, just like the pABStats, for the Alphabet, which you luckily already have: chAlphabet

Then you'll need a function that is to swap, just like the Swap function you have, but this time it should take char * arguments instead, for example, like this:

//in bubbleSort.c

void SwapAlphabet( char *pA, char *pB ) {
    char temp;
    temp = *pA;
    *pA = *pB;
    *pB = temp;
}

Call this just the way you call the Swap function, and right after, or before, whatever:

//inside the second for in main in main.c

if ( blabla ) {
    Swap( ... );
    SwapAlphabet( chAlphabet + j, chAlphabet + j + 1 ); // <-- added this
}

And lastly, introduce a new 3rd argument to the printing function, the DisplayVHist, which would hold the chAlphabet from main:

//in bubbleSort.c
void DisplayVHist( ..., ..., char *chAlphabet ) { ... }

//and in bubbleSort.h
void DisplayVHist( ..., ..., char* );

And call the function with chAlphabet being a third argument to it from main:

//towards the end in main in main.c
DisplayVHist( ..., ..., chAlphabet );

I lied before, but this will be the last part. Change the (i + 'A') inside the printf inside the DisplayVHist, to do what you already do for the pABStats there. It should be something like this:

//inside the DisplayVHist in bubbleSort.c

printf( "...", *chAlphabet, chPercent, *pABStats );
...
chAlphabet++;

This should be it, unless I have missed an edit I had done over here. Feel free to ask whatever, whenever you need any further clarification.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top