Tablica, pętle, warunki

0

Witam, jestem na początku swojej drogi z programowaniem i mam problem z jednym zadaniem. Mam w ciągu liczb znaleźć dwuelementowe podciągi, których suma jest mniejsza od następnego elementu. Jeśli takie są program ma je wypisać, a jeśli nie to ma wyświetlić zdanie, że "Brak takich elementów" I tutaj się pojawia problem ponieważ nie wiem jak zrobić ten drugi warunek, ponieważ rozważa mi je oba na raz. Próbowałem z if i else (poniższy kod). Czy trzeba tutaj użyć innej pętli? Myślałem nad do while ale też mi nie wychodzi. Z góry dziękuje za pomoc :D

#include <iostream>
using namespace std;
int main()
{
    int n = 100;
    int tab[n];
    int wyraz_ciagu;
    cout << "Podaj liczbe elementow ciagu: ";
    cin >> wyraz_ciagu;
    for (int i = 1; i <= wyraz_ciagu; i++) {
        cout << "Podaj " << i << " wyraz ciagu: ";
        cin >> tab[i];
    }
    for (int i = 1; i <= wyraz_ciagu; i++) {
        if (tab[i - 2] + tab[i - 1] < tab[i]) {

            cout << "[" << tab[i - 2] << ", " << tab[i - 1] << "], ";
        }
        else {
            cout << "Brak elementow spelniajacych zadane kryteria";
        }
    }
    return 0;
}
1

Jest kilka rozwiazan np przykladowe dwa:

  1. Najlpierw w pierwszej petli wyznacz takie liczby ktore spelniaja warunek i wrzuc je do tablicy, nastepnie sprawdz czy tablica jest pusta i albo ja wyswietl albo wyswietl napis ktory masz wyswietlic. To spowoduje ze Twoj kod bedzie mniej zagniezdzony...

  2. Przed petla zdefiniuj sobie flage bool znaleziono = false; i jesli bedziesz wyswielal element w petli to ustawiaj ja na true. Po zakonczeniu petli sprawdz czy flaga jest ustawiona na false i wyswietl napis.

0

@daniel1302: A mógłby Pan podpowiedzieć jak mogę wrzucić te liczby do tablicy i później sprawdzić jej stan? Bo próbuję różnymi metodami ale nie udaje mi się osiągnąć tego co chcę

1

Najprościej ostringstream sout wrzucasz do niego jak do cout
Po zakończeniu wczytywania przekształcasz na na napis string str=sout.str(); jeżeli napis jest pusty to wypisujesz "Brak elementow ..." a jak nie wypisujesz ten napis cout<<str;

0
    for (int i = 1; i <= wyraz_ciagu; i++) {
        if (tab[i - 2] + tab[i - 1] < tab[i]) {

Co się stanie w pierwszym przebiegu pętli? Jaka będzie wartość tab[i - 2] i tab[i - 1] dla i = 1?

    for (int i = 1; i <= wyraz_ciagu; i++) {
        cout << "Podaj " << i << " wyraz ciagu: ";
        cin >> tab[i];
    }

Iterujesz od 1, tablice w C/C++ są indeksowane od 0 (szkoda miejsca :)). Przy okazji, co będzie, gdy wyraz_ciagu będzie większy od 99 (czy tam innego ustalonego n - 1)?

Dlaczego zmienna wyraz_ciagu właśnie tak się nazywa? Wyrazem ciągu jest element tego ciągu, nie jego długość.

Mam w ciągu liczb znaleźć dwuelementowe podciągi, których suma jest mniejsza od następnego elementu.

Czy podciąg to zawsze elementy po sobie następujące? W ciągu (1, 2, 3, 4, 5) dwuelementowym podciągiem będzie na przykład (2, 4).

0

@j1mmy: Iteruję od 1 ponieważ chciałem aby na ekranie przy wprowadzaniu ciągu pojawiały się polecenia od 1 (Wprowadź 1 element ciągu: ") a nie od 0. Nie wiem czy jest inny sposób, bo robię metodą prób i błędów :D
Jeśli chodzi o te podciągi to w tym przypadku to zawsze elementy po sobie następujące. Np. jeśli mamy ciąg [3,1,-5,0,2,1] to program powinien wypisać: [1,-5], [-5,0].
Innym przykładem jest ciąg [10,0,5,3,5,-6] gdzie program ma wypisać "Brak elementów spełniających zadane kryteria".

1

Najprościej to:

#include <iostream>
using namespace std;

int main()
{
    int count;
    cout<<"Podaj liczbe elementow ciagu: ";
    cin>>count;
    int a=0,b=0,c;
    bool nothing=true;
    for(int i=1;i<=count;++i)
	{
        cout<<"Podaj "<<i<<" wyraz ciagu: ";
        a=b;
        b=c;
        cin>>c;
        if((i>=3)&&(a+b<c))
		{
			cout<<a<<"+"<<b<<"<"<<c<<endl;
			nothing=false;
		}
    }
    if(nothing) cout<<"Brak elementow spelniajacych zadane kryteria"<<endl;
    return 0;
}

Jeżeli koniecznie wypisywać chcesz później to:

#include <iostream>
#include <sstream>
using namespace std;

int main()
{
    int count;
    cout<<"Podaj liczbe elementow ciagu: ";
    cin>>count;
    int a=0,b=0,c;
    ostringstream sout;
    for(int i=1;i<=count;++i)
	{
        cout<<"Podaj "<<i<<" wyraz ciagu: ";
        a=b;
        b=c;
        cin>>c;
        if((i>=3)&&(a+b<c)) sout<<a<<"+"<<b<<"<"<<c<<endl;
    }
    if(sout.str().size()>0) cout<<sout.str();
	else cout<<"Brak elementow spelniajacych zadane kryteria"<<endl;
    return 0;
}
0

Witam, zdecydowałem się to zrobić w ten sposób za pomocą tablicy dynamicznej. Mam dodatkowo zrobić aby liczby nie były wprowadzane z klawiatury tylko aby same się losowały, ma być to w innej funkcji oraz ma wykorzystywać odczyt i zapis do pliku tekstowego. Na tą chwilę mam taki kod, lecz nie wiem jak liczby z pliku tekstowego wrzucić do vectora aby były wykonywane dalsze warunki. Jeśli ktoś chciałby mi pomóc byłbym bardzo wdzięczny. Istnieje ryzyko, że coś namieszałem w tym kodzie/ coś można zapisać w inny sposób ale wciąż się uczę i używam tego co najbardziej rozumiem

#include <iostream>
#include <vector>
#include <time.h>
#include <fstream>




void losuj()
    {
        using namespace std;
        vector<int> tablica;
        fstream out;
        out.open("losowanie.txt",ios::out);
        int a, los;
        cout << "Podaj liczbe elementow ciagu: ";
        cin >> a;
        srand(time(NULL)); 

        for (int i=1;i<=a;i++)
        {
          los= rand()%1000;
          cout << los <<endl;
          out << los <<endl;
        }
    }


int main()
{
    using namespace std;
    losuj();
    fstream in;
    in.open("losowanie.txt",ios::in);
    int liczba, a;
    vector<int> tablica;
    bool b=false;
    fstream out;
    out.open("wynik.txt",ios::out);


//Możliwość wpisywania ręcznego
//cout <<"Podaj liczby odzielajac je enterem: "<<endl;

   // while(a-- && cin >> liczba)
    //tablica.push_back(liczba);



     for (int i=2; i<tablica.size(); i++){
            //Próba włożenia liczb do vectora
            in>>tablica[i];
            if(tablica[i-2]+tablica[i-1]<tablica[i])
            {
                cout << "["<<tablica[i-2]<<","<<tablica[i-1]<<"]"<<" ";
                b=true;

            }


     }
        if (b==false)
        {
            cout <<endl<< "Brak elementow spelniajacych zadane kryteria";
        }
return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1