+ Rispondi al Thread
Pagina 1 di 3 123 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22

Discussione: Prenotazione camere

  1. #1
    pir
    pir non è in linea Novello
    Post
    12

    Prenotazione camere

    Ciao a tutti, mi chiamo Pir e sono nuovo in questo forum cui mi sono iscritto per migliorare le mie "competenze" informatiche di programmazione e a tal proposito inizio col chiedervi aiuto
    Premettendo che al liceo non ho studiato il linguaggio C perchè il nostro docente ha preferito virare su altri linguaggi più recenti e quindi (dovendolo studiare all'Università) ho provveduto ad arrangiarmi da autodidatta(con il corso siamo ancora ai vettori -abbiamo iniziato a ottobre-) ,ma ci sono delle cose che non ho idea di come risolvere.
    Ho visto alcuni temi d'esame del mio docente e ho provveduto a risolverli, tuttavia sono incappato in uno che mi ha dato dei guai.
    Il testo dice in sostanza che in un file ci sono delle camere d'hotel ed ogni riga contiene il <numero camera>, <numero di persone ospitabili> e un numero <1/0> (1 se occupata, 0 se libera). Da linea di comando sono dati dei parametri di questo tipo " 3 2 1 2" che significano che si vogliono prenotare 3 camere da 2,1,2 persone oppure 4 3 3 1 (4 camere da 3,3,1 persone). Si chiede di creare un programma che esegua queste sistemazioni tenendo a mente che le camere ospitano un numero persone pari al secondo numero della riga (in altri termini una camera per 2 persone non va bene per 1 persona) .
    Ora, io ho buttato giù il mio codice ma quando avevo quasi finito mi sono accorto del fatto che potrebbe accadere che una camera venga assegnata due volte. Ossia se avessi un file nel quale la prima riga è
    1 3 0 (cioè camera n1, 3 persone ospitabili, libera) facendo il classico ciclo while(fscanf()!=EOF) ecc la camera 1 potrebbe essere assegnata due volte se io mettessi in input 4 3 3 1. Come risolvere questo? ossia come fare in modo che la camera dopo essere stata assegnata non venga più considerata? Avevo pensato di aggiornare la lista ad ogni lettura cambiando lo 0 con 1 ma non ho idea di come fare.

    L'altro problema è che (dato che l'output deve essere il numero della camera e il numero di persone assegnate) io avevo pensato di usare due vettori ma non ho idea poi di come confrontare la loro dimensione (che sarà sempre uguale contenendo uno il numero della camera e l'altro quello degli ospitati) con il numero di camere richieste.
    Ossia potrebbe accadere che io voglia 3 camere di 2 , 1 ,1 persone e magari ce ne sono 2 che soddisfano la prima richiesta e con cui riempio i miei vettori ma non per la terza . Come faccio?

    Vi mostro il codice fino a dove ho scritto perchè poi non ho idea di cosa fare per quei 2 problemi , sicuramente ci saranno errori (magari anche gravi) spero possiate perdonarmi. studio C da soli 2 mesi

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define d 1000
    
    int main(int argc, const char* argv[])
    {
    FILE* fp;
    int ncam_f, noccup_f, stato_f; //variabili di lettura da file
    int i,parametri[d],n,flag; //non so a priori quante camere e quanti ospitanti richiederà l'utente
    int vett_r[d], noccup_r[d];             //struttura dati per il risultato 
     printf("camere e persone: ");
    scanf("%d%*c", &n); //lettura del numero camere richieste (dimensione del mio vettore parametri)
    
    
    for(i=0;i<n;i++){
    
    	scanf("%d%*c", &parametri[i]); //riempimento parametri
    }
    
    fp=fopen("camere1.txt", "r");
    if (fp==NULL){
    	printf("file non aperto correttamente");
    	return -1;
    }
    
    for(i=0;i<n;i++){ //ogni giro (pari al numero di camere che mi servono) confronto il parametro con tutte le righe e mi fermo qundo ne trovo una 
            flag=1;
    while(fscanf(fp, "%d %d %d", &ncam_f, &noccup_f, &stato_f )  !=EOF && flag==1){ //finchè ho righe da leggere 
    		if(noccup_f == parametri[i] && stato_f==0){ //cioè se combaciano gli ospiti possibili e la camera è libera
    			vett_r[i]=ncam_f;
    			noccup_r[i]=noccup_f ;
    			flag=0;              		
    
    
    
    }//chiuso while
    }
    
    fclose(fp);
    Ultima modifica di AntonioG; 04-11-2017 13:23  Motivo: Tag COde per il codice

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,768
    Blogs
    5
    Come da regolamento (che è meglio leggere prima di iniziare a postare), il codice va posto tra tag CODE.

    Inoltre il titolo deve essere più indicativo del problema (inoltre esiste una sezione apposita e separata per le presentazioni).

    Infine, è necessario, per evitare confusione, che i problemi siano affrontati uno alla volta, uno per ogni discussione.

    Come comportasi nel caso in cui la richiesta non possa essere soddisfatta dipende dal testo dell'esercizio. In genere viene indicato cosa fare.
    Altrimenti, la cosa migliore è terminare il programma presentando una frase apposita come "Camere non disponibili, prenotazione non effettuabile".

    Per il primo problema, ti consiglio di separare le fasi (lettura, prenotazione, eventuale aggiornamento file).

    1) leggi tutti i dati in memoria dal file (meglio se in un vettore di strutture se l'avete studiato, altrimenti in tanti vettori)

    2) cerca nei vettori così riempiti i dati che ti servono, avendo cura di modificare 0 in 1 quando prenoti la camera

    3) se necessario, riscrivi i risultati nel file originale, in modo da aggiornare lo stato delle camere
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  3. #3
    pir
    pir non è in linea Novello
    Post
    12
    ciao, per il punto 1) non li abbiamo studiato però (se intendi qualcosa del genere) li ho fatti autonomamente:

    codice:
    typedef struct risultato{
    	int numcam;
    	int occup;
    	  
    	
    }t_ris; 
    
    int main{
    
    t_ris ris[d];
    in modo tale da utilizzarlo per riempire il vettore risultato. Ci avevo già provato, tuttavia ciò che ottengo è che il codice mi sistema per come deve la prima prenotazione ma poi mi dice per tutte le altre ''camera 0: 0 persone'' anche se io mi aspettavo mi desse dei risultati ripetuti del tipo camera 3 1 2 1 camera 1 : 1 persona, camera 3: 2 persone, camera 1 : 1 persona.

    2) non so appunto come risolvere questo. Infatti so scrivere su un secondo file da zero ma non so modificarne uno già esistente modificandolo nel punto esatto che mi serve. puoi buttar giù un codice per questa operazione?
    Ultima modifica di AntonioG; 04-11-2017 15:45  Motivo: Leggi il regolamento sui tag CODE

  4. #4
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,768
    Blogs
    5
    Attenzione ai tag CODE. Ci vogliono le parentesi quadre. Hai visto sul regolamento? Non ci vuole molto ... Guarda nel tuo messaggio, come l'ho modificato ...


    Per la questione delle strutture, va bene. La costante d è meglio che abbia un nome più esplicativo e che sia in maiuscolo, la chiamerei MAX_CAMERE. E non darei un valore di 1000 ma minore ... (non è un problema comunque)

    In ogni caso, se hai tentato qualcosa sulle strutture che non ha funzionato, perché non proponi il codice qui?

    Per il resto non ho capito. Hai letto bene quello che ti ho scritto? Hai diviso in tre fai il programma?

    1) lettura 2) elaborazione 3) scrittura del file

    La scrittura del file va fatto da zero, con i dati che hai in memoria, quindi non esiste il problema che hai indicato di modificarlo.
    Ultima modifica di AntonioG; 04-11-2017 15:57 
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  5. #5
    pir
    pir non è in linea Novello
    Post
    12
    se guardi il codice in alto (il primo) d lho dichiarata in un #define. Inoltre non ho ben capito in che senso dovrei riscrivere il file.
    Il programma deve processare un file qualunque e stampare a video le prenotazioni però, ripeto, non so come evitare che la stessa camera sia assegnata due volte o anche più e neanche come ''confrontare'' la struttura del vettore risultato che sarà poi stampato con quella del vettore che ho riempito con i parametri da linea di comando. Ossia se io immetto che voglio 5 camere, processo il file, riempio il mio vettore risultato e ne trovo 4, chiaramente il mio output deve essere ''numero camere disponibili insufficiente'' mentre, (posto risolto il primo problema) così mi stamperebbe a video 4 assegnazioni ma io ne volevo 5.
    Il mio codice comunque funziona per assegnazioni di una camera ma non oltre, quindi per input di questo tipo : 1 <numero ospiti>.
    E' questo:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #define d 1000
    
    typedef struct risultato{
    	int numcam;
    	int occup;
    	  
    	
    }t_ris; 
    
    
    int main()
    { 
         FILE* fp;
    int ncam_f, noccup_f, stato_f; //variabili di lettura da file
    int i,parametri[d],n,flag; //non so a priori quante camere e quanti ospitanti richiederà l'utente
    t_ris ris[d]; 
    
     printf("camere e ospitanti: ");
    scanf("%d%*c", &n); //lettura del numero camere richieste (dimensione del mio vettore)
    
    for(i=0;i<n;i++){
    	scanf("%d%*c", &parametri[i]); //riempimento parametri
    }
    
    fp=fopen("camere.txt", "r");
    if (fp==NULL){
    	printf("file non aperto correttamente");
    	return -1;
    } 
    
    for(i=0;i<n;i++){
       flag=1;
    while(fscanf(fp, "%d %d %d", &ncam_f, &noccup_f, &stato_f )!=EOF){
    	if(noccup_f == parametri[i] && stato_f==0 && flag==1){
    	  ris[i].numcam=ncam_f; 
    	  ris[i].occup=noccup_f;
    	  flag=0 ;
    	  
    	}
    } //fine while
    } //fine for
    fclose(fp);
    printf("assegnazione riuscita: ");
    for(i=0;i<n;i++){
    	printf("\n cam%d: %d persone ", ris[i].numcam, ris[i].occup);
    }
        return 0;
    }
    chiaramente la parte di stampa del risultato non ha nessun senso appunto per quanto si diceva sopra. Funziona solo in quel caso.

    perdonatemi se commetto errori rispetto al regolamento, imparerò alla svelta!

  6. #6
    pir
    pir non è in linea Novello
    Post
    12
    Il codice è questo:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #define d 1000
    
    typedef struct risultato{
    	int numcam;
    	int occup;
    	  
    	
    }t_ris; 
    
    
    int main(int argc, char* argv[])
    { 
         FILE* fp;
    int ncam_f, noccup_f, stato_f; //variabili di lettura da file
    int i,parametri[d],n,flag; //non so a priori quante camere e quanti ospitanti richiederà l'utente
    t_ris ris[d]; 
    
     printf("camere e ospitanti: ");
    scanf("%d%*c", &n); //lettura del numero camere richieste (dimensione del mio vettore)
    
    for(i=0;i<n;i++){
    	scanf("%d%*c", &parametri[i]); //riempimento parametri
    }
    
    fp=fopen("camere.txt", "r+");
    if (fp==NULL){
    	printf("file non aperto correttamente");
    	return -1;
    } 
    
    for(i=0;i<n;i++){
       flag=1;
    while(fscanf(fp, "%d %d %d", &ncam_f, &noccup_f, &stato_f )!=EOF){
    	if(noccup_f == parametri[i] && stato_f==0 && flag==1){
    	  ris[i].numcam=ncam_f; 
    	  ris[i].occup=noccup_f;
    	  flag=0 ;
    	  
    	}
    } //fine while
    } //fine for
    fclose(fp);
    printf("assegnazione riuscita: ");
    for(i=0;i<n;i++){
    	printf("\n cam%d: %d persone ", ris[i].numcam, ris[i].occup);
    }
        return 0;
    }
    purtroppo non capisco cosa intendi con ''il file va rifatto da zero''. So come scrivere in un file in scrittura, ma non sono capace di modificare un file già esistente come quello che viene dato (il codice deve funzionare con qualunque file!). In altre parole non so come aggiornare il file. Il codice scritto (nel quale io non vedo errori, ma potrebbero essercene, magari anche gravi- nel qual caso perfavore segnalatemeli-) funziona solo se la prenotazione è di una sola camera. Restano entrambi i problemi chiaramente:
    non so come aggiornare
    non so come accertarmi che il vettore riempito non venga stampato se contiene meno celle delel camere richieste.
    Ossia accertarmi del fatto che , se voglio 5 camere, e lui riesce a sistemarne 4, non stampi un vettore di 4 celle ma mi dia ''camere insufficienti bla bla".
    Ultima modifica di pir; 04-11-2017 23:14 

  7. #7
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,768
    Blogs
    5
    Continui a ripetere le stesse cose come se non avessi letto la mia prima risposta.
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  8. #8
    pir
    pir non è in linea Novello
    Post
    12
    magari non l'ho compresa...
    Non è una richiesta di ''pappa pronta'': potresti mandarmi un pezzetto di codice che mi faccia capire cosa intendi con "riscrivere il file da zero"?

  9. #9
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,768
    Blogs
    5
    Quote Originariamente inviato da pir Visualizza il messaggio
    magari non l'ho compresa...
    Non ne hai proprio parlato, quindi non so se non l'hai letta o compresa.

    Non è una richiesta di ''pappa pronta'': potresti mandarmi un pezzetto di codice che mi faccia capire cosa intendi con "riscrivere il file da zero"?
    Non è questo il problema più grande per ora.

    Sempre riferendomi alla mia prima risposta, hai riscritto il codice in modo da realizzare il punto 1) e 2) che ti ho suggerito di fare?
    Se non li hai compresi, dimmelo.
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  10. #10
    L'avatar di gibra
    gibra non è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    6,148
    Quote Originariamente inviato da pir Visualizza il messaggio
    purtroppo non capisco cosa intendi con ''il file va rifatto da zero''.
    Antonio ha scritto, cito testualmente:
    La scrittura del file va fatto da zero, con i dati che hai in memoria,
    Scusa la franchezza, ma è impossibile non capirlo.

+ Rispondi al Thread
Pagina 1 di 3 123 ultimoultimo

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi