- Estruturas
Assim como o vetor a estrutura é um conjunto de dados, mas traz uma vantagem: a possibilidade de possuir "campos" de diferentes tipos de variáveis. Por exemplo, a struct TPessoa poderia ter os campos nome (char[40]) e idade (int).
A declaração genérica da estrutura é:
struct TNome_do_tipo {
//variável 1
//variável 2
//variável N
} nome_instancia;
- Convencionalmente damos ao tipo da estrutura um nome "TNome_do_tipo", onde "T" representa Tipo e a letra seguinte também vem em maiúscula
- nome_instancia representa a instancia de variável (do tipo struct) que será alocada em memória, esta declaração também pode ser um vetor "nome_instancia[10]", por exemplo
- Em uma declaração é necessário ao menos definir um dos parâmetros "TNome_do_tipo" ou "nome_instancia são opcionais"
#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];
main()
{
scanf("%s", Usuario.userID);
scanf("%s", Usuario.senha);
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 programa que define uma struct para armazenamento do nome e das notas bimestrais de um aluno. Atualizar a estrutura usando o scanf.
- Alterar o programa para que ele calcule e imprima a média de cada aluno.
#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);
}
for(i=0;i<NUM_MAX;i++) {
printf("=========== Aluno %d ============\n", i);
print_aluno(Turma[i]);
}
}
- Copiando Estruturas
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);
}
- Estruturas dentro de estruturas
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);
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);
}
- Iniciando structs na definição
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];
int numero;
};
struct TCidadao{
char nome[50];
char cpf[20];
struct TEndereco endereco;
};
int main(void)
{
//Inicializando com parâmetros em sequencia (ordem tem que ser respeitada)
struct TCidadao CidadaoMaria = {"Maria","42342342234",{"Rua AlfaBeta",145}};
//Inicializando com parâmetros via campo (não é necessário respeitar qualquer ordem)
struct TCidadao CidadaoJose = {.cpf = "1234567890", .endereco.numero = 541,.nome = "Jose",.endereco.rua = "Rua GamaDelta"};
printf("Rua do cidadao %s = %s\n", CidadaoMaria.nome, CidadaoMaria.endereco.rua);
printf("Rua do cidadao %s = %s\n", CidadaoJose.nome, CidadaoJose.endereco.rua);
}
- Passando estruturas como parâmetro e retornando estruturas
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 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);
}
Exercícios - avançado (série 0)
|
- Crie uma estrutura TUsuario com os campos UserID, senha e quantidade de tentativas. 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. Inclua na estrutura uma variavel _Bool para dizer se o usuário é administrador. Se for, este usuário pode ter acesso a um menu (que você deve desenvolver) de desbloqueio de usuário ao digitar um UserID de certo usuário bloqueado.
- 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!
- Implementar na função administrar a inserção da mensagem no exercício anterior.
- 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 lugar). 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.
- Implemente um programa onde no laço principal solicita se o usuário deseja calcular a área de um triângulo ou de um retângulo. De acordo com a seleção invoca uma função específica (ambas recebendo os argumentos base e altura). Utilize structs para armazenar a base e altura que o usuário digitar e a área calculada (retornada da função). Lembre-se que a área do retângulo é dada pela base vezes a altura e a do triângulo pela base vezes altura sobre 2.
|
Unions
|
Union é um recurso do C que permite declarar um conjunto de dados que irá ocupar um mesmo espaço. É bastante empregado quando se deseja economizar espaço ou não se tem certeza sobre qual tipo de dado deve ser armazenado para determinada instancia. No exemplo a seguir é criada uma struct chamada TProduto e dentro destra estrutura há uma área de detalhamento do produto que é de uso genérico, para alguns produtos há campos específicos para preenchimento e outros não se tem ao certo os detalhes, portanto fica um campo de uso geral.
#include <stdio.h>
struct TRoupeiro{
char cor[20];
int volume;
float peso;
};
struct TProduto{
int id;
char nome[20];
union {
struct TRoupeiro roupeiro;
char descricao_generica[sizeof(int)+sizeof(float)+20];
};
};
int main(void)
{
struct TProduto vaso_decorativo = {
.id = 2,.nome = "Vaso decorativo 1",
.descricao_generica = "em vidro - peça única"
};
struct TProduto guarda_roupas_solteiro = {
.id = 1,.nome = "Roupeiro 3 portas",
.roupeiro.cor = "CZ", .roupeiro.volume = 304,.roupeiro.peso = 50.0
};
printf("nome = %s, \ndescrição = %s, \ncor = %s, \nvolume = %d, \npeso = %f\n\n\n",
guarda_roupas_solteiro.nome,
guarda_roupas_solteiro.descricao_generica,
guarda_roupas_solteiro.roupeiro.cor,
guarda_roupas_solteiro.roupeiro.volume,
guarda_roupas_solteiro.roupeiro.peso
);
printf("nome = %s, \ndescrição = %s, \ncor = %s, \nvolume = %d, \npeso = %f\n\n\n",
vaso_decorativo.nome,
vaso_decorativo.descricao_generica,
vaso_decorativo.roupeiro.cor,
vaso_decorativo.roupeiro.volume,
vaso_decorativo.roupeiro.peso
);
}
- Observe que a union é feita de duas entre uma struct e um vetor de caracteres. O autor neste código criou este vetor baseado no tamanho que ocupa a struct aproveitando todo o espaço já alocado, porém o C não exige que os dados ocupem o mesmo espaço, neste caso a alocação ocorrerá em relação a maior estrutura.
- Observe que ao imprimir os valores da instancia "guarda_roupas" o "descricao_generica" apesar de não ter sido formalmente preenchido, foi indiretamente preenchido quando no caso "roupeiro.cor" recebeu um valor. Como este valor foi "Cinza" o C escreveu um "\0" no final da string "roupeiro.cor" que acabou também servindo como final da string "descricao_generica", por isso neste print ambos os campos apresentam o mesmo valor. Porém observe também que os valores de "volume" e "peso" estão perfeitamente preservados.
- Agora foi interessante o cado da instancia "vaso_decorativo", ela foi descrita pelo campo "descricao_generica" e apenas para fins didáticos o autor imprimiu o que teria dentro de "roupeiro.cor", "roupeiro.volume" e "roupeiro.peso". Neste caso cairam valores oriundos da constante "em vidro - peça única" que não passam de sujeira neste contexto.
|
Referências
Referências bibliográficas
|
- Araújo, Everton Coimbra de. Algoritmos: fundamento e prática; 3ª ed. [S.l]:Visual Books, 2007. 414p. ISBN 9788575022092.
- KERNIGHAN, Brian W.; RITCHIE, Dennis M C: a linguagem de programação padrão ANSI; 1ª ed.[S.l]:Campus, 1989. 304p. ISBN 9788570015860.
- SCHILDT, Herbert C Completo e Total; 3ª ed. [S.l]:Makron Books, 2009. 827p. ISBN 9788534605953.
- FORBELLONE, Andre L. Lógica de Programação; 3ª ed. [S.l]:Makron Books, 2005. 197p. ISBN 9788576050247.
- KING, K.N. C Programming: A Modern Approach; 2ª ed. [S.l]:W. W. Norton & Company, 2008. 832p. ISBN 9780393979503.
- MANZANO, Jose Augusto Navarro Garcia Estudo Dirigido em Linguagem C. ; 16ª ed. [S.l]:Erica, 2012. 216p. ISBN 9788571948877.
- NEVES, Júlio Cézar Programação Shell Linux; 5a ed. Rio de Janeiro:Brasport, 2005. 408p. ISBN 8574522031.
- VEIGA, Roberto G. A. Comandos do Linux: guia de consulta rápida; ed. São Paulo:Novatec, 2004. 144p. ISBN 85-7522-060-8.
|
Ferramentas úteis
|
- VisualG3: Uma IDE para desenvolvimento de programas em pseudocódigo (freeware), permite editar e compilar programas utilizando uma sintaxe própria de pseudocódigo muito parecida com a que trabalhamos em sala. Muito útil para verificar o funcionamento real dos algoritmos. Ver exemplos de códigos visualG3 em Exemplos VisualG3
- LibreOffice: O LibreOffice é um programa gratuito (freeware) e de código aberto (opensource). Além de editor de textos, planilhas e apresentações tem a ferramenta Draw que permite a criação de fluxogramas.
- VirtualBox: O Oracle VirtualBox é um programa gratuito (freeware) que permite criar e instanciar máquinas virtuais. O uso de máquinas virtuais é bastante interessante quando desejamos ter diferentes sistemas operacionais em um computador bem como quando se está realizando ensaios e deseja-se isolar estes experimentos do sistema principal.
- Debian: O Debian, é umas das distribuições Linux mais estáveis existentes, suportando atualmente 12 arquiteturas de processador. É software livre e de código aberto e mantido por uma ampla comunidade com mais de 18000 desenvolvedores. Sua versão atual é a 8.5 (codinome Jessie, do filme Toy Story).
- Ubuntu: O Ubuntu é uma distribuição linux (freeware e opensource) bastante estável e com uma comunidade bastante ativa que está sempre atualizando o sistema e presente nos foruns e redes sociais para dirimir dúvidas.
- LinuxMint: O LinuxMint é uma distribuição linux (freeware e opensource) bastante estável e confortável aos usuários windows, pois traz um gerenciador de janelas configurado de uma forma mais natural para estes usuários e vem com um conjunto de programas pré-instalados que consegue atender a maior parte das demandas inicias.
- dbDesigner4: O dbDesigner é uma ferramenta gratuita para elaboração de diagramas de bancos de dados relacionais. Não trabalhamos com bancos na disciplina PRG29002, porém trabalhamos com dados, esta ferramenta é útil para organizá-los em diagramas.
- coliru: Compilador online
|
Plano de aula
Cronograma
|
Aula
|
Data
|
Horas
|
Conteúdo
|
Recursos
|
1 |
9/2 |
2 |
Aula inaugural, apresentação do professor e turma, apresentação da disciplina e introdução aos algoritmos |
Lab Redes 2
|
2 |
14/2 |
2 |
Introdução ao fluxograma com resolução de exercícios |
Lab Redes 1
|
3 |
16/2 |
2 |
Prática de fluxogramas |
Lab Redes 2
|
4 |
21/2 |
2 |
Introdução ao pseudocódigo com resolução de exercícios |
Lab Redes 1
|
5 |
23/2 |
2 |
Pseudocódigo: Estruturas de repetição e sub-rotinas |
Lab Redes 2
|
6 |
2/3 |
2 |
Prática: Resolução de problemas em pseudocódigo e fluxogramas (declaração de variáveis, leia e escreva, uso de condicionais e biblioteca portugol) |
Lab Redes 2
|
7 |
7/3 |
2 |
Pseudocódigo: Uso de vetores e sub-rotinas |
Lab Redes 1
|
8 |
9/3 |
2 |
Prática: Resolução de problemas com vetores e sub-rotinas |
Lab Redes 2
|
9 |
14/3 |
2 |
Pseudocódigo: Registros e revisão geral (preparação para prova) |
Lab Redes 1
|
10 |
16/3 |
2 |
Pseudocódigo e fluxogramas: Resolução de exercícios (preparação para prova) |
Lab Redes 2
|
11 |
21/3 |
2 |
Avaliação: Introdução a algoritmos (fluxograma e pseudocódigo) |
Lab Redes 1
|
12 |
23/3 |
2 |
Prática: Correção da Avaliação / possível realização de recuperação |
Lab Redes 2
|
13 |
28/3 |
2 |
Introdução ao C, primeiros conceitos de compilação, variáveis, controle de fluxo com if… else, switch, entrada e saída de dados com printf e scanf, |
Lab Redes 1
|
14 |
30/3 |
2 |
Continuação C, condicionais, operadores relacionais, operadores lógicos. Prática: Controle de fluxo em C, entrada e saída de dados |
Lab Redes 2
|
15 |
4/4 |
2 |
Continuação C: estruturas de repetição |
Lab Redes 1
|
16 |
6/4 |
2 |
Prática: estruturas de repetição |
Lab Redes 2
|
17 |
11/4 |
2 |
Continuação C: funções |
Lab Redes 1
|
18 |
13/4 |
2 |
Prática: Funções em C |
Lab Redes 2
|
19 |
18/4 |
2 |
Introdução a vetores e matrizes em C. Resolução de exercícios de vetores |
Lab Redes 1
|
20 |
20/4 |
2 |
Prática: Resolução de exercícios de fixação de vetores. |
Lab Redes 2
|
21 |
25/4 |
2 |
Compreendendo melhor a função main e exit, gerando números pseudo-aleatórios, defines e operadores e precedências |
Lab Redes 1
|
22 |
27/4 |
2 |
Prática: Exercícios de C |
Lab Redes 2
|
23 |
2/5 |
2 |
Avaliação: C até funções |
Lab Redes 1
|
24 |
4/5 |
2 |
Prática: Correção da Avaliação / possível realização de recuperação |
Lab Redes 2
|
25 |
9/5 |
2 |
Structs e Unions |
Lab Redes 1
|
26 |
11/5 |
2 |
Prática: Structs e unions |
Lab Redes 2
|
27 |
16/5 |
2 |
Ponteiros |
Lab Redes 1
|
28 |
18/5 |
2 |
Prática: Exercicios ponteiros |
Lab Redes 2
|
29 |
23/5 |
2 |
Vetor de Ponteiros e Ponteiro Para Estruturas, typedef, recursividade, apresentação do projeto |
Lab Redes 1
|
30 |
25/5 |
2 |
Prática de Ponteiros e structs |
Lab Redes 2
|
31 |
30/5 |
2 |
Avaliação: C até structs e ponteiros |
Lab Redes 1
|
32 |
1/6 |
2 |
Prática: Correção da Avaliação / possível realização de recuperação / Desenvolvimento do projeto |
Lab Redes 2
|
33 |
6/6 |
2 |
Apresentação do projeto. Prática: Desenvolvimento do Projeto |
Lab Redes 1
|
34 |
8/6 |
2 |
Prática: Desenvolvimento do Projeto |
Lab Redes 2
|
35 |
13/6 |
2 |
Prática: Desenvolvimento do Projeto |
Lab Redes 1
|
36 |
20/6 |
2 |
Prática: Desenvolvimento do Projeto |
Lab Redes 1
|
37 |
22/6 |
2 |
Prática: Desenvolvimento do Projeto |
Lab Redes 2
|
38 |
27/6 |
2 |
Avaliação: Apresentação do projeto |
Lab Redes 1
|
39 |
29/6 |
2 |
Recuperação: Projeto |
Lab Redes 2
|
40 |
4/7 |
2 |
Encerramento da disciplina |
Lab Redes 1
|
TOTAL |
80 |
|
|
|
Conceitos
Ver moodle da disciplina.
|