2013-06-10 3 views
1

У меня есть следующий код, в котором для уникальной части проверки, независимо от ввода, я могу сказать, что все являются уникальными символами. Есть ли что-то, что я пропустил логически в случае 2 ??C++ уникальная проверка персонажа

***case 2: { 
{ 
for(int i=0;i<counter;i++) 

for(int j=1;j<counter;j++)    //I THINK THIS US WHERE SOME THING WENT WRONG 
{          // LOGICALLY. WHAT IS THAT THAT HAS TO BE 
             //CHANGED. 
if(array[i] == array[j]) { flag == 1; } 
else flag = 0; 
} 
} 
if(flag == 1) { cout<<"\n All characters in the sentence are not unique"; } 
else if(flag == 0) { cout<<"All are unique characters"; } 
};break;***   
} 
+0

Я думаю, что компилятор должен был предупредить вас о no-effect code 'flag == 1'? –

ответ

1

Есть 2 вещи неправильно, во-первых: флаг == 1 является сравнение, а не назначение, так что ваш флаг никогда не будет установлен в 1 в вашем случае. Во-вторых, j не должен начинаться с 1, но из i + 1.

На боковой ноте вы устанавливаете флаг с каждой проверкой, так что по существу вы проверяете только последнее сравнение. , вы, вероятно, захотите выйти из своего цикла, когда узнаете, что персонаж не уникален.

0

Есть две ошибки:

первый я думаю, что внутренний цикл должен быть

for (int j=i+i; j<counter; j++) 

иначе, скажем, в случае г = 2 вы сравнить массив [2] с самим собой (если j и i оба равны 2)

Кроме того, что касается флага, вы не должны устанавливать его обратно в 0 всякий раз, когда вы находите разные символы (оставьте в редакции else), поскольку найти отличительные символы где-то не означает, чтобы сбросить флаг, который вы видели равными. Вместо этого установите flag= 0 перед первым циклом.

EDIT: И, как указали другие, установка флага выполняется с помощью «=» нет, с «==», поэтому у нас есть по крайней мере три ошибки.

0

Условие if должно быть (i!=j && array[i]==array[j]) и flag == 1 не уступка, но сравнение и должно быть изменено на flag = 1.

Вместо того чтобы сменить условие if, вы также можете начать считать j по телефону i+1. Мое предложение для переписан код выглядит следующим образом

bool flag = false; 
for(int i=0; i<counter && !flag; ++i) 
{ 
    for(int j=i+1; j<counter; ++j) 
    { 
     if(array[i] == array[j]) 
     { 
      flag = true; 
      break; // exits the inner for loop only. 
     } 
    } 
} 
cout << flag ? "\n All characters in the sentence are not unique" : 
    "All are unique characters"; 
break; // exits switch statement. 
+0

: смеется. Теперь вы используете назначение «flag == true» в своем собственном решении. :-) –

+0

Как глупо. ЛОЛ. Спасибо за подсказку. –

-1

Изменить свою внутреннюю петлю на

for(j=i+1;j<counter;j++) 
+0

Это не решает проблему! – NirmalGeo

0

Как уже ответили у вас есть несколько ошибок в коде,

  1. flag = 1
  2. для проверки состояния ..... i!=j && array[i] == array[j]

Но в идеале уникальная проверка персонажей такого рода не является самым оптимизированным решением. Вам понадобится массив int размером 255, все его содержимое будет инициализировано до нуля. Для каждого встреченного символа перейдите в позицию значения ASCII и увеличьте значение на 1. Как только это будет сделано, перекрестная проверка в массиве, если существует какой-либо элемент со значениями, отличными от 0 или 1. Если встречается, существует дубликат в строке !

Смежные вопросы