Ricominciare un programma da un punto

di il
2 risposte

Ricominciare un programma da un punto

Ciao a tutti...ho un programma a cui per ricominciare ho fatto così:

%%%%%%%%%%%%%%%%%%%%%%%%%  INIZIA IL PROGRAMMA CON WHILE PER LOOP -FC %%%%%%%%%%%%%%
  input3=1;
  while input3==1
  %%%%%%%%%%%%%%%%%%%%%%%%% END INIZIA IL PROGRAMMA CON WHILE PER LOOP -FC %%%%%%%%%%%%%%
%%% Spettri in imaging
fprintf('\n Per l''analisi dello spettro, è necessario utilizzare gli spettri delle basi e lo spettro da analizzare\n');
    fprintf('\n Scegliere i files dati diamante, grafite e fullerene \n');
    inputdiamdiff=uigetfile({'*.txt';'*.dat'},'Sceglere il file spettro del diamante');
    diamdiff=load(inputdiamdiff);
    
    inputgrafdiff=uigetfile({'*.txt';'*.dat'},'Sceglere il file spettro della grafite');
    grafdiff=load(inputgrafdiff);
    
    inputfuldiff=uigetfile({'*.txt';'*.dat'},'Sceglere il file spettro del fullerene');
    fuldiff=load(inputfuldiff);
    
    fprintf('\n Scegliere il files dati da analizzare \n');
    
    inputspetdiff=uigetfile({'*.txt';'*.dat'},'Sceglere il file spettro da analizzare');
    spetdiff=load(inputspetdiff);
    
    
TUTTO IL RESTO DEL PROGRAMMA


  %%%%%%%%%%%%%%%%%%%%%%%%%   ACQUISIZIONE PER LOOP -FC %%%%%%%%%%%%%%
   input3=0;
   while input3~=1 && input3~=2 
   
  fprintf('Se si desidere analizzare un altro spettro, per chiudere premere 2 \n');
  input3=input('Scelta= ');
if input3==1
    fprintf('Hai scelto di analizzare un altro spettro \n');
    
elseif input3==2
    fprintf('Fine \n');
   else fprintf('Scelta non corretta! Ripetere la scleta \n');
end
end
  %%%%%%%%%%%%%%%%%%%%%%%%%   END ACQUISIZIONE PER LOOP -FC %%%%%%%%%%%%%%
  end

così facendo mi chiede se ricominciare o no il programma. Io però avrei bisogno ora di fare 3 possibilità invece di 2 e cioè:

1) Ricominciare il programma ricaricando tutti i 4 files dati
2) Ricominciare il programma ricaricando solo l'ultimo file dati iniziale (file da analizzare) e lasciando in memoria i primi 3 (diamante, grafite e fullerene)
3) chiudere il programma

Come potrei fare?
Grazie

2 Risposte

  • Re: Ricominciare un programma da un punto

    La cosa più semplice che puoi fare è utilizzare una serie di "flag" per controllare (tramite blocchi "if-else") la lettura dei files.

    Quando usi la funzione "uigetfile" sarebbe meglio chiamarla con due parametri di output per ricevere il none del file ed il path.
    In questo caso potresti utilizzare la funzione "fullfile" per creare il nome completo (path + nome) del file.

    Per la selezione tra più opzioni puoi usare un blocco "switch".

    I commenti all'interno del codice dovrebbero fornire ulteriori dettagli.
    
    
    %%%%%%%%%%%%%%%%%%%%%%%%%  INIZIA IL PROGRAMMA CON WHILE PER LOOP -FC %%%%%%%%%%%%%%
    
    % input3=1;
    
    % Define tha array of flag to control the file reading
    read_me=ones(1,4)
    % Define the flag to control the main loop
    go_on=1
    while(go_on)
       %%%%%%%%%%%%%%%%%%%%%%%%% END INIZIA IL PROGRAMMA CON WHILE PER LOOP -FC %%%%%%%%%%%%%%
       %%% Spettri in imaging
       fprintf('\n Per l''analisi dello spettro, è necessario utilizzare gli spettri delle basi e lo spettro da analizzare\n');
       fprintf('\n Scegliere i files dati diamante, grafite e fullerene \n');
    
       % If the corresponding flag is set to 1
       if(read_me(1))
          % Then read the file and reset the flag
          inputdiamdiff=uigetfile({'*.txt';'*.dat'},'Sceglere il file spettro del diamante');
          diamdiff=load(inputdiamdiff);
          read_me(1)=0
       end
       
       % If the corresponding flag is set to 1
       if(read_me(2))
          % Then read the file and reset the flag
          inputgrafdiff=uigetfile({'*.txt';'*.dat'},'Sceglere il file spettro della grafite');
          grafdiff=load(inputgrafdiff);
          read_me(2)=0
       end
       
       % If the corresponding flag is set to 1
       if(read_me(3))
          % Then read the file and reset the flag
          inputfuldiff=uigetfile({'*.txt';'*.dat'},'Sceglere il file spettro del fullerene');
          fuldiff=load(inputfuldiff);
          read_me(3)=0
       end
       
       % If the corresponding flag is set to 1
       if(read_me(4))
          % Then read the file and reset the flag
          fprintf('\n Scegliere il files dati da analizzare \n');
          inputspetdiff=uigetfile({'*.txt';'*.dat'},'Sceglere il file spettro da analizzare');
          spetdiff=load(inputspetdiff);
          read_me(4)=0
       end
       
    %   TUTTO IL RESTO DEL PROGRAMMA
       
       
       %%%%%%%%%%%%%%%%%%%%%%%%%   ACQUISIZIONE PER LOOP -FC %%%%%%%%%%%%%%
       %    input3=0;
       %    while input3~=1 && input3~=2
       %    fprintf('Se si desidere analizzare un altro spettro, per chiudere premere 2 \n');
    
       % Define the flag to control the inner loop
       sel_option=0
          while(~sel_option)
          disp('Se si desidera analizzare un altro spettro, selezionare:')
          disp('1 - per ricaricare tutti e 4 i files')
          disp('2 - per ricaricare solo l''ultimo file')
          disp(' ')
          disp('0 Se si desidera uscire:')
          
          input3=input('Scelta= ');
          % Use a "switch" block to perform a multi case selection
          switch(input3)
             case 1
                fprintf('Hai scelto di analizzare un altro spettro \ncaricando tutti e 4 i files');
                read_me=ones(1,4)
                sel_option=1
             case 2
                fprintf('Hai scelto di analizzare un altro spettro \ncaricando solo l''ultimo file');
                read_me(4)=1
                sel_option=1
             case 0
                fprintf('Fine \n');
                sel_option=1
                go_on=0
             otherwise
                fprintf('Scelta non corretta! Ripetere la scleta \n');
          end
       end
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%   END ACQUISIZIONE PER LOOP -FC %%%%%%%%%%%%%%
    
    
    Detto questo, potresti / dovresti aggiungere dei controlli, nella sezione di lettura dei files, per gestire il caso nel quale l'utente seleziona "Annulla" in "uigetfile".

    Per rendere la selezione delle opzioni al termine del programma più semplice, invece di usare la funzione "input", potresti creare una finestra di "dialogo" con "questdlg"
  • Re: Ricominciare un programma da un punto

    Ciao innanzitutto grazie! Ho provato e funziona! Ho inoltre modificato le scelte (non solo quella finale, ma anche altre che avevo inserito nel programma) tramite la funzione "questdlg" e ho messo il controllo sulla scelta "annulla" in "uigetfile" in modo da arrestare il programma se l'utente preme "Annulla", ad esempio:
    
     % If the corresponding flag is set to 1
       if(read_me(1))
          % Then read the file and reset the flag
          inputdiamdiff=uigetfile({'*.txt';'*.dat'},'Sceglere il file spettro del diamante');
          if(isequal(inputdiamdiff,0))
               fprintf('\n E'' stata annullata la scelta, il programma verrà terminato \n');
          break;
          else
          diamdiff=load(inputdiamdiff);
          read_me(1)=0;
          end
       end
    
Devi accedere o registrarti per scrivere nel forum
2 risposte