Zadanie z podstaw C++. Jak wypisać ciągi liczb parzystych z tablicy 2

0

Witam, było już tu podobne zadanie ale nie doczekało się sensownego rozwiązania. Trochę je ruszyłem ale nie wiem co dalej, z moja aktualną wiedzą nie jestem w stanie dalej ruszyć. Może ktoś dać wskazówkę i pokazać jak to dokończyć ?

Próbowałem utworzyć drugą tablice, ale nie wiem jak ją utworzyć aby liczyła od 0 i zbierała tylko parzyste wyniki. Nie wiem też jak zsumować ilość elementów w tej kolejnej tablicy, bo funkcja sizeof() tutaj nie działa przez wskaźnik.

Treść:
Napisać program tworzący dynamicznie N – elementową tablicę liczb całkowitych, gdzie N > 0
jest liczbą całkowitą podaną przez użytkownika. Wartości tablicy są podawane przez użytkownika,
a następnie wypisywane. Program ma wypisać wszystkie takie ciągi kolejnych elementów tej
tablicy, których długość przekracza M oraz wszystkie elementy w ciągu są liczbami parzystymi. M
jest liczbą całkowitą dodatnią podaną przez użytkownika. Bierzemy pod uwagę tylko ciągi
nierozszerzalne, tzn. takie, że nie możemy ich rozszerzyć o liczbę parzystą „ani z lewej ani z prawej
strony ciągu”. Np. w ciągu 1 2 4 6 5 nierozszerzalny ciąg kolejnych liczb parzystych to 2 4 6 , ciągi
2 4 i 4 6 byłyby rozszerzalne. Jeśli w tablicy nie ma ciągów spełniających te warunki, program
zwraca informację: „Brak takich ciągów.”.
Przykład: N = 13, M = 2; tablica: 2 3 4 6 8 3 8 6 3 0 2 10 4; odpowiedź: 4 6 8, 0 2 10 4

#include<iostream>

using namespace std;
int main()
{

int N, M, Z;
cout<<"Podaj liczbe N: "<<endl;
cin>>N;
cout<<"Podaj liczbe M."<<endl;
cin>>M;

int* tab = new int[N];
int* tab1 = new int[Z];
for(int i=0; i<N; i++)
{
    cout<<"Podaj "<<i+1<<" element tablicy."<<endl;
    cin>>tab[i];
}

cout  << endl;

for(int i=0; i<N; i++)
{
    if (tab[i]%2==0)
    {
    tab1[i]=tab[i];
    }
}

for(int i=0; i<N; i++)
{

    cout << tab1[i] << " ";

}

cout  << endl;

for(int i=0; i<N; i++)
{
    if (tab[i]%2==1)
    {
        cout  << tab[i] <<" ";
    }
}

return 0;
}
1

Używasz niezainicjalizowanego Z.

1
  1. http://forum.4programmers.net/1101404
  2. Tablice tab1 przydziel na taki sam rozmiar jak tab
  3. w pętli:
int tab1size=0;
for(int i=0;i<N;++i) if((!(tab[i]&1))&&(tab[i]>M)) tab1[tab1size++]=tab[i];

potrzebujesz osobnego licznika dla tablicy tab1 aby zapisywać po kolei.
4. Od razu sprawdzaj czy są większe od M
5. Na koniec pętli ten licznik dla tablicy tab1 będzie ilością elementów w niej.

0

_13th_Dragon Twoja pomoc bardzo się przydała i zrobiłem tak jak pisałeś !

Niestety nie rozumiem kodu
if(!(tab1[j]&1))
{
tab1[tab1size++]=tab[i];
}

Teraz kod wygląda tak

#include<iostream>

using namespace std;
int main()
{

int N, M, j;
int tab1size=0;
cout<<"Podaj liczbe N: "<<endl;
cin>>N;
cout<<"Podaj liczbe M."<<endl;
cin>>M;

int* tab = new int[N];
int* tab1 = new int[N];
for(int i=0; i<N; i++)
{
    cout<<"Podaj "<<i+1<<" element tablicy."<<endl;
    cin>>tab[i];
}

cout  << endl;

for(int i=0; i<N; i++)
{
    if (tab[i]%2==0)
    {
    tab1[j]=tab[i];
    j++;
        if(!(tab1[j]&1))
        {
        tab1[tab1size++]=tab[i];
        }
    }
}
for(int j=0; j<=tab1size; j++)
{
   if (tab1size>M)
    {
    cout << tab1[j] << " ";
    }
}

cout  << endl;

for(int i=0; i<N; i++)
{
    if (tab[i]%2==1)
    {
        cout  << tab[i] <<" ";
    }
}

return 0;
}

0

Przecież warunki: if(tab[i]%2==0) a if(!(tab1[j]&1)) to dokładnie to samo, tylko że to drugie szybciej działa.
Zaś brakuje ci: "Program ma wypisać wszystkie takie ciągi kolejnych elementów tej tablicy, których długość przekracza M ...

0

Wybacz za niedopatrzenie :(, dodatkowo chciałem zapytać jak działa !(tab1[j]&1) ... ! to negacja, & to zazwyczaj referencja, tutaj to oznacza modulo z tab1[j] ?

Miałbyś _13th_Dragon albo ktokolwiek jakiś pomysł jeszcze jak stworzyć takie widełki które wyciągałyby nierozszerzalne ciągi parzyste - tak jak w zadaniu ? Próbowałem pętlą for ale to bez sensu.

#include<iostream>

using namespace std;
int main()
{

int N, M, j;
int tab1size=0;
cout<<"Podaj liczbe N: "<<endl;
cin>>N;
cout<<"Podaj liczbe M."<<endl;
cin>>M;

int* tab = new int[N];
int* tab1 = new int[N];
for(int i=0; i<N; i++)
{
    cout<<"Podaj "<<i+1<<" element tablicy."<<endl;
    cin>>tab[i];
}

cout  << endl;

for(int i=0; i<N; i++)
{
    if (tab[i]%2==0)
    {
        for (tab[i-1]%2==1; tab[i+1]%2==1; i++)
        {
        tab1[j]=tab[i];
        j++;
            if(!(tab1[j]&1))
            {
            tab1[tab1size++]=tab[i];
            }
        }
    }
}


for(int j=0; j<tab1size; j++)
{
    if (tab1size>M)
    {
    cout << tab1[j] << " ";
    }
}

cout  << endl;

for(int i=0; i<N; i++)
{
    if (tab[i]%2==1)
    {
        cout  << tab[i] <<" ";
    }
}

return 0;
}

0

https://www.cprogramming.com/tutorial/bitwise_operators.html
Zwyczajnie do drugiej tablicy wpisujesz tylko jeden ciąg, jak tylko ciąg doszedł do końca wypisujesz go.

#include <iostream>
#include <vector>
#include <iterator>
using namespace std;

int main()
{
	int N,M;
	cout<<"Podaj liczbe N: ";
	cin>>N;
	cout<<"Podaj liczbe M: ";
	cin>>M;
	vector<int> src(N);
	for(int i=0;i<N;cin>>src[i++]) cout<<"Podaj "<<(i+1)<<" element: ";
	vector<int> sub(N);
	for(int value,sz=0,i=0;i<N;++i)
	{
	    if((value=src[i])&1) sz=0;
		else
    	{
    		if(sz<M)
			{
				sub[sz]=value;
				if(++sz>=M)
				{
					cout<<endl;
		   			for(int k=0;k<M;++k) cout<<sub[k]<<' ';
				}
			}
    		else cout<<value<<' ';
    	}
    }
    return 0;
}
0

Biblioteki Vector i iterator których tutaj użyłeś mają takie same działanie jak zwykła tablica w moim kodzie ? Wybacz że pytam o takie prozaiczne rzeczy ale nie zaznajomiłem się jeszcze z tymi zagadnieniami i ciężko mi być pewnym co do tych rzeczy.

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