2016-04-05 31 views
-4

Başka bir işlevdeki başka değişkenlere nasıl erişirim? Ne demek istediğimi biliyorumC++ işaretçiler ve referanslar?

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, ben, parametrelerinde elle giriş s1, s2, s3 zorunda kalmak istemiyorum? Bunun işaretçilerle bir ilgisi olduğunu biliyorum, bu doğru mu?

Referans değişkenlerini kullanmak için programımı düzenledim, doğru kullanıp kullanmadığımı söyleyebilir misiniz? References vs pointers -

#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

Yapmıyorsunuz.Parametreleri, adres (veya referans) yoluyla, çağrılan işlevin parametre listesinde resmi işaretçi (veya referanslar) olarak bildirerek ve bunları çağrı verenin veri değişkenlerine yazmak için bunları devre dışı bırakarak geçirirsiniz. – WhozCraig

+0

Değişkenler farklı kapsamdadır, bu nedenle bunları yönteme iletmeniz gerekir. ** AMA ** onları sınıflara koyabilirsiniz (ve değişkenler tüm sınıf üyeleriyle paylaşılacak) – AsfK

+0

@WhozCraig Resmi işaretçiler ve materyaller öğrenmedim, basit bir örneğim olabilir, böylece bunu uygulayabilirim benim koduma – Panthy

cevap

0

Maalesef dün gece postala. Üzerinde çalıştım ve profesörümden biraz yardım aldım, cevabımı sizlerle paylaşmak istedim.

Özellikle daha iyi/daha verimli bir şekilde yapılabilen şeylerde biraz yapıcı eleştiriler rica ediyorum. Ben bunları doğru kullanılırsa

#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; 

}

Hala emin değilim ben referans parametreleri asmak var düşünüyorum, ama. Beni doğru yönde işaret etmekten çekinmeyin!

1

yorumlarda WhozCraig bahsettiği bağlantı uyarınca, başvuruları kullanılması tavsiye edilir. İşaretçi aritmetiği ile oynamak istemiyorsanız, genellikle işaretçiler kullanmak kötü bir uygulama olarak kabul edilir.

#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; 
} 

Düzenleme: İşte değiştirilmiş kodudur ana() yöntemini ve gradesInput bir cout deyimi() sadece doğrudan programını çalıştırmak için etkinleştirmek için ekledik. Bunları kaldırmamı isterseniz lütfen bana bildirin.

1

Başka bir scope olan değişkenlere erişemezsiniz. Ancak, değişkenleri ya kendi adreslerini kullanarak ya da doğrudan C++ referanslarını kullanarak iletebilirsiniz. İşaretçiler

"call-by-reference" denir Bu tür çağrı kullanma

wich ilk kapsamına değişken görünenin değişiklik yapmadan ama başka bir etki alanındaki değişkenlere geçmesine izin verir:

// 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 sonra buna benzer görünmelidir:

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; 
} 

Referansları Kullanma

Tüm bu işaretçi şeyler yeni başlayanlar için biraz bunaltıcı olabileceğinden çok daha kolay bir çözüm var: C++ Reference. Size gerçek bir çağrı bazında referans izin ve işaretçileri ile oldukça gibi çok yapmak zorunda değilsiniz:

// 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; 
} 

Ve average3Scores sonra aşağıdaki gibi görünecektir: sıramı

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

Yeni koduma bir göz atabilir misin? Çok fazla bakmadan kendi kendime yapmaya çalıştım ama düzgün çalışmasını sağlayamadım – Panthy