Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Implementazione in linguaggio C di esercizio per Matlab
Forum - C/C++ - Implementazione in linguaggio C di esercizio per Matlab

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
torn24 (Normal User)
Pro


Messaggi: 156
Iscritto: 04/01/2008

Segnala al moderatore
Postato alle 17:09
Martedì, 16/02/2016
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


*/



Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void carica_vet(int *v1, int *v2, char * nome_f);
  4. void  crea_mat(int *v1, int *v2);
  5. int mat[6][5];
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.   int v1[11]={0};
  10.   int v2[11]={0};
  11.   int i=0,j=0;
  12.  
  13.   char nome_f[]="dati.txt";
  14.   carica_vet(v1,v2,nome_f);
  15.   crea_mat(v1,v2);
  16.   puts("======================================");
  17.   puts("Array v1 v2");
  18.   for(i=1;i<=10;i++)
  19.       printf("%d  ",v1[i]);
  20.   printf("\n");  
  21.   for(i=1;i<=10;i++)
  22.       printf("%d  ",v2[i]);
  23.   printf("\n");
  24.   puts("======================================");
  25.   puts("Matrice");
  26.   for(i=1;i<=5;i++){
  27.       for(j=1;j<=4;j++){
  28.           printf("%d  ",mat[i][j]);  
  29.       }      
  30.       printf("\n");
  31.   }    
  32.   getchar();
  33.   getchar();  
  34.   return 0;
  35. }


/*

% 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). */

Codice sorgente - presumibilmente C++

  1. void carica_vet(int *v1, int *v2, char * nome_f){
  2.  
  3.    int numero;
  4.    int stato=0;
  5.    int i=1,j=1;
  6.    FILE *f=fopen(nome_f,"r");
  7.    if(f==NULL)printf("Apertura file fallita\n");
  8.    while(fscanf(f,"%d",&numero)>0){
  9.        
  10.       if(stato==0){
  11.           stato=1;
  12.           v1[i]=numero;
  13.           i++;
  14.          
  15.        }
  16.        else{
  17.           stato=0;
  18.           v2[j]=numero;
  19.           j++;
  20.                
  21.        }        
  22.        
  23.    }    
  24.    
  25.    fclose(f);
  26.    
  27. }



/*
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); */  

Codice sorgente - presumibilmente C#

  1. void  crea_mat(int *v1, int *v2){
  2.     /* L'esercizio è pensato per l'implemento con
  3.        linguaggio matlab, dove gli indici degli
  4.        array partono da 1, dovuto modificare per
  5.        adattarlo in linguaggio C, dove gli indici
  6.        degli array partono da 0 zero */
  7.     int i=0,j=0;
  8.     for(i=1;i<=5;i++){
  9.         for(j=1;j<=4;j++){
  10.            
  11.             if(i%2==0 && v1[i+j] >= 0 )
  12.                 mat[i][j]=v1[i+j];
  13.             else if(i%2!=0 && v2[i+j]>=0 && v2[i+j]<=30)
  14.                 mat[i][j]=v2[i+j];
  15.                
  16.             else
  17.                 mat[i][j]=0;            
  18.            
  19.         }    
  20.        
  21.     }    
  22.    
  23.    
  24. }











Ultima modifica effettuata da torn24 il 17/02/2016 alle 6:38
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6390
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:27
Martedì, 16/02/2016
Testo quotato

non lo fa correttamente



Ovvero? Non puoi essere più preciso?

P.S. E non puoi eliminare il colore rosso ...?

Ultima modifica effettuata da nessuno il 16/02/2016 alle 17: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à.
PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 18:06
Martedì, 16/02/2016
Testo quotato

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 il 16/02/2016 alle 18:06
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6390
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:59
Martedì, 16/02/2016
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à.
PM Quote
Avatar
torn24 (Normal User)
Pro


Messaggi: 156
Iscritto: 04/01/2008

Segnala al moderatore
Postato alle 6:50
Mercoledì, 17/02/2016
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); */  

Codice sorgente - presumibilmente C#

  1. void  crea_mat(int *v1, int *v2){
  2.     /* L'esercizio è pensato per l'implemento con
  3.        linguaggio matlab, dove gli indici degli
  4.        array partono da 1, dovuto modificare per
  5.        adattarlo in linguaggio C, dove gli indici
  6.        degli array partono da 0 zero */
  7.     int i=0,j=0;
  8.     for(i=1;i<=5;i++){
  9.         for(j=1;j<=4;j++){
  10.            
  11.             if(i%2==0 && v1[i+j] >= 0 )
  12.                 mat[i][j]=v1[i+j];
  13.             else if(i%2!=0 && v2[i+j]>=0 && v2[i+j]<=30)
  14.                 mat[i][j]=v2[i+j];
  15.                
  16.             else
  17.                 mat[i][j]=0;            
  18.            
  19.         }    
  20.        
  21.     }    
  22.    
  23.    
  24. }



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

PM Quote
Avatar
Template (Member)
Pro


Messaggi: 177
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 8:57
Mercoledì, 17/02/2016
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 il 17/02/2016 alle 8:58
PM Quote
Avatar
torn24 (Normal User)
Pro


Messaggi: 156
Iscritto: 04/01/2008

Segnala al moderatore
Postato alle 9:21
Mercoledì, 17/02/2016
"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 = 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.

PM Quote
Avatar
torn24 (Normal User)
Pro


Messaggi: 156
Iscritto: 04/01/2008

Segnala al moderatore
Postato alle 10:10
Mercoledì, 17/02/2016
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); */  

Codice sorgente - presumibilmente C#

  1. void  crea_mat(int *v1, int *v2){
  2.     /* L'esercizio è pensato per l'implemento con
  3.        linguaggio matlab, dove gli indici degli
  4.        array partono da 1, dovuto modificare per
  5.        adattarlo in linguaggio C, dove gli indici
  6.        degli array partono da 0 zero */
  7.     int i=0,j=0;
  8.     for(i=1;i<=5;i++){
  9.         for(j=1;j<=4;j++){
  10.            
  11.             if(i%2!=0 && v1[i+j] >= 0 && v2[i+j]>=0 && v2[i+j]<=30)
  12.                 mat[i][j]=v1[i+j];
  13.             else if(i%2==0 && v1[i+j] >=0 && v2[i+j]>=0 && v2[i+j]<=30)
  14.                 mat[i][j]=v2[i+j];
  15.                
  16.             else
  17.                 mat[i][j]=0;            
  18.            
  19.         }    
  20.        
  21.     }    
  22.    
  23.    
  24. }


Ultima modifica effettuata da torn24 il 17/02/2016 alle 10:10
PM Quote
Avatar
Template (Member)
Pro


Messaggi: 177
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 10:13
Mercoledì, 17/02/2016
Testo quotato

Postato originariamente da torn24:
e l'inserimento dei dati e la stampa degli stessi, avviene con cicli che partono da 1.



E queste funzioni d'inserimento dove stanno? In quell'agglomerato grafico inintellegibile che è il tuo primo post?
Se si, non mi stupisce che io non le abbia viste...

Detto questo, i tuoi vettori devono avere 10 elementi, giusto? Bene, ti informo che per come hai scritto i cicli tu valuti gli elementi al più dalla posizione 2 (1 + 1) alla posizione 9 (5 + 4), e cioè valuterai 8 elementi, e non considererai mai quelli in posizione 1 ed in posizione 10... era questo ciò che volevi?


Apro, a proposito, una piccola parentesi: mi auguro tu ti renda conto di aver scritto un codice troppo elaborato rispetto al necessario: sarebbe bastata una cosa del genere (dotata degli opportuni controlli di errore):


Codice sorgente - presumibilmente C/C++

  1. int pos_v1, pos_v2
  2.  
  3. for scorrimento_righe
  4.      for scorrimento_colonne
  5.         se v1[pos_v1] è quello adatto
  6.             mettilo nella matrice
  7.             incrementa pos_v1
  8.         se v2[pos_v2] è quello adatto
  9.             mettilo nella matrice
  10.             incrementa pos_v2
  11.         altrimenti
  12.             metti 0 nella matrice


PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo