C/Visual C - ejercicio para un certamen

 
Vista:
sin imagen de perfil

ejercicio para un certamen

Publicado por carlos (1 intervención) el 02/05/2014 04:39:29
ay un archivo llamado data.txt que tiene una lista de personas en el siguiente
formato, hay personas que pueden estar repetidas en la lista:
<ID> <Apellido_paterno> <Primer_nombre> <Edad>
Ej:
1 Bustos Juan 33
2 Perez Diego 45
3 Bustos Raul 30
4 Perez Diego 45

campos separados por un espacio simple).
1- Es necesario hacer un programa llamado calcular-edad que lea el archivo
data.txt y guarde los usuarios en una lista simple sin guardar las personas
repetidas.
2- Este programa debe traversar la lista, calcular el promedio y la desviacion
estandar de la lista de usuarios y las debe imprimir a la pantalla en formato
flotante truncado a dos decimales de precision. Se invoca sin parametros.

aun me cuesta mucho programar pero me gusta y eso me motiva a seguir esforzandome, si me pudieran ayudar con esto podria aprender mejor, muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

ejercicio para un certamen

Publicado por UnoPorAhi (15 intervenciones) el 02/05/2014 12:26:43
Buenas,

Para leer el fichero tendras que usar fopen para abrirlo y fgets para recorrerlo. Luego, para obtener los datos, utiliza strtok para separar en token utilizando el espacio como delimitador y guardalos en un array comprobando si no existe previamente.
Para obtener promedio y desviacion estandard tan solo tienes que recorrer todos los datos de edad en el array y operar con ellos.


Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

ejercicio para un certamen

Publicado por daN jkzz (2 intervenciones) el 03/05/2014 06:54:32
Espero que te sirva (certamen.c adjunto), cualquier duda hazmela saber.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#define DATA_FILE "data.txt"
#define MAX_PERSON 256
#define MAX_NAME_LEN 32
#define MAX_LINE_LEN 256
#define MAX_DISPLAY 5
 
struct PERSON
{
    int id;
    char lastName[MAX_NAME_LEN];
    char firstName[MAX_NAME_LEN];
    int age;
 
} person[MAX_PERSON];
 
int readPerson(void);
void printPerson(int from, int to);
int isPersonRepeated(int id, int max);
float ageProm(int max);
double ageDesv(int media, int max);
 
int main( int argc, char **args)
{
    int max = readPerson();
    int from = 0;
    int to = MAX_DISPLAY;
 
    if( max )
    {
        do
        {
            printPerson( from, to );
            from += MAX_DISPLAY;
            to = (to + MAX_DISPLAY > max) ? max : to + MAX_DISPLAY;
            puts( "Press to continue..");
 
        }while( getchar() && from < max );
 
        printf( "Age prom : %.2f\n", ageProm( max ) );
        printf( "Age desv : %.2f\n", ageDesv( ageProm(max), max ) );
        printf( "Readed   : %d\n", max + 1);
    }
    else
        puts( "Empty file" );
 
    return EXIT_SUCCESS;
}
 
int readPerson(void)
{
    FILE *file;
    char line[MAX_LINE_LEN];
    int pNum = 0;
    int idTmp;
 
    if( (file = fopen( DATA_FILE, "r" )) == NULL)
    {
        puts( "Error : can\'t open file" );
        exit( EXIT_FAILURE );
    }
    
    while ( fgets(line, MAX_LINE_LEN, file) != NULL && pNum < MAX_PERSON )
    {
        sscanf( line, "%d", &idTmp);
        
        if( isPersonRepeated( idTmp, pNum ) )
            continue;
              
        sscanf( line, "%d %s %s %d", 
        &person[pNum].id, 
        person[pNum].lastName,
        person[pNum].firstName,
        &person[pNum].age );
        
        pNum++;
    }
    
    return pNum;
}

void printPerson(int from, int to)
{
    int i;
    
    if ( to <= 0 ) return;
    
    printf( "ID\tLastName\tFirstName\tAge\n\n" );
    for( i=from; i<to; i++ )
    {
        printf( "%-3d\t%-15s\t%-15s\t%-5d\n" ,
        person[i].id, 
        person[i].lastName,
        person[i].firstName,
        person[i].age);
    }     
}

int isPersonRepeated(int id, int max)
{
    int i;
    
    for( i=0; i<max; i++)
        if( id == person[i].id )
            return 1;
            
    return 0;    
}

float ageProm(int max)
{
    int count;
    int sum = 0;
    
    for( count=0; count<max; count++)
        sum += person[count].age;
        
    return (float) sum / count;
}

double ageDesv(int media, int max)
{
    int i;
    double sumDesv = 0;
    int ageTmp;
    
    for( i=0; i<max; i++)
    {
        ageTmp = person[i].age;
        sumDesv += pow( (ageTmp - media), 2);
    }
    
    return sqrt( sumDesv / i);      
}

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ejercicio para un certamen

Publicado por Chema (234 intervenciones) el 03/05/2014 11:51:30
El certamen debe premiar el error.

Separar con un espacio los campos impide la inserción de nombres compuestos, tipo Juan de la Cierva.

Si nos basamos solo en el nombre es imposible encontrar auténticos repetidos, el campo ID debe reflejar un identificador único.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar