Oppure

Loading
16/02/16 16:09
torn24
Ciao :), ho provato a "tradurre" un esercizio pensato per matlab in linguaggio C, non conosco matlab,ma ho letto che in matlab gli indici degli array partono da 1, quindi per implementarlo con facilità in C, ho pensato di aumentare array e matrici di un elemento,partendo da indice 1 e lasciando inutilizzato gli elementi con indice 0, nonostante mi sembri di aver seguito correttamente la traccia, la funzione che popola la matrice crea_mat(int *v1, int *v2) non lo fa correttamente, mentre il resto del programma funziona correttamente, quindi il problema è unicamente questa funzione, qualcuno mi può aiutare a capire l'errore, grazie :)


Codice, con traccia, e risultati da ottenere descritti nei commenti :




/*



% Sia dato il file "dati.txt" contenente 20 interi.
% Al candidato è chiesto di implementare le seguenti funzioni:
%
% 1) Leggere i dati del file e caricarli in due vettori v1 e v2 di dieci
% elementi ciascuno alternando gli elementi (il primo elemento del file va
% in v1, il secondo in v2, il terzo in v1, e via di seguito).
% Il prototipo della funzione è il seguente:
% function [v1, v2]=carica_vet (nome_f).
%
% 2) creare una matrice mat di 5 righe e 4 colonne in gli elementi delle
% righe dispari sono presi da vettore v1 e quelli delle righe pari sono
% presi dal vettore v2 nel seguente modo:
%
% mat(i,j)= v1(i+j) se i è dispari;
% mat(i,j)= v2(i+j) se i è pari;
% mat(i,j)=0 se v1(i+j) o v2(i+j) sono minore di zero o v2(i+j) è
% maggiore di 30;
% il prototipo della funzione è il seguente:
% function mat=crea_mat(v1,v2);
%
% il candidato non può modificare il codice fornito.
%
% Di seguito viene riportato l'output atteso dalle funzioni:
% il vettore vet1 è composto dai seguenti elementi
% 1 14 12 21 24 0 3 10 23 21
%
% il vettore vet2 è composto dai seguenti elementi
% 9 10 4 31 -5 11 6 3 43 29
%
% la matrice creata è:
% 14 12 0 0
% 4 0 0 11
% 0 0 0 3
% 0 11 6 3
% 0 3 10 0

function Traccia1()
clc;
n_f='dati.txt';
[vet1,vet2]=carica_vet(n_f);
disp('il vettore vet1 è composto dai seguenti elementi');
disp(vet1);
disp('il vettore vet2 è composto dai seguenti elementi');
disp(vet2);
m=crea_mat(vet1,vet2);
disp('la matrice creata è:');
disp(m);
end

function [v1, v2]=carica_vet (nome_f)
% da implementare
end


function mat=crea_mat(v1,v2)
% da implementare
end


*/




#include <stdio.h>
#include <stdlib.h>
void carica_vet(int *v1, int *v2, char * nome_f);
void  crea_mat(int *v1, int *v2);
int mat[6][5];

int main(int argc, char *argv[])
{
  int v1[11]={0};
  int v2[11]={0};
  int i=0,j=0;
  
  char nome_f[]="dati.txt";
  carica_vet(v1,v2,nome_f);
  crea_mat(v1,v2);
  puts("======================================");
  puts("Array v1 v2");
  for(i=1;i<=10;i++)
      printf("%d  ",v1[i]);
  printf("\n");  
  for(i=1;i<=10;i++)
      printf("%d  ",v2[i]);
  printf("\n"); 
  puts("======================================");
  puts("Matrice");
  for(i=1;i<=5;i++){
      for(j=1;j<=4;j++){
          printf("%d  ",mat[i][j]);  
      }       
      printf("\n");
  }    
  getchar();
  getchar();   
  return 0;
}


/*

% 1) Leggere i dati del file e caricarli in due vettori v1 e v2 di dieci
% elementi ciascuno alternando gli elementi (il primo elemento del file va
% in v1, il secondo in v2, il terzo in v1, e via di seguito).
% Il prototipo della funzione è il seguente:
% function [v1, v2]=carica_vet (nome_f). */

void carica_vet(int *v1, int *v2, char * nome_f){
  
   int numero;
   int stato=0;
   int i=1,j=1;
   FILE *f=fopen(nome_f,"r");
   if(f==NULL)printf("Apertura file fallita\n");
   while(fscanf(f,"%d",&numero)>0){
       
      if(stato==0){
          stato=1;
          v1[i]=numero;
          i++;
          
       }
       else{
          stato=0;
          v2[j]=numero;
          j++; 
                
       }         
       
   }    
    
   fclose(f);
    
}  


/*
2) creare una matrice mat di 5 righe e 4 colonne in gli elementi delle
% righe dispari sono presi da vettore v1 e quelli delle righe pari sono
% presi dal vettore v2 nel seguente modo:
%
% mat(i,j)= v1(i+j) se i è dispari;
% mat(i,j)= v2(i+j) se i è pari;
% mat(i,j)=0 se v1(i+j) o v2(i+j) sono minore di zero o v2(i+j) è
% maggiore di 30;
% il prototipo della funzione è il seguente:
% function mat=crea_mat(v1,v2); */

void  crea_mat(int *v1, int *v2){
    /* L'esercizio è pensato per l'implemento con 
       linguaggio matlab, dove gli indici degli 
       array partono da 1, dovuto modificare per 
       adattarlo in linguaggio C, dove gli indici
       degli array partono da 0 zero */
    int i=0,j=0;
    for(i=1;i<=5;i++){
        for(j=1;j<=4;j++){
            
            if(i%2==0 && v1[i+j] >= 0 )
                mat[i][j]=v1[i+j];
            else if(i%2!=0 && v2[i+j]>=0 && v2[i+j]<=30)
                mat[i][j]=v2[i+j];
                
            else
                mat[i][j]=0;            
            
        }    
        
    }    
    
    
}    











Ultima modifica effettuata da torn24 17/02/16 5:38
aaa
16/02/16 16:27
nessuno
non lo fa correttamente


Ovvero? Non puoi essere più preciso?

P.S. E non puoi eliminare il colore rosso ...?
Ultima modifica effettuata da nessuno 16/02/16 16:27
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
16/02/16 17:06
GN
Postato originariamente da nessuno:
P.S. E non puoi eliminare il colore rosso ...?


[ot]Credo che questo sia un problema del tag [ code ] che dovrebbe rilevare automaticamente la sintassi con cui colorare il codice, ma a volte non funziona benissimo, e qua è stato scelto Delphi invece che C.[/ot]
Ultima modifica effettuata da GN 16/02/16 17:06
aaa
16/02/16 18:59
nessuno
Allora metti il tag CODE all'inizio del codice C
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
17/02/16 5:50
torn24
Ciao, ho corretto la colorazione del codice, essere più preciso ci provo, ho un file con una sequenza di numeri interi dato dall'esercizio, quindi i risultati dell'esercizio sono "stabiliti" a priori, la funzione crea_mat() dovrebbe popolare una matrice di 5x4 con numeri presi da due array, precedentemente popolati tramite lettura file "i dati negli array sono inseriti in modo corretto", la funzione non svolge il compito che dovrebbe, e i numeri inseriti nella matrice non corrispondono all'output che si dovrebbe ottenere, ma leggendo questa traccia riguardante la funzione da implementare, mi sembra di averne seguito le indicazioni.

2) creare una matrice mat di 5 righe e 4 colonne in gli elementi delle
% righe dispari sono presi da vettore v1 e quelli delle righe pari sono
% presi dal vettore v2 nel seguente modo:
%
% mat(i,j)= v1(i+j) se i è dispari;
% mat(i,j)= v2(i+j) se i è pari;
% mat(i,j)=0 se v1(i+j) o v2(i+j) sono minore di zero o v2(i+j) è
% maggiore di 30;
% il prototipo della funzione è il seguente:
% function mat=crea_mat(v1,v2); */

void  crea_mat(int *v1, int *v2){
    /* L'esercizio è pensato per l'implemento con
       linguaggio matlab, dove gli indici degli
       array partono da 1, dovuto modificare per
       adattarlo in linguaggio C, dove gli indici
       degli array partono da 0 zero */
    int i=0,j=0;
    for(i=1;i<=5;i++){
        for(j=1;j<=4;j++){
           
            if(i%2==0 && v1[i+j] >= 0 )
                mat[i][j]=v1[i+j];
            else if(i%2!=0 && v2[i+j]>=0 && v2[i+j]<=30)
                mat[i][j]=v2[i+j];
               
            else
                mat[i][j]=0;            
           
        }    
       
    }    
   
   
}






mi sembra di averla implementata bene.
Visto che è difficile trovare l'errore, potreste vedere se la funzione crea_mat() sia implementata in modo corretto rispetto alle indicazioni sopra descritte.
L'unica differenza, è che ho usato un elemento in più, negli array e nella matrice, per poter partire da indice 1, come è previsto per matlab, e rendere cosi più facile l'implementazione.

Posto anche il contenuto del file "dati.txt"

1 9 14 10 12 4 21 31 24 -5 0 11 3 6 10 3 23 43 21 29
aaa
17/02/16 7:57
Template
Mai - e sottolineo MAI - si progetta un programma basandosi sulle specifiche di un linguaggio (tanto più se non è quello che userai per l'implementazione).
Il codice che hai scritto ne è la dimostrazione: facendo partire gli indici da 1, praticamente ti perdi una parte di matrice e alcuni elementi dei vettori: se gli indici in C iniziano da 0, tu devi partire da lì, e non da un altro valore solo perchè ti piace di più (a meno che tu non sia in grado di implementare tutto il programma "ri-disegnando" la caratteristica che ti interessa)!
Ultima modifica effettuata da Template 17/02/16 7:58
aaa
17/02/16 8:21
torn24
"Il codice che hai scritto ne è la dimostrazione: facendo partire gli indici da 1, praticamente ti perdi una parte di matrice e alcuni elementi dei vettori:"

Non penso sia li l'errore, almeno credo, tralasciando l'elemento di indice 0, è come se si lavorasse con un array che parte da indice 1, e l'inserimento dei dati e la stampa degli stessi, avviene con cicli che partono da 1.

il problema e soluzione "spartana" adottata, che gli elementi della matrice vengono e devono seguire questa regola.

matrix[i] [i]= array[i+j] , per selezionare l'elemento previsto dall'esercizio "che è pensato per un altro linguaggio" ho adottato la soluzione di aggiungere un elemento e partire da indice uno, dovendo ricavare dall'array un elemento stabilito a priori, non si ottiene lo stesso risultato, esempio in C i=2 j=1, si selezionerebbe il 4 elemento dell'array, in matlab si selezionerebbe il terzo elemento, prima di adottare questo sistema, ho provato con soluzioni di tipo "matematico", ma diviene INUTILMENTE complicato,
tutto il codice è pensato per partire da indice 1, sia negli array che nella matrice, tralasciando e non utilizzando elementi con indice zero, cosa che dovrebbe simulare gli array stile matlab, nella matrice si tralascia la prima riga e la prima colonna, ma è come se si lavorasse su una matrice 5x4 in cui indici partono da 1, almeno "visualizzando" la matrice mentalmente, non vedo nessun problema.
aaa
17/02/16 9:10
torn24
Ho risolto il problema, non avevo commesso errori di programmazione e la soluzione di aggiungere un elemento agli array e partire da indice uno, si è rilevata efficace, il problema era UN ERRATA INTERPRETAZIONE della traccia, in particolare

mat(i,j)=0 se v1(i+j) o v2(i+j) sono minore di zero o v2(i+j) è
% maggiore di 30;

avevo interpretato, se assegni v1 controlla che non sia minore di zero, se assegni v2 controlla che non sia minore di zero e non sia maggiore di 30, altrimenti assegni zero, invece queste condizioni andavano rispettate TUTTE sia all'assegnamento di v1 che v2:d

SCUSATE, il problema sciocco :D:pat:




Codice corretto, se può interessare:



/*
2) creare una matrice mat di 5 righe e 4 colonne in gli elementi delle
% righe dispari sono presi da vettore v1 e quelli delle righe pari sono
% presi dal vettore v2 nel seguente modo:
%
% mat(i,j)= v1(i+j) se i è dispari;
% mat(i,j)= v2(i+j) se i è pari;
% mat(i,j)=0 se v1(i+j) o v2(i+j) sono minore di zero o v2(i+j) è
% maggiore di 30;
% il prototipo della funzione è il seguente:
% function mat=crea_mat(v1,v2); */

void  crea_mat(int *v1, int *v2){
    /* L'esercizio è pensato per l'implemento con 
       linguaggio matlab, dove gli indici degli 
       array partono da 1, dovuto modificare per 
       adattarlo in linguaggio C, dove gli indici
       degli array partono da 0 zero */
    int i=0,j=0;
    for(i=1;i<=5;i++){
        for(j=1;j<=4;j++){
            
            if(i%2!=0 && v1[i+j] >= 0 && v2[i+j]>=0 && v2[i+j]<=30)
                mat[i][j]=v1[i+j];
            else if(i%2==0 && v1[i+j] >=0 && v2[i+j]>=0 && v2[i+j]<=30)
                mat[i][j]=v2[i+j];
                
            else
                mat[i][j]=0;            
            
        }    
        
    }    
    
    
}    



Ultima modifica effettuata da torn24 17/02/16 9:10
aaa