Linha | Codigo |
001 | // Prof. Leo^nidas - http://www.matematica.br http://line.ime.usp.br |
002 | // MAC0122 - 2017/09/22 |
003 | // |
004 | // Descricao: Exemplo de uso de "struct" e "typedef" (para construir novos tipos) e passagem por referencia de "struct". |
005 | |
006 | #include <stdio.h> |
007 | #include <string.h> // para 'strcpy(...)' |
008 | |
009 | #define MAX 50 // numero maximo de registros |
010 | #define TE 10 // numero maximo de nomes no exemplo |
011 | |
012 | typedef struct { // declaracao de construtor de tipo composto |
013 | int id; // identificador interno do registro |
014 | double cpf; // usar 'double' para evitar que 9 digitos "estoure" a precisao de "float" |
015 | char nome[MAX]; |
016 | } Registro; // nome do novo tipo |
017 | |
018 | // Exemplo de declaracao de vetor de constantes |
019 | char * exemplosNomes[] = { "aluno 0", "aluno 1", "aluno 2", "aluno 3", "aluno 4", "aluno 5", "aluno 6", "aluno 7", "aluno 8", "aluno 9" }; |
020 | |
021 | // Busca registro cujo identificador eh ID |
022 | // Devolve: j entre e e d se encontrou na posicao j; -1 se x nao pertence a 'vet[e..d]' |
023 | int buscaPorId (Registro vet[], int n, int id) { |
024 | // fazer... |
025 | return -1; |
026 | } |
027 | |
028 | // Busca registro por nome |
029 | // Devolve: j entre e e d se encontrou na posicao j; -1 se x nao pertence a 'vet[e..d]' |
030 | int buscaPorNome (Registro vet[], int n, char *nome) { |
031 | // fazer... |
032 | return -1; |
033 | } |
034 | |
035 | void imprimeRegistro (Registro reg) { |
036 | printf(" - %3d : %11.2f : %s\n", reg.id, reg.cpf, reg.nome); |
037 | } |
038 | |
039 | // Insere dados para registro |
040 | // Obrigatorio passar o Registro por referencia para o parametro efetivo ser alterado (onde houve a chamada) |
041 | void inseriRegistro (Registro *reg, int idP, double cpfP, char *nomeP) { |
042 | reg->id = idP; // Note que para pegar campo de "apontador para registro" usa-se a diretiva "->", |
043 | reg->cpf = cpfP; // experimente compilar com "*reg.id = idP; *reg.cpf = cpfP;" para ver o que ocorre |
044 | strcpy(reg->nome, nomeP); |
045 | } |
046 | |
047 | // Comeca aqui... |
048 | int main (void) { |
049 | Registro dados[MAX]; // vetor de registros |
050 | int n = TE; |
051 | int i; |
052 | double cpf = 123123123.12; |
053 | // entrada de dados: tem que estar ordenado! |
054 | for (i=0; i<n; i++) { |
055 | inseriRegistro(&dados[i], i, cpf, exemplosNomes[i]); |
056 | imprimeRegistro(dados[i]); |
057 | cpf += 10.01; |
058 | } |
059 | return 0; |
060 | } |