Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Modify project 8 so that it uses qsort function to sort the array of protein pow

ID: 3713567 • Letter: M

Question

Modify project 8 so that it uses qsort function to sort the array of protein powders instead of selection sort function. Your program should include a comparison function that compares protein struct for qsort function. This program will be graded based on whether comparison function and qsort function call are implemented correctly.

protein_recommend.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <math.h>

#include <time.h>

struct protein

{

char proteinBrand[100];

int currentStock;

int unitsSold;

double averageReview;

int totalReviews;

};

void selection_sort(struct protein protein_powders[], int n);

int main(int argc, char const *argv[])

{

if(argc < 2)

{

printf("Usage: ./a.out protein.txt ");

return 0;

}

struct protein protein_powders[100];

FILE *inFile = fopen(argv[1], "r");

FILE *outFile = fopen("protein.txt.rcd", "w");

int n = 0;

if(inFile == NULL)

{

printf("Error while opening the file.");

exit(1);

}

else

{

int in = 0;

while(in != -1)

{

in = fscanf(inFile, "%d %d %lf %d %[^ ]s", &protein_powders[n].currentStock, &protein_powders[n].unitsSold,

&protein_powders[n].averageReview, &protein_powders[n].totalReviews,

&protein_powders[n].proteinBrand);

n++;

}

}

selection_sort(protein_powders, n);

int i;

for(i = 0; i < n - 1; i++)

{

if(protein_powders[i].averageReview >= 4.2)

{

fprintf(outFile, "%d %d %.2lf %d %s", protein_powders[i].currentStock, protein_powders[i].unitsSold,

protein_powders[i].averageReview, protein_powders[i].totalReviews,

protein_powders[i].proteinBrand);

fprintf(outFile, " ");

}

}

printf("Output written to protein.txt.rcd ");

fclose(outFile);

fclose(inFile);

return 0;

}

void selection_sort(struct protein protein_powders[], int n)

{

int i, largest = 0, temp;

if(n == 1)

return;

for(i = 1; i < n; i++)

if(protein_powders[i].averageReview < protein_powders[largest].averageReview)

largest = i;

if(largest < n - 1){

struct protein temp = protein_powders[n - 1];

protein_powders[n - 1] = protein_powders[largest];

protein_powders[largest] = temp;

}

selection_sort(protein_powders, n - 1);

}

qsort:

void quicksort(int a[], int low, int high)

{

int middle;

if (low >= high) return;

middle = split(a, low, high);

quicksort(a, low, middle - 1);

quicksort(a, middle + 1, high);

}

int split(int a[], int low, int high)

{

int part_element = a[low];

for (;;) {

while (low < high && part_element <= a[high])

high--;

if (low >= high) break;

a[low++] = a[high];

while (low < high && a[low] <= part_element)

low++;

if (low >= high) break;

a[high--] = a[low];

}

a[high] = part_element;

return high;

}

Explanation / Answer


// C code, code updated for quicksort
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>

struct protein
{
char proteinBrand[100];
int currentStock;
int unitsSold;
double averageReview;
int totalReviews;
};


// function declaration
void quicksort(struct protein protein_powders[], int low, int high)
int split(struct protein protein_powders[], int low, int high)

int main(int argc, char const *argv[])
{
if(argc < 2)
{
printf("Usage: ./a.out protein.txt ");
return 0;
}

struct protein protein_powders[100];
FILE *inFile = fopen(argv[1], "r");
FILE *outFile = fopen("protein.txt.rcd", "w");
int n = 0;

if(inFile == NULL)
{
printf("Error while opening the file.");
exit(1);
}
else
{
int in = 0;
while(in != -1)
{
in = fscanf(inFile, "%d %d %lf %d %[^ ]s", &protein_powders[n].currentStock, &protein_powders[n].unitsSold,
&protein_powders[n].averageReview, &protein_powders[n].totalReviews,
&protein_powders[n].proteinBrand);
n++;
}
}
quicksort(protein_powders, 0,n-1);

int i;
for(i = 0; i < n - 1; i++)
{
if(protein_powders[i].averageReview >= 4.2)
{
fprintf(outFile, "%d %d %.2lf %d %s", protein_powders[i].currentStock, protein_powders[i].unitsSold,
protein_powders[i].averageReview, protein_powders[i].totalReviews,
protein_powders[i].proteinBrand);
fprintf(outFile, " ");
}
}
printf("Output written to protein.txt.rcd ");
fclose(outFile);
fclose(inFile);
return 0;
}

void quicksort(struct protein protein_powders[], int low, int high)
{
int middle;
if (low >= high) return;
middle = split(protein_powders, low, high);
quicksort(protein_powders, low, middle - 1);
quicksort(protein_powders, middle + 1, high);
}


int split(struct protein protein_powders[], int low, int high)
{
// declare struct partition protein
struct protein partionElement = protein_powders[low];
for (;;)
{
// comapre average review of high index with partition element
while (low < high && partionElement.averageReview <= protein_powders[high].averageReview)
high--;
if (low >= high) break;
protein_powders[low++] = protein_powders[high];
while (low < high && protein_powders[low].averageReview <= partionElement.averageReview)
low++;
if (low >= high) break;
protein_powders[high--] = protein_powders[low];
}
// update protein poweders
protein_powders[high] = partionElement;
return high;
}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote