Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    30

    Ricerca nome con compareToIgnoreCase()

    Ciao a tutti
    Ho un problema che dovrebbe essere semplice da risolvere ma a cui non riesco a trovare una soluzione! Sto facendo un programmino per la gestione dei voti degli studenti. Inizialmente viene letto un file così strutturato:
    nome cognome matricola numeroEsamiDati media

    Il programma tramite l'immissione del cognome o della matricola permette di inserire un nuovo voto al determinato studente con conseguente aggiornamento dei dati (il numero di esami dati crescera di 1 e la media viene aggiornata). Fin qui ho fatto tutto. Il mio problema arriva quando ci sono più persone con lo stesso cognome. Il programma deve restituire un elenco delle persone che hanno lo stesso cognome e l'utente a quel punto può scegliere il nome giusto e solo a quel punto aggiungere un voto.

    Sapete darmi una mano??
    Vi metto qui sotto il codice che ho fatto:
    codice:
    import java.util.Scanner;
    
    public class Console {
    	private static Gestione g;
    	
    	public static void main(String[] args) throws Exception{
    		try{
    			g=new Gestione("studenti.txt");
    		}catch(Exception e){
    			e.printStackTrace();
    		}
    		run();
    	}
    
    	public static void run()throws Exception{
    		try{
    			g.load();
    		}catch(Exception e){
    			e.printStackTrace();
    		}
    		System.out.println("Benvenuto nel sistema di gestione degli studenti");
    		System.out.println();
    		g.stampa();
    		Scanner s=null;
    		String cognome; 
    		String matricola; //forse int??????
    		String comando=" ";
    		System.out.println();
    		System.out.println("Per inserire un nuovo voto occorre digitare qui sotto 'cognome' per inserire il cognome dello studente, oppure 'matricola' per inserire la matricola dello studente. Inoltre quando si vuole terminare l'applicazione digitare 'exit'");
    		while(comando.compareToIgnoreCase("exit")!=0){
    			System.out.println();
    			System.out.println("Inserire comando: ");
    			s=new Scanner(System.in);
    			comando=s.nextLine();
    			if(comando.compareToIgnoreCase("exit")==0){
    				g.salva();
    				g.studenteMediaAlta();
    				g.studenteMediaBassa();
    				g.mediaTot();
    			}
    			else if(comando.compareToIgnoreCase("cognome")==0){
    				System.out.print("Inserire il cognome dello studente: ");
    				s=new Scanner(System.in);
    				try{
    					cognome=s.nextLine();
    					g.ricercaCognome(cognome);
    				}catch(Exception e){
    					e.printStackTrace();
    				}	
    			}
    			else if(comando.compareToIgnoreCase("matricola")==0){
    				System.out.print("Inserire la matricola dello studente: ");
    				s=new Scanner(System.in);
    				try{
    					matricola=s.nextLine().toString();
    					g.ricercaMatricola(matricola);
    				}catch(Exception e){
    					System.out.println("Matricola errata");
    				}	
    			}
    			else{
    				System.out.println("Comando non riconosciuto, riprovare");
    			}
    			
    		}
    	}
    
    }
    codice:
    public class Gestione {
    	private String file;
    	private Studente[] s;
    	int numero_righe=0;
    	int k=0;
    	
    	public Gestione(String file) throws Exception{
    		this.file=file;
    		numero_righe=conta_n();
    		s=new Studente[numero_righe];
    	}
    	
    	public int conta_n() throws FileNotFoundException{
    		int n=0;
    		Scanner nStud=new Scanner(new File(file));
    		while(nStud.hasNext()){
    			nStud.nextLine();
    			n++;
    		}
    		return n;
    	}
    	
    	public void load() throws IOException{
    		Scanner sc=new Scanner(new File(file));
    		StringTokenizer st; 
    		
    		for(int k=0;k<numero_righe;k++){
    			st=new StringTokenizer(sc.nextLine()," ");
    			String nome=st.nextToken();
    			s[k]=new Studente(nome);
    			String cognome=st.nextToken();
    			s[k].setCognome(cognome);
    			String matricola=st.nextToken();
    			s[k].setMatricola(matricola);
    			int esami=Integer.parseInt(st.nextToken());
    			s[k].setEsami(esami);
    			double media=Double.parseDouble(st.nextToken());
    			s[k].setMedia(media);
    		}
    	}
    	
    	public void stampa() throws Exception{
    		System.out.println("Ecco l'elenco degli studenti presenti nel database");
    		System.out.println();
    		for(int k=0;k<numero_righe;k++){
    			System.out.println("Nome: "+s[k].getNome()+" Cognome: "+s[k].getCognome()+" Matricola: "+s[k].getMatricola()+" Esami: "+s[k].getEsami()+" Media: "+s[k].getMedia());	
    		}
    	}
    	
    	public void salva() throws Exception{
    		PrintStream output=new PrintStream (new FileOutputStream(file));
    		for(int k=0;k<numero_righe;k++){
    			output.println(s[k].getNome()+" "+s[k].getCognome()+" "+s[k].getMatricola()+" "+s[k].getEsami()+" "+s[k].getMedia());
    		}System.out.println("Database aggiornato");
    	}
    
    	public void ricercaCognome(String cognome) {
    		int c=0;
    		String voto; //ho messo int nel foglio
    		for(int k=0;k<numero_righe;k++){
    			if(s[k].getCognome().compareToIgnoreCase(cognome)==0){ //sul foglio ho messo d[k]
    				c++;
    				if(c>1){
    					System.out.println(s[k].getNome());
    					System.out.println("Inserire il nome: ");
    					Scanner s=new Scanner(System.in);
    					try{
    						String nome=s.nextLine();
    						aggiornaVotoN(nome);
    					}catch(Exception e){
    						e.printStackTrace();
    					}
    					
    					}else if(c==1){ System.out.println(s[k].getNome());
    					System.out.println("Inserire il voto: ");
    					Scanner s=new Scanner(System.in);
    					try{
    						voto=s.nextLine();
    						aggiornaVoto(cognome,voto);
    					}catch(Exception e){
    						System.out.println("Voto errato");	
    					}
    				
    				}
    				
    			}}
    				
    		}
    			
    		
    
    	private void aggiornaVotoN(String nome) {
    		String voto; //ho messo int nel foglio
    		for(int k=0;k<numero_righe;k++){
    			if(s[k].getNome().compareToIgnoreCase(nome)==0){ //sul foglio ho messo d[k]
    			
    				 System.out.println(s[k].getNome());
    				 String cognome=s[k].getCognome();
    					System.out.println("Inserire il voto: ");
    					Scanner s=new Scanner(System.in);
    					try{
    						voto=s.nextLine();
    						aggiornaVoto(cognome,voto);
    					}catch(Exception e){
    						System.out.println("Voto errato");	
    					}
    				
    				}
    				
    			}
    		
    	}
    
    	private void aggiornaVoto(String cognome, String voto) {
    		for(int k=0;k<numero_righe;k++){
    			if((s[k].getCognome().compareToIgnoreCase(cognome)==0)&&s[k].getEsami()<40){
    			s[k].setEsami(s[k].getEsami()+1);
    			double media=(s[k].getMedia()+Double.parseDouble(voto)/s[k].getEsami());
    			s[k].setMedia(media);
    			System.out.println("Il voto "+voto+" è stato registrato allo studente "+s[k].getCognome()+" "+s[k].getNome()+".Lo studente ora ha "+s[k].getEsami()+" voti registrati e la sua media aggiornata è:"+media);
    			
    			}
    		}
    		
    	}
    	
    	public void ricercaMatricola(String matricola){
    		String voto; //ho messo int nel foglio
    		for(int k=0;k<numero_righe;k++){
    		if(s[k].getMatricola().equals(matricola)){ //sul foglio ho messo d[k]
    				System.out.println(s[k].getCognome()+" "+s[k].getNome());
    			}}
    				System.out.println("Inserire il voto: ");
    				Scanner s=new Scanner(System.in);
    				try{
    					voto=s.nextLine();
    					aggiornaVotoM(matricola,voto);
    				}catch(Exception e){
    					System.out.println("Voto errato");	
    				}
    			
    	}
    	
    	private void aggiornaVotoM(String matricola, String voto) {
    		for(int k=0;k<numero_righe;k++){
    			if((s[k].getMatricola().compareToIgnoreCase(matricola)==0)&&s[k].getEsami()<40){
    			s[k].setEsami(s[k].getEsami()+1);
    			System.out.println("Il voto "+voto+" è stato registrato allo studente "+s[k].getCognome()+" "+s[k].getNome()+".Lo studente ora ha "+s[k].getEsami()+" voti registrati.");
    			
    			}
    		}
    		
    	}
    	
    	public void studenteMediaAlta() throws Exception {
    		double []media=new double[numero_righe];
    		double maggiore=0;
    		String cognome=" ";
    		String nome=" ";
    		for(int i=0;i<numero_righe;i++){
    			media[i]=s[i].getMedia();
    			if(media[i]>maggiore){
    				maggiore=media[i];
    				cognome=s[i].getCognome();
    				nome=s[i].getNome();
    			}
    		}
    		System.out.println("Studente con la media piu alta: "+cognome+" "+nome+" con il voto :"+maggiore);	
    	}
    
    	public void studenteMediaBassa()throws Exception {
    		double []media=new double[numero_righe];
    		double minore=40;
    		String cognome=" ";
    		String nome=" ";
    		for(int i=0;i<numero_righe;i++){
    			media[i]=s[i].getMedia();
    			if(media[i]<minore){
    				minore=media[i];
    				cognome=s[i].getCognome();
    				nome=s[i].getNome();
    			}
    		}
    		System.out.println("Studente con la media piu bassa: "+cognome+" "+nome+" con il voto :"+minore);	
    	}
    
    	public double mediaTot()  throws Exception {
    	double somma=0;
    	double media=0.00;
    		for(int j=0; j<numero_righe; j++){
    			somma=(double)somma+s[j].getMedia();
    		}
    	
    		media=somma/numero_righe;
    		System.out.println("La media complessiva di tutte le medie: "+media);
    	
    	return media;
    	
    	}
    	
    	
    }
    e se faccio una prova stampa questo:

    Benvenuto nel sistema di gestione degli studenti

    Ecco l'elenco degli studenti presenti nel database

    Nome: Claudia Cognome: Bertone Matricola: 164063 Esami: 35 Media: 22.14
    Nome: Mattia Cognome: Bertone Matricola: 143562 Esami: 39 Media: 26.31
    Nome: Alessandro Cognome: Cafasso Matricola: 163572 Esami: 31 Media: 26.01
    Nome: Giulia Cognome: Rossi Matricola: 172230 Esami: 21 Media: 23.235238095238095
    Nome: Sofia Cognome: Bertone Matricola: 175032 Esami: 10 Media: 23.36

    Per inserire un nuovo voto occorre digitare qui sotto 'cognome' per inserire il cognome dello studente, oppure 'matricola' per inserire la matricola dello studente. Inoltre quando si vuole terminare l'applicazione digitare 'exit'

    Inserire comando:
    cognome
    Inserire il cognome dello studente: rossi
    Giulia
    Inserire il voto:
    24
    Il voto 24 è stato registrato allo studente Rossi Giulia.Lo studente ora ha 22 voti registrati e la sua media aggiornata è:24.326147186147185

    Inserire comando:
    cognome
    Inserire il cognome dello studente: bertone
    Claudia
    Inserire il voto:
    30
    Il voto 30 è stato registrato allo studente Bertone Claudia.Lo studente ora ha 36 voti registrati e la sua media aggiornata è:22.973333333333333
    Il voto 30 è stato registrato allo studente Bertone Mattia.Lo studente ora ha 40 voti registrati e la sua media aggiornata è:27.06
    Il voto 30 è stato registrato allo studente Bertone Sofia.Lo studente ora ha 11 voti registrati e la sua media aggiornata è:26.087272727272726
    Mattia
    Inserire il nome:
    20
    Sofia
    Inserire il nome:
    18


    P.s. nel file ci sono 3 persone con cognome Bertone (claudia, mattia e sofia) mentre con cognome Rossi c'è solo Giulia!

    Vi ringrazio anticipatamente tutti!


  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Ok. Hai scoperto che il tuo codice ha un problema e hai anche capito a cosa è dovuto.
    Ora dovresti un attimo pensare a come vuoi risolvere il problema. E' chiaro che questo metodo

    codice:
    public void ricercaCognome(String cognome) {
        int c = 0;
        String voto; //ho messo int nel foglio
        for (int k = 0; k < numero_righe; k++) {
            if (s[k].getCognome().compareToIgnoreCase(cognome) == 0) { //sul foglio ho messo d[k]
                c++;
                if (c > 1) {
                    System.out.println(s[k].getNome());
                    System.out.println("Inserire il nome: ");
                    Scanner s = new Scanner(System.in);
                    try {
                        String nome = s.nextLine();
                        aggiornaVotoN(nome);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
    
                } else if (c == 1) {
                    System.out.println(s[k].getNome());
                    System.out.println("Inserire il voto: ");
                    Scanner s = new Scanner(System.in);
                    try {
                        voto = s.nextLine();
                        aggiornaVoto(cognome, voto);
                    } catch (Exception e) {
                        System.out.println("Voto errato");
                    }
    
                }
    
            }
        }
    
    }
    così com'è non può andare: tu scorri tutta la lista e, appena trovi il cognome che ti interessa, effettui le operazioni... senza controllare che per caso non ve ne siano altri. Quindi, io agirei in questo modo (non entro nel merito del codice in sé, che potrebbe essere rivisto):

    Per prima cosa scorrerei l'array in cerca del cognome desiderato. Appena trovo il cognome desiderato, aggiungo le informazioni sullo studente ad una seconda lista (un ArrayList può andare benissimo) e proseguo in cerca di altri cognomi, senza fare nient'altro (solo ricerca del cognome desiderato). Alla fine del ciclo controllo quanti record ho inserito nell'ArrayList. Se ne ho uno solo posso proseguire senza problemi (significa che c'è un solo studente con quel cognome). Se ce ne sono di più, allora devo prendere un'altra strada: visualizzare la lista degli studenti trovati, chiedere all'utente quale vuole aggiornare, ecc.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.