"не была объявлена в этой области"
Итак, я писал эту простую программу, чтобы рассчитать день любой даты, используя алгоритм Гаусса, найденный здесь.
#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;
}