2012-04-07 12 views
15

Quindi stavo scrivendo questo semplice programma per calcolare il giorno di qualsiasi data usando l'algoritmo gaussiano trovato here.errore 'non è stato dichiarato in questo ambito'

#include <iostream> 
using namespace std; 

//Using the Gaussian algorithm 
int dayofweek(int date, int month, int year){ 
    int d=date; 
    if (month==1||month==2) 
     {int y=((year-1)%100);int c=(year-1)/100;} 
    else 
     {int y=year%100;int c=year/100;} 
    int m=(month+9)%12+1; 
    int product=(d+(2.6*m-0.2)+y+y/4+c/4-2*c); 
    return product%7; 
} 

int main(){ 
    cout<<dayofweek(19,1,2054); 
    return 0; 
} 

È un programma molto semplice e ciò che è ancora più sconcertante è l'output.

Si dice che la mia variabile non è utilizzata ma poi dice che non è dichiarata? Qualcuno potrebbe dirmi cosa c'è di sbagliato.

+1

Le variabili locali non sono visibili al di fuori del blocco '{}' dove vengono dichiarate. – DCoder

risposta

7

L'ambito di una variabile è sempre il blocco in cui si trova. Per esempio se si fa qualcosa di simile

if(...) 
{ 
    int y = 5; //y is created 
} //y leaves scope, since the block ends. 
else 
{ 
    int y = 8; //y is created 
} //y leaves scope, since the block ends. 

cout << y << endl; //Gives error since y is not defined. 

La soluzione è quella di definire y al di fuori dei se i blocchi

int y; //y is created 

if(...) 
{ 
    y = 5; 
} 
else 
{ 
    y = 8; 
} 

cout << y << endl; //Ok 

Nel programma si deve spostare la definizione di Y e C fuori se i blocchi nello scopo più elevato. La funzione quindi sarebbe simile a questa:

//Using the Gaussian algorithm 
int dayofweek(int date, int month, int year) 
{ 
    int y, c; 
    int d=date; 

    if (month==1||month==2) 
    { 
     y=((year-1)%100); 
     c=(year-1)/100; 
    } 
    else 
    { 
     y=year%100; 
     c=year/100; 
    } 
int m=(month+9)%12+1; 
int product=(d+(2.6*m-0.2)+y+y/4+c/4-2*c); 
return product%7; 
} 
+0

Grazie: D Capisco ora. – cortex

2

È necessario dichiarare y e c al di fuori dell'ambito dell'istruzione if/else. Una variabile è valida solo all'interno del campo di applicazione è dichiarato (e un ambito è contrassegnato con {})

#include <iostream> 
using namespace std; 
//Using the Gaussian algorithm 
int dayofweek(int date, int month, int year){ 
int d=date; 
int y, c; 
if (month==1||month==2) 
     {y=((year-1)%100);c=(year-1)/100;} 
else 
     {y=year%100;c=year/100;} 
int m=(month+9)%12+1; 
int product=(d+(2.6*m-0.2)+y+y/4+c/4-2*c); 
return product%7; 
} 

int main(){ 
cout<<dayofweek(19,1,2054); 
return 0; 
} 
+2

Si potrebbe voler inserire una descrizione del perché questo corregge il problema. –

+0

Grazie comunque: D – cortex

1

Qui

{int y=((year-1)%100);int c=(year-1)/100;} 

si dichiara e inizializzare le variabili y, c, ma non utilizzato a tutti loro prima che finiscano l'ambito. Ecco perché ricevi il messaggio unused.

In seguito, la funzione, y, c non è dichiarata, perché le dichiarazioni che sono state eseguite sono valide solo all'interno del blocco in cui sono state create (il blocco tra le parentesi graffe {...}).

2

Ecco un esempio semplificato sulla base del problema:

if (test) 
{//begin scope 1 
    int y = 1; 
}//end scope 1 
else 
{//begin scope 2 
    int y = 2;//error, y is not in scope 
}//end scope 2 
int x = y;//error, y is not in scope 

Nella versione di cui sopra si dispone di una variabile chiamata y che si limita al campo di applicazione 1, e un'altra variabile diversa denominata che si limita all'ambito 2. Si tenta quindi di fare riferimento a una variabile denominatadopo la fine dello if e non si può vedere tale variabile perché non esiste alcuna variabile di questo tipo in tale ambito.

a risolvere il problema mettendo y nel perimetro più esterno che contiene tutti i riferimenti ad esso:

int y; 
if (test) 
{ 
    y = 1; 
} 
else 
{ 
    y = 2; 
} 
int x = y; 

ho scritto l'esempio con semplificato fatto fino codice per renderlo più chiaro per voi di capire il problema . Ora dovresti essere in grado di applicare il principio al tuo codice.

+0

Grazie: D Funziona ora. – cortex

-2
#include <iostream> 
using namespace std; 
class matrix 
{ 
    int a[10][10],b[10][10],c[10][10],x,y,i,j; 
    public : 
     void degerler(); 
     void ters(); 
}; 
void matrix::degerler() 
{ 
    cout << "Satırları giriniz: "; cin >> x; 
    cout << "Sütunları giriniz: "; cin >> y; 
    cout << "İlk matris elamanlarını giriniz:\n\n"; 
    for (i=1; i<=x; i++) 
    { 
     for (j=1; j<=y; j++) 
     { 
      cin >> a[i][j]; 
     } 
    } 
    cout << "İkinci matris elamanlarını giriniz:\n\n"; 
    for (i=1; i<=x; i++) 
    { 
     for (j=1; j<=y; j++) 
     { 
      cin >> b[i][j]; 
     } 
    } 
} 

void matrix::ters() 
{ 
    cout << "matrisin tersi\n"; 
    for (i=1; i<=x; i++) 
    { 
     for (j=1; j<=y; j++) 
     { 
    if(i==j) 
    { 
    b[i][j]=1; 
    } 
    else 
    b[i][j]=0; 
    } 
} 
float d,k; 
    for (i=1; i<=x; i++) 
    { 
    d=a[i][j]; 
     for (j=1; j<=y; j++) 
     { 
    a[i][j]=a[i][j]/d; 
      b[i][j]=b[i][j]/d; 
    } 
     for (int h=0; h<x; h++) 
     { 
      if(h!=i) 
    { 
     k=a[h][j]; 
       for (j=1; j<=y; j++) 
       { 
        a[h][j]=a[h][j]-(a[i][j]*k); 
        b[h][j]=b[h][j]-(b[i][j]*k); 
       } 
    } 
    count << a[i][j] << ""; 
    } 
    count << endl; 
} 
} 
int main() 
{ 
    int secim; 
    char ch;  
    matrix m; 
    m.degerler(); 
    do 
    { 
    cout << "seçiminizi giriniz\n"; 
    cout << " 1. matrisin tersi\n"; 
    cin >> secim; 
    switch (secim) 
    { 
     case 1: 
      m.ters(); 
      break; 
    } 
    cout << "\nBaşka bir şey yap/n?"; 
    cin >> ch; 
    } 
    while (ch!= 'n'); 
    cout << "\n"; 
    return 0; 
} 
Problemi correlati