Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C] Algoritmo risoluzione sistemi lineari

    Salve a tutti,
    mi è stato dato da scrivere in C un algoritmo di risoluzione per i sistemi lineari, e mi è stato dato da seguire il seguente flowchart:


    Il codice che ho prodotto si suddivide come sempre in main.c, my_libreria.c che contiene le funzioni e my_libreria.h che contiene la struttura dati ed i prototipi.

    Il codice è il seguete:
    main.c

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    #include "my_libreria.h"
    
    int main()
    {
      matrix mat1,mat2;
       
      resetta_matrice(&mat1);
      resetta_matrice(&mat2);
      inizializza_matrice(&mat1,3,3);
      inizializza_matrice(&mat2,3,1); 
      
      scrivi_elem(&mat1,0,0,3);
      scrivi_elem(&mat1,0,1,2);
      scrivi_elem(&mat1,0,2,-3);
      scrivi_elem(&mat1,1,0,4);
      scrivi_elem(&mat1,1,1,-3);
      scrivi_elem(&mat1,1,2,6);
      scrivi_elem(&mat1,2,0,1);
      scrivi_elem(&mat1,2,1,0);
      scrivi_elem(&mat1,2,2,-1);
     
    
      scrivi_elem(&mat2,0,0,5);
      scrivi_elem(&mat2,1,0,1);
      scrivi_elem(&mat2,2,0,3);
    
      printf("\n1° vettore:\n"); 
      stampa_matrice(&mat1);
      printf("\n");
     
      risoluzione_sistema(&mat1,&mat2);
      printf("\n\nRISOLUZIONE\n");
      stampa_matrice(&mat1);
      system("pause");	
      
    }
    my_libreria.c
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    #include "my_libreria.h"
    
    void risoluzione_sistema(matrix *M,matrix *N)
    {
         int n,m;
         int i,j;
         int k;
         int flag;
         int index;
         float var_appo;
         float appo;
         int r;
         
         M->num_colonna++;
         n=numero_colonne_matrice(M);
         m=numero_righe_matrice(M);
         
         //aggiungo la matrice contenente i valori noti del sistema
         for(j=0;j<m;j++)
         {
            scrivi_elem(M,j,n-1,leggi_elem(N,j,0));
         }
            
         stampa_matrice(M);
         system("pause");
         i=0;
         j=0;
              
         while(j<n)
         {
             k=i;
             flag=0;
    
             while(k<m && !flag)
             {
                 if(leggi_elem(M,k,j) != 0)
                     flag=1;
                 else    
                     k++;
             }
             
             if(flag==1)
             {
                  if(k != i)
                  {
                      for(index=0;index<n;index++)
                      {
                           appo=leggi_elem(M,i,index);
                           scrivi_elem(M,i,index,leggi_elem(M,k,index));
                           scrivi_elem(M,k,index,appo);
                      }
                  }              
                 
                  
                  for(index=0;index<n;index++)
                  {
                     var_appo=leggi_elem(M,i,index);
                     var_appo=var_appo/leggi_elem(M,i,j);
                     scrivi_elem(M,i,index,var_appo);
                  }
                  
                  for(r=0;r<m;r++)
                  {
                     if(r!=i)
                     {
                        index=0;
                        for(;index<n;index++)
                        {
                            var_appo=leggi_elem(M,i,index);
                            var_appo=var_appo*((leggi_elem(M,r,j)*(-1)));
                            var_appo=var_appo+leggi_elem(M,r,index);
                            scrivi_elem(M,r,index,var_appo);
                        }
                     }
                    
                  }
                  
             }
           j++;
            i++;      
         }
         
     
    }
    
    
    /*-----------------------------------------------------------------------------*/
    float leggi_elem(matrix *mat1,int riga,int colonna)
    {
        float elem;
        elem = mat1->matrice[riga][colonna];
        return(elem);
    }
        
    /*-----------------------------------------------------------------------------*/
    void scrivi_elem(matrix *mat1,int riga,int colonna,float elemento)
    {
         
        mat1->matrice[riga][colonna]= elemento;
         
    }
    /*-----------------------------------------------------------------------------*/
    
    void resetta_matrice(matrix *mat)
    {
         mat = NULL;
    }
    
    /*-----------------------------------------------------------------------------*/
    
    void inizializza_matrice(matrix* mat,int num_righe,int num_colonne)
    {
    
         int i;
         mat->num_riga=num_righe;
         mat->num_colonna=num_colonne;
         mat->matrice=(float**)malloc(num_righe * sizeof(float));
         for(i=0; i < num_righe; i++)
         {
           mat->matrice[i]=(float*)calloc(num_colonne,sizeof(float));
         }
    
    }
    
    /*-----------------------------------------------------------------------------*/
    
    int numero_righe_matrice(matrix *mat)
    {
        int val_ri;
        val_ri=mat->num_riga;
        return(val_ri);
    }
    /*-----------------------------------------------------------------------------*/
    int numero_colonne_matrice(matrix *mat)
    {
        int val_co;
        val_co=mat->num_colonna;
        return(val_co);
    }
    /*-----------------------------------------------------------------------------*/
    void stampa_matrice(matrix *mat1)
    {
         int num_col;
         int num_ri;
         int index1;
         int index2;
        
         num_col=numero_colonne_matrice(mat1);
         num_ri=numero_righe_matrice(mat1);
         
         //ciclo esterno per la scansione delle righe
         for(index1=0 ; index1<num_ri ; index1++)
         {
             printf("\n");
             //ciclo interno per la scansione delle colonne
             for(index2=0 ; index2<num_col ; index2++)
             {            
                 //stampa a video dell'elemento
                 printf("%f\t",leggi_elem(mat1,index1,index2));
             }
         }
    }
    my_libreria.h
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    
    #define cost_elem_max 100
    
    //DEFINIZIONE STRUTTURE
    
    typedef struct{
            float **matrice;
            int num_riga;
            int num_colonna;
            }matrix;
            
    //DEFINIZIONE PROTOTIPI
    
    float leggi_elem(matrix *mat1,int riga,int colonna); 
    /*------------------------------------------------------------------------------*/
    void scrivi_elem(matrix *mat1,int riga,int colonna,float elemento);   
    /*------------------------------------------------------------------------------*/
    void resetta_matrice(matrix *mat);
    /*-----------------------------------------------------------------------------*/
    void inizializza_matrice(matrix *mat,int num_righe,int num_colonne);
    /*-----------------------------------------------------------------------------*/
    int numero_righe_matrice(matrix *mat);
    /*-----------------------------------------------------------------------------*/
    int numero_colonne_matrice(matrix *mat);
    /*-----------------------------------------------------------------------------*/
    void stampa_matrice(matrix *mat1);
    /*-----------------------------------------------------------------------------*/
    void risoluzione_sistema(matrix *mat1,matrix *mat2);
    Di regola il codice dovrebbe stamparmi i risultati delle varie incognite nella colonna più a destra della matrice aumentata, invece non lo fa e la lascia invariata.

    Sapreste aiutarmi per capire dove sbaglio? anche perchè questo algoritmo mi è stato spiegato con quel "disegnino" e non saprei in realtà come risolvelo di mio, quindi vorrei capire se ho sbagliato a seguire quel flowchart oppure se proprio quel flowchart è sbagliato.

    Vi ringrazio in anticipo,
    Nepunte.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Per il tuo metodo di risoluzione qui, nn potresti dire dov'e' l'errore?
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Originariamente inviato da linoma
    Per il tuo metodo di risoluzione qui, nn potresti dire dov'e' l'errore?
    Inanzi tutto nel penultimo ciclo, questo:

    codice:
    for(index=0;index<n;index++)
                  {
                     var_appo=leggi_elem(M,i,index);
                     var_appo=var_appo/leggi_elem(M,i,j);
                     scrivi_elem(M,i,index,var_appo);
                  }
    Mi sono accorto che c'era un errore, almeno da quel che dice il flowchart, perchè devo moltiplicare per il reciproco mentre li fa una semplice divisione, e quindi l'ho sostituito con questo:

    codice:
    for(index=0;index<n;index++)
                  {
                     var_appo=leggi_elem(M,i,index);
                     var_appo=var_appo * (1/leggi_elem(M,i,j));
                     scrivi_elem(M,i,index,var_appo);
                  }
    Il problema però persiste e non riesco a trovare altri errori
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Non hai cambiato nulla:

    a/b == a * (1/b)
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  5. #5
    Originariamente inviato da Ippo343
    Non hai cambiato nulla:

    a/b == a * (1/b)
    Giusto sto fuso.
    Ma quindi l'errore dov'è? come mai mi lascia invariata prorpio l'ultima colonna?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.