Search code examples
cvariablesloopsfor-loopupdating

For/while loop doesn't update value properly


I'm trying to write a program which finds the weighted average (for grades and such). Through user input, I create two arrays of the same size, one carrying the weights for each grading category, and the other holding the users score in the corressponding category. For example, if a student has a score of 92% in category 1, which is worth 30% of the total grade, then weights[1] = .3 and scores[1] = .92. This way, the average in each category can be found through (weights[i] * scores[i]) where i is an instance variable initialized in a for loop to go through each array entirely. The problem here is in finding the cumulative average- my program is written to compound the values of each average it handles for example I have tried code like average = average + (weights[i] * scores[i]) to obtain the final cumulative average. However through print statements I've found the value of average is set to the last (weights[i] * scores[i]) operation performed, ignoring the previous value of average (or taking it to be 0). For example, if weights[]={.3, .3, .4} and scores[] = {.4, .4 , .4}. The cumulative average should be .4, but my program tells me .32, which is the last value of weights times the last value of scores.

methods.c:

#include <stdio.h>
#include "methods.h"

int howManyCategories()
{
 int categories = 0;
 int firstTime = 0;

 while(1)
 {
  if(firstTime == 0)
  {
   fprintf(stdout, "\nHow many categories are you currently graded on? ");
   scanf("%d", &categories);
  }
  else
  {
   fprintf(stdout, "\nThat's not a valid value, try a positive integer. ");
   scanf("%d", &categories);
  }

  firstTime++;

  if(categories > 0)
  {
   return categories;
  }
 }
}

double howMuchWeight(int categories)
{
 double weight = 0;

 while(1)
 {
  if(categories == 1)
  {
   fprintf(stdout, 
   "\nThis %d category accounts for how much of your grade? (.1, .85, 1 etc.) ", 
   categories);
   scanf("%lf", &weight);
  }
  else
  {
   fprintf(stdout, 
   "\nThese %d categories account for how much of your grade? (.1, .85, 1 etc.) ", 
   categories);
   scanf("%lf", &weight);
  }

  if(weight > 1 || weight <= 0)
  {
   fprintf(stdout, 
   "\nRemember, total weighting must be positive and no larger than 1" 
   " (100 percent). \nTry Again.\n");
  }
  else 
  {
   return weight;
  }
 }
}

double findWeightsAndScores(int i, double categories, 
                            double checkWeights, double totalWeight, 
                            double scores[])
{
 while(1)
 {
  double piece = 0;
  int count = i + 1;

  fprintf(stdout, "\nWeight for category %d: ", count);
  scanf("%lf",&piece);

  if(piece > 0 && piece < 1)
  {
   findScores(i, &scores[i]);
   return piece;
  }
  else
  {
   fprintf(stdout, "\nRemember, weights must be positive and less than 1!\n");
  }
 }
}

void findScores(int i, double scores[])
{
 int validScore = 0;

 while(validScore == 0)
 {
  int count = i + 1;
  double score = 0;

  fprintf(stdout, "Please enter your percentage score in category %d: ", count);
  scanf("%lf", &score);

  if(score >= 0 && score <= 1)
  {
   scores[i] = score;
   validScore = 1;
  }
  else
  {
   fprintf(stdout, "\nRemember, scores in each category must be positive, no greater "
   "than 1 (100 percent) and no less than 0, try again.\n\n");
  }
 } 
}

double findAverage(int categories, double weights[], double scores[])
{
 double average = 0;

 for(int i = 0; i <= categories - 1; i++)
 {
  average += (weights[i] * scores[i]);
  fprintf(stdout, "%lf", average);
 }

 return average;
}

methods.h:

#ifndef METHODS_H_
#define METHODS_H_

int howManyCategories();
double howMuchWeight(int categories);
double findWeightsAndScores(int i, double categories, 
       double checkWeights, double totalWeight, double scores[]);
void findScores(int i, double scores[]);
double findAverage(int categories, double weights[], double scores[]);

#endif

whatsmyGrade.c:

#include <stdio.h>
#include "methods.h"

int main()
{
 while(1)
 {
  /*Prompts for categories*/
  int categories = howManyCategories();
  int dataProvided = 1;

  double checkWeights = 0;
  double grade = 0;
  double average = 0;

  /*Prompts for total weight*/
  double totalWeight = howMuchWeight(categories);

  double category[categories];
  double weights[categories];
  double scores[categories];

  /*Assign weights to each category and score in each category*/ 
  for(int i = 0; i <= categories - 1; i++)
  {        
   /*Fill array for weights*/ 
   weights[i] = findWeightsAndScores(i, categories, checkWeights, totalWeight,
   scores);

   checkWeights = checkWeights + weights[i];

   if(checkWeights != totalWeight && i == categories - 1)
   {
    fprintf(stdout, "\nYour weight distribution is invalid! Try again.\n");
    dataProvided = 0;
    break;
   }
  } 

  /*Calculate total grade*/
  if(dataProvided == 1)
  {
   average = findAverage(categories, weights, scores);

   grade = (average / totalWeight) * 100;
   fprintf(stdout, "Your cumulative average is %.2lf percent\n\n", grade);

   return 1;
  }


 }/*End of parent while loop*/ 
}/*End of main*/

Thank you in advance


Solution

  • Got it, when I call the findScores function in the findWeightsAndScores function I was passing it &scores[i] when I should have been passing it scores. Thanks guys