Buscar

Introdução à Linguagem C

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 102 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 102 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 102 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Programação em C
PRC
Parte 02 – Introdução a Linguagem C
Prof. Victor Thomaz
www.sites.google.com/site/professorvictorthomaz/materialprc
Linguagem C - Origens
• Criada por Dennis Ritchie (em um Sistema 
Operacional Unix) na década de 1970 nos 
Laboratórios Bell (Bell Labs)
• É derivada da Linguagem B, criada por Ken 
Thompson no final do anos 1960, que por sua 
vez foi influenciada pela Linguagem BCPL 
inventada por Martin Richards
Linguagem C - Origens
Da esquerda para direita: 
Ken Thompson (Criador da linguagem B) e Dennis Ritchie (Criador da Linguagem C).
Fonte: pt.wikipedia.org
Linguagem C - Origens
• Com a popularização dos microcomputadores 
muitas implementações da linguagem C foram 
criadas
• O ANSI (American National Standards Institute) 
criou um comitê em 1983 para criar um padrão 
para definir a linguagem
• Anteriormente, era considerada como padrão a 
versão fornecida com o Sistema Operacional Unix 
versão 5
Linguagem C
• É considerada uma linguagem de nível médio
• Relembrando:
– Alto nível: Linguagem mais próxima do 
entendimento humano (Linguagem com instruções 
mais próximas do inglês)
– Baixo nível: Mais próxima da linguagem de máquina 
(Instruções binárias)
• Quanto mais clara para o ser humano mais obscura 
será para máquina.
• É estruturada. Tarefas divididas em sub-rotinas/função, 
variáveis locais, suporta laços de repetição, blocos de 
comandos (entre { }) 
Linguagem C
• Médio nível não significa menos poderosa ou 
menos desenvolvida que uma linguagem de 
alto nível.
• A linguagem C combina elementos de alto 
nível com funcionalidades de linguagens de 
baixo nível.
• C suporta: Conceito de tipo de dados, 
manipulação de bits, bytes e endereços, 
portabilidade (software escrito para Windows 
funciona no Linux, por exemplo)
Linguagem C – Função main
#include <stdio.h>
int main(){
printf(“Programa simples em C.\n”);
return 0;
}
Softwares
• Windows:
– Dev C++ IDE (Integrated Development Environment) 
– Site: www.bloodshed.net/devcpp.html
– CodeBlocks
– Site: www.codeblocks.org/
• Linux:
– Linha de comando (Shell) + Editor de texto
– Compilador GCC (“GNU” C Compiler)
– Comando para compilar: 
gcc arquivoFonte.c –o arquivoExecutavel
Termos Úteis
• Código Fonte: Texto codificado de acordo com a linguagem de 
programação que o programador escreve. É a entrada para o 
compilador C.
• Código Objeto: É código fonte traduzido para código de máquina. 
Ou seja, o programa que o computador é capaz de executar. O 
código objeto é a entrada para o Linkeditor.
• Linkeditor: Combina o código que o programador escreveu com as 
funções presentes em bibliotecas que foram compiladas 
separadamente.
• Biblioteca: Arquivo que contém funções úteis que podem ser 
utilizadas pelo programa que será desenvolvido.
• Tempo de Compilação: Eventos que acontecem no momento da 
compilação do código fonte. Exemplo: Erro do sintaxe.
• Tempo de Execução: Eventos que ocorrem quando o programa 
está sendo executado.
Palavras Reservadas/Palavras-Chave
• Lista com as 27 Originais + 5 comitê ANSI:
• Auto break case char 
• const continue default do 
• double else enum extern 
• float for goto if 
• int long register return 
• short signed sizeof static 
• struct switch typedef union 
• unsigned void volatile while
Palavras Reservadas/Palavras-Chave
• Todas as palavras reservadas são escritas com 
letras minúsculas.
• if é uma palavra reservada mas IF não é.
• Lembre-se, a linguagem C considera como 
nomes de variáveis diferentes em maiúsculo 
ou minúsculo
• int num é diferente de int Num
Palavras Reservadas/Palavras-Chave
• Programa em C consiste em uma ou mais 
funções
• A função main() precisa estar presente em 
todos os programas
• Não tente usar main() como nome de variável 
pois compilador irá se confundir
Cinco Tipos Básicos de Dados
• Caractere: char
• Inteiro: int
• Ponto flutuante: float
• Ponto flutuante de precisão dupla: double
• Sem valor: void
Todos os tipos do padrão ANSI
• char
• unsigned char
• signed char
• int 
• unsigned int
• signed int
• short int
• unsigned short int
• signed short int
• long int
• signed long int
• unsigned long int
• float
• double
• long double
Modificadores de Tipo
• signed
• unsigned
• long
• short
Nome de Identificadores
• Identificadores são utilizados definição de 
variáveis e funções, por exemplo.
• Primeiro caractere deve ser letra ou 
sublinhado(underline)
• Restante pode ser letras, números ou 
sublinhados
• Exemplo: 
• Certo – cont, ab23, v_nota; 
• Errado – 1cont, ab!cd, v...nota;
Variáveis
• Posição nomeada de memória
• int cont, i, a, b; 
• unsigned int ui;
• float dinheiro, p, notasAlunos[3];
• double custo, m, n[100];
• char letra, nome[20];//Vetor deve terminar com o caractere “\0”
Variáveis Locais
• Variáveis acessíveis dentro do bloco
• Bloco de código inicia com { e termina com }
• Só existem enquanto o bloco de código está 
sendo executado
• É criada no início da execução do bloco e 
destruída na saída
Variáveis Locais - Exemplo
void func1(void) {
int x;
x = 10;
}
void func2(void){
int x;
x = -199;
}
void f(int t){
if (t==1) {
char s[80]; //Só existe dentro do bloco do if
printf(“Digite um nome:");
gets(s);
}
printf(“letra em s %c”, s[2]);/*Não posso fazer isso. 
Está fora do bloco de declaração da variável /*
}
Variável Global
• Reconhecidas em todo o programa
• Guardam os valores durante toda a execução
• São declaradas fora de qualquer função, em 
lugar anterior a seu primeiro uso.
Inicialização de Variáveis
• char letra = ‘a’; 
• int num = 4;
• float valor = 276.34;
• int vetor[5] = {67, 13, 77, 9, 10};
• int number[3] = { [0] = 5, [2] = 7 };//Elemento [1] = 0, implicitamente
• int matriz[2][3] = {{1,2,3},{4,5,6}};
Operadores - Atribuição
• Sinal de igual =
• Nome_variavel = algum_valor
• Exemplo: 
• a = 5;
• nota = 4 * (2 + 1) / 2;
• Atribuição Múltipla:
• x = y = z = 0;// Todas as variáveis com valor “0”
Operadores Aritméticos
• Subtração –
• Adição +
• Multiplicação * 
• Divisão /
• Módulo % 
• Incremento ++ 
• Decremento --
PRECEDÊNCIA OPERADOR
Alta + + - -
- (Menos unário)
* / %
Baixa + -
Operadores Aritméticos
• Incremento ++ 
– Se usado antes do operando (variável), incrementa o valor 
e depois utiliza o valor já incrementado. 
• Ex.: X = 10; Y = ++X;//Y recebe 11
– Se usado depois do operando (variável), utiliza o valor e 
somente depois incrementa. 
• Ex.: X = 10; Y = X++;//Y recebe 10
• Decremento --
– O operador decremento possui o mesmo comportamento, 
porém decrementando o valor.
• Ex.: X = 10; Y = --X;//Y recebe 9
• Ex.: X = 10; Y = X--;//Y recebe 10
Falso e Verdadeiro em C
• Muito utilizado nos comandos de decisão e 
repetição, onde expressões condicionais são 
avaliadas resultando em valores lógicos 
Verdadeiro ou Falso. De acordo com o resultado 
lógico, uma ação é executada ou não.
• Verdadeiro: É sempre um valor diferente de zero, 
incluindo números negativos, mas também pode 
ser considerado como 1 (um).
• Falso: É exatamente o valor zero.
Operadores Relacionais
OPERADOR AÇÃO
> Maior que
>= Maior ou igual
< Menor que
<= Menor ou igual
== Igual
!= Diferente
• Expressões que utilizam operadores relacionais ou lógicos retornam 0 (zero) para 
FALSO e 1 para VERDADEIRO.
Operadores Lógicos
OPERADOR AÇÃO
&& E (AND)
|| OU (OR)
! NÃO (NOT)
Operadores Lógicos
P Q P && Q P || Q !P
0 0 0 0 1
0 1 0 1 1
10 0 1 0
1 1 1 1 0
• Exemplo: 10>5 && !(10<9) || 3<=4
• Resultado é VERDADEIRO
Precedência de Operadores 
Lógicos e relacionais
PRECEDÊNCIA OPERADORES
Alta !
> >= < <=
== != 
&&
Baixa ||
Exemplo 1: !0 && 0 || 0 resultado é FALSO
Exemplo 2: !(0 && 0 )|| 0 resultado é VERDADEIRO
Obs.: O operador ! (NOT) é avaliado primeiro
Exemplo 3: int x;
x = 100;
printf(“%d”, x > 10);
Função de Entrada e Saída 
Formatada – printf()
• printf(<string_de_controle>,<lista_de_argume
ntos>);
• string_de_controle: Parte textual apresentada 
na tela. Define a posição em que as variáveis 
serão posicionadas, através dos 
especificadores de tipo com o caractere % .
• lista_de_argumentos: Lista de variáveis 
separadas por vírgula e na ordem dos 
especificadores na lista de argumentos.
• Ex.: printf(“valor do inteiro %d”, x);
Função de Entrada pelo Console
• scanf(<especificador_tipo>,<endereço_variavel>);
• especificador_tipo: Utilizado com o caractere %, 
define o tipo de dado que será lido. 
• endereço_variavel: Indica uma variável para se 
armazenar o valor. O & indica o endereço de 
memória da variável.
• Ex.: scanf(“%c”,&letra);
Exercício
• Crie um programa em C que leia dois números 
inteiros e apresente na tela os resultados das 
operações de soma, subtração, divisão, 
multiplicação e resto.
• Utilize o comando printf para apresentar o 
resultado das operações abaixo. Observe o 
comportamento dos operadores incremento e 
decremento. 
• Ex.: resultado1 = a + (b++);
• resultado2 = a + (++b);
Exercício
• Construa um programa que receba três notas 
de alunos e seus respectivos nomes e imprima 
na tela. Um aluno e sua nota por linha. Crie 
uma variável para o nome e outra para a nota.
• Ex.: Aluno: João Nota: 7.3
Aluno: Fulano Nota: 4.7
Aluno: Beltrano Nota: 8.9 
Decisão ou Seleção – if else
• if ( expressão )
comandoA;
else
comandoB;
• Onde: comando é um único comando ou um 
bloco de comandos {} ou pode ser omitido. A 
cláusula else é opcional
Decisão ou Seleção – if else
• Exemplo:
• if (opcao == 1)
printf(“Você escolheu opção 1.”);
else
printf(“Você escolheu opção diferente de 1.”);
Decisão ou Seleção – if else
• Exemplo com bloco. Necessário quando existe 
mais de um comando:
• if (opcao == 1){ //Início do bloco
printf(“Você escolheu opção 1.”);
printf(“Não foi uma boa escolha!”);
} //Fim do bloco
else
printf(“Você escolheu opção diferente de 1.”);
Decisão ou Seleção – if else
• Exemplo com bloco e aninhado:
• if ( i ){ //Início do bloco.
if( j ) // Este if não tem else associado a ele.
comandoA();
if( k ) //Possui o else logo abaixo associado a ele.
comandoB();
else // else associado ao if (k).
comandoC();
} //Fim do bloco if ( i )
else // Associado ao if (i).
comandoC();
Decisão ou Seleção – if else
• Exemplo com vários if aninhados:
• if ( i )
comandoA();
else
if( j )
comandoB();
else
if ( k )
comandoC();
else
comandoD();
Exercícios
• Faça um programa em C para ler a temperatura de 
uma pessoa e exibir a mensagem “ESTÁ COM 
FEBRE” ou “ESTÁ NORMAL”. Considere o valor base 
como 36.5.
• Faça um programa que solicite o sexo do usuário 
(M ou F) e a seguir informe a mensagem “Homem”, 
“Mulher” ou “Letra inválida”. Faça uma versão com 
if e outra com switch (Veremos a seguir).
Decisão ou Seleção – Switch
• É uma estrutura de seleção múltipla que testa uma expressão 
sobre uma lista de constantes, que pode ser de inteiros ou 
caracteres. Quando uma correspondência for encontrada, o 
comando que está associado a constante será executado.
• switch ( expressão ){
case constant1 : 
comandoA;
break;
case constant2 :
comandoB;
break;
case constant3 :
comandoC;
break;
default :
comandoD;
break; //Poderia ser omitido já que é a última opção dentro do switch
}
Decisão ou Seleção – Switch
• A expressão no switch não pode ser sobre 
números reais (float/double). O resultado da 
expressão é testado sobre cada constante após o 
case.
• switch só testa igualdade, if pode avaliar qualquer 
tipo de expressão lógica ou relacional.
• break faz com que a execução dos comandos 
dentro do case termine. Se break for omitido de 
um case, então a execução continua em outros 
case até encontrar um break ou terminar o 
switch.
Decisão ou Seleção – Switch - Exemplo
switch(ch) { //ch é uma variável do tipo char
case ‘A’:
printf(“A escolhido. \n");
break;
case ‘B’:
printf(“B escolhido. \n");
break;
case ‘C’:
printf(“C escolhido. \n");
break;
default :
printf(“Nenhuma opção anterior foi selecionada. \n");
}//Fim switch
Decisão ou Seleção – Operador ?
• O operador ? É ternário necessitando de três 
operandos conforme a forma geral abaixo:
• Op1 ? Op2 : Op3
• Onde Op1, Op2 e Op3 são expressões avaliadas 
da seguinte maneira:
• Op1 é uma expressão condicional que é avaliada 
primeiro. Se o resultado for VERDADEIRO, então 
Op2 é avaliado e se torna o valor de toda a 
expressão. Se o resultado de Op1 for FALSO, 
então Op3 é avaliado e se torna o valor de toda 
a expressão.
Decisão ou Seleção – Operador ?
• O operador ? Pode ser utilizado para substituir 
um if else conforme exemplo abaixo:
• x = 10; 
if (x > 9) 
y = 100;
else
y = 200;
• Equivalente a:
• x = 10;
y = x>9 ? 100 : 200
• Em ambos os casos, y recebe o valor 100. Se o 
valor de x for menor que 9, então y recebe 200.
Repetição - While
• while (expressão)
comandoA;
• Enquanto o resultado da expressão for 
verdadeiro (diferente de zero), a linha comandoA
será executada. Se o resultado da expressão for 
falso, então a execução é desviada para a linha 
imediatamente posterior ao comando while.
• comandoA pode ser uma chamada de função, 
bloco de comandos.
Repetição - While
char letra;
while(letra != 'A'){
printf("Digite qualquer letra ou 'A' para sair.\n"); 
scanf("%c",&letra); 
}
printf("Você digitou 'A'.\n"); /*Comando 
imediatamente após o fim do loop(repetição)*/
Repetição – Do While
• É uma variação do loop while, porém ao invés de 
testar a expressão antes de executar o loop, o teste é 
feito ao final. Desta forma o loop será executado pelo 
menos uma vez.
• do {
comandoA;
}while(expressão);
• As chaves do bloco podem ser omitidas se houver 
somente um comando dentro do loop.
• Enquanto a expressão for verdadeira, a execução 
ficará “presa” dentro do loop.
Repetição – Do While
• do {
scanf(“%d”, &num);
} while (num < 100);
• Neste trecho de código a execução do loop só 
termina quando um número maior ou igual a 
100 for digitado. 
• Pelo menos na primeira iteração o comando 
scanf será chamado.
Repetição - For
• Uma outra forma de executar repetidamente um 
conjunto de instruções é através do for.
• for (inicialização; condição; incremento)
comandoA; 
• Inicialização é onde será a atribuído um valor inicial para 
variável de controle do loop.
• Condição é uma expressão relacional que determina a 
condição de parada do loop.
• Incremento define como a variável de controle do loop 
muda cada vez que o loop é repetido.
• ComandoA pode ser um bloco de comandos ou único 
comando/chamada de função/ etc.
Repetição - For
• int x;
for (x = 1; x <= 100; x++)
printf(“%d \n”,x);
• Este exemplo apresenta na tela os número de 1 
até 100. 
• A variável x é inicializada com o valor 1. Enquanto 
a condição x <= 100 for verdadeira, a função printf
será chamada. A cada iteração(execução dos 
comandos dentro do loop) o valor de x é 
incrementado em uma unidade.
Repetição - For
• int x = 10;
for (y = 10; x != y ; y++ ){printf(“Olá ”);
printf(“Mundo!”);
}
• Importante observar que o código dentro de um loop for
pode nunca ser executado, pois a condição de parada é 
verificada antes da execução dos comandos internos.
• No exemplo, logo na primeira verificação da condição, x 
será igual a y e as funções printf nunca serão executadas.
Comandos de Desvio
• A linguagem C permite o desvio da execução do programa 
conforme apresentado a seguir:
• return = retorna valor de uma função.
• goto = desvia a execução para a posição do identificador 
label.
• break = Força a finalização da execução de um loop. 
Termina a execução de um case no switch.
• exit() = Função que interrompe a execução do programa 
inteiro.
• continue = continue força uma nova iteração do loop. 
Após a chamada de continue, a condição de parada é 
testada e a variável de controle é incrementada.
Vetor
• É uma coleção de valores de um mesmo tipo 
referenciados por um mesmo nome.
• Os elementos nos vetores são acessados 
através de índices.
• Forma geral: tipo nome_var [tamanho]
• Tipo indica o tipo de dado de cada elemento 
no vetor. Nome_var é um identificador válido 
e tamanho define quantos elementos o vetor 
irá armazenar.
Vetor
• Veja abaixo a declaração de um vetor chamado 
notas do tipo float com capacidade para 
armazenar dez elementos.
• float notas[10];
• notas[3] = 6.7; Atribui o valor 6.7 ao quarto 
elemento do vetor notas. Diferentemente da 
declaração do vetor, o número entre colchetes 
representa a posição de um único elemento não o 
tamanho do vetor.
• O vetor notas possuí 10 elementos, notas[0] até 
notas[9].
Exercícios
• Crie um programa em C que armazene em um 
vetor três números inteiros positivos digitados 
pelo usuário e informe na tela qual é o maior 
número armazenado no vetor.
String – Vetor de char
• Uma string é um vetor de caracteres 
terminado com o caractere nulo (‘\0’).
• Ao declarar um vetor de caracteres lembre-se 
de determinar o tamanho do vetor suficiente 
para armazenar a string e ainda o caractere 
nulo (‘\0’).
• Exemplo: char nome[31]; //Armazena uma 
string de 30 caracteres e na última posição o 
caractere ‘\0’.
String – Vetor de char
• Constante do tipo string: É um conjunto de 
caracteres entre aspas.
• Exemplo: “Olá mundo!”.
• No caso de constante string, o compilador 
atribui o caractere nulo no fim da string
automaticamente. 
• Exemplo: charmensagem[20] = “Olá alunos 
de PRC.”//Frase com 18 caracteres(incluindo 
os espaços) mais o caractere nulo no final.
String – Vetor de char
• Declaração e inicialização: 
• Char cor[10] = “azul”;//Inclui nulo automaticamente
• Char cor[10] = { ‘a’, ‘z’, ‘u’, ‘l’, ‘\0’};
• Char cor[] = “azul”;//Tamanho determinado pelo 
//comprimento da string.
• As declarações acima são equivalentes.
String – Vetor de char
• Para obter uma string do usuário, veja o exemplo:
char frase[51];
puts(“Informe uma string:”);
gets(frase);
printf(“Conteúdo de frase: %s \n”, frase);
• A função gets armazena tudo o que foi digitado pelo usuário antes 
do mesmo digitar ENTER e inclui o caractere nulo (‘\0’) no fim da 
string.
• A função puts apresenta uma string na tela e posiciona o cursor em 
uma nova linha. É geralmente utilizada quando não é necessário 
apresentar conteúdo de variáveis com formatação como no printf.
• São funções presentes no cabeçalho stdio.h.
String – Vetor de char
• Funções de Manipulação de Strings mais comuns:
• strcpy
• strcat
• strlen
• strcmp
• strchr
• strstr
• OBS.: Inclua a biblioteca string.h para utilizar estas 
funções.
Exercícios
• Crie um programa em C que verifique se duas 
strings digitadas pelo usuário são iguais ou 
diferentes.
• Crie um programa em C que busque uma 
palavra digitada pelo usuário em uma string 
também informada pelo usuário.
Matriz
• Uma matriz pode ser considerada como um vetor 
multidimensional. A matriz mais comum é 
composta por duas dimensões.
• O exemplo abaixo declara uma matriz de números 
inteiros com duas dimensões de nome m e 
tamanho 10, 20:
• int m[10][20];
• O número entre colchetes mais a esquerda 
representa a quantidade de linhas e o mais a 
direita o número de colunas.
Matriz
• O trecho de código abaixo atribui os valores 
de 1 até 12 em uma matriz 3x4.
• int t, i, num[3][4];
for (t=0; t<3;++t)
for (i=0; i<4; ++i)
num[t][i] = (t*4)+i+1;
Linha/Coluna 0 1 2 3
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12
Matriz de char ou Matriz de strings
• É comum em C o uso de uma matriz que 
armazena várias strings. 
• Exemplo: char listaAlunos[50][36];
• A matriz listaAlunos possui 50 linhas e 36 
colunas. Neste caso, esta é uma matriz do tipo 
char, logo podemos interpretar que o tamanho 
mais a esquerda [50] determina a quantidade de 
strings e tamanho da direita [36] representa o 
comprimento máximo de cada string.
Matriz de char ou Matriz de strings
• Para armazenar uma única string em uma linha da matriz 
de char (lista de strings) utilize a função gets como abaixo:
• gets(listaAluno[2]);
• Neste caso, uma string será armazenada na terceira linha 
da matriz, onde cada caractere ocupará uma célula em 
várias colunas.
• Semelhantemente pode-se usar a função puts para 
apresentar o conteúdo de uma linha inteira da matriz.
• puts(listaAluno[2]);//ou printf(“%s”, listaAluno[2]);
• Ou utilizar a função printf, porém acessando uma célula 
da matriz por vez.
• printf(“%c”, listaAluno[2][0]);
Exercícios
• Crie um programa em C que peça para usuário 
digitar dez caracteres e armazene-os em uma 
matriz 5x2. Após, apresente na tela todos os 
caracteres que o usuário digitou.
• Crie um programa em C que armazene uma 
lista de telefones em uma matriz de strings. 
Cada telefone deve estar em uma linha da 
matriz. Peça para o usuário digitar os números 
no formato (00)0000-0000.
Ponteiros
• Uma variável em C é um espaço reservado na 
memória para armazenar um conteúdo (int, 
float, char, etc).
• O nome de uma variável está associado a um 
endereço de memória utilizado para localizar 
este espaço que foi reservado.
• Uma variável do tipo ponteiro armazena um 
endereço de memória.
Ponteiros
• Exemplo:
int *ptr; //Ponteiro para um dado do tipo Inteiro
int val = 1;
ptr = &val; //Variável ponteiro recebe o endereço de val
printf("Dado do armazenado no endereco: %d\n", *ptr);
printf("Valor da variável ptr: %p\n", ptr);
• Ponteiros são, utilizados com estruturas de dados dinâmicas (e.g. 
Listas encadeadas e Árvores Binárias), para alocação dinâmica de 
memória, etc.
• Cuidado! Ponteiro com valor inválido pode fazer seu programa 
travar/fechar. “Bugs” em programas com ponteiros são difíceis de 
encontrar.
Ponteiros
• Fonte: http://darksiren.net/stuff/
Ponteiros
• Fonte: http://codingsihalen.blogspot.com.br/2013/03/8-c-pointers.html 
Ponteiros
• Uma variável que armazena um endereço de 
memória é chamada de ponteiro.
• Se uma variável armazena o endereço de 
memória de outra variável, dizemos que a 
primeira variável “aponta” para a segunda.
• Declaração: tipo * nome_var;
• tipo indica o tipo de dado que o ponteiro irá 
apontar.
Ponteiros
• Operadores:
• & : Retorna o endereço de memória de seu 
operando. Ex.: m = &cont; //m receberá o 
endereço de memória a variável cont. O 
operador “&” é utilizado, normalmente, para retornar o 
endereço de variáveis que não são ponteiros.
• * : Retorna o valor contido no endereço de 
memória. Ex.: q = *m; //Se m contém o 
endereço de cont, q recebe o valor da variável 
cont.
Ponteiros
• Aritmética de Ponteiros:
– É permitido a utilização de duas operações aritméticas 
com ponteiros: adição e subtração.– Considere int *p1, se o endereço em p1 é 2000 e cada 
número inteiro ocupa dois bytes na memória, então 
depois da expressão p++, p1 terá o endereço 2002 e 
não 2001 como era de se esperar. Incrementando p1 
ele deve apontar para o próximo inteiro na memória, 
mas o tipo inteiro neste exemplo ocupa duas posições, 
logo p1 apontará para o endereço 2002.
– OBS.: A aritmética com ponteiros depende do tipo de dado especificado 
(char, int, float, etc) na declaração do ponteiro, que pode ocupar uma ou 
várias posições de memória, dependendo também da plataforma.
Ponteiros
• Fonte: http://www.c4learn.com/pointer-arithmatics-incrementing-pointer-
variable-in-c-programming.html
Ponteiros e Vetores
• Ponteiros e Vetores em C podem ser utilizados de forma 
semelhante.
• Exemplo:
char str[80]; //Vetor de char
char *p1; //Ponteiro para char
p1 = str; //p1 recebeu o endereço de memória do primeiro 
//elemento do vetor str
• Então, podemos acessar o 5º elemento no vetor str de 
duas formas:
printf(“Quinta posição do vetor: %c”, str[4]); 
printf(“Quinta posição do vetor: %c”, *(p+4));
Vetores de Ponteiros
• Podemos criar um vetor onde cada posição 
armazena um endereço de memória, ou seja, um 
vetor de ponteiros.
• int *x[10]; //Vetor de ponteiros para o tipo int com //dez 
posições
• int var = 8;
• x[2] = &var;//Terceira posição do vetor recebe o endereço 
da variável var
• printf(“Dado apontado pela posição x[2]: %d”, *x[2]); 
//Apresenta o valor de var na tela, ou seja, 8
Ponteiro para Ponteiro
• Fonte: http://www.thegeekstuff.com/2012/01/advanced-c-pointers/
Ponteiro para Ponteiro
• É um ponteiro que contém o endereço de memória de 
outro ponteiro. Este último aponta para a variável que 
possui o valor/dado/informação que será utilizado.
• Declaração: float **ptrParaPtr; 
– Não é um ponteiro para um número float, mas um ponteiro para 
um ponteiro de float.
• Exemplo: 
int x, *p, **q;
x = 10;
p=&x;
q=&p;
printf(“%d”, **q);//Apresenta o valor 10 da variável x
Exercícios
• Faça um programa em C que some dois 
números inteiros e armazene o resultado em 
uma variável. O valores devem ser somados 
utilizando ponteiros.
• Crie um ponteiro para o tipo char que receba 
uma string digitada pelo usuário e a apresente 
na tela.
Função
• Forma geral:
– tipo_retorno nome_função(lista_parametros)
{
corpo_função
}
• tipo_retorno: Especifica o tipo de dado retornado. Uma 
função pode retornar qualquer tipo de dado exceto vetor 
e matriz. Retorno void especifica que nenhum valor será 
retornado. 
• nome_função: Deve ser um identificador válido
• corpo_função: Local para inserir o código que determina a 
finalidade da função.
Função
• Forma geral (Continuação):
• lista_parametros: É uma lista que especifica 
variáveis e seus respectivos tipos. Cada 
parâmetro(variável) recebe valores dos 
argumentos quando a função é chamada. 
• Uma função pode não ter parâmetros, neste 
caso, a lista lista_parametros é vazia. Pode-se 
usar a palavra-chave void entre os parênteses 
para especificar isto ou simplesmente deixar 
somente os parênteses. 
• Ex.: func1(void) ou func1() 
Função
#include <stdio.h>
//Protótipo ou cabeçalho da função
int numQuadrado(int x);
int main(){
int t=10;
printf(“Número %d elevado ao quadrado é: %d", t, numQuadrado(t));
return 0;
}
//Definição da função
int numQuadrado (int x){
int r;
r = x*x;
return(r);
}
Função – Passagem Parâmetros
• Chamada por valor: 
– Uma cópia do dado é passada para a função
– float i;
– func (i);//Chamada da função
– float func (float num ){return num+1.0; } 
– //Valor de i permanece inalterado
• Chamada por referência:
– Um endereço de memória é passado para a função
– float i;
– func (&i); //Chamada da função
– void func (float *num ){*num = *num+1.0; }
– //Neste caso o valor de i é modificado, mesmo i estando fora 
//da função
Função – Passagem Parâmetros
• Uma função pode ter vários parâmetros.
• Podemos modificar os valores dos parâmetros 
assim como fazemos com as variáveis 
“comuns”.
void minhaFuncao(int x, float y, char *c){
x = x + (x*3);
y = 2.2 + 2.2;
strcpy(c,"Ola alunos!");
printf(“Valores %d %y %s”, x, y, c);
} //char *c está sendo considerado como string, 
Se for passado uma string como argumento para função
Função – Passando Vetor 
int getMaior(int vetor[TAM]){
int i, maior = 0;
for(i=0;i<TAM;i++){
if (vetor[i] > maior )
maior = vetor[i];
}
return maior; 
}
int getMaior2(int *v){
int i, maior = 0;
for(i=0;i<TAM;i++){
if (v[i] > maior )
maior = v[i];
}
return maior; 
}
Função - Passando Matriz
int getMaior(int matriz[LIN][COL]){
int i, j, maior = 0;
for(i=0;i<LIN;i++)
for(j=0;j<COL;j++)
if (matriz[i][j] > maior )
maior = matriz[i][j];
return maior; 
}
int getMaior2(int (*m)[COL]){
int i, j, maior = 0;
for(i=0;i<LIN;i++){
for(j=0;j<COL;j++)
if (m[i][j] > maior )
maior = m[i][j];
}
return maior; 
}
Função - Biblioteca
• Uma biblioteca é um arquivo ou conjunto de 
arquivos com várias funções definidas. 
• Exemplo: stdio.h é uma biblioteca. As funções 
printf e scanf estão definidas (implementadas) 
dentro desta biblioteca.
Função - Biblioteca
• É possível criarmos nossa própria biblioteca.
• Crie um arquivo novo e escreva funções que 
desejar. Então, salve o arquivo com a extensão 
“.h” ao invés de “.c”.
• Exemplo no arquivo “minhaBiblioteca.h”: 
int verificaInteiroNegativo(int n){
if (n > 0)
return n; //Retorna o próprio número se positivo
else
return 0; //Se número é negativo
} 
Função - Biblioteca
• Para utilizar uma função em uma biblioteca inclua 
a diretiva #include “minhaBiblioteca.h” e faça a 
chamada da função normalmente.
• Exemplo arquivo “principal.c”:
#include <stdio.h>
#include “minhaBiblioteca.h”
main(){
int num = 65;
printf(“%d”, verificaInteiroNegativo(num));
}
Arquivos em C
• Existe uma camada de abstração entre o 
programador e o dispositivo que pode ser o 
terminal ou um disco rígido, um drive de fita e etc.
• Esta camada é chamada de stream. 
• Qual é a vantagem? O programador trabalha com 
os streams da mesma forma independente do 
dispositivo que está sendo utilizado.
• Então uma mesma função que utiliza stream pode 
um arquivo no disco rígido ou em outro tipo de 
dispositivo.
Arquivos em C
• Código (biblioteca stdio):
FILE *fp;//Ponteiro para “arquivo”.
if ((fp = fopen("test","w"))==NULL) {
printf(“Ocorreu alguma falha.\n");
exit(1);
}
• FILE: É uma estrutura (STRUCT), que define nome
do arquivo, estado, posição do arquivo e etc.
• fopen: É uma função que abre um stream e 
associa a um arquivo.
Arquivos em C
• Sintaxe:
• FILE* fopen (char *NomeArquivo, char 
*modo);
• NomeArquivo especifica o nome de arquivo 
válido
• modo é uma string que representa o status de 
abertura desejado
• Retorna NULL se ocorrer um erro.
Arquivos em C
Modo Significado
“r” Abre Arquivo de Texto para Leitura
“w” Cria Arquivo de Texto para Escrita
“a” Abre (ou cria) e acrescenta conteúdo em Arquivo de Texto
“rb” Abre Arquivo Binário para Leitura
“wb” Cria Arquivo Binário para Escrita
“ab” Abre (ou cria) e acrescenta conteúdo em Arquivo Binário
“r+” Abre Arquivo de Texto para Leitura/Escrita
“w+” Cria Arquivo de Texto para Leitura/Escrita
“a+” Abre (ou cria) e acrescenta conteúdo em Arquivo de Texto para Leitura/Escrita
“r+b” Abre Arquivo Binário para Leitura/Escrita
“w+b” Cria Arquivo Binário para Leitura/Escrita
“a+b” Abre (ou cria) e acrescenta conteúdo em Arquivo Binário para Leitura/Escrita
“rt” Idem a “r”
“wt” Idem a “w”“at” Idem a “a”
“r+t” Idem a “r+”
“w+t” Idem a “w+”
“a+t” Idem a “a+”
Arquivos em C
NOME FUNÇÃO
fopen() Abre um arquivo
fclose() Fecha um arquivo
feof() Retorna verdadeiro se fim do arquivo foi alcançado
fread() Lê blocos de dados (Modo binário)
fwrite() Grava bloco de dados (Modo binário)
ferror() Retorna verdadeiro se um erro tiver ocorrido
fprintf() Saída formatada. É a função printf para arquivo.
fscanf() Entrada formatada. É a função scanf para arquivo.
fseek() Procura um byte especificado no arquivo
getc() Lê um caractere no arquivo
putc() Grava um caractere no arquivo
getw() Lê um inteiro no arquivo
putw() Grava um inteiro no arquivo
fgets() Lê uma string no arquivo
fputs() Grava uma string no arquivo
remove() Apaga conteúdo do arquivo
Estruturas
• É um conjunto de variáveis referenciadas pelo 
mesmo nome.
• Mantem informações relacionadas no mesmo 
conjunto.
struct endereco{
char nome[30];
char rua[40];
int numero;
char cidade[20];
int cep;
} ; // Esta declaração apenas define um tipo agregado (struct), 
não uma variável.
Estruturas
• Declaração de variável do tipo struct e 
atribuição:
Int main(){
struct endereco meuEndereco;
meuEndereco.cep = 12345678;
printf(“Informe o nome da rua: ”);
gets(meuEndereco.rua);
return 0;
} 
Estruturas
• Definindo struct com declaração de variável:
struct retangulo{
float altura;
float largura;
} x, y, lista[30]; //Variáveis do tipo retangulo
x = y; //Atribuição de struct. Passa o valor de 
todas as variáveis internas (largura e altura)
lista[4].altura = 2.5;//Atribuindo em vetor
Estruturas
• Passando membros de struct para função:
struct fred {
char x;
int y;
float z;
char s[10];
} mike;
func(mike.x); /* valor caractere de x */
func2(mike.y); /* valor inteiro de y */
func3(mike.z); /* valor float de z */
func4(mike.s); /* endereço da string s */
func(mike.s[2]); /* valor caractere da posição 2 da string s[2] */
Estruturas
• Passando endereços de membros de struct para 
função:
func(&mike.x); /* endereço do caractere x */
func2(&mike.y); /* endereço do inteiro y */
func3(&mike.z); /* endereço do float z */
func4(mike.s); /* endereço da string s */
func(&mike.s[2]); /* endereço do caractere da posição 2 da string s[2] 
s[2] */
Passando estruturas inteiras para função
#include <stdio.h>
struct tipoA {
int a, b;
char ch;
} ;
void f1(struct tipoA param);
int main(void){
struct tipoA arg;
arg.a = 1000;
f1(arg);
return 0;
}
void f1(struct tipoA param)
{
printf("%d", param.a);
}
Estruturas
• Ponteiro para struct:
struct comissao {
float valor;
char nome[80];
} pessoa;//pessoa é uma variável do tipo struct comissao
struct comissao *p; //ponteiro para struct comissao
p = & pessoa;//Ponteiro recebe o endereço de pessoa
p-> valor = 78.80; //Operador utilizado para
//acessar um membro de struct através de um ponteiro é “->” 
//e não o ponto “.”
Estruturas
• Estruturas aninhadas:
struct empregado {
//Membro que é um struct
struct endereco end; 
float salario;
} trabalhador;
trabalhador.end.cep = 93456260;
struct endereco{
char nome[30];
char rua[40];
int numero;
char cidade[20];
int cep;
} ;

Continue navegando