Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Bruno Jurkovski
Fábio da Fontoura Beltrão
Felipe Augusto Chies
Kauê Soares da Silveira
Lucas Fialho Zawacki
Marcos Vinicius Cavinato
Revisão da Aula 4
Na última aula vimos... PONTEIROS...
O que vocês lembram de ponteiros?
Revisão da Aula 4
Revisão da Aula 4
Nas primeiras aulas vimos tipos de dado.
Na linguagem C...
int, float, char, ...
O usuário pode definir seus próprios tipos
de dados, chamados de dados
estruturados.
struct, enum ...
Veremos agora essa característica...
Relembrando ...
Estruturas
Muitas vezes faz-se necessário o agrupamento
de dados referentes a ‘algo’ em comum.
Por exemplo, para armazenar informações
referentes a um corpo precisaremos de sua
massa, volume, posição, ...
Para isso armazenamos todos esses dados
numa estrutura (struct).
Uma struct agrupa um conjunto de dados
possivelmente diferentes, formando um novo
tipo de dado.
Estruturas - Criação
Para criar uma estrutura usamos o comando
struct:
struct nome_da_estrutura
{
tipo1 nome1;
tipo2 nome2;
.
.
.
tipon nomen;
} variáveis_da_estrutura;
Exemplo para nossa estrutura ‘corpo’:
struct corpo
{
float massa;
float volume;
struct ponto posicao;
} corpo1, corpo2;
Estruturas - Criação
Ponto?! O que é isso?! Existe um tipo de dado
ponto?
Não, ‘ponto’ não é um tipo primitivo, mas o que
nos impede de criarmos o nosso ‘ponto’?
Aí está, nota-se que nada nos impede
de não inicializar variáveis direto na cria-
ção da estrutura. Afinal, estamos declarando-as
automaticamente quando inicializamos um ‘corpo’.
struct
ponto
{
float x;
float y;
};
Estruturas - Criação
Estruturas - Inicialização
Para inicializar uma struct...
struct ponto p1 = { 2, 3 };
struct corpo c1 = { 10, 7, p1 };
Estruturas - Acesso aos Campos
Para acessar os campos de uma struct usamos
o operador . , da seguinte forma:
p1.x acessa o campo ‘x’ da struct p1.
p1.y acessa o campo ‘y’ da struct p1.
struct ponto p1 = { 2, 3 };
struct
ponto
{
float x;
float y;
};
Estruturas - Atribuição
O seguinte trecho de código é válido
struct ponto p1, p2 ;
p1.x = 2;
p1.y = 3;
p2 = p1;
printf(“%f”, p2.x);
struct ponto p1, p2 ;
p1.x = 2;
p1.y = 3;
p2 = p1;
printf(“%f”, p2.x);
Estruturas - Atribuição
struct ponto p1, p2 ;
p1.x = 2;
p1.y = 3;
p2 = p1;
printf(“%.2f”, p2.x);
Estruturas - Atribuição
Estruturas - Comparação
Não é possível comparar duas estruturas,
somente seus campos separadamente!
Erro de Compilação!
struct ponto p1 = {1 , 2};
struct ponto p2 = {3.14, 2.71};
if ( p1 == p2)
printf(“Sao iguais”);
else
printf(“Nao sao iguais”);
Estruturas - Comparação
struct ponto p1 = {1 , 2};
struct ponto p2 = {3.14, 2.71};
if ( p1 == p2)
printf(“Sao iguais”);
else
printf(“Nao sao iguais”);
Mas podemos comparar seus campos:
Isso é possível!
struct ponto p1 = {1 , 2};
struct ponto p2 = {3.14, 2.71};
if ( p1.x == p2.x)
printf(“Sao iguais no x”);
else
printf(“Nao sao iguais no x”);
Estruturas - Comparação
struct ponto p1 = {1 , 2};
struct ponto p2 = {3.14, 2.71};
if ( p1.x == p2.x)
printf(“Sao iguais no x”);
else
printf(“Nao sao iguais no x”);
Estruturas - Comparação
Estruturas & Funções
Podemos passar estruturas como
parâmetros para funções e também
retorná-los.
struct ponto criaPonto (float x, float y)
{
struct ponto p1;
p1.x = x;
p1.y = y;
return p1;
}
Outro exemplo:
int comparaPontos (struct ponto p1, stuct ponto p2)
{
if ( (p1.x == p2.x) && (p1.y == p2.y) )
return 1;
else
return 0;
}
Estruturas & Funções
Podemos também passar ponteiros para
estruturas como parâmetros para funções
(passagem de parâmetros por referência).
E para acessar os campos da estrutura, usamos
o operador -> , dessa forma:
int comparaPontos (struct ponto *p1, stuct *ponto p2)
{
if ( (p1->x == p2->x) && (p1->y == p2->y) )
return 1;
else
return 0;
}
Estruturas & Funções
Estruturas Auto-referenciáveis
Estruturas não podem possuir um campo que
seja uma estrutura do próprio tipo, senão ela
estaria definida como um laço infinito, como no
exemplo:
struct exemplo
{
char info;
struct exemplo ex1;
};
Podemos, porém, definir uma estrutura em que
um dos campos seja um ponteiro para uma
estrutura de mesmo tipo, e é então que criamos
listas encadeadas, árvores binárias, etc ...
struct lista
{
float x;
struct lista *prox;
};
Estruturas Auto-referenciáveis
Arrays e Estruturas
Pode-se criar arrays de estruturas como com
qualquer outro tipo de dado:
struct ponto
{
float x;
float y;
};
struct ponto[10];
Comando Typedef
O comando typedef cria aliases (“apelidos”) dos
tipos de dados já existentes.
Ele NÃO cria um novo tipo de dado
typedef int intero;
intero i; // declara um int
struct ponto
{
float x;
float y;
};
struct ponto p1, p2;
struct ponto criaPonto (int x, int y);
typedef struct ponto
{
float x;
float y;
}point;
point p1, p2;
point criaPonto (int x, int y);
Comando Typedef
1. Crie uma estrutura do tipo registro, que contém
uma string nome, um int idade e um float salário
e faça uma função para preencher e uma para
imprimir estes dados.
Exercício
Enumerações
Uma enumeração é um conjunto de constantes
do tipo inteiro que especifica todos os valores
legais que uma variável desse tipo pode ser.
Exemplo: uma enumeração com as estações do
ano:
Verao, Inverno, Primavera, Outono
Forma de definir uma enumeração:
Identificador e lista_de_variáveis são opcionais.
enum identificador { lista de enumeração }
lista_de_variáveis;
Exemplo:
enum estacoes { Verao, Inverno,
Primavera, Outono };
estacoes e1, e2;
e1 = Verao;
e2 = Inverno;
if (e1 == e2)
printf(“As estacoes sao iguais”);
Enumerações
É importante notar que enumerações apenas
informam ao compilador símbolos que
determinados tipos de variáveis podem conter.
Esses símbolos na verdade são representados
como valores inteiros.
Assim sendo, esses símbolos podem ser usados
em qualquer lugar que um valor inteiro pode ser
usado.
Enumerações
enum lampada { Desligada, Ligada };
A cada símbolo é dado um valor inteiro maior
em uma unidade do valor precedente.
O valor do primeiro símbolo, por default, é 0.
Exemplo:
Desligada é o mesmo que o valor 0 e Ligada é o
mesmo que o valor 1.
Enumerações
Exemplo:
Cada símbolo possuirá os seguintes valores
correspondentes:
enum estacoes { Verao, Inverno = 2, Primavera, Outono };
Símbolo Valor
Verao 0
Inverno 2
Primavera 3
Outono 4
Enumerações
Lembre-se: os símbolos das enumerações
são só nomes para inteiros.
O seguinte código está errado!
e1 não é um string, e sim um inteiro!
e1 = Verao;
printf(“%s”, e1);
e1 = Verao;
printf(“%d”, e1);
Enumerações
2. Crie uma enumeração contendo os dia da
semana e faça um função que receba um inteiro
e diga que dia da semana foi recebido.
Ex: Dia da semana: 3
Terça-feira
Exercício
C não possui nenhum comando básico de E/S;
Essas operações são realizadas através de
bibliotecas especializadas:
<stdio.h>, <stdlib.h>, <conio.h>;
stdio.h é a biblioteca padrão de E/S em C;
Há dois tipos de E/S: por console e por arquivo;
Entrada e Saída em C ( E/S )
E/S por ConsoleE/S por Console
Manipulação de Caracteres
getchar();
getch();
getche();
putchar();
Manipulação de Strings
gets();
puts();
E/S Formatada
printf();
scanf();
Outras Funções de Manipulação
putchar(char c);
Imprime um caracter na tela.
Exemplo:
char ch = ‘f’;
putchar(ch);
Manipulação de Caracteres
Manipulação de Caracteres
ch = getchar();
getchar() retorna o valor do caractere digitado;
É necessário o ENTER;
O caractere retornado é o primeiro a ser digitado;
Biblioteca: <stdio.h>
Exemplo:
char ch = getchar();
putchar(ch);
ch = getche():
retorna o caractere digitado;
NÃO é necessário o ENTER;
Biblioteca: <conio.h>
ch = getch():
retorna o carcartere digitado;
NÃO é necessário o ENTER;
NÃO produz eco = não mostra na tela a tecla
digitada;
Biblioteca: <conio.h>
Manipulação de Caracteres
Manipulação de Strings
gets(<string>):
Lê e armazena em <string> uma string digitada;
NÃO encorajamos o uso dessa função !
puts(<string>):
Imprime <string> na tela.
Ambas funções pertencem à <stdio.h>
gets(<string>):
Lê uma string digitada;
Manipulação de Strings
Manipulação de Strings
E/S Formatada – printf();
printf(): Imprime na tela informações de
qualquer tipo.
printf(“INFO”, parâmetros);
As variáveis e constantes impressas
necessitam de uma especificação:
Tipo Código
Inteiro %i, %d
Float, Double %f, %lf
Char %c
String %s
Imprimir % %%
Entrada e Saída
Caracteres de barra invertida
Código Significado
\a Beep
\t Tabulação Horizontal
\n Quebra de Linha
\b Backspace
\v Tabulação Vertical
\\ Barra Invertida
\? Ponto de Interrogação
\’ Aspas Simples
\” Aspas Duplas
\N Constante em Octal
\xN Constante em Hexadecimal
E/S Formatada – scanf()
scanf () – função que lê dados entrados pelo
usuário:
scanf(“tipos de dados”, &variaveis);
Onde os tipos são os mesmos da função
printf(int, float..) e as ‘variaveis’ são aonde
serão armazenados os valores lidos.
E/S – scanf()
Nota sobre scanf():
Scanf recebe um ponteiro para as variáveis,
logo o nome da variável deve ser precedido
por um ‘&’.
Strings não necessitam, nem podem, receber
esse caractere, uma vez que o nome de uma
string é um ponteiro para o primeiro elemento
da string.
3. Faça um programa que receba caracteres ate
que um “0” seja pressionado, armazene-os em
uma string e imprima-a na tela. Faça uma
versão com getch(); e uma com getche();
+ Exercícios
4. Faça um programa que leia caracteres até ser
digitado “0” e imprima somente as letras
minúsculas (dica: use a função islower da
ctype.h).
Cabeçalho da função:
int islower(char c);
retorna 0 se não for minúsculo e diferente
de 0 se for.
+ Exercícios