"не была объявлена ​​в этой области"

Итак, я писал эту простую программу, чтобы рассчитать день любой даты, используя алгоритм Гаусса, найденный здесь.

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

Это очень простая программа, и что еще более озадачивает результат.

: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

В нем говорится, что моя переменная не используется, но потом говорит, что она не объявлена? Может кто-нибудь, пожалуйста, скажите мне, что случилось.

Ответы

Ответ 1

Объем переменной всегда является блоком, внутри которого он находится. Например, если вы делаете что-то вроде

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.

Решение состоит в том, чтобы определить y вне блоков if

int y; //y is created

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

cout << y << endl; //Ok

В вашей программе вам нужно переместить определение y и c из блоков if в более высокую область. Ваша функция будет выглядеть следующим образом:

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

Ответ 2

Вам нужно объявить y и c вне области действия инструкции if/else. Переменная действительна только внутри объявленной области (и область видимости помечена {})

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

Ответ 3

Здесь приведен упрощенный пример, основанный на вашей проблеме:

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

В приведенной выше версии у вас есть переменная с именем y, которая ограничена областью 1, а другая переменная называется y, которая ограничена областью 2. Затем вы пытаетесь обратиться к переменной с именем y после конец if, а не такая переменная y можно увидеть, потому что в этой области не существует такой переменной.

Вы решаете проблему, разместив y в самой внешней области, содержащей все ссылки на нее:

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

Я написал пример с упрощенным составленным кодом, чтобы сделать его более понятным для понимания проблемы. Теперь вы должны применить этот принцип к своему коду.

Ответ 4

Здесь

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

вы объявляете и инициализируете переменные y, c, но вы не используете их вообще, пока не закончите работу. Вот почему вы получаете сообщение unused.

В дальнейшем функция y, c не объявлена, поскольку объявления, которые вы сделали, удерживаются внутри блока, в котором они были сделаны (блок между фигурными скобками {...}).

Ответ 5

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