| 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 | } |