2012-04-07 16 views
15

Así que estaba escribiendo este sencillo programa para calcular el día de cualquier fecha usando el algoritmo gaussiano encontrado here.'no se declaró en este ámbito' error

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

Es un programa muy simple y lo que es aún más desconcertante es la salida.

:In function dayofweek(int, int, int)’: 
:19: warning: unused variable ‘y’ 
:19: warning: unused variable ‘c’ 
:21: warning: unused variable ‘y’ 
:21: warning: unused variable ‘c’ 
:23: error: ‘y’ was not declared in this scope 
:25: error: ‘c’ was not declared in this scope 

Dice que mi variable no está en uso pero luego dice que no está declarada? ¿Alguien podría decirme qué está mal?

+1

Las variables locales no son visibles fuera del bloque '{}' donde se declaran. – DCoder

Respuesta

7

El alcance de una variable es siempre el bloque en el que se encuentra. Por ejemplo, si haces algo como

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 solución es definir y fuera de los si los bloques

int y; //y is created 

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

cout << y << endl; //Ok 

En el programa se tiene que mover la definición de Y y C de la si los bloques en el alcance más alto. Su función se vería así:

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

Gracias: D Lo entiendo ahora. – cortex

2

Debe declarar y y c fuera del alcance de la instrucción if/else. Una variable sólo es válida dentro del ámbito de aplicación se declara (y un ámbito está marcado 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

Es posible que desee introducir una descripción de por qué esto corrige el problema. –

+0

Gracias de todos modos: D – cortex

1

Aquí

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

que declarar e inicializar las variables y, c, pero no se usa ellos en absoluto antes de que se les acabe el alcance. Es por eso que obtienes el mensaje unused.

Más adelante en la función, y, c no están declarados, porque las declaraciones que realizó solo se mantienen dentro del bloque en el que se hicieron (el bloque entre las llaves {...}).

2

Aquí está un ejemplo simplificado basado en de su 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 

En la versión anterior tiene una variable llamada y que se limita al ámbito de aplicación 1, y otra variable diferente llamada y que está confinada al alcance 2. Luego intenta referirse a una variable llamada y después del final de if, y no se puede ver esa variable y porque no existe tal variable en ese alcance.

a resolver el problema mediante la colocación de y en el perímetro más externo que contiene todas las referencias a ella:

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

He escrito el ejemplo con simplificadas compuesto por código para hacerlo más claro para que usted entienda el tema . Ahora debería poder aplicar el principio a su código.

+0

Gracias: D Funciona ahora. – 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; 
} 
Cuestiones relacionadas