Visualizzazione dei risultati da 1 a 3 su 3

Discussione: Aiuto programmino C

  1. #1

    Aiuto programmino C

    Ragazzi, ho un problema con un programmino di esercitazione in C che non riesco a risolvere. Praticamente non riesco a calcolarmi il numero di elementi di una lista per effettuare un confronto tra stringhe. Utilizzando il debugger mi viene fuori che il valore di numElementi è un numero spropositato quando la lista è al massimo di 2-3 elementi (nelle prove). Di seguito posto il codice.
    Sorgente dei sottoprogrammi:
    codice:
    #include <stdio.h>#include <stdlib.h>
    
    
    #include "listaPtrc.h"
    
    
    // SOTTOPROGRAMMI DI SERVIZIO:
    //---------------------------
    
    
    void aggiungiInTesta(lista* plista, tipoValori elem);
    lista puntatoreAllUltimo(lista l);
    lista puntatoreAllaPos (lista l, int pos);
    boolean posizioneEsistente (lista l, int pos);
    void errore(char* messaggio);
    
    
    //---------------------------
    
    
    void inizializza (lista* plista) {
        *plista = NULL;
        return;
    }
    
    
    void leggi (lista* plista) {
        int i, numero;
        tipoValori valore;
        printf("\nLettura dei valori della lista\n");
        printf("------------------------------\n");
        printf("Quanti valori contiene la lista ? ");
        scanf("%d", &numero);
        while (numero < 0) {
            printf("ERRORE: VALORE NON AMMESSO\n");
            printf("Il valore deve essere maggiore o uguale di 0 ");
            printf("Immetti valore corretto: ");
            scanf("%d", &numero);
        }
        inizializza(plista);
        for (i = 0; i < numero; i++) {
            printf("--Immetti il valore n.%d:", i);
            leggiValore(&valore);
            aggiungiInCoda(plista, valore);
        }
        return;
    }
    
    
    void leggiValore(tipoValori* valore) {
        printf("Codice del prodotto: ");
        scanf("%s", valore->codice);
        printf("Marca del prodotto: ");
        scanf("%s", valore->marca);
        printf("Descrizione del prodotto: ");
        scanf("%s", valore->descrizione);
        printf("Numero di prodotti presenti in magazzino: ");
        scanf("%d", valore->quantita);
    }
    
    
    void stampa (lista l) {
        int i = 0;
        lista p = l;
        printf("\nStampa dei valori della lista\n");
        printf("-----------------------------\n");
        if (listaVuota(l)) {
            printf("Lista vuota\n");
        } else {
            while (p != NULL) {
                printf("--Valore n.%d: ", i);
                stampaValore(p->valore);
                p = p->next;
                i++;
            }
        }
        return;
    }
    
    
    void stampaValore(tipoValori valore) {
        printf("/n Codice del prodotto: %s", valore.codice);
        printf("Marca del prodotto: %s", valore.marca);
        printf("Descrizione del prodotto: %s", valore.descrizione);
        printf("Quantità del prodotto in magazzino: %d", valore.quantita);
    }
    /*
    void salva (lista l, char* nomeFile) {
        int i;
        lista p = l;
        FILE* outFile;
        //printf("Salvataggio nel file: -%s-", nomeFile);
         outFile = fopen(nomeFile, "w");
        while (p != NULL) {
            salvaValore(outFile, p->valore);
            p = p->next;
        }
        fclose(outFile);
        return;
    }
    
    
    void salvaValore(FILE* outFile, tipoValori valore) {
        fprintf(outFile, "Codice del prodotto: %s \n", valore.codice);
        fprintf(outFile, "Marca del prodotto: %s \n", valore.marca);
        fprintf(outFile, "Descrizione del prodotto: %s \n", valore.descrizione);
        fprintf(outFile, "Quantità del prodotto in magazzino: %d \n", valore.quantita);
    }
    
    
    void carica (lista* plista, char* nomeFile){
        int i;
        tipoValori valore;
        FILE* inFile;
        //printf("Caricamento dal file: -%s-", nomeFile);
        inFile = fopen(nomeFile, "r");
        inizializza(plista);
        while (TRUE) {
            if (caricaValore(inFile, plista) == FALSE) {
                break;
            }
        }
        fclose(inFile);
        return;
    }
    
    
    boolean caricaValore(FILE* inFile, lista* plista) {
        tipoValori valore;
        if (fscanf(inFile, "%f", &valore) == EOF) {
            return FALSE;
        }
        aggiungiInCoda(plista, valore);
        return TRUE;
    }
    */
    void aggiungiInCoda (lista* plista, tipoValori elem){
        lista p;
        if (listaVuota(*plista)) {
            aggiungiInTesta(plista, elem);
        } else {
            p = puntatoreAllUltimo(*plista);
            p->next = (lista)malloc(sizeof(elemento));
            if (p->next == NULL) {
                errore("Impossibile aggiungere elemento");
            } else {
                p->next->valore = elem;
                p->next->next = NULL;
            }
        }
        return;
    }
    
    
    void aggiungiInPosizione (lista* plista, tipoValori elem, int pos) {
        lista p;
        lista tmp;
        if (!posizioneEsistente(*plista, pos)) {
            if (pos != numeroElementi(*plista)) {
                errore("Posizione inesistente. Impossibile inserire");
            } else {
                aggiungiInCoda(plista, elem);
            }
        } else {
            if (pos == 0) {
                aggiungiInTesta(plista, elem);
            } else {
                p = puntatoreAllaPos (*plista, pos - 1);
                tmp = p->next;
                p->next = (lista)malloc(sizeof(elemento));;
                if (p->next == NULL) {
                    errore("Impossibile aggiungere elemento");
                    p->next = tmp;
                } else {
                    p->next->valore = elem;
                    p->next->next = tmp;
                }
            }
        }
        return;
    }
    
    
    void eliminaInCoda (lista* plista){
        elemento* tmp;
        if (listaVuota(*plista)) {
            errore("Lista vuota. Impossibile eliminare");
        } else {
            if ((*plista)->next == NULL) {
                tmp = *plista;
                *plista = NULL;
            } else {
                lista p = puntatoreAllaPos(*plista, numeroElementi(*plista) - 2);
                tmp = p->next;
                p->next = NULL;
            }
            free(tmp);
        }
        return;
    }
    
    
    void eliminaInPosizione (lista* plista, int pos){
        lista tmp;
        if (!posizioneEsistente(*plista, pos)) {
            errore("Posizione inesistente. Impossibile eliminare");
        } else {
            if (pos == 0) {
                tmp = *plista;
                *plista = (*plista)->next;
            } else {
                lista p = puntatoreAllaPos (*plista, pos - 1);
                tmp = p->next;
                p->next = p->next->next;
            }
            free(tmp);
        }
        return;
    }
    /*
    int cercaPosizione (lista l, tipoValori elem) {
        lista tmp = l;
        int i =  0;
        while (tmp != NULL) {
            if (confronta(tmp->valore,elem)) {
                return i;
            } else {
                tmp = tmp->next;
                i++;
            }
        }
        return -1;
    }
    
    
    boolean confronta(tipoValori val1, tipoValori val2) {
        return val1 == val2;
    }
    */
    int numeroElementi (lista l){
        lista tmp = l;
        int conta =  0;
        while (tmp != NULL) {
            tmp = tmp->next;
            conta++;
        }
        return conta;
    }
    
    
    tipoValori elementoInPosizione (lista l, int pos) {
        tipoValori valore;
        lista tmp = puntatoreAllaPos (l, pos);
        return tmp->valore;
    }
    
    
    boolean listaVuota (lista l) {
        return (l == NULL);
    }
    
    
    boolean listaPiena (lista l) {
        return FALSE;
    }
    
    
    
    
    // sottoprogrammi privati
    
    
    boolean posizioneEsistente (lista l, int pos){
        if (listaVuota(l)) {
            return FALSE;
        } else {
            return (pos >= 0 && pos < numeroElementi(l));
        }
    }
    
    
    elemento* puntatoreAllUltimo (lista l) {
        lista p = l;
        if (p != NULL) {
            while (p->next != NULL) {
                p = p->next;
            }
        }
        return p;
    }
    
    
    elemento* puntatoreAllaPos (lista l, int pos) {
        int i;
        lista p = l;
        if (p != NULL) {
            for (i = 0; i < pos; i++) {
                p = p->next;
            }
        }
        return p;
    }
    
    
    void aggiungiInTesta (lista* plista, tipoValori elem){
        lista tmp = *plista;
        *plista = (lista)malloc(sizeof(elemento));;
        if (*plista == NULL) {
            errore("Impossibile aggiungere elemento");
        } else {
            (*plista)->valore = elem;
            (*plista)->next = tmp;
        }
        return;
    }
    
    
    void errore(char* messaggio) {
        printf("***** ERRORE: %s\n", messaggio);
        exit(EXIT_FAILURE);
    }

  2. #2
    Sorgente:
    codice:
    #include <stdio.h>#include <stdlib.h>
    #include <string.h>
    
    
    #include "listaPtrc.h"
    
    
    void schermoMenu();
    int sceltaMenu(int* scelta);
    int contaMarca(char* marcaConfronto, lista l);
    void confrontaMarche(int* numM1, int* numM2, char* m1, char* m2);
    
    
    int main() {
        schermoMenu();
        return 0;
    }
    
    
    int sceltaMenu(int* scelta) {
    printf("-----------------------------\n");
    printf("           MENU              \n");
    printf("-----------------------------\n");
    printf("0. Esci\n");
    printf("1. Inserisci elementi\n");
    printf("2. Stampa elementi\n");
    printf("3. Calcola marche\n");
    printf("------------------------------\n");
    printf("Scelta --> \n");
    scanf("%d", scelta);
    while ((scelta < 0) && (scelta > 3)) {
        printf("ERRORE !! Inserisci un valore presente nel menu");
        scanf("%d", scelta);
        }
    return;
    }
    
    
    void schermoMenu() {
        boolean continua = TRUE;
        lista l;
        inizializza(&l);
        char m1[10], m2[10], marcaConfronto[10];
        int numM1, numM2;
        int conta,scelta;
        while (continua) {
            sceltaMenu(&scelta);
            switch (scelta) {
                case 0 :
                    continua = FALSE;
                case 1 :
                    leggi(&l);
                    break;
                case 2:
                    stampa(l);
                    break;
                case 3:
                    printf("Inserisci la prima marca da confrontare");
                    scanf("%s,", m1);
                    strcpy(marcaConfronto, m1);
                    contaMarca(&marcaConfronto, l);
                    numM1 = conta;
                    printf("Inserisci la seconda marca da confrontare");
                    scanf("%s,", m2);
                    strcpy(marcaConfronto, m2);
                    contaMarca(&marcaConfronto, l);
                    numM2 = conta;
                    confrontaMarche(numM1, numM2, m1, m2);
                    break;
            }
        }
        return;
    }
    
    
    int contaMarca (char* marcaConfronto, lista l) {
        int numElementi = numeroElementi(l);
        int i = 0;
        int conta = 0;
        tipoValori elemento;
        for(i = 0; i < numElementi; i++) {
            elemento = elementoInPosizione(l, i);
            if (strcmp(marcaConfronto, elemento.marca) == 0) {
                conta++;
            }
        }
    return conta;
    }
    
    
    void confrontaMarche (int* numM1, int* numM2, char* m1, char* m2) {
        if (&numM1 < &numM2) {
            printf ("Ci sono meno prodotti di marca   %s "  , &m1) ;
            printf (" che di marca   %s ", &m2 );
            } else if (numM1 > numM2) {
                     printf("Ci sono meno prodotti di marca %s " , &m2);
                     printf( " che di marca %s ", &m1);
              }         else {
                                printf("Ci sono lo stesso numero di prodotti di marca %s " , &m1);
                                printf(" e di marca %s ", &m2);
              }
        return;
    }

  3. #3
    codice:
    /*  listaPtr1c.h
      ----------------
      file delle intestazioni di una libreria per la gestione di liste
      di numeri reali rappresentate con record e puntatori
    
    
      Nota: la libreria e' stata scritta esclusivamente a scopo didattico
    */
    
    
    //COSTANTI GLOBALI:
    //-----------------
    
    
    #define TRUE 1
    #define FALSE 0
    
    
    typedef int boolean;
    
    
    struct prodotto {
        char codice[10];
        char marca[20];
        char descrizione[20];
        int quantita;
    };
    
    
    typedef struct prodotto tipoValori;
    
    
    struct selemento {
        tipoValori valore;
        struct selemento* next;
    };
    
    
    typedef struct selemento elemento;
    typedef elemento* lista;
    
    
    //PROCEDURE:
    //----------
      void inizializza (lista* plista);
      //--> inizializza la lista l alla lista vuota
      //lista* plista --> la lista
    
    
      void leggi (lista* plista);
      //--> effettua la lettura dei valori della lista l dalla tastiera
      //lista* plista --> la lista
    
    
      void leggiValore(tipoValori* valore);
      //--> effettua la lettura di un valore della lista l dalla tastiera
      //tipoValori* valore --> il valore
    
    
      void stampa (lista l);
      //--> effettua la stampa dei valori della lista l sullo schermo
      //lista l --> la lista
    
    
      void stampaValore (tipoValori valore);
      //--> effettua la stampa di un valore della lista l sullo schermo
      //tipoValori valore --> il valore
    
    
      void salva (lista l, char* nomeFile);
      //--> salva i valori della lista l in un file
      //lista l --> la lista
      //string nomeFile --> il nome del file
    
    
      void salvaValore(FILE* outFile, tipoValori valore);
      //--> salva un valore della lista l su file
      //tipoValori valore --> il valore
    
    
      void carica (lista* plista, char* nomeFile);
      //--> carica i valori della lista l da un file
      //lista* plista --> la lista
      //string nomeFile --> il nome del file
    
    
      boolean caricaValore(FILE* inFile, lista* plista);
      //--> carica un valore della lista l da file
      //tipoValori valore --> il valore
    
    
      void aggiungiInCoda (lista* plista, tipoValori elem);
      //--> aggiunge "elem" in coda ai valori della lista l se
      //    questo e' possibile; "esito" segnala la riuscita
      //    dell'operazione
      //lista* plista --> la lista
      //float elem    --> elemento da aggiungere
    
    
      void aggiungiInPosizione (lista* plista, tipoValori elem, int pos);
      //--> aggiunge "elem" ai valori della lista l in posizione pos se
      //    questo e' possibile; "esito" segnala la riuscita
      //    dell'operazione
      //lista* plista --> la lista
      //float elem    --> elemento da aggiungere
      //int pos  --> posizione in cui aggiungere
    
    
      void eliminaInCoda (lista* plista);
      //--> elimina l'elemento in coda alla lista l se
      //    questo e' possibile; "esito" segnala la riuscita
      //  dell'operazione
      //lista* plista --> la lista
    
    
      void eliminaInPosizione (lista* plista, int pos);
      //--> elimina un elemento in posizione "pos" dalla lista l se
      //    questo e' possibile; "esito" segnala la riuscita
      //  dell'operazione
      //lista* plista --> la lista
      //int pos  --> posizione in cui aggiungere
    
    
    //FUNZIONI:
    //---------
    
    
      int numeroElementi (lista l);
      //--> restitituisce il numero di elementi della lista l
      //lista l --> la lista
    
    
      tipoValori elementoInPosizione (lista l, int pos);
      //--> restituisce l'elemento in posizione pos
      //lista l --> la lista
      //int pos --> elemento da cercare
      //NOTA: si assume che pos sia minore del numero di elementi
      //      della lista, altrimenti si genera un errore
    
    
      boolean confronta(tipoValori val1, tipoValori val2);
    
    
      int cercaPosizione (lista l, tipoValori elem);
      //--> se "elem" e' contenuto nella lista l ne restituisce
      //    la posizione; -1 altrimenti; nel caso l'insieme
      //    "ins" contenga piu' occorrenze di "elem", viene
      //    restituita la posizione della prima occorrenza
      //lista l --> la lista
      //float elem    --> elemento da cercare
    
    
      boolean listaVuota (lista l);
      //--> restituisce true se la lista e' priva di elementi
      //lista l --> la lista
    
    
      boolean listaPiena (lista l);
      //--> restituisce true se la lista e' completamente piena
      //lista l --> la lista

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.