2016-08-14 4 views
-2

Die q-Schleife wird nicht inkrementiert. Wenn Sie es entfernen, wird es zu einer Endlosschleife. Es funktioniert einfach nicht mit q. Die k-Schleife funktioniert gut. Ich wäre wirklich hilfreich, wenn Sie auch erklären könnten, warum es passiert. Bitte helfen Sie !!Wie führe ich die q-Schleife (INCREMENT Q)?

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 

using namespace::std; 

int main() { 

string input; 
getline(cin, input) ; 
vector<char> myVector(input.begin(), input.end()); 
vector<char> myVector2(input.begin(), input.end()); 
sort(myVector2.begin(), myVector2.end()); 

if(myVector2 == myVector){ 
    cout << "rank :1"; 
} 

else{ 
    int i; 
    for (i = 0; i < myVector2.size(); i++){ 
     cout << myVector2[i]; 
    } 

    cout << endl; 

    int q = 0, k = 0, value = 1, w = 1; 
    while(q < myVector.size()){ 
     while(k < myVector.size()){ 
      while(myVector2[k] != myVector[q]){ 
       while(w < myVector2.size()){ 
        value = value * w ; 
        w++; 
       } 
       k++; 
      } 

      cout << value*k; 
      cout << endl; 

      myVector2.erase(myVector2.begin()+k); 
       for(int j = 0; j< myVector2.size(); j++){ 
        cout << myVector2[j]; 
      } 
      break; 
     } 
     q++; 
     break; 
    } 
} 
return 0; 
} 
+0

Ich bin nicht in der Lage herauszufinden, was das Problem verursacht. Ich beschäftige mich zum ersten Mal mit Vektoren. –

+0

Sie haben einen unberechtigten Zugriff mit 'while (myVector2 [k]! = MyVector [q]) {' ... – Jarod42

+0

was ist der Zugriff außerhalb des Zugriffs? –

Antwort

0

Es gibt zwei grundlegende Probleme mit Ihrem Code:

Problem 1:

Warum brechen Sie die Schleife? Die genaue Definition von Pause ist: The break statement ends execution of the nearest enclosing loop or conditional statement in which it appears. Control passes to the statement that follows the end of the statement, if any.

Sie erhöhen q und dann brechen Sie die while-loop. Ihr Code wie folgt aussieht:

 while(q < myVector.size()){ 
      //code here 
      q++; 
      break; // <------------ This will exit the while loop on the first iteration 
     } 

Als Folge wird die äußere Schleife nie ausgeführt.

Problem 2:

Diese Schleife eine Endlosschleife werden wird, wenn und nur wenn myVector2 und myVector keine gemeinsamen Elemente haben. In diesem Fall wird k unendlich mal erhöht werden, da k für k < myVector2.size? nie geprüft

 while(myVector2[k] != myVector[q]){ 
      while(w < myVector2.size()){ 
       value = value * w ; 
       w++; 
      } 
      k++; 
     } 

das Problem zu beheben, um den

 while(k < myVector2.size() && myVector2[k] != myVector[q]){ 
      while(w < myVector2.size()){ 
       value = value * w ; 
       w++; 
      } 
      k++; 
     } 

Edit1 while-loop ändern: Die logical and statements ausgewertet werden von links nach rechts. Die rechte Seite des logischen Befehls wird nur ausgeführt, wenn die Bedingung k < myVector2.size()) erfüllt ist, um z. B. den Zugriff außerhalb des gültigen Bereichs zu verhindern.

Danke Jarod42 für die Kenntnisnahme.

+0

Danke Mann !! Du hast einen tollen Job gemacht –

+0

@DewangGupta Ich bin froh, dass dein Problem gelöst ist! – KostasRim

+0

@ Jarod42 WOW wie habe ich das vermisst, so ein großer Aufmerksamer. Bearbeiten, fertig. Danke für die Beobachtung. – KostasRim