Escolar Documentos
Profissional Documentos
Cultura Documentos
Dados II
Hello!
Fabiano Utiyama
fabiano.utiyama@ifpr.edu.br
2
Introdução
1 Let’s start
Introdução
⊹ A linguagem C foi desenvolvida por Dennis
Ritchie nos laboratórios da AT&T Bell
(EUA) no início dos anos 70
Algol BCPL B C
(1960 – Europa) (Inglaterra) (1970 – EUA) (1972 – EUA)
4
Introdução
⊹ C é uma das linguagens de maior
aceitação:
⊹ Portabilidade (Compiladores disponíveis para PC’s,
Mainframes, etc.)
⊹ Muitos compiladores C produzem código bastante
otimizado
⊹ Reúne tanto características de alto nível quanto de
baixo nível (muitas vezes chamada de nível médio)
⊹ Em 1983 foi criado o comitê ANSI-C
5
Introdução
⊹ C vs C++
C
C++
6
Introdução
⊹ Linguagem C: linguagem de programação
imperativa estruturada
⊹ Linguagem C++:
⊹ Linguagem Orientada a Objetos
⊹ Formadas pela linguagem C adicionada de
um conjunto de instruções voltados à OO
⊹ Quem sabe programar em C conhece a
maior parte de C++
7
Introdução
⊹ A linguagem C é utilizada na criação de
diversos tipos de aplicação, tais como:
⊹ Sistemas Operacionais (UNIX)
⊹ Processadores de Texto
⊹ Planilhas Eletrônicas
⊹ Sistemas Gerenciadores de BD
⊹ Processadores Gráficos
⊹ Problemas de Engenharia
⊹ Compiladores
8
Introdução
⊹ C é uma linguagem de nível médio
11
Introdução
⊹ Estrutura básica de um programa em C:
⊹ Todo programa em C possui no mínimo uma
função
⊹ A função main() é obrigatória e é a primeira a
ser executada. É a função principal, o ponto de
partida do programa que será criado
⊹ Por isso, a noção de função e de programa
frequentemente se confundem quando se
programa em linguagem C
12
Introdução
inclusão de arquivos de cabeçalho
declaração de variáveis globais
int main () // declaração da função principal (obrigatória). Os parênteses
indicam que trata-se de uma função
{ // toda função começa com o símbolo “{“, equivale ao “início”
(begin) de um bloco de instruções
declaração de variáveis locais
...
comandos;
...
return 0;
} //toda função termina com o símbolo “}”, equivale ao “fim”
(end) de um bloco de instruções
As instruções descritas no programa terminam sempre com “;”
13
Introdução
⊹ O menor programa possível em C seria:
int main ()
{
return 0;
}
⊹ É um programa vazio, que não contém
instruções para executar;
⊹ Formatação dos programas: é livre, mas
convém manter a legibilidade 14
Introdução
⊹ Legibilidade nos programas
main
main () main () ( main
{ {} ) ()
} { {}
}
Bons exemplos Maus exemplos
15
Introdução
⊹ Comentários: podem ser incluídos em
qualquer parte do programa.
⊹ Se ocupar apenas uma linha, basta que
a mesma seja iniciada com “//”;
⊹ Se ocupar mais de uma linha, o
comentário deve iniciar com o símbolo
“/*” e terminar com o símbolo “*/”;
⊹ Palavras reservadas da Linguagem C:
16
Introdução
17
Introdução
⊹ Exercícios:
⊹ Por que pode-se dizer que C é uma
linguagem de nível médio?
⊹ Fale sobre características positivas e
negativas da linguagem C.
⊹ Descreva a relação existente entre a
linguagem C e C++.
18
Introdução
⊹ Instruções de programa:
⊹ printf()
⊹ Função de E/S;
⊹ Para utilizá-la deve-se incluir no
cabeçalho o arquivo stdio.h (standard i/o);
⊹ Forma geral:
⊹ printf(string_de_controle,
lista_de_argumentos);
19
Introdução
⊹ Primeiro programa em C
#include <stdio.h>
#include <stdio.h>
#include <conio.h>
#include <conio.h>
main()
int main ()
{
{
printf("oi mundo");
printf (“Oi mundo.”);
getch ();
getch ();
return 0;
return 0;}
}
20
Introdução
⊹ scanf()
⊹ Função de E/S;
⊹ Para utilizá-la deve-se incluir no
cabeçalho
⊹ o arquivo stdio.h (standard i/o);
⊹ Forma geral:
⊹ scanf(string_de_controle,
lista_de_argumentos);
21
Introdução
⊹ Expressão de controle “\n”: pode ser
utilizada dentro da string de controle para
iniciar uma nova linha
22
Introdução
⊹ Códigos de formatação Código Significado
%c Caractere simples
%d Decimal
%ld Long
%e Notação científica
%f Ponto flutuante
%o Octal
%s Cadeia de caracteres
%u Decimal sem sinal
%x Hexadecimal
23
Introdução
⊹ Tipos de Variáveis
Tipo Bits Escala
25
Introdução
⊹ Na ocorrência de mais de uma variável de
mesmo tipo, podemos declará-las
separando seus nomes por vírgulas em
uma mesma linha
⊹ As variáveis do tipo caracter deverão
receber valor entre aspas
⊹ Em C, não existe tipo booleano (lógico) e
nem string (cadeia)
26
Introdução
⊹ O valor zero (0) é considerado falso e
qualquer outro valor é considerado
verdadeiro
⊹ Exemplos:
⊹ int K;
⊹ double valores;
⊹ float quadro;
⊹ char caracter;
27
Introdução
⊹ Outras funções de E/S:
⊹ getch()
⊹ A função getch() lê um caractere do
teclado sem ecoá-lo na tela (no turbo
C);
⊹ Arquivo de inclusão: <conio.h>
28
Introdução
#include <stdio.h>
#include <conio.h>
int main()
{
char letra;
printf ("Digite um caracter: ");
letra=getch();
printf ("\nCaractere digitado: %c\n", letra);
getch();
return 0;
}
29
Introdução
⊹ Outras funções de E/S:
⊹ getche()
⊹ A função getche() lê um caractere do
teclado e imprime o mesmo na tela;
⊹ Arquivo de inclusão: <conio.h>
30
Introdução
#include <stdio.h>
#include <conio.h>
int main()
{
char letra;
printf ("Digite um caracter: ");
letra=getche();
printf ("\nCaractere digitado: %c", letra);
getch();
return 0;
}
31
Introdução
⊹ Programa para calcular a área de um círculo
#include <stdio.h>
#include <conio.h>
int main ()
{
float r, area;
printf ("Digite o raio da circunferencia: ");
scanf ("%f",&r);
area = 3.14*r*r;
printf ("A area do circulo e igual a: %f\n\n",area);
return 0;
} 32
Podemos
Continuar?.
33
Introdução
⊹ Exercícios:
⊹ Faça um programa em C para calcular
o volume de um cilindro a partir dos
valores da altura e do raio do mesmo.
⊹ Dica: V=altura*PI*raio2;
34
Introdução
⊹ Exercícios:
⊹ Faça um programa em C para calcular
as raízes reais de uma equação do
segundo grau do tipo ax2+bx+c=0.
⊹ Dica:
⊹ delta=b2-4*a*c;
⊹ x1=(-b+delta1/2)/(2*a);
⊹ x2=(-b-delta1/2)/(2*a);
35
#include <stdio.h>
#include <math.h> Volume do Cilindro
Introdução
int main ()
{
float r, h, v;
printf ("Calculo do Volume de um Cilindro\n\n");
printf ("Digite o valor do raio da base do cilindro: ");
scanf ("%f", &r);
printf ("Digite o valor da altura do cilindro: ");
scanf ("%f", &h);
v=3.14*pow(r,2)*h;
printf ("\n\nO Volume do Cilindro ‚ igual a: %.2f", v);
printf ("\n\n\nFim da execução!\n");
return 0;
}
36
#include <stdio.h>
#include <math.h> Raízes da Equação do 2º grau
Introdução
int main ()
{
float a, b, c, delta, x1, x2;
printf ("Calculo das ra¡zes reais da equacao do tipo ax2+bx+c=0\n\n");
printf ("Digite o valor do coeficiente a: ");
scanf ("%f", &a);
printf ("Digite o valor do coeficiente b: ");
scanf ("%f", &b);
printf ("Digite o valor do coeficiente c: ");
scanf ("%f", &c);
delta=b*b-4*a*c;
x1=(-b+sqrt(delta))/(2*a);
x2=(-b-sqrt(delta))/(2*a);
printf ("\n\nO valor de x1 ‚: %f", x1);
printf ("\nE o valor de x2 ‚: %f", x2);
printf ("\n\n\nFim da execução!\n\n");
return 0;
}
37
Op. Significado Exemplo
Introdução
= Atribuição A=5; caracter=‘B’;
+ Soma A=A+1;
- Subtração Total=subtotal-desconto;
* Multiplicação nota=nota*2;
/ Divisão Comissão=lucro/4;
% Módulo (retorna o resto da divisão) Resto=8%3;
38
Introdução
⊹ Alguns cuidados devem ser tomados
quando se utiliza os operadores de
incremento:
⊹ k=3*n++; é equivalente a k=(3*n)+1;
⊹ k=3*++n é equivalente a k=3*(n+1);
39
Introdução
⊹ Operadores Relacionais
Op. Significado
> Maior
>= Maior igual
< Menor
<= Menor igual
== Igual
!= Diferente
40
Introdução
⊹ Operadores Lógicos
Op. Significado
&& Lógico E
|| Lógico OU
! Lógico de negação
41
Introdução
Op. Tipo
⊹ Precedência de Operadores ++ Incremento
-- Decremento
! Lógico Não
* Multiplicação
/ Divisão
% Resto
+ Adição
- Subtração
< Menor
<= Menor igual
> Maior
>= Maior igual
42
Op. Tipo
Introdução <
<=
Menor
Menor igual
> Maior
⊹ Precedência de Operadores >= Maior igual
== Igual
!= Diferente
&& E (lógico)
|| OU (lógico)
= Atribuição
*= Atribuição (mult.)
/= Atribuição (div.)
%= Atribuição (resto)
+= Atribuição (adição)
-= Atribuição (subt.)
43
Introdução
⊹ Comandos de Decisão (Estruturas de
Seleção)
⊹ if-else;
⊹ switch;
⊹ Comando if-else
⊹ Esta estrutura de seleção é capaz de tomar
uma decisão simples, se a expressão de teste
for verdadeira, o bloco de instruções 1 será
executado e o 2 ignorado. Se a expressão de
44
teste for falsa acontecerá o contrário
Introdução
if (expressão de teste)
{
instrução 1;
instrução 2;
Bloco 1 ...
instrução n;
}
else
{
instrução 1;
instrução 2;
Bloco 2 ...
instrução n;
}
45
Introdução
⊹ Exemplo de programa com if-else: dados
dois valores inteiros X e Y descubra qual é
o maior
46
Introdução
#include <stdio.h>
int main()
{
int x, y;
printf ("Digite um valor inteiro para X: ");
scanf ("%d", &x);
printf ("Digite um valor inteiro para Y: ");
scanf ("%d", &y);
if (x>y)
{
printf ("O valor de X é maior que o de Y.\n");
}
else
{
printf ("O valor de Y é maior que o de X.\n");
}
return 0;
}
47
Introdução
⊹ O comando switch:
⊹ Instrução de seleção múltipla
⊹ Equivalente ao case do Pascal
⊹ Permite a seleção exclusiva de um
entre vários blocos de instruções
48
Introdução switch (expressão)
{
case constante1:
instrução 1;
...
instrução n;
break;
case constante2:
instrução 1;
...
instrução n;
break;
...
case constante n:
instrução 1;
...
instrução n;
break;
default:
instrução 1;
...
instrução n;
}
49
Introdução
⊹ Observações referentes à sintaxe:
⊹ O corpo do switch deve estar entre chaves
⊹ O corpo de cada case pode conter um
número qualquer de instruções, sendo que
a última deve ser um break. Caso este
break não apareça, todas as instruções
que estiverem dentro do switch (inclusive
dos demais case’s) que aparecerem na
sequência serão executadas 50
Introdução
⊹ Observações referentes à sintaxe:
⊹ A instrução break causa a saída imediata do
corpo do switch
⊹ Quando a instrução switch é executada, a
expressão é avaliada e o controle é transferido
diretamente para o grupo de instruções
correspondentes ao valor de expressão
51
Introdução
⊹ Se nenhum case corresponder ao valor da
expressão, o grupo de instruções
declaradas em default serão executadas.
Isto quando o default existir, pois ele é
opcional
⊹ O padrão ANSI C determina que um
switch possa ter pelo menos 257
comandos case
52
Introdução
⊹ O comando switch só pode testar
igualdade, enquanto que o if pode avaliar
expressões lógicas e relacionais
⊹ Duas constantes case no mesmo switch
não podem ter o mesmo valor
53
#include <stdio.h>
int main ()
{
Introdução
char op;
printf ("Escolha uma opcao: \n\n");
printf (" 1 - Primeira opcao;\n\n");
printf (" 2 - Segunda opcao;\n\n");
printf (" 3 - Terceira opcao;\n\n");
printf (" 4 - Quarta opcao;\n\n");
op=getch();
switch (op)
{
case '1':
printf ("Voce escolheu a primeira opcao!\n\n");
break;
case '2':
printf ("Voce escolheu a segunda opcao!\n\n");
break;
case '3':
printf ("Voce escolheu a terceira opcao!\n\n");
break;
case '4':
printf ("Voce escolheu a quarta opcao!\n\n");
break;
default:
printf ("Voce nao escolheu nenhuma das opcoes oferecidas!\n\n");
}
return 0;
}
54
Introdução
⊹ Exercício:
⊹ Faça um algoritmo para calcular o valor total a
pagar por um consumidor que abasteceu seu carro,
sabendo que serão informados o tipo de
combustível escolhido (G/A/D) e o número de litros
consumido. Considere os seguintes preços por litro
de combustível:
⊹ Gasolina R$ 7,10;
⊹ Álcool R$ 6,05;
⊹ Diesel R$ 6,10. 55
Introdução
⊹ Comandos de Iteração (Estruturas de
Controle de Repetições)
⊹ Controle de Repetição por Contador:
⊹ Comando for;
⊹ Controle de Repetição Lógico:
⊹ Iteração Pré-teste (equivalente ao while do
Pascal):
⊹ Comando while;
⊹ Iteração Pós-teste (equivalente ao repeat do
Pascal):
⊹ Comando do-while; 56
Estruturas de Controle de Repetições
1 2 3
57
Introdução
⊹ Comando for:
⊹ Permite a repetição da execução de
um bloco de instruções controlada por
um contador
⊹ Forma geral:
⊹ for (inicialização; condição;
incremento)
⊹ bloco de instruções;
58
Introdução
⊹ Onde:
⊹ inicialização: é a atribuição do valor
inicial ao contador
⊹ condição: estabelece a condição limite
de parada para a repetição do laço
⊹ incremento: estabelece o valor
segundo o qual o contador deve variar
59
Introdução
#include <stdio.h>
⊹ Exemplo de uso do
comando for: um int main ()
programa que {
int i;
imprime os for (i=1;i<=20;i++)
números de 1 a 20 printf ("Numero: %d\n",i);
na tela. return 0;
}
60
Introdução
⊹ Exercícios:
⊹ Durante trinta dias de um determinado mês,
foram colhidas as temperaturas médias diárias
de uma determinada região em graus celsius.
Faça um algoritmo que calcule e informe a
temperatura média do mês, e a temperatura
mais alta do mês.
⊹ Faça um algoritmo que calcule o fatorial de um
número inteiro fornecido pelo usuário.
61
Introdução
⊹ Comando while:
⊹ Permite a repetição da execução de
um bloco de instruções controlada por
uma condição lógica;
⊹ Forma geral:
⊹ while (condição)
⊹ bloco de instruções;
62
Introdução
⊹ Onde:
⊹ condição: pode ser qualquer expressão (aritmética,
lógica ou relacional), e é verdadeira quando
diferente de 0 (zero)
⊹ bloco de instruções: comando ou bloco de
comandos que devem ter a execução realizada
enquanto a condição for verdadeira
⊹ A execução do laço while se encerra quando a
condição for falsa, neste caso o controle de
execução passa para a primeira linha que aparecer
após o bloco de instruções 63
Introdução
⊹ Exemplo de uso do comando while: um
programa que imprime na tela os números
inteiros digitados pelo usuário, até que
este digite um valor negativo.
64
Introdução
#include <stdio.h>
int main ()
{
int n=0;
while (n>=0)
{
printf ("Digite um numero: ");
scanf ("%d",&n);
}
return 0;
}
65
Introdução
⊹ Comando do-while:
⊹ Permite a repetição da execução de um bloco
de instruções controlada por uma condição
lógica. Esta condição é testada após a
execução do bloco, isso significa que um laço
do-while será executado pelo menos uma vez;
⊹ Forma geral:
⊹ do {
⊹ bloco de instruções;
⊹ } while (condição); 66
Introdução
⊹ Onde:
⊹ condição: pode ser qualquer expressão (aritmética, lógica
ou relacional), e é verdadeira quando diferente de 0
(zero)
⊹ bloco de instruções: comando ou bloco de comandos que
devem ter a execução realizada enquanto a condição for
verdadeira
⊹ A execução do laço do-while se encerra quando a
condição for falsa, neste caso o controle de execução
passa para a primeira linha que aparecer após o
comando do-while 67
Introdução
⊹ Exemplo de uso do comando do-while: um
programa que imprime na tela os números
inteiros digitados pelo usuário, até que
este digite um valor negativo.
68
Introdução
#include <stdio.h>
int main ()
{
int n;
do {
printf ("Digite um numero: ");
scanf ("%d",&n);
printf (“Numero: %d“, n);
} while (n>=0);
return 0;
}
69
Introdução
⊹ Exercícios:
⊹ Faça um algoritmo para calcular a soma entre os números de um
conjunto de números inteiros e positivos a ser fornecido pelo
usuário utilizando os comandos while e do-while;
⊹ Faça um algoritmo que permita ao usuário inserir dados para as
seguintes perguntas:
⊹ Idade (inteiro);
⊹ Altura (real);
⊹ Sexo (caracter, m ou f);
⊹ Sabe-se que o número de entrevistados é indefinido, e depois
de inseridos os dados o algoritmo deverá informar:
⊹ O número de mulheres cuja idade está entre 20 e 35 anos;
⊹ O número de homens que tem mais de 1.80m de altura. 70
Introdução
⊹ Agregados de Dados
⊹ Homogêneos: conjuntos (vetores ou matrizes)
⊹ Coleção de variáveis de mesmo tipo
referenciadas por um nome comum
⊹ Cada elemento específico é acessado através
de um índice
⊹ Os elementos ocupam posições contíguas de
memória
⊹ Equivalente ao array (vetor) em Pascal
71
Introdução
⊹ Agregados de Dados
⊹ Heterogêneos: estruturas
⊹ Reúnem uma coleção de variáveis que podem
ser referenciadas por um nome
⊹ Maneira conveniente de se ter informações
relacionadas agrupadas
⊹ Equivalente ao record (registro) em Pascal
72
Introdução
⊹ Matrizes (Agregados Homogêneos)
⊹ Forma geral:
⊹ tipo nome_mat [tamanho];
⊹ Exemplo 1: uma matriz para armazenar até 10
valores inteiros:
⊹ int vetor_inteiro [10];
⊹ Exemplo 2: uma matriz para armazenar 20
caracteres (equivalente a string do Pascal):
⊹ char nome_pessoa [20];
73
Introdução
⊹ Matrizes (Agregados Homogêneos)
⊹ Em C, toda matriz tem 0 como o índice do seu
primeiro elemento. Portanto, quando você escreve
⊹ char p[10];
⊹ Você está declarando uma matriz de caracteres que
tem dez elementos, p[0] até p[9].
74
Introdução
⊹ O seguinte programa carrega uma matriz
de inteiros com os números de 0 a 99: #include <stdio.h>
int main ()
{
int x[100];
int i;
for (i=0;i<100;++i)
x[i]=i;
for (i=0;i<100;++i)
printf (" %d ,",x[i]);
printf ("\n\n");
getch();
return 0;
} 75
Introdução
⊹ Para a leitura de matrizes de caracteres,
pode-se utilizar a função gets(), da
biblioteca <stdio.h>;
⊹ Forma geral:
⊹ gets(matriz_a_ser_lida);
⊹ Exemplo: ler uma cadeia de caracteres a ser digitada
pelo usuário na matriz nome descrita a seguir:
⊹ char nome[25];
⊹ ...
⊹ gets(nome);
76
Introdução
⊹ Para escrever uma matriz de caracteres na tela, pode-se
utilizar a função puts(), também presente na biblioteca
<stdio.h>;
⊹ Forma geral:
⊹ puts(matriz_a_ser_escrita);
77
Introdução
⊹ O seguinte programa lê uma matriz de
caracteres (string) digitada pelo usuário e
posteriormente imprime na tela:
78
Introdução
#include <stdio.h>
int main ()
{
char nome[25];
int i;
printf ("Digite um nome: ");
gets(nome);
printf ("O nome que voce digitou e: ");
puts(nome);
// ou printf ("O nome que voce digitou e: %s\n\n", nome);
return 0;
}
79
Introdução
⊹ Estruturas:
⊹ A palavra chave struct informa ao compilador que um
modelo de estrutura está sendo definido;
⊹ Forma geral:
struct identificador {
tipo nome_da_variável;
tipo nome_da_variável;
tipo nome_da_variável;
...
}
80
Introdução
⊹ Estruturas:
⊹ Exemplo:
struct pessoa
{
char nome[30];
char endereco[40];
char cidade[20];
int idade;
};
81
Introdução
⊹ Declaração de Matrizes Bidimensionais
⊹ Para declarar uma matriz bidimensional de
inteiros de tamanho 10x10, pode-se fazer:
⊹ int matriz [10] [10];
⊹ Para atribuir o valor 30 à célula de índices
5 (na primeira dimensão) e 4 (na segunda
dimensão), pode-se fazer:
⊹ matriz [5][4]=30;
82
Introdução
⊹ Para se criar uma variável do tipo da
estrutura definida anteriormente, você
deve declarar:
⊹ struct pessoa cliente;
⊹ Assim, você estaria criando uma variável
chamada cliente do tipo da estrutura
pessoa;
83
Introdução
⊹ A quantidade de bytes consumidos por uma
variável de um tipo de estrutura equivale a soma
dos valores gastos por cada um de seus membros
(ou campos);
⊹ No caso anterior teríamos: 30+40+20+2=92 bytes;
⊹ Os membros individuais de uma estrutura são
referenciados através do operador ponto. Para
atribuir o valor 45 a idade da variável cliente
declarada anteriormente, poderíamos ter:
⊹ cliente.idade=45; 84
Introdução
⊹ Matrizes de Estruturas:
⊹ Pode-se criar matrizes de estruturas
⊹ Para criar uma matriz para armazenar informações
referentes a 50 pessoas, de acordo com a estrutura
pré-definida anteriormente, poderíamos fazer:
⊹ struct pessoa clientes[50];
⊹ Neste caso, para atribuirmos o nome “João da
Silva” ao cliente de índice 17, poderíamos fazer:
⊹ clientes[17].nome=“João da Silva”;
85
Introdução
Exercícios:
⊹ Faça um algoritmo que permita ao usuário digitar valores inteiros e
positivos para uma matriz de tamanho físico 10X10, e que ao final
informe qual é a média, e o valor do maior número digitado.
⊹ Faça um algoritmo que permita armazenar os nomes e as quatro notas
bimestrais para um total de 20 alunos. Depois de armazenadas as
informações, o algoritmo deverá fazer uma varredura sobre as mesma a
fim de identificar qual dos alunos obteve a maior nota no 3º bimestre e
informar o seu nome.
⊹ Faça um algoritmo que armazene as seguintes informações sobre um
conjunto de no máximo 30 carros que estão a venda: modelo, ano, preço,
e placa. Ao final, o algoritmo deve percorrer as informações a fim de
descobrir qual dos carros é o mais barato, e deve informar seu modelo e
ano. 86
“ O temor do Senhor
é o princípio do conhecimento,
mas os insensatos desprezam
a sabedoria e a disciplina.
Provérbios 1:7
87
Thanks!
Any questions?
fabiano.utiyama@ifpr.edu.br
88
Roadmap
Lingaugem C Ordenação de Dados Árvores
1 3 5
2 4 6
89