Consultas, desarrollo de programas y petición de presupuestos:

jueves, 12 de julio de 2012

examen 2: solución del profe

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <time.h>

// Tabla de records
// crear estructura
typedef struct {
    char nombre[20];
    int intentos;
} tipoRecord;

// Funciones
void leerArchivoRecords(tipoRecord *);
void asignarRecordsIniciales(tipoRecord *);
void guardarArchivoRecords(tipoRecord *);
void mostrarTablaRecords(tipoRecord *);
int pedirNum(char *);
int jugarPartida();
void comprobarTablaRecords(int, tipoRecord *);


int main(int argc, char **argv)
{
    // Variables
    tipoRecord tablaRecords[10];
    int c = 0;        // Contador para bucles
    int op = -1;    // Opción del usuario
    int inten = 0;    // Intentos usados en cada partida

    // Preparamos secuencia de nº aleatorios
    srand(time(NULL));
    // leer archivo de records y pasarlo a la tabla
    leerArchivoRecords(tablaRecords);
    // Mientras quiera seguir jugando
    while(op != 2) {
        // Mostrar records actuales
        mostrarTablaRecords(tablaRecords);
        // Mostrar menú
        printf("1 Jugar     2 Salir\n");
        // Pedir opción al usuario
        op = pedirNum("Introduzca la opción ");
        // Procesar opción de menú
        switch(op) {
        case 1:        // Jugar partida
            inten = jugarPartida();
            comprobarTablaRecords(inten, tablaRecords);
            break;
        case 2:        // Salir
            printf("Hasta luego\n");
            break;
        }
    } // Fin mientras
    // Guardar archivo con tabla de records
    guardarArchivoRecords(tablaRecords);
    return 0;
}

// pasa los 10 records del archivo a la tabla
void leerArchivoRecords(tipoRecord *tr)
{
    FILE *pf;
    // Abrir de lectura
    if((pf = fopen("records", "r")) == NULL) {
        // Ha fallado la apertura (No existe el archivo)
        asignarRecordsIniciales(tr);
        guardarArchivoRecords(tr);
        pf = fopen("records", "r");
    }
    // Leer contenido
    fread(tr, sizeof(tipoRecord), 10, pf);
    // Cerrar
    fclose(pf);
}

// Guarda la tabla de records en el archivo
void guardarArchivoRecords(tipoRecord *tr)
{
    FILE *pf;
    // Abrir de escritura
    if((pf = fopen("records", "w")) == NULL) {
        // Ha fallado la apertura (error irrecuperable)
        printf("Cascazo del 15\n");
        exit(1);
    }
    // Guardar contenido
    fwrite(tr, sizeof(tipoRecord), 10, pf);
    // Cerrar
    fclose(pf);
}

// Asigna valores iniciales a la tabla de records
void asignarRecordsIniciales(tipoRecord *tr)
{
    int c = 0;

    // Recorre los 10 records
    for(c = 0; c < 10; c++) {
        strcpy(tr[c].nombre, "Nadie");    // A cada record le asigna como nombre "nadie"
        tr[c].intentos = 999999;        // A cada record le asigna como intentos 999999
    }
}

// Muestra los 10 records actuales
void mostrarTablaRecords(tipoRecord *tr)
{
    int c = 0;

    printf("***** RECORDS ACTUALES *****\n");
    // Recorre los 10 records
    for(c = 0; c < 10; c++) {
        printf("%-20s %7d\n", tr[c].nombre, tr[c].intentos);
    }
}

// pide un número por teclado mostrando antes el mensaje indicado en texto
int pedirNum(char *texto)
{
    int resp = 0;

    printf("%s", texto);
    scanf("%d", &resp);

    return resp;
}

int jugarPartida()
{
    int ale = 0;
    int num = 0;
    int inten = 0;

    // Nº aleatorio
    ale =  1+(int) (100000.0*rand()/(RAND_MAX+1.0));
    printf(" %d ",ale);
    // Mientras aleatorio != usuario
    while(ale != num) {
        // Pedir nª al usuario
        num = pedirNum("Introduzca un número ");
        // comprobar nª usuario y aleatorio
        // mayor, menor, igual, contar intentos
        inten ++;
        if(num > ale) {
            printf("Te has pasado de largo\n");
        } else {
            if(num < ale) {
                printf("Te has quedado corto\n");
            } else {
                printf("CORRECTO\n");
            }
        }
    }
    return inten;
}

// Comprueba si entra en la tabla de records
void comprobarTablaRecords(int inten, tipoRecord *tr)
{
    int pos = 0;
    int c = 0;
    char nombre[20];

    // Buscar la posición en la que quedaría "inten" en la tabla de 10 records
    while(tr[pos].intentos < inten && pos < 10) {
        pos++;
    }
    // Si entra
    if(pos < 10) {
        // Pedir nombre
        printf("Ha entrado en la tabla de records\n");
        printf("Indique su nombre: ");
        scanf("%s", nombre);
        // Mover los records 1 hacia abajo
        c = 9;
        while(c > pos) {
            strcpy(tr[c].nombre, tr[c - 1].nombre);        // Pasa el nombre 8 a la posición 9
            tr[c].intentos = tr[c - 1].intentos;
            c--;
        }
        // Insertar el nuevo record
        strcpy(tr[pos].nombre, nombre);
        tr[pos].intentos = inten;
    }
}

No hay comentarios:

Publicar un comentario