Jestem początkujący. Jest to program do drukowania trójkąta prostokątnego. Wysokość i podstawa powinny być takie same. na przykład jeśli input n = 3 to powinniśmy otrzymać dane wyjściowe jako.

*
* *
* * *

Napisałem następujący kod:

#include<iostream>
using namespace std;

int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        while(i>=1){
            cout<<"*";
            cout<<" ";
            i--;
            cout<<i;
        }
        cout<<"\n";
    }

}

Ale to trwa wiecznie. nic złego?

c++
2
Abhinav K 20 czerwiec 2021, 17:21

4 odpowiedzi

Najlepsza odpowiedź

Zmniejszasz i w pętli while i zwiększasz w pętli for. Użyj oddzielnej zmiennej j.

using namespace std;

int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        int j = i;
        while(j>=1){
            cout<<"*";
            cout<<" ";
            j--;
            cout<<j;
        }
        cout<<"\n";
    }

}
3
Akshay Bande 20 czerwiec 2021, 14:27

Dzieje się tak, ponieważ pętla while przywraca i do 0, a następnie pętla for zaczyna się za każdym razem od 0.

Rozwiązaniem jest użycie innej zmiennej dla pętli wewnętrznej:

#include<iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++){
        for (int j = 0; j <= i; j++) {
            cout << "* ";
        }
        cout << '\n';
    }
}
1
Meowster 20 czerwiec 2021, 15:20

Problem polega na tym, że po wyjściu z pętli while wartość i zmienia się z powrotem na 1, a pętla for ponownie zaczyna się od i = 1, co skutkuje nieskończoną pętlą

Możesz zapisać wartość i do innej zmiennej, takiej jak j, i użyć tego j do wykonania pętli while Oto kod:

#include<iostream>
using namespace std;

int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        int j=i;
        while(j>=1){
            cout<<"*";
            cout<<" ";
            j--;
            cout<<j;
        }
        cout<<"\n";
    }

}

Wynik :

* 0
* 1* 0
* 2* 1* 0
2
Rohith V 20 czerwiec 2021, 14:29

Głównym problemem w programie jest to, że zmienna i jest współdzielona zarówno przez wewnętrzną, jak i zewnętrzną pętlę. Wewnętrzny while loop próbuje zmienić wartość i na 0, wartość i jest zwiększana o 1 przez zewnętrzny for-loop , ponownie kontrola wraca do pętli while i ustawia wartość i na 0. To się powtarza w kolejnych krokach prowadzących do nieskończonej pętli.

Aby uniknąć tej niejednoznaczności, zaleca się użycie innej zmiennej j dla wewnętrznej pętli while.

Proszę spojrzeć na zmodyfikowany kod, który rozwiązał ten problem poniżej:

#include<iostream>
using namespace std;

    int main(){
        int n;
        cin>>n;
        int j;
        for(int i=1;i<=n;i++){
            j=i;
            while(j>=1){
                cout<<"*";
                cout<<" ";
                j--;
                cout<<j;
            }
            cout<<"\n";
        }
    
    }
0
Chandra Shekhar 20 czerwiec 2021, 15:28