Buscar

Estruturas (struct)

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

Continue navegando