Professore rompiscatole

Ener2
Salve
Ho svolto questo esercizio che dice prendendo da imput da tastiera, di costruire una struttura dati con le provincie e alla fine stamparle in output in forma tabulare
l'esercizio è svolto sotto ma il professore rompe perchè dice che dobbiamo svolgerlo assolutamente senza puntatori
Ho provato a rimuovere le frecce e aggiungere i punti ma la stampa non funziona
Chiedo il vostro aiuto
Grazie
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TUTTE 5

typedef struct 
{
        char capoluogo[ 25 ];
        long int popolazione;
        long int superficie;
        int comuni;
        }    tipoProvincia; 
        

typedef struct
{
        tipoProvincia array[ TUTTE ];
        int quanteProvince;
        }   tipoTabella;
        
int aggiungiProvincia( tipoTabella *t );
void stampaProvincia( tipoProvincia t );
void stampaTabella( tipoTabella t );
void salvaTabella( tipoTabella t );

int main()
{
    tipoTabella tabellaProvince;
    tabellaProvince.quanteProvince = 0;
    int scelta, successo;
    do
    {
        printf( "Fai la tua scelta:\n" 
                "      1 per aggiungere una provincia del lazio alla tabella.\n"
                "      2 per stampare la tabella delle province.\n"
                "      3 per salvare la tabella in un file di testo.\n"
                "        0 per uscire.\n\n" );
        scanf( "%d", & scelta );
        switch( scelta )
        {
                case 1:
                     successo = aggiungiProvincia( &tabellaProvince );
                     if( successo );
                     break;
                case 2:
                     stampaTabella( tabellaProvince );
                     break;
                case 3:
                     salvaTabella( tabellaProvince );
                     break;
                case 0: 
                     
                     break;
                default:
                        printf( "Errore.\n\n" );
                        break;
                        } 
                        } while( scelta != 0 ); 
    return 0;
}

int aggiungiProvincia( tipoTabella *t )
{
    if( t->quanteProvince != TUTTE )
    {
        printf( "Capoluogo? " );
        scanf( "%s", t->array[ t->quanteProvince ].capoluogo );
        printf( "Popolazione? " );
        scanf( "%d", &t->array[ t->quanteProvince ].popolazione );
        printf( "Superficie? " );
        scanf( "%d", &t->array[ t->quanteProvince ].superficie );
        printf( "Comuni? " );
        scanf( "%d", &t->array[ t->quanteProvince ].comuni );
        t->quanteProvince++;
        }
    return 1;
}

void stampaProvincia( tipoProvincia t )
{
     printf( "La provincia %s ha una popolazione di %d abitanti.\n", t.capoluogo, t.popolazione );
     printf( "La provincia %s ha una superficie di %d chilometri quadrati.\n", t.capoluogo, t.superficie );
     printf( "Nella provincia %s ci sono %d comuni.\n\n", t.capoluogo, t.comuni );
     }

void stampaTabella( tipoTabella t )
{
     int i;
     printf( "Tabella delle province:\n\n" );
     for( i = 0; i < t.quanteProvince; i++ )
     {
          stampaProvincia( t.array[ i ] );
          printf( "La provincia %s ha una densita' di %d abitanti per chilometro quadrato.\n\n", t.array[ i ].capoluogo, t.array[i].popolazione/t.array[i].superficie);
          }
     return;
     }

void salvaTabella( tipoTabella t )
{
     int i;
     FILE *fPtr;
     fPtr = fopen( "Province.txt", "w" );
     if( fPtr != NULL )
     {
         fprintf( fPtr, " Capoluogo, Popolazione, Superficie, Comuni e Densità:\n\n" ); 
         for( i = 0; i < t.quanteProvince; i++ )
         {
              fprintf( fPtr, "%s, ", t.array[ i ].capoluogo );
              fprintf( fPtr, "%d, ", t.array[ i ].popolazione );
              fprintf( fPtr, "%d, ", t.array[ i ].superficie );
              fprintf( fPtr, "%d, ", t.array[ i ].comuni );
              fprintf( fPtr, "%d\n\n",t.array[ i ].popolazione/t.array[ i ].superficie  );
              }
         fclose( fPtr );
         }
     return;
     }
  

Risposte
ebrunaway
Il fatto e' che, non potendo usare puntatori, aggiungiProvincia() e' costruita male, perche' ha come argomento un puntatore alla tabella.
Se l'uso dei puntatori e' l'unica limitazione implementativa, una soluzione banale potrebbe essere usare funzioni differenti, una per ciascuna voce della struttura (popolazione, superficie, comuni, tranne per il nome, che in quanto array di caratteri richiederebbe ancora una volta l'uso dei puntatori, quindi andrebbe gestito dopo esser entrati nel ramo "aggiungi") il cui valore di ritorno puo', a questo punto, essere utilizzato per riempire le voci della tabella senza uso dei puntatori.
Una soluzione alternativa potrebbe esser fatta con variabili globali, o magari, se dev'esser piu' raffinata, implementando uno stack.

Comunque salvaTabella() non e' richiesta dall'esercizio, giusto? Perche' l'utilizzo di FILE e' tutta una questione di puntatori.

Ener2
di che tipo di funzioni differenti stiamo parlando??
per quanto riguarda salvaTabella non è obbligatorio mentre le pile non le ha spiegate per niente, manco accennate!!!

ebrunaway
per esempio getPopolazione(), getSuperficie(), getComuni().
int getPopolazione(void){
   int popolazione;
   printf("Popolazione?");
   scanf("%d", &popolazione);

   return popolazione;
}

E all'interno del main assegni alla struttura tabellaProvincie.array.popolazione = getPopolazione();
Le altre funzioni le strutturi allo stesso modo e le esegui dopo ogni assegnamento. Il risultato e' identico, il codice non e' dei migliori, ma non accedi alla tabella usando puntatori.
A questo punto comunque dovresti inserire sul case anche un sistema di gestione dell'indice dell'array per evitare overflow e sovrascritture quando non richieste.

Ener2
ok grazie dell'aiuto!!!
appena svolto il tutto vi farò sapere

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.