Curso de Programação Nível 1
Roberto Affonso da Costa Junior Roberto Affonso da Costa Junior Gustavo Luiz de Alvarenga Guerra Gustavo Luiz de Alvarenga Guerra
Arthur Reznik Martins Arthur Reznik Martins
Universidade Federal de Itajubá
Universidade Federal de Itajubá
Aula 01
●Introdução
●Ponteiros
Contato com o Professor
● Site oficial: https://rcosta62br.unifei.edu.br
● E-mail: [email protected]
● Telegram: @rcosta62br
● Telegram: @GustavoGuerra99
● Whatsapp: 35988798637 (Roberto)
● https://discord.gg/ZuejHkv
O Curso
●Tipo de aulas
– Apresentação de slides
– Prática em laboratório
– Prática em casa
– Utilização de ambientes de programação
●Software: CodeBlocks (Abaixar a versão for CodeBlocks (Abaixar a versão for Windows no site do Professor).
Windows no site do Professor).
●Site: http://cpp.sh/Site:
●Armazenar seus códigos fontes: pastebin.comArmazenar seus códigos fontes:
Avaliação
●Exercícios nos sites:
https://www.urionlinejudge.com.br https://neps.academy/
https://codeforces.com/
https://open.kattis.com/
●Os exercícios serão passados nas aulas a seguir. Os alunos deverão resolver pelo menos 70% dos exercícios proposto.
●Já criem suas contas nos sites e repassem ao professor.
Avaliação
●Preparar 5 exercícios do tipo:
– Nome do problema
– Descrição do problema
– Dados de Entrada
– Dados de Saída
– Exemplos de entrada e saída
● Fazer conforme o arquivo (exemplo.doc)
● Apresentar uma solução do problema em C/C++ ou Python.
Avaliação
●Os alunos no dia 05/11/2020 serão avaliados com o seguinte conceito:
– 70 % dos exercícios.
– Apresentação e comentário dos problemas
Sugestão de Bibliografia Sugestão de Bibliografia
●Roberto Affonso da Costa Junior
– Notas de Aulas
●C++ Language: Pointers. (Inglês).
– http://www.cplusplus.com/doc/tutorial/pointers.
●D. Gookin. Basics of pointers in C programming.
(Inglês).
https://www.dummies.com/programming/c/basics-of-pointers-in-c-pr ogramming
.
Revisão Revisão
● Inteiro (int)
● Inteiro grande (long long int)
● Simples Precisão (float)
● Dupla Precisão (double)
● Caracter (char)
● String (char [] ou string)
● Booleano (bool)
Tipos de variáveis em C/C++
Tipos de variáveis em C/C++
Revisão Revisão
● Divisão de inteiros dá resultado em inteiro
● Se um dos valores da divisão for real, o resultado da divisão é real:
int a, b, c;
int a, b, c;
scanf("%d %d", &a, &b);
scanf("%d %d", &a, &b);
c = a / b;
c = a / b;
printf("%d\n", c);
printf("%d\n", c);
int a;
int a;
float b, c;
float b, c;
scanf("%d %f", &a, &b);
scanf("%d %f", &a, &b);
c = a / b;
c = a / b;
printf("%f\n", c);
printf("%f\n", c);
Operação Operação
Revisão Revisão
● Comandos Condicionais são utilizados quando existe a possibilidade de realizar ações diferentes dada uma condição pré-existente
Comandos Condicionais Comandos Condicionais
if (true) if (true) {{
//Comando Verdadeiro;
//Comando Verdadeiro;
} else { } else {
//Comando Falso;
//Comando Falso;
}}
Revisão Revisão
● Comandos Repetição while faz a checagem no while inicio
inicio e repete enquanto for verdadeiraverdadeira.
Comandos Repetição - while Comandos Repetição - while
while(true) while(true) {{
//Laço infinito;
//Laço infinito;
} }
Revisão Revisão
● Comandos Repetição do-while faz a checagem do-while no fimfim e repete enquanto for verdadeiraverdadeira.
Comandos Repetição – do-while Comandos Repetição – do-while
do {do {
//Laço infinito;
//Laço infinito;
} while(true);
} while(true);
Revisão Revisão
● Comandos Repetição for tem inicio e fim for definidos.
Comandos Repetição – for Comandos Repetição – for
for (i = ini; i <= fim; i++) for (i = ini; i <= fim; i++) {{
//Laço começa em ini e termina em fim;
//Laço começa em ini e termina em fim;
}}
Revisão Revisão
● Armazenam valores de mesmo tipo.
Dados Homogêneos de uma dimensão.
Dados Homogêneos de uma dimensão.
int vetor[5];
int vetor[5];
//guarda 5 valores inteiros //guarda 5 valores inteiros
vetor[0] = 10;
vetor[0] = 10;
char str[10]
char str[10]
//guarda 10 valores caracteres //guarda 10 valores caracteres
//se tiver '\0' no final é uma "string"
//se tiver '\0' no final é uma "string"
strcpy(str, "UNIFEI");
strcpy(str, "UNIFEI");
Revisão Revisão
● Armazenam valores de mesmo tipo em duas ou mais dimensões.
Dados Homogêneos de duas ou mais dimensões.
Dados Homogêneos de duas ou mais dimensões.
int vetor[5][10];
int vetor[5][10];
//guarda 5 linhas com 10 colunas com valores em //guarda 5 linhas com 10 colunas com valores em
//cada cédula.
//cada cédula.
vetor[0][0] = 10;
vetor[0][0] = 10;
char str[10][100]
char str[10][100]
//guarda 10 string com no máximo 100 caracteres //guarda 10 string com no máximo 100 caracteres
//em cada uma.
//em cada uma.
strcpy(str[0], "UNIFEI");
strcpy(str[0], "UNIFEI");
Revisão Revisão
● Você cria um novo tipo de dados.
Dados Heterogêneos Dados Heterogêneos
struct ALUNO struct ALUNO {{
char nome[40], conceito;
char nome[40], conceito;
float media;
float media;
int idade;
int idade;
}}
//O novo tipo de dados ALUNO.
//O novo tipo de dados ALUNO.
Revisão Revisão
● Declaração do tipo como vetor de 100 posições.
Dados Heterogêneos Dados Heterogêneos
//A Variável Vet é do tipo ALUNO.
//A Variável Vet é do tipo ALUNO.
struct ALUNO Vet[100];
struct ALUNO Vet[100];
strcpy(Vet[i].nome, "ALUNO 1");
strcpy(Vet[i].nome, "ALUNO 1");
Vet[i].conceito = 'A';
Vet[i].conceito = 'A';
Vet[i].media = 7.3;
Vet[i].media = 7.3;
Vet[i].idade = 19;
Vet[i].idade = 19;
Revisão Revisão
● Existem funções da linguagem C/C++ e funções que podemos criar. “int main()” é a função principal do programa.
Funções Funções
int Fatorial (int n) int Fatorial (int n) {{
int i, fat = 1;
int i, fat = 1;
for (i = 1; i <= n; i++) { for (i = 1; i <= n; i++) {
fat *= i;
fat *= i;
}}
return fat;
return fat;
}}
Revisão Revisão
● É a função que chama a si própria.
Funções Recursiva Funções Recursiva
int Fatorial (int n) int Fatorial (int n) {{
if (n == 0) { if (n == 0) { return 1;
return 1;
} else { } else {
return n * Fatorial (n - 1);
return n * Fatorial (n - 1);
}} }}
Ponteiros em C/C++
●É essencial compreender que qualquer programa rodando num computador consome memória, que ocupa um espaço físico.
●Endereços de memória são ‘nomesnomes’ dados a cada espaço físico da memória do computador que comporta uma certa quantidade de bits. Normalmente, endereços de memória (ou “posição de memóriaposição de memória”) são escritos na base hexadecimal.
Material traduzido por:
Material traduzido por:
Ponteiros em C/C++
●Um ponteiroponteiro é uma variávelvariável que contém uma posição da memória. É possível saber, para qualquer variável, a posição na memória que ela ocupa. Podemos usar o operador & (referência) para isso:
int val = 40;
int val = 40;
printf("%x\n", &val);
printf("%x\n", &val);
Contudo, o ponteiro é bem Contudo, o ponteiro é bem
mais poderoso.
mais poderoso.
Material traduzido por:
Material traduzido por:
Gustavo Luiz de Alvarenga Guerra Gustavo Luiz de Alvarenga Guerra
4040
0x7fff333bca30 0x7fff333bca30
valval
Memória do Computador
Ponteiros em C/C++
● Ponteiros são um tipo de variável. Assim como os outros, precisam ser declarados, inicializados e devem possuir um nome único. A grande diferença é que um ponteiro deve ser inicializado para uma posição de memória de outra variável (que também deve estar dentro do programa). O tipo da variável pode ser qualquer um – até mesmo tipos criados pelo programador, mas deve condizer com o tipo do ponteiro.
Material traduzido por:
Material traduzido por:
Exemplo 1 Exemplo 1
#include <bits/stdc++.h>
using namespace std;
int main(){
double pi = 3.141593;
double *rainbow = π
printf("Dados da variavel ’pi’:\n");
printf("Tamanho: %ld\n", sizeof(pi));
printf("Conteudo: %lf\n", pi);
printf("Endereco de memoria: %p\n", &pi);
printf("Dados da variavel ’rainbow’:\n");
printf("Conteudo: %p\n", rainbow);
return 0;
} Material traduzido por:Material traduzido por:
Gustavo Luiz de Alvarenga Guerra Gustavo Luiz de Alvarenga Guerra
Exemplo 1 Exemplo 1
Material traduzido por:
Material traduzido por:
3.141593 3.141593
0x7fff333bca30 0x7fff333bca30
pipi
Memória do Computador
0x7fff333bca30 0x7fff333bca30 0x3f8fe4589a21 0x3f8fe4589a21
rainbow rainbow
Entrada/Saída do Programa Entrada/Saída do Programa
● Resultado do programa.
Dados da variavel ’pi’:
Dados da variavel ’pi’:
Tamanho: 8 Tamanho: 8
Conteudo: 3.141593 Conteudo: 3.141593
Endereco de memoria: 0x7fff333bca30 Endereco de memoria: 0x7fff333bca30
Dados da variavel ’rainbow’:
Dados da variavel ’rainbow’:
Conteudo: 0x7fff333bca30 Conteudo: 0x7fff333bca30
Material traduzido por:
Material traduzido por:
Gustavo Luiz de Alvarenga Guerra Gustavo Luiz de Alvarenga Guerra
Comentários do Exemplo 1
● O endereço de memória que a variável ocupa varia entre execuções do programa e é diferente para cada computador. A coisa mais importante a se notar é que o conteúdo do ponteiro é igual ao endereço de memória ocupado pela variável.
● O ponteiro não apenas contém o endereço de memória.
Também é possível acessar o dado armazenado naquela determinada posição. Podemos acessar qualquer variável usando somente seu endereço de memória através do operador ** (de-referenciador).
Material traduzido por:
Material traduzido por:
Comentários do Exemplo 1
● Experimente adicionar mais uma linha ao código acima:
printf("Valor armazenado: %lf\n", *rainbow);
printf("Valor armazenado: %lf\n", *rainbow);
● Em suma, os operadores ** e && possuem “significados significados opostos
opostos”. Os próximos exemplos apresentam seus diferentes usos. Mais informações podem ser encontradas nas referências utilizadas [1, 2].
Material traduzido por:
Material traduzido por:
Gustavo Luiz de Alvarenga Guerra Gustavo Luiz de Alvarenga Guerra
Exemplo 2 Exemplo 2
#include <bits/stdc++.h>
using namespace std;
int main(){
int var = 42;
int *foo = &var;
printf("var == %d\n", var);
printf("foo == %p\n", foo);
printf("*foo == %d\n", *foo);
int bar = *foo;
printf("bar == %d\n", bar);
return 0;
}
Material traduzido por:
Material traduzido por:
Entrada/Saída do Programa Entrada/Saída do Programa
● Resultado do programa.
var == 42 var == 42
foo == 0x7ffeb2e6d1d0 foo == 0x7ffeb2e6d1d0
*foo == 42
*foo == 42 bar == 42 bar == 42
Material traduzido por:
Material traduzido por:
Gustavo Luiz de Alvarenga Guerra Gustavo Luiz de Alvarenga Guerra
Exemplo 3 Exemplo 3
#include <bits/stdc++.h>
using namespace std;
int main(){
// Um array estatico sao posicoes // de memoria CONSECUTIVAS int array[3];
// O nome do array e um ponteiro // para a sua primeira posicao
for(int i = 0 ; i < 3 ; i ++) scanf("%d", array + i);
Material traduzido por:
Material traduzido por:
Exemplo 3 Exemplo 3
printf("Acesso por indices:\n");
for(int i = 0 ; i < 3 ; i ++) printf("%d\n", array[i]);
printf("Acesso por ponteiros:\n");
int *ptr1 = array;
printf("*ptr1 == %d\n", *ptr1);
int *ptr2 = ptr1;
ptr2++;
printf("*ptr2 == %d\n", *ptr2);
printf("*(ptr2 + 1) == %d\n", *(ptr2 + 1));
Material traduzido por:
Material traduzido por:
Gustavo Luiz de Alvarenga Guerra Gustavo Luiz de Alvarenga Guerra
Exemplo 3 Exemplo 3
// Consigo utilizar *(ptr2 + 1),
// pois sei que (ptr2 + 1) corresponde // a um endereco dentro do vetor.
printf("Acesso pelo ponteiro array:\n");
printf("%d %d %d\n", *array, *(array + 1), *(array + 2));
// Acessar a posicao array + 3 pode provocar um erro, // pois a posicao de memoria nao
// pertence a este programa.
int val = *(array + 3);
Material traduzido por:
Material traduzido por:
Exemplo 3 Exemplo 3
// Se nao ocorrer erro, o valor da variavel
// sera algum "lixo de memoria", que muda a cada execucao printf("Lixo de memoria: %d\n", val);
return 0;
}
Material traduzido por:
Material traduzido por:
Gustavo Luiz de Alvarenga Guerra Gustavo Luiz de Alvarenga Guerra
Exemplo 3 Exemplo 3
Material traduzido por:
Material traduzido por:
ptr1ptr1
Memória do computador Memória do computador
11
array array
22
11 33
ptr2ptr2
ptr2 = ptr1 ptr2 = ptr1
O ponteiro ptr2 aponta para o mesmo
lugar que ptr1.
Exemplo 3 Exemplo 3
Material traduzido por:
Material traduzido por:
Gustavo Luiz de Alvarenga Guerra Gustavo Luiz de Alvarenga Guerra
ptr1ptr1
Memória do computador Memória do computador
11
array array
22
11 33
ptr2ptr2
ptr2 ++
ptr2 ++
O ponteiro ptr2 foi deslocado uma unidade a direita.
Exemplo 3 Exemplo 3
Material traduzido por:
Material traduzido por:
ptr1ptr1
Memória do computador Memória do computador
11
array array
22
11 33
ptr2ptr2
ptr2 + 1 ptr2 + 1
O ponteiro ptr2 + 1 procura a memória
seguinte.
Entrada/Saída do Programa Entrada/Saída do Programa
● Resultado do programa.
1 2 3 1 2 3
Acesso por indices:
Acesso por indices:
11 22 33
Acesso por ponteiros:
Acesso por ponteiros:
*ptr1 == 1
*ptr1 == 1
*ptr2 == 2
*ptr2 == 2
*(ptr2 + 1) == 3
*(ptr2 + 1) == 3
Acesso pelo ponteiro array:
Acesso pelo ponteiro array:
1 2 3 1 2 3
Lixo de memoria: 0
Lixo de memoria: 0 Material traduzido por:Material traduzido por:
Gustavo Luiz de Alvarenga Guerra Gustavo Luiz de Alvarenga Guerra
Referências
● [1] C++ Language: Pointers. (Inglês).
– http://www.cplusplus.com/doc/tutorial/pointers.
●[2] D. Gookin. Basics of pointers in C programming.
(Inglês).
https://www.dummies.com/programming/c/basics-of-pointers-in-c-pr ogramming
.
Material traduzido por:
Material traduzido por:
Continua...
Ponteiro é muito importante…
Ponteiro é muito importante…
Vamos aplicar ele junto Vamos aplicar ele junto
com as ferramentas com as ferramentas que iremos aprender que iremos aprender
daqui para frente.
daqui para frente.