Problema inversul elementelor pare dintr-un vector

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
Linet2014
Junior
Junior
Posts: 9
Joined: 05 Feb 2014, 20:35

Problema inversul elementelor pare dintr-un vector

Post by Linet2014 » 05 Feb 2014, 20:43

Bine v-am gasit.
Am de rezolvat urmatoarea problema, si tot ce am incercat s-a finalizat cu erori. Va multumesc pentru orice ajutor.
Se citeste un vector v cu n elemente numere intregi. Sa se reconstruiasca vectorul inserand dupa fiecare element par inversul sau.
Am incercat urmatorul algoritm dar se pare ca ceva nu merge :oops:
#include<iostream>
using namespace std;
int main(){
int v[100],n,aux,i,j,ni=0,c;
cout<<"n=";cin>>n;
for(i=0;i<n;i++){
cout<<"v["<<i<<"]=";cin>>v;
}
for(i=0;i<n;i++){
if((v/2==0) && (v!=0))
{
do
{
c=n%10;
ni=ni*10+c;
n=n/10;
}
while(n!=0);
cout<<"ni="<<ni;
cout<<ni<<" ";}
for(j=n; j>=i+1; j--){
v[j+1]=v[j];
v[i+1]=ni;
n++;}
}
for(i=0;i<n;i++)
cout<<v<<endl;
return 0;
}



User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Problema inversul elementelor pare dintr-un vector

Post by bu7ch3r » 06 Feb 2014, 10:12

Code: Select all

if((v[i]/2==0) && (v[i]!=0))

asta nu-i bun, inlocuieste cu (v%2 == 0). v/2==0 e adevarat doar pentru 1, 0 si -1.
...parantezele sunt inutile...

Code: Select all

{
do
{
    c=n%10;
    ni=ni*10+c;
    n=n/10;
}
aici te-ai apucat de ciopartit n-ul, ce ti-a facut n-ul, n-ul iti tine size-ul vectorului, n-ai treaba cu el.
Ai acolo sus o variabila simpatic, aux, foloseste-o pe aia.
A, si ni, trebuie initializat de fiecare data, pentru ca e variabila globala si o sa tot adune numere acolo.(ni =0;)
Cum:
pai o faci v inainte de bucla ca sa nu-l ciopartim pe v si pentru ca programare:)

Code: Select all

if((v[i]%2==0) && (v[i]!=0))
    {
        aux = v[i];
        ni = 0; //initializam ni 
        do
        {
            c=aux%10;
            ni=ni*10+c;
            aux=aux/10;
        }
        while(aux!=0);
        cout<<"ni="<<ni;
    }
Referitor la codul de mai sus, se pare ca tu faci inserare oricum, pentru ca ai pus for-ul de mai jos dupa acest if
Daca scriai indentat vedeam din prima, asa ...
Deci if-ul asta o sa includa si codul de inserare de mai jos

Code: Select all

{
if((v[i]%2==0) && (v[i]!=0))
{
    //...//
   cout<<"ni="<<ni;
  codul de inserare....
}

Code: Select all

for(j=n; j>=i+1; j--){
v[j+1]=v[j];
v[i+1]=ni;
n++;} 
asta e codul tau de inserare, unde inserezi doar 1 element - cel putin asa ar trebui
planul tau e sa muti la dreapta cu un element si sa pui ni-ul la locul lui, fix dupa i.

1)scoate v[i+1] = ni; si n++ din bucla - pune-le la sfarsit
De ce:
1.a)de fiecare data tu cresti n-ul cu un element cand tu defapt inserezi doar 1 element.
1.b)i+1 nu se schimba in bucla, practic tu faci aceeasi asignare de fiecare data cand muti un element la dreapta

2)v[j+1]=v[j], j-ul e deja n, iar n e fix elementul de dupa sfarsitul vectorului.
De ce:
2.a) Tu ai, de exemplu, 10 elemente - n = 10: de la 0 pana la n -1(9), unde: n e al 11-lea element(v[10], n + 1 e al 12-lea(v[11]).

Code: Select all

//trebuie sa verifici daca poti sa faci inserarea. 
//Nu poti pune elemente inafara vectorului.
//Tu ai v[100], 100 de elemente, de la 0 la 99. n poate sa fie maxim 100. 
//In caz ca iti vine vreo idee si pui verificarea asta dupa ce citest n-ul: citeste randul de mai jos
//N-ai cum sa verifici n-ul la inceput pentru ca nu cunosti cate numere pare ai...
//Daca ai inserat un element trebuie sa cresti si i-ul cu 1, pentru ca in urmatoarea bucla o sa-ti verifice elementul tocmai inserat, 
//Daca elementul ala e tot numar par, atunci o sa intri intr-o bucla infinit(tot pui elementul, apoi inversul, apoi inversul inversului etc.)
if(n + 1<=100) 
{
    for(j=n; j>i+1; j--) // pe i+1 nu-l mutam pt ca mutarea se face cand j e i + 2 --- j[i+2] = j[i+1];
    {
        v[j]=v[j-1];
    }
    v[i+1]=ni;  //ni o sa fie fix dupa i
    n++; //crestem n-ul cu 1 element
    i++; //crestem i-ul cu un element, elementul tocmai inserat nu trebuie verificat.
}
else
{
    cout<<"Nu mai putem insera elemente in vector.<<ni<<" este ignorat.
}
In rest, citirea si afisarea sunt ok.
Cu stima,
Lupu Claudiu

Linet2014
Junior
Junior
Posts: 9
Joined: 05 Feb 2014, 20:35

Re: Problema inversul elementelor pare dintr-un vector

Post by Linet2014 » 06 Feb 2014, 14:10

Multumesc mult.
E mult mai ok decat ce am facut eu, dar desi imi face inversarea, imi afiseaza o valoare in plus la ni si pe urma cand afisez v mi-l afiseaza pe cel initial.
#include<iostream>
using namespace std;
int main(){
int v[100],n,aux,i,j,ni=0,c;
cout<<"n=";cin>>n;
for(i=0;i<n;i++){
cout<<"v["<<i<<"]=";cin>>v;
}
for(i=0;i<n;i++){
if((v%2==0) && (v!=0))
{
aux = v;
ni = 0;
do
{
c=aux%10;
ni=ni*10+c;
aux=aux/10;
}
while(aux!=0);
cout<<ni<<" ";
}
}
if (n+1<=100)
{
for(j=n; j>=i+1; j--)
{
v[j]=v[j-1];
}
v[i+1]=ni;
n++;
i++;
}
else
cout<<"Imposibil de marit"<<endl;
for(i=0;i<n;i++)
cout<<v<<" "<<endl;
return 0;
}
Attachments
ex.jpg
ex.jpg (10.26 KiB) Viewed 8079 times

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Problema inversul elementelor pare dintr-un vector

Post by bu7ch3r » 06 Feb 2014, 14:46

Normal ca nu merge, pentru ca tu faci inserarea, doar odata, dupa ce iesi din for-ul care parcurge vectorul

Code: Select all

#include<iostream>
using namespace std;
int main()
{
    int v[100],n,aux,i,j,ni=0,c;
    cout<<"n=";cin>>n;
    for(i=0;i<n;i++)
    {
        cout<<"v["<<i<<"]=";cin>>v[i];
    }
    for(i=0;i<n;i++)
    {
        if((v[i]%2==0) && (v[i]!=0))
        {
            aux = v[i];
            ni = 0; 
            do
            {
            c=aux%10;
            ni=ni*10+c;
            aux=aux/10;
            }
            while(aux!=0);
            cout<<ni<<" ";
        }
    } //si gata, ai parcurs, ai afisat niste inversi  dar nu i-ai inserat, sau ai inserat numai unul si ala prin balarii(de aia si 4206519
//* CODUL DE MAI JOS TREBUIE SA SE EXECUTE DOAR DACA NUMARUL TAU E PAR NU ?
//CODE DE INSERARE - INSERAM DOAR DACA NUMARUL E PAR, ADIK DOAR DACA V[i]%2 == 0
//Adika - trebuie sa-l muti in for, si mai mult in if-ul ala in care verifici numerele pare
    if (n+1<=100) //DACA AVEM LOC INSERAM
    {
    for(j=n; j>=i+1; j--)
    {
        v[j]=v[j-1];
    }
    v[i+1]=ni;
    n++;
    i++;
    }
    else
    cout<<"Imposibil de marit"<<endl;

for(i=0;i<n;i++)
cout<<v[i]<<" "<<endl;
return 0;
}
NOTA: ca sa apara codul asa misto ca la mine il poti pune intre tagurile

Code: Select all

[code]
[/code]
Pentru indentare eu pun " "(patru spatii) - cu ctrl-c ctrl-v :) dar sunt solutii si mai bune
Cu stima,
Lupu Claudiu

Linet2014
Junior
Junior
Posts: 9
Joined: 05 Feb 2014, 20:35

Re: Problema inversul elementelor pare dintr-un vector

Post by Linet2014 » 07 Feb 2014, 08:53

Multumesc mult pentru tot.
Am reusit si am inteles rationamentul.

Linet2014
Junior
Junior
Posts: 9
Joined: 05 Feb 2014, 20:35

O noua problema cu vector

Post by Linet2014 » 03 Mar 2014, 16:16

Buna ziua,
revin cu rugamintea sa ma ajutati cu urmatoarea problema.
Se citeste un vector cu n elemente numere reale. Se cere ca intre oricare doua elemente consecutive dintre care unul este pozitiv si altul negativ sa se insereze media lor aritmetica.
#include<iostream>
using namespace std;
int main(){
float v[100],n,aux,ni=0,c;
int i,j;
cout<<"n=";cin>>n;
for(i=0;i<n;i++){
cout<<"v["<<i<<"]=";cin>>v;
}
for(i=0;i<n-1;i++){
for(j=1;j<n;j++)
if(((v<0) && (v[j]<=0))||((v>=0) && (v[j]<0)))
{
aux = (v+v[j])/2;
n++;
v[i+1]=aux;
v[i+2]=v[j];
i++;
j++;
}

}

for(i=0;i<n;i++)
cout<<v<<" "<<endl;
return 0;
}
Multumesc

George92
Junior
Junior
Posts: 16
Joined: 13 Apr 2013, 00:37
Judet: Dolj

Re: Problema inversul elementelor pare dintr-un vector

Post by George92 » 04 Mar 2014, 21:52

Code: Select all

#include <vector>
#include <iostream>

int main()
{
	std::vector<float> numbers(150);

	int n;

	std::cin>>n;
	for(int i = 0; i< n ; i++)
	{
		std::cin>>numbers[i];
	}

	for(size_t i = 0 ; i != n - 1 ; i++)
	{
		if((numbers[i] > 0 && numbers[i+1] < 0) || (numbers[i] < 0 && numbers[i+1] > 0))
		{
			numbers.insert(numbers.begin() +  ++i, (numbers[i] + numbers[i+1]) / 2);
			n++;
		}
	}

	for(int i = 0; i < n ; i++)
	{
		std::cout<<numbers[i]<< " ";
	}
	
}
Mai pot fi adaugate mici retusuri pe ici pe acolo, l`am facut pe fuga.

Linet2014
Junior
Junior
Posts: 9
Joined: 05 Feb 2014, 20:35

Problema matrice

Post by Linet2014 » 07 Oct 2014, 12:33

Buna ziua,
Revin cu o problema de constructie a unei matrici.
Scrieţi un program C/C++ care citeşte de la tastatură două numere naturale, m și n
(2≤m≤20, 2≤n≤20), şi construiește în memorie un tablou bidimensional A, cu m linii şi n
coloane, astfel încât parcurgându-l linie cu linie, de sus în jos, și fiecare linie de la stânga la
dreapta, să se obțină șirul primelor n·m numere naturale, pare, care NU sunt divizibile cu
5, ordonat strict crescător. Programul afișează pe ecran tabloul obținut, fiecare linie a
tabloului pe câte o linie a ecranului, elementele de pe aceeași linie fiind separate prin câte
un spațiu.

Din pacate nu reusesc nicicum sa il rezolv.
#include<iostream>
using namespace std;
int main(){
int n,m,x,i=1,j=1,v[100][100];
cout<<"n=";cin>>n;
cout<<"m=";cin>>m;
x=2;
while (i<=n && j<=m) {
if(x%2==0 && x%5!=0){
v[j]=x;
x++; j++;}
else x++;
j++; i++;
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++)
cout<<v[j]<<" ";
cout<<endl;
}
return 0;
}
Multumesc pentru ajutor.

Viorel
Microsoft MVP
Microsoft MVP
Posts: 292
Joined: 13 Jul 2007, 12:26

Re: Problema inversul elementelor pare dintr-un vector

Post by Viorel » 07 Oct 2014, 12:53

Vezi dacă e corect:

Code: Select all

x = 2;
for( int i = 0; i < n; ++i )
{
	for( int j = 0; j < m; ++j )
	{
		if( ( x % 5 ) == 0 ) ++++x;
		v[i][j] = x;
		++++x;
	}
}

for( int i = 0; i < n; ++i )
{
	for( int j = 0; j < m; ++j )
	{
		cout << v[i][j] << " ";
	}
	cout << endl;
}

Linet2014
Junior
Junior
Posts: 9
Joined: 05 Feb 2014, 20:35

Re: Problema inversul elementelor pare dintr-un vector

Post by Linet2014 » 08 Oct 2014, 07:51

Multumesc mult.

User avatar
MarianMMX
Junior
Junior
Posts: 16
Joined: 27 Mar 2014, 09:50
Judet: Galaţi

Re: Problema matrice

Post by MarianMMX » 19 Oct 2014, 20:35

Pentru:
Linet2014 wrote:... şi construiește în memorie un tablou bidimensional A, cu m linii şi n
coloane ...
recomand:

Code: Select all

vector<vector<int> > A(m, vector<int>(n));
Linet2014 wrote:... parcurgându-l linie cu linie, de sus în jos, și fiecare linie de la stânga la
dreapta ...

Code: Select all

for(auto & linie : A)
{
        for(auto & coloana : linie)
        {
        }
}
If you think C++ is not overly complicated, just what is a
protected abstract virtual base pure virtual private destructor
and when was the last time you needed one? — Tom Cargill (1990)

Post Reply