36

所以我正在编写这个简单的程序来使用此处找到的高斯算法计算任何日期的日期。

#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

它说我的变量未使用,但又说它没有声明?谁能告诉我怎么了。

4

6 回答 6

26

变量的范围始终是它所在的块。例如,如果您执行类似的操作

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.

解决方案是在 if 块之外定义 y

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;
}
于 2012-04-07T16:21:39.723 回答
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;

我用简化的代码编写了这个例子,让你更清楚地理解这个问题。您现在应该能够将该原则应用于您的代码。

于 2012-04-07T16:23:42.550 回答
2

您需要在 if/else 语句的范围之外声明 y 和 c。变量只在它声明的范围内有效(并且范围用 { } 标记)

#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; 
} 
于 2012-04-07T16:18:05.610 回答
1

这里

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

您声明并初始化变量y, c,但在它们超出范围之前您根本没有使用它们。这就是你收到unused消息的原因。

稍后在函数中,y, c未声明,因为您所做的声明仅保留在它们所在的块内(大括号之间的块{...})。

于 2012-04-07T16:20:34.893 回答
0

我只是想补充一点,对我来说,错误是由于其中一个文件头保护中的粗心错误造成的。代替:

#ifndef MY_AWESOME_HEADER_H
#define MY_AWESOME_HEADER_H
...
#endif // MY_AWESOME_HEADER_H

我有

#ifdef MY_AWESOME_HEADER_H
#define MY_AWESOME_HEADER_H
...
#endif // MY_AWESOME_HEADER_H
于 2021-11-23T17:49:39.457 回答
-3
#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;
}
于 2017-01-08T14:08:43.337 回答