Programma ANSI C

di il
52 risposte

52 Risposte - Pagina 2

  • Re: Programma ANSI C

    Ok...grazie mille... ora prova ad andare avanti e speriamo bene...ah ultima cosa...x dichiarare gli array dinamici come devo procedere??? dopo dovrei usare o la malloc o la calloc vero? m conviene dichiarare il numero di righe e colonne nel file oppure chiedo di inserirlo da tastiera?
  • Re: Programma ANSI C

    Non dichiari da nessuna parte il numero delle righe ma solo quello delle colonne. allocchi memoria x tutte le colonne di una riga, leggi il dato, piazzi il dato. arrivati a fine colonne allocchi memoria per una nuova riga. Il problema è: Chi cavolo vi fa studiare ancora il C e non il C++.
  • Re: Programma ANSI C

    Ho iniziato a vedere un po' come allocare dinamicamente la matrice A... x escludere le cose che riguardano la matrice B x ora le ho commentate... con l'allocazione dinamica funziona tutto alla grande (dopo il suggerimento della printf ), ma ora non riesco a capire dove sbaglio...lo compila e m da come warning le var che riguardano la matrice B x il fatto che non sono utilizzate(OVVIO)...quando lo eseguo m chiede il numero di righe/colonne che deve avere la matrice e poi "Segmentation fault"...perchè???
    ah, per quanto riguarda il numero di righe e colonne ci ho aggiunto la validazione xke non deve essere minore o uguale a zero!!!
    ecco il codice.....
    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void)
    {
       int riga1,
           riga2;
       int colonna1,
           colonna2;
       int n_rc,                     /*numero di righe/colonne*/
           n_tot,                    /*numero totale degli elementi*/
           i;                        /* contatore*/
       int **matrice1,
           **matrice2;
       FILE *a,
    	*b;
        
       int esito_lettura;           /* lavoro: esito lettura */ 
       char carattere_non_letto;    /* lavoro: carattere non letto */ 
    
    
     do 
          { 
        
      	printf("Digita il numero ri righe che deve avere la matrice (0 < ) "); 
        
     	 esito_lettura = scanf("%d", 
    				&n_rc); 
        
     	 if (esito_lettura != 1 || n_rc < 0) 
     	 { 
        
        	  do 
         	 { 
    		carattere_non_letto = scanf("%c", 
                              		    &carattere_non_letto); 
             } 
                  while (carattere_non_letto != '\n'); 
        
             } 
           } while (esito_lettura != 1 || n_rc < 0); 
    
       a = fopen("matrice_A.txt", "r");
       b = fopen("matrice_B.txt", "r");
    
    matrice1 = (int**)calloc(n_rc, sizeof(int*));
    
       for(riga1=0; riga1<n_rc; riga1++)
          for(colonna1=0; colonna1<3; colonna1++)
            fscanf(a, "%d%d", &riga1, &colonna1);
    		for(i=0; i<n_tot; i++)
    		     matrice1[n_tot] = (int*)calloc(n_rc, sizeof(int));
       
      /*for(riga2=0; riga2<n_rc; riga2++)
          for(colonna2=0; colonna2<3; colonna2++)
             fscanf(b, "%d", &matrice2[riga2][colonna2]);*/
    
       fclose(a);
     /*  fclose(b);*/
    
       for(riga1=0; riga1<n_rc; riga1++)
       {
          for(colonna1=0; colonna1<n_rc; colonna1++)
             printf("%d ", matrice1[riga1][colonna1]);
          printf("\n");
       }
    
       printf("\n");
    
      /* for(riga2=0; riga2<n_rc; riga2++)
       {
          for(colonna2=0; colonna2<n_rc; colonna2++)
             printf("%d ", matrice2[riga2][colonna2]);
          printf("\n");
       }*/
       
       return(0);
    }
    grazie ancora e scusa del disturbo
  • Re: Programma ANSI C

    Perche cambi codice se funziona?
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void)
    {
       int riga1,
    	   riga2;
       int colonna1,
    	   colonna2;
       int n_rc,                     /*numero di righe/colonne*/
    	   n_tot,                    /*numero totale degli elementi*/
    	   i;                        /* contatore*/
       int **matrice1,
    	   **matrice2;
       FILE *a,
       *b;
       
       int esito_lettura;           /* lavoro: esito lettura */
       char carattere_non_letto;    /* lavoro: carattere non letto */
    
    
    do
    	  {
       
    	 printf("Digita il numero ri righe che deve avere la matrice (0 < ) ");
       
    	esito_lettura = scanf("%d",
    			&n_rc);
       
    	if (esito_lettura != 1 || n_rc < 0)
    	{
       
    		 do
    		 {
    	  carattere_non_letto = scanf("%c",
    									&carattere_non_letto);
    		 }
    			  while (carattere_non_letto != '\n');
       
    		 }
    	   } while (esito_lettura != 1 || n_rc < 0);
    
       a = fopen("matrice_A.txt", "r");
       b = fopen("matrice_B.txt", "r");
    
    matrice1 = (int**)calloc(n_rc, sizeof(int*));
    
    for(i = 0; i < n_rc; i++)
    	matrice1[i] = (int*)calloc(n_rc,sizeof(int));
    
    for(riga1=0; riga1<n_rc; riga1++)
    {
    	for(colonna1=0; colonna1<3; colonna1++)
    	{
    		fscanf(a, "%d", &matrice1[riga1][colonna1]);
    	}
    }  
    
    
      /*for(riga2=0; riga2<n_rc; riga2++)
    	  for(colonna2=0; colonna2<3; colonna2++)
    		 fscanf(b, "%d", &matrice2[riga2][colonna2]);*/
    
       fclose(a);
    /*  fclose(b);*/
    
       for(riga1=0; riga1<n_rc; riga1++)
       {
    	  for(colonna1=0; colonna1<n_rc; colonna1++)
    		 printf("%d ", matrice1[riga1][colonna1]);
    	  printf("\n");
       }
    
       printf("\n");
    
      /* for(riga2=0; riga2<n_rc; riga2++)
       {
    	  for(colonna2=0; colonna2<n_rc; colonna2++)
    		 printf("%d ", matrice2[riga2][colonna2]);
    	  printf("\n");
       }*/
       
       return(0);
    }
    
  • Re: Programma ANSI C

    skynet ha scritto:


    perche cambi codice se funziona?
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void)
    {
       int riga1,
    	   riga2;
       int colonna1,
    	   colonna2;
       int n_rc,                     /*numero di righe/colonne*/
    	   n_tot,                    /*numero totale degli elementi*/
    	   i;                        /* contatore*/
       int **matrice1,
    	   **matrice2;
       FILE *a,
       *b;
       
       int esito_lettura;           /* lavoro: esito lettura */
       char carattere_non_letto;    /* lavoro: carattere non letto */
    
    
    do
    	  {
       
    	 printf("Digita il numero ri righe che deve avere la matrice (0 < ) ");
       
    	esito_lettura = scanf("%d",
    			&n_rc);
       
    	if (esito_lettura != 1 || n_rc < 0)
    	{
       
    		 do
    		 {
    	  carattere_non_letto = scanf("%c",
    									&carattere_non_letto);
    		 }
    			  while (carattere_non_letto != '\n');
       
    		 }
    	   } while (esito_lettura != 1 || n_rc < 0);
    
       a = fopen("matrice_A.txt", "r");
       b = fopen("matrice_B.txt", "r");
    
    matrice1 = (int**)calloc(n_rc, sizeof(int*));
    
    for(i = 0; i < n_rc; i++)
    	matrice1[i] = (int*)calloc(n_rc,sizeof(int));
    
    for(riga1=0; riga1<n_rc; riga1++)
    {
    	for(colonna1=0; colonna1<3; colonna1++)
    	{
    		fscanf(a, "%d", &matrice1[riga1][colonna1]);
    	}
    }  
    
    
      /*for(riga2=0; riga2<n_rc; riga2++)
    	  for(colonna2=0; colonna2<3; colonna2++)
    		 fscanf(b, "%d", &matrice2[riga2][colonna2]);*/
    
       fclose(a);
    /*  fclose(b);*/
    
       for(riga1=0; riga1<n_rc; riga1++)
       {
    	  for(colonna1=0; colonna1<n_rc; colonna1++)
    		 printf("%d ", matrice1[riga1][colonna1]);
    	  printf("\n");
       }
    
       printf("\n");
    
      /* for(riga2=0; riga2<n_rc; riga2++)
       {
    	  for(colonna2=0; colonna2<n_rc; colonna2++)
    		 printf("%d ", matrice2[riga2][colonna2]);
    	  printf("\n");
       }*/
       
       return(0);
    }
    



    ti devo una cena veramente!!! ti ringrazio di cuore!!! mi hai salvataaaaa!!!!
  • Re: Programma ANSI C

    L'unica cosa ke non m torna è questa riga :

    for(colonna1=0; colonna1<3; colonna1++)

    perche colonna1<3??? xke 3? se in un prossimo file(considera ke devo fare una 10 di prove diverse) le righe/colonne saranno più o meno di 3...
    dovrei sostituire 3 con n_rc
  • Re: Programma ANSI C

    Mmmmm ho cercato di andare avanti guardando la traccia della matrice. secondo la definizione la traccia è la somma di tutti gli elementi della diagonale principale, quindi deve fare la somma ti tutti gli elementi che hanno l'indice della riga e della colonna uguale...ho provato a fare cosi ma m da errore...lo stesso di prima...segmentation fault
    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void)
    {
       int riga1,
           riga2;
     
       int colonna1,
           colonna2;
       int n_rc,                     /*numero di righe/colonne*/
           i,
           k,
           cont_elem;                        /* contatore*/
       int **matrice1,
           **matrice2;
       int *s;
       FILE *a,
            *b;
       
       int esito_lettura;           /* lavoro: esito lettura */
       char carattere_non_letto;    /* lavoro: carattere non letto */
    
    
    do
         {
       
        printf("Digita il numero ri righe che deve avere la matrice (0 < ) ");
       
       esito_lettura = scanf("%d",
             &n_rc);
       
       if (esito_lettura != 1 || n_rc < 0)
       {
       
           do
           {
         carattere_non_letto = scanf("%c",
                               &carattere_non_letto);
           }
               while (carattere_non_letto != '\n');
       
           }
          } while (esito_lettura != 1 || n_rc < 0);
    
       a = fopen("matrice_A.txt", "r");
       b = fopen("matrice_B.txt", "r");
    
    matrice1 = (int**)calloc(n_rc, sizeof(int*));
    
    for(i = 0; i < n_rc; i++)
       matrice1[i] = (int*)calloc(n_rc,sizeof(int));
    
    for(riga1=0; riga1<n_rc; riga1++)
    {
       for(colonna1=0; colonna1<3; colonna1++)
       {
          fscanf(a, "%d", &matrice1[riga1][colonna1]);
       }
    }  
    
    
    matrice2 = (int**)calloc(n_rc, sizeof(int*));
    
    for(k = 0; k < n_rc; k++)
       matrice2[k] = (int*)calloc(n_rc,sizeof(int));
    
    for(riga2=0; riga2<n_rc; riga2++)
    {
       for(colonna2=0; colonna2<3; colonna2++)
       {
          fscanf(b, "%d", &matrice2[riga2][colonna2]);
       }
    }  
    
    
       fclose(a);
       fclose(b);
    
       for(riga1=0; riga1<n_rc; riga1++)
       {
         for(colonna1=0; colonna1<n_rc; colonna1++)
           printf("%d ", matrice1[riga1][colonna1]);
         printf("\n");
       }
    
       printf("\n");
    
      for(riga2=0; riga2<n_rc; riga2++)
       {
         for(colonna2=0; colonna2<n_rc; colonna2++)
           printf("%d ", matrice2[riga2][colonna2]);
         printf("\n");
       }
    
      s[cont_elem] = (int*)calloc(n_rc,sizeof(int));
      for(riga1=0; riga1<=n_rc;riga1++){
     	for(colonna1=1; colonna1<=n_rc; colonna1++) 
            { 
                 if (riga1 == colonna1) 
                 {   
    		cont_elem += 1; 
    		s[cont_elem] = riga1; 
    	     } 
    	} 
      }
     
        s[0]=cont_elem; 
        for(cont_elem=0; cont_elem<=n_rc; cont_elem++)
            printf("%d ", s[cont_elem]);
         printf("\n");
        
       return(0);
    }

    xke???
  • Re: Programma ANSI C

    
    s[cont_elem] = (int*)calloc(n_rc,sizeof(int));
      for(riga1=0; riga1<=n_rc;riga1++){
       for(colonna1=1; colonna1<=n_rc; colonna1++)
            {
                 if (riga1 == colonna1)
                 {   
          cont_elem += 1;
          s[cont_elem] = riga1;
            }
       } 
    
    cos'è sto pezzo di codice? a cosa serve? che bisogno c'è di allocare memoria se tutto ciò che ti serve è un int accumulatore.
    
      int accumulatore = 0;
      for(riga1=0; riga1<=n_rc;riga1++){
       for(colonna1=1; colonna1<=n_rc; colonna1++)
            {
                 if (riga1 == colonna1)
                 {   
                     acummulatore += matrice1[riga1][colonna1];
            }
       } 
    
  • Re: Programma ANSI C

    Ho provato ora a ricompilare il tutto...con le modifiche che mi hai dato tu...stesso problema...nello stesso punto... uffff!!!!
    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void)
    {
       int riga1,
           riga2;
       int accumulatore = 0;
       int colonna1,
           colonna2;
       int n_rc,                     /*numero di righe/colonne*/
           i,
           k;                       /* contatore*/
       int **matrice1,
           **matrice2;
       FILE *a,
            *b;
       
       int esito_lettura;           /* lavoro: esito lettura */
       char carattere_non_letto;    /* lavoro: carattere non letto */
    
    
    do
         {
       
        printf("Digita il numero ri righe che deve avere la matrice (0 < ) ");
       
       esito_lettura = scanf("%d",
             &n_rc);
       
       if (esito_lettura != 1 || n_rc < 0)
       {
       
           do
           {
         carattere_non_letto = scanf("%c",
                               &carattere_non_letto);
           }
               while (carattere_non_letto != '\n');
       
           }
          } while (esito_lettura != 1 || n_rc < 0);
    
       a = fopen("matrice_A.txt", "r");
       b = fopen("matrice_B.txt", "r");
    
    matrice1 = (int**)calloc(n_rc, sizeof(int*));
    
    for(i = 0; i < n_rc; i++)
       matrice1[i] = (int*)calloc(n_rc,sizeof(int));
    
    for(riga1=0; riga1<n_rc; riga1++)
    {
       for(colonna1=0; colonna1<3; colonna1++)
       {
          fscanf(a, "%d", &matrice1[riga1][colonna1]);
       }
    }  
    
    
    matrice2 = (int**)calloc(n_rc, sizeof(int*));
    
    for(k = 0; k < n_rc; k++)
       matrice2[k] = (int*)calloc(n_rc,sizeof(int));
    
    for(riga2=0; riga2<n_rc; riga2++)
    {
       for(colonna2=0; colonna2<3; colonna2++)
       {
          fscanf(b, "%d", &matrice2[riga2][colonna2]);
       }
    }  
    
    
       fclose(a);
       fclose(b);
    
       for(riga1=0; riga1<n_rc; riga1++)
       {
         for(colonna1=0; colonna1<n_rc; colonna1++)
           printf("%d ", matrice1[riga1][colonna1]);
         printf("\n");
       }
    
       printf("\n");
    
      for(riga2=0; riga2<n_rc; riga2++)
       {
         for(colonna2=0; colonna2<n_rc; colonna2++)
           printf("%d ", matrice2[riga2][colonna2]);
         printf("\n");
       }
    
        
      for(riga1=0; riga1<=n_rc;riga1++){
       for(colonna1=1; colonna1<=n_rc; colonna1++)
            {
                 if (riga1 == colonna1)
                 {   
                     accumulatore += matrice1[riga1][colonna1];
            }
       } 
     
       
        
            printf("%d ", accumulatore);
         printf("\n");
        
       return(0);
    }
  • Re: Programma ANSI C

    Dopo l'ultimo if manca una parentesi chiusa...
    ma il problema persiste...
  • Re: Programma ANSI C

    Magari invece del <= mettere solo minore? Usa il debug per trovare i tuoi problemi.
  • Re: Programma ANSI C

    Grazie mille...mi sei stato veramente d'aiuto!!! non so come potrò sdebitarmi...
    ora continuo con i punti successivi....
    l'ultima cosa ke ti volevo chiedere è che io non devo lavorare come sto facendo ora in un solo progetto ma lo devo suddividere in funzioni...la main che conterrà sostanzialmente un menu a tendina e in un altro file il resto: acquisizione, stampa(non necessariamente), traccia, trasposta etc...
    nella prima che sarà
    int** acquisizione() dovrà avere come valore di ritorno le due matrici A e B. Come dovrei procedere al momento del return?
    posso passare i due parametri insieme?
  • Re: Programma ANSI C

    Nun puoi fare return di array in C. Devi mettere la matrice come valore e passarlo x riferimento.

    void acqusizione(int (&matrice)[SIZE][SIZE]);
  • Re: Programma ANSI C

    Ma siccome la SIZE cambia posso mettere la variabile al posto di size?
    e sopratutto come faccio a passarle entrambe? non solo una matrice..
  • Re: Programma ANSI C

    Allora ti serve una cosa del genere:
    
    void acquisizione(int **matrice1, int **matrice2);
    
Devi accedere o registrarti per scrivere nel forum
52 risposte