/* * Modulo: leituras.c * * Descricao: * Este modulo define algumas funcoes que simplificam a leitura de * valores do teclado. * * Autores: * Manuel Menezes de Sequeira, ISCTE. * * Notas: * * Historia: * Autor: Data: Notas: * MMS 1996/4/19 primeira versao * * Copyright (c) ISCTE, 1996. */ /* A inclusao de stdlib.h e' necessaria para que a macro EXIT_FAILURE seja convenientemente definida. */ #include <stdlib.h> #include <stdio.h> #include "leituras.h" /* * Funcao: LEmataLinha() * * Accao: * Elimina todos os caracteres ate' ao proximo fim-de-linha ou ate' ao * fim do ficheiro. * * Parametros: * Nao tem. * * Devolve: * Nada. */ void LEmataLinha(void) { int c; while((c = getchar()) != '\n' && c != EOF) /* Nada. */; } /* * Funcao: LEvalor() * * Accao: * Le um valor inteiro do teclado, com uma determinada gama, e devolve-o. * * Parametros: * mensagem (entrada) - mensagem de pedido de entrada a imprimir. * min, max (entrada) - especificam gama admissivel para o valor n lido: se * min < max, min <= n <= max, se min == max, n >= min, se min > max, * nao ha' restricoes ao valor de n. * * Devolve: * O valor lido. * * Erros: * Caso seja atingido o fim da entrada (stdin) o programa e' abortado. */ int LEvalor(const char *mensagem, int min, int max) { int n, res; int valido; do { if(min == max) printf(mensagem, min); else if(min > max) printf(mensagem); else printf(mensagem, min, max); if((res = scanf("%d", &n)) == EOF) { fprintf(stderr, "Erro: lendo valor!\n"); exit(EXIT_FAILURE); } if(min == max) valido = (n >= min); else if(min > max) valido = 1; else valido = (n >= min && n <= max); LEmataLinha(); } while(res != 1 || !valido); return n; } /* * Funcao: LEdouble() * * Accao: * Le um valor double do teclado. * * Parametros: * mensagem (entrada) - mensagem de pedido de entrada a imprimir. * * Devolve: * O valor lido. * * Erros: * Caso seja atingido o fim da entrada (stdin) o programa e' abortado. */ double LEdouble(const char *mensagem) { int res; double v; do { printf(mensagem); if((res = scanf("%lg", &v)) == EOF) { fprintf(stderr, "Erro: lendo double!\n"); exit(EXIT_FAILURE); } LEmataLinha(); } while(res != 1); return v; } /* * Funcao: LEnome() * * Accao: * Le uma cadeia de caracteres, consistindo apenas de letras, espacos ou * pontos, do teclado. * * Parametros: * mensagem (entrada) - mensagem de pedido de entrada e imprimir. * nome (saida) - cadeia para onde ler. * dimensao (entrada) - numero maximo de caracteres a ler. * * Devolve: * Nada. * * Erros: * Caso seja atingido o fim da entrada (stdin) o programa e' abortado. */ void LEnome(const char *mensagem, char *nome, int dimensao) { char formato[100]; int res; sprintf(formato, "%%%d[a-z.A-Z ]", dimensao); do { printf(mensagem); if((res = scanf(formato, nome)) == EOF) { fprintf(stderr, "Erro: lendo nome!\n"); exit(EXIT_FAILURE); } LEmataLinha(); /* para eliminar resto da linha. */ } while(res != 1 || nome[0] == '\0'); } /* * Funcao: LEcadeia() * * Accao: * Le uma cadeia de caracteres nao-brancos. * * Parametros: * mensagem (entrada) - mensagem de pedido de entrada e imprimir. * nome (saida) - cadeia para onde ler. * dimensao (entrada) - numero maximo de caracteres a ler. * * Devolve: * Nada. * * Erros: * Caso seja atingido o fim da entrada (stdin) o programa e' abortado. */ void LEcadeia(const char *mensagem, char *nome, int dimensao) { char formato[100]; int res; sprintf(formato, "%%%ds", dimensao); do { printf(mensagem); if((res = scanf(formato, nome)) == EOF) { fprintf(stderr, "Erro: lendo cadeia!\n"); exit(EXIT_FAILURE); } LEmataLinha(); /* para eliminar resto da linha. */ } while(res != 1 || nome[0] == '\0'); }