UNIPLI Linguagem de Programação I Professora Simoni Rangel de Freitas Oliveira Estruturas e tipos definidos pelo usuário (continuação) 4. Estruturas e funções (passagem de estruturas para funções) Suponha as seguintes declarações de estruturas: struct data{ int dia, mes, ano; }; struct funcionario{ char nome[50]; double salario; struct data nascimento; }x; 1. Passagem de alguns elementos da estrutura para funções A passagem de um ou mais elementos de uma estrutura para uma função é feita por valor. Sintaxe: func(estrutura.elemento); Exemplo: altera_salario(x.salario); altera_salario - identificador da função x.salario - elemento da estrutura x Função “altera_salario” double altera_salario (double salario) { double novo_salario; novo_salario= salario*1.1; return novo_salario; } Chamada à função “altera_salario”, passando o elemento “x.salário”: x.salario=altera_salario(x.salario); 2. Passagem de toda a estrutura para funções A passagem de toda uma estrutura para uma função pode ser feita por valor. Na definição da função o parâmetro declarado deve ser do tipo da estrutura que está sendo passada. Exemplo: void imprime(struct funcionario p) // o parâmetro é do tipo struct funcionario { puts(p.nome); printf("Salario: %.2lf", p.salario); printf("\nData de nascimento: %d/%d/%d\n\n", p.nascimento.dia, p.nascimento.mes, p-.nascimento.ano ); 1 UNIPLI Linguagem de Programação I Professora Simoni Rangel de Freitas Oliveira } Exemplo 1: #include<stdio.h> #include<string.h> #include<stdlib.h> //Declaração das estruturas struct data { int dia, mes, ano; }; struct funcionario { char nome[50]; double salario; struct data nascimento; }; //Protótipo da função void imprime(struct funcionario p); //Função principal int main() { int i; struct funcionario x, y; strcpy(x.nome,"Adriana Martins"); x.salario=500.00; x.nascimento.dia=10; x.nascimento.mes=5; x.nascimento.ano=1982; strcpy(y.nome,"Luciano Araujo de Lima"); y.salario=540.00; y.nascimento.dia=23; y.nascimento.mes=8; y.nascimento.ano=1983; puts("\nFuncionarios:\n"); imprime(x); imprime(y); system("pause"); return 0; } //Função void imprime(struct funcionario p) { puts(p.nome); printf("Salario: %.2lf", p.salario); printf("\nData de nascimento: %d/%d/%d\n\n", p.nascimento.dia, p.nascimento.mes, p.nascimento.ano); } 2 UNIPLI Linguagem de Programação I Professora Simoni Rangel de Freitas Oliveira No programa do Exemplo 1, • as estruturas x e y são do tipo struct funcionário • imprime(x); // passagem por valor • mprime(y); // passagem por valor Saída: Funcionarios: Adriana Martins Salario: 500.00 Data de nascimento: 10/5/1982 Luciano Araujo de Lima Salario: 540.00 Data de nascimento: 23/8/1983 Pressione qualquer tecla para continuar. . . 5. Tipos definidos pelo usuário A linguagem C permite a criação de novos nomes de tipo de dado usando o comando typedef. Sintaxe: typedef tipo novo-nome; Exemplos: typedef float real; real a, b, c[10]; typedef int inteiro; inteiro d, e[5]; typedef struct reg_aluno Raluno; Raluno aluno_Manha[2000]; Raluno aluno_Noite[5000]; // struct reg_aluno é o tipo 3 UNIPLI Linguagem de Programação I Professora Simoni Rangel de Freitas Oliveira Exemplo 2: #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 20 //Definição de novos tipos typedef int inteiro; typedef float real; typedef char caracter; //Declaração das estruturas typedef struct data { inteiro dia, mes, ano; }Data; typedef struct funcionario { caracter nome[50]; real salario; Data nascimento; }Funcionario; //Protótipo da função void imprime(Funcionario p[N], real media); //Função principal int main() { inteiro i; real m=0.0; Funcionario x[N]; for(i=0; i<N; i++) { puts("\nEntre com o nome:\n"); fflush(stdin); gets(x[i].nome); fflush(stdin); puts("\nEntre com o salario:\n"); scanf("%f", &x[i].salario); m+=x[i].salario; puts("\nEntre com a data de nascimento:\n"); scanf("%d %d %d", &x[i].nascimento.dia, &x[i].nascimento.mes, &x[i].nascimento.ano ); } m=m/N; puts("\nFuncionarios:\n"); imprime(x, m); system("pause"); return 0; } 4 UNIPLI Linguagem de Programação I Professora Simoni Rangel de Freitas Oliveira //Função void imprime(Funcionario p[N], real media) { inteiro i; for(i=0; i<N; i++) { puts(p[i].nome); printf("Salario: R$%.2f", p[i].salario); printf("\nData de nascimento: %d/%d/%d\n\n", p[i].nascimento.dia,p[i].nascimento.mes, p[i].nascimento.ano ); } printf(" Media de salario: R$%.2f\n", media); } Bibliografia HICKSON, Rosângela. Aprenda a programar em C, C++ e C#. Ed. Campus, 2002. GOTTFRIED, B. S. Programando em C. Editora LTC, 1993. KERNIGHAN, B. W., RITCHIE, D. M. C: A linguagem de programação – Padrão ANSI. Ed. Campus, 1989. 5