infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Achirei Emanuel din Februarie 12, 2012, 22:58:41



Titlul: Vector ca parametru cu dimensiune citita de la tastatura
Scris de: Achirei Emanuel din Februarie 12, 2012, 22:58:41
As dori sa pun ca parametru pentru o functie un vector cu dimensiunea citita de la tastatura.
Am incercat asa:
Cod:
int chestie ( int j, int a[j])
{int i;
for(i=0;i<j;i++)
cout<<a[i]+1;
}

int main()
{
    int v[]={1,2,3,4,5,6,7,8,9,10},n;
    n=10;chestie(n,v);
}
Insa

Desktop\prelucrare_vectori\cautari\vector\main.cpp|4|error: array bound is not an integer constant|
Desktop\prelucrare_vectori\cautari\vector\main.cpp||In function 'int chestie(...)':|
Desktop\prelucrare_vectori\cautari\vector\main.cpp|6|error: 'j' was not declared in this scope|
Desktop\prelucrare_vectori\cautari\vector\main.cpp|7|error: 'a' was not declared in this scope|
Desktop\prelucrare_vectori\cautari\vector\main.cpp|8|warning: no return statement in function returning non-void|
||=== Build finished: 3 errors, 1 warnings ===|


Titlul: Răspuns: Vector ca parametru cu dimensiune citita de la tastatura
Scris de: Mihai-Alexandru Dusmanu din Februarie 12, 2012, 23:05:38
Chestia e ca nu poti folosi un parametru pentru a "declara" un alt parametru. Codul ar trb sa fie cam asa
Cod:
int chestie ( int j, int a[])
sau
Cod:
int chestie ( int j, int *a)


Titlul: Răspuns: Vector ca parametru cu dimensiune citita de la tastatura
Scris de: Achirei Emanuel din Februarie 13, 2012, 00:16:59
Vectorul din functie va avea aceeasi dimensiune cu cel original?
Este mai eficient sa folosesc functia qsort din stdlib.h decat sa o creez eu insumi?


Titlul: Răspuns: Vector ca parametru cu dimensiune citita de la tastatura
Scris de: Cristian Lambru din Februarie 13, 2012, 07:41:11
La prima intrebare da.

La a doua intrebare da, functia qsort e mai rapida decat ce ai implementa tu, dar ar fi bine sa incerci sa inveti sort din STL care este mai rapida decat qsort si mai usor de folosit. Functia sort ar trebui sa arate cam asa:

Cod:
#include<algorithm>
using namespace std;

...............................

inline int cmp(int a,int b)
{
      return a <  b; //Aici poate fi orice conditie
}

int main()
{
.............................
    sort(chestie+1,chestie+(numarul de elemente)+1,cmp); //inceputul si sfarsitul secventei din vector pe care o sortezi
    
    return 0;
}

Si iti sorteaza elementele dupa cum doresti tu.


Titlul: Răspuns: Vector ca parametru cu dimensiune citita de la tastatura
Scris de: Achirei Emanuel din Februarie 13, 2012, 08:54:58
Chestie reprezinta limiele vectorului?
Ce inseamna inline din fata declararii functiei de comparare?
Am nevoie de o anumita librarie pt functia sort?


Titlul: Răspuns: Vector ca parametru cu dimensiune citita de la tastatura
Scris de: Cristian Lambru din Februarie 13, 2012, 09:35:16
Ok, s-o luam pe rand :

#1
Citat
Chestie reprezinta limiele vectorului?

Nu, chestie reprezinta numele vectorului. Chestie defapt nu e un vector in sine, e un pointer (google it daca nu cunosti termenul) spre pozitia de inceput al vectorului. Deci chestie+1 inseamna pozitia a doua a vectorului ( vectorii sunt indexati de la 0 deci pozitia cu numarul 1 din vector ), iar chestie+1+(numarul de elemente) reprezinta chiar pozitia egala cu numarul de elemente din vecctor.

#2
Citat
Ce inseamna inline din fata declararii functiei de comparare?

inline este o instructiune ce face ca functia sa fie putin mai rapida atunci cand este apelata de un numar mai mare de ori.

#3
Citat
Am nevoie de o anumita librarie pt functia sort?

Da :

Cod:
#include<algorithm>
using namespace std;


Titlul: Răspuns: Vector ca parametru cu dimensiune citita de la tastatura
Scris de: Achirei Emanuel din Februarie 13, 2012, 15:28:59
Creste eficienta daca folosesc pointeri, sau e doar un mod mai elegant de a scrie?


Titlul: Răspuns: Vector ca parametru cu dimensiune citita de la tastatura
Scris de: George Marcus din Februarie 13, 2012, 16:44:46
Tu trebuie sa transmiti adresele limitelor vectorului, lucru pe care il faci cu pointeri. chestie+1 e echivalent cu &chestie[1] (adresa elementului 1, adica al doilea). Deci nu tine de eleganta sau de eficienta, pur si simplu asta trebuie sa transmiti functiei.


Titlul: Răspuns: Vector ca parametru cu dimensiune citita de la tastatura
Scris de: Achirei Emanuel din Februarie 13, 2012, 20:34:08
(http://img862.imageshack.us/img862/6029/captureqsr.png)
Puteti sa imi explicati cu ce am gresit?
L.E.: am rezolvat. se pare ca problema era la "chestie+1".
Cod:
#include <iostream>
#include <algorithm>

using namespace std;
inline int cmp(int a,int b)
{
      return a <  b; //Aici poate fi orice conditie
}
int main()
{   int v[]={3,2,5,9,6,1,7,0,4};
sort(v,v+9,cmp);
for(int i=0;i<9;i++)
cout<<v[i]<<endl;

}
Asa merge.


Titlul: Răspuns: Vector ca parametru cu dimensiune citita de la tastatura
Scris de: Cezar Mocan din Februarie 13, 2012, 20:40:21
Apeleaza sort(v, v + 9, cmp), deoarece sirul tau este indexat de la 0 si nu de la 1.


Titlul: Răspuns: Vector ca parametru cu dimensiune citita de la tastatura
Scris de: Cristian Lambru din Februarie 14, 2012, 09:23:27
Daca vrei ca sirul tau sa fie indexat de la 1 initializeaza-l asa:
Cod:
int v[] = {0,3,2,5,9,6,1,7,0,4,8}

Acum vectorul tau va avea o pozitie goala pe pozitia 0 si numerele din sir incep practic cu pozitia 1.


Titlul: Răspuns: Vector ca parametru cu dimensiune citita de la tastatura
Scris de: Achirei Emanuel din Februarie 15, 2012, 21:28:04
In ce cazuri este mai bine sa folosesc alocare dinamica si cand statica?
M-ar interesa in principal pentru problemele de la olimpiada.
Ceva tips & tricks pentru problemele de la concursuri?