2014-01-30 7 views
0

У меня проблема с c как вот так: У меня проблема в коде ниже. Проблема в том, что я делаю некоторую добавочную часть после того, как и if conditions break.And, что добавление повторяется во время цикла до count>0 Проблема в том, что я поставил фигурные скобки для цикла, а затем повторяет часть внутри фигурных скобок, пока это условие не является ложным. Buti должен выполнить добавление, которое выглядит следующим образом: У нас есть данные массива [i] .freq = {0,1,2,3,4,5} и данные [i] .next представляет следующий член для добавления. Предположим, что я добавляю 0 и 1, сначала я получил «1» в результате, и я поместил результат в последний индекс моего массива, вроде этого ({0 1 2 3 4 5 1}) теперь 0 и 1 не могут быть добавлены, потому что они (я не должен повторять добавление на тех же элементах), поэтому в следующий раз добавление будет находиться между последним элементом индекса и наименьшим элементом перед последним элементом (но не с теми элементами, которые уже добавлены). поэтому здесь добавление будет находиться между «1» в последнем индексе + наименьший элемент в праве на него, который равен «2» Обратите внимание, что мы не принимаем значения 0 и 1, потому что они уже добавлены, так же, как это не будет добавляется в следующий раз, потому что добавляется на этот раз и их добавление будет {0 1 2 3 4 5 1 3}, мы должны повторить то же самое, пока не осталось & элемента.для и если условие дает неожиданный результат

data[data_size].freq=data[i].freq+data[p].freq; // here i add the first 2 elements "0" and "1" in the example i given below. 
    int count=5; 
    do 
    { 
    for(i=0;data[i].next!=-1;i=data[i].next)//the problem is here if i put bracesit dont't do the ask which i expect it to do. 
    if(data[data[i].next].freq>data[data_size].freq && data[data[i].next].flag==0) 
    break; 
     data[data_size+1].freq= data[data_size].freq+ data[data[i].next].freq; 
     data[data_size].next=data[i].next; 
     data[i].next=data_size; 
     data_size++; 
    if(data[data[i].next].freq<data[data_size].freq && data[data[i].next].flag==0) 
    break; 
     data[data_size+1].freq= data[data_size].freq + data[i].freq 
     data[data_size].next=data[i].next; 
     data[i].next=data_size; 
     data_size++; 
     count--; 
    } while(count>0) 

может любой, пожалуйста, помогите мне в проектировал код для того, что я хочу достичь.

+2

Форматирование кода - это находка. – Bucket

+1

Какой выход? – arunb2w

+3

ПОЖАЛУЙСТА, правильно отформатируйте свой код. Это не конкурс IOCCC. – OldProgrammer

ответ

2

Если вы пишете

for(i=0 ..any condition) 
if(condition1) 
break; 
if(condition2) 
break; 

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

Если вы хотите, чтобы петля for растянется на обоих, вы должны поместить их в {}:

for(...) { 
    if(condition1) break; 
    if(condition2) break; 
} 

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

if(condition1) 
     break; 

, как кто-то может возникнуть соблазн вставить andditional заявление и быть удивлены тем, что он не работает, как и должно быть, но либо делать

if(condition1) break; 

в одной строке или

if(condition1) { 
     break; 
    } 

Добавить брекеты, которые не нужны для функциональности, но для удобства чтения.

+1

Да, я всегда держусь. Оборонительное программирование. – OldProgrammer

+0

@glglgl На самом деле проблема была здесь. По этой ссылке http://stackoverflow.com/questions/21460634/adding-smallest-elements-of-same-array-without-sorting вы могли бы помочь мне там? Я задал этот вопрос, потому что я хотел бы соответствовать, если есть проблема в цикле if-for. – user3206225

+0

@OldProgrammer Предположим, если у меня это для {if (..) break; if (..) break;} внутри цикла do-while, а затем выполняется несколько раз. поэтому я сохранил их без брекетов. – user3206225

1

Это как компилятор видит ваш код:

int count=5; 
do 
{ 
    for (i = 0; data[i].next != -1; i = data[i].next) 
    { 
     if (data[data[i].next].freq > data[data_size].freq && data[data[i].next].flag == 0) 
      break; // break out of the enclosing 'for' loop (goes to point A) 
    } 
    // Point A 
    data[data_size].next = data[i].next; 
    data[i].next = data_size; 
    data_size++; 
    if (data[data[i].next].freq < data[data_size].freq && data[data[i].next].flag == 0) 
    { 
     break; // break out of the outer 'do' loop (goes to point B) 
    } 
    data[data_size].next = data[i].next; 
    data[i].next = data_size; 
    data_size++; 
    count--; 
} while (count > 0); 
// Point B 

на основе ваших комментариев кода, я думаю, ваша проблема в том, что ваши заявления «перерыв» не принимает вас, когда вы думаете, что они принимают вас.

+0

спасибо за ответ. Но я попытался напечатать f (check1) и printf (check2) в PointA, а также перед вторым if (condition) {break;} (ниже data_size ++ и выше count--;) Я заметил, что там выполняется проверка check2. – user3206225

+0

@ user3206225 Если вы видите printf, который вы разместили непосредственно перед 'count -', то это означает, что второй 'if' оценивает false. Вы всегда должны видеть printf в точке A, потому что это оценивается на каждой итерации через цикл do. Я рекомендую вам выполнить свой код в своем отладчике, чтобы точно увидеть, как выглядят ваши данные на каждом этапе процесса. – bta

+0

Но у меня также нет брекетов {}, как вы использовали чуть ниже для цикла (который заканчивается вначале), если это условие «break;»} ». – user3206225

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