Newsgroup: it.comp.lang.c
Titolo: aiuto eserczio strutture!!!!

sto provando a fare questo esercizio ma mi blocco su alcune funzioni, chi mi
aiuta?
ecco il testo
Si consideri un ospedale con 100 pazienti dove si fanno 200 esami clinici
diversi.
Si consideri un archivio E dei 200 esami clinici di un ospedale:
. Codice identificativo dell'esame (progressivo univoco da 1 a 200)
. Prezzo unitario
Si consideri un archivio P dei 100 pazienti di un ospedale (con esattamente
100 pazienti):
. Codice numerico del paziente (progressivo univoco da 1 a 100)
. Codice fiscale
. Data di nascita
. Costo totale degli esami fatti dal paziente (calcolato)
Si consideri infine un archivio F degli esami clinici fatti ai pazienti in
questo ospedale (dimensione max 1000) composto da:
. Codice identificativo dell'esame (lo stesso dell'archivio E)
. Codice numerico del paziente (lo stesso dell'archivio P)
. Esito dell'esame (1= positivo 0=negativo)
ESERCIZIO BASE
Scrivere in C un programma che:
1) Legge da tastiera le informazioni relative agli archivi E e P
2) Chiama una funzione "fatti" che legge da tastiera gli esami fatti ai
pazienti, in ordine casuale, e li inserisce nell'archivio F.
3) Legge da tastiera il codice di un esame e chiama una funzione "esame" che
rende al main (dove vengono stampati) quanti pazienti hanno fatto quell'
esame con esito negativo e quanti con esito positivo.
4) Chiama una funzione "costo1" che calcola il valore totale degli esami
fatti a tutti i pazienti presenti e lo restituisce al main.
5) Chiama una funzione "costo2" che calcola il valore del campo costo totale
dell'archivio F, cioè costo totale degli esami fatti ad ogni singolo
paziente (in base al prezzo unitario di ogni singolo esame).
Inserire nel programma una funzione "ordina" che ordina l'archivio F in base
al codice del paziente (2 righe con lo stesso codice possono essere ordinate
indifferentemente).
.
questo è il mio codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define paz 5
#define es 5
#define max 5
struct E{
    int codes;
    int prez;
};
struct P{
    int codpaz;
    float costototes;
    char data[10];
    char fiscale[16];
    };
struct F{
int codes;
int codpaz;
int esito;};
void leggi (struct P *,struct E *,struct F *);
void fatti (struct F *,struct P *);
void esame (struct F *);
void costo1 (struct P *);
float costo2(struct P *,struct F *,struct E *);
void ordina(struct F *,int *);
main()
{
struct P aP[paz];
struct E aE[es];
struct F aF[max];
int V[max];
leggi (aP,aE,aF);
fatti (aF,aP);
esame (aF);
costo1 (aP);
costo2(aP,aF,aE);
ordina (aF,V);
system("pause");
}
void leggi (struct P *aP, struct E *aE,struct F *aF)
{
 int i;float costototes;
 for (i=1;i<=es;i++)
     {
     printf("\n codice esame n.%d",i);
     aE[i].codes=i;
     printf("\n prezzo esame. ");
     scanf (" %d", &aE[i].prez);
      }
     for (i=1;i<=paz;i++)
     {
     printf("\n codice paziente n.%d",i);
     aP[i].codpaz=i;
     printf("\n codice fiscale: ");
     scanf("%s", aP[i].fiscale);
     printf(" data nascita: ");
     scanf("%s",aP[i].data);
     aP[i].costototes=costo2(aP,aF,aE); //è giusto cosi?
     printf("\n costo totale esami fatti dal paziente %f",aP[i].costototes);
     }
 }
 void fatti (struct F *aF, struct P *aP)
{
    int j;
for(j=1; j<=es;j++)
    {
    aF[j].codpaz=aP[j].codpaz;
    printf("\ncodice esame");
    scanf("%d",&aF[j].codes);
    printf("\nesito: ");
    scanf ("%d", &aF[j].esito);
        }
}
void esame (struct F *aF)
{
int i,cod, pos,neg;pos=0;neg=0;
printf("\ncodice esame ");
scanf("%d",&cod);
for(i=1; i<=es;i++)
  {
    if(aF[i].codes==cod)
    {
    if(aF[i].esito) pos++;
else neg++;
    }
  }
  printf("\npazienti pos e neg %d %d", pos, neg);
}
void costo1 (struct P *aP)
{
float costo;costo=0;int i;
for(i=1;i<=paz;i++)
costo=costo+aP[i].costototes;
printf("\ncosto %f", costo);
}
float costo2 (struct P *aP,struct F *aF,struct E *aE)
{
int i;float costo;
for(i=1;i<=paz;i++)
{
aP[aF[i].codpaz].costototes+=aE[aF[i].codes].prez;
costo=aP[aF[i].codpaz].costototes;
  printf("\ncosto totale esami fatti dal paziente %f",costo );
}
}
void ordina (struct F *aF,int *V)
//funz che crea un vettore in base al codice dal + alto
{
int i,k;
int temp;
for(i=0;i<paz;i++)
  V[i]=aF[i].codpaz;
  for(k=0;k<paz;k++)
      {
      for(i=k;i<paz;i++)
          {
            if(V[i]<V[k])
              {
              temp=V[k];
              V[k]=V[i];
              V[i]=temp;
              }
          }
    }
       for(k=0;k<paz;k++)
    printf("\n %d %d ",k, V[k]);
  }
 -------------------------------------------------
ora dove sbaglio?

  for (i=1;i<=es;i++) e poi accedi a ae[i]
Non ho tempo e voglia di guardare tutto il codice,
comunque ho visto che fai uso in piu' di un punto
di cicli come quello sopra.
Sono sbagliati. Il C numera gli elementi
di un array di N posizioni da 0 a N-1.
Quindi nel tuo caso da aE[0] a aE[es-1].
Quando accedi a aE[es] puo' succedere qualunque cosa.
Inoltre la tua funzione ordina() non ordina affatto F come
richiesto. Non c'e' bisogno che ti scrivi tu
una funzione di ordinamento. Cerca nel manuale
la funzione qsort().
ciao,
g.

 {
se dici che costo2 restituisce un float, il return di
un float non guasterebbe.
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

capisco..ma sono agli inizi per cui cagate sono ovvie...
a parte queste che mi dici delle funzioni..sono corrette?

 
C'è qualcosa che non mi convince.
E' macchinoso e poco comprensibile il passaggio che fai per ottenere il 
costo totale delle prestazioni ricevute da un singolo paziente 
(oltretutto come Angelo ti ha già fatto notare usi la funzione costo2 
che anche se dichiarata come float in uscita, non restituisce un bel 
niente).
Non sarebbe male in realtà alimentare la pila degli esami fatti mentre 
carichi anche il paziente...
Prova a mettere ordine al codice come già ti hanno suggerito (vedendo di 
spezzare maggiormente il codice) e vedi se riesci a caricare i dati come 
ti ho detto.
Martino.
PS: per caso frequenti photosob?
-- 
Quando avrete abbattuto l'ultimo albero, quando avrete pescato l'ultimo
pesce, quando avrete inquinato l'ultimo fiume, allora vi accorgerete che
non si puo' mangiare il denaro.  Proverbio Indiano

mummble mumble...che casino...ci sto provando a sistemare tutto...
si frequento photosob...


      aP[i].costototes=costo2(aP,aF,aE); //č giusto cosi?

---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.592 / Virus Database: 375 - Release Date: 18/02/2004


è vero, dimenticanza...