DOMANDA [C#] Ricerca vettore

Pubblicità
Non è vero. Per oggetti della classe String l’operatore == confronta il contenuto.
Non da confondersi con Java dove bisogna usare .equals() comunque

Ho usato gli == e funziona lo stesso , grazie

per quanto riguarda la ricerca del vettore cosa sbaglio?



C#:
sing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //il codice del supermercato rappresenta l'indice del vettore
            int n;
            do
            {
                Console.WriteLine("Inserisci il numero di supermercati : ");
                n=Convert.ToInt32(Console.ReadLine());
            }
            while (n <= 0);
            int c;
            Double[] prezzo = new Double[n];
            Double[] codice = new Double[n];
            for (c = 0; c < n; c++)
            {
                Console.WriteLine("Inserisci il prezzo del prodotto : ");
                prezzo[c] = Convert.ToDouble(Console.ReadLine());
                Console.WriteLine("Inserisci il codice del supermercato : ");
                codice[c] = Convert.ToDouble(Console.ReadLine());
            }
            Double min = 0;
            for (c = 0; c < n; c++)
            {
                if (c == 0)
                {
                    min = prezzo[c];

                }
                else if (min > prezzo[c])
                {
                    min = prezzo[c];
                }
            }
            for (c = 0; c < n; c++)
            {
                if (prezzo[c] == min)
                {
                    Console.WriteLine("Il prezzo minimo registrato è : {0} e la sua posizione è : {1}", prezzo[c], c + 1);
                }
            }
            Double valore; //valore da tastiera che deve essere sottratto dai prezzi
            Console.WriteLine("Inserisci il valore da tastiera : ");
            valore = Convert.ToDouble(Console.ReadLine());
            Double codiceu;
            Console.WriteLine("Inserisci il codice del supermercato : ");
            codiceu = Convert.ToDouble(Console.ReadLine());
            for (c = 0; c < n; c++)
            {
                prezzo[c] = prezzo[c] - valore;
                Console.WriteLine("Il prezzo aggiornato con la sottrazione del valore da tastiera è : {0}", prezzo[c]);
              

            }
            for (c = 0; c < n; c++)
            {
                if (codiceu.Equals(codice[c]))
                {
                    Console.WriteLine("Il prezzo dell'articolo è : {0}", prezzo[c]);
                }
            }
            Console.ReadLine();
        }
    }
}
--- i due messaggi sono stati uniti ---
sto facendo la ricerca in un vettore che dato un codice mi deve dire il prezzo associato a quel codice ( prezzo e codice dati in input ) , ma non mi funziona


codiceu è il codice che do da tastiera per vedere se è presente nel vettore
 
Non ho ben capito esattamente cosa deve fare il programma. Comunque, per la ricerca del minimo non occorre controllare a ogni iterazione che l'elemento corrente del vettore sia il primo. Ti basta semplicemente inizializzare min al valore del primo elemento dell'array, fuori dal ciclo, e lasciare nel ciclo il controllo che se l'elemento corrente è minore del minimo, si aggiorna quest'ultimo al nuovo valore.
Così.
Codice:
Double min = prezzo[0];
for (c = 0; c < n; c++)
{
    if (min > prezzo[c])
    {
        min = prezzo[c];
    }
}

Memorizzando, anziché il prezzo minimo, la sua posizione, puoi risparmiarti il ciclo successivo in cui ricerchi l'elemento minimo e stamparlo direttamente.
 
Il tuo codice e' estremamente confuso, parli sia di "supermercato" che di "prodotto" e non si capisce quello che stai facendo. E perche' mai un codice e' di tipo Double? Avrebbe piu' senso essere una stringa o un intero, trattandosi di un identificatore.

PS dire "mi da' errore" o "non funziona" non aiuta per niente a capire. Occorre sempre dire che errore sia, dove accada, e perche' non funziona, ossia quali sono i dati in uscita invece dei dati che "dovrebbero" uscire. Ho questo problema ogni giorno con rapporti di clienti che dicono lo stesso "non funziona" e devo poi perdere ore con il nostro servizio clienti per dire a loro di raccogliere piu' informazioni.
 
Il tuo codice e' estremamente confuso, parli sia di "supermercato" che di "prodotto" e non si capisce quello che stai facendo. E perche' mai un codice e' di tipo Double? Avrebbe piu' senso essere una stringa o un intero, trattandosi di un identificatore.

PS dire "mi da' errore" o "non funziona" non aiuta per niente a capire. Occorre sempre dire che errore sia, dove accada, e perche' non funziona, ossia quali sono i dati in uscita invece dei dati che "dovrebbero" uscire. Ho questo problema ogni giorno con rapporti di clienti che dicono lo stesso "non funziona" e devo poi perdere ore con il nostro servizio clienti per dire a loro di raccogliere piu' informazioni.

d'accordissimo con te , l'ho metterò di tipo stringa ;
una cosa , ma l'errore outofrange , da cosa è causato ?

dovrei cercare la squadra di serie a data in input con più punti :
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            int n;
            bool trovato = true;
            do
            {
                Console.WriteLine("Inserisci la dimensione del vettore :");
                n = Convert.ToInt32(Console.ReadLine());
            }
            while (n <= 0);
            String[] squadre = new String[n];
            String[] serie = new String[n];
            int[] punti = new int[n];
            int i;
            for (i = 0; i < n; i++)
            {
                Console.WriteLine("Inserisci il nome della squadra : ");
                squadre[i] = Console.ReadLine();
                Console.WriteLine("inserisci la serie della squadra , inserire solo a, b , A , B ");
                serie[i] = Console.ReadLine();
                Console.WriteLine("Inserisci il punteggio della squadra : ");
                punti[i]=Convert.ToInt32(Console.ReadLine());

            }
            String s; //nome squadra di cui si milita
            Console.WriteLine("Inserire la squadra prefetita : ");
            s=Console.ReadLine();
            for(i=0;i<n;i++)
            {
                if(s==squadre[i])
                {
                    Console.WriteLine("La propria squadra del cuore ha {0} punti ", punti[i]);
                }
            }
            int c;
            int max=0;
            String maxs = "";
            for(c=0;c<n;c++)
            {
                if(serie[i]=="A" || serie[i]=="a")
                {
                    max=punti[i];
                    maxs=squadre[i];
                }
                else if(max<punti[i])
                {
                    max=punti[i];
                    maxs=squadre[i];
                }
            }
            Console.WriteLine("La squadra di serie A che ha ottenuto più punti è : {0}", maxs);
            Console.ReadLine();
        }
    }
}


if(serie=="A" || serie=="a")
mi si blocca l'esecuzione su questo if

perchè?

--- i due messaggi sono stati uniti ---
Non ho ben capito esattamente cosa deve fare il programma. Comunque, per la ricerca del minimo non occorre controllare a ogni iterazione che l'elemento corrente del vettore sia il primo. Ti basta semplicemente inizializzare min al valore del primo elemento dell'array, fuori dal ciclo, e lasciare nel ciclo il controllo che se l'elemento corrente è minore del minimo, si aggiorna quest'ultimo al nuovo valore.
Così.
Codice:
Double min = prezzo[0];
for (c = 0; c < n; c++)
{
    if (min > prezzo[c])
    {
        min = prezzo[c];
    }
}

Memorizzando, anziché il prezzo minimo, la sua posizione, puoi risparmiarti il ciclo successivo in cui ricerchi l'elemento minimo e stamparlo direttamente.


grazie per il consiglio
 
Guarda che indice usi per il vettore in quel ciclo...

Dovresti iniziare a scrivere codice decente. Se una variabile ha come scope il solo ciclo ed è il contatore, è bene che la dichiari solo per il ciclo (tanto per dirne una). Ti avrebbe anche evitato questo errore.

Posto che prima di tutto dovresti ormai riuscire a comprendere l'errore del compilatore e dovresti soffermarti un attimo e riguardare ciò che hai scritto...
 
Guarda che indice usi per il vettore in quel ciclo...

Dovresti iniziare a scrivere codice decente. Se una variabile ha come scope il solo ciclo ed è il contatore, è bene che la dichiari solo per il ciclo (tanto per dirne una). Ti avrebbe anche evitato questo errore.

Posto che prima di tutto dovresti ormai riuscire a comprendere l'errore del compilatore e dovresti soffermarti un attimo e riguardare ciò che hai scritto...

come si fa a dichiararla solo per il ciclo ?


for (c = 0; c < n; c++)
{
if (serie[c] == "A" || serie[c] == "a")
{
max = punti[c];
maxs = squadre[c];
}
else if (max < punti[c])
{
max = punti[c];
maxs = squadre[c];
}
}


metto a tutti c , vero ?

Voi mi avete detto di non mettere la dichiarazione delle variabili una dopo l'altra , cosi ho fatto
 
come si fa a dichiararla solo per il ciclo ?


for (c = 0; c < n; c++)
{
if (serie[c] == "A" || serie[c] == "a")
{
max = punti[c];
maxs = squadre[c];
}
else if (max < punti[c])
{
max = punti[c];
maxs = squadre[c];
}
}


metto a tutti c , vero ?

Voi mi avete detto di non mettere la dichiarazione delle variabili una dopo l'altra , cosi ho fatto

Si, perché stai usando "c" per scorrere gli elementi.

Per quanto riguarda l'altra domanda... leggi qui https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/for
 
In aggiunta agli altri suggerimenti, permettemi di commentare il tuo codice.

Nei primi due cicli for usi come indice la variabile 'i' che hai dichiarato a livello del Main, poi improvvisamente nel terzo ciclo utilizzi come contatore una nuova variabile 'c' che devi quindi dichiarare. Perche' non hai continuato a usare 'i'?

Usare variabili dovrebbe essere la prima cosa che si impara a scuola. Se si usa una stessa variabile per piu' di una operazione, puo' causare conflitti e errori. Nel tuo caso hai dichiarato un nuovo contatore 'c' ma nel corpo del ciclo hai usato l'indice 'i', che e' ancora valido (perche' dichiarato a livello del metodo) e quindi il compilatore non ti ha dato nessun messaggio di errore. Questi sono errori tipici di chi usa linguaggi relativamente vecchi (tipo il C), nei linguaggi nuovi questo tipo di errori sono stati eliminati permettendo di dichiarare variabili SOLO nello scopo in cui sono usate, e non possono essere dichiarate in precedenza. Per esempio, nel tuo programma vanno eliminate TUTTE le dichiarazioni dei contatori a livello di modulo, e vanno dichiarati SOLO nei cicli:
for (int i = 0; i < n; i++) { ... }

A questo punto nel corpo del ciclo sei costretto a usare come indice solo la variabile 'i'. Lo Scopo della variabile 'i' quindi e' solo nel ciclo for() in cui e' dichiarata. Puoi scrivere quanti cicli for() vuoi, usando come indice lo stesso nome, senza paura che ci siano occlusioni avendo usato la variabile per altre cose.
 
Se si usa una stessa variabile per piu' di una operazione, puo' causare conflitti e errori. (ti riferisci ad usare la variabile i anche come sommatore ecc ...) ? o nei cicli
Puoi scrivere quanti cicli for() vuoi, usando come indice lo stesso nome,


hai detto l'opposto , cosa dovrei fare?
 
Se si usa una stessa variabile per piu' di una operazione, puo' causare conflitti e errori. (ti riferisci ad usare la variabile i anche come sommatore ecc ...) ? o nei cicli
Puoi scrivere quanti cicli for() vuoi, usando come indice lo stesso nome,


hai detto l'opposto , cosa dovrei fare?

Ti rispondo con una domanda. Sai cos'è lo scope?
 
Pubblicità
Pubblicità
Indietro
Top