Помощь с базовым C ++ на основе GPA калькулятор и использование Cin - PullRequest
3 голосов
/ 24 июня 2011

Я пытаюсь создать простой калькулятор GPA, который предлагает пользователю ввести количество курсов (используя новые). Затем следует цикл for в зависимости от количества курсов, в котором пользователю предлагается ввести оценку и количество кредитов для класса. Программа завершает цикл и ошибки. Пожалуйста помоги. Вот код (мой первый раз, используя этот форум сайта кстати):

#include <iostream>
#include <conio.h>
using namespace std;

 int main(){
   cout<<"Welcome to the GPA calculator";
   cout <<endl;
   cout<<"Please enter the number of courses you wish to calculate : ";
  int*numberOfCourses = new int;
  cin>>*numberOfCourses; //must dereference as it is a pointer and I AM SETTING variable.
  char grade, *credits= new char; 
  int gradesOfPerson = 0;
  int*score = new int; 
  int j = 0;
  int i = 0; 
  int*cumulativeScore= new int; 

  while( i< *numberOfCourses){
  cout <<"Please enter the credits of your " <<(i+1) <<" course. " ;
  cin >>*credits;
  cin.get();
  cout << "Please enter your grade :";
  cin>>(grade); 
  cout <<endl;
  switch (grade){
   case 1: if (grade=='A'){
        *score = 4;
        break; }
   case 2: if (grade=='B'){
        *score = 3;
        break; }
   case 3: if (grade=='C'){
        *score = 2;
        break; }
   case 4: if (grade=='D'){
        *score = 1;
        break; }

   case 5: if (grade=='D'){
        *score = 1;
        break; }
   case 6: if (grade =='E'){
        *score = 0;
        break;
        }
        }
   gradesOfPerson = ((*score)*(*credits));
   cumulativeScore += gradesOfPerson;
   i++;
   }
 int gpa = (*cumulativeScore)/(*numberOfCourses); 
 cout <<"Your GPA is : " <<gpa;
 delete numberOfCourses, credits, score, cumulativeScore;
 }

Извините за плохой отступ (используя Dev C ++)

Ответы [ 4 ]

2 голосов
/ 24 июня 2011

Есть ряд проблем с вашим кодом, но не думайте, что я обескураживаю, указывая на них.Если вы относительный новичок, это очень хорошо.

Основная проблема заключается в следующей строке:

cumulativeScore += gradesOfPerson;

.Вы объявили cumulativeScore как указатель ;он содержит адрес интересующих вас данных, а не сами данные.Вам следует либо изменить это значение на

*cumulativeScore += gradeOfPerson

, либо сделать cumulativeScore целочисленной переменной (и изменить все места, где вы используете ее в качестве указателя).

Другая ключевая ошибка в вашем Смена оператора .Вместо чего-то вроде:

case 4: if (grade == 'D') {
 // logic to execute if grade is 'D'
}
break;

сделайте это:

case 'D':
 // logic to execute if grade is 'D'
break; 

Далее вам нужно инициализировать *cumulativeScore равным 0, потому что в начале выполнения он может содержать что угодно.

Наконец, *score должен быть числовым типом, а не символом.Значение символа '4', интерпретируемое как число, на самом деле не равно 4, что вызывает ошибки, потому что вы рассматриваете его как таковой.Для справки см. Список кодов символов ASCII здесь: http://www.asciitable.com/

Что касается других проблем (которые на самом деле не вызывают сбой вашей программы, но не являются лучшими практиками):

  • Вы используете указатели странно - почему бы просто не выделить обычные переменные?Вы сделали это с grade, gradesOfPerson, i и j, так что вы четко знаете, как это сделать.Почему вы выбрали указатели для остальных переменных?
  • Не включайте conio.h.Прежде всего, вы не используете ни одну из объявленных там функций.Во-вторых, он нестандартный и недоступен на большинстве платформ.
  • Вам следует больше обрабатывать ошибки: вводит ли пользователь разумные оценочные буквы?Вы уверены, что количество курсов, которые они посещают, положительное?И так далее.

Наконец, в качестве заметки, вы можете бесплатно получить версию Microsoft Visual C ++ для Express.Он активно поддерживается и опережает Dev-C ++ на несколько световых лет (например, он помогает правильно делать отступы для кода!: D)

Удачи!

1 голос
/ 24 июня 2011

На этой строке:

cumulativeScore += gradesOfPerson;

cumulativeScore - указатель, поэтому эта линия перемещается туда, куда указывает. Вы, вероятно, хотите написать:

*cumulativeScore += gradesOfPerson;

Причина его сбоя в том, что вы двигались туда, куда указывал cumulativeScore, и позже, когда вы пытались разыменовать его, он указывал на недопустимую память.

0 голосов
/ 24 июня 2011

Кстати, ваше утверждение delete сильно нарушено.Вы не можете удалить несколько переменных за один раз, этот

delete numberOfCourses, credits, score, cumulativeScore;

фактически использует оператор запятой C ++, который отбрасывает его левую часть, поэтому только cumulativeScore освобождается.

0 голосов
/ 24 июня 2011

Не видя ошибки, трудно сказать, что не так, но на первый взгляд, если строка gpa (int gpa = (*cumulativeScore)/(*numberOfCourses);) не выдает ошибку сейчас, это может произойти в будущем.gpa должно быть double.

...