Mudanças entre as edições de "AULA 13 - Programação 1 - Engenharia"
Linha 736: | Linha 736: | ||
#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. | #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. | ||
#Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.{{collapse top|solução}}<syntaxhighlight lang=c> | #Implementar uma funcionalidade do administrador para desbloquear o usuário bloqueado.{{collapse top|solução}}<syntaxhighlight lang=c> | ||
− | + | #include <stdio.h> | |
#include <string.h> | #include <string.h> | ||
Linha 747: | Linha 747: | ||
struct TRegistroUsuario { | struct TRegistroUsuario { | ||
− | char UserId[10]; | + | int userEncontrado=1; |
+ | int i; | ||
+ | |||
+ | printf("MODO ADMIN!!!! \n"); | ||
+ | printf("Entre com a senha do admin \n"); | ||
+ | scanf ("%s", aux_senha); | ||
+ | |||
+ | if(strcmp(aux_senha,"123456")==0) { | ||
+ | /* senha valida do admin - agora entre com userid a ser desbloqueado */ | ||
+ | printf("Entre com userdID a ser desbloqueado\n"); | ||
+ | scanf("%s",userID); | ||
+ | for (i=0;i<4 && userEncontrado; i++) { | ||
+ | if( strcmp(userID, TabelaUsuarios[i].UserId)==0) | ||
+ | userEncontrado=0; | ||
+ | } | ||
+ | if (userEncontrado==0) { | ||
+ | i--; | ||
+ | TabelaUsuarios[i].contador=0; | ||
+ | printf("ATENÇÃO: o usuário %s foi desbloqueado!\n", TabelaUsuarios[i].UserId); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /** Função que valida um usuário e abre a porta **/ | ||
+ | |||
+ | void tratar_usuario() | ||
+ | { | ||
+ | char senha[10]; | ||
+ | int userEncontrado=1; | ||
+ | int i; | ||
+ | |||
+ | |||
+ | /* | ||
+ | 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) { | ||
+ | i--; /* o indice do sujeito é i-1 */ | ||
+ | if (TabelaUsuarios[i].contador<3){ | ||
+ | printf("Bom dia %s! Entre com a senha\n", userID); | ||
+ | scanf("%s",senha); | ||
+ | if(strcmp(senha,TabelaUsuarios[i].Senha)==0) { | ||
+ | printf("Abrir porta!!!\n"); | ||
+ | TabelaUsuarios[i].contador=0; | ||
+ | } else { | ||
+ | TabelaUsuarios[i].contador++; | ||
+ | printf("Senha Inválida\n"); | ||
+ | printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador); | ||
+ | if (TabelaUsuarios[i].contador==3) | ||
+ | printf("ATENÇÃO usuário %s - fale com o ADMINISTRADOR DO SISTEMA - SEU LOGIN FOI BLOQUEADO!\n", TabelaUsuarios[i].UserId); | ||
+ | } | ||
+ | } else { | ||
+ | printf("Usuário bloqueado\n"); | ||
+ | } | ||
+ | } else { | ||
+ | printf("Usuário não encontrado\n"); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void main() | ||
+ | { | ||
+ | for(;;) { | ||
+ | mostrar_menu_entrada_usuario(); | ||
+ | scanf("%s",userID); | ||
+ | if (strcmp(userID, "admin")==0) { | ||
+ | administrar(); | ||
+ | } else { | ||
+ | tratar_usuario(); | ||
+ | } | ||
+ | } | ||
+ | } char UserId[10]; | ||
char Senha[10]; | char Senha[10]; | ||
int contador; | int contador; | ||
Linha 823: | Linha 900: | ||
if (userEncontrado==0) { | if (userEncontrado==0) { | ||
i--; /* o indice do sujeito é i-1 */ | i--; /* o indice do sujeito é i-1 */ | ||
− | if (TabelaUsuarios[i].contador<3){ | + | if (TabelaUsuarios[i].contador<3){ |
− | + | printf("Bom dia %s! Entre com a senha\n", userID); | |
− | + | scanf("%s",senha); | |
− | + | if(strcmp(senha,TabelaUsuarios[i].Senha)==0) { | |
− | |||
− | |||
printf("Abrir porta!!!\n"); | printf("Abrir porta!!!\n"); | ||
TabelaUsuarios[i].contador=0; | TabelaUsuarios[i].contador=0; | ||
− | + | } else { | |
− | + | TabelaUsuarios[i].contador++; | |
− | + | printf("Senha Inválida\n"); | |
− | + | printf("Tentativas restantes %d\n", 3-TabelaUsuarios[i].contador); | |
if (TabelaUsuarios[i].contador==3) | if (TabelaUsuarios[i].contador==3) | ||
printf("ATENÇÃO usuário %s - fale com o ADMINISTRADOR DO SISTEMA - SEU LOGIN FOI BLOQUEADO!\n", TabelaUsuarios[i].UserId); | printf("ATENÇÃO usuário %s - fale com o ADMINISTRADOR DO SISTEMA - SEU LOGIN FOI BLOQUEADO!\n", TabelaUsuarios[i].UserId); | ||
− | + | } | |
} else { | } else { | ||
printf("Usuário bloqueado\n"); | printf("Usuário bloqueado\n"); |
Edição das 08h19min de 23 de outubro de 2018
Objetivos
- Definição de estruturas;
- Estruturas como parâmetros;
- Inicialização de estruturas;
- Cópia de estruturas;
- Exercícios com estruturas.
Estruturas
No C é possível criar tipos de dados que representam uma estrutura. Veja o exemplo seguinte
#include <stdio.h>
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */
{
char userID[20];
char senha[20];
int num_acessos;
} Usuario; /* aqui é definida uma variável do tipo struct TUsuario */
/* aqui uma tabela/vetor de estruturas */
struct TUsuario TabelaUsuario[20];
main()
{
/* acessando os campos da estrutura Usuario */
scanf("%s", Usuario.userId);
scanf("%s", Usuario.senha);
Usuario.num_acessos=0;
/* acessando o campo 10 da tabela de estruturas */
scanf("%s", TabelaUsuario[10].userID);
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
- Criar um tipo estrutura que permita repŕesentar um retângulo. Criar duas variáveis retângulo e mostrar como as áreas destes retângulos poderiam ser somadas.
#include <stdio.h> struct tipo_retang{ float lado1; float lado2; }; main() { struct tipo_retang x,y; float area_final; x.lado1=5.5; x.lado2=6.7; y.lado1=2.3; y.lado2=7.9; /* poderia entrar com scanf: scanf("%f",&y.lado2); etc */ area_final = x.lado1*x.lado2 + y.lado1*y.lado2; printf("Área total dos dois retângulos = %f \n", area_final); }
- Criar um tipo estrutura que permita armazenar os coeficientes de uma equação do segundo grau. Implementar um código para calcular o DELTA da equação.
- Criar um programa que define uma struct para armazenamento do nome e das notas bimestrais de um aluno. Atualizar a estrutura usando o scanf.
#include <stdio.h> #define NUM_MAX 3 struct TAluno { char nome[30]; char matricula[11]; float b1,b2,b3,b4; } Turma[NUM_MAX]; void print_aluno(struct TAluno aux) { printf("Nome -> %s\n", aux.nome); printf("Matrícula -> %s\n", aux.matricula); printf("Bimestre 1 -> %f\n", aux.b1); printf("Bimestre 2 -> %f\n", aux.b2); printf("Bimestre 3 -> %f\n", aux.b3); printf("Bimestre 4 -> %f\n", aux.b4); } main() { int i; for(i=0;i<NUM_MAX;i++) { printf("Entre com o nome do aluno\n"); scanf("%s", Turma[i].nome); printf("Entre com a matrícula do aluno\n"); scanf("%s", Turma[i].matricula); printf("Entre com a nota do bimestre 1\n"); scanf("%f", &Turma[i].b1); printf("Entre com a nota do bimestre 2\n"); scanf("%f", &Turma[i].b2); printf("Entre com a nota do bimestre 3\n"); scanf("%f", &Turma[i].b3); printf("Entre com a nota do bimestre 4\n"); scanf("%f", &Turma[i].b4); } }
- Acrescentar um código no final da função main para calcular a média da turma para cada um dos bimestres.
solução | ||||||||
---|---|---|---|---|---|---|---|---|
#include <stdio.h>
#include <string>
#define NUM_MAX 3
struct TAluno {
char nome[30];
char matricula[11];
float b1,b2,b3,b4;
} Turma[NUM_MAX];
void print_aluno(struct TAluno aux)
{
printf("Nome -> %s\n", aux.nome);
printf("Matrícula -> %s\n", aux.matricula);
printf("Bimestre 1 -> %f\n", aux.b1);
printf("Bimestre 2 -> %f\n", aux.b2);
printf("Bimestre 3 -> %f\n", aux.b3);
printf("Bimestre 4 -> %f\n", aux.b4);
}
main()
{
int i;
float media_b1=0,media_b2=0,media_b3=0,media_b4=0;
for(i=0;i<NUM_MAX;i++) {
printf("Entre com o nome do aluno\n");
scanf("%s", Turma[i].nome);
printf("Entre com a matrícula do aluno\n");
scanf("%s", Turma[i].matricula);
printf("Entre com a nota do bimestre 1\n");
scanf("%f", &Turma[i].b1);
printf("Entre com a nota do bimestre 2\n");
scanf("%f", &Turma[i].b2);
printf("Entre com a nota do bimestre 3\n");
scanf("%f", &Turma[i].b3);
printf("Entre com a nota do bimestre 4\n");
scanf("%f", &Turma[i].b4);
}
/* calculo das médias bimestrais da turma */
/* separado do primeiro for para caracterizar a diferença de entrada de dados do processamento ... */
for(i=0;i<NUM_MAX;i++) {
media_b1=media_b1+Turma[i].b1; /* usando media_b1 para soma acumulada */
media_b2=media_b2+Turma[i].b2;
media_b3=media_b3+Turma[i].b3;
media_b4=media_b4+Turma[i].b4;
}
media_b1=media_b1/NUM_MAX;
media_b2=media_b2/NUM_MAX;
media_b3=media_b3/NUM_MAX;
media_b4=media_b4/NUM_MAX;
}
Copiando structsO 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);
}
Estruturas dentro de estruturasVamos 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);
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);
}
Exercício: Faça um código adicional para imprimir o conteúdo lido na estrutura. #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 print_endereco(struct TEndereco aux)
{
printf ("Rua %s Número %s\n", aux.rua, aux.numero);
}
void print_cidadao(struct TCidadao aux)
{
printf("Nome: %s CPF: %s ", aux.nome, aux.cpf);
print_endereco(aux.endereco);
printf("Numero de filhos %d\n", aux.num_filhos);
}
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_cidadao(Cidadao);
}
Iniciando structs na definiçãoComo 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);
}
Passando estruturas como parâmetro e retornando estruturasSe 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 conceita de ponteiro. Observe o exercício abaixo. #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 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;
}
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);
}
Aplicação de estruturas - Representação de números complexosUm número complexo possui dois componentes reais que podem ser representados por duas variáveis float ou double. Observe que a declaração separada destes componentes prejudica a legibilidade do código e a construção de algoritmos eficientes para o tratamento destes números. Na sequência apresentamos exercícios que representam números complexos em estruturas.
Aplicação no Controle de AcessoO 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. A função strcmp da BIBLIOTECA DO C para comparação de strings. Ela retorna 0 caso as strings a serem comparadas sejam iguais. Note que deve ser incluído string.h #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;
/*
Loop para encontrar o usuário na tabela.
Ao final do loop a variavel i conterá o índice do usuário (menos 1)(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();
}
}
}
Exercício:
Referênciashttps://www.geeksforgeeks.org/memory-layout-of-c-program/ https://docs.cs50.net/2017/fall/notes/5/lecture5.html#data-structures http://www.mathwarehouse.com/programming/passing-by-value-vs-by-reference-visual-explanation.php |