Entra

View Full Version : [C] visualizzazione vettore


Satiel
25-06-2006, 13:51
Ciao a tutti sto preparando l'esame di Info e vorrei un aiuto con un programma visto che da solo nn ci salto fuori.
Ecco cosa dovrebbe fare

1) Leggere i dati da input di un vettore V1 di N1 numeri interi pari tra A e B (inclusi), cioè il programma deve controllare che i valori immessi da input siano pari compresi tra A e B (inclusi)

2) Determinare e stampare a video il valore massimo del vettore V1 quindi determinare e stampare a video quante volte tale numero compare nel vettore.


Per ora ho fatto questo


#include <stdio.h>
#include <stdlib.h>
#define N1 6
#define A 20
#define B 80
int main(int argc, char *argv[])
{
int V[N1];
int I=0;
int J;
int test;

/*input dei numeri e verifica dell'intervallo*/

printf("Immetti 6 numeri compresi tra %d e %d:\n ",A,B);
for (I=0; I<N1-1; I++){
scanf("%d", &V[I]);
if(V[I]>=A,V[I]<=B,V[I]%2==0)
I=I-1;
}


/*visualizzazione vettore*/

printf("\nVettore ");
for(J=0; J<N1; J++)
printf("%5d ",V[N1]);

system("\nPAUSE");
return 0;
}




Problema n°1
con questo sistema non salta il valore ma decrementa di 1 I e quindi se sbaglio piu volte I mi va anche a numeri negativi

Problema n°2
Il vettore che stampo nn è costituito solo dai numeri pari,in più mi saltano fuori numeracci casuali che non capisco (tipo 6546464)

Qualche suggerimento?? :D

andbin
25-06-2006, 14:30
Problema n°1
con questo sistema non salta il valore ma decrementa di 1 I e quindi se sbaglio piu volte I mi va anche a numeri negativiInnanzitutto non si fa un test così:
if (V[I]>=A,V[I]<=B,V[I]%2==0)

Una possibile soluzione (I è già inizializzato a 0):
while (I < N1)
{
printf ("Inserire il valore #%d: ", I+1);
scanf ("%d", &V[I]);
if (V[I]>=A && V[I]<=B && V[I]%2==0)
I++;
}

Satiel
25-06-2006, 14:33
per il vettore ho risolto così



printf("Immetti 6 numeri compresi tra %d e %d:\n ",A,B);

for(I=0;I<N1;I++)
do
scanf("%d", &V[I]);
while (! ((V[I] % 2)==0 && (V[I]>=A && V[I]<=B)));



Ora devo solo visualizzarlo correttamente

andbin
25-06-2006, 14:38
while (! ((V[I] % 2)==0 && (V[I]>=A && V[I]<=B)));Ok, troppe parentesi comunque:
while (!(V[I] % 2==0 && V[I]>=A && V[I]<=B));

Satiel
25-06-2006, 14:58
Ecco il programma completo e funzionante (anche se nn ve ne frega niente :D )

#include <stdio.h>
#include <stdlib.h>
#define N1 6
#define A 20
#define B 80
int main(int argc, char *argv[])
{
int V[N1];
int I;
int J;
int max;
int cont;

/*input dei numeri e verifica dell'intervallo*/

printf("Immetti 6 numeri compresi tra %d e %d:\n ",A,B);

for(I=0;I<N1;I++)
do
scanf("%d", &V[I]);
while (! (V[I]%2==0 && V[I]>=A && V[I]<=B));


/*visualizzazione vettore*/

printf("\nVettore ");
for(J=0; J<N1; J++)
printf("%5d ",V[J]);

/*calcolo di Vmax*/

max=V[0];
cont=1;
for(I=1;I<N1;I++)
if(V[I]>=max) {
max=V[I];
cont=cont+1; }

printf("\n\n\nIl valore max e' %d e compare nel vettore %d volte\n\n",max,cont);


system("PAUSE");
return 0;
}

repne scasb
25-06-2006, 16:07
Ecco il programma completo e funzionante (anche se nn ve ne frega niente :D )

Non mi pare funzionante. Infatti inserendo i seguenti valori: 40 42 44 46 48 50, il software risponde che: "Il valore max e' 50 e compare nel vettore 6 volte". In realta', se ho ben capito il numero 50 compare nel vettore 1 sola volta e non 6 volte. Ma potrei aver frainteso il problema.

Satiel
25-06-2006, 16:10
uh?
a me non lo dava.... :confused:

Satiel
25-06-2006, 16:13
Si ho provato in effetti fa come hai detto tu, io avevo provato con numeri più bassi 22 26 26 24 24 22 e funzionava

repne scasb
25-06-2006, 16:26
Si ho provato in effetti fa come hai detto tu, io avevo provato con numeri più bassi 22 26 26 24 24 22 e funzionava

Dispongo di una soluzione al tuo problema, se vuoi la posso rendere pubblica. Ma credo che tu voglia risolvere il problema autonomamente.

NOTA: Il problema e' chiaramente qui:


max=V[0];
cont=1;
for(I=1;I<N1;I++)
if(V[I]>=max) {
max=V[I];
cont=cont+1; }

Satiel
25-06-2006, 16:29
In effetti ci ero arrivato che potesse essere nel cont, solo che ora ho il cervello in pappa è da stamattina che studio quindi rendi pure pubblica la soluzione :D

repne scasb
25-06-2006, 16:43
In effetti ci ero arrivato che potesse essere nel cont, solo che ora ho il cervello in pappa è da stamattina che studio quindi rendi pure pubblica la soluzione :D


#include <stdio.h>
#include <stdlib.h>

#define N1 6
#define A 20
#define B 80

void main(void)

{
int v[N1],i,max,cont;

printf("Inserire %d numeri pari compresi tra %d e %d\n\n",N1,A,B);

for(i=0;i<N1;i++)
{
do
{
printf("Numero %d: ",i+1);
scanf("%d",&v[i]);
} while (v[i]&1==1||v[i]<A||v[i]>B);
}

printf("\nVettore:");
for(i=0;i<N1;i++)
printf(" %d",v[i]);

for(max=v[0],cont=i=1;i<N1;i++)
{
if(v[i]==max)
cont++;
if(v[i]>max)
{
max=v[i];
cont=1;
}
}

printf("\n\nIl valore massimo e' %d e compare nel vettore %d volte\n",max,cont);
}

sirus
25-06-2006, 17:26
...
while (v[i]&1==1||v[i]<A||v[i]>B);
...
Soluzione indubbiamente elegante... :sofico: ma forse è meglio mettergli un più classico v[i]%2 == 0 invece del (bellissimo) v[i]&1 == 1 ;)

forse per un "novizio" è più comprensibile!

repne scasb
25-06-2006, 18:44
forse è meglio mettergli un più classico v[i]%2 == 0 invece del v[i]&1 == 1

forse per un "novizio" è più comprensibile!

Concordo (v[i]%2==1 (non c'e' il 'NOT')). Un annotazione a margine circa l'efficienza in C della riga di codice in esame: In C-- avrei scritto:


while (v[i]-A)=&1==1||>(B-A);


Se interessa spiego cosa significa, ma e' interessante notare che rispetto al C e' stato possibile ridurre i salti condizionati da 3 a 2 rendendo il codice assembly piu' digeribile (NOTA: il vettore v[i] deve essere dichiarato come 'unsigned').

mind_
25-06-2006, 21:24
Soluzione indubbiamente elegante... :sofico: ma forse è meglio mettergli un più classico v[i]%2 == 0 invece del (bellissimo) v[i]&1 == 1 ;)

forse per un "novizio" è più comprensibile!

Si può anche togliere il ==1
Saluti

repne scasb
25-06-2006, 23:07
Si può anche togliere il ==1

Ottimo. E' comunque possibile spingere molto oltre. Ad esempio si possono togliere tutti e tre i salti condizionati all'interno del 'while' (ossia il test per numeri pari il test per minore ed il test per maggiore):


} while ((v[i]*(A+B)-A*B-v[i]*v[i])&(int)((1<<((sizeof(int)<<3)-1))+1));


Spero apprezzerai.

sirus
26-06-2006, 09:54
Concordo (v[i]%2==1 (non c'e' il 'NOT')). Un annotazione a margine circa l'efficienza in C della riga di codice in esame: In C-- avrei scritto:


while (v[i]-A)=&1==1||>(B-A);


Se interessa spiego cosa significa, ma e' interessante notare che rispetto al C e' stato possibile ridurre i salti condizionati da 3 a 2 rendendo il codice assembly piu' digeribile (NOTA: il vettore v[i] deve essere dichiarato come 'unsigned').
Interessato... il C-- non lo conosco!
hai link particolarmente interessanti in proposito? :)

sirus
26-06-2006, 09:55
Ottimo. E' comunque possibile spingere molto oltre. Ad esempio si possono togliere tutti e tre i salti condizionati all'interno del 'while' (ossia il test per numeri pari il test per minore ed il test per maggiore):


} while ((v[i]*(A+B)-A*B-v[i]*v[i])&(int)((1<<((sizeof(int)<<3)-1))+1));


Spero apprezzerai.
Devo ammetterlo, ci ho messo un po' a decodificarla :ciapet: ...

AngeL)
26-06-2006, 10:05
scusate la mia ignoranza, ma non ho capito a che serve
#define N1 6
#define A 20
#define B 80
quando si puo scrivere
int n1=6;
int a=20;
int b=80;
:mbe:

AngeL)
26-06-2006, 10:07
} while ((v[i]*(A+B)-A*B-v[i]*v[i])&(int)((1<<((sizeof(int)<<3)-1))+1));

Spero apprezzerai

certo, ho apprezzato il giramento di testa :ciapet:^10

andbin
26-06-2006, 10:32
scusate la mia ignoranza, ma non ho capito a che serve
#define N1 6
#define A 20
#define B 80
quando si puo scrivere
int n1=6;
int a=20;
int b=80;
:mbe:Usando #define, N1, A, B sono delle "macro" (che si espandono quando sono usate), non delle variabili.

repne scasb
26-06-2006, 11:06
Interessato... il C-- non lo conosco!
hai link particolarmente interessanti in proposito? :)

http://www.cminusminus.org/

sirus
26-06-2006, 11:24
http://www.cminusminus.org/
Grazie mille :ave: