DOMANDA Linguaggio C,come faccio a implementare il calcolo del massimo e del minimo di questo array,all'interno della stessa funzione esterna al main?

Davide9898

Nuovo Utente
17
0
C:
#include <stdio.h>
#include <stdlib.h>

//Esercizio 3,2 maggio 2018

int max(int vect[],int dim);
int min(int vect[],int dim);

int main()
{ 
   //dichiarazione delle variabili
   int dim=0, i=0, massimo=0, minimo=0;
  
   //chiede il numero di elementi
   printf("Inserisci la dimensione del vettore: \n");
   scanf("%d",&dim);

   int vect[dim];


   while(i<dim)
{
  printf("inserisci valore: \n");
  scanf("%d",&vect[i]);
  i++;
}
  massimo=maxmin(vect,dim);
  minimo=maxmin(vect,dim);
 
  printf("\nIL massimo dell'array e':%d\n",massimo);
  printf("\nIl minimo dell'array e' :%d\n",minimo);
  
 
   return 0;
}



int maxmin(int vect[],int dim)
{
    int i;
    int min=0;
    int max=0;
        
    for (i=0; i<dim; i++)
{
            if (min>vect[i])
            
{
               min=vect[i];
            
}
                    
}
    return min;


for (i=0; i<dim; i++)
{
            if (max>vect[i])
            
{
               max=vect[i];
            
}
                    
}
    return max;

}
 

Giacomo Furlan

Utente Attivo
351
87
CPU
AMD Ryzen 5900x
Dissipatore
BeQuiet! SilentLoop 2 360mm
Scheda Madre
Gigabyte X470 AORUS Gaming 7 WIFI AMD X470
HDD
Crucial P5 Plus 2 TB PCIe M.2 2280SS
RAM
Patriot Viper Steel RAM DDR4 3600 Mhz 64GB (2x32GB) C18
GPU
MSI GeForce RTX 2080 Gaming X Trio
Audio
SteelSeries Arctis 9
Monitor
Alienware AW3423DWF
PSU
EVGA SuperNOVA 650 G3, 80 Plus GOLD 650W
Case
Sharkoon TG5
OS
Windows 11, Fedora 36
Domanda: se massimo e minimo sono valorizzate con la stessa funzione maxmin, come fai ad indicare alla stessa se stai cercando il valore massimo od il valore minimo?

Se quindi il codice sopra scritto è corretto, l'unico modo che mi viene in mente è calcolare in maxmin sempre il numero più grande, eliminando successivamente dall'array tutti gli elementi tranne che il minimo.

Se invece puoi modificare la firma, farei accettare da maxmin un terzo parametro (tipo "max") per indicare se vuoi il massimo o il minimo.

Vedo comunque che sopra sono definite due funzioni (max e min). A questo punto mi chiedo se la tua domanda sia più sulla logica del problema, oppure su un problema di programmazione specifico.
 

Davide9898

Nuovo Utente
17
0
Domanda: se massimo e minimo sono valorizzate con la stessa funzione maxmin, come fai ad indicare alla stessa se stai cercando il valore massimo od il valore minimo?

Se quindi il codice sopra scritto è corretto, l'unico modo che mi viene in mente è calcolare in maxmin sempre il numero più grande, eliminando successivamente dall'array tutti gli elementi tranne che il minimo.

Se invece puoi modificare la firma, farei accettare da maxmin un terzo parametro (tipo "max") per indicare se vuoi il massimo o il minimo.

Vedo comunque che sopra sono definite due funzioni (max e min). A questo punto mi chiedo se la tua domanda sia più sulla logica del problema, oppure su un problema di programmazione specifico.

Scrivo il testo dell'esercizio in maniera tale da evitare incomprensioni.
-Creare un programma che implementi una funzione che immesso come input un vettore e la sua dimensione,,restituisca tramite 2 parametri della funzione il massimo ed il minimo del vettore.

-La richiesta mi sembra di capire,chiede che venga effettuato il calcolo all'interno della stessa funzione esterna al main,la mia domanda e' come si fa?È necessario forse l'utilizzo dei puntatori?
 

Sysken

Nuovo Utente
51
20
L'unico modo per far restituire ad una funzione due "risultati" è l'utilizzo del passaggio per riferimento. Come hai specificato già te è necessario utilizzare i puntatori.
Puoi anche, volendo, far restituire alla funzione il valore del max/min (a tua discrezione) e il valore min/max mediante riferimento.

EDIT: Un altro modo, un pò rozzo, potrebbe essere l'utilizzo di un vettore con cardinalità due. Nel primo elemento inserisci il max/min nel secondo il min/max. In questo modo passi un unico puntatore (quello del vettore).
 
  • Mi piace
Reazioni: Davide9898

Davide9898

Nuovo Utente
17
0
L'unico modo per far restituire ad una funzione due "risultati" è l'utilizzo del passaggio per riferimento. Come hai specificato già te è necessario utilizzare i puntatori.
Puoi anche, volendo, far restituire alla funzione il valore del max/min (a tua discrezione) e il valore min/max mediante riferimento.

Ok grazie,vedrò di utilizzare i puntatori anche se purtroppo non è un argomento che ho troppo chiaro
 

Giacomo Furlan

Utente Attivo
351
87
CPU
AMD Ryzen 5900x
Dissipatore
BeQuiet! SilentLoop 2 360mm
Scheda Madre
Gigabyte X470 AORUS Gaming 7 WIFI AMD X470
HDD
Crucial P5 Plus 2 TB PCIe M.2 2280SS
RAM
Patriot Viper Steel RAM DDR4 3600 Mhz 64GB (2x32GB) C18
GPU
MSI GeForce RTX 2080 Gaming X Trio
Audio
SteelSeries Arctis 9
Monitor
Alienware AW3423DWF
PSU
EVGA SuperNOVA 650 G3, 80 Plus GOLD 650W
Case
Sharkoon TG5
OS
Windows 11, Fedora 36
Puoi benissimo utilizzare uno struct come return type della funzione, contenente sia il minimo, sia il massimo.
 

Davide9898

Nuovo Utente
17
0
Cosa non ti è chiaro in particolare?
Come effettuare il passaggio per riferimento,essendo che ho un vettore e non delle normali variabili,come faccio concretamente ad inviare alla funzione il vettore e far si che la funzione stampi il massimo ed il minimo e che questi valori ritornino al main??ps.non so cosa sia un vettore di cardinalità 2 purtroppo...
 

Giacomo Furlan

Utente Attivo
351
87
CPU
AMD Ryzen 5900x
Dissipatore
BeQuiet! SilentLoop 2 360mm
Scheda Madre
Gigabyte X470 AORUS Gaming 7 WIFI AMD X470
HDD
Crucial P5 Plus 2 TB PCIe M.2 2280SS
RAM
Patriot Viper Steel RAM DDR4 3600 Mhz 64GB (2x32GB) C18
GPU
MSI GeForce RTX 2080 Gaming X Trio
Audio
SteelSeries Arctis 9
Monitor
Alienware AW3423DWF
PSU
EVGA SuperNOVA 650 G3, 80 Plus GOLD 650W
Case
Sharkoon TG5
OS
Windows 11, Fedora 36
@Davide9898, ti ho scritto una traccia. Ti prego di non semplicemente copiarla ed incollarla, ma di studiare i seguenti temi:

- struct
- array (creazione, manipolazione)
- tipi di ritorno delle funzioni

C:
#include <stdio.h>

typedef struct {
  int min;
  int max;
} risposta;

risposta maxmin(int num[], int dim);

int main() {
  int numeri[5] = {5,26,2,13};

  risposta risultato = maxmin(numeri, 5);

  printf("max: %d, min: %d\n", risultato.max, risultato.min);
}

risposta maxmin(int num[], int dim) {
  risposta r;

  // Fai la tua logica qui ed imposta r.min e r.max

  return r;
}
 
  • Mi piace
Reazioni: Davide9898

_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
@Davide9898, ti ho scritto una traccia. Ti prego di non semplicemente copiarla ed incollarla, ma di studiare i seguenti temi:

- struct
- array (creazione, manipolazione)
- tipi di ritorno delle funzioni

C:
#include <stdio.h>

typedef struct {
  int min;
  int max;
} risposta;

risposta maxmin(int num[], int dim);

int main() {
  int numeri[5] = {5,26,2,13};

  risposta risultato = maxmin(numeri, 5);

  printf("max: %d, min: %d\n", risultato.max, risultato.min);
}

risposta maxmin(int num[], int dim) {
  risposta r;

  // Fai la tua logica qui ed imposta r.min e r.max

  return r;
}
L’esercizio chiede di usare parametri però
 

Giacomo Furlan

Utente Attivo
351
87
CPU
AMD Ryzen 5900x
Dissipatore
BeQuiet! SilentLoop 2 360mm
Scheda Madre
Gigabyte X470 AORUS Gaming 7 WIFI AMD X470
HDD
Crucial P5 Plus 2 TB PCIe M.2 2280SS
RAM
Patriot Viper Steel RAM DDR4 3600 Mhz 64GB (2x32GB) C18
GPU
MSI GeForce RTX 2080 Gaming X Trio
Audio
SteelSeries Arctis 9
Monitor
Alienware AW3423DWF
PSU
EVGA SuperNOVA 650 G3, 80 Plus GOLD 650W
Case
Sharkoon TG5
OS
Windows 11, Fedora 36
@_Achille: "restituisca tramite 2 parametri della funzione il massimo ed il minimo del vettore" restituire tramite 2 parametri della funzione non è molto chiaro a me... anche perché i parametri di maxmin sono l'array e la sua dimensione... quindi anche volendo usare i puntatori cosa si dovrebbe modificare? L'array o la dimensione? Non è chiaro. Se invece la dichiarazione di funzione è stata scritta (errata) dall'utente, allora basterebbe usare un terzo ed un quarto parametro.

In questo caso @Davide9898 ti scrivo la firma della funzione:

C:
void maxmin(int numArray[], int size, int *min, int *max);

Per capire come utilizzare min e max... (il primo link su Google) http://www.science.unitn.it/~fiorella/guidac/guidac026.html
 
  • Mi piace
Reazioni: BAT

Sysken

Nuovo Utente
51
20
La cardinalità di un vettore corrisponde al numero di elementi del vettore (Vettore di cardinalità 2: array[2]).
Devi sapere che c'è un forte legame tra puntatori e vettori, infatti l'identificatore del vettore non è nient'altro che il puntatore alla locazione di memoria che contiene il primo elemento dello stesso. Per essere più chiari, è vero che &vettore[0] == vettore. L' operatore unario & è detto di referenziazione (o di indirizzo), il suo duale * è detto di dereferenziazione (o di indirezione).
C:
    int x = 5;
    int *Ptr; // Ptr è un puntatore ad un intero (La lettura avviene da destra a sinistra).
    Ptr = &x; // Assegno, mediante l'operatore di dereferenziazione, l'indirizzo di x a Ptr.
    *Ptr = 8; // Assegno 8 a x. L'operatore di indirezione ci permette di "accedere" alla variabile x mediante l'indirizzo salvato in Ptr.
Possiamo dire che *Ptr = 8 e x = 8 sono la stessa cosa.
La cosa più importante da capire è che Ptr è una semplice variabile, proprio come x.
L'unico modo per accedere ad una variabile non locale è l'utilizzo dei puntatori, questo perché una funzione non può invadere lo stack frame di un'altra funzione e quindi è impossibilitata a "vedere" le variabili locali di altre funzioni.
 
Ultima modifica:
  • Mi piace
Reazioni: Davide9898

Davide9898

Nuovo Utente
17
0
@Davide9898, ti ho scritto una traccia. Ti prego di non semplicemente copiarla ed incollarla, ma di studiare i seguenti temi:

- struct
- array (creazione, manipolazione)
- tipi di ritorno delle funzioni

C:
#include <stdio.h>

typedef struct {
  int min;
  int max;
} risposta;

risposta maxmin(int num[], int dim);

int main() {
  int numeri[5] = {5,26,2,13};

  risposta risultato = maxmin(numeri, 5);

  printf("max: %d, min: %d\n", risultato.max, risultato.min);
}

risposta maxmin(int num[], int dim) {
  risposta r;

  // Fai la tua logica qui ed imposta r.min e r.max

  return r;
}
Ok grazie,ho risolto ,ho utilizzato la struttura come hai consigliato tu e a questo punto funziona.Spero solo sia stato conforme alla richiesta dell'esercizio,d'altronde non saprei come fare diversamente.Ancora Grazie.
Post unito automaticamente:

Ok grazie,ho risolto ,ho utilizzato la struttura come hai consigliato tu e a questo punto funziona.Spero solo sia stato conforme alla richiesta dell'esercizio,d'altronde non saprei come fare diversamente.Ancora Grazie.

C:
int maxmin (int dim, int v[], int *max, int *min);
int main()
{
    int dim;
    int v[1000];
    int max=0;
    int min=99999;
    int i;

    printf("inserisci la dimensione del vettore: ");
    scanf ("%d",&dim);

    for (i=0;i<dim;i++)
    {
        printf("\n%d/%d inserisci il valore: ",i+1, dim);
        scanf("%d",&v[i]);
    }

    maxmin (dim, v, &max, &min);

    printf("\n\nil valore massimo inserito e' %d\nil valore minimo inserito e' %d",max, min);

 return 0;

}


int maxmin (int dim, int v[], int *max, int *min)
{
    int i=0;

    for (i=0;i<dim;i++)
    {
        if (v[i]<*min)
            *min=v[i];

        if (v[i]>*max)
            *max=v[i];
    }

}

Ho provato in piu questa variante(forse un po grottesca)però funge :)
 
Ultima modifica:

Giacomo Furlan

Utente Attivo
351
87
CPU
AMD Ryzen 5900x
Dissipatore
BeQuiet! SilentLoop 2 360mm
Scheda Madre
Gigabyte X470 AORUS Gaming 7 WIFI AMD X470
HDD
Crucial P5 Plus 2 TB PCIe M.2 2280SS
RAM
Patriot Viper Steel RAM DDR4 3600 Mhz 64GB (2x32GB) C18
GPU
MSI GeForce RTX 2080 Gaming X Trio
Audio
SteelSeries Arctis 9
Monitor
Alienware AW3423DWF
PSU
EVGA SuperNOVA 650 G3, 80 Plus GOLD 650W
Case
Sharkoon TG5
OS
Windows 11, Fedora 36
Mmmmm non può funzionare, perché maxmin non ritorna niente! In ogni caso basta dichiarare maxmin come void e non int e si sistema. E no, non è "grottesco", è esattamente l'unica maniera possibile per creare un "side effect" al valore dell'oggetto puntato in argomento (che credo sia lo scopo tra l'altro dell'esercizio).

Comunque evita sempre di non mettere le graffe, altrimenti rendi il codice meno leggibile.
 

Andretti60

Utente Èlite
6,440
5,091
Due punti. Primo, per favore NON suggeriti metodi che non rispondono ai requisiti dell'esercizio, che sono ben precisi:
-Creare un programma che implementi una funzione che immesso come input un vettore e la sua dimensione,,restituisca tramite 2 parametri della funzione il massimo ed il minimo del vettore.

Secondo, la soluzione non e' in generale corretta perche' le variabili min e max vengono inizializzate con valori arbitrari. Non funziona se inserisco nel vettore iniziale per esempio -1 e 9999999. Il quesito dell'esercizion non specifica i limite dei valori del vettore. Basta una piccola modifica, assgnando valori opportuni. Pensaci su, prima che ti diamo suggerimenti.
 
  • Mi piace
Reazioni: _Achille

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili