PDA

View Full Version : [C] Acquisizione Array alternato


Satiel
29-06-2006, 17:09
Ciao a tutti, vi chiedo ancora una volta il vostro aiuto per un programma in C.
Ecco cosa dovrebbe fare:

Acquisire i dati da tastiera e immetterli in un Array, questi numeri però devono essere alternativamente divisibili per 3
*Esempio*

10
5 nn viene considerato
4 nn viene considerato
6
11
16 nn viene considerato
18
ecc...

Ecco il mio codice












#include <stdio.h>
#include <stdlib.h>
#define N1 6
#define T 20

int main(int argc, char *argv[])
{

int V1[N1];
float prova;
int I;
float Q1;
int Q2;


printf("Inserire i numeri-> ");
for(I=0;I<N1;I++){
if(I%2==0){ //controlla se l'indice è pari
do{ //entra nel ciclo per controllo /3
scanf("%d",&prova);
Q1=V1[I]/3;
Q2=Q1;
V1[I]=prova;}
while(Q2*3==prova);} //se il numero è /3 esce dal ciclo
if(I%2==1) //controlla se l'indice è dispari

scanf("%d",&V1[I]); //immette semplicemente il numero
}

/*Visualizza il vettore per vedere se lo ha preso bene*/

for(I=0;I<N1;I++)
printf("\n %d",V1[I]);







system("PAUSE");
return 0;
}






Il problema è che non rimane dentro al ciclo se il numero nn è divisibile per 3, ma mette uno zero e prosegue.
Sono sicuro al 99,9% che il controllo della divisione sia giusto perchè a parte avevo sviluppato un programmino che faceva solo questo, ve lo posto così potete verificare anche voi




#include <stdio.h>
#include <stdlib.h>
#define B 3
int main(int argc, char *argv[])
{

float A;
float C1;
int C2;
int I;



printf("\n\nInserire il numero "); // Inserisce il numero
scanf("%f",&A);
C1=A/3; // Fa la divisione
C2=C1; // Converte il float in int eliminando le virgole
if(C2*3==A) // Se il numero intero è uguale al numero che ho immesso allora anche il risutato era intero
printf(" %f e' divisibile\n\n",A);
else
printf(" %f non e' divisibile\n\n",A);




system("PAUSE");
return 0;
}






Ringrazio in anticipo chiunque sappia aiutarmi

Andlea
29-06-2006, 17:23
Sarò criptico

if(a%b==0)
printf("Il numero a è divisibile per b");

Non serve dividere e poi controllare la moltiplicazione del quoziente per il divisore

Satiel
29-06-2006, 17:25
Ok grazie ma sono sicuro che il problema era nel fatto che non rimaneva nel cliclo while...

Andlea
29-06-2006, 17:34
per forza


do{ //entra nel ciclo per controllo /3
scanf("%d",&prova);
Q1=V1[I]/3;

Acquisisci prova, poi assegni a Q1 il valore di V1[I] che non è stato ancora definito

Q2=Q1;
V1[I]=prova;}

Assegni a Q2 il valore di Q1, quindi il numero non definito diviso 3, solo poi assegni a prova[i] un valore.
[/code]
while(Q2*3==prova);} //se il numero è /3 esce dal ciclo[/code]
Quindi questo test non sarà mai vero


il codice "corretto" è questo
for(I=0;I<N1;I++){
if(I%2==0){
do
scanf("%d",&V[I]);
while(V[I]%3==0);
}else
scanf("%d",&V1[I]);

Satiel
29-06-2006, 17:51
Mille grazie

Satiel
29-06-2006, 17:56
Niente da fare, non resta nel ciclo
Ecco la modifica



#include <stdio.h>
#include <stdlib.h>
#define N1 6
#define T 20

int main(int argc, char *argv[])
{

int V1[N1];
float prova;
int I;
float Q1;
int Q2;


printf("Inserire i numeri-> ");
for(I=0;I<N1;I++){
if(I%2==0){
do
scanf("%d",&V1[I]);
while(V1[I]%3==0);
}
else
scanf("%d",&V1[I]); //immette semplicemente il numero
}

/*Visualizza il vettore per vedere se lo ha preso bene*/

for(I=0;I<N1;I++)
printf("\n %d",V1[I]);







system("PAUSE");
return 0;
}

Fenomeno85
29-06-2006, 18:11
aspè che guardo e ti posto il codice.

EDIT:

allora il seguente codice prende valori alternati partendo dal primo che deve essere mod3. Se lo vuoi al contrario basta che metti ! sull'if del valore booleano.


#include "stdafx.h"

#define N1 6
#define T 20

int main(int argc, char *argv[]){
/* array dei dati che contengono alternativamente valori mod3 l'altro no */
int arrayValori[N1];
/* variabile booleana per acquisire valori alternati */
bool valoreDaInserire = true;
/* variabile di appoggio per acquisizione dei valori da tastiera */
int valSup;
/* variabile per sapere il numero di elementi inseriti */
int i=0;
/* acquisizione dei dati */
while (i<N1){
scanf ("%d", &valSup);
if (valoreDaInserire){
if (valSup%3 == 0) {
/* inseriamo il valore nell'array */
arrayValori[i] = valSup;
/* incrementiamo il numero di elementi */
i++;
/* abilitiamo che il prossimo valore non deve essere mod3 */
valoreDaInserire = false;
}
else printf ("Devi inserire un valore mod3.\n");
}
else {
if (valSup%3 == 0){
printf ("Devi inserire un valore non mod3.\n");
}
else{
/* inseriamo l'elemento nell'array */
arrayValori[i] = valSup;
/* incrementiamo il numero di elementi */
i++;
/* abilitiamo che il prossimo numero deve essere divisibile per 3 */
valoreDaInserire = true;
}
}
}

/* visualizziamo l'array */
for (i=0;i<N1;i++) printf ("Valore: %d.\n", arrayValori[i]);



return 0;
}


se lo vuoi diverso cioè che puoi partire da qualsiasi valore allora va leggermente modificato.

~§~ Sempre E Solo Lei ~§~

Andlea
29-06-2006, 19:05
Niente da fare, non resta nel ciclo
Ecco la modifica
while(V[I]%3!=0)
pardòn

Satiel
29-06-2006, 20:10
aspè che guardo e ti posto il codice.

EDIT:

allora il seguente codice prende valori alternati partendo dal primo che deve essere mod3. Se lo vuoi al contrario basta che metti ! sull'if del valore booleano.



se lo vuoi diverso cioè che puoi partire da qualsiasi valore allora va leggermente modificato.

~§~ Sempre E Solo Lei ~§~

Hey è una bella soluzione anche se l'esame di Fondamenti di Informatica non prevede di usare variabili booleane e librerie aggiuntive e strane funzioni, purtroppo devo prendere la strada più scomoda usando le funzioni di base :mad:

Satiel
29-06-2006, 20:11
while(V[I]%3!=0)
pardòn

grazie ora provo

Fenomeno85
04-07-2006, 19:13
Hey è una bella soluzione anche se l'esame di Fondamenti di Informatica non prevede di usare variabili booleane e librerie aggiuntive e strane funzioni, purtroppo devo prendere la strada più scomoda usando le funzioni di base :mad:

allora la libreria strana altro non è che un file h dove sono contenute tutte le librerie che ti servono .. è perchè sto usando un progetto di vc.

Per la variabile booleana o te la crei te oppure usi semplicemente un intero.

~§~ Sempre E Solo Lei ~§~