Baixe o app para aproveitar ainda mais
Prévia do material em texto
28/11/2023, 08:19 PR1022804 2023 2 AULA10 - MediaWiki do Campus São José https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA10 1/7 PR1022804 2023 2 AULA10 Estruturas (struct) Copiando estruturas Estruturas dentro de estruturas Iniciando estruturas na definição Passando estruturas como parâmetro e retornando estruturas Aplicação no Controle de Acesso Desafios com Structs Exercícios Referências Estruturas (struct) OBJETIVOS O aluno deverá saber: Como é a definição de Estruturas; Como passar Estruturas por parâmetro; Inicializar dados em estruturas; e fazer cópias de estruturas. METODOLOGIA A aula será expositiva e dialogada, utilizando apresentação de texto base na Internet, onde serão mostrados exemplos testados programas no microcomputador do laboratório de informática. Na linguagem C é possível criar tipos de dados que representam uma estrutura. EXEMPLO #include <stdio.h> struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */ { char userID[20]; char senha[20]; } Usuario; /* aqui é definida uma variável do tipo struct TUsuario */ struct TUsuario TabelaUsuario[20]; void main() { scanf("%s", Usuario.userID); scanf("%s", Usuario.senha); scanf("%s", TabelaUsuario[10].userID); Índice 28/11/2023, 08:19 PR1022804 2023 2 AULA10 - MediaWiki do Campus São José https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA10 2/7 [Expandir] scanf("%s", TabelaUsuario[10].senha); } Neste exemplo, foi definido um tipo (modelo) para o registro (struct TUsuario) e foi criada uma variável chamada Usuario a partir deste tipo. Na sequência foi criada mais uma variável (um vetor de estruturas) chamada TabelaUsuario. Note que basta usar as palavras chave struct Usuario para criar novas variáveis. O tipo completo é definido uma única vez no início. EXERCÍCIOS 1. Criar um programa que define uma struct para armazenamento do nome e das notas bimestrais de um aluno. Atualizar a estrutura usando o scanf. 2. Alterar o programa para que ele calcule e imprima a média de cada aluno. Resposta O exemplo a seguir demonstra como se pode copiar uma variável struct para outra do mesmo tipo. #include <stdio.h> struct THoras{ int hora; int minuto; int segundo; }; struct THoras Ontem = {2,10,57}; void main() { struct THoras Hoje; Hoje = Ontem; printf("Hora hoje = %d, Minuto hoje = %d e Segundo hoje %d\n", Hoje.hora, Hoje.minuto, Hoje.segundo); } Vamos ver um exemplo com estruturas definidas dentro de estruturas: #include <stdio.h> struct TEndereco{ char rua[50]; char numero[10]; }; struct TCidadao{ char nome[50]; char cpf[20]; struct TEndereco endereco; int num_filhos; }; void main() { struct TCidadao Cidadao; printf("Entre com o nome\n"); scanf ("%s",Cidadao.nome); // substitua por gets() printf("Entre com o cpf\n"); Copiando estruturas Estruturas dentro de estruturas 28/11/2023, 08:19 PR1022804 2023 2 AULA10 - MediaWiki do Campus São José https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA10 3/7 [Expandir] scanf ("%s",Cidadao.cpf); printf("Entre a rua\n"); scanf ("%s",Cidadao.endereco.rua); // substitua por gets() printf("Entre a numero\n"); scanf ("%s",Cidadao.endereco.numero); printf("Entre com o número de filhos\n"); scanf ("%d",&Cidadao.num_filhos); } Exercício 1: Faça um código adicional para imprimir o conteúdo lido na estrutura. Resposta Como toda variável, é possível dar valores para uma variável do tipo struct definida no programa: #include <stdio.h> struct TEndereco{ char rua[50]; char numero[10]; }; struct TCidadao{ char nome[50]; char cpf[20]; struct TEndereco endereco; int num_filhos; }; void main() { struct TCidadao Cidadao = {"Maria", "42342342234", {"Rua AlfaBeta","145"}, 5 }; printf("Rua do cidadao = %s\n", Cidadao.endereco.rua); } Se não for usado o operador "&" , um parâmetro que é estrutura será passado por cópia. Não apresentaremos agora a passagem por endereço pois necessita do conceito de ponteiro. Observe o exercício abaixo. #include <stdio.h> struct TEndereco{ char rua[50]; char numero[10]; }; struct TCidadao{ Iniciando estruturas na definição Passando estruturas como parâmetro e retornando estruturas 28/11/2023, 08:19 PR1022804 2023 2 AULA10 - MediaWiki do Campus São José https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA10 4/7 char nome[50]; char cpf[20]; struct TEndereco endereco; int num_filhos; }; void print_struct (struct TCidadao aux) { printf("nome=%s cpf=%s\n", aux.nome, aux.cpf); printf("endereço inicial do aux %p\n", &aux); } void main() { struct TCidadao Cidadao; printf("Entre com o nome\n"); scanf ("%s",Cidadao.nome); printf("Entre com o cpf\n"); scanf ("%s",Cidadao.cpf); printf("Entre a rua\n"); scanf ("%s",Cidadao.endereco.rua); printf("Entre a numero\n"); scanf ("%s",Cidadao.endereco.numero); printf("Entre com o número de filhos\n"); scanf ("%d",&Cidadao.num_filhos); print_struct(Cidadao); printf("endereço inicial do Cidadao %p\n", &Cidadao); } O que podemos concluir com os endereços que foram mostrados??? Vamos a mais um exemplo. #include <stdio.h> struct TEndereco{ char rua[50]; char numero[10]; }; struct TCidadao{ char nome[50]; char cpf[20]; struct TEndereco endereco; int num_filhos; }; struct TCidadao ler_struct() { struct TCidadao aux; printf("Entre com o nome\n"); scanf ("%s",aux.nome); printf("Entre com o cpf\n"); scanf ("%s",aux.cpf); printf("Entre a rua\n"); scanf ("%s",aux.endereco.rua); printf("Entre a numero\n"); scanf ("%s",aux.endereco.numero); printf("Entre com o número de filhos\n"); scanf ("%d",&aux.num_filhos); return aux; } 28/11/2023, 08:19 PR1022804 2023 2 AULA10 - MediaWiki do Campus São José https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA10 5/7 void print_struct (struct TCidadao aux) { printf("nome=%s cpf=%s\n", aux.nome, aux.cpf); printf("endereço inicial do aux %p\n", &aux); } void main() { struct TCidadao Cidadao; Cidadao = ler_struct(); print_struct(Cidadao); printf("endereço inicial do Cidadao %p\n", &Cidadao); } O exemplo a seguir implementa uma parte do programa de controle de acesso usando estruturas. Neste exemplo a tabela de usuários já vem inicializada nos campos UserID e Senha. #include <stdio.h> #include <string.h> /**********************************************/ /*** PROGRAMA DE CONTROLE DE ACESSO **/ /** Autor: TurmaENG.TELECOM - 2012.2 */ /**********************************************/ /** VARIÁVEIS GLOBAIS DESTE MÓDULO ****/ struct TRegistroUsuario { char UserId[10]; char Senha[10]; }; /* Tabela de Usuários */ struct TRegistroUsuario TabelaUsuarios[4] = { {"joao","abcd"}, {"maria","xxxx"}, {"jose","yyyy"}, {"lara","zzzz"}, }; char userID[20]; /** FUNÇÔES DESTE MÓDULO ****/ void mostrar_menu_entrada_usuario() { printf("*******************************\n"); printf("Entre com o seu USERID para ter acesso\n"); printf("*******************************\n"); } /** Função que implementa as tarefas do administrador **/ void administrar() { } /** Função que valida um usuário e abre a porta **/ void tratar_usuario() { char senha[10]; int userEncontrado=1; int i; Aplicação no Controle de Acesso 28/11/2023, 08:19 PR1022804 2023 2 AULA10 - MediaWiki do Campus São José https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA10 6/7 [Expandir] /* Loop para encontrar o usuário na tabela. Ao final do loop a variavel i conterá o índice do usuário (se ele estiver na tabela */ for (i=0;i<4 && userEncontrado; i++) { if( strcmp(userID, TabelaUsuarios[i].UserId)==0) userEncontrado=0; } /* se usuário encontrado abre a porta */ if (userEncontrado==0){ printf("Bom dia %s! Entre com a senha\n", userID); scanf("%s",senha); i--; /* o indice do sujeito é i-1 */ if(strcmp(senha,TabelaUsuarios[i].Senha)==0) printf("Abrir porta!!!\n"); else printf("Senha Inválida\n"); } } void main() { for(;;) { mostrar_menu_entrada_usuario(); scanf("%s",userID); if (strcmp(userID, "admin")==0) { administrar(); } else { tratar_usuario(); } } } Desafios com Structs DESAFIO 1 Implementar uma função converte_para_polar que recebe como parâmetro um número complexo na forma retangular (representado por uma struct). A função deve retornar uma struct contendo o número complexo na forma polar.Usar as funções sqrtf e atanf da [matemáticas (http://en.wikiped ia.org/wiki/C_mathematical_functions) biblioteca matemática]. Como converter (http://www.teache rschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm): ou NOTE Que as funções atanf e similares retornam valores em RADIANOS. Solução DESAFIO 2 Implementar uma função que some dois números complexos no formato retangular e retorne a soma como um complexo retangular. DESAFIO 3 Implementar uma função que some dois números complexos no formato polar e retorna a soma no formato polar. Exercícios http://en.wikipedia.org/wiki/C_mathematical_functions http://en.wikipedia.org/wiki/C_mathematical_functions http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm http://www.teacherschoice.com.au/maths_library/coordinates/polar_-_rectangular_conversion.htm 28/11/2023, 08:19 PR1022804 2023 2 AULA10 - MediaWiki do Campus São José https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA10 7/7 [Expandir] [Expandir] 1. Implementar um contador de acesso que permita bloquear o usuário após 3 tentativas seguidas. Note que caso o usuário acerte a senha, este contador deverá ser zerado. Solução 1 2. Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado. Solução 2 3. No programa de controle de senha inserir um campo na estrutura do usuário de forma a acomodar uma mensagem de boas vindas particularizada para cada usuário. A mensagem "DEFAULT" é Bom dia! 4. Implementar na função administrar a inserção da mensagem no exercício anterior. 5. Na solução acima criar uma função que procura usuário na tabela (já que este código é utilizado em mais do que um luga). A função deve receber o UserID a ser procurado e deve retornar um inteiro correspondente ao índice do usuário encontrado ou -1 se não for encontrado. Referências [1] https://pt.wikibooks.org/wiki/Programar_em_C/Estruturas Disponível em “https://wiki.sj.ifsc.edu.br/index.php?title=PR1022804_2023_2_AULA10&oldid=191649” Esta página foi modificada pela última vez em 5 de outubro de 2023, às 16h20min. https://pt.wikibooks.org/wiki/Programar_em_C/Estruturas https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA09 https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA09 https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2#Aulas https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2#Aulas https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA11 https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA11 https://wiki.sj.ifsc.edu.br/index.php?title=PR1022804_2023_2_AULA10&oldid=191649
Compartilhar