Programma parzialmente funzinante

di il
12 risposte

Programma parzialmente funzinante

Buongiorno.
Avrei una domanda da farvi. Sono sempre alle prese col mio primo programma: ho costruito una lista con puntatori, della qual dovrei stampare numero di elementi, somma di tutti gli elementi contenuti al suo interno e infine la Media.
Col vostro aiuto sono riuscito a occuparmi del primo passo. Ho provato poi, replicando il ciclo while costruito per sommare gli elementi, ad effettuare la conta e a richiamare le due variabili (totale e numero: somma delle variabili e loro numero) per farne la media, dividendone una per l'altra.
Il programma però continua ad effettuare solo la conta delle variabili e a stamparle .
Sapreste correggermi e spiegarmi cos'è che sbaglio affinché possa capire.
Grazie a tutti per la pazienza e per l'aiuto che mi date.

#include <stdio.h>
#include <malloc.h>
#include"stdafx.h"



//struttura della lista: preimpostata da C (studiala e basta)
struct elemento {
	int inf;
	struct elemento *next;
};


struct elemento *crea_lista();
void visualizza_lista(struct elemento*);
int totaleInf(struct elemento*);
int numeroinf(struct elemento*);


int main()
{
	struct elemento *lista; // puntatore della lista
	lista = crea_lista(); // crea la lista
	visualizza_lista(lista); // stampa la lista
	printf("%d\n", totaleInf(lista));
	printf("%d\n", numeroinf(lista));
	float media;
	int numero;
	int totale;

}

// strumenti per scorrere la lista:
struct elemento *crea_lista()
{
	struct elemento *p, *punt;
	int i, n;
	// permetto all'utente di aggiungere elementi alla mia lista
	printf("Specificare il numero di elementi... ");
	scanf("%d", &n);

	if (n == 0)
	{
		p = NULL; // lista vuota

	}
	else {
		/* creazione primo elemento */
		p = (struct elemento *)malloc(sizeof(struct elemento));
		printf("Inserisci il primo valore: ");
		scanf("%d", &p->inf);

		punt = p;
		// se la lista non è vuota ggiungo il primo elemento
		/* creazione elementi successivi */
		for (i = 1; i < n; i++)
		{
			punt->next = (struct elemento *)malloc(sizeof(struct elemento));
			punt = punt->next;
			printf("Inserisci il %d elemento : ", i + 1);
			scanf("%d", &punt->inf);
		} // chiudo il for

		punt->next = NULL; // marcatore fine lista

	} // chiudo l’if-else
	return(p);
} // chiudo la funzione

void visualizza_lista(struct elemento *p)
{
	printf("%s", "lista = ");

	// ciclo di scansione
	while (p != NULL)
	{
		printf("%d ", p->inf); // visualizza l’informazione  
		p = p->next; // scorre di un elemento
	}

	printf("%c", '\n');
}

int totaleInf(struct elemento * p) {
	printf("%s", "totale = ");

	int totale = 0;

	while (p != NULL)
	{
		totale += p->inf;
		p = p->next;
	}

	return totale;
	
	int numeroinf(struct elemento * p) {
		printf("%s", "numero = ");

		int numero = 0;

		while (p != NULL)
		{
			numero = p->inf + 1;
			p = p->next;
		}
	return numero;
}
	//calcolo della media
	media = totale / numero;
	return media;

}

12 Risposte

  • Re: Programma parzialmente funzinante

    Scope delle variabili e delle funzioni...ti butti su liste e puntatori senza avere chiaro come funzionano le variabili. Non va bene. Dichiarare una variabile nel main non ti permette di utilizzarla automagicamente in una funzione.
    
    
    int main()
    {
       struct elemento *lista; // puntatore della lista
       lista = crea_lista(); // crea la lista
       visualizza_lista(lista); // stampa la lista
       printf("%d\n", totaleInf(lista));
       printf("%d\n", numeroinf(lista));
       
       int numero = ...
       int totale = ...
      float media = ... 
    }
    
    
    
    int totaleInf(struct elemento * p) {
       printf("%s", "totale = ");
    
       int totale = 0;
    
       while (p != NULL)
       {
          totale += p->inf;
          p = p->next;
       }
    
       return totale;
      }
    
       int numeroinf(struct elemento * p) {
          printf("%s", "numero = ");
    
          int numero = 0;
    
          while (p != NULL)
          {
             numero += 1;
             p = p->next;
          }
       return numero;
    }
    
    
    Prova a sostituire le cose corrette al posto dei puntini.
  • Re: Programma parzialmente funzinante

    Le sto dichiarando come variabili locali e quindi non riesce a vederle nelle funzioni e viceversa?
    So che ha seconda di dove avviene la dichiarazione la variabile ha una campo di variabilità (scope)
    Ogni sottoprogramma può avere delle variabili e queste variabili hanno validità nel blocco in cui sono definite e nei blocchi sottostanti, se in questi non sono definite variabili omonime.
    Dovendo effettuare la media, che riguarda variabili definite in più sottoprogrammi, nel mio caso funzioni create per operare sulla lista.
    avrò necessariamente bisogno di ridefinirle in modo globale in modo da poterle usare nel calcolo finale.
    E' qua che entra in gioco l'istruzione che mi ha dato: aggiungere le tre variabili nella dichiarazione interna a "int main".
    mi scuso se per questo "soliloquio" ma ho davvero bisogno di capire.
    Per quanto riguarda la dichiarazione in se': i due interi che riguardano la conta e la somma interne alla lista sono ovviamente degli interi, a meno che i non inserisca un'altra classe di numeri quando il programma me lo richiede, e poi ho il float della media.
    Nella dichiarazione non è sufficiente il tipo ma dovrà rimandare ai risultati ottenuti dai due cicli ?
    Grazie anccora per il tempo che mi dedicate e mi scuso per eventuali assurdità e ovvietà scritte
  • Re: Programma parzialmente funzinante

    bernardo ha scritto:


    So che ha seconda di dove avviene la dichiarazione la variabile ha una campo di variabilità (scope)
    ... a seconda ... campo di visibilità ...

    Mi dispiace ma tutto il resto del discorso non l'ho proprio capito.

    Ma una cosa mi lascia perplesso ... il tuo primo programma è su liste e puntatori?
  • Re: Programma parzialmente funzinante

    Come devono essere dichiarate affinché funzioni?
  • Re: Programma parzialmente funzinante

    Hai letto quello che ti ha suggerito jfet ?
  • Re: Programma parzialmente funzinante

    Si, ho corretto il ciclo però non capisco come debba dichiarare le variabili, perché il programma continua a non eseguirmi la media alla fine
  • Re: Programma parzialmente funzinante

    Cosa hai scritto adesso? Qual è il nuovo codice completo?
  • Re: Programma parzialmente funzinante

    Ho provato a ripartire, senza usare i due cicli che continuavano a non funzionare
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct list {
    int value;
    struct list * next_ptr;
    };
    void init(struct list ** ptrptr);
    void pre_insert(struct list ** ptrptr, int value);//uso inserimento in testa
    float meanList(struct list * ptr);
    void getvalue(float *value_ptr);
    void notify_selection_failure(char selection);
    main(){
    struct list *lista;
    int size, value;
    size = 5;
    char selection[10];
    Boolean exit_required = FALSE;
    int inserimento = 0;
    int numeroElem =0;
    float sum = 0;
    init(&lista); . }
    
    main(){
    struct list *lista;
    … init(&lista);
    printf("Digita uno dei seguenti caratteri:\n");
    printf("-A per avere la media degli alementi nella lista\n");
    printf("-a per fare un inserimento in testa\n");
    printf("-x per uscire dal programma\n");
    do(
    printf("\nChe operazione vuoi fare? ");
    scanf("%s", selection);
    switch (selection[0]) {
    case 'A'://Calcolo del valore medio degli elementi nella lista
    sum = meanList(lista);
    printf("Ecco la media: %f", sum);
    break;
    case 'a':
    getvalue(&value); //inserimento in coda
    suf_insert(&lista, value);
    break; …
    }
    ) while (exit_required == FALSE);
    }
    
     main(){ 
    do(
    printf("\nChe operazione vuoi fare? ");
    scanf("%s", selection);
    switch (selection[0]) {
    case 'A'://Calcolo del valore medio degli elementi nella lista
    sum = meanList(lista);
    printf("Ecco la media: %f", sum);
    break;
    case 'a':
    getvalue(&value); //inserimento in coda
    suf_insert(&lista, value);
    break; …
    case 'x':
    exit_required = TRUE;
    break;
    default:
    notify_selection_failure(selection[0]);
    }
    ) while (exit_required == FALSE);
    }
    
    //lista collegata con puntatori
    void init(struct list ** ptrptr) {
    *ptrptr = NULL;
    }
    //inserimento in coda
    void suf_insert(struct list ** ptrptr, int value) {
    // inserimento in coda. 
    while (*ptrptr != NULL) {
    ptrptr = &((*ptrptr)->next_ptr);
    }
    pre_insert(ptrptr, value);
    }
    
    float meanList(struct list * ptr) {
    float sum = 0;
    int numElem = 0;
    while (ptr != NULL) {
    sum += ptr->value;
    numElem++;
    ptr = ptr->next_ptr;
    }
    return sum / numElem;
    }
    
    void getvalue(int *value_ptr) {
    //acquisisce un float da tastiera (passaggio per puntatore)
    printf("Inserisci un valore: ");
    scanf("%d", value_ptr);
    }
    void notify_selection_failure(char selection) {
    //notifica il fallimento della selezione
    printf("\n%c Selezione non legale!", selection);
    }
    
  • Re: Programma parzialmente funzinante

    Ho fatto gli stessi passaggi: ho visitato la lista sommando gli elementi
    ho aggiunto il contatore che li somma via via
    con il rapporto finale tra i due valori dovrei ottenere la media
  • Re: Programma parzialmente funzinante

    Ma ci sono più main !

    E un gran numero di altri errori (Boolean cosa è?) ...

    Il codice NON è neanche compilabile ...
  • Re: Programma parzialmente funzinante

    Per i main ho sbagliato a copiare. scusami.
    volevo usare boolean per escludere errori dovuti al mancato inserimento dei valori, dichiarandolo come vero o falso
    non lo faccio apposta per farvi perdere tempo.
    Ho capito quello che mi ha scritto e infatti lo usato per correggere il secondo ciclo che avevo sbagliato, ma non so cosa sostituire alle tre variabili che ha aggiunto nel main.
    ho guardato 100 esempi diversi ma non ho trovato il modo di risolvere
  • Re: Programma parzialmente funzinante

    Se non posti del codice "almeno" compilabile e sintatticamente corretto, non è possibile dari una risposta sensata.
Devi accedere o registrarti per scrivere nel forum
12 risposte