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

上記のバージョンでは、スコープ 1 に限定された という変数と、スコープ 2 に限定されたy別の変数 が呼び出されています。そのスコープにはそのような変数が存在しないためです。yyify

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 に答える
-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 に答える