Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Problema programmazione C/C++ su Windows Vista Home

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Triumph Of Steel, archimede

Problema programmazione C/C++ su Windows Vista Home

Postdi simone89 » 17/02/09 15:46

Ho come sistema operativo Windows Vista Home Premium. Devo fare un programma in c ho provato con diversi software: Pelles C, dev C++ e visual studio. Un mio amico ha windows vista e a lui funziona anche il software dev c++ e non capisco perchè a me non funzioni dandomi il seguente errore "Il progetto non è compilato" . Allora poi ho provato con visual C# 2008 express ma quando scrivo il programma il pulsante di debug è come "disabilitato" cioè non posso cliccarci sopra. Mi potreste aiutare? Vi lascio postato anche il programma:
Codice: Seleziona tutto
#include <stdio.h>
#include <string.h>

/*
Definisco il tipo BOOL dagli interi.
FALSE=0, TRUE=1
*/
typedef int BOOL;
#define FALSE 0
#define TRUE 1

/*
Il dato strutturato di tipo utente comprende una variabile intera (numtel),
due puntatori a float, che mi servono per altrettanti vettori di
numeri reali con tanti elementi pari al valore della variabile intera chiamate, ed
un puntatore al prossimo elemento della lista next.
*/
struct utente {
   int numtel;
   float* minuti;
   float* costo;
   int chiamate;
   struct utente* next;
};

/*
nuovoUtente è una funzione che dati in input un intero n, due puntatori a float ed un intero s
crea un elemento di tipo struct utente* da inserire nella lista.
Per tale motivo la seguente funzione è a sua volta chiamata nelle funzioni di inserimento dei dati.
*/
struct utente* nuovoUtente(int n, float* V, float* C, int s) {
   struct utente* nuovo=(struct utente*)malloc(sizeof(struct utente));
   nuovo->numtel=n;
   nuovo->minuti=V;
   nuovo->costo=C;
   nuovo->chiamate=s;
   nuovo->next=NULL;
   return nuovo;
}

/*
Inserimento in testa alla lista che inizia nel nodo puntato dal doppio puntatore
f, vengono passati una variabile intera n (che sarà il numtel) due puntatori
a float(che saranno il vettori di minuti e costo) ed un intero s (la dimensione)
*/
void preInsert(struct utente** f, int n, float* V,float* C,int s) {
     struct utente* x;
     x=(*f);
     /*
     Ho creato x nel quale inserisco la vecchia testa della lista.
     Indirizzando f verso un nuovo utente creo quella nuova, alla quale accoderò proprio x.
     */
     (*f)=nuovoUtente(n,V,C,s);
     (*f)->next=x;
}

/*
Inserisco in coda alla lista, passo gli stessi parametri della funzione
precedente.
*/
void sufInsert(struct utente** f, int n, float* V,float* C,int s) {
     while(*f) f=&((*f)->next);
     /*
     Scorro la lista degli utenti fino a trovare il fondo della lista stessa,
     alla fine della quale inserisco un nuovo utente.
     */
     (*f)=nuovoUtente(n,V,C,s);
}

/*
Funzione che rimuove dalla lista un utente che ha il numero di telefono uguale
al target.
Restituisce un valore bool, TRUE se avviene la cancellazione FALSO altrimenti.
*/
BOOL Delete(struct utente** f, int target) {
     BOOL eliminato=FALSE;
     /* Scorro la lista finché finisce o trovo l'elemento da eliminare */
     while((*f) && FALSE==eliminato){
               if(target == (*f)->numtel) {
                         struct utente* temp=(*f);
                         float* A=(*f)->costo;
                         float* B=(*f)->minuti;
                         (*f)=(*f)->next;
     /* Al posto dell'elemento da cancellare inserisco il successore. */
                         free(A);
                         free(B);
                         free(temp);
     /* Libero la memoria dagli elementi creati con allocazioni dinamiche */
                         eliminato=TRUE;
                         }
               if((*f)) f=&((*f)->next);
               }
     return eliminato;
}

/*
Funzione che scorre la lista, stampandone i dati elemento per elemento
*/
void Visit(struct utente* f) {
     while(f) {
              int i=0;
              printf("Numero Utente: %d, ci sono %d Chiamate.\n",f->numtel,f->chiamate);
              printf("Lista Chiamate = <\n");
              for(i=0;i< f->chiamate;i++) printf("\n%f min (%f eur/min)",f->minuti[i],f->costo[i]);
              printf("\n>\n-----------\n");
              f=f->next;
              }
}

/*
Funzione che data la testa della lista ed il target da trovare scorre tutta
lista allo scopo di trovare l'elemento in questione.
Restituisce l'indirizzo della struct utente trovata oppure l'indirizzo nullo
(se non trova nulla).
*/
struct utente* Find(struct utente* f, int target) {
       struct utente* y=NULL;
       while(NULL!=f && NULL==y) {
               if(f->numtel==target) y=f;
               f=f->next;
               }
       return y;
       }
/*
Funzione che data la testa della lista ed il target calcola la durata media di una
telefonata per il quale il numtel corrisponde al target.
La media è un float, varrà -1 qualora lo studente non venga trovato.
*/       
float mediaTel(struct utente* f, int target) {
      float media;
      struct utente* x=Find(f,target);
      if(x) { float somma=0;
              int i;
              for(i=0;i< x->chiamate ;i++) somma+=x->minuti[i];
              if(0 != x->chiamate) media=somma/(x->chiamate);
                   else media=0;
              /*
              se non ci sono chiamate la media è zero (evito la divisione per
              zero).
              */
              } else media=-1;
       return media;
}
 
/*
Funzione che data la testa della lista, il target, un intero pos ed un float
inserisce minuti e costo per lo studente con numtel=target.
Tali valori non cambieranno se numtel diverso da target o la posizione non
è corretta.
Il valore di ritorno è di tipo BOOL (TRUE se viene effettuata la modifica).
*/   
BOOL modificaMinuti(struct utente* f, int target, int pos, float min,float cos) {
     BOOL fatto=FALSE;
     struct utente* x=Find(f,target);
     if(x && pos< x->chiamate )  {
                      x->minuti[pos]= min;
                      x->costo[pos]= cos;
                             fatto=TRUE;
                             }
     return fatto;
     } 

/*
Funzione che data la testa della lista ed il target stampa i dati dell'utente
per il quale il numtel corrisponde al target.
*/       
void printOne(struct utente* f, int target) {
     struct utente* x=Find(f,target);
     int i;
     if(x)   {printf("Numero di telefono: %d, ci sono %d chiamte.\n",x->numtel,x->chiamate);
              printf("Lista Chiamate = <\n");
              for(i=0;i< x->chiamate;i++) printf("\n%f min (%f eur/min)",x->minuti[i],x->costo[i]);
              printf("\n>\n-----------\n");;                 
              }else
              printf("Spiacenti Utente insesistente.\n");



/*
Funzione che dato un target da cercare, è in grado di calcolare quanto spende un utente
a seguito delle chiamate effettuate.
Ritorna il valore calcolato, a meno che l'utente sia inesistente (in tal caso torna -1).
Data la possibilità che la somma possa raggiungere un valore elevato il tipo di ritorno è
double.
*/

double calcolaBolletta(struct utente* f, int target) {
   struct utente* x=Find(f,target);
   double somma;
   if(x) { somma=0;
              int i;
              for(i=0;i< x->chiamate ;i++) {
                         somma=somma+((x->minuti[i]) * (x->costo[i]));
                         }
              } else somma=-1;
       return somma;
}

int main(void) {
       struct utente* BOLLETTA=NULL;
       int numtel;
       int chiamate;
       float* A;
      float*B;
       int pick;
       int index;
       float minuti;
      float costo;
       printf("Bollette Telefoniche\n");
       while(pick!=0) {
            printf("\nCosa vuoi fare?\n");
            printf("\t1.Inserisci in testa alla lista un utente;\n");
            printf("\t2.Inserisci in coda alla lista un utente;\n");
            printf("\t3.Modifica un minuti di un utente;\n");         
            printf("\t4.Vedi lista utenti con rispettive chiamate;\n");
            printf("\t5.Vedi lista chiamate di un singolo utente;\n");
            printf("\t6.Vedi media chiamate di un singolo utente;\n");
         printf("\t7.Vedi bolletta di un singolo utente;\n");
         printf("\t8.Elimina un singolo utente;\n");
            printf("\t0.Esci dal programma.\n");
            scanf("%d",&pick);
            switch(pick) {
                         case 0 : break;
                         /*
                         Inserimento in testa: acquisico numtel, numero di voti e voti
                         poi li inserisco
                         */
                         case 1 :{printf("Dimmi il numero di telefono: ");
                                  scanf("%d",&numtel);
                                  /* Se il numero è già presente non si inserisce */
                                  if(NULL==Find(BOLLETTA,numtel)) {
                                           int i;
                                           printf("Dammi il numero di chimate: ");
                                           scanf("%d",&chiamate);
                                           A=(float*)malloc(chiamate*sizeof(float));
                                 B=(float*)malloc(chiamate*sizeof(float));
                                           for(i=0;i<chiamate;i++) {
                                                               printf("Dammi il minuti %d: ",i);
                                                               scanf("%f",&A[i]);
                                                printf("Dammi il costo al minuto %d: ",i);
                                                               scanf("%f",&B[i]);
                                                               }
                                   preInsert(&BOLLETTA,numtel,A,B,chiamate);                       
                                                                   } else
                                                                   printf("Spiacente non e' possibile.\n");
                                  break;
                                  }
                         /*
                         Inserimento in coda: acquisico numtel, numero di voti e voti
                         poi li inserisco
                         */
                         case 2 :{printf("Dimmi il numero di telefono: ");
                                  scanf("%d",&numtel);
                                  if(NULL==Find(BOLLETTA,numtel)) {
                                           /* Se il numero è già presente non si inserisce */
                                           int i;
                                           printf("Dammi il numero di chiamate: ");
                                           scanf("%d",&chiamate);
                                           A=(float*)malloc(chiamate*sizeof(float));
                                 B=(float*)malloc(chiamate*sizeof(float));
                                           for(i=0;i<chiamate;i++) {
                                                               printf("Dammi il minuti %d: ",i);
                                                               scanf("%f",&A[i]);
                                                printf("Dammi il costo al minuto %d: ",i);
                                                               scanf("%f",&B[i]);
                                                               }
                                   sufInsert(&BOLLETTA,numtel,A,B,chiamate);                       
                                                                   }else
                                                                   printf("Spiacente non e' possibile.\n");
                                  break;
                                  }
                         /*
                         Modifica di un minuti: acquisico numtel, la posizione del minuti, il nuovo
                         minuti e richiamo modificaminuti()
                         */

                         case 3 :{printf("Dimmi il numero di telefono: ");
                                  scanf("%d",&numtel);
                                  printf("Dimmi la chiamate da modificare: ");
                                  scanf("%d",&index);
                                  printf("Dimmi il nuovo numero dei minuti: ");
                                  scanf("%f",&minuti);
                          printf("Dimmi il nuovo valore del costo: ");
                                  scanf("%f",&costo);
                                  if(FALSE==modificaMinuti(BOLLETTA,numtel,index,minuti,costo))printf("Spiacente, impossibile.\n");
                                  break;
                                  }
                         /*
                         Stampa della lista: richiamo Visit()
                         */
                         case 4 :{Visit(BOLLETTA);
                                  break;
                                  }
                         /*
                         Stampa di uno: acquisisco numtel e richiamo printOne()
                         */
                         case 5 :{printf("Dammi il numero di telefono: ");
                                  scanf("%d",&numtel);
                                  printOne(BOLLETTA,numtel);
                                  break;
                                  }
                         /*
                         Media Telefonate: acquisico numtel e richiamo mediaTel()
                         */
                         case 6 :{printf("Dammi il numero di telefono: ");
                                  scanf("%d",&numtel);
                                  float m=mediaTel(BOLLETTA,numtel);
                                  if(-1==m) printf("utente assente dalla lista.\n"); else
                                  printf("La media minuti e' %f .\n",m);
                                  break;
                                  }
                       
                        /*
                        Calcolo della bolletta, chiamata di calcolaBolletta()
                        */
                         case 7 :{printf("Dammi il numero di telefono: ");
                                  scanf("%d",&numtel);
                                  double b=calcolaBolletta(BOLLETTA,numtel);
                                  if(-1==b) printf("utente assente dalla lista.\n"); else
                                  printf("Ci sono %f eur da pagare.\n",b);
                                  break;
                                  }
                         /*
                         Eliminazione del numero, chiamata a Delete()
                         */
                         case 8 :{printf("Dammi il numero di telefono: ");
                                  scanf("%d",&numtel);
                                  if(Delete(&BOLLETTA,numtel))printf("Eliminazione riuscita.\n");
                                  else printf("Utente assente o eliminazione non riuscita.\n");
                                  break;
                                  }
                         }         
            }
       system("PAUSE");
   return 0;
 }
simone89
Utente Junior
 
Post: 32
Iscritto il: 17/09/06 13:31

Sponsor
 

Re: Problema programmazione C/C++ su Windows Vista Home

Postdi zello » 17/03/09 23:55

Vabbé, in ritardo...
Al di là di un fiume di warning (#include <malloc.h> e <stdlib.h> no, eh?)
hai almeno 3 punti del codice in cui fai una cosa come questa:
Codice: Seleziona tutto
...
   if(x) { somma=0;
              int i;
...

(questo è intorno alla 190a riga).
La definizione dello standard C pre-99 non consente la dichiarazione di variabili successive a istruzioni che non siano dichiarazioni.
Purtroppo, la stragrande maggioranza dei compilatori non implementa lo standard C99 ...
Sposta le tre dichiarazioni sopra l'istruzione di assegnazione, ricompila e vivi felice.

Ah, un'ultima cosa (di cui sono grato al compilatore Microsoft):
Codice: Seleziona tutto
int main(void) {
       <dichiarazioni varie>
       int pick;
       <altre dichiarazioni>
       printf("Bollette Telefoniche\n");
       while(pick!=0) {

Questo è una di quelle cose che ci metti anni a beccare, e ti viene una gran voglia di strozzare chi ha scritto il codice.
La variabile pick non è inizializzata al momento del test, il suo contenuto all'avvio è casuale.
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44


Torna a Programmazione


Topic correlati a "Problema programmazione C/C++ su Windows Vista Home":


Chi c’è in linea

Visitano il forum: Nessuno e 7 ospiti