2016-04-05 4 views
-4

Как получить доступ к другим функциям, определенным переменным в другой функции?C++ указатели и ссылки?

void gradesInput() { 
    int s1, s2, s3; 
    cout << "Please enter your test scores, in order from the first to last.\n"; 
    cin >> s1 >> s2 >> s3; 
    if (s1 < 0 || s1 > 100) { 
     cout << "Your first test score is not a valid number, please re-enter: "; 
     cin >> s1; 
    } 
    else if (s2 < 0 || s2 > 100) { 
     cout << "Your second test score is not a valid number, please re-enter: "; 
     cin >> s2; 
    } 
    else if (s3 < 0 || s3 > 100) { 
     cout << "Your third test score is not a valid number, please re-enter: "; 
     cin >> s3; 
    } 
} 

double average3Scores(int s1, int s2, int s3) { 
    gradesInput(); 
    double avg = (int)(((s1 + s2 + s3)/3.0) + 0.5); //rounded average 
    return avg; 
} 

В Average3Scores, я не хочу, чтобы вручную вводить s1, s2, s3 в параметрах, если вы знаете, что я имею в виду? Я знаю, что это имеет какое-то отношение к указателям, это правильно?

Я редактировал свою программу для использования ссылочных переменных, можете ли вы сказать мне, правильно ли я использую ее?

#include <iostream> 
using namespace std; 

void gradesInput(int &test1, int &test2, int &test3) { 
    cout << "You will be prompted to enter your three test scores" << endl; 
    cout << "Please make sure your number is between 0 and 100." << endl; 
    cout << "Please enter your first test score: "; 
    cin >> test1; 
    cout << "\nPlease enter your second test score: "; 
    cin >> test2; 
    cout << "\nPlease enter your third test score: "; 
    cin >> test3; 
} 

double average3Scores(int test1, int test2, int test3) { 
    double avg1 = ((test1 + test2 + test3)/3.0); // calculating the average without rounding 
    avg1 = (int)(avg1 + 0.5); //this rounds the test average 
    return avg1; 
} 

double average2Scores(int test2, int test3) { 
    double avg2 = ((test2 + test3)/2.0); 
    avg2 = (int)(avg2 + 0.5); 
    return avg2; 
} 

char toLetterGrade(double avg1, double avg2, int test3) { 
    if (avg1 >= 90) 
     return 'A'; 
    else if (avg1 >= 70) 
     if (test3 >= 90) 
      return 'A'; 
     else 
      return 'B'; 
    else if (avg1 >= 50) 
     if (avg2 >= 70) 
      return 'C'; 
     else 
      return 'D'; 
    else 
     return 'F'; 
} 

void displayGrade(double avg, char lGrade) { 
    cout << "Your average is: " << avg << endl; 
    cout << "Your grade is: " << lGrade << endl; 
} 

int main() { 
    int test1, test2, test3; 
    double avg1, avg2; 
    char lGrade; 
    gradesInput(test1, test2, test3); 
    average3Scores(test1, test2, test3); 
    average2Scores(test2, test3); 
    toLetterGrade(avg1, avg2, test3); 
    displayGrade(avg1, lGrade); 
    system("pause"); 
    return 0; 
} 
+0

У вас нет.Вы передаете параметры по адресу (или ссылке), объявляя их как формальные указатели (или ссылки) в списке параметров вызываемой функции и разыгрывая их внутри для записи в переменные данных вызывающего. – WhozCraig

+0

Переменные находятся в разных областях, поэтому вы должны передать их в методе. ** BUT ** вы можете поместить их в класс (и переменные будут делиться со всеми членами класса) – AsfK

+0

@WhozCraig Я еще не изучил формальные указатели и прочее, могу ли я иметь простой пример, чтобы я мог его реализовать к моему коду? – Panthy

ответ

0

Извините за мой сообщение прошлой ночью. Я работал над этим и получил небольшую помощь от своего профессора, поэтому хотел поделиться своим ответом с вами, ребята.

Я прошу немного конструктивной критики, особенно о том, что могло бы быть сделано лучше/эффективнее.

#include <iostream> 
using namespace std; 

void gradesInput(int& s1, int& s2, int& s3) { 
    cout << "Please enter your test scores, in order from the first to last.\n"; 
    cin >> s1 >> s2 >> s3; 
    if (s1 < 0 || s1 > 100) { 
     cout << "Your first test score is not a valid number, please re-enter: "; 
     cin >> s1; 
    } 
    else if (s2 < 0 || s2 > 100) { 
     cout << "Your second test score is not a valid number, please re-enter: "; 
     cin >> s2; 
    } 
    else if (s3 < 0 || s3 > 100) { 
     cout << "Your third test score is not a valid number, please re-enter: "; 
     cin >> s3; 
    } 
} 


double average3Scores(int s1, int s2, int s3) { 
    double avg = (int)(((s1 + s2 + s3)/3.0) + 0.5); //rounded average 
    return avg; 
} 

double average2Scores(int s2, int s3) { 
    double avg = (int)(((s2 + s3)/2.0) + 0.5); 
    return avg; 
} 

char toLetterGrade(double avg, double avg2, int s3){ 
    if (avg >= 90) 
     return 'A'; 
    else if (avg >= 70) { 
     if (s3 >= 90) 
      return 'A'; 
     else 
      return 'B'; 
    } 
    else if (avg >= 50) { 
     if (avg2 >= 70) 
      return 'C'; 
     else 
      return 'D'; 
    } 
    else 
     return 'F'; 
} 

void displayGrade(double avg, char lGrade) { 
    cout << "Average of 3 test scores is : " << avg; 
    cout << endl << "Your grade is : " << lGrade << endl; 
} 


int main() { 
    int s1, s2, s3; 

    gradesInput(s1, s2, s3); //works 
    double avg1 = average3Scores(s1, s2, s3); //works 
    double avg2 = average2Scores(s2, s3); //works 
    displayGrade(avg1, toLetterGrade(avg1, avg2, s3)); 

    system("pause"); 
    return 0; 

}

Я думаю, что я получил повесить эталонных параметров, но до сих пор не уверен, если я их правильно. Не стесняйтесь указывать мне в правильном направлении!

1

Рекомендуется использовать ссылки, согласно ссылке, упомянутой WhozCraig в комментариях - References vs pointers. Обычно считается неправильной практикой использования указателей, если вы не собираетесь играть с арифметикой указателя. Вот ваш измененный код:

#include <iostream> 
using namespace std; 

void gradesInput(int &s1, int &s2, int &s3) { 
    cout << "Please enter your test scores, in order from the first to last.\n"; 
    cin >> s1 >> s2 >> s3; 
    if (s1 < 0 || s1 > 100) { 
     cout << "Your first test score is not a valid number, please re-enter: "; 
     cin >> s1; 
    } 
    else if (s2 < 0 || s2 > 100) { 
     cout << "Your second test score is not a valid number, please re-enter: "; 
     cin >> s2; 
    } 
    else if (s3 < 0 || s3 > 100) { 
     cout << "Your third test score is not a valid number, please re-enter: "; 
     cin >> s3; 
    } 
    else cout<<s1<<" "<<s2<<" "<<s3; 
} 

double average3Scores() { 
    int s1, s2, s3; 
    gradesInput(s1,s2,s3); 
    double avg = (int)(((s1 + s2 + s3)/3.0) + 0.5); //rounded average 

    return avg; 
} 

int main() { 
    average3Scores(); 
    return 0; 
} 

Edit: я добавил метод Main() и одно заявление COUT в gradesInput() просто, чтобы вы могли сразу запустить программу. Пожалуйста, дайте мне знать, если вы хотите, чтобы я их удалил.

1

Вы не можете получить доступ к переменным, которые находятся в другом scope. Однако вы можете передавать переменные по ссылке, используя их адреса или напрямую, используя ссылки на C++.

Использование указателей

Этот тип вызова называется «вызов по ссылке» которым позволяет передавать переменные из одной сферы в другую, но делая изменения переменной видимым для первой сферы:

// declare gradesInput to take pointers as parameters 
void gradesInput(int* s1, int* s2, int* s3) 
{ 
    // access the chunk of memory the pointer points to by dereferencing it 
    *s1 = 1; // "set the variable s1 pointes to to 1" 
    *s2 = 2; 
    *s3 = 3; 
} 

average3Scores должен выглядеть примерно так:

double average3Scores() 
{ 
    int s1, s2, s3; 
    gradesInput(&s1, &s2, &s3); // turn a simple interger variable into a pointer to an int by using the address-off-operator & 
    double avg = (int)(((s1 + s2 + s3)/3.0) + 0.5); //rounded average 
    return avg; 
} 

Использование ссылок

Поскольку эта целая вещь указателя может быть немного подавляющей для новичков, существует гораздо более простое решение: Справочник по C++. Они позволяют вам реальный вызов по ссылке, и вы не должны делать совершенно так же, как с указателями:

// instead of declaring s1, s2 and s3 as pointers simply declare them as a reference 
void gradesInput(int& s1, int& s2, int& s3) 
{ 
    s1 = 1; // use them like you're used to 
    s2 = 2; 
    s3 = 3; 
} 

И average3Scores будет выглядеть следующим образом:

double average3Scores() 
{ 
    int s1, s2, s3; 
    gradesInput(s1, s2, s3); // pass them like a "normal" variable, they will then "magically" be changed ;) 
    double avg = (int)(((s1 + s2 + s3)/3.0) + 0.5); //rounded average 
    return avg; 
} 
+0

Можете ли вы проверить мой новый код? Я попытался сделать это сам, не слишком много, но не смог заставить его работать должным образом – Panthy

Смежные вопросы