2015-10-03 17 views
5

Bir dizide tamsayıları değiştirmek için bir kod yazıyorum ve bir break ifadesi kullanmadan ve mantığımı tutarlı tutmadan bir döngüden nasıl çıkabileceğimi bilmek istiyorum. İşte aşağıda benim kodudur:Ara vermeksizin C++'daki bir döngüden nasıl çıkabilirim?

int swapped = 0; 
if (arrays[0][first] % 2 == 0) 
{ 
    cout << arrays[0][first] << " is odd " << endl; 
    for (int i = 1; i < arraycount; ++i) 
    { 
     for (int j = 1; j < arrays[i][0] + 1; ++j) 
     { 
      if (arrays[i][j] % 2 != 0) 
      { 
        int temp = arrays[i][j]; 
        cout << "Array #" << 1 << " value " << arrays[0][first] << " swapped with " 
          << "Array #" << i << " value " << temp; 

        arrays[i][j] = arrays[0][first]; 
        arrays[0][first] = temp; 
        swapped = 1; 
        break; 
       } 
      } 
      if (swapped) { 
       break; 
      } 
+2

Molada sorun ne? –

+2

Bu C++. Neden bir "bool" olarak çalıştığı zaman, 'int' değiştirildi? – dureuill

+0

belki de (başlangıç; olağan durum ve kırılma koşulu; step) {...} ' – Emadpres

cevap

2

mutlaka kodları mantık tutarsız yapmaz bir Molası deyimi kullanarak ve sonları genellikle kodun okunabilirliği artırmak için yararlıdır. Ama sorunuza yanıt olarak bu, döngüler ve mantıksal boolean işleçler kullanılırken elde edilebilir. Kodunuzun değiştirilmiş bir sürümü aşağıdadır, kodu olabildiğince az değiştirmeye çalıştım, böylece kodunuzu örnekte görmeye devam edebilirsiniz. Aşağıdaki örnekte bıraktığınız kodda birkaç mantıksal hata var. Özellikle de, bu sayı aslında eşit olduğunda, aşağıdaki satır "tuhaf" yazacaktır. arrays[0][first] numaralı telefon numarasının tek olup olmadığını kontrol etmek istediğinizde, if (arrays[0][first] % 2 == 0) yerine if (arrays[0][first] % 2 != 0)'a ihtiyaç duyulur.

Mantıksal Hata

if (arrays[0][first] % 2 == 0) 
      { 
        cout << arrays[0][first] << " is odd " << endl; 

Bu aralar kullanmadan kodudur.

bool swapped = true; 
      if (arrays[0][first] % 2 == 0) 
      { 
        cout << arrays[0][first] << " is odd " << endl; 
        int i = 1; 
        while ((i < arraycount) && swapped) 
        { 
          int j = 1; 
          bool if_odd = true; 
          while ((j < arrays[i][0] + 1) && if_odd) 
          { 
            if (arrays[i][j] % 2 != 0) 
            { 
              int temp = arrays[i][j]; 
              cout << "Array #" << 1 << " value " << arrays[0][first] << " swapped with " 
                << "Array #" << i << " value " << temp; 

              arrays[i][j] = arrays[0][first]; 
              arrays[0][first] = temp; 
              swapped = false; 
              if_odd = false; 
            } 
            j++; 
          } 
          i++; 
        } 
      } 
4
for (int i = 1; i < arraycount && !swapped; ++i) 
{ 
    for (int j = 1; j < arrays[i][0] + 1 && !swapped; ++j) 
    { 
     if(arrays[i][j] % 2 != 0) 
      int temp = arrays[i][j]; 
      cout << "Array #" << 1 << " value " << arrays[0][first] << " swapped with " << "Array #" << i << " value " << temp; 
      arrays[i][j] = arrays[0][first]; 
      arrays[0][first] = temp; 
      swapped = 1; 
     } 
    } 
} 

bu iç döngüde var aynı şeyi yapacağız.

+0

başlangıçta int intapped = 0;', bu nedenle ilk döngü için girmeyecektir. – Himanshu

+0

Good point :) ikinci döngü içinde konuya teşekkürler :) –

+0

düzeltir, tüm çift sayıları ve ilk garip numara "doSomethings" için, daha sonra kırmak istiyorum. ama kodunuzda, tüm çift sayılar için "Sometriyor" ve ilk tek sayıyı bulduğunda, döngüden döner. – aisa

5

Goto kullanın [Bunun yüzünden baskın olacağım].

if (arrays[0][first] % 2 == 0) 
{ 
    cout << arrays[0][first] << " is odd " << endl; 
    for (int i = 1; i < arraycount; ++i) 
    { 
     for (int j = 1; j < arrays[i][0] + 1; ++j) 
     { 
      if (arrays[i][j] % 2 != 0) 
      { 
        int temp = arrays[i][j]; 
        cout << "Array #" << 1 << " value " 
          << arrays[0][first] << " swapped with " 
          << "Array #" << i << " value " << temp; 

        arrays[i][j] = arrays[0][first]; 
        arrays[0][first] = temp; 
        goto done; 
       } 
      } 
done: 
    something; 
+1

Çok düzeyli kesmeler, IMO, modern C++ 'da goto için ana kullanım durumlarından biridir. – Hurkyl