PDA

Visualizza la versione completa : [c] Come Si Fa Una Struttura?


maurymg
12-02-2008, 12:17
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..

oregon
12-02-2008, 12:30
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 ...

pallinopinco
12-02-2008, 13:16
ma la tua domanda e' troppo generica per andare oltre ...


...e tra l'altro trova risposta in qualsiasi libro sul linguaggio C. :smack:

maurymg
12-02-2008, 13:35
Sto cercando di capire leggendo da questo programma:


#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;

....

MItaly
12-02-2008, 16:04
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?

maurymg
13-02-2008, 13:46
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:


#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:




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:


struct profile str;




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

non posso usare ad esempio:



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


Grazie HEEEEEELP..

oregon
13-02-2008, 13:55
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 ...

Caiodark
13-02-2008, 14:41
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.

maurymg
13-02-2008, 15:49
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..

oregon
13-02-2008, 16:32
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 ...

Loading