PDA

View Full Version : [C] Esercizio Vettore - principiante


cicciopantera
19-02-2015, 12:16
Salve ragazzi avrei bisogno di una mano relativamente a questo programma in C:
-Acquisire da tastiera elementi interi non nulli che compongono il vettore V (il valore nullo introdotto da tastiera interrompe l'acquisizione e non è elemento del vettore acquisito);
-Ricercare il valore e la posizione del massimo positivo pari e del minimo negativo dispari della sequenza di numeri presenti nel suddetto vettore V.
Potete costruirmi gentilmente il codice? (personalmente utilizzo DEV 5.8.3)

Grazie:)

lorenzo001
19-02-2015, 12:54
No, non si costruisce codice qui ...

Mostra quello che hai fatto ...

cicciopantera
19-02-2015, 13:12
Ok...

cicciopantera
19-02-2015, 13:45
per il valore e la posizione ho bisogno di un metodo di ricerca sequenziale giusto?

cicciopantera
19-02-2015, 13:55
Non potete proprio aiutarmi con quest'ultima richiesta in termini di codice?

GTKM
19-02-2015, 13:58
Non potete proprio aiutarmi con quest'ultima richiesta in termini di codice?

Ma si tratta di un unico ciclo, in pratica. Cosa ti viene difficile, esattamente? :)

cicciopantera
19-02-2015, 14:10
Un po' tutto sto avendo un bel po' di problemi con la programmazione in C...se potete ve ne sarei grato altrimenti no problem...

GTKM
19-02-2015, 14:17
Un po' tutto sto avendo un bel po' di problemi con la programmazione in C...se potete ve ne sarei grato altrimenti no problem...

Se anche fosse possibile, non avrebbe senso. Non impari a programmare leggendo cose scritte da altri, ma sbattendoci tu la testa :) :)

cicciopantera
19-02-2015, 14:45
Concentrandomi sulla prima parte, potrei fare così?:
#include "stdio.h"
#define MAX 100

void input_vett(int V[], int i)
{
int t,m;
for(m=0;m<MAX;m++)
{
printf("Inserire elementi del vettore\n V[%d]=",m);
scanf("%d",&t);
if(t!=0) V[m]=t;
else break;
}
}

Anche se non mi convince il break perchè, altrimenti, prenderebbe anche il valore nullo, o sbaglio?

GTKM
19-02-2015, 14:56
Concentrandomi sulla prima parte, potrei fare così?:
#include "stdio.h"
#define MAX 100

void input_vett(int V[], int i)
{
int t,m;
for(m=0;m<MAX;m++)
{
printf("Inserire elementi del vettore\n V[%d]=",m);
scanf("%d",&t);
if(t!=0) V[m]=t;
else break;
}
}

Anche se non mi convince il break perchè, altrimenti, prenderebbe anche il valore nullo, o sbaglio?

No, il break è corretto, in quanto il valore "0" non farà eseguire l'struzione V[m]=t.

cicciopantera
19-02-2015, 15:07
in questo caso non verrà prelevato lo zero e passerà alla procedura o funzione successiva giusto?

GTKM
19-02-2015, 15:18
in questo caso non verrà prelevato lo zero e passerà alla procedura o funzione successiva giusto?

Esatto, avrai il vettore con gli elementi inseriti prima del valore "0", e ci sarà l'uscita dalla funzione input_vett(). Da questo punto di vista, puoi pure sostituire "break;" con "return;" :D

cicciopantera
19-02-2015, 15:50
Ci saranno errori su errori ma sono qui per questo, ho soltanto provato a cercare minimo e massimo con le richieste sopracitate ma mi da sempre esito :"Il massimo dei numeri positivi è 1", cosa va modificato?


#include "stdio.h"
#define MAX 100

void input_vett(int V[], int* i)
{
int t,m;
for(m=0;m<MAX;m++)
{
printf("Inserire elementi del vettore\n V[%d]=",m);
scanf("%d",&t);
if(t!=0) V[m]=t;
else break;
}
*i=m;
}

void ricerca_max_min_posizione (int V[], int i)
{
int x, min=-1, max=1, N=0, Z=0;
for(x=0;x<i;x++)
{
if(V[x]%2==0 && V[x]>0)
{
N ++;
if (V[x]>max) V[x]=max;
}
else (V[x]%2==1&&V[x]<0);
{
Z++;
if (V[x]<min) V[x]=min;
}
}
if (N!=0)
{
printf("Il massimo dei numeri positivi pari e''=%d\n",max);
system("PAUSE");
}
else (N=0);
{
printf("Non e' stato inserito alcun numero pari\n");
system("PAUSE");
}
if (Z!=0)
{
printf ("Il minimo dei numeri negativi dispari e'=%d\n'", min);
system("PAUSE");
}
else (Z=0);
{
printf("Non e' stato inserito alcun numero dispari\n");
system("PAUSE");
}
}

void main()
{
int V[MAX], i;
input_vett (V,&i);
ricerca_max_min_posizione (V,i);
}

cicciopantera
19-02-2015, 16:15
Come si usa la tag?

Oceans11
19-02-2015, 17:54
Ci saranno errori su errori ma sono qui per questo, ho soltanto provato a cercare minimo e massimo con le richieste sopracitate ma mi da sempre esito :"Il massimo dei numeri positivi è 1", cosa va modificato?


if (V[x]>max) V[x]=max;


Traduco:
"se l'elemento x è più grande di max, l'elemento x diventa uguale a max."

Ps: i tags code si usano così:
(code) il tuo codice (/code)
sostituendo le parentesi tonde con le quadre

cicciopantera
19-02-2015, 18:08
#include "stdio.h"
#define MAX 100

void input_vett(int V[], int* i)
{
int t,m;
for(m=0;m<MAX;m++)
{
printf("Inserire elementi del vettore\n V[%d]=",m);
scanf("%d",&t);
if(t!=0) V[m]=t;
else break;
}
*i=m;
}

void ricerca_max_min_posizione (int V[], int i)
{
int x, min=V[0], max=V[0], N=0, Z=0, posmin=0, posmax=0;
for(x=0;x<i;x++)
if(V[x]%2==0&&V[x]>0)
{
if (V[x]>max)
{
max=V[x];
posmax=x;
N++;
}
else
{
max=max;
N++;
}
}
else if (V[x]%2!=0&&V[x]<0)
{
if (V[x]<min)
{
min=V[x];
posmin=x;
Z++;
}
else
{
min=min;
Z++;
}
}
if (N!=0&&Z!=0)
{
printf("Il massimo dei numeri positivi pari e'= %d\nLa sua posizione e'=%d\n",max,posmax);
printf("Il minimo dei numeri negativi dispari e'= %d\nLa sua posizione e'=%d\n",min,posmin);
system("PAUSE");
}
else
{
printf("Non e' stato inserito alcun numero pari o alcun numero dispari\n");
system("PAUSE");
}
}

void main()
{
int V[MAX], i;
input_vett (V,&i);
ricerca_max_min_posizione (V,i);
}

Dovrebbe andare così anche se, stilisticamente, non mi garba tanto il "Non è stato inserito alcun numero pari o alcun numero dispari", come potrei ovviare?

wingman87
19-02-2015, 19:01
Togli N e Z, togli anche max=max e min=min e inizializza posmax e posmin a -1. Alla fine puoi vedere se hai trovato min o max controllando i valori di posmin e posmax.
Inoltre min e max sono slegati tra loro, non devi necessariamente trovarli entrambi (mi riferisco all'if (N!=0&&Z!=0))

cicciopantera
19-02-2015, 19:32
Ok domani in mattinata riprovo ;)

cicciopantera
20-02-2015, 09:34
Ok ci sono, va bene anche così (dai me la sono cavata abbastanza bene, no?).

#include "stdio.h"
#define MAX 100

void input_vett(int V[], int* i)
{
int m, t=0;
for(m=0;m<MAX;m++)
{
printf("Inserire elementi del vettore\n V[%d]=",m);
scanf("%d",&t);
if(t!=0) V[m]=t;
else break;
}
*i=m;
}

void ricerca_max_min_posizione (int V[], int i)
{
int x, min=V[0], max=V[0], posmin=-1, posmax=-1;
for(x=0;x<i;x++)
{
if(V[x]%2==0&&V[x]>0)
{
if (V[x]>max)
{
max=V[x];
posmax=x;
}
}
else if (V[x]%2!=0&&V[x]<0)
{
if (V[x]<min)
{
min=V[x];
posmin=x;
}
}
}
if (posmax!=-1)
{
printf("Il massimo dei numeri positivi pari e'= %d\nLa sua posizione e'= %d\n",max,posmax);
}
else
{
printf("Non e' stato inserito alcun numero pari o positivo\n");
}
if(posmin!=-1)
{
printf("Il minimo dei numeri negativi dispari e'= %d\nLa sua posizione e'= %d\n",min,posmin);
system("PAUSE");
}
else
{
printf("Non e' stato inserito alcun numero dispari o negativo\n");
system("PAUSE");
}
}

void main()
{
int V[MAX], i;
input_vett (V,&i);
ricerca_max_min_posizione (V,i);
}

Ho da chiedere due cose: perchè qui va effettuata una ricerca, c'è bisogno di fare prima un ordinamento (sort) o no? Inoltre come faccio, senza allungare troppo il codice, a creare due printf separate che mi dicano se non ho inserito alcun numero pari/dispari o alcun numero positivo/negativo (avevo pensato di lavorare sugli if del secondo void ma poi sarebbe stilisticamente bruttino e molto lungo).

Oceans11
20-02-2015, 10:08
Per fare una ricerca non è necessario fare un sort.
Nel tuo caso poi, non serve nemmeno fare una ricerca "a posteriori", se bene interpreto il testo dell'esercizio.
#include <stdio.h>

#define MAX 100

int main(int argc, char *argv[]) {
int input;
int i;
int max = 0;
int min = 0;
int pos_max = -1;
int pos_min = -1;
int vett[MAX];
for (i = 0; i < MAX; i++) {
printf("inserire numero: ");
scanf("%d", &input);
if (input == 0) {
break;
}
else if (input > 0 && (input % 2) == 0 && input > max) {
max = input; pos_max = i;
}
else if (input < 0 && (input % 2) != 0 && input < min) {
min = input; pos_min = i;
}
vett[i] = input;
}
printf("massimo numero pari positivo %d, in posizione %d\n", max, pos_max);
printf("minimo numero dispari negativo %d, in posizione %d\n", min, pos_min);

return 0;
}


per quanto riguarda le stampe a video (io ho considerato solo il caso migliore), se vuoi un programma molto verbose una serie di if serve secondo me.

cicciopantera
20-02-2015, 10:29
:stordita: ...vedo roba nuova in relazione alle mie conoscenze durante il corso di Informatica; ma il mio va bene? Comunque purtroppo il primo esonero di informatica è andato male perchè andava fatta una dicotomica e non avendo fatto il selection sort in precedenza ciò ha comportato molti punti in meno....
Inoltre qual'è la complessità computazionale dell'algoritmo?

wingman87
20-02-2015, 14:04
C'è un errore: inizializzando min e max al primo valore del vettore hai aperto la strada a un bug. Ad esempio l'algoritmo non funziona con questi vettori:
-10 -5
7 4
Il primo ti dà come minimo dispari -10, il secondo ti dà come max pari 7.

Per il resto mi sembra corretto anche se nella funzione di inserimento io toglierei il puntatore a i e metterei un tipo di ritorno int per restituire m.

Secondo me fai bene a suddividere il problema in più parti, anche se il problema è semplice, visto che sei agli inizi.

La complessità come la calcoleresti?

cicciopantera
20-02-2015, 14:58
Ahiiii come devo risolvere il bug, sto andando un po' nel pallone...????
Per la complessità computazionale ho problemi e non riesco a muovermi...

Oceans11
20-02-2015, 18:47
:stordita: ...vedo roba nuova in relazione alle mie conoscenze durante il corso di Informatica; ma il mio va bene?

scusa, quale sarebbe la roba nuova?
ho solo compresso le condizioni degli if.
Inoltre, invece, di prendere in input l'array e poi successivamente cercare il minimo negativo dispari e il massimo positivo pari, lo faccio mentre prendo in input l'array. Complessità O(n) (se ricordo bene la notazione O(.))

Il tuo va bene se consideri la correzione di wingman

cicciopantera
20-02-2015, 18:55
Ok forse ci sono: dovrei semplicemente settare a 0 min e max e non a V[0] altrimenti mi da, giustamente, quel bug

cicciopantera
20-02-2015, 19:06
La notazione è giusta, come sei arrivato ad n?

Oceans11
21-02-2015, 10:34
Ok forse ci sono: dovrei semplicemente settare a 0 min e max e non a V[0] altrimenti mi da, giustamente, quel bug

sì, giusto. In pratica ti avvantaggi del fatto che, dal tuo testo, il valore nullo introdotto da tastiera interrompe l'acquisizione e non è elemento del vettore acquisito.

La notazione è giusta, come sei arrivato ad n?
Parlavo del codice che ti ho postato, non del tuo.
La complessità del mio codice è lineare rispetto alla dimensione dell'input (ossia del numero di dati inseriti)
Una ricerca dicotomica è logaritmica rispetto all'input (perchè ad ogni passo "butti via" metà dell'input).

Il tuo codice anche è lineare, anche se esegui N volte il ciclo per l'acquisizione degli N dati e altre N volte un ciclo per la ricerca del massimo e minimo.