Modify so that it uses qsort function to sort the array of protein powders inste
ID: 3713671 • Letter: M
Question
Modify 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.
#include <stdio.h>
#include <stdlib.h>
struct protein{
char proteinBrand[100];
int unitsInStock;
int unitsSold;
double averageReview;
int totalReviews;
};
void selection_sort(struct protein protein_powders[], int n)//sorting from file
{
int i, largest = 0;
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);
}
int main(int argc, char const *argv[])
{
if(argc < 2)//if less
{
printf("Usage: ./a.out protein.txt ");
return 0;
}
struct protein protein_powders[100];
FILE *myFile=fopen(argv[1],"r");//will open what is typed by user
FILE *wFile=fopen("protein.txt.rcd","w");//written to new file
int n=0;
if(myFile==NULL)//error code
{
printf("Error while open the file");
return 1;
}
else
{
int inp =0;
while(inp!=-1)
{
inp = fscanf(myFile,"%d %d %lf %d %[^ ]s ",&protein_powders[n].unitsInStock,&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)
{
fprintf(wFile,"%d %d %.2lf %d %s ",protein_powders[i].unitsInStock,protein_powders[i].unitsSold,protein_powders[i].averageReview,protein_powders[i].totalReviews,protein_powders[i].proteinBrand);
fprintf(wFile," ");
}
}
printf("Sorted and written to protein.txt.rcd ");
fclose(myFile);
fclose(wFile);
return 0;
}
Explanation / Answer
Given below is the modified code for the question.. Since you have not given sample input file, I could not test it. Please let me know in case of any issues, I'll help.
Please do rate the answer if it was helpful. Thank you
#include <stdio.h>
#include <stdlib.h>
struct protein{
char proteinBrand[100];
int unitsInStock;
int unitsSold;
double averageReview;
int totalReviews;
};
int compareProtein (const void * a, const void * b)
{
struct protein p1 = *((struct protein *)a);
struct protein p2 = *((struct protein *)b);
if(p1.averageReview < p2.averageReview)
return 1;
else if(p1.averageReview > p2.averageReview )
return -1;
else
return 0;
}
int main(int argc, char const *argv[])
{
if(argc < 2)//if less
{
printf("Usage: ./a.out protein.txt ");
return 0;
}
struct protein protein_powders[100];
FILE *myFile=fopen(argv[1],"r");//will open what is typed by user
FILE *wFile=fopen("protein.txt.rcd","w");//written to new file
int n=0;
if(myFile==NULL)//error code
{
printf("Error while open the file");
return 1;
}
else
{
int inp =0;
while(inp!=-1)
{
inp = fscanf(myFile,"%d %d %lf %d %[^ ]s ",&protein_powders[n].unitsInStock,&protein_powders[n].unitsSold,&protein_powders[n].averageReview,&protein_powders[n].totalReviews,protein_powders[n].proteinBrand);
n++;
}
}
qsort(protein_powders, n, sizeof(struct protein), compareProtein);
int i;
for(i=0;i<n-1;i++)
{
if(protein_powders[i].averageReview>=4)
{
fprintf(wFile,"%d %d %.2lf %d %s ",protein_powders[i].unitsInStock,protein_powders[i].unitsSold,protein_powders[i].averageReview,protein_powders[i].totalReviews,protein_powders[i].proteinBrand);
fprintf(wFile," ");
}
}
printf("Sorted and written to protein.txt.rcd ");
fclose(myFile);
fclose(wFile);
return 0;
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.