Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    81

    [c] Come Si Fa Una Struttura?

    Ciao a tutti ragazzi, ho un grande dubbio.
    Vorrei sapere come si fanno le strutture.. Mi basterebbe un esempio facile da cui io possa dedurre..
    Ringrazio in anticipo chiunque mi voglia aiutare..

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Un esempio di struttura e' la seguente

    struct contatto
    {
    char cognome[50];
    char nome[50];
    unsigned char eta;
    char sesso;
    char email[100];
    };

    ma la tua domanda e' troppo generica per andare oltre ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    ma la tua domanda e' troppo generica per andare oltre ...
    ...e tra l'altro trova risposta in qualsiasi libro sul linguaggio C.
    "Se riesci a passare un pomeriggio assolutamente inutile in modo assolutamente inutile, hai imparato a vivere."

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    81
    Sto cercando di capire leggendo da questo programma:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    /*
      Realizzare un programma capace di leggere un file di testo relativo
      ai dati di accesso ad un computer da parte di alcuni utenti (log file),
      e di realizzare delle statistiche.
    
      Il file contiene i dati di accesso nella forma:
    
      nomeUtente:Cognome:Nome: directory:dataDiAccesso:durataInSecondi
    
      e contiene una riga per ogni accesso dell' utente (quindi piu' righe per ogni
      utente, non ordinate in alcun modo). Il campo nomeUtente ha al piu' 20 caratteri
    
      Il computer puo' avere non piu' di 10 utenti, ma alcuni di questi
      non sono mai stati usati e quindi non ci sono righe nel file di log.
    
      Il programma deve  presentare i dati di avvesso di ogni singolo utente attivo
      (cioe' per cui si e' trovato almeno un accesso) visualizzando in un grafico
      la durata media e massima  dei collegamenti.
    
    */
    
    #include "dichiarazioni.h"
    #define MAXLINE 1000
    int getline(char s[], int lim, FILE *f);
    
    int main(int argc, char *argv[])
    {
          FILE *fin;
          char line[MAXLINE];
          char segment[MAXLINE];
    
          struct linea t;
    
          int i;
    
    
    
          /* inizializza la struttura a disposizione */
          init();
    
          fin = fopen(argv[1], "r");
    
    
    
          while ( getline(line, MAXLINE, fin) >0 ) {
    
          caricaStringa( line);
          }
    
    
    
          /*esegue i calcoli sulla struttura */
          calcola();
    
    
          for(i=0;  i < NUMUTENTI; i++) {
             t=getInfo(i);
             if (t.numAccessi>0)
                printf("utente %s: tmax=%d, tmedio=%d, num Accessi %d\n", t.nomeUtente, t.tmax, t.tmedio, t.numAccessi);
    
             }
    
    
    
          return 0;
    }
    
    
    
    
    
    
    /*---------------------------------------------------------------------------*/
    int getline(char s[], int lim, FILE *f) {
        int c, i;
    
        for (i=0; i<lim-1 && (c=getc(f)) != EOF && c != '\n'; i++)  s[i]=c;
        if (c=='\n') {
           s[i]=c;
           ++i;
        }
    
        s[i]='\0';
        return i;
    
    }
    
     
    #include <stdio.h>
    #include "dichiarazioni.h"
    
    /*
      Funzioni di supporto al programma
    */
    
    /*------------------------------------------------------*/
      /* copia una stringa in un'altra */
     void strcp(char *s, char *t)
     {
        while(*s++ = *t++);
     }
    
    
    
    /*------------------------------------------------------*/
    /* verifica se due stringhe sono uguali */
    int uguali(char *s, char *t)  {
    
        int i;
        for (i=0; s[i]==t[i]; i++) ;
        i--;
        if  ( (s[i]=='\0' ) && (t[i] == '\0') )  return 1;
    
        return 0;
    
     }
    
     
    #include <stdio.h>
    #include "dichiarazioni.h"
    
    /*
      Gestione del vettore di strutture
    */
    
    struct linea r[NUMUTENTI];
    
    
    /*----------------------------------------------*/
    /*
      inizializza la struttura
      */
    
    void init(){
     int i;
     for(i=0; i < NUMUTENTI; i++){
        strcp(r[i].nomeUtente, "-");
        r[i].tempo=-1;
        r[i].tmedio=-1;
        r[i].tmax=-1;
        r[i].numAccessi=0;
     }
    }
    
    /* -------------------------------------------------------------------- */
    /*
       Carica la struttura usando la stringa passata
    */
     void caricaStringa(char *stringa)
     {
    
     char utente[DIMCAMPO];
     char d[DIMCAMPO];
     int tempo;
     char segmento;
     int c=0;
    
     sscanf(stringa, "%s %s %s %s %s %d", utente, d, d, d, d, &tempo);
    
    
    
     carica(utente, tempo);
    
     }
    
    /* -------------------------------------------------------------------- */
    /*
       Carica la struttura con i parametri passati
    */
    
    void carica (char *utente, int secondi)
    {
       int i;
       int trovato=0;
    
       for (int i=0; i< NUMUTENTI; i++){
           if (uguali(utente, r[i].nomeUtente)){
                trovato=1;
                r[i].tempo += secondi;
                r[i].tmedio += secondi;
                r[i].numAccessi++;
                if( r[i].tmax < secondi ) r[i].tmax=secondi;
           }
    
       }
    
    
    
       if (!trovato)  {
          /* trova il posto libero */
          for (i=0; r[i].numAccessi != 0; i++);
    
    
          strcp(r[i].nomeUtente, utente);
          r[i].tempo=secondi;
          r[i].tmax=secondi;
          r[i].tmedio=secondi;
          r[i].numAccessi++;
          }
    
    }
    
    
    /*----------------------------------------------------*/
    /*
      Calcola la media ed il massimo
      */
    
    void calcola(){
      int i;
      for(i=0; i < NUMUTENTI; i++)
          if (r[i].numAccessi>0) r[i].tmedio=r[i].tempo/r[i].numAccessi;
    
    }
    
    
    /* restituisce la struttura */
    struct linea getInfo(int i) {return r[i];}
    Data questa dichiarazione:
    Struct linea r[NUMUTENTI];

    che relazione intercorre con questa:

    r[i].tempo; ???

    Inoltre dà errore su
    struct linea t;

    ....

  5. #5
    Originariamente inviato da maurymg
    Data questa dichiarazione:
    struct linea r[NUMUTENTI];

    che relazione intercorre con questa:

    r[i].tempo; ???
    Be', la dichiarazione crea un array di NUMUTENTI (dai commenti suppongo quindi 10) strutture linea chiamato r; r[i].tempo = -1 invece assegna al campo tempo dell'i+1-esimo elemento dell'array r il valore -1.
    Inoltre dà errore su
    struct linea t;
    Che errore dà? Puoi postare il contenuto di dichiarazioni.h?
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    81
    Salve ragazzi se avete 5 minuti di tempo potreste dare un'occhiata a questo programma??
    L'esame è dopodomani e dopo ieri pensavo di avere capito le strutture,ma a quanto pare non è così..
    Ho preso ad esempio un programma diviso in file,ma non ho usato la divisione in file..l'ho fatto un pò lungo,poi in caso lo accorcio,è per capire come funziona.evidentemente sbaglio qualcosa,ma non capisco cosa..
    Ecco il programma:
    codice:
    #include<stdio.h>
    #include<ctype.h>
    #include<stdlib.h>
    #define NUMUT 10
    struct profile{
        char nomeutente[100];
        //int tmedio[100];
        //int tmax[100];
        int accessi;
          };
    struct profile utenti[NUMUT];
    int getline(char[],FILE *);
    int sonouguali(char [],char []);
    struct profile getInfo(int);  
    main(int argc,char *argv[])
    {
        struct profile str;
        FILE *fin;
        fin=fopen(argv[1],"r");
        int i,trovato,t;
        //inizializza
        for(i=0; i<NUMUT; i++)
        {
            
             utenti[i].accessi=0;
        }    
        char line[100];
        int len;
        char nomeUtente[100],d[100];
        int tempo;
        //prende l'input
        while(len=getline(line,fin)>0)
        {
              
              sscanf(line,"%s %s %s %s %s %d",nomeUtente,d,d,d,d,&tempo);
              //carica la struttura
              for(i=0; i<NUMUT; i++)
                   if((t=sonouguali(utenti[i].nomeutente,nomeUtente))==1)
                    {
                        trovato=1;
                        utenti[i].accessi++;
                    }    
              if(!trovato)
               {
                 for(i=0;utenti[i].accessi!=0;i++);
                         strcpy(utenti[i].nomeutente,nomeUtente);
                         utenti[i].accessi++;
              }   
      }     
      //stampa la struttura
      for(i=0;i<NUMUT;i++)
      {
          str=getInfo(i);
          if(str.accessi!=0)
            printf("Utente:%s\nAccessi:%d\n\n",str.nomeutente,str.accessi);
      }  
      printf("premi un tasto..");
      fclose(fin);
      getch();
       
    }
    
    int sonouguali(char s[],char t[])
    {
        int i;
        while(s[i]==t[i++])
           if(s[i-1]=='\0' && t[i-1]=='\0')
               return 1;
        return 0;
    }
    int getline(char s[], FILE *f) 
    {
        int c, i;
    
        for (i=0;(c=getc(f)) != EOF && c != '\n'; i++)  
             s[i]=c;
        if (c=='\n') 
        {
           s[i]=c;
           ++i;
        }
        s[i]='\0';
        return i;
    
    }              
    
    struct profile getInfo(int i)
    {
        return utenti[i];
    }
    Inoltre quando per stampare uso:

    codice:
    for(i=0;i<NUMUT;i++)
      {
          str=getInfo(i);
          if(str.accessi!=0)
            printf("Utente:%s\nAccessi:%d\n\n",str.nomeutente,str.accessi);
      }
    avendo dichiarato:
    codice:
    struct profile str;

    è necessaria questa dicitura?
    L'ho usata prendendo a modello quella del programma originario..

    non posso usare ad esempio:

    codice:
    for(i=0;utenti[i].accessi!=0;i++)
         printf("NOME UTENTE: %s\nACCESSI: %d\n\n",utenti[i].nomeutente,utenti[i].accessi);
    Grazie HEEEEEELP..

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Non puoi proporre un listato e dire "dateci un'occhiata" ... ma per fare cosa? Ci sono degli errori di compilazione? A run time? Risultati sbagliati o che non ti aspettavi?

    Questo e' un forum tecnico ... si pongono domande precise, non e' il doposcuola di informatica ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Non si può pretendere di imparare un linguaggio da un forum, il consiglio è ripassare le lezioni in cui venivano spiegate le strutture.
    Quanto ai tuoi dubbi specifici sugli esempi da te postati il discorso è semplice, le strutture sono dichiarate in qualche header (i file .h) che tu non hai postato. Qui hai postato solo il codice che usa le struct, infatti trovi solo le dichiarazioni delle variabili.
    ...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    81
    compila ma non stampa niente..
    il programma dovrebbe stampare una serie di strutture del tipo:
    nome utente:
    accessi:

    le strutture sono dichiarate in qualche header (i file .h) che tu non hai postato. Qui hai postato solo il codice che usa le struct..
    Io pensavo che :
    struct profile{
    char nomeutente[100];
    //int tmedio[100];
    //int tmax[100];
    int accessi;
    };
    messo prima del main fosse una dichiarazione di struttura....
    il codice postato è diverso da quello di prima,qui ho provato a fare un programma con le strutture,in un unico file,senza suddivisione..
    non è così che avrei dovuto fare?
    non capisco xke le strutture non vengano stampate..

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Potrebbe dipendere dal contenuto del file (sei sicuro che contenga i dati che ti aspetti nell'ordine in cui te li aspetti?) ... Mostra un esempio del contenuto del file che leggi ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.