DOMANDA [C#] Ricerca vettore

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Questo perché equals confronta il contenuto dell'oggetto (e String è un oggetto), mentre "uguale a" confronta il riferimento.

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

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Non è vero. Per oggetti della classe String l’operatore == confronta il contenuto.
Non da confondersi con Java dove bisogna usare .equals() comunque

Vero, hai ragione , avviene l'override in C#.
 

Spanci03

Utente Attivo
418
87
Periferiche
usb, mouse,tastiera
Net
duckduckgo
OS
windows 7 , debian
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();
        }
    }
}
Post unito automaticamente:

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
 

fabio93

Utente Attivo
609
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
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.
 
  • Mi piace
Reazioni: Spanci03

Andretti60

Utente Èlite
6,440
5,091
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.
 
  • Mi piace
Reazioni: Spanci03

Spanci03

Utente Attivo
418
87
Periferiche
usb, mouse,tastiera
Net
duckduckgo
OS
windows 7 , debian
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è?

Post unito automaticamente:

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
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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...
 

Spanci03

Utente Attivo
418
87
Periferiche
usb, mouse,tastiera
Net
duckduckgo
OS
windows 7 , debian
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
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
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.
 

Spanci03

Utente Attivo
418
87
Periferiche
usb, mouse,tastiera
Net
duckduckgo
OS
windows 7 , debian
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?
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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?
 
  • Mi piace
Reazioni: Andretti60

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Eh dal fatto che hai posto la domanda si è ben capito.
È importante apprendere la vita delle variabili e cos’è lo stack prima di mettersi a scrivere programmi
 
  • Mi piace
Reazioni: Andretti60

Spanci03

Utente Attivo
418
87
Periferiche
usb, mouse,tastiera
Net
duckduckgo
OS
windows 7 , debian
Eh dal fatto che hai posto la domanda si è ben capito.
È importante apprendere la vita delle variabili e cos’è lo stack prima di mettersi a scrivere programmi

Queste sono tutte cose che il prof non mi ha spiegato
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili