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;
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.