Problema programma linguaggio C

di il
10 risposte

Problema programma linguaggio C

Sto provando a scrivere il codice delle funzioni e fare in modo che possano essere utilizzate in un progrmma ma ho diversi problema. Ho realizzato le funzioni come descritte nel testo dell'esercizio:
Le richieste per alloggi studenti possono essere gestite attraverso le seguenti costanti e strutture:

const int MAXRIC = 100;
const int MAXS = 100;

typedef enum {Singola, Doppia} Tipo;

typedef struct{
char nome[MAXS];
char cognome[MAXS];
Tipo tipo;
int punti;
} Richiesta;

typedef struct{
Richiesta ric[MAXRIC];
int numRich;
} InsiemeRichieste;


La struttura Richiesta si compone di:
un campo nome che contiene il nome dello studente che chiede un alloggio, il campo cognome che contiene il cognome dello studente stesso, un campo tipo che indica il tipo di alloggio richiesto (Singola o Doppia) e infine un campo punti che determinerà la sua posizione in graduatoria.
La struttura InsiemeRichieste è composta da due campi: un array ric che contiene i dati delle richieste, e il campo numRich che indica il numero di richieste effettivamente presenti.

Scrivere il corpo delle seguenti funzioni C:

1. int inserisci(InsiemeRichieste* pi, const char no[], const char co[], Tipo ti, bool fu, float re, float me) che inserisce nell'insieme una nuova richiesta di alloggio. La nuova richiesta può essere inserita solo se c'è spazio disponibile nell'insieme.
I parametri no e co indicano rispettivamente il nome e il cognome dello studente che fa la richiesta. Il parametro ti indica se lo studente vuole una camera singola o una doppia.
Il parametro fu indica se lo studente è fuorisede (1) oppure no (0). Il parametro re indica il reddito della sua famiglia. Il parametro me indica la media dei voti dello studente. I parametri fu, re e me vengono usati per calcolare i punti da associare alla richiesta.
In particolare:
Se lo studente è fuorisede vengono attribuiti 5 punti, 0 se non lo è.
Se il reddito della famiglia è minore di 10000 vengono attribuiti 5 punti, se il reddito della famiglia è maggiore o uguale a 10000 ma minore di 20000 vengono attribuiti 2 punti, se il reddito è maggiore di 20000 non vengono attribuiti punti.
Per quanto riguarda la media, vengono attribuiti punti in quantità pari alla differenza tra la media arrotondata all'intero più vicino e 18 (per esempio, se lo studente ha come media 23.3 gli verranno attribuiti 5 punti).
Quando una nuova richiesta viene inserita nell'array ric, questa deve essere inserita in modo tale da lasciare tale array ordinato per valori decrescenti del campo punti. La funzione restituisce 1 se l'inserimento va a buon fine, 0 altrimenti.
Suggerimento: utilizzare una funzione separata per il calcolo dei punti di una richiesta.
2. int alloggioDisponibile(InsiemeRichieste* pi, Tipo ti) che elimina dall'insieme delle richieste quella che ha il maggior numero di punti e che corrisponde al tipo indicato da ti. La rimozione di una richiesta implica un ricompattamento del contenuto dell'array ric, avendo cura di non perturbare l'ordinamento delle richieste.
La funzione restituisce 1 se una richiesta viene rimossa, 0 altrimenti.
Ma sono rimasto bloccato a causa di vari errori del compilare e non riesco ad andare avanti nella scrittura del codice. Qualcuno potrebbe darmi una mano? vi posto il testo del codice che ho scritto fin ora:
#include <stdio.h>
#include <stdlib.h>

const int MAXRIC =100;
const int MAXS = 100;

typedef enum {Singola, Doppia} Tipo;


typedef struct{
        char nome[MAXS];
        char cognome[MAXS];
        Tipo tipo;
        int punti;
        }Richiesta;


typedef struct{
        Richiesta ric[MAXRIC];
        int numRich;
        } InsiemeRichieste;
        
     //   int inserisci(InsiemeRichieste* pi, cont char no[], const char co[], Tipo ti, bool fu, float re, float me)

 int main(){
              int calcolaPunti(int fuorisede, float reddito, float media){
                     int p=0;
                     if(fuorisede)p+=5;
                     if(reddito<20000)p+=2;
                                        
                     float x;
                     x=round(media);
                     x-=18;
                     p+=x;
                     return p;
                     }
                     
                     int inserisci(InsiemeRchieste* pi, const char no[], const char co[], Tipo ti, int fu, float re, float me){
                         
                         if(pi->numRich == MAXRIC) return 0;
                         Richiesta r;
                          strcpy(r.nome,no) // copia no su r.nome
                          strcpy(r.cognome,co)
                         r.tipo = ti;
                         r.punti = calcolaPunti(fu,re,me);
                      
                         for(int i=0; i<pi->numRich && r.punti<=pi->ric[i].punti; i++);
                         for (int j=0; j=pi->ric[j-1]; j>i; i--)
                         pi->ric[i]=r;
                         pi->numRich++;
                         return 1;
                         }
                         
                         
                         int allogioDisponibile(insiemeRichie* pi, Tipo ti){
                             for(int i=0; i<pi->numRich; i++)
                             if(pi->ric[i].tipo == ti){
                                                for(int j=i; j<pi->numRich-1; j++){
                                                        pi->ric[j]= pi->ric[j+1];
                                                        }
                                                        pi->numRich--;
                                                        return 1;
                                                        }
                                                        return 0;
                             }
                             
                             
                     
                          
                         char nome[30];
                         char cognome[30];
                         char tipostanza[30];
                         int  posizione; //fuorisede o no
                         int reddito;
                          float mediavoti;
                          
                          printf("Inserisc nome\n");
                         scanf("%s",&nome);
                          printf("Inserisc cognome\n");
                         scanf("%s",&cognome);
                         printf("Inserisci tipo stanza\n");
                         scanf("%s",&tipostanza); 
                         printf("Inserisci posizione se fuorisede o no\n");
                         scanf("%s",&posizione); 
                         printf("Inserisci reddito\n");
                         scanf("%d",&reddito); 
                         printf("Inserisci media dei voti\n");
                         scanf("%f",&reddito); 
                         
                         
                         
                         
                         
                                                    
                 
                    system("pause");
                        }
Non riesco a capire cosa manche e perchè mi dia vari errori. Ringrazio in anticipo chiunque tenti di aiutarmi.

10 Risposte

  • Re: Problema programma linguaggio C

    
    int main(){
                  int calcolaPunti(int fuorisede, float reddito, float media){
    
    dichiarazione e sviluppo di una funzione dentro un altra funzione non è permessa. Dichiari e sviluppi le funzioni fuori dal main.
  • Re: Problema programma linguaggio C

    Ho messo le funzioni fuori dal main ma se provo a compilare mi da comunque un altro errore in questa riga della prima funzione "calcolaPunti":
      
    int x;
    
    x=round(media);
    Ho ricontrollato più volte questa parte sembra che sia corretto ma il compilatore non l'accetta. Come mai?
  • Re: Problema programma linguaggio C

    Cos'è round(...)?
  • Re: Problema programma linguaggio C

    È una funzione di C che serve per arrotondare il valore per eccesso. Forse non funziona con tutti i compilatori però anche se lo escludo non funziona e non capisco il perchè
  • Re: Problema programma linguaggio C

    Metti il codice completo com'è adesso.
  • Re: Problema programma linguaggio C

    Ecco il codice :
    #include <stdio.h>
    #include <stdlib.h>
    
    const int MAXRIC =100;
    const int MAXS = 100;
    
    typedef enum {Singola, Doppia} Tipo;
    
    
    typedef struct{
            char nome[MAXS];
            char cognome[MAXS];
            Tipo tipo;
            int punti;
            }Richiesta;
    
    
    typedef struct{
            Richiesta ric[MAXRIC];
            int numRich;
            } InsiemeRichieste;
            
    
    
                  int calcolaPunti(int fuorisede, float reddito, float media){
                         int p=0;
                         if(fuorisede)p= p =+5;
                         if(reddito<20000)p=+2;
                                            
                      int x;
                        
                         x-=18;
                         p+=x;
                         return p;
                         }
                       
                         int inserisci(char InsiemeRichieste* pi, const char no[], const char co[], Tipo ti, int fu, float re, float me){
                             
                             if(pi->numRich == MAXRIC) return 0;
                             Richiesta r;
                              strcpy(r.nome,no) // copia no su r.nome
                              strcpy(r.cognome,co)
                             r.tipo = ti;
                             r.punti = calcolaPunti(fu,re,me);
                          
                             for(int i=0; i<pi->numRich && r.punti<=pi->ric[i].punti; i++);
                             for (int j=0; j=pi->ric[j-1]; j>i; i--)
                             pi->ric[i]=r;
                             pi->numRich++;
                             return 1;
                             }
                             
                             
                             int allogioDisponibile(insiemeRichi* pi; Tipo ti){
                                 for(int i=0; i<pi->numRich; i++)
                                 if(pi->ric[i].tipo == ti){
                                                    for(int j=i; j<pi->numRich-1; j++){
                                                            pi->ric[j]= pi->ric[j+1];
                                                            }
                                                            pi->numRich--;
                                                            return 1;
                                                            }
                                                            return 0;
                                 }
                                 
                                 
                         int main(){
                              
                             char nome[30];
                             char cognome[30];
                             char tipostanza[30];
                             int  posizione; //fuorisede o no
                             int reddito;
                              float mediavoti;
                              
                              printf("Inserisc nome\n");
                             scanf("%s",&nome);
                              printf("Inserisc cognome\n");
                             scanf("%s",&cognome);
                             printf("Inserisci tipo stanza\n");
                             scanf("%s",&tipostanza); 
                             printf("Inserisci posizione se fuorisede o no\n");
                             scanf("%s",&posizione); 
                             printf("Inserisci reddito\n");
                             scanf("%d",&reddito); 
                             printf("Inserisci media dei voti\n");
                             scanf("%f",&reddito); 
                             
                             
                             
                             
                             
                                                        
                     
                        system("pause");
                            }
    Ho messo le funzioni fuori dal main e tolto la funzione per l'arrotondamento
  • Re: Problema programma linguaggio C

    
    int x;
    x-=18;
    
    Non è valido. Qual'è il valore iniziale di x?
  • Re: Problema programma linguaggio C

    X prendeva il valore di round media. Grazie per avermi trovato anche questo errore. Però andando avanti continua bloccarsi.
    Nella riga:
    int Richiesta r;
    e il compilatore dice:
    In function `int inserisci(InsiemeRichieste*, const char*, const char*, Tipo, int, float, float)':
    `Richiesta' does not name a type
    `r' undeclared (first use this function)
    e una serie di altri errori ma più volte guardo il codice e più mi convinco che quelle parti siano corrette, non capisco proprio perchè non funzioni. è un problema del compilatore?
  • Re: Problema programma linguaggio C

    Se sei in C porta le definizioni all'inizio della funzione. Se in C++ quel errore non dovrebbe esistere come non esiste int Richiesta r, ma Richiesta r.
  • Re: Problema programma linguaggio C

    Grazie per le correzioni
Devi accedere o registrarti per scrivere nel forum
10 risposte