Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine
Dopo anni di attesa e una lunga fase di sviluppo, Noctua entra nel mercato dei dissipatori a liquido AIO con la nuova serie NL-LC1. Forte dell'esperienza maturata nel raffreddamento ad aria, l'azienda austriaca promette di portare la propria filosofia fatta di qualità costruttiva, attenzione ai dettagli e silenziosità anche in questo segmento. Abbiamo provato il nuovo sistema per scoprire se riesce a distinguersi in un mercato ormai molto competitivo.
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super
Arrivato sul mercato italiano a fine marzo, la serie Boox Go 10.3 (Gen II) offre Android 15, penna da 4096 livelli e retroilluminazione opzionale (nel modello da noi provato, Lumi, presente). La serie si compone di due tablet ePaper che fanno da e-reader, blocco note digitale e persino browser, tutto a un prezzo che fa dimenticare i prodotti di brand più blasonati
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Pannello QD-OLED da 32 pollici con risoluzione 4K, frequenza di aggiornamento a 240Hz e tempi di risposta rapidissimi: il Gigabyte MO32U24 evolve il progetto del suo predecessore MO32U e alza ulteriormente l'asticella delle prestazioni. È ancora una volta un monitor indirizzato ai giocatori più esigenti
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


NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine NL-LC1 è il primo dissipatore a liquido A...
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con ...
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming Gigabyte MO32U24 OLED: il 4K a 240Hz su un panne...
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
Intel 18A-P è già in fase ...
Logitech G305 Lightspeed e G316 X 98: 8....
Qualcomm Snapdragon Reality Elite uffici...
Snapdragon START: arriva la piattaforma ...
Kioxia Exceria G3: il modella da 4 TB &e...
Gemini 3.5 Flash delude nei test Android...
DREAME X50 Ultra Complete a 749€ per il ...
Prezzi console handheld alle stelle: la ...
Toyota presenta il primo pickup elettric...
Prime Day anticipato, tutti gli smartpho...
Dyson V10 Konical: il primo aspirapolver...
FSR 4.1 su Radeon 6000, AMD spiega perch...
Hisense svela la gamma TV 2026: RGB Mini...
Narwal lancia gli sconti Prime Day 2026:...
SpaceX ha comprato Cursor: accordo da 60...
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: 07:01.


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