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?
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...
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?
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?
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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.