Programma che si ferma dopo un ciclo for

di il
11 risposte

Programma che si ferma dopo un ciclo for

Salve, prima di postare l'intero codice vorrei chiedervi come si può ovviare alla situazione in cui quando devo immettere le n componenti di un vettore, dopo aver inserito la nsima componente ed aver cliccato invio il terminal non dà alcun risultato. Cerco di essere più chiaro. Dopo aver inserito b[n]= valore premo invio e ho una striscia vuota, come se il programma fosse ancora in esecuzione ma non ritorna nulla.
Ovviamente dopo l'inserimento dell'ultima componente, nel programma avevo la chiamata ad una function.

Quali sono i motivi che portano ad una situazione del genere la maggior parte delle volte? Il ciclo for funziona bene.

Se necessario pubblico l'intero codice.
Grazie!

11 Risposte

  • Re: Programma che si ferma dopo un ciclo for

    Prova a fare una stampa di debug, per vedere se è stato acquisito il vettore come vuoi?

    Osserva che se devi stamparla come stringa devi mettere in b[n-1]='\0';

    Se non ho capito bene il problema, posta la porzione di codice che da problemi.
  • Re: Programma che si ferma dopo un ciclo for

    Ho provato a scrivere semplicemente
    printf("Inserire gli elementi del vettore termini noti\n");
    for(i=0; i<n; i++) 
    	{printf("b[%d]=", i);
    	scanf("%f", &b[i]);};
    printf("ciao");
    
    e mi stampa ciao.
    Allora mi sa che il problema è nella function,
    scrivo l'intero codice?
  • Re: Programma che si ferma dopo un ciclo for

    
    printf("Inserire gli elementi del vettore termini noti\n");
        for(i=0; i<n; i++) {
            printf("b[%d]=", i);
            scanf("%f", &b[i]);
        }
        printf("%f", b[2]);
    
    
        printf("Inserire gli elementi del vettore termini noti\n");
        for(i=0; i<n; i++) {
            printf("b[%d]=", i);
            scanf("%f", &b[i]);
        }
        printf("ciao");
    
    Il codice scritto dovrebbe permetterti di arrivare sia a ciao sia a b[2]

    Dimmi un attimo n com'è dichiarato?
  • Re: Programma che si ferma dopo un ciclo for

    Ciao,
    io non riscontro il problema, come si vede da questa immagine: http://it.tinypic.com/r/xepgrq/
  • Re: Programma che si ferma dopo un ciclo for

    Facciamo così, posto tutto il codice anche se è un po' lunghetto.
    Sono convinto che il problema è nella function chiamata nel main, perchè èlì che si blocca, ma non riesco a capire dove!!
    #include<stdio.h>
    #include<stdlib.h>
    void gausspiv(float **A, float *b, int n); 
    void backsub(float **A, float *b, int n, float *x);
    main()
    {float **A, *b, *x; 
    int n; /*dimensione del sistema */
    int k; /* indice della prima riga da scambiare */
    int i, j;/*variabili locali: servono per i cicli for*/
    printf("Inserire la dimensione del sistema n=");
    scanf("%d", &n);
    
    /*dichiarazione dinamica della matrice e del vettore termini noti */
    A=(float **)calloc(n,sizeof(float *));
    for(i=0;i<n;i++)
    	A[i]=(float *)calloc(n,sizeof(float));
    b=(float *)calloc(n,sizeof(float));
    x=(float *)calloc(n,sizeof(float));
    
    printf("Inserire gli elementi della matrice\n");
    for(i=0; i<n; i++) 
    	 for(j=0; j<n; j++)
    		{printf("A[%d][%d]=", i, j);
    		 scanf("%f", &A[i][j]);};
    printf("Inserire gli elementi del vettore termini noti\n");
    for(i=0; i<n; i++) 
    	{printf("b[%d]=", i);
    	scanf("%f", &b[i]);
    	};
    printf("ciao\n");
    
    gausspiv(A, b, n);
    backsub(A, b, n, x);
    
    printf("La matrice e il vettore termini noti modificati con\nla strategia del pivoting parziale hanno componenti\n");
    for(i=0;i<n;i++)
    	for(j=0;j<n;j++)
    	printf("A[%d][%d]=%f \n", i, j, A[i][j]);
    for(i=0;i<n;i++)
    	printf("b[%d]=%f \n", i, b[i]);
    
    printf("La soluzione del sistema modificato secondo la strategia del pivoting è data dal vettore:\n");
    for(i=0;i<n;i++)
    	printf("x[%d]=%f \n", i, x[i]);
    }
    function 1
    void backsub(float **A, float *b, int n, float *x)
    {
    int i,j;
    x[n-1]=b[n-1]/A[n-1][n-1];
    
    for(i=n-2; i>=0; i--)
    	{
    	x[i]=b[i]; 
    	for(j=i+1; j<n; j++)
    		x[i]=x[i]-A[i][j]*x[j];
    	x[i]=x[i]/A[i][i]; /* fa parte del ciclo for di indice i */
    	}
    return;
    }
    function 2
    void piv(float **A, float *b, int n, int k);
    void gausspiv(float **A, float *b, int n)
    {int i, j, k;
    for(k=0;k<n-1;i++)
    	{
    	piv(A, b, n, k); /*chiamo la funzione piv sulla riga k-esima */ /*chiamo la function piv nella function gausspiv */
    	for(i=k+1;i<n;i++)
    		{
    		A[i][k]=A[i][k]/A[k][k]; /*creazione di un coefficiente per l'eliminazione */
    		for(j=k;j<n;j++)
    			A[i][j]=A[i][j]-A[i][k]*A[k][j]; /*riduzione dei coefficienti */
    		b[i]=b[i]-A[i][k]*b[k]; /*riduzione dei termini noti */
    		};
        	};
    return;
    }
    
    function 3
    #include<math.h>
    void piv(float **A, float *b, int n, int k)
    {
    float t; /*variabile d'appoggio (locale) per scambiare la riga k-esima con la riga r-esima*/
    int i, j, r; /*i e j servono per i cicli, r è l'indice della riga con cui effettuare lo scambio */
    float max; /*max è il massimo elemento in modulo della colonna k-esima */
    
    max=(fabs(A[k][k]));
    r=k;
    for(i=k+1;i<n;i++)
    	{
    	if(fabs(A[i][k])>max)
    		{
    		max=fabs(A[i][k]);
    		r=i;
    		};
    	};
    
    if(r!=k) /*alla fine del ciclo for r=i e potrebbe essere quindi diverso da k */
    	{
    	for(j=k;j<n;j++) /*scambio la riga k-esima con la riga r-esima*/
    		{
    		t=A[r][j];
    		A[r][j]=A[k][j];
    		A[k][j]=t;
    		};
    	t=b[r];
    	b[r]=b[k];
    	b[k]=t;
    	};
    return;
    }
    Ovviamente sto parlando dell'algoritmo di Gauss con la strategia del pivoting parziale
  • Re: Programma che si ferma dopo un ciclo for

    
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    
    void gausspiv(float **A, float *b, int n);
    void backsub(float **A, float *b, int n, float *x);
    void piv(float **A, float *b, int n, int k);
    
    int main() {
        float **A, *b, *x;
        int n; /*dimensione del sistema */
    //    int k; /* indice della prima riga da scambiare */
        int i, j;/*variabili locali: servono per i cicli for*/
        printf("Inserire la dimensione del sistema n=");
        scanf("%d", &n);
    
        /*dichiarazione dinamica della matrice e del vettore termini noti */
        A=(float **)calloc(n,sizeof(float *));
        for(i=0; i<n; i++)
            A[i]=(float *)calloc(n,sizeof(float));
        b=(float *)calloc(n,sizeof(float));
        x=(float *)calloc(n,sizeof(float));
    
        printf("Inserire gli elementi della matrice\n");
        for(i=0; i<n; i++)
            for(j=0; j<n; j++) {
                printf("A[%d][%d]=", i, j);
                scanf("%f", &A[i][j]);
            };
        printf("Inserire gli elementi del vettore termini noti\n");
        for(i=0; i<n; i++) {
            printf("b[%d]=", i);
            scanf("%f", &b[i]);
        };
        printf("ciao\n");
    
        //gausspiv(A, b, n);
        // backsub(A, b, n, x);
    
        printf("La matrice e il vettore termini noti modificati con\nla strategia del pivoting parziale hanno componenti\n");
        for(i=0; i<n; i++)
            for(j=0; j<n; j++)
                printf("A[%d][%d]=%f \n", i, j, A[i][j]);
        for(i=0; i<n; i++)
            printf("b[%d]=%f \n", i, b[i]);
    
        printf("La soluzione del sistema modificato secondo la strategia del pivoting è data dal vettore:\n");
        for(i=0; i<n; i++)
            printf("x[%d]=%f \n", i, x[i]);
    
        return 0;
    }
    
    void backsub(float **A, float *b, int n, float *x) {
        int i,j;
        x[n-1]=b[n-1]/A[n-1][n-1];
    
        for(i=n-2; i>=0; i--) {
            x[i]=b[i];
            for(j=i+1; j<n; j++)
                x[i]=x[i]-A[i][j]*x[j];
            x[i]=x[i]/A[i][i]; /* fa parte del ciclo for di indice i */
        }
        return;
    }
    
    void gausspiv(float **A, float *b, int n) {
        int i, j, k;
        for(k=0; k<n-1; i++) {
            piv(A, b, n, k); /*chiamo la funzione piv sulla riga k-esima */ /*chiamo la function piv nella function gausspiv */
            for(i=k+1; i<n; i++) {
                A[i][k]=A[i][k]/A[k][k]; /*creazione di un coefficiente per l'eliminazione */
                for(j=k; j<n; j++)
                    A[i][j]=A[i][j]-A[i][k]*A[k][j]; /*riduzione dei coefficienti */
                b[i]=b[i]-A[i][k]*b[k]; /*riduzione dei termini noti */
            };
        };
        return;
    }
    
    void piv(float **A, float *b, int n, int k) {
        float t; /*variabile d'appoggio (locale) per scambiare la riga k-esima con la riga r-esima*/
        int i, j, r; /*i e j servono per i cicli, r è l'indice della riga con cui effettuare lo scambio */
        float max; /*max è il massimo elemento in modulo della colonna k-esima */
    
        max=(fabs(A[k][k]));
        r=k;
        for(i=k+1; i<n; i++) {
            if(fabs(A[i][k])>max) {
                max=fabs(A[i][k]);
                r=i;
            };
        };
    
        if(r!=k) { /*alla fine del ciclo for r=i e potrebbe essere quindi diverso da k */
            for(j=k; j<n; j++) { /*scambio la riga k-esima con la riga r-esima*/
                t=A[r][j];
                A[r][j]=A[k][j];
                A[k][j]=t;
            };
            t=b[r];
            b[r]=b[k];
            b[k]=t;
        };
        return;
    }
    
    
    Ti posto il codice hai scritto tu, ordinato. A me compila e esegue il "ciao" senza problemi.
    Puoi specificare che errore da?
  • Re: Programma che si ferma dopo un ciclo for

    Dovrebbe continuare ad eseguire il programma dopo il ciao.
    Mi deve dare una (nuova) matrice e un (nuovo) vettore ed applicare la backsubstitution per risolvere il "nuovo" sistema che risulta triangolare superiore!
  • Re: Programma che si ferma dopo un ciclo for

    
    void gausspiv(float **A, float *b, int n) {
        int i, j, k;
        for(k=0; k<n-1; /*k non i*/ k++) { /* Qui era il problema */
            piv(A, b, n, k); /*chiamo la funzione piv sulla riga k-esima */ /*chiamo la function piv nella function gausspiv */
            for(i=k+1; i<n; i++) {
                A[i][k]=A[i][k]/A[k][k]; /*creazione di un coefficiente per l'eliminazione */
                for(j=k; j<n; j++)
                    A[i][j]=A[i][j]-A[i][k]*A[k][j]; /*riduzione dei coefficienti */
                b[i]=b[i]-A[i][k]*b[k]; /*riduzione dei termini noti */
            };
        };
        return;
    }
    
    
    Il problema è negli indici nel ciclo for, ho commetato.

    Attenzione ai cut and paste, questi sono errori subdoli.
    Infatti in questo caso, genera un loop infinito.
  • Re: Programma che si ferma dopo un ciclo for

    Ad esempio, con quali valori in input ti succede?
  • Re: Programma che si ferma dopo un ciclo for

    SVNiko ha scritto:


    Attenzione ai cut and paste, questi sono errori subdoli. [/quote]
    Grazie mille, anche se inquesto caso non si trattava di un copia e incolla, ma soltanto di una distrazione. Bene, ora non ho problemi con il programma in sè perchè parte....ma è impazzito, dà numeri casuali!!
    Come primo ordine, ciò che dovrebbe eseguire è semplicemente uno scambio tra righe e poi applicare Gauss, invece, mi ridà indietro altri valori per la "nuova" matrice, che non è neanche triangolare alta!!
    Qualcuno riesce a capire perchè? f19
  • Re: Programma che si ferma dopo un ciclo for

    Il codice non ha errori.
    L'unica nota è che sotto linux il buffer sui file lavora proprio come si legge sui libri di programmazione c.
    Pertanto per essere sicuri di visualizzare qualcosa occorre svuotare il buffer con l'apposita funzione fflush:
    
        printf("Inserire gli elementi del vettore termini noti\n");
        for(i=0; i<n; i++) {
            printf("b[%d]=", i);
            fflush(stdout);
            scanf("%f", &b[i]);
        }
        printf("ciao");
    
Devi accedere o registrarti per scrivere nel forum
11 risposte