Você está na página 1de 148

Introdução a Linguagem de Programação C

Disciplina: Programação de Computadores


Introdução a linguagem C/C++

Prof. Rafael Alexandre

1
Pauta

Introdução.

Entrada/Saída.

Operadores. Front cover


Estruturas condicionais.

Estruturas de repetição.

Vetores/Matrizes.

Funções.

Ponteiros.

Estruturas.
2
Pauta

Introdução.

Entrada/Saída.

Operadores. Front cover


Estruturas condicionais.

Estruturas de repetição.

Vetores/Matrizes.

Funções.

Ponteiros.

Estruturas.
3
Introdução::Breve Histórico

• Em 1973 Dennis Ritchie reescreveu o sistema operacional UNIX


em uma linguagem de alto nível (Ling. C).

• Surgem diversas implementações utilizando C, porém os


códigos gerados eram incompatíveis.

• ANSI (American National Standard Institute), em 1983


padronizou a ling. C.

4
Introdução::C comparado a outras linguagens

• Devemos entender:

• Nível Alto como sendo a capacidade da linguagem em compreender


instruções escritas em “dialetos” próximos do inglês (Ada e Pascal, por
exemplo)

• Nível Baixo para aquelas linguagens que se aproximam do assembly,


que é a linguagem própria da máquina, compostas por instruções
binárias e outras incompreensíveis para o ser humano não treinado para
este propósito.

• Infelizmente, quanto mais clara uma linguagem for para o humano


(simplicidade >) mais obscura o será para a máquina (velocidade <).

5
Introdução::Aplicações escritas em C

• Sistema Operacional: UNIX

• Planilhas: 1,2,3 e Excel

• Banco de Dados: dBase III, IV e Access ( gerenciador de base de


dados).

• Aplicações Gráficas: Efeitos Especiais de filmes como Star Trek e Star


War.

6
Introdução::Características da Linguagem C

• Portabilidade entre máquinas e sistemas operacionais.

• Alia características de linguagens de alto e baixo nível (liberdade ao


programador).

• Programas Estruturados.

• Total interação com o Sistema Operacional.

• Código compacto e rápido, quando comparado ao código de outras


linguagem de complexidade análoga.

• C é uma linguagem compilada: lê todo o código fonte e gera o


código objeto (ling. de máquina) uma única vez.

• Linguagens Interpretadas: lê o código fonte, traduz e executa cada


7 vez que o programa for executado.
Introdução::Detalhes Importantes

• Sempre que o código fonte for alterado ele deve ser novamente
compilado.

• C é “case senitive”

• Deve-se listar antecipadamente todas a as variáveis utilizadas


no programa.

8
Introdução::Palavras reservadas

• São palavras que têm um significado especial para a linguagem.

auto, break, case, if, for, while, begin, end,


continue, return, const,....

• C entende tais palavras apenas em letras minúsculas

9
Introdução::Bibliotecas

• Conjunto de funções para realizar tarefas específicas.

• Biblioteca padrão C - ANSI - funções básicas.

• As primeiras linhas do programa indicam as bibliotecas utilizadas.

• Exemplo:

#include “minha_biblioteca.h” ou

#include <minha_biblioteca.h>

10
Introdução::Estrutura de um programa C

11
Introdução::Declaração de Variáveis

• Quantos caracteres quiser (32);

• comece com letras ou sublinhado:


Seguidos de letras, números ou sublinhados

• C é case sensitive:
peso <> Peso <> pEso

• não podemos definir um identificador com o mesmo nome que uma


palavra chave
auto static extern int long if while do ......

12
Introdução::Declaração de Variáveis

• Instrução para reservar uma quantidade de memória para um certo tipo


de dado, indicando o nome pelo qual a área será referenciada.

• Exemplos:

• tipo nome-da-variável;
• char nome;

• tipo nome1, nome2,...,nomen


• Int idade, num;

13
Introdução::Declaração de Variáveis

14
Introdução::Tipos Básicos de Dados

tipo bytes escala

char 1 -128 a 127


int 2 -32.768 a 32.767
float 4 3.4e-38 a 3.4e+38
double 8 1.7e-308 a 1.7e+308

15
Introdução::Diferentes tipos de inteiros

Long ou Long int (4 bytes)


Unsigned Char (0 a 255)
Unsigned int (0 a 65.535)

obs: int tem sempre o tamanho da palavra da máquina

16
Conversões de Tipos

• Quando forem misturadas variáveis de diferentes tipos, o


compilador C converterá os operandos para o tipo de operando
maior, de acordo com as regras descritas a seguir:

• 1-Todo char e short int é convertido para int. Todo float é convertido
para double.

• 2-Para os demais pares de operandos valem as seguintes regras


em seqüência:
2.1- Se um operando for long double, o outro também o será.
2.2- Se um operando for double, o outro também o será.
2.3- Se um operando for long, o outro também o será.
2.4- Se um operando for unsigned, o outro também o será.

17
Introdução::Programa Exemplo – Tipos de Dados e Variáveis

18
Pauta

Introdução.

Entrada/Saída.

Operadores. Front cover


Estruturas condicionais.

Estruturas de repetição.

Vetores/Matrizes.

Funções.

Ponteiros.

Estruturas.
19
Comandos básicos

Entrada Saída
Processamento de
de Dados de dados Dados

Instruções de E/S

20
Intruções de E/S – Scanf ( )

• Leitura de dados tipados via teclado


• Scanf (“string de controle”, lista de argumentos);

• Exemplo:
scanf(“%d”,&idade);

OBS: Para seqüência de caracteres (%s), o caracter & não


deverá ser usado.

21
Comandos de E/S – printf ( )

• Apresentação de dados no monitor


• printf(“string de controle”, lista de argumentos);

• Exemplo:
• printf (“Digite a sua idade:\n”);
• scanf (“%d”, &idade);
• printf(“Sua idade é: %d”, idade);

22
String de controle

%c caracter
%d inteiro
%e número ou notação científica
%f  ponto flutuante
%o  octal
%x hexadecimal
%s string (cadeia de caracteres)
%lf  double

23
Exemplo strings de controle

24
Operador de Endereço &

• Exemplo:

inteiro 2 bytes


float  4 bytes
char 1 byte

25
Operador de Endereço &

• Quando usamos & precedendo uma variável estamos


falando do endereço desta variável na memória.

• Um endereço de memória é o nome que o computador usa


para identificar uma variável.

• Toda variável ocupa uma área de memória e seu endereço é


o primeiro byte por ela ocupado.

26
Caracteres Especiais

• \n nova linha
• \r enter
• \t tabulação (tab)
• \b retrocesso
• \” aspas
• \\ barra

27
Formatando as saídas - printf

• É possível estabelecer o tamanho mínimo para a impressão de


um campo.

• Exemplo:

28
Formatando as saídas - printf

29
Programando – Exercício 1

• Faça um programa para ler e escrever na tela o seu nome e a


sua idade.

30
Programando – Exercício 1

• Faça um programa para ler e escrever na tela o seu nome e a


sua idade.

31
Pauta

Introdução.

Entrada/Saída.

Operadores.

Estruturas condicionais.

Estruturas de repetição.

Vetores/Matrizes.

Funções.

Ponteiros.

Estruturas.
32
Operadores Aritméticos

Operador Ação
+ Adição
* Multiplicação
/ Divisão
% Resto da divisão inteira
- Subtração (unário)
-- Decremento
++ Incremento
33
Operadores Relacionais e Lógicos

Operador Ação
> Maior que
>= Maior ou igual que
< Menor que
<= Menor ou igual que
== Igual a
!= Diferente de
&& Condição “E”
|| Condição “OU”
! Não

OBS: Em C o resultado da comparação será ZERO se resultar em FALSO e DIFERENTE DE ZERO no caso de
obtermos VERDADEIRO num teste qualquer.

34
Operadores - Exemplo

35
Comparações e Testes

• Observemos antes de mais nada que ++x é diferente de x++!

Se porém Se
x = 10; x = 10;
y = ++x; y = x++;
/* y=x; x=x+1 */
/* x=x+1; y=x; */
então
então x = 11 e
x = 11 e y = 10
y = 11

36
Programa Exemplo – Pre/Pos Incremento

37
Comparações e Testes

Se
x = 1;
y = 2;
printf(“%d == %d e’ %d\n”, x, y, x==y )

Qual seria a saída deste comando?

38
Comparações e Testes

Se
x = 1;
y = 2;
printf(“%d == %d e’ %d\n”, x, y, x==y )

Qual seria a saída deste comando?


resultaria em 1 == 2 0
(pois a expressão é falsa)

39
Comparações e Testes

if (10 > 4 && !(10 < 9) || 3 <= 4)

Como seria avaliado esta instrução?

40
Comparações e Testes

if (10 > 4 && !(10 < 9) || 3 <= 4)

Como seria avaliado esta instrução?


resultaria em Verdadeiro, pois dez é maior
que quatro E dez não é menor que nove
OU três é menor ou igual a quatro

41
Pauta

Introdução.

Entrada/Saída.

Operadores. Front cover


Estruturas condicionais.

Estruturas de repetição.

Vetores/Matrizes.

Funções.

Ponteiros.

Estruturas.
42
Comando if

43
Comando if

44
if aninhados

45
if aninhados

46
Comando if-else

• O comando if só executa a instrução caso a condição de


teste seja verdadeira, nada fazendo se a expressão for falsa.

• O comando else executará uma instrução ou um conjunto


de instruções se a expressão for falsa.

if (condição)
instrução;
else
instrução;

47
Comando if-else

48
Exemplo: Evitar-se divisões por Zero, usando recursos do
comando if-else.

49
Comando if-else aninhados

if (condição1)
instrução
else if (condição2)
instrução
else if
(condição3)...

50
Comando if-else aninhados

51
Comando ?

• Forma compacta de expressar uma instrução if – else

• Notação:
• (condição) ? expressão1 : expressão2;

52
Comando Switch

• Forma de se substituir o comando if – else ao se executar vários testes.

• Diversas vezes precisamos determinar se um valor encontra-se numa lista de


valores. Apesar de podermos usar uma seqüência de ifs, este recurso além de
não ser elegante, por vezes confunde o entendimento do programa.

switch <variável>
{ OBS:
case <constante 1> : •“ variável” deve ser uma variável do tipo
<comandos>; inteiro ou caracter;
[break;]
•“break” serve para terminar a seqüência
case <constante 2> :
de comandos em execução, por serem
<comandos>; opcionais, se forem suprimidos permitem
[break;] que o “case” a seguir seja executado, sem
case <constante 3> : haver qualquer quebra na seqüência do
<comandos>; processamento.
[break;]
[default :
<comandos>;]
53 }
Comando Switch

54
Pauta

Introdução.

Entrada/Saída.

Operadores. Front cover


Estruturas condicionais.

Estruturas de repetição.

Vetores/Matrizes.

Funções.

Ponteiros.

Estruturas.
55
Estruturas de Repetição

• Utilizamos os comandos de repetição quando desejamos


que um determinado conjunto de instruções ou comandos
sejam executados um número definido ou indefinido de
vezes, ou enquanto um determinado estado de coisas
prevalecer ou até que seja alcançado.

• Trabalharemos com modelos de comandos de repetição:

• Enquanto x, processar (Do While ...Loop);


• Processar ..., Enquanto x (Do ... Loop While);
• Para ... Até ... Seguinte (For ... To ... Next)

56
Estruturas de Repetição

#include <stdio.h>
main ( )
{ Como imprimir os
printf (“1”); 1000 1os números a
printf (“2”); partir de 1?
: : :
printf (“10”);
}
saída: 1 2 3 4 ... 10

57
Estruturas de Repetição

• Enquanto x, Processar (Do While ... Loop)

• Neste caso, o bloco de operações será executado enquanto


a condição x for verdadeira.

• O teste da condição será sempre realizado antes de


qualquer operação.

• Enquanto a condição for verdadeira o processo se repete.

• Podemos utilizar essa estrutura para trabalharmos com


contadores.

58
Estruturas de Repetição

• Enquanto x, Processar (Do While ... Loop)

59
Estruturas de Repetição

• Exemplo em C

60
Estruturas de Repetição

• Processar ..., Até que x (Do ... Loop Until)

• Neste caso primeiro são executados os comandos, e somente depois é


realizado o teste da condição.
• Se a condição for verdadeira, os comandos são executados novamente, caso
seja falso é encerrado o comando DO.

61
Estruturas de Repetição

• Exemplo em C

62
Estruturas de Repetição

• O comando for
• O melhor modo de se entender o loop for é ver como ele funciona "por dentro".
O loop for é equivalente a se fazer o seguinte:

63
Estruturas de Repetição

• Exemplo em C
• Tem a mesma idéia do enquanto... faça, porém podemos declarar uma variável,
inicializar o seu valor e incrementá-la em um só lugar.

64
Estruturas de Repetição

• Comando for – Loop infinito

for(;;)
printf(“Este loop rodará eternamente!\n”);

• A ausência de condições de inicialização,


continuidade e terminação, causarão um
processo contínuo e teoricamente infinito.

65
Estruturas de Repetição

for(i=0;i<10;i++);

• A presença do ponto e vírgula


finalizando o comando, força a
execução do loop sem que seja
executado qualquer outro comando.

66
Comando break

• O comando “break” causa a interrupção do comando for.

67
Pauta

Introdução.

Entrada/Saída.

Operadores. Front cover


Estruturas condicionais.

Estruturas de repetição.

Vetores/Matrizes.

Funções.

Ponteiros.

Estruturas.
68
Conceitos de Funções

• Funções são os blocos de construção de C e o local onde toda a


atividade do programa ocorre.

• Todo programa C possui ao menos


Front coveruma função: main().

• Forma Geral de uma Função:


tipo_retorno nome_da_função(lista de parâmetros)
{
corpo da função
}
• tipo_retorno: especifica o tipo de valor que o comando return da função
devolve, podendo ser qualquer tipo válido.

•OBS: Se nenhum tipo for definido o compilador assume que a função


devolve um resultado inteiro.
69
Funções / Procedimentos

• Forma Geral de uma Função:

tipo_retorno nome_da_função(lista de parâmetros)


{
corpo da função
}

• lista de parâmetros é uma lista de nomes de variáveis


separados por vírgulas e seus tipos associados que
recebem os valores dos argumentos quando a função é
chamada.

• Uma função pode não ter parâmetros, neste caso a lista de


parâmetros é vazia. Ainda assim os parêntesis são
70 necessários.
Funções / Procedimentos

• Forma Geral de uma Função:

• A lista de declaração de parâmetros para uma função


tem a forma geral:

tipo_retorno função(tipo var1, tipo var2, tipo var3, ..., tipo varN)
{
corpo da função
}

71
Funções / Procedimentos

#include <stdio.h>
void desenha();
void desenha( )
{
int i;
for (i = 0; i < = 10; i++)
printf (“-”);
}
main ( )
{
desenha ( );
printf (“ usando funções”);
desenha ( );
}
72
Funções / Procedimentos

#include <stdio.h>
int fatorial (int);
int fatorial (int n)
{
int i, resultado = 1;
for ( i = 1; i <= n; i ++)
resultado *= i;
return resultado;
}
main ( )
{
printf (“ o fatorial de 4 = %d”, fatorial(4) );
printf (“ o fatorial de 3 = %d”, fatorial(3) );
}
73
Regras de Escopo

• As regras de escopo de uma linguagem são as regras que determinam se uma


porção de código conhece ou tem acesso a outra porção de código ou dados.

• Em C, cada função é um bloco discreto de código.

• O código de uma função é privativo à função e não pode ser acessado por
nenhum comando em outra função, exceto por meio de uma chamada à
função.

• O código que constitui o corpo de uma função é escondido do resto do


programa e, a menos que use variáveis ou dados globais, não pode afetar ou
ser afetado por outras partes do programa.

• O código e os dados que são definidos internamente a uma função não podem
interagir com o código ou dados definidos em outra função porque as duas
funções têm escopos diferentes.

74
Regras de Escopo

• Variáveis locais:

• São as variáveis definidas internamente a uma função;

• Existem somente durante a execução da função que as


definiu;

• Não podem manter seus dados entre chamadas da função,


exceto se se usa o especificador de tipo de armazenamento
static.

• Em C, todas as funções estão no mesmo nível de escopo;

• Por este motivo, C não é considerada uma linguagem


estruturada em blocos.
75
Regras de Escopo

void desenha ( ) void desenha ( )


{ {
int i, j; int i, j; i, j em
. . . . . . desenha são
} . . . variáveis
main ( ) } diferentes de
{ void calcula ( ) i, j em
int a; { calcula.
int i, j;
desenha();
. . .
a = i;  erro . . .
. . . }
}

76
Passando dados para função

• Os argumentos podem ser passados para uma


função de duas maneiras:

• Chamada por Valor;

• Chamada por referência.

77
Passando dados para função

• Chamada por Valor:


• O parâmetro formal da função recebe uma cópia do
valor do argumento.

• Conseqüência:
• As alterações feitas nos parâmetros da função não
têm nenhum efeito nas variáveis usadas para
chamá-la.

78
Passando dados para função

• Chamada por Referência:


• O parâmetro formal da função recebe uma cópia do
endereço do argumento (ponteiro).

• Conseqüências:
• Dentro da função, o endereço é utilizado para
acessar o argumento real usado na chamada.
• Alterações feitas no parâmetro afetam a variáveis
usada para chamar a função.

79
Passando dados para função

• Chamadas: Valor X Referência:


• Exemplo 1

#include <stdio.h> Note que o valor da variável


t, usada como argumento
int sqr(int x); // Protótipo na chamada de sqr,
void main(void) permanece inalterado, de
{ // Inicio Função main modo que a saída deste
int t=10; programa será 100,10.
printf("%d %d", sqr(t), t);
} // Final Função main

sqr(int x) // Função
{ // Inicio Função sqr
x = x*x;
return(x);
} // Final função sqr
80
Passando dados para função

• Chamadas: Valor X Referência:


• Exemplo 2

void swap(int *x, int *y); // prototipo da funcao


void main( void ) Para a chamada por
{ referência, deve-se passar
int a, b; para a função um ponteiro
scanf(“%d%d”, &a, &b);
para cada argumento que
printf(“a=%d b=%d”, a, b);
swap(&a, &b); // passa os enderecos de a e b
se deseja modificar.
printf(“a=%d b=%d”, a, b);
}
void swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}

81
Comando return

• Comando return

• Possui dois usos:

• Invoca uma saída imediata da função que o


contém (faz com que a execução do
programa retorne ao código chamador;

• É usado para devolver um valor.

82
Comando return

• Comando return

• retornando de uma função:


• Há duas maneiras pelas quais uma função
termina sua execução (e retorna ao código
que a chamou):
• Ao executar o último comando da função
(e o } );
• Quando o comando return é encontrado.

83
Comando return

• Exemplo 1: escrevendo uma string de trás para frente

#include <stdio.h>
#include <string.h>
void pr_reverse(char *s); //prototipo da funcao
void main(void)
{
pr_reverse(“Eu gosto de C”); //passando uma string
}

void pr_reverse(char *s)


{
int i;
for(i=strlen(s)1;i>=0; i)
putchar(s[i]);
}

84
Comando return

• Exemplo 2: calculando o fatorial

#include <stdio.h> void fatorial(int x)


int fatorial(int n); {
void main(void) int i, resultado = 1;
{ if(n == 1)
int n, retorno; return 1;
printf(“Digite um número: ”);
scang(“%d”, &n); for(i=x;i>1; --i)
retorno = fatorial(n); {
printf(retorno); resultado*=i;
} }
return resultado;
}

85
Comando return

• Retornando Valores
• Todas as funções, exceto as do tipo void, retornam
um valor;
• Este valor é explicitamente especificado pelo
comando return;
• Se não houver um comando return na função, então o
valor de retorno será tecnicamente indefinido;
• Neste caso, geralmente os compiladores C devolvem
o valor zero (mas não se pode contar com isso);
• Desde que uma função não seja void, ela pode ser
usada como operando em qualquer expressão válida
em C.

86
Exercícios de funções

• Exercício 1
• Fazer um programa que lê as 3 notas de um aluno de
programação I (v1, v2 e MT, onde MT é a média dos trabalhos).
O programa chama uma função que calcula e imprime a média
do aluno, usando a fórmula M=(3*v1+3*v2+4*MT)/10.

• Exercício 2:
• Fazer o programa anterior, porém a função não imprime a média
e sim retorna o valor dela. O programa verifica se o aluno atingiu
a média 7, também utilizando função. Caso positivo, o programa
imprime a mensagem “aprovado por média”. Caso contrário, o
programa chama outra função que calcula e imprime o valor
necessário na prova especial.

87
Pauta

Introdução.

Entrada/Saída.

Operadores. Front cover


Estruturas condicionais.

Estruturas de repetição.

Vetores/Matrizes.

Funções.

Ponteiros.

Estruturas.
88
Vetores

• Tipo de dado usado para representar uma coleção de


variáveis de um mesmo tipo.

• Estrutura de dados homogênea unidimensional.

• Identificadas por um único nome.

• Cada componente é identificado por um índice, um número


inteiro que referencia sua localização dentro da estrutura.

• Em C++ os índices utilizados para identificar as posições


em um vetor começam sempre em 0 (zero) e vão até o
tamanho do vetor menos uma unidade.

89
Vetores

• Declaração
• em „C‟ não existe declaração de vetor dinâmico.
• o tamanho de um vetor tem que ser determinado em tempo
de compilação.

• Exemplo:
int alunos;
int notas [ alunos ];
printf (“entre com o número de alunos”);
scanf (“%d”, &alunos);
NÂO É ACEITO !!!

90
Vetores

• Indexação
• Operação básica com vetor: indexação
• Permite selecionar um componente específico da estrutura pela sua
posição (índice)
• O índice do primeiro elemento é 0 (zero)
• O índice do último elemento é o tamanho do vetor menos um

• Exemplo:

91
Vetores

• Exemplo:
• Modificando um elemento em um vetor:

• Exemplo:
• Exibe todos os elementos de um vetor:

92
Vetores

• Exemplo:
• Preenchendo um vetor

93
Vetores

• Exemplo:
• Média dos elementos de um vetor

94
Vetores

• Mas como o compilador calcula a quantidade de memória a ser alocada


para uma dada matriz?

• total em número de elementos bytes = sizeof (tipo) * da matriz

• Sizeof é um operador unário, em tempo de compilação, que retorna o


tamanho, em bytes, da variável ou especificador de tipo entre
parêntesis

95
Vetores

• Armazenamento: exemplo 1
• char m[8];
• Supondo
• palavra de memória de 1 byte
• char ocupando 1 byte (mínimo,
segundo padrão ANSI)

96
Vetores

• Armazenamento: exemplo 2
• int v[8];
• Supondo
• palavra de memória de 1 byte
• int ocupando 2 bytes (mínimo,
segundo padrão ANSI)

97
Matrizes

• Matriz: variável composta homogênea multidimensional.

• Formada por uma sequência de variáveis, todas do mesmo tipo,


com o mesmo nome, e alocadas sequencialmente na memória.

• Os componentes são identificados por um conjunto de índices.

• Utiliza-se um índice para cada dimensão.

98
Matrizes

• Qual o valor de i e j?

99
Matrizes

• Declaração
• Na declaração de uma variável matriz especificamos:
• o tipo dos componentes da matriz
• o nome da variável
• o número de componentes que formam cada dimensão da
matriz
• os elementos do vetor (opcional)

• Exemplos:

100
Matrizes

• Indexação
• Permite selecionar um componente específico da estrutura pela sua
posição, dada por um conjunto de índices.

• Exemplos:

101
Passagem de vetor e matriz para funções

• Passagem como parâmetros para funções

• Não é possível passar um vetor inteiro como um argumento para


uma função

• É passado apenas o endereço, ou seja, um vetor é sempre passado


por referência.

• Qualquer alteração em seus elementos altera a variável usada


como parâmetro na chamada da rotina.

102
Passagem de vetor e matriz para funções

• Passagem como parâmetros para funções

• Declarar o parâmetro da mesma forma que o vetor foi declarado

• O comprimento do vetor não importa à função (C não faz verificação


de limites)

• A passagem dos elementos de um vetor como parâmetro

• Idêntica à passagem de uma variável

• Passagem por valor: elemVet (no protótipo da função)

• Passagem por referência &elemVet

103
Passagem de vetor e matriz para funções

104
Passagem de vetor e matriz para funções

105
Exercícios

• Problema I:
• Faça um programa que leia as notas dos alunos de uma turma,
determine e mostre a média das notas, e o número de alunos com
notas superiores ou iguais à média.

106
Exercícios

• Problema II:
• Faça um programa que simule o lançamento de um dado com vinte
jogadas. Mostrar os números sorteados e a frequência com que
apareceram.
• Para gerar números aleatórios em C++, temos duas funções que
trabalham de forma semelhante:
• rand
• random
• Estas duas funções geram números aleatórios de 0 a RAND_MAX
(definido na biblioteca stdlib.h). Se você quiser gerar valores
randômicos em uma determinada faixa numérica, basta fazer assim:
• numero = rand() % valor_maximo;
ou
• numero =random() % valor_maximo;
• Para usá-las, porém, é necessário inicializar o gerador de números
aleatórios com a função srand.

107
Exercícios

• Problema III
• Uma pequena loja de artesanato possui um vendedor e
comercializa dez tipos de objetos. O vendedor recebe,
mensalmente, salário de R$ 400,00, acrescido de 5% do valor total
de suas vendas. O valor unitário dos objetos deve ser informado e
armazenado em um vetor; a quantidade vendida de cada peça deve
ficar em outro vetor, mas na mesma posição. Crie um programa que
receba os preços e as quantidades vendidadas, armazenando-os
em seus respectivos vetores (ambos com tamanho dez). Depois,
determine e mostre:
• um relatório contendo quantidade vendida, valor unitário e valor
total de cada objeto; ao final, deverá ser mostrado o valor geral
das vendas e o valor da comissão que será paga ao vendedor;
• o valor do objeto mais vendido e sua posição no vetor (não se
preocupe com empates).

108
Exercícios

• Problema IV
• Faça um programa que preencha um vetor com os modelos de
cinco carros (exemplos de modelos: fusca, gol, vectra, etc.),
carregue outro vetor com o consumo desses carros, isto é, quantos
quilômetros cada um deles faz com um litro de combustível, calcule
e mostre:
• o modelo de carro mais econômico,
• quantos litros de combustível cada um dos carros cadastrados
consome para percorrer uma distância de de mil quilômetros.

109
Exercícios

• Problema V
• Obter do usuário uma matriz m3x2, calcular e mostrar a matriz r3x2
resultante da multiplicação de todos os elementos de m pelo seu
maior elemento.

110
Exercícios

• Problema IV
• Faça um programa que preencha uma matriz 10x3 com as notas de
dez alunos em três provas. O programa deverá mostrar um relatório
com o número dos alunos (número da linha) e a prova em que cada
aluno obteve menor nota. Ao final do relatório, deverá mostrar
quantos alunos tiveram menor nota em cada uma das provas: na
prova 1, na prova 2 e na prova 3.

111
Pauta

Introdução.

Entrada/Saída.

Operadores. Front cover


Estruturas condicionais.

Estruturas de repetição.

Vetores/Matrizes.

Funções.

Ponteiros.

Estruturas.
112
Ponteiros

• Um ponteiro é o endereço de uma variável na memória.

• Uma variável de ponteiro é uma variável especialmente


declarada para guardar um ponteiro para seu tipo
especificado.

• São uma maneira rápida de referenciar uma variável em C;

• São o meio pelo qual as funções em C conseguem modificar


seus parâmetros de chamada;

• Provêem suporte às listas encadeadas e outras estruturas de


dados dinâmicas.
113
Ponteiros :: Operadores

• Operadores para Ponteiros


• operador &:
• Devolve o endereço da memória em que se encontra
alocado seu operando;

• Exemplo:
• m = &count;
• atribui a m o endereço da memória em que se encontra
a variável count. Esse endereço não tem nenhuma
relação com o valor de count.

114
Ponteiros :: Operadores

• operador &:
• Exemplo mais concreto, em termos de memória:
• assuma que a variável count foi alocada para a posição
de memória 2000. Assuma também que count tem
como valor 100. Então, após a setença de atribuição
anterior, m tem o valor 2000.

115
Ponteiros :: Operadores

• operador *:
• Devolve o valor da variável localizada no endereço que o segue (ou
seja, este operador sempre interpreta seu operando como um
endereço de memória!)

• Exemplo:
• seguindo o exemplo anterior, se m contem o endereço da variável
count,
• q =*m;
• coloca o valor de count em q. Agora q tem o valor 100 porque 100
está armazenado na posição 2000, endereço da memória em que
está armazenado m.

116
Ponteiros :: Operadores

• operador *:
• Devolve o valor da variável localizada no endereço que o segue (ou
seja, este operador sempre interpreta seu operando como um
endereço de memória!)

• Exemplo:
• seguindo o exemplo anterior, se m contem o endereço da variável
count,
• q =*m;
• coloca o valor de count em q. Agora q tem o valor 100 porque 100
está armazenado na posição 2000, endereço da memória em que
está armazenado m.

117
Ponteiros :: Declaração

• Declarando Ponteiros
• Variáveis que armazenam endereços de memória, os ponteiros (como
são chamadas em C), devem ser declaradas colocando-se * em frente
ao nome da variável para indicar ao compilador que ela guardará um
ponteiro para aquele tipo de variável.

• Exemplo: para declarar uma variável ponteiro ch para char, escreve-


se:
• char *ch;
• Aqui, ch não é um caractere, mas um ponteiro para caractere (há uma
grande diferença).

118
Ponteiros :: Declaração

• Pode-se misturar diretivas de ponteiro e de não-ponteiro na mesma


declaração, como por exemplo:
• int x, *y, count;
• Declara x e count como sendo do tipo inteiro e y como sendo um
ponteiro para o tipo inteiro.

• O que faz o programa abaixo?

119
Ponteiros :: Atribuições

• Atribuições de Ponteiros
• Como qualquer variável, um ponteiro pode ser usado do lado direito
de um comando de atribuição para se passar seu valor para outro
ponteiro.

120
Ponteiros :: Aritimética

• Existem apenas duas operações aritméticas que podem ser feitas


com ponteiros:
• Adição
• Subtração

• Regras da aritmética de ponteiros:


• Cada vez que um ponteiro é incrementado, ele aponta para a posição
de memória do próximo elemento do seu tipo base.
• Cada vez que um ponteiro é decrementado, ele aponta para a posição
de memória do elemento anterior do seu tipo base

121
Ponteiros :: Aritimética

• Exemplo:
• assuma que estamos usando uma máquina na qual um inteiro ocupa
2 bytes. Então …
• int *p1, x;
• p1 = &x;
• p1++;

• Suponha que x estava armazenada na posição de memória 2000.


Então, após p1++, p1 conterá o valor 2002.

122
Ponteiros :: Aritimética

• Aritmética de Ponteiros
• Também é possível somar ponteiros:
• p1 = p2 + 100;
• Além de adição e subtração entre um ponteiro e um inteiro, nenhuma
outra operação pode ser efetuada com ponteiros.

• Particularmente, NÃO é permitido:


• Adicionar ou subtrair o tipo float ou o tipo double a ponteiros;
• Multiplicar ou dividir ponteiros;
• Aplicar os operadores de deslocamento ou de mascaramento bit a
bit com ponteiros.

123
Ponteiros :: Comparação

• Comparação entre Ponteiros

• É possível comparar dois ponteiros em uma expressão relacional.

• Exemplo:
if(p<q)
printf(“p aponta para um endereço de memoria mais baixo que q\n”);

• Geralmente, comparações de ponteiros são utilizadas para verificar se


dois ou mais ponteiros apontam para um mesmo objeto (uso em
estruturas de dados tais como pilhas, filas etc)

124
Ponteiros e Matrizes

• Há uma estreita relação entre ponteiros e matrizes.


• De fato, os índices das matrizes são uma maneira mais confortável
para se acessar um dado elemento.
• char nome[80], *p1, ch;
• p1 = nome;
• p1 foi inicializado com o endereço do primeiro elemento da matriz
nome:
• ch = nome[4];
ou
• ch=*(p1+4);
copiam o quinto elemento de nome para ch

125
Ponteiros e Matrizes

• Acessando uma matriz com índices:


for( i=0; nome(i) != „\0‟; i++)
putchar(nome[i]);

• Acessando uma matriz com ponteiro:


for( p=nome; *p; p++)
putchar(*p);

• ou
p=nome;
while(*p)
putchar(*p++);

126
Ponteiros e Matrizes

• Como qualquer outro tipo básico, ponteiros podem ser organizados


em matrizes:

int *listas[100];

• Para se atribuir o endereço de uma variável inteira, chamada var, ao


terceiro elemento da matriz de ponteiros, deve-se escrever:

listas[2] = &var;

• Para encontrar o valor de var, escreve-se:

*listas[2];

127
Ponteiros :: Indireção Multipla

• Ocorre quando se tem um ponteiro que aponta para outro ponteiro


que (finalmente) aponta para o valor.

• Indireção simples (vista até agora)

• Indireção múltipla

128
Ponteiros :: Indireção Multipla

• Exemplo:

129
Ponteiros :: Indireção Multipla

• Exemplo:

130
Pauta

Introdução.

Entrada/Saída.

Operadores. Front cover


Estruturas condicionais.

Estruturas de repetição.

Vetores/Matrizes.

Funções.

Ponteiros.

Estruturas.
131
Estruturas

• Registros: Utilização

• Vetores e matrizes
• Estruturas de dados homogêneas
• Armazenam vários valores, mas todos de um mesmo

• Problemas reais
• Coleções de dados que são de tipos diferentes
• Exemplo: ficha de um cadastro de cliente
Ficha:
Nome: ________ Nome: string
Endereço: ______ Endereço: string
Telefone: _______ Telefone: string
Salário: ________ Salário: float
Idade: _________ Idade: int
132
Estruturas

• Características
• Tipo de dado estruturado heterogêneo
• Coleção de variáveis referenciadas sobre um mesmo nome
• Permite agrupar dados de diferentes tipos numa mesma
estrutura:
• ao contrário de matrizes que possuem elementos de um
mesmo tipo
• Cada componente de um registro pode ser de um tipo diferente
• (int, char, ...)
• Estes componentes são referenciados por um identificador
• Utilizado para armazenar informações de um mesmo objeto
• Carro  cor, marca, ano, placa, chassi
• Pessoa  nome, idade, endereço

133
Estruturas

• Características

• Registro:

• Conjunto de campos relacionados

• Exemplo:
• nome, endereço, telefone, salário e idade de uma pessoa

• Elementos de um registro
• Denominados campos ou membros do registro
• Exemplo: nome

134
Estruturas

• Sintaxe em C/C++

• A palavra reservada struct indica ao compilador que está sendo


criada um registro

• Uma Struct normalmente é declarada após incluir as bibliotecas


e antes da função main
• Não é obrigatório

• Sintaxe:
struct <identificador_struct> {
tipo <nome_variável_campo1>;
tipo <nome_variável_campo2>;

} <variáveis_estrutura>;
135
Estruturas

• Sintaxe C/C++
• A informação contida em uma struct pode ser atribuída a outra
struct do mesmo tipo
• Não é necessário atribuir os valores de todos os campos
separadamente
• Por exemplo:
• <var1> = <var2>;
• Todos os campos de <var1> receberão os valores
correspondentes dos campos de <var2>
• Para acessar os campos da struct:
• Utiliza-se o nome da variável struct, seguido de ponto,
seguido do nome do campo
• Exemplo: <var1>.<nome_variável_campo2>;

136
Estruturas

• Exemplo:
• Declaração de um Struct endereço que guarda os elementos
nome, rua, cidade, estado e cep:
struct T_endereco{
char nome[30];
char rua[40];
char cidade[20];
char estado[3];
long int cep;
};
• Foi feita apenas a declaração da struct, ainda não foi criada
nenhuma variável do tipo da struct endereço
• O comando para declarar uma variável com esta struct é:
• [struct] T_endereco endereco;
• A palavra reservada “struct” é opcional
137
Estruturas

• Exemplo

• Para inicializar o cep da variável endereco que é uma variável


da struct endereço:
• endereco.cep = 242100450;

• Para obter o nome da pessoa e colocar na string nome da


struct se poderia utilizar:
• cin >> endereco.nome;

• Para percorrer toda a string rua seria:


for(int i=0; i < 40; i++)
cout << info_end.rua[i];

138
Estruturas

• Exemplo
struct T_aluno {
char nome[40];
float P1;
float P2;
float T;
int faltas;
};
int main() {
T_aluno joao, maria;
joao.P1 = 9.5;
joao.P2 = 8.5;
joao.T = 9.0;
joao.faltas = 4;
maria = joao;
139
}
Estruturas

• Exemplo
#include <stdio.h>
#include <string.h>
struct endereco {
char rua[40];
int num;
int complemento;
char cidade[20];
char estado[3];
char cep[10];
};
int main() {
struct endereco e1; // declaração de variáveis do
struct endereco e2; // tipo "endereco" compilador
// aloca memoria para
// todos os campos
...

140
Estruturas

• Exemplo
// inicialização dos campos de e1...
strcpy(e1.rua, "Avenida Ipiranga");
e1.num = 1234;
e1.complemento = 101;
strcpy(e1.cidade, "Porto Alegre");
strcpy(e1.estado, "RS");
strcpy(e1.cep, "90000-123");

// inicialização dos campos de e2...


strcpy(e2.rua, "Rua Lima e Silva");
e2.num = 1987;
e2.complemento = 308;
strcpy(e2.cidade, "Porto Alegre");
strcpy(e2.estado, "RS");
strcpy(e2.cep, "90000-345"); ...

141
Estruturas

• Exemplo

// exibição dos dados


cout << e1.rua << e1.num << e1.complemento;
cout << e1.cep << e1.cidade << e1.estado;
cout << e2.rua << e2.num << e2.complemento;
cout << e2.cep << e2.cidade << e2.estado;
}

142
Estruturas

• Vetores de Struts

• Para declarar um vetor de struct:

• Definir a struct

• Declarar o vetor do tipo struct criado

• Exemplo:
struct aluno Turma380[28];
struct endereco vetorEndAmigos[100];

143
Estruturas

• Vetores de Struts

• Manipulação dos dados de um vetor de struct:


• fornecer o índice e o campo

• Exemplo:
strcpy(Turma380[0].nome, “Fulano”);
Turma380[0].P1 = 9.5;
Turma380[0].P2 = 8.5;
Turma380[0].T = 9.0;
Turma380[0].faltas = 4;
strcpy(vetorEndAmigos[0].rua, “Carlos Gomes”);
strcpy(vetorEndAmigos[1].rua, “Goethe”);

144
Estruturas

• Exemplo:
#include <iostream.h>
struct endereco{
char nome[30];
char rua[40];
char cidade[20];
char estado[3];
long int cep;
};
main() {
struct endereco info_end[100];
:
// Imprime todos os nomes do vetor
for(int i = 0; i < 100; i++)
cout << info_end[i].nome;
145
Estruturas

• Exemplo:
#include <iostream.h>
struct endereco{
char nome[30];
char rua[40];
char cidade[20];
char estado[3];
long int cep;
};
main() {
struct endereco info_end[100];
:
// Imprime todos os nomes do vetor
for(int i = 0; i < 100; i++)
cout << info_end[i].nome;
146
Estruturas

• Exercícios

1- Criar uma estrutura chamada DadosAluno, que armazena o nome


e idade de um aluno. Na função main: criar uma variável que é uma
estrutura DadosAluno; ler o nome e a idade de um aluno e
armazenar na variável criada; exibir na tela o nome do aluno,
caracter por caracter, e a idade do aluno.

• 2 - Considerando o exercício anterior, criar uma variável vetor da


estrutura DadosAluno. O programa deve obter o nome e a idade de
10 alunos. Depois, estes dados devem ser exibidos.

147
Estruturas

• Exercícios

3 - Fazer um programa que cria uma estrutura livro, que contém os


elementos nome, editora, isbn, ano de edição, número de páginas e
preço. Criar uma variável desta estrutura que é um vetor de 5
elementos. Ler os valores para a estrutura e imprimir a média do
número de páginas do livros.

4 - Foi realizada uma pesquisa entre 500 habitantes de uma certa


região. De cada habitante foram coletados os dados: idade, sexo,
salário e número de filhos. Construa um programa C++ que
armazene as informações da pesquisa e calcule a média do salário
dos habitantes e de filhos e liste os habitantes com salário inferior a
média e o número de filhos superior a média.

148