Коммутатор оқиғасының мәлімдемесінде «қайталанатын мән мәні» қате пайда болады. Неліктен біледі?

Мен рок-қағаз қайшыларына арналған бағдарлама бойынша жұмыс істеймін, бірақ бұл жолы компьютер жарты сағатты, қайшыны уақыттың үштен бірін және уақыттың тек алтыдан бір бөлігін таңдайды. Мұны қалай жасадық, мен компьютерді таңдаудың алты ықтимал мәнін келтірдім:

enum choicec {rock1, rock2, rock3, scissors1, scissors2, paper};
choicec computer;

Бірақ, компьютер таңдағаннан кейін, осы сандарды рок, қағаз немесе қайшыларға айналдыру керек. Мен бұны коммутатордың мәлімдемесін қолдандым:

switch(computer) {
        case rock1 || rock2 || rock3:
            c = 1;
            break;
        case scissors1 || scissors2: //ERROR!
            c = 3;
            break;
        case paper:
            c = 2;
            break;
    }

біреуі рок, екеуі қағаз, үшеуі қайшы. Дегенмен, қате туралы түсініктемеде жазылған жолда бұл маған қате жібереді: [Error] case value қайталанады.

Мен не себепті білмеймін. Кез келген идеялар?

3
{rock, scissors, paper} секілді енін таңдағаннан кейін, қажетті статистикалық процентильді қамтамасыз ету үшін кездейсоқ сандар генераторын ғана құрылымдалған ба?
қосылды автор Robert Harvey, көзі
{rock, scissors, paper} секілді енін таңдағаннан кейін, қажетті статистикалық процентильді қамтамасыз ету үшін кездейсоқ сандар генераторын ғана құрылымдалған ба?
қосылды автор Robert Harvey, көзі
rock1 || рок2 || rock3 шындықты (1), scissors1 || сияқты бағалайды scissors2 . Сізге бөлек жапсырмалар керек, бірақ төмен түсіруге болады, case rock1: case rock2: case rock3: c = 1; үзіліс; .
қосылды автор Daniel Fischer, көзі
case сөйлемдерінде || қолдануға болмайды. Кешіріңіз :(
қосылды автор Mooing Duck, көзі
case сөйлемдерінде || қолдануға болмайды. Кешіріңіз :(
қосылды автор Mooing Duck, көзі
рахмет балалар! бұл шын мәнінде пайдалы болды. енді бағдарлама жұмыс істейді.
қосылды автор Victor Odouard, көзі
рахмет балалар! бұл шын мәнінде пайдалы болды. енді бағдарлама жұмыс істейді.
қосылды автор Victor Odouard, көзі

8 жауаптар

case бөлімінде || функциясын пайдалана алмайсыз. Кешіріңіз :( || қолданған кезде логикалық немесе оларда « rock1 немесе rock2 немесе rock3 нөл емес пе? «. Жауап - иә, кем дегенде біреуі нөлге тең емес. Сондықтан rock1 || рок2 || rock3 - бұл true , бұл 1 . Және scissors1 || қайшы - бұл true , бұл 1 . Сондықтан 1 ісінің екі case бөлімшелері бар.

Бірнеше шартты таңдау үшін case жай-күйін пайдалану керек:

switch(computer) {
    case rock1: case rock2: case rock3:
        c = 1;
        break;
    case scissors1: case scissors2:
        c = 3;
        break;
    case paper:
        c = 2;
        break;
    default:
        std::cerr << "INVALID COMPUTER MOVE";
}

Сондай-ақ, мен әрдайым менің қосқыштарымның әдепкі параметріне ие боламын. Кейде қателер орын алады, және біз бұл істің қандай да бір саласына әсер етпегенін білгіңіз келеді. Мен else сөйлемдеріне қатысты өте параноидпын, бірақ else жоқ болса, бұл шамамен жартысы.

8
қосылды

case бөлімінде || функциясын пайдалана алмайсыз. Кешіріңіз :( || қолданған кезде логикалық немесе оларда « rock1 немесе rock2 немесе rock3 нөл емес пе? «. Жауап - иә, кем дегенде біреуі нөлге тең емес. Сондықтан rock1 || рок2 || rock3 - бұл true , бұл 1 . Және scissors1 || қайшы - бұл true , бұл 1 . Сондықтан 1 ісінің екі case бөлімшелері бар.

Бірнеше шартты таңдау үшін case жай-күйін пайдалану керек:

switch(computer) {
    case rock1: case rock2: case rock3:
        c = 1;
        break;
    case scissors1: case scissors2:
        c = 3;
        break;
    case paper:
        c = 2;
        break;
    default:
        std::cerr << "INVALID COMPUTER MOVE";
}

Сондай-ақ, мен әрдайым менің қосқыштарымның әдепкі параметріне ие боламын. Кейде қателер орын алады, және біз бұл істің қандай да бір саласына әсер етпегенін білгіңіз келеді. Мен else сөйлемдеріне қатысты өте параноидпын, бірақ else жоқ болса, бұл шамамен жартысы.

8
қосылды

switch операторы сіз ойлағандарды жасамайды.

Әр case computer мәні сәйкес келетін one мәнін анықтайды. Бір case этикеткасына байланысты мәнді беру үшін логикалық ажыратылуымен бірнеше мәндерді біріктіру computer мәні емес бұл мәндердің кез келген мәніне тең, бірақ бұл олардың логикалық OR құрамдастары нәтижесіне тең болғанда. Шын мәнінде өте маңызды емес.

Мағынасын арттыру үшін switch сөзін қайта жазуыңыз мүмкін:

switch(computer) {
    case rock1://Is it rock1?
    case rock2://Or perhaps rock2?
    case rock3://Or maybe rock3?
        c = 1; //Well, if it's one of the above, do this...
        break;
    case scissors1://OK, it wasn't. So is it scissors1?
    case scissors2://Or scissors2?
        c = 3;     //If it's one of the above, do this...
        break;
    case paper://So is it paper?
        c = 2;
        break;
    default://Always better to be explicit about this
        break;
}
4
қосылды

switch операторы сіз ойлағандарды жасамайды.

Әр case computer мәні сәйкес келетін one мәнін анықтайды. Бір case этикеткасына байланысты мәнді беру үшін логикалық ажыратылуымен бірнеше мәндерді біріктіру computer мәні емес бұл мәндердің кез келген мәніне тең, бірақ бұл олардың логикалық OR құрамдастары нәтижесіне тең болғанда. Шын мәнінде өте маңызды емес.

Мағынасын арттыру үшін switch сөзін қайта жазуыңыз мүмкін:

switch(computer) {
    case rock1://Is it rock1?
    case rock2://Or perhaps rock2?
    case rock3://Or maybe rock3?
        c = 1; //Well, if it's one of the above, do this...
        break;
    case scissors1://OK, it wasn't. So is it scissors1?
    case scissors2://Or scissors2?
        c = 3;     //If it's one of the above, do this...
        break;
    case paper://So is it paper?
        c = 2;
        break;
    default://Always better to be explicit about this
        break;
}
4
қосылды

Оны келесіге өзгертіңіз:

switch(computer) {
    case rock1:
    case rock2:
    case rock3:
        c = 1;
        break;
    case scissors1:
    case scissors2:
        c = 3;
        break;
    case paper:
        c = 2;
        break;
}

rock1 || rock2 || rock3 and scissors1 || scissors2 are both expressions which evaluate to "true", hence the conflict.

2
қосылды

Оны келесіге өзгертіңіз:

switch(computer) {
    case rock1:
    case rock2:
    case rock3:
        c = 1;
        break;
    case scissors1:
    case scissors2:
        c = 3;
        break;
    case paper:
        c = 2;
        break;
}

rock1 || rock2 || rock3 and scissors1 || scissors2 are both expressions which evaluate to "true", hence the conflict.

2
қосылды

Мен не істеп жатқанын білмеймін, бірақ қосылым мәлімдемесі осылай көрінуі керек

switch(computer) 
{
    case rock1:
    case rock2:
    case rock3:
        c = 1;
        break;
    case scissors1:
    case scissors2:
        c = 3;
        break;
    case paper:
        c = 2;
        break;
}
2
қосылды

Мен не істеп жатқанын білмеймін, бірақ қосылым мәлімдемесі осылай көрінуі керек

switch(computer) 
{
    case rock1:
    case rock2:
    case rock3:
        c = 1;
        break;
    case scissors1:
    case scissors2:
        c = 3;
        break;
    case paper:
        c = 2;
        break;
}
2
қосылды