Newsgroup: it.comp.lang.c
Titolo: programma autolavaggio

ho questo programma da fare e vorrei che qualcuno mi aiutasse...
non voglio il programma fatto, ma qualche aiuto o suggerimento su come 
implementarlo al meglio...
SI VUOLE GESTIRE UN AUTOLAVAGGIO CHE ESEGUE SULLE AUTOMOBILI 3 OPERAZIONI:
-    LAVAGGIO CARROZZERIA
-    LAVAGGIO MOTORI
-    LAVAGGIO INTERNI
OGNUNA DELLE 3 OPERAZIONI HA UNA "CODA" DI AUTOMOBILI IN ATTESA.
OGNI AUTOMOBILE PUO' SUBIRE UNA QUALSIASI COMBINAZIONE DELLE 3 OPERAZIONI 
CHE PERO' DEVONO ESSERE ESEGUITE IN SUCCESSIONE FISSA E CIOE':
1°    LAVAGGIO MOTORE
2°    LAVAGGIO INTERNI
3°    LAVAGGIO CARROZZERIA
OGNUNA DELLE OPERAZIONI HA UN COSTO.
A) DEFINIRE LE INFORMAZIONI NECESSARIE A GESTIRE OGNI SINGOLA AUTOMOBILE.
B) DEFINIRE LE STRUTTURE E I VETTORI IN "C" NECESSARI A GESTIRE LE 3 CODE
C) SCRIVERE LE FUNZIONI DI INSERIMENTO E ESTRAZIONE DELLE 3 CODE
D) SCRIVERE LA FUNZIONE CHE ESTRAE UN'AUTOMOBILE DA OGNUNA DELLE 3 CODE ED 
EVENTUALMENTE L'ACCODA PER L'OPERAZIONE SUCCESSIVA.
da dove posso iniziare ? non so proprio come fare... 

nessuno che mi aiuta ? 

 nessuno che mi aiuta ?
e' poco che studio il C..
ma non mi sembra un lavoro cosi' complicato..
perche' non provi da solo?

c'ho provato
ma ho riscontrato parecchi problemi come la gestione delle code, sapere che 
tipo di operazioni l'automobile ha gia' effettuato, tenere conto del prezzo 
finale da farle pagare tenendo conto delle operazioni che ha effettuato...
sembra facile ma e' molto difficile !!! 

Fabio wrote:

guardo se ci riesco stanotte..
se puoi posta un'po' di codice che hai gia' scritto..

 B) DEFINIRE LE STRUTTURE E I VETTORI IN "C" NECESSARI A GESTIRE LE 3 CODE
struct coda
{
    int vettore [100]; // numero massimo di macchine per ogni operazione //
    float prezzo;    // tiene conto del prezzo della singola operazione //
};
coda carrozzeria, coda motori, coda interni;
C) SCRIVERE LE FUNZIONI DI INSERIMENTO E ESTRAZIONE DELLE 3 CODE
nel panico + completo !!!
D) SCRIVERE LA FUNZIONE CHE ESTRAE UN'AUTOMOBILE DA OGNUNA DELLE 3 CODE ED
EVENTUALMENTE L'ACCODA PER L'OPERAZIONE SUCCESSIVA.
nel panico + completo !!!
correggi gli eventuali errori, insomma dai un'occhiata tu, ho le idee 
confuse !!! 

#include <stdio.h>
// VARIABILI GLOBALI //
int NUMERO_MAX_AUTOMOBILI; // variabile globale che contiene il numero 
massimo di automobili gestibile dall'autolavaggio //
typedef struct automobile // struttura per ogni singola auto //
{
 int op_effettuate [3]; // operazioni che l'auto ha effettuato //
 int op_da_effettuare [3]; // operazioni che l'auto deve effettuare //
 float totale; // prezzo totale che deve pagare l'auto //
};
typedef struct coda // struttura base della coda //
{
 int vettore [NUMERO_MAX_AUTOMOBILI];
 float prezzo;
};
coda carrozzeria, motori, interni, automobile [NUMERO_MAX_AUTOMOBILI]; // le 
tre code da gestire e il vettore di struct delle automobili // 

 int NUMERO_MAX_AUTOMOBILI; // variabile globale che contiene il numero
perche' limitarsi?
Tommaso

appunto
ho un problema
in teoria io sto programma dovrei farlo in modo che colui che lo usa (colui 
che gestisce l'autolavaggio) possa inserire, tramite printf e scanf, il 
NUMERO_MAX_AUTOMOBILI
pero' ora mi sorge un dubbio....
esiste un modo per allocare dinamicamente le automobili senza sapere quante 
sono e senza chiederlo al pirla che gestisce l'autolavaggio... tipo 
un'allocazione dinamica... esiste ? sapevo che per le code esisteva questo 
tipo di allocazione dinamica... 

 wrote

Certo che esiste... se ti interessano algoritmi e strutture dati ti 
consiglio un buon libro come:
http://tinyurl.com/539y5
 o, in alternatica anche uno un pochino piu' pratico 
e snello se non hai tanto tempo/voglia.
Se vuoi dare un'occhiata veloce a come si possano implementare cose del 
genere puoi sempre usare google, ci sono parecchi siti in giro.
Tommaso

non e' il tempo, e' che al momento non ho soldi per comprare quel libro...
e in biblioteca non lo troverei cmq...
non puoi farmi un esempio basandoti sul mio caso ? 

Fabietto wrote:

ho creato la base..
e' in grado di gestire un numero indefinito di macchine, ma non c'e'
controllo dei dati immessi dall'utente ne gestione degli errori e dei
prezzi ma per quelli basta poco (e' solo una base)..
se vuoi posto il codice..

posta posta
ogni codice utile e' sempre ben accetto !!! 

 ogni codice utile e' sempre ben accetto !!!
allora..
il programma crea una coda..
ogni volta che si aggiunge una macchina viene chiesta la targa (max 32
caratteri) e quali lavaggi si vuole effettuare (1 = si, 0 = no)..
con view garage si vede la lista delle macchine nel garage e quali
operazioni non sono da effettuare, da effettuare od effettuate..
step over procede ad un ciclo e quindi cerca e stampa le targhe delle
macchine e l'operazione che intraprendono settando l'operazione interessata
come effettuata..
manca come ho detto una gestione errori, buona interfaccia, gestione prezzi
ed una funzione di ritiro della macchina (le macchine che hanno completato
il ciclo di lavaggio dovranno pur essere restituite)..
(nel post correggi gli spazi aggiunti dal lettore di news, credo sia stato
modificato solo il menu)
#include <stdio.h>
#include <malloc.h>
#include <limits.h>
struct car
{
  char *nplate[32];
  unsigned int wash_motor: 1;
  unsigned int wash_insid: 1;
  unsigned int wash_cover: 1;
  unsigned int done_motor: 1;
  unsigned int done_insid: 1;
  unsigned int done_cover: 1;
  struct car *next;
};
struct car *new_car(struct car *);
void view_garage(struct car *);
void step_over(struct car *);
int main(void)
{
  struct car *current, *first;
  int choice = 0;
  first = current = NULL;
  while(1)
  {
    printf("\n    MENU\n  1 Add car\n  2 View garage\n  3 Step over\n  4
Exit\n    Choice: ");
    scanf("%d", &choice);
    switch(choice)
    {
      case 1:
        printf("\n    Add car:\n");
        current = new_car(current);
        if(first == NULL) first = current;
        break;
      case 2:
        printf("\n    View garage:\n");
        view_garage(first);
        break;
      case 3:
        printf("\n    View garage:\n");
        step_over(first);
        break;
      case 4:
        exit(0);
    }
  }
}
struct car *new_car(struct car *current)
{
  int tmp = 0;
  struct car *new_element;
  new_element = (struct car *)malloc(sizeof(struct car));
  printf("  Car license: ");
  scanf("%s", &new_element->nplate);
  printf("  Wash motor: ");
  scanf("%d", &tmp);
  if(tmp == 1) new_element->wash_motor = 1;
  printf("  Wash inside: ");
  scanf("%d", &tmp);
  if(tmp == 1) new_element->wash_insid = 1;
  printf("  Wash cover: ");
  scanf("%d", &tmp);
  if(tmp == 1) new_element->wash_cover = 1;
  if(current !=  NULL) current->next = new_element;
  return new_element;
}
void view_garage(struct car *first)
{
  struct car *current;
  current = first;
  char *status = "none";
  while(current != NULL)
  {
    printf("  Car nplate: %s\t", current->nplate);
    status = "none";
    if(current->wash_motor == 1) status = "todo";
    if(current->done_motor == 1) status = "done";
    printf("Motor: %s\t", status);
    status = "none";
    if(current->wash_insid == 1) status = "todo";
    if(current->done_insid == 1) status = "done";
    printf("Inside: %s\t", status);
    status = "none";
    if(current->wash_cover == 1) status = "todo";
    if(current->done_cover == 1) status = "done";
    printf("Cover: %s\n", status);
    current = current->next;
  }
}
void step_over(struct car *first)
{
  struct car *current;
  current = first;
  int place[3];
  while(current != NULL)
  {
    if(current->wash_motor == 1 && current->done_motor != 1)
    {
      if(place[0] != 1)
      {
        place[0] = 1;
        printf("  Washing motor of car with number plate %s\n",
current->nplate);
        current->done_motor = 1;
      }
      current = current->next;
      continue;
    }
    if(current->wash_insid == 1 && current->done_insid != 1)
    {
      if(place[1] != 1)
      {
        place[1] = 1;
        printf("  Washing inside of car with number plate %s\n",
current->nplate);
        current->done_insid = 1;
      }
      current = current->next;
      continue;
    }
    if(current->wash_cover == 1 && current->done_cover != 1)
    {
      if(place[2] != 1)
      {
        place[2] = 1;
        printf("  Washing cover of car with number plate %s\n",
current->nplate);
        current->done_cover = 1;
      }
      current = current->next;
      continue;
    }
    current = current->next;
  }
}

        place[0] = 1;
qua leggi il valore di place[0] prima di inizializzarlo....
Nota: tu aggiungi sempre macchine ma non ne togli mai, speriamo che dopo 
alcuni anni ci sia ancora memoria. In teoria quando una macchina paga (ad 
esempio) dovrebbe essere tolta dalle code e la memoria liberata con free().
In fine mischi troppo il codice di gestione della coda con l'implementazione 
dell'autolavaggio. In questo modo aspettati bugs! Il mio consiglio e' di 
implementare prima una struttura dati coda con tanto di operazioni 
(aggiungi, estrai, leggi_testa, etc..) e poi una dal programma autolavaggio 
usare queste funzioni. Avere le funzionalita' della coda mischiate a quelle 
dell'autolavaggio e' fonte di enormi problemi, specialmente in progetti veri 
dopo ci sono piu' sviluppatori, dove il progetto e' piu' grosso e... devi 
metterci le mani anche a distanza di anni se ci devi fare una modifica.
Questo dopo una ispezione veloce e superficiale....
Tommaso

tommy se vuoi dare un contributo al programma, magari rimodificandolo e 
ripostandolo, o cmq farmi capire bene come dovrei fare, te ne sarei grato 
!!!
ci terrei a prepararlo per giovedi, con i vostri aiuti !!!
grazie mille... 

 !!! ci terrei a prepararlo per giovedi, con i vostri aiuti !!!
Ok, intanto parti da qua:
http://tinyurl.com/5mqoa
poi se e quando hai problemi chiedi pure.
Modificare e ripostare il programma non mi sembra il caso anche perche' 
credo che lo stesso design del programma possa essere migliorato e quindi 
convenga rifare il programma da capo.
Scrivertelo io ovviamente non avrebbe senso in quanto sei tu che devi 
imparare. Quindi ti lascio partire e se poi hai problemi posta pure sul NG.
Tommaso

nel case 4 avevi messo un exit (0) che non mi andava.... l'ho sostituito con 
un break per ora, poi faro' per bene l'uscita !!!
ho un'altro problema !!!
quando premo il 2 del menu per visualizzare il garare (tu per garage intendi 
le macchine che stanno ancora facendo operazioni di lavaggio), mi da' errore 
il programma, forse hai usato male le variabili o le allocazioni di memoria, 
e come se andassi a toccare la memoria di un'altro processo e mi da' 
errore...
e poi le macchine dovrebbero avere un controllo che dopo aver fatto tutte le 
operazioni richieste, liberi memoria (deallochi la macchina precedentemente 
allocata), per far posto in coda, insomma una coda dinamica...
in principio volevo che l'operatore inserisse il numero massimo di macchine, 
ma poi ho pensato, se esiste un modo per allocare dinamicamente la lista, 
fregandosene del max e facendo qualcosa di dinamico che si alloca e libera 
automaticamente, sarebbe stato perfetto... ma io ste code dinamiche proprio 
non le capisco... dovrei usare come nelle liste la malloc e la free ?
il mio prof ste' code quando le ha spiegate io non c'ero, e voglio 
capirle... anche perche' giovedi quando torno divide la classe in 2 gruppi e 
con un gruppo continua il c standard, con l'altro inizia il c implementato 
ad oggetti... io gia' faccio fatica con il c standard, figurati se mi deve 
fare quello a oggetti...
cmq per ora grazie a unknown e a tommy, siete 2 grandi !!! 

cos'e' il link che hai postato ?
non posso collegarmi oggi a internet, ho dei problemi con fastweb, se riesci 
mi puoi mandare la pagina a cui si riferisce il link per posta elettronica ?
te ne sarei molto grato !!! 

 figurati se mi deve fare quello a oggetti...
ma che corso e'?
Perche' fate il C ad oggetti e non fate il C++?
La programmazione ad oggetti in C e' possibile ma e' non cosi' comoda e 
naturale come in C++.
Tommaso

 wrote

era semplicemente la mia risposta alla tua domanda su come si implementava 
una coda dinamica in C (risposta su questo NG).
Tommaso

il programma l'ho un po' sistemato e le variabili l'ho portate in italiano 
(odio l'inglese)
come faccio a usare le funzioni malloc e free e come vanno impostate ?