|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2007
Messaggi: 1352
|
[C]Ciclo for infinito, non riesco ad individuare il problema
Perchè questo cicli for mi và in un loop infinito?
Codice:
for(t=0;t<dim2;t++)
for(i=0;i<dim;i++)
for(j=0;j<dim;j++){
if(A[i]==B[j]){
for(k=0;k<t;k++)
if(A[i]!=V[k])
V[t]=A[i];
else break;
}
}
__________________
Ho venduto a : truedocman2004,ragen-fio Ho acquistato da :shinakuma, britt-one |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Codice:
for (t=0; t<dim2; t++)
for (i=0; i<dim; i++)
for (j=0; j<dim; j++)
if (A[i]==B[j]) {
for (k=0; k<t; k++)
if (A[i]!=V[k])
V[t]=A[i];
else
break;
}
Che grandezze hai per dim2, dimm? Perchè (sarò ciecato io) dal codice non mi pare ci sia nulla che possa riccondurre alla possibilità di un loop infinito.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Feb 2007
Messaggi: 1352
|
Quote:
Le dimensioni di dim sono 100, dim 2 varia a seconda degli elementi uguali di dim 1, ma comunque è compreso tra 0 e 100
__________________
Ho venduto a : truedocman2004,ragen-fio Ho acquistato da :shinakuma, britt-one |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Feb 2007
Messaggi: 1352
|
questo è tutto il codice
Codice:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define VERO 1
#define FALSO 0
#define dim 100
void prim(int);
main(){
int min,mag,dif,dim2,i,j,k,t, A[dim],B[dim],V[dim2];
srand(time(NULL));
for(i=0;i<dim;i++){
A[i]=rand()%27+45;
B[i]=rand()%27+45;
}
printf("\nIl primo vettore e':\n");
for(i=0;i<dim;i++)printf("%d ",A[i]);
printf("\nIl secondo vettore e':\n");
for(i=0;i<dim;i++)printf("%d ",B[i]);
//calcolo dimensione del vettore intersezione
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
if(A[i]==B[j]){
dim2++;
break;
}
//fine
//calcolo elementi intersezione eliminando ripetuti
for(t=0;t<dim2;t++)
for(i=0;i<dim;i++)
for(j=0;j<dim;j++){
if(A[i]==B[j]){
for(k=0;k<t;k++)
if(A[i]!=V[k])
V[t]=A[i];
else break;
}
}
printf("\nIl vettore intersezione e':\n");
for(i=0;i<dim2;i++)printf("%d ",V[i]);
for(i=0;i<dim2;i++)if(V[i]>V[0])mag++;
min=dim-mag;
dif=mag-min;
prim(dif);
system("PAUSE");
return(0);
}
//funziona primalità
void prim(int num){
int i=3;
int primo = FALSO;
if((num%2)==0 || (num==1)) //Se il numero è 1 o 2 allora è primo
primo = VERO;
while((primo==FALSO) && (i<num)) //Qui arriva soltanto se il numero è maggiore di 2
{
if((num%i)==0) //Controlla se da una divisione esce il resto zero
primo=VERO;
i=i+2;
}
if (primo==FALSO)
printf("Il numero %d e' primo\n", num);
else
printf("Il numero %d non e' primo\n", num);
}
__________________
Ho venduto a : truedocman2004,ragen-fio Ho acquistato da :shinakuma, britt-one |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Scusa, ma dim2 prima di essere incrementato, non ha bisogno di essere inizializzato?
Codice:
main(){
int min,mag,dif,dim2,i,j,k,t, A[dim],B[dim],V[dim2];
srand(time(NULL));
for(i=0;i<dim;i++){
A[i]=rand()%27+45;
B[i]=rand()%27+45;
}
printf("\nIl primo vettore e':\n");
for(i=0;i<dim;i++)printf("%d ",A[i]);
printf("\nIl secondo vettore e':\n");
for(i=0;i<dim;i++)printf("%d ",B[i]);
//calcolo dimensione del vettore intersezione
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
if(A[i]==B[j]){
dim2++;
break;
}
//fine
Vedo delle variabili dichiarate, ma non inizializzate e poi utilizzate (tipo dim2, ma anche dim)... sono dolori a tutto spiano, da quel poco che ricordo del C.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Questa dichiarazione è errata:
Codice:
int min,mag,dif,dim2,i,j,k,t, A[dim],B[dim],V[dim2]; Puoi correggere ad esempio con: Codice:
int min,mag,dif,dim2,i,j,k,t, A[dim],B[dim]; dim2=100; int V[dim2]; Comunque, repetita iuvant
__________________
Il sole è giallo |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Feb 2007
Messaggi: 1352
|
scusa ma se quindi dichiari
int dim; int v[dim] cosi va bene?o nemmeno? devo per froza dargli un numero alla dimensione? Comunque ho modificato il programma in una maniera che forse dovrebbe essere più corretta, ma non funziona ugualmente, mi dà numeri random. Codice:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define VERO 1
#define FALSO 0
#define dim 10
#define dim3 27
void prim(int);
main(){
int min=0,mag=0,dif=0,dim2=0,i=0,j=0,k=0,t=0, A[dim],B[dim],Atemp[dim3],Btemp[dim3];
srand(time(NULL));
for(i=0;i<dim;i++){
A[i]=rand()%27+45;
B[i]=rand()%27+45;
}
printf("\nIl primo vettore e':\n");
for(i=0;i<dim;i++)printf("%d ",A[i]);
printf("\nIl secondo vettore e':\n");
for(i=0;i<dim;i++)printf("%d ",B[i]);
//calcolo dimensione del vettore intersezione
for(i=0;i<dim;i++){
for(k=0;k<j;k++)if(A[i]==A[k])break;
for(j=0;j<dim;j++)
if(A[i]==B[j]){
dim2++;
break;
}
}
//fine
printf("%d",dim2);
int V[dim2];
//calcolo elementi intersezione eliminando ripetuti
for(i=0;i<dim3;i++)
for(j=0;j<dim;j++){
for(k=0;k<dim;k++)
if(A[j]==A[k])continue;
if(i+45==A[j])
Atemp[i]=1;
else Atemp[i]=0;
}
for(i=0;i<dim3;i++)
for(j=0;j<dim;j++){
for(k=0;k<dim;k++)
if(B[j]==B[k])continue;
if(i+45==B[j])
Btemp[i]=1;
else Btemp[i]=0;
}
for(i=0;i<dim2;i++)
for(j=0;j<dim3;j++)
if((Atemp[j]==1)&&(Btemp[j]==1))V[i]=i+45;
//calcolo maggiori, minori, primalità
printf("\nIl vettore intersezione e':\n");
for(i=0;i<dim2;i++)printf("%d ",V[i]);
for(i=0;i<dim2;i++)if(V[i]>V[0])mag++;
min=dim-mag;
dif=mag-min;
prim(dif);
system("PAUSE");
return(0);
}
//funziona primalità
void prim(int num){
int i=3;
int primo = FALSO;
if((num%2)==0 || (num==1)) //Se il numero è 1 o 2 allora è primo
primo = VERO;
while((primo==FALSO) && (i<num)) //Qui arriva soltanto se il numero è maggiore di 2
{
if((num%i)==0) //Controlla se da una divisione esce il resto zero
primo=VERO;
i=i+2;
}
if (primo==FALSO)
printf("Il numero %d e' primo\n", num);
else
printf("Il numero %d non e' primo\n", num);
}
__________________
Ho venduto a : truedocman2004,ragen-fio Ho acquistato da :shinakuma, britt-one Ultima modifica di The-Revenge : 19-11-2009 alle 21:41. |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Quote:
Codice:
#define dim 10 int v[dim]; Codice:
int dim; int v[dim]; a) stai utilizzando una variabile (dim) non inizializzata, il cui valore è imprevedibile, e non ha senso dichiarare un array di grandezza casuale b) la gran parte dei compilatori (ma non ne hai certezza) inizializza dim al valore 0 dopo la dichiarazione, quindi su questi compilatori stai dichiarando un array di 0 elementi. Potresti avere array di grandezza variabile solo utilizzando l'allocazione dinamica, ma ti consiglio di fare un po' di esperienza col c prima di passare su quella sponda, che per esperienza risulta sempre un po' ostica.
__________________
Il sole è giallo |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Feb 2007
Messaggi: 1352
|
Quote:
Ad esempio se faccio un operazione su 2 vettori e questa operazione alla fine mi restituisce dim2, e nel rigo dopo scrivo int v[dim2] cosi va bene vero?
__________________
Ho venduto a : truedocman2004,ragen-fio Ho acquistato da :shinakuma, britt-one |
|
|
|
|
|
|
#11 | ||
|
Senior Member
Iscritto dal: Feb 2007
Messaggi: 1352
|
Ragazzi ho riscritto il codice, adesso mi funziona tutto tranne un pezzo in cui stampo i valori delle intersezioni.
Ecco tutto il programma
mentre questo è il pezzo che non funziona Codice:
for(i=0;i<dim2;i++)
for(j=k;j<dim3;j++)
if((Atemp[j]==1)&&(Btemp[j]==1)){
V[i]=(j+45);
k=j+1;
break;
}
__________________
Ho venduto a : truedocman2004,ragen-fio Ho acquistato da :shinakuma, britt-one Ultima modifica di The-Revenge : 23-11-2009 alle 14:51. |
||
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
|
Quote:
vedila da questo punto di vista Codice:
int a;
int b;
int result;
scanf("Numero a: %d", &a);
scanf("Numero b: %d", &b);
result = a+b;
print("Risultato è: %d\n", result);
int v[result];
int i;
fot (i = 0; i <result; i++) {...}
il compilatore nemmeno, dunque non saprà quanto spazio allocare per l'array v. ah, a proposito: se non devi usare numeri con segno, dichiara le variabili come unsigned. Non è il massimo avere result = -1 e poi creare (dinamicamente) un array di dimensione result ![]() anzi, mi meraviglio che ti compili una cosa del genere. visual studio 2005 si incazza come una iena, e credo pure gcc. l'unica cosa permessa è: Codice:
const unsigned result = 100; int v[result];
__________________
Ciao ciao cagnolino Billy MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen. XBOX Live GamerTag: InsaneMau Ultima modifica di maulattu : 23-11-2009 alle 23:53. |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Feb 2007
Messaggi: 1352
|
Quote:
__________________
Ho venduto a : truedocman2004,ragen-fio Ho acquistato da :shinakuma, britt-one |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Non lo è in C++ e C89. |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Feb 2007
Messaggi: 1352
|
Quote:
Ma io visual C++ non lo so usare, riesco a malappena a compilare questo codice per esempio, che mi sembra del tutto normale e lineare, mi dà un errore sia in in visual c che in devc...mi dice "too few arguments in function "int confronto(int) Codice:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define dim 50
void stampa(void);
int media(void);
void genera(void);
int confronto(int);
int A[dim][dim];
int i,j;
int main(){
srand(time(NULL));
genera();
stampa();
printf("\nIl numero e' %d",confronto());
system("PAUSE");
return(0);
}
void genera(void){
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
A[i][j]=rand()%5+13;
}
void stampa(void){
printf("\nIl vettore e':\n");
for(i=0;i<dim;i++){
printf("\n");
for(j=0;j<dim;j++)
printf("%d ",A[i][j]);
}
}
int confronto(int media()){
int count;
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
if((j<dim-1-i)&&(j>i)){
if(A[i][j]>media())count++;
}
return(count);
}
int media(void){
int med;
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
med=med+A[i][j];
med=med/(dim*dim);
return(med);
}
__________________
Ho venduto a : truedocman2004,ragen-fio Ho acquistato da :shinakuma, britt-one |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Codice:
int confronto(int media()) |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Feb 2007
Messaggi: 1352
|
la funzione confronto in ingresso ha bisogno del valore di uscita della funziona media.E' sbagliato?
cmq nn me lo da li l'errore, me lo da quando dichiaro confronto, fuori dal main.
__________________
Ho venduto a : truedocman2004,ragen-fio Ho acquistato da :shinakuma, britt-one Ultima modifica di The-Revenge : 24-11-2009 alle 17:48. |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Poi nel tuo caso quando andrai a richiamarla potrai fare: Codice:
printf("\nIl numero e' %d",confronto(media()));
|
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Quote:
Codice:
dichiarazione: int (*puntatore)(); Codice:
nel main: puntatore=media; Ti spiego però perchè è errato anche dal punto di vista concettuale (non ti offendere, sono errori che fanno tutti e solo l'esperienza aiuta ad evitarli): media è sempre uguale e non cambia nel tempo, quindi non ha senso ricalcolarlo ogni volta che accedi alla funzione confronto, sprechi solo un sacco di cicli macchina. Il modo corretto sarebbe di calcolare la media una volta sola, ad esempio con Codice:
int m=media();
__________________
Il sole è giallo |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Feb 2007
Messaggi: 1352
|
Quote:
Non ho ben capito il fatto dei puntatori, ma visto che sono uno studente e che i puntatori li ha solo accenati, credo che capirò più avanti...o meglio più che non li ho capiti, fino ad ora ho dato i puntatori come delle cose scontate, come se fossero impliciti ovvero come se il compilatore sapesse sempre dove andare a prendere i dati, cosa che non richiederebbe effettivamente l'uso dei puntatori, ma visto che questi errori che compio mi fanno capire che nn è cosi, tneterò di approfondire sui puntatori ...fermo restando che comunque col metodo di porre m=media() e poi confronto(m) il rpogramma funzione bene, ed è ciò che volevo dato che il problerma era solo una simulazione di una prova e quasi nessuno è riuscito a farla
__________________
Ho venduto a : truedocman2004,ragen-fio Ho acquistato da :shinakuma, britt-one |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:19.





















