Vai al contenuto

Primario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Secondario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Sfondo: Blank Waves Squares Notes Sharp Wood Rockface Leather Honey Vertical Triangles
Corsi di Laurea










ROX @ Unisa - Forum degli studenti di Ingegneria utilizza i cookie. Se prosegui la navigazione accetti il loro uso.    Accetto l'uso dei cookie
-->
Foto

difficoltà con le funzioni


  • Effettua l'accesso per rispondere
Questa discussione ha avuto 30 risposta/e

#1
celafaro

celafaro

    Member

  • Utente
  • StellaStella
  • 13 Messaggi:
Salve ragazzi trovo difficoltà nell'impostare una funzione :( come posso fare? c'è qualche dispensa,materiale grazie a cui riuscirei a capirne di più??aiutatemiiiii :help: :( grazie



#2
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:
posta la traccia dell' esercizio e vediamo, il materiale lo trovi quì!

#3
celafaro

celafaro

    Member

  • Utente
  • StellaStella
  • 13 Messaggi:
Sia dato il file dati.txt contenente dei numeri interi. Il numero degli interi presenti non è noto apriori, il primo elemento indica quanti sono gli elementi presenti, ovvero quelli da esaminare.Il programma deve chiedere all'utente di specificare un numero di righe e un numero di colonne, quindi creare una matrice con gli elementi letti dal file caricandoli nella matrice colonna per colonna.Se le dimensioni della matrice sono tali da non poter essere riempita con i dati a disposizione, visualizzare un messaggio all'utente. Viceversa, la matrice viene creata e visualizzata all'utente.
FUNZIONE 1: prende nome_f in input tramite il quale viene passata una stringa con il nome del file da aprire in lettura "dati.txt". La funzione chiede all'utente di specificare le dimensioni m e n della matrice. Il primo elemento del file contiene il numero di interi in esso presenti. Se questo è sufficiente a creare la matrice di dimensioni m*n, la funzione legge tutti gli elementi e li carica nel vettore v. Altrimenti assegna 0 a v, m e n. Il prototipo della funzione è il seguente:
function [v,m,n]=carica_dati_da_file(nome_f)...Io ho cercato di svolgerla in questo modo:
nome_f=input(dammi il nome del file: ','s');
f_id=fopen(dati.txt,'r');
dim_mat=size(m,n);
m=input('dammi il numero di righe: ');
n=input('dammi il numero di colonne: ');
mat(m,n)=fscanf(f_id,'%d',1);
if m*n>=n_el
for i=1:n_el
v(i)=fscanf(f_id,'%d',1);
else
disp(m=0; n=0; v=0;)
return
end
end
fclose(f_id);
end

Sicuramente ho scritto delle diavolerie...saresti così gentile a farmi capire quali?grazie

#4
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:
ecco così funziona:
function [v,m,n]=carica_dati_da_file(nome_f)
m=input('dammi il numero di righe: ');
n=input('dammi il numero di colonne: ');
fid=fopen(nome_f,'rt');
num_el=fscanf(fid,'%d',1);
if (m*n)<=num_el
v=fscanf(fid,'%d',inf);
else
v=0;
m=0;
n=0;
end
fclose(fid);
end

La funzione la devi richiamare così (ricorda che la funzione e il file dati.txt devo stare nella stessa cartella):
[v,m,n]=carica_dati_da_file('dati.txt')
Ecco gli errori:

nome_f=input(dammi il nome del file: ','s'); %nn so se la sintassi è corretta, ma non serve specificare nome_f con questa stringa, quando poi nome_f lo specifichi quando richiami la funzione dalla command window
f_id=fopen(dati.txt,'r'); % questo errore è conseguenza di quello precedente
dim_mat=size(m,n); % qua hai fatto due errori in un colpo solo: 1) hai sbagliato la sintassi, avresti dovuto scrivere [m,n]=size(dim_mat), dove dim_mat ti faccio notare dovrebbe essere la matrice che noi dobbiamo costruire, non si tratta di una variabile, perchè la funzione size restituisce un vettore le cui componenti rappresentano righe e colonne della matrice di cui calcola le dimensioni; 2) questa stringa è concettualmente sbagliata perchè stai cercando di calcolare le dimensioni di una matrice che nn esiste e di dimensioni che deve scegliere l' utente, infatti dopo hai messo gli input per m e n, che sono proprio righe e colonne della matrice da costruire:
m=input('dammi il numero di righe: ');
n=input('dammi il numero di colonne: ');
mat(m,n)=fscanf(f_id,'%d',1); % quello che ti chiede di costruire la funzione 1 della traccia è il vettore v, che c' entra mat(m,n), che tra le altre cose è solo una variabile, senza contare che sia la m che la n non assumono mai un valore perchè non hai innestato i for
if m*n>=n_el % hai sbagliato la condizione dell' if infatti se m*n fosse maggiore di n_el (che ti faccio notare che nn lo hai assegnato da nessuna parte,quindi come fa a capire chi è n_el) la matrice (che nn è richiesta nella funzione1) nn la puoi proprio costruire, perchè nn ci sono elementi a sufficienza, almeno che la funzione 2 della traccia dia indicazioni precise a proposito.
for i=1:n_el % il for si poteva evitare, bastava mettere inf al posto di 1 nell' fscanf
v(i)=fscanf(f_id,'%d',1);
else
disp(m=0; n=0; v=0;) %a parte la sintassi scorretta, ma la traccia n ti dice di mostrare valore di m,n, e v uguali a zero , ma di assegnare che è diverso
return % nn ci azzecca assolutamente niente;
end
end
fclose(f_id);
end



#5
celafaro

celafaro

    Member

  • Utente
  • StellaStella
  • 13 Messaggi:
saresti così gentile da farmi vedere come si svolge anche questa?ufff...:(
FUNZIONE 2: prende il vettore v in input e carica gli elementi di v nella matrice A per colonne. Il prototipo è il seguente:
function A=crea_matrice(v,m,n)

#6
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:
La seconda funzione è semplicissima, basta innestare i due for per la matrice e far scalare uno ala volta gli elementi di v.
function A=crea_matrice(v,m,n)
k=0;
for j=1:n
for i=1:m
A(i,j)=v(k+1);
k=k+1;
end
end
end


#7
celafaro

celafaro

    Member

  • Utente
  • StellaStella
  • 13 Messaggi:
Scusami non ho ben capito il compito di k :help:

#8
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:
k rappresenta il k_esimo elemento del vettore v, o meglio rappresenta l' indice di posizione di un elemento di v.
Esempio: se v=[1,2,3,4,5,6] allora v(1)=1 ,come v(2)=2, come v(k)=num per un generico vettore.
Allora, nella funzione bisogna caricare in A per colonne tutti gli elementi di v, quindi bisogna far scorrere gli indici di righe e colonne della matrice A per caricare uno per volta gli elementi contenuti da v vettore, per questo ci sono i for.
Dunque il problema è: come faccio scorrere gli elementi del vettore v uno per volta, in modo che uno per volta vadano a costruire la matrice A?
Per risolvere questo problema non puoi usare il for e scrivere ,per esempio, for k=1:length(v) perchè se innesti questo for o prima o dopo degli altri due va a finire che sovrascrive sempre tutti gli elementi di v(scorrendoli uno per volta) sempre nella stessa posizione A(i,j) e alla fine ti trovi che la matrice A è fatta di tutti elementi uguali e che corrispondono all' ultimo elemento di v.
Per ovviare a ciò si inizializza k=0 , si fa scorrere k di un passo alla volta dopo che l'elemento associato a v(k) è stato caricato in A(i,j) ovvero nell' elemento di A di riga i e colonna j, le quali righe e colonne scorrono grazie ai cicli for, e poi si incrementa k di 1 in modo che quando il for fa scorrere la riga il nuovo v(k) indica l' elemento immediatamente successivo al vecchio v(k).
Faccio notare che il primo for fa scorrere le colonne della matrice,mentre il secondo scorre le righe della matrice, questo perchè la traccia richiede che gli elementi di v siano caricati in A per colonne, se avesse chiesto che venissero caricati per righe bastava invertire i for o semplicemente invertire gli indici all' interno dell' istruzione dopo i due for, cioè al posto di A(i,j)=v(k+1) si metteva A(j,i)=v(k+1).

#9
mary88

mary88

    Advanced Member

  • Utente
  • StellaStellaStella
  • 32 Messaggi:
Ragazzi controllate se ho impostato bene questa funzione?
Dato Un File matrici.txt Implementare Una Funzione Tale Da Leggere I Valori All Interno DI Questo File E Caricarli In Una Matrice:
function A=crea_matrice(nomefile)
f_id=fopen(nomefile,'rt')
A=zeros(n,m)
for r=1:n
for c=1:m
A(i,j)=fscanf(f_id,'%d',inf);
end
end
fclose(f_id)
end

Grazie!

#10
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:
Andrebbe tt bene se si conoscessero i valori di m e n, sono per caso i primi due interi contenuti nel file matrice.txt?
Poi nell' fscanf nn ci va inf ma 1 , perché. devi leggere un elemento alla volta.
Inoltre i for devono far scorrere i e j non r e c altrimenti nn devi scrivere A(i,j) ma A(r,c).

#11
mary88

mary88

    Advanced Member

  • Utente
  • StellaStellaStella
  • 32 Messaggi:
No :( la traccia mi dice solo quello che ho scritto precedentemente! :(

#12
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:
A limite si potrebbero caricare tt gli elementi del file matrice.txt in un vettore e poi mettere tt gli elementi del vettore creato in una matrice, ma rimane sempre il problema delle dimensioni della matrice da costruire,. Altrimenti le soluzioni sono due:
1) bisogna chiedere all' utente di specificare numero di righe e colonne, verificare se il file matrice.txt ha elementi ha sufficienza per costruire la matrice di righe e colonne scelte dall' utente, ein caso positivo si genera la matrice in caso negativo si richiede all' utente di reinserire il numero di righe e di colonne;
2)poiché t i casi specificati nella 1) nn sono previsti dalla traccia credo che bisogna semplicemente contare le righe e le colonne della matrice contenuta nel file matrice.txt e impostare i for con questi dati.

Posta il contenuto del file matrice.txt!

#13
mary88

mary88

    Advanced Member

  • Utente
  • StellaStellaStella
  • 32 Messaggi:

Ecco il file!

File allegato



#14
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:
si ok è la soluzione 2) quella corretta.
Ecco il codice:
function A=crea_matrice(nomefile)
f_id=fopen(nomefile,'rt');
for r=1:3
for c=1:3
A(r,c)=fscanf(f_id,'%d',1);
end
end
fclose(f_id);
end
Richamala così dalla command window (ricorda che il file matrici.txt e la funzione devono stare nella stessa cartella):
A=crea_matrice('matrici.txt')
Note:
1. non c'è bisogno di inizializzare la matrice con tutti zeri, non è errore, ma rendi l' algoritmo meno efficiente dal punto di vista delle risorse in quanto prima occupi dello spazio in memoria mettendo in A tutti zeri, poi vai a sovrascrivere nuovamente in A con l' fscanf.
2. i for arrivano a 3 perchè la matrice contenuta nel file matrici.txt è 3*3.

#15
mary88

mary88

    Advanced Member

  • Utente
  • StellaStellaStella
  • 32 Messaggi:
Scusa peppepeppo mi controlleresti anche questa? :)
Sia dato il file dati.txt contenente 50 numeri interi. Al candidato è richiesto di implementare le seguenti funzioni:
(1) Scrivere una funzione che consente di caricare gli elementi del file in una matrice quadrata la cui dimensione viene fornita in input La matrice deve essere caricata per righe, elemento per elemento. Il prototipo della funzione è il seguente function [mat, esito]= carica_mat(dim, nome_file) la variabile esito ritorna:
0 (zero) - se la matrice è stata carica con successo
1 - se non è possibile aprire il file
2 - se la dimensione della matrice è maggiore del numero di
elementi presenti nel file
function[mat,esito]=carica_mat(dim,nome_file)
esito=0
f_id=fopen(nome_file,'rt');
if f_id==-1
esito=1
return
end
dim=fscanf(f_id,'%d',1);
mat=zeros(dim)
for i=1:dim
for j=1:dim
A(i,j)=fscanf(f_id,'%',1);
if (dim^2)<=50
else
esito=2
end
end
end
fclose(f_id)
end


#16
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:
dimmi la data per favore, che questa sono sicuro di averla già fatta.

#17
LUIGI89

LUIGI89

    Advanced Member

  • Utente
  • StellaStellaStella
  • 32 Messaggi:
Bhè diciamo ci sono un pò di cose da vedere.
quello più grave è quello dim=fscanf....
questa operazione non va assolutamente fatta!! poichè la dimensione è un paramentro fisso, come nome_file!!
quindi basta fare [r,c]=size(dim).
poi il passaggio esito =2 io lo inserirei nel primo blocco della funzione prima del return!
poi la matrice va riempita per colonne quindi quando leggi la matrice inverti le i e le j
cioè for j=1:c
for i=1:r
oppre se non vuoi fare questa operazione lasci la lettura prima con i e poi con j,ma quando vai a riempire ma matrice fai:
for i=1:r
for j=1:c
mat(j,i)=fscanf(f_id,'%d',1) e stai attenta non dimenticare la d o la f(numeri interi o reali)

#18
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:

eccola trovata e quella di febbraio 2008

File allegato



#19
LUIGI89

LUIGI89

    Advanced Member

  • Utente
  • StellaStellaStella
  • 32 Messaggi:
Sorry è per righe quindi non si invertono for i e for j!!

#20
santos

santos

    Member

  • Utente
  • StellaStella
  • 16 Messaggi:

Sia dato il file dati.txt contenente dei numeri interi. Il numero degli interi presenti non è noto apriori, il primo elemento indica quanti sono gli elementi presenti, ovvero quelli da esaminare.Il programma deve chiedere all'utente di specificare un numero di righe e un numero di colonne, quindi creare una matrice con gli elementi letti dal file caricandoli nella matrice colonna per colonna.Se le dimensioni della matrice sono tali da non poter essere riempita con i dati a disposizione, visualizzare un messaggio all'utente. Viceversa, la matrice viene creata e visualizzata all'utente.
FUNZIONE 1: prende nome_f in input tramite il quale viene passata una stringa con il nome del file da aprire in lettura "dati.txt". La funzione chiede all'utente di specificare le dimensioni m e n della matrice. Il primo elemento del file contiene il numero di interi in esso presenti. Se questo è sufficiente a creare la matrice di dimensioni m*n, la funzione legge tutti gli elementi e li carica nel vettore v. Altrimenti assegna 0 a v, m e n. Il prototipo della funzione è il seguente:
function [v,m,n]=carica_dati_da_file(nome_f)...Io ho cercato di svolgerla in questo modo:

nome_f=input(dammi il nome del file: ','s');
f_id=fopen(dati.txt,'r');
dim_mat=size(m,n);
m=input('dammi il numero di righe: ');
n=input('dammi il numero di colonne: ');
mat(m,n)=fscanf(f_id,'%d',1);
if m*n>=n_el
for i=1:n_el
v(i)=fscanf(f_id,'%d',1);
else
disp(m=0; n=0; v=0;)
return
end
end
fclose(f_id);
end

Sicuramente ho scritto delle diavolerie...saresti così gentile a farmi capire quali?grazie

scusa ma questa non è la modalità vecchia di esame?io so che l'hanno cambiato




Leggono questa discussione 0 utenti

0 utenti, 0 ospiti, 0 utenti anonimi