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

aiutoooo esercizio


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

#121
renaulto

renaulto

    Member

  • Utente
  • StellaStella
  • 10 Messaggi:
salve! eccomi di nuovo qui, questa volta vorrei un chiarimento su un passaggio di questa traccia:

% ESAME DI FONDAMENTI DI INFORMATICA DEL 15/01/2010
%
% Sia dato il file dati.txt contenente 50 interi. Il candidato implementi
% le seguenti funzioni.
%
% 1) Leggere gli elementi del file inserendo in una matrice 6x5 i soli
% numeri non negativi (i numeri negativi devono essere ignorati).
% Il prototipo della funzione è il seguente:
% function m=carica_mat(nome_f).
%
% 2) Analizzare la matrice creata con la funzione precedente e calcolare
% la media degli elementi compresi tra i valori x e y forniti in input
% dall'utente (letti interattivamente da tastiera). Il prototipo della
% funzione è il seguente: function [media, x, y]=media_mat(m).
%
% Un esempio di esecuzione del programma è il seguente:
%
% 71 83 44 49 28
% 50 4 42 70 39
% 62 45 68 96 28
% 32 77 0 65 66
% 35 0 5 96 80
% 71 5 17 1 59
%
% dammi il valore di x: 20
% dammi il valore di y: 40
% la media degli elementi compresi tra 20 e 40 è 32.400000
%
% IL CANDIDATO NON PUò CAMBIARE IL CODICE FORNITO.
%
function traccia1()
clc;
mat=zeros(6,5);
mat=carica_mat('dati.txt');
disp('la matrice letta è');
disp(mat);
[media_el,x,y]=media_mat(mat);
fprintf('la media degli elementi compresi tra %d e %d è %f \n\n', x,y,media_el);
end

function m=carica_mat(nome_f)
% DA COMPLETARE
fid = fopen(nome_f,'rt');
for i=1:6
for j = 1:5
n = fscanf(fid,'%d',1);
while n < 0
n = fscanf(fid,'%d',1);

end
m(i,j) = n;
end
end
fclose(fid);
end

function [media, x, y]=media_mat(m)
% DA COMPLETARE
x = input('dammi il valore di x: ');
y = input('dammi il valore di y: ');
sum = 0;
num = 0;
for i=1:6
for j=1:5
if m(i,j)>x && m(i,j) sum = sum + m(i,j);
num = num + 1;
end
end
end
media = sum / num;
end



i passaggi in questione sono quelli in rosso..non capisco perchè, se devo prendere i numeri positivi, devo impostare il while in quel modo (era una traccia svolta)..se metto n>0 si blocca matlab :laugh:

#122
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:

i passaggi in questione sono quelli in rosso..non capisco perchè, se devo prendere i numeri positivi, devo impostare il while in quel modo (era una traccia svolta)..se metto n>0 si blocca matlab

Il while va impostato in quel modo perchè deve fare in modo da "setacciare" gli interi positivi contenuti nel file dati.txt. Quello che succede in pratica è questo: innanzitutto i due for servono per scalare gli indici della nuova matrice m che deve essere creata con gli interi positivi , le istruzioni immediatamente successive ai due for (quelle che hai segnato in rosso) non riguardano "direttamente" la matrice m che devi creare , ma servono per selezionare quali elementi sono utili (che in questo caso significa numeri interi e positivi) per creare la matrice m.Il problema è che non sai quanti sono i numeri positivi contenuti nel file dati.txt(che però devono essere almeno 30 perchè la matrice che devi creare è 6x5, altrimenti ci vorrebbe un ulteriore verifica che la traccia non ti chiede di fare) quindi l' unico modo per capire se un numero contenuto all'interno del file dati.txt sia positivo o negativo è leggere i numeri uno alla volta (n = fscanf(fid,'%d',1);) e sempre uno alla volta bisogna farli "setacciare" dal while. Quindi quando un numero, dopo essere stato letto, giunge al while, questo verifica se il numero è minore di zero: se è così allora bisogna leggere il numero immediatamente successivo a quello letto in precedenza, in caso contrario bisogna salvare tale numero (positivo) nella matrice m in posizione (i,j), cioè gli indici che sono scanditi dai for.
Il fatto che dici tu e cioè che MatLab si blocca se metti n>0 nel while ovvero significa, se ho capito bene, che tu al posto delle istruzioni rosse ci vorresti mettere questo:
n=fscanf(f_id,'%d',1);
while n>0
m(i,j)=n;
end
Questo MatLab te lo fa pure ma va in loop infinito, perchè il while, a differenza del for, è un ciclo che ha un inizio ma non finisce mai, in particolare il while per sintassi ti dice che fin quando la condizione è verificata l' istruzione dopo il while viene ripetuta sempre (se cerchi while nell' help ti dice :repeatedly execute statements while condition is true cioè eseguire le istruzioni finchè la condizione risulti vera). Ora ,nel tuo caso, se come condizione del while ci metti che il numero n deve essere positivo MatLab , dopo aver letto il numero n e aver trovato tramite il while che tale numero è effettivamente positivo,continuerà a inserire il numero n nella stessa posizione (i,j) della matrice m praticamente all' infinito.

P.S.Quando dico leggere il numero mi riferisco all' istruzione n = fscanf(fid,'%d',1); che in realtà non legge semplicemente un numero, ma lo salva nella variabile n e salvare significa assegnare (in MatLab). Ti preciso questo perchè potresti pensare che il while funzioni su un numero "letto" semplicemente e non salvato, mentre in realtà matlab il concetto di numero letto non ce l' ha proprio perchè matlab per lavorare sul numero letto lo deve vedere sotto forma di variabile il che si traduce in una porzione di spazio allocata in memoria.

#123
renaulto

renaulto

    Member

  • Utente
  • StellaStella
  • 10 Messaggi:
grazie mille della spiegazione, sei stato molto chiaro! anche se il concetto non mi sarebbe mai venuto spontaneamente. :P

si sarebbe potuta effettuare la stessa operazione con l'if?

#124
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:

si sarebbe potuta effettuare la stessa operazione con l'if?

L' if non andava bene perchè if non essendo un ciclo, ma semplicemente una condizione, una volta verificata la condizione (cioè n<0) poi MatLab passava all' istruzione successiva ,ovvero andava a leggere un altro numero(n=fscanf(fid,'%d',1);) senza però ricontrollare se anche questo nuovo numero fosse positivo o negativo.
Poichè ,poi, non sai a priori la quantità di numeri negativi che avresti trovato in successione all' interno del file dati.txt, il while era l' unica cosa che potevi fare.
Avresti potuto utilizzare l' if se avessi impostato la funzione in questo modo:
function m=carica_mat(nome_f)
fid = fopen(nome_f,'rt');
for i=1:6
j = 1;
while j <= 5
m(i,j) = fscanf(fid,'%d',1);
if m(i,j) >= 0
j = j + 1;
end
end
end
fclose(fid);
end


#125
renaulto

renaulto

    Member

  • Utente
  • StellaStella
  • 10 Messaggi:
tutto chiaro grazie :)

#126
giulia

giulia

    Advanced Member

  • Utente
  • StellaStellaStella
  • 285 Messaggi:
il primo esercizio dice di generare un vettore di 50 num interi random compresi tra -10 e 10
v=ceil(rand(1,50)*(10+10)-10);
il secondo dice di generare un vettore v_new che comprende 25 numeri dispari del vettore v precedente. UTILIZZANDO LE FUNZIONI BUILT-IN .
mi potreste aiutare con il secondo esercizio??? :help: :help: :help: :help:
grazie

#127
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:

il secondo dice di generare un vettore v_new che comprende 25 numeri dispari del vettore v precedente. UTILIZZANDO LE FUNZIONI BUILT-IN

Mi spiace questa volta non so come aiutarti perchè non conosco la funzione built-in richiesta.Alternativamente questo esercizio lo si risolve con una semplive funzione condizionata da un if. :nono:
Prova a chiedere al prof il nome della funzione.
P.S.Ma sei sicura che la traccia è questa?
Fammi(-cci) sapere!

#128
giulia

giulia

    Advanced Member

  • Utente
  • StellaStellaStella
  • 285 Messaggi:

il secondo dice di generare un vettore v_new che comprende 25 numeri dispari del vettore v precedente. UTILIZZANDO LE FUNZIONI BUILT-IN

Mi spiace questa volta non so come aiutarti perchè non conosco la funzione built-in richiesta.Alternativamente questo esercizio lo si risolve con una semplive funzione condizionata da un if. :nono:
Prova a chiedere al prof il nome della funzione.
P.S.Ma sei sicura che la traccia è questa?
Fammi(-cci) sapere!

ho mandato una mail giorni fa ma nn ho avuto risposta, mi puoi far vedere come avresti fatto tu senza la funzione built in, per favore!!
grazie!!

#129
giulia

giulia

    Advanced Member

  • Utente
  • StellaStellaStella
  • 285 Messaggi:
aiuto svolgimento!!!

 Definire una funzione v=analizza(A) che, data una matrice A in cui
% sono presenti su ogni riga la matricola, i giorni di assenza, lo stipendio base di ciascun dipendente, crea un
% vettore v, costituito dalla matricola del dipendente che ha lo stipendio più alto in busta paga e da quello che lo ha più basso.
Lo stipendio in busta paga è ottenuto addizionando lo stipendio base + l’incentivo;
l’incentivo è ottenuto dividendo lo stipendio base per i giorni di assenza.
% [10 punti].
% Esempio
% A=
% Matr giorni assenza stipendio base
% 1 3 1500
% 2 12 1100
% 3 10 1200
% 4 14 1000
% 5 11 1150
% 6 7 1320
% 7 5 1400
% 8 9 1250


#130
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:
Traccia:

% generare un vettore v_new che comprende 25 numeri dispari del vettore v precedente

Svolgimento:
function v_new=genera_vet(v)
k=0;
l1=length(v);
for i=1:l1
if mod(v(i),2)~=0
v_el_disp(k+1)=v(i);
k=k+1;
end
end
l2=length(v_el_disp);
if l2>=25
for i=1:25
v_new(i)=v_el_disp(i);
end
else
disp('Errore!Non ci sono sufficienti elementi per creare il vettore v_new');
end
end
Ricordo che il vettore v generato in precedenza era:
v=ceil(rand(1,50)*(10+10)-10);


#131
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:
Traccia:

% Definire una funzione v=analizza(A) che, data una matrice A in cui
% sono presenti su ogni riga la matricola, i giorni di assenza, lo stipendio base di ciascun dipendente, crea un
% vettore v, costituito dalla matricola del dipendente che ha lo stipendio più alto in busta paga e da quello che lo ha più basso.
% Lo stipendio in busta paga è ottenuto addizionando lo stipendio base + l’incentivo;
% l’incentivo è ottenuto dividendo lo stipendio base per i giorni di assenza.
% [10 punti].
% Esempio
% A=
% Matr giorni assenza stipendio base
% 1 3 1500
% 2 12 1100
% 3 10 1200
% 4 14 1000
% 5 11 1150
% 6 7 1320
% 7 5 1400
% 8 9 1250

Svolgimento:
function v=analizza(A)
[r,c]=size(A);
for i=1:r
vet_incentivi(i)=A(i,c)/A(i,(c-1));
end
for i=1:r
vet_stipendi(i)=A(i,c)+vet_incentivi(i);
end
stipendio_max=vet_stipendi(1);
stipendio_min=vet_stipendi(1);
for i=1:r
if vet_stipendi(i)>=stipendio_max
stipendio_max=vet_stipendi(i);
v(1)=i;
elseif vet_stipendi(i)<=stipendio_min
stipendio_min=vet_stipendi(i);
v(2)=i;
end
end
disp('I dipendenti che hanno lo stipendio più alto e quello più basso hanno rispettivamente le matricole: ');
disp(v);
end
Allego una cartella in cui ho preparato una funzione carica_mat.m per creare la matrice A con i dati contenuti dalla traccia e un main che richiama contemporaneamente sia la funzione carica_mat.m che la funzione analizza.m.
N.B. La funzione carica_mat.m e il main non sono richiesti dalla traccia, li ho introdotti io per testare al meglio la funzione analizza.m.

#132
southforce

southforce

    Advanced Member

  • Utente
  • StellaStellaStella
  • 57 Messaggi:
ragazzi qualcuno può aiutarmi con le tracce di febbraio....in particolare alla prima traccia esercizio 2 mi chiede di ESERCIZIO 2 Dato il vettore v dell'esercizio precedente, crea un nuovo vettore v_o
ottenuto ordinando v in modo decrescente visualizzando per ogni valore 2 cifre decimali. Visualizza il vettore ordinato
v_o.devi usare le funzione built in!!!
io ho fatto
v_o=sort(v,'descend');
disp('il vettore decrescente è: ',v_o)
ma come faccio a far uscire le due cifre decimali???
avevo pensato al fprintf('il vettore decrescente è %2.f\n',v_o) ma nn funziona...help!!:)

#133
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:
Traccia:

Dato il vettore v dell'esercizio precedente, crea un nuovo vettore v_o
ottenuto ordinando v in modo decrescente visualizzando per ogni valore 2 cifre decimali. Visualizza il vettore ordinato
v_o.devi usare le funzione built in!!!

Svolgimento:
v_o=sort(v,'descend');
disp('il vettore decrescente è: ');
fprintf('%3.2f\n',v_o);


#134
southforce

southforce

    Advanced Member

  • Utente
  • StellaStellaStella
  • 57 Messaggi:
l'unica cosa è che non me le da come un vettore ma in colonna secondo te va bene lo stesso???se non mi sbaglio la prima volta che feci lo scritto mi levò 2 punti su 4 proprio per qst...-.-...nn c'è un modo per farlo uscire sotto forma di vettore?grz per la pazienza..:)

#135
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:

l'unica cosa è che non me le da come un vettore ma in colonna secondo te va bene lo stesso???se non mi sbaglio la prima volta che feci lo scritto mi levò 2 punti su 4 proprio per qst...-.-...nn c'è un modo per farlo uscire sotto forma di vettore?grz per la pazienza..:)

Se la traccia non ti dice specificatamente che vuole che il vettore v_o debba essere visualizzato in riga o in colonna, puoi fare come ti pare, il prof non può toglierti punti per qualcosa che non sapevi di dover fare!
Cmq io li avevo messi in colonna perchè ho letto la tua stringa al post precedente:

avevo pensato al fprintf('il vettore decrescente è %2.f\n',v_o) ma nn funziona...help!!:)

e ho pensato che il vettore v_o dovesse essere visualizzato in colonna.
In ogni caso, basta che togli il \n all' interno dell' fprintf e lo sostituisci con due spazi per rendere più leggibili i numeri in modo che nn si vedano tutti attaccati.Ecco il codice:
v_o=sort(v,'descend');
disp('il vettore decrescente è: ');
fprintf('%3.2f ',v_o);


#136
southforce

southforce

    Advanced Member

  • Utente
  • StellaStellaStella
  • 57 Messaggi:
graaaaazie mille!!!scusa se non sono stato chiaro nella domanda ma era proprio così che cercavo di svolgere l esercizio!!!:)

#137
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:

il primo esercizio dice di generare un vettore di 50 num interi random compresi tra -10 e 10

v=ceil(rand(1,50)*(10+10)-10);
il secondo dice di generare un vettore v_new che comprende 25 numeri dispari del vettore v precedente. UTILIZZANDO LE FUNZIONI BUILT-IN .
mi potreste aiutare con il secondo esercizio??? :help: :help: :help: :help:
grazie

Leggendo le tracce pubblicate su IWT, mi sono accorto che la richiesta all' esercizio 2 della stessa traccia che contiene anche l' esercizio 1 che hai scritto tu, non è proprio come l' hai descritta tu. Infatti la traccia dell' secondo esercizio chiede questo:
%   ESERCIZIO 2
% Dato il vettore v dell'esercizio precedente, creare un nuovo vettore
% v_new ottenuto prendendo solo 25 valori alternati:
% uno si e uno no, ovvero tutti i valori di posizione dispari.
% (Nota: devi usare le funzioni built-in in Matlab)
% [4 punti]
quindi il vettore v_new doveva essere creato utilizzando gli elementi di indice dispari e non con gli elementi dispari del vettore v.In tal caso l' esercizio si risolveva subito così:
v_new=v(1:2:50);


#138
blink91

blink91

    Member

  • Utente
  • StellaStella
  • 19 Messaggi:
ragazzi non so come fare può sembrare una sciocchezza ma sono alle prime armi... sto svolgendo un esercizio con dei vettori alla fine l'esercizio mi chiede se in questo vettore ci sono dei numeri e quanti ce ne sono! sono bloccato! mi potreste aiutare facendomi un esempio...grazie mille! :)

#139
peppepeppo

peppepeppo

    Moderatore di sezione

  • Moderatore
  • 2474 Messaggi:

ragazzi non so come fare può sembrare una sciocchezza ma sono alle prime armi... sto svolgendo un esercizio con dei vettori alla fine l'esercizio mi chiede se in questo vettore ci sono dei numeri e quanti ce ne sono! sono bloccato! mi potreste aiutare facendomi un esempio...grazie mille! :)

Allora per vedere se nel vettore ci sono dei numeri bisogna verificare che il vettore in questione sia effettivamente un vettore ovvero bisogna classificare una variabile.
Faccio una piccola premessa: supponiamo che vet sia la nostra variabile , ora nella prima parte il tuo esercizio chiede di verificare se in vet ci sono dei numeri, ciò significa che noi non sappiamo a priori se in vet ci sono dei numeri o un solo numero.Tuttavia sappiamo sicuramente che se in vet ci sono dei numeri allora la variabile vet o è un vettore o è una matrice, al contrario, se vet contiene un numero allora la variabile vet è uno scalare, seguendo questo ragionamento riusciamo a classificare la variabile vet. Quindi verificare che in vet ci siano dei numeri coincide col verificare che vet sia un vettore. Tornando alla tua domanda, per verificare che in vet ci siano dei numeri (cioè per verificare che vet sia un vettore) devi andare nella command window , digitare il nome della variabile che vuoi classificare (nel mio esempio vet) e premi invio. Fatto questo possono succedere le seguenti cose;
1. sulla command ti compare un solo numero, dunque vet contiene un solo numero, quindi vet è uno scalare e non un vettore;
2. sulla command ti compare un elenco di numeri (in riga o in colonna), dunque vet è un vettore (vettore riga o vettore colonna);
3. sulla command ti compare il messaggio di errore "??? Undefined function or variable 'vet'" questo significa che la variabile vet non esiste , cioè non è salvata nel workspace.
Conclusione: vedere se un vettore contiene numeri$ = $ verificare se il vettore è un vettore$ = $richiamare la variabile da classificare nella command window$ = $controllare se la variabile è caricata nel workspace
La seconda parte dell' esercizio è facile, infatti , una volta classificata la variabile vet e verificato che vet è effettivamente vettore (supponendo che lo sia) allora la quantità di elementi contenuti in vet coincide con la lunghezza di vet, cioè del vettore.
Esempio: vet=[16,23,43]
numero elementi contenuti in vet=3=lunghezza di vet
Per conoscere la lunghezza di un vettore in MatLab si usa la funzione length(nome_variabile).
Conclusione:quantificare elementi di un vettore$ = $calcolare lunghezza vettore$ = $length(nome_variabile)
A proposito di questo argomento ti segnalo la slide 15 della cartella che trovi quì.

#140
blink91

blink91

    Member

  • Utente
  • StellaStella
  • 19 Messaggi:
scusami ma non mi sono spiegato bene cmq grazie dell'informazioni precedenti alla fine l'esercizio mi chiedeva che dato un vettore con i voti degli esami dell'anno accademico dire quanti 30 e 18 vi erano...il problema è che non conosco la logica per procedere...




Leggono questa discussione 1 utenti

0 utenti, 1 ospiti, 0 utenti anonimi