Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
Nelle ultime settimane abbiamo provato tre delle proposte top di gamma di NZXT nelle categorie case, dissipatori e ventole. Rispettivamente, parliamo dell'H9 Flow RGB+, Kraken Elite 420 e F140X. Si tratta, chiaramente, di prodotti di fascia alta che si rivolgono agli utenti DIY che desiderano il massimo per la propria build. Tuttavia, mentre i primi due dispositivi mantengono questa direzione, le ventole purtroppo hanno mostrato qualche tallone d'Achille di troppo
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-05-2011, 00:48   #1
gargoyle00
Junior Member
 
Iscritto dal: Aug 2008
Messaggi: 23
Aiuto esercizio (puntatori e funzioni)

non riesco a capire come funzionano i puntatori!

qui la traccia dell'esercizio:
Codice:
Si scriva un programma in grado di gestire un listino prezzi, ovvero deve
gestire un elenco di prodotti e i loro relativi prezzi in €. Il programma
utilizza su una matrice di caratteri chiamata warehouse di dimensione
NxM e un vettore di numeri decimali chiamato price di dimensione N.

Nel vettore price, il valore -2 indica linea libera, -1 indica che la linea
contiene un prodotto valido a cui non è stato ancora attribuito un prezzo.
All’avvio del programma, il vettore price è totalmente inizializzato a -2.
Il programma deve permettere all'utente di invocare tramite menu le
seguenti operazioni per manipolare il listino:

a. insert_product: è una funzione che permette di includere un nuovo
prodotto nel listino; restituisce il valore 1 se il prodotto non era ancora
presente, 0 se già inserito in precedenza; il prezzo associato al nuovo
prodotto è -1

int insert_product(char products[][M], float price[], int n, char new_product[]);

b. print_all: è una funzione che permette di visualizzare a video il
contenuto del listino. Inoltre, la funzione restituisce 2 valori: il prezzo
medio ed il prezzo massimo

void print_all(char products[][M], float price[], int n, float *avg, float *max);

c. update_product: è una funzione che permette di aggiornare il prezzo
di uno specifico prodotto; restituisce 1 se l’aggiornamento è avvenuto
con successo, 0 se il prodotto non esiste.

int update_product(char products[][M], float price[], int n, char product[], int new_price);

d. remove_product: è una funzione che permette di rimuovere un
prodotto dal listino; restituisce 1 se la rimozione è avvenuto con
successo, 0 se il prodotto non esiste; la funzione deve impostare il
valore -2 nel vettore prezzi in corrispondenza dell’elemento rimosso

int remove_product(char products[][M], float price[], int n, char old_product[]);
qui la mia risoluzione commentata passo passo:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//definisco le costanti per le righe e le colonne della matrice.
#define N 10
#define M 30

//definisco i prototipi delle funzioni che userò
int insert_product(char products[][M], float price[], char new_product[]);
void print_all(char products[][M], float price[], float *avg, float *max);
int update_product(char products[][M], float price[], char product[], char new_price[]);
int remove_product(char *products[][M], float *price[], char old_product[]);

int main()
{
// definisco gli elementi basilari del programma
    char warehouse [N] [M+1], prodotto[M+1];
    float prezzo [N];

//definisco alcune variabili di supporto
    char linea[3];
    int i, comando, exit=0;

//definisco delle variabili che mi serviranno nei vari case dello switch
    int caso;
    float media, massimo;
    char nuovo_prezzo[M+1];

//inizializzo i valori del vettore prezzo a -2 (che indica nessun prodotto ancora inserito)
    for(i=0;i<N;i++)
        prezzo[i]=-2.00;
//stampo un menu' con le varie opzioni disponibili
// e rimango in loop fintanto che comando sara' != 5
    do
    {
        caso=-1;
        printf("- Digita (1) per inserire un nuovo prodotto\n");
        printf("- Digita (2) per stampare la lista prodotti\n");
        printf("- Digita (3) per modificare il prezzo di un prodotto\n");
        printf("- Digita (4) per eliminare un prodotto\n");
        printf("- Digita (5) per uscire\n");
        printf("\n  Inserisci il comando: ");

    //acquisisco una stringa di caratteri che poi converto in intero per navigare nel menu'
        gets(linea);
        comando=atoi(linea);

    //in base al valore che assume 'comando' entro in una sezione del menu'
        switch(comando)
        {
        //se comando = 1
            case 1:
            //salvo il valore di ritorno di 'insert_product'
                caso=insert_product(warehouse, prezzo, prodotto);
            //se il ritorno è = a 1
                if(caso==1)
                //vuol dire che ho inserito un nuovo prodotto nel warehouse
                    puts("\n\tHai inserito un nuovo prodotto.\n");
            //se il ritorno è = a 0
                else if(caso==0)
                //vuol dire che l'elemento è già presente nel warehouse
                    puts("\n\tHai gia' inserito questo prodotto.\n");
            //se si eseguisse mai il seguente caso, vuol dire che c'è un bug nel programma!!!
                else if(caso==-1)
                    puts("\nERRORE!!!\n");
                break;
        //se comando = 2
            case 2:
            //eseguo la funzione
                print_all(warehouse, prezzo, media, massimo); /* MI DA ERRORRE DI SINTASSI, XKE????*/
            //e stampo cio' che ho elaborato in questa, cioe' media e prezzo max
                printf("\n\tIl prezzo medio e' %.2f || Quello massimo e' %.2f\n\n", media, massimo);
                break;
        //se comando = 3
            case 3:
            //eseguo la funzione
                caso=update_product(warehouse,prezzo,prodotto,nuovo_prezzo);
            //se ottengo un riscontro, aggiorno il prezzo da dentro e la funzione
                if(caso==1)
                    printf("\n\tPrezzo Aggiornato!\n");
            //se non ottengo riscontro e' perche' l'oggetto non e' presente nel warehouse
                else if(caso==0)
                    printf("\n  Il prodotto inserito non e' presente nel warehouse.\n\n");
             //se si eseguisse mai il seguente caso, vuol dire che c'è un bug nel programma!!!
                else if(caso==-1)
                    puts("\nERRORE!!!\n");
                break;
        //come [caso 3]
            case 4: /* !!!!NON FUNGE!!!!*/
                caso=remove_product(warehouse,prezzo,prodotto);
                if(caso==1)
                    printf("\n\tProdotto Rimosso!\n");
                else if(caso==0)
                    printf("\n  Il prodotto inserito non e' presente nel warehouse.\n\n");
                else if(caso==-1)
                    puts("\nERRORE!!!\n");
                break;
        //se comando=5 allora esco
            case 5:
                exit=1;
                break;
        //qualsiasi altro valore di comando non sara' accettato e riporterà ad inizio ciclo
            default:
                puts("\nil comando inserito non e' valido. Riprova!\n");
                break;
        }
    }
    while(exit==0);

    return 0;
}

//Da qui in poi definisco le funzioni

// CASE 1 - INSERIRE UN NUOVO PRODOTTO
int insert_product(char products[][M], float price[], char new_product[])
{
//'duplicato' mi segnalerà se ho elementi già presenti nel warehouse
//'risultato' rappresenterà il valore di ritorno della funzione
//'i' è un contatore per il ciclo for
    int duplicato=0, risultato=-1, i;
//chiedo di inserire l'elemento e lo acquisisco
    printf("\nInserisci il nuovo prodotto: ");
    gets(new_product);
//tramite ciclo for scandisco il warehouse finché non arrivero' alla fine del warehouse
//o scoprirò che l'elemento immesso è un doppione o ancora se ho stabilito che non è doppione
    for( i=0 ;(i<N) && (duplicato==0) && (risultato==-1); i++ )
    {
    //se il prezzo è diverso da -2 vuol dire che è stato già immesso un rispettivo elemento 'i' nel warehouse
        if(price[i]!=-2)
        {
        //controllo se il nuovo elemento e' gia' presente fra tutti gli elementi immessi
            if(strcmp(new_product, products[i])==0)
            {
            //se e' cosi, vuol dire che ho un doppione:
            //con 'duplicato=1' esco dal ciclo for e ritorno 'risultato=0' a significare che ho un doppione
                duplicato=1;    risultato=0;
            }
        }
    //se arrivo ad un elemento con prezzo = a 2, vuol dire che non ho trovato alcun doppione
        else if(price[i]==-2)
        {
        //dunque copio il nuovo elemento nel warehouse
            strcpy(products[i],new_product);
        //mi segno che ho assegnato questa posizione ad un elemento e ritorno l'acquisizione di un nuovo elemento.
            price[i]=-1; risultato=1;
        }
    }
    return risultato;
}

// CASE 2 - STAMPARE LISTA PRODOTTI E CALCOLO MEDIA
void print_all(char products[][M], float price[], float *avg, float *max)
{
//'i' è un contatore per il ciclo for
    int i;
//stampo una tabella prodotto/prezzo
    printf("\n\t[prodotto]\t[prezzo]\n\n");
    for(i=0;price[i]!=-2;i++)
    {
    //riga per riga con elemento del warehouse e prezzo
        printf("\t[%s]\t\t[%.2f euro]\n", products[i], price[i]);
    //sommo tutti i prezzi e li vado a memorizzare nella cella di memoria puntata
        avg=avg+price[i];
    //e vado ad analizzare qual'e' il prezzo max confrontandolo passo passo
        if(price[i]>max)
            max=price[i];
    }
    //dunque divido il contenuto del puntatore (la media) per il numero di interazioni (elementi)
        avg=avg/i;
//non ritorno niente, perché ho riscritto i valori direttamente nelle celle di memoria di avg, la variabile dichiarata nel main.
    return;
}

// CASE 3 - MODIFICARE PREZZI
int update_product(char products[][M], float price[], char product[], char new_price[])
{
//'i' è un contatore per il ciclo for
//'risultato' rappresenterà il valore di ritorno della funzione
    int i, risultato=-1;

    printf("\n  Inserisci prodotto di cui si vuole modificare il prezzo: ");
    gets(product);
//scandisco la matrice di caratteri e vedo se il prodotto inserito e' nel warehouse
    for(i=0 ; (i<N) && ((strcmp(product,products[i]))!=0) && (price[i]!=-2) ; i++);
//verifico se sono uscito dal for perche' ho effettivamente trovato il prodotto inserito
   if((strcmp(product,products[i]))==0)
    {
    //se si, chiedo di modificare il prezzo
        printf("\n  Inserisci il prezzo in euro: ");
        gets(new_price);
    //converto il prezzo in un valore float e ritorno '1' in quanto ho avuto un riscontro
        price[i]=atof(new_price);
        risultato=1;
    }
//altrimenti ritorno '0' poiche' non ho avuto alcun riscontro
    else
        risultato=0;

    return risultato;
}

// CASE 4 - ELIMINARE VOCI                                  !!!NON VA!!!
int remove_product(char *products[][M], float *price[], char old_product[])
{
//'i' è un contatore per il ciclo for
//'risultato' rappresenterà il valore di ritorno della funzione
    int i, risultato=-1;


    printf("\n  Inserisci prodotto che si vuole eliminare: ");
    gets(old_product);
//scandisco la matrice di caratteri e vedo se il prodotto inserito e' nel warehouse
    for(i=0 ; (i<N) && ((strcmp(old_product,products[i]))!=0) && (price[i]!=-2) ; i++);
//verifico se sono uscito dal for perche' ho effettivamente trovato il prodotto inserito
    if((strcmp(old_product,products[i]))==0)
    {
        for( ;price[i]==-2;i++)
        {
            strcpy(products[i],products[i+1]);
            price[i]=price[i+1];
        }
        risultato=1;
    }
//altrimenti ritorno '0' poiche' non ho avuto alcun riscontro
    else
        risultato=0;

    return risultato;
}
i problemi nel mio codice sono relativi:
- al case 4: (non riesco a cancellare le stringhe)... il mio ragionamento è di "scalare" di una posizione tutte le stringhe della matrice successive a quella scelta, in maniera da sovrascriverla

- al case 2: mi da errori di compilazione che non riesco a capire! come funzionano sti maledetti puntatori??? :\

in più ci sono warning un po' sparsi dappertutto :\... grazie mille a chi tenterà di aiutarmi :P


EDIT - RISOLTO!!! potete chiudere

Ultima modifica di gargoyle00 : 26-05-2011 alle 15:12. Motivo: risolto!
gargoyle00 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Anthropic ha un'AI che trova falle in Wi...
I 10 migliori sconti Amazon del weekend:...
Con un coupon scendono ancora: le super ...
Minimo storico per Samsung Galaxy S26 Ul...
Si è conclusa la missione lunare ...
EK Waterblock si arrende agli aumenti, i...
Geekbench si aggiorna: tutti i test con ...
Per la prima volta un computer quantisti...
Telecamere Reolink 4K su Amazon: Wi-Fi 6...
Anthropic vuole farsi i chip da sola? Co...
Il fondatore di Framework: il personal c...
JBL Live Flex 3 a 129€ su Amazon: ANC ad...
Come un uomo ha costruito un'azienda da ...
Multe fino a 400 euro anche se hai pagat...
Tapo lancia una valanga di offerte su Am...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:14.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v