View Full Version : [C] visualizzazione vettore
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
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++;
}
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
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));
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.
uh?
a me non lo dava.... :confused:
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; }
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);
}
...
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').
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.
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? :)
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: ...
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:
} 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
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/
http://www.cminusminus.org/
Grazie mille :ave:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.