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