4. O que vamos aprender?
Preparação do ambiente de testes
Conceitos básicos de C
Sintaxe de alguns comandos
# Structs, funções, ponteiros
11:28 Estrutura de Dados: Aula - Revisão de C/C++ na Prática
5. 11:28 5 Estrutura de Dados: Aula - Revisão de C/C++ na Prática
Linguagens de programação
6. 11:28 6 Estrutura de Dados: Aula - Revisão de C/C++ na Prática
Linguagem C
Desenvolvida inicialmente
por Dennis M. Ritchie e Ken
Thompson no laboratório
Bell no ano de 1972.
Baseada na linguagem B
criada por Thompson, esta
linguagem evoluiu da
linguagem BCPL, dando
origem as duas linguagens
anteriores.
11. A linguagemC
11:28
char tem 8 bits (não é 16 bits como em Java)
Não existe tipo booleano (usar int ou char):
0 falso
≠ 0 verdadeiro
Tipos inteiros podem ser: signed ou unsigned
Não tem tipo string: usa-se vetor de char
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
12. LinguagemC: Tipos de dados
11:28
Tipos de dados primários - Tipos de dados derivados - Tipos definidos pelo usuário
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
13. LinguagemC: Tipos de dados
11:28
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
16. Vetores: conceito
11:28
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
Um vetor (= array) é uma estrutura de dados que armazena uma sequência de
objetos, todos do mesmo tipo, em posições consecutivas da memória RAM (=
random access memory) do computador.
19. Vetores: exercício
11:28
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
Dado um vetor de inteiros, 𝑣[0. . 6], crie um
programa para determinar se a sequência de números
corresponde a um palíndromo.
[1, 2, 3, 4, 3, 2, 1]: vetor palíndromo
[1, 2, 3, 4, 5, 6, 7]: não é vetor palíndromo
20. 11:28
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
Qual é o número mínimo de comparações
necessárias para verificar se um vetor de
tamanho N é ou não palíndromo?
23. Struct: exercício
11:28
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
Quais são as informações de um Aluno para a Faculdade?
- Nome
- Matrícula
- Série
- Turma
- Curso
No exemplo acima temos a estrutura Aluno que contém as informações ou as
características de um aluno. Muito semelhante a um registro de banco de dados.
Podemos dizer que em uma estrutura, estamos armazenando informações agrupadas logicamente.
24. Construindo uma Struct
11:28
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
struct aluno
{
char nome[255];
int matricula;
int serie;
int turma;
char curso[100];
};
Nome da estrutura
Palavra
reservada que
identifica uma
estrutura
Membros da estrutura
Chaves definem o
início e o fim da
estrutura
Termina com ponto
e vírgula
30. Funções: Estrutura de uma função
11:28
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
Retorno
da função
Nome da função
Parâmetros da
função
Corpo da função
Escopo de início e fim da função
double somar(double x, double y)
{
double resultado = x + y;
return resultado;
}
32. Ponteiros : Operadores
11:28
Para operação com ponteiros, utilizamos dois operadores unários:
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
Operador Descrição
* Utilizado para declarar um ponteiro e para retornar o valor
& Utilizado para retornar o endereço de memória da variável
33. Declarando uma variável do tipoponteiro
11:28
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
int *ptr;
Tipo da variável
Nome da variável
Operador
unário
34. Declaraçãoe atribuição de ponteiros
11:28
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
Variável
ponteiro
Atribuindo o endereço
de memória
int *ptr;
int valor;
valor = 1500;
ptr = &valor;
35. Ponteiros : Operadores
11:28
Se x é uma variável, então &x é o seu endereço
int s = 999
int *p = &s
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
36. Ponteiros : Operadores
11:28
Todo ponteiro pode ter o valor NULL.
NULL é uma constante, geralmente vale 0 (definida no arquivo interface stdlib)
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
38. Vetores e Ponteiros
11:28
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Podemos usar ponteiros como se fossem matrizes:
int mat[] = { 1, 2 , 3 };
int *p = mat;
printf(“%d”, p[2]); // imprime 3
39. Exemplo
11:28
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
#include <stdio.h>
int main() {
int mat[50][50];
int i, j;
// percorre a matriz com dois loops
for (i = 0; i < 50; i++) {
for (j = 0; j < 50; j++) {
mat[i][j] = 0;
}
}
return 0;
}
40. Exemplo
11:28
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
#include <stdio.h>
int main() {
int mat[50][50];
int *p= (int *) mat, i;
// percorre a matriz com um único loop
for (i = 0; i < 2500; i++) {
*p = 0;
p++;
}
return 0;
}
É muito mais
rápido e diminui o
tamanho do código
41. Vetores e Ponteiros
11:28
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
int vetor[10];
int *ponteiro, i;
ponteiro = &i;
// as operações a seguir são inválidas
// ERRADO: vetor não é variável
vetor = vetor + 2;
// ERRADO: vetor não é variável
*vetor = 0;
// ERRADO: vetor não é variável
vetor = ponteiro;
42. Strings e Ponteiros
11:28
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
#include <stdio.h>
#include <string.h>
int main() {
char nome[15];
char *p = “Revisão de C/C++”;
// p pode ser usado como uma string
strcpy(nome, p);
printf("%s %sn", nome, p);
return 0;
}
43. Exemplo
11:28
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
#include <stdio.h>
int main() {
char *s = "string";
int a = 1, *p = &a;
float f = 2.0;
void *v;
v = p; // v aponta para um inteiro
a = *((int *) v);
v = s; // v aponta para uma string
s = (char *) v;
v = &f; // v aponta para um float
f = *((float *) v);
return 0;
}
44. Matrizes de Ponteiros
11:28
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
// vetor de ponteiros
int *vetor[10];
// vetor de strings
char *strings[] = {"EU", "TU", "ELE" };
// matriz de ponteiros
int *matriz[2][2];
45. Ponteiros para Ponteiros
11:28
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
#include <stdio.h>
int main() {
int a = 10, *p, **pp;
p = &a;
pp = &p;
printf("%dn", **pp); // imprime 10
return 0;
}
Obs.: Para acessar o valor
de a através de pp usamos
o operador * duas vezes
46. Avisosobre Ponteiros!
11:28
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
#include <iostream>
using namespace std;
int main(){
int *ptr_inteiro;
double valor;
valor = 345.76;
ptr_inteiro = &valor;
cout << *ptr_inteiro << endl;
}
ERRO !!!
47. Cuidados ao utilizar ponteiros
11:28
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
// Errado - Não execute
int main () {
int a,*p;
a = 10;
*p = a; // Para onde p aponta???
return 0;
}
48. Diretivas de Compilação
11:28
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Todas as diretivas começam por # e podem ser utilizadas em qualquer parte do
código
Principais diretivas definidas no C ANSI:
#if, #ifdef, #ifndef, #else, #elif, #endif,#include,
#define, #undef, #error
49. A Diretiva#include
11:28
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Sintaxe:
#include <nomeDoArquivo>
• O arquivo se encontra no path do compilador
#include “nomeDoArquivo”
• O arquivo se encontra em outro local
Exemplos:
#include <string.h>
#include “pessoa.h”
50. A Diretiva#define
11:28
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Sintaxe:
#define nomeDaMacro corpoDaMacro
copoDaMacro é opcional
Exemplos:
#define TAMANHO 10
#define _WIN32
#define max(a,b) ((a>b)?(a):(b))
52. O comando return
11:28
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Sintaxe:
return nomeDaVariável;
nomeDaVariável não é usado em funções que retornam void
O return encerra a execução da função
Pode ser comparado com o break usado nos loops
Uma função pode ter mais de um return
53. Exemplo
11:28
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
int dividir(int a, int b) {
if (!b) {
return 0; // evita a divisão por 0
}
return a / b;
}
54. Protótipos de funções
11:28
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Os compiladores de C são muito eficientes, mas isto traz alguns problemas
Funções só podem ser usadas se forem definidas anteriormente
A solução é utilizar protótipos de funções
Sintaxe:
tipoDeRetorno nomeDaFunção(tipo1, ... , tipoN);
55. Protótipos de funções
11:28
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
void b(int); // protótipo de b
void a(int i) {
// ...
b(i);
// ...
}
void b(int j) {
// ...
a(j);
// ...
}
56. Ponteiros para Funções
11:28
Estrutura de Dados: Aula 02 - Estrutura de dados e TAD
Sintaxe:
tipoDeRetorno (*nomeDoPonteiro) (tipoP1, ... , tipoPN)
Exemplo:
int (*p)(const char *);
p = puts; // inicializa
(*p) (“NASSAU”); // faz a chamada
Também podemos passar ponteiros para funções como parâmetro de outras
funções
61. A linguagemC++
11:28
Total compatibilidade com C (qualquer programa em C é um programa C++)
C++ traz ainda:
Classes e variáveis/funções membros (atributos/métodos);
Sobrecarga
Herança (permite herança múltipla)
Funções virtuais (sobrescrita de métodos)
Etc.
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
62. A linguagemC++
11:28
C++ não possui coletor de lixo como Java
Porém as instruções de criação/destruição são mais simples do que malloc/free.
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
63. Declaraçãode Classes
11:28
A declaração de uma classe diz o que as instâncias da classe podem fazer (contrato)
A definição/implementação de uma classe diz como as instâncias da classe farão o
que encontra-se no contrato
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
64. Sobrecarga
11:28
C++, assim como Java, permite sobrecarga
Várias funções com mesmo nome
O mesmo nome é permitido, desde que os parâmetrossejam diferentes:
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
65. Construtor
11:28
C++, assim como Java, permite sobrecarga
Se nenhum construtor é dado, um construtor default (sem argumentos) é adicionado pelo C++
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
66. Instâncias diretas ( . ) e ponteiros (->)
11:28
O ( . ) e ( -> ) são usados para acessar membros da classe
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
67. Destrutores
11:28
Em C++, deve-se destruir as instâncias criadas, nãohá coletor de lixo
Destrutores devem liberar memória dinâmica alocada pela classe durante a
construção da instância
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
68. Resolução de escopo ( :: )
11:28
A implementação de um método é prefixada com o operador de resolução de escopo
Motivo: diferente de Java, o método não encontra-se obrigatoriamente dentro do
escopo da classe
Pode-se usá-lo também para variáveis
Estrutura de Dados: Aula - Revisão de C/C++ na Prática
70. Atividade 1
11:28
1) Implemente as seguintes funções:
int mystrlen(char *c)
• retorna o tamanho da string c
void mystrcpy(char *dest, char *orig)
• copia orig para dest
void mystrcat(char *dest, char *orig)
• concatena orig em dest
int mystrchar(char *str, char c)
• Retorna o índice onde c ocorre em str
2) Declare um ponteiro para uma das funções que você fez no exercício anterior e chame-a utilizando o
mesmo
3) Crie as seguintes macros:
min(a,b)
• Retorna o mínimo entra a e b
isPar(a)
• Retorna 1 se a for par e 0 caso contrário
Estrutura de Dados: Aula - Revisão de C/C++ na Prática