5 de junho de 2017
Introdução à computação
Conteúdo
1 Introdução à computação
Conceitos básicos de computadores
Elementos de hardware
Elementos de software
Organização de dados em SOs
Conteúdo
1 Introdução à computação
Conceitos básicos de computadores
Elementos de hardware
Elementos de software
Organização de dados em SOs
Contar e calcular Ü ações que remontam aos primórdios da humanidade (e.g.1 , usando os dedos)
1
e.g. significa “por exemplo”
Tarcisio F. Maciel (UFC) Introdução à Programação 5 de junho de 2017 5 / 348
Introdução à computação Elementos de hardware
Conteúdo
1 Introdução à computação
Conceitos básicos de computadores
Elementos de hardware
Elementos de software
Organização de dados em SOs
Arquitetura de Neumann
Hardware refere-se a todo e qualquer elemento físico que faça parte da máquina interna ou
externamente
A arquitetura de hardware da maioria dos computadores atuais
Inspirada na proposta de Neumann
Informação representada usando apenas dois estados: ligado / desligado, ativo / inativo, zero / um, /
Programas e dados armazenados na memória
Todo processamento realizado utilizando lógica binária
Dispositivos de
Entrada e Saída
Arquitetura de Neumann
Pentium 4 (2000)
Tarcisio F. Maciel (UFC) Introdução à Programação 5 de junho de 2017 9 / 348
Introdução à computação Elementos de hardware
Arquitetura de Neumann
Unidade Lógica Aritmética (ULA) Ü Realiza todas as operações lógicas e aritméticas da UCP
Memória principal
Memória do computador
“Periférico” de entrada e saída para armazenamento e recuperação de dados
Normalmente dividida em memória principal e memória secundária.
Memória principal
Armazena e recupera dados com extrema velocidade
Troca de dados eficiente com outros dispositivos
Dois tipos comuns: Random Access Memory (RAM) e Read-Only Memory (ROM)
Memória secundária
Conteúdo
1 Introdução à computação
Conceitos básicos de computadores
Elementos de hardware
Elementos de software
Organização de dados em SOs
Tipos de software
Software é todo e qualquer programa processado por um computador para executar uma tarefa
Um programa é um conjunto de instruções (comandos) e dados que são processados por uma
máquina (computador digital) para cumprir uma dada tarefa
Tipos de software
Tipos de software
Conteúdo
1 Introdução à computação
Conceitos básicos de computadores
Elementos de hardware
Elementos de software
Organização de dados em SOs
correlacionados Monografia.doc
Identificadas por um nome (e.g., Documentos, Imagens)
Relatório.doc
Arquivos
Imagens\
Conjunto de informações armazenado em uma pasta
Carnaval.jpg
Identificados por um nome e uma extensão (e.g., Monografia.doc)
Na década de 1990, os nomes de arquivo só podiam ter até 8 caracteres e a extensão até 3
caracteres sendo ligados por um ponto .
Os caracteres pertencem à tabela ASCII (American Standard Code for Information Interchange /
Código Padrão Americano para o Intercâmbio de Informação) [DD12, Apênd. B]
O código ASCII é um subconjunto do Unicode que possui suporte para várias línguas
0 1 2 3 4 5 6 7 8 9
0 nul soh stx etx eot enq ack bel bs ht
1 nl vt ff cr so si dle dc1 dc2 dc3
2 dc4 nak syn etb can em sub esc fs gs
3 rs us sp ! " # $ % & ‘
4 ( ) * + , - . / 0 1
5 2 3 4 5 6 7 8 9 : ;
6 < = > ? @ A B C D E
7 F G H I J K L M N O
8 P Q R S T U V W X Y
9 Z [ \ ] ˆ _ ’ a b c
10 d e f g h i j k l m
11 n o p q r s t u v w
12 x y z { | } ˜ del
MSB LSB
Dec. b3 b2 b1 b0 Hex.
Números de 0 a 255 podem ser representados 0 0 0 0 0 0
utilizando conjuntos de 8 dígitos binários 1 0 0 0 1 1
Cada dígito binário, em inglês BInary digiT, ou bit, 2 0 0 1 0 2
3 0 0 1 1 3
pode assumir valor 0 ou o valor 1
4 0 1 0 0 4
Um conjunto de 4 bits é chamado nibble e pode 5 0 1 0 1 5
assumir valores decimais entre 0 e 15 6 0 1 1 0 6
7 0 1 1 1 7
Cada conjunto de 8 bits é chamado byte (ou
8 1 0 0 0 8
octeto)
9 1 0 0 1 9
Múltiplos de byte 10 1 0 1 0 A
1024 bytes Ü 1 quilobyte (kb) 11 1 0 1 1 B
1024 quilobytes Ü 1 megabyte (Mb) 12 1 1 0 0 C
1024 megabytes Ü 1 gigabyte (Gb) 13 1 1 0 1 D
1024 gigabytes Ü 1 terabyte (Tb) 14 1 1 1 0 E
15 1 1 1 1 F
Sistemas de numeração
Conteúdo
2 Sistemas de numeração
Sistema decimal
Sistema binário
Sistema octal
Sistema hexadecimal
Conversões entre binário, octal, e hexadecimal
Conteúdo
2 Sistemas de numeração
Sistema decimal
Sistema binário
Sistema octal
Sistema hexadecimal
Conversões entre binário, octal, e hexadecimal
Sistema decimal
Conteúdo
2 Sistemas de numeração
Sistema decimal
Sistema binário
Sistema octal
Sistema hexadecimal
Conversões entre binário, octal, e hexadecimal
Para sistemas digitais, como os computadores, o sistema de numeração binário é utilizado (dígitos
0 e 1 apenas)
Cada dígito é denominado bit Ü abreviação de BInary digiT
Um conjunto de 4 bits é chamada nibble e um conjunto de 8 bits é chamado byte
No sistema binário, os dígitos estão associados a potências de 2
Seguindo o modelo anterior, um número binário pode ser facilmente convertido para um decimal,
como por exemplo o número 1110, 1012 (note que há parte fracionária)
Posição p 3 2 1 0 −1 −2 −3 ...
Posição Bp 23 22 21 20 2−1 2−2 2−3 ...
Peso – 8 4 2 1 0, 5 0, 25 0, 125 ...
Dígito d 1 1 1 0 1 0 1 –
Valor d · Bp 8 4 2 0 0, 5 0 0, 125 –
8 + 4 + 2 + 0 + 0, 5 + 0 + 0, 125 = 14, 625
Conversões de decimal para uma outra base Ü mais complicadas que a conversão dessa base
para decimal [Bre08]
Parte inteira
Parte fracionária
1110 = ????2
0, 12510 = ???2
11 2
1 5 2 0, 125 × 2 = 0, 25 → 0
1 2 2
0, 25 × 2 = 0, 5 → 0
0 1 2
1 0 0, 5 × 2 = 1, 0 → 1
0, 12510 = 0, 0012
1110 = 10112
Multiplique o número pela base n vezes até que o resultado se torne inteiro
Converta o resultado para binário como se converte um número inteiro
Da direita para a esquerda, posicione uma vírgula à frente do n-ésimo dígito
Temos que 11, 125 × 2 = 22, 25 ⇒ 22, 25 × 2 = 44, 5 ⇒ 44, 5 × 2 = 89, e portanto n = 3
8910 = ????2
89 2
1 44 2
0 22 2
0 11 2
1 5 2
1 2 2
0 1 2
1 0
8910 = 10110012
Aplique sucessivamente o mesmo processo ao resto da subtração anterior até que o resto se torne
zero
As posições p das potências 2p que foram subtraídas nesse processo serão os bits 1 do número e
todas as demais serão zero
Conteúdo
2 Sistemas de numeração
Sistema decimal
Sistema binário
Sistema octal
Sistema hexadecimal
Conversões entre binário, octal, e hexadecimal
Seguindo o modelo anterior, um número octal pode ser facilmente convertido para um decimal,
como por exemplo o número 125, 78 (note que há parte fracionária)
Posição p 2 1 0 −1 ...
Posição Bp 8 2 8 1 8 0 8 −1 ...
Peso – 64 8 1 0, 125 . . .
Dígito d 1 2 5 7 –
Valor d·B p 64 16 5 0, 875 –
64 + 16 + 5 + 0, 875 = 85, 875
35 8 0, 140625 × 8 = 1, 125 → 1
3 4 8
0, 125 × 8 = 1, 0 → 1
4 0
3510 = 438
0, 14062510 = 0, 118
Conteúdo
2 Sistemas de numeração
Sistema decimal
Sistema binário
Sistema octal
Sistema hexadecimal
Conversões entre binário, octal, e hexadecimal
Seguindo o modelo anterior, um número hexadecimal pode ser facilmente convertido para um
decimal, como por exemplo o número 16A, C16 (note que há parte fracionária)
Posição p 2 1 0 −1 ...
Posição Bp 16 2 16 1 16 0 16−1 ...
Peso – 256 16 1 0, 0625 ...
Dígito d 1 6 A C –
Valor d·B p 256 96 10 0, 75 –
256 + 96 + 10 + 0, 75 = 362, 75
109 16
13(D) 6 16 0, 046875 × 16 = 0, 75 → 0
6 0 0, 75 × 16 = 12, 0 → C
Conteúdo
2 Sistemas de numeração
Sistema decimal
Sistema binário
Sistema octal
Sistema hexadecimal
Conversões entre binário, octal, e hexadecimal
Conteúdo
2 Sistemas de numeração
Conteúdo
2 Sistemas de numeração
Conteúdo
2 Sistemas de numeração
2 7 3 5 0 1 1 0
Como só há os dígitos 0 e 1, não há soma de dois dígitos que seja maior que 210 = 102
Logo, nas somas de 1 e 1 sempre “vai 1”
Considerando-se as demais combinações de 0 e 1 temos
0+0=0
0+1=1
1+0=1
1 + 1 = 0 e “vai 1”
Usando essa regras, quaisquer dois números binários podem ser somados
1 1 1
1 0 1 1 0
+ 1 0 1 1
1 0 0 0 0 1
Como só há os dígitos 0 e 1, não há soma de dois dígitos que seja maior que 210 = 102
Logo, nas somas de 1 e 1 sempre “vai 1”
Considerando-se as demais combinações de 0 e 1 temos
0+0=0 (Observe que isso é uma operação XOR)
0+1=1
1+0=1
1 + 1 = 0 e “vai 1” (Observe que o “vai 1” é uma operação AND)
Usando essa regras, quaisquer dois números binários podem ser somados
1 1 1
1 0 1 1 0
+ 1 0 1 1
1 0 0 0 0 1
Conteúdo
2 Sistemas de numeração
Exemplo
NOT +1
11001 −−→ 00110 −−→ 00111
NOT +1
10100 −−→ 01011 −−→ 01100
Exemplo
NOT +1
11001 −−→ 00110 −−→ 00111
NOT +1
10100 −−→ 01011 −−→ 01100
1 1 1 1 0
+ 0 1 1 0 0
61 0 1 0 1 0
Note que cortamos o “1” mais significativo aqui para manter o número de bits constante
Esse método permite que o mesmo hardware utilizado para somar seja utilizado para subtrair
Conteúdo
2 Sistemas de numeração
Exemplo na base 10
2 0 7
× 1 0 2
4 1 4
0 0 0 ←
2 0 7 ←
2 1 1 1 4
Conteúdo
Conteúdo
Algoritmos
PORTUGOL: divisão entre dois números Fluxograma: divisão entre dois números
inicio inicio
inteiro dividendo , divisor , quociente ;
leia dividendo ;
leia divisor ;
se divisor <> zero entao leia D
quociente = dividendo / divisor ;
imprima quociente ;
senao
imprima " Divis ão por zero .";
fim - se ; leia d
fim .
Conteúdo
Estrutura sequencial
Estrutura sequencial
Estrutura sequencial
// Isso é um comentário
#include <iostream> // Biblioteca de entrada e saída
using namespace std; // Ativa o pacote padrão (std)
// Função principal
int main(int argc, char *argv[]) {
// Corpo do programa - Mostra "Hello World!" na tela
cout << "Hello World!" << endl;
// Finaliza a main e retorna
return 0;
}
Conteúdo
Estrutura condicional
O resultado da condição pode variar para cada execução do algoritmo, porém o algoritmo ainda
descreve um padrão de comportamento único
Conteúdo
Estrutura de repetição
Ela permite repetir uma ação enquanto uma dada condição for respeitada
Para um número máximo de 50 batatas, o relato abaixo descreve o padrão de comportamento para
descascar um número suficiente de batatas para o jantar
Uma dona-de-casa descasca batatas para o jantar [AdMGadCL94]
“traz a cesta com batatas do porão”;
“traz a panela do armário”;
se “a saia é clara” então “põe o avental”;
se “quantidade de batatas é insuficiente” então “descasca uma batata”;
se “quantidade de batatas é insuficiente” então “descasca uma batata”; {50×}
...
“devolve a cesta ao porão”;
Estrutura de repetição
V
i = 1; // Inicializa i com 1
i
fim
return 0; // Finaliza o programa
}
Conteúdo
Imprima “Hello
#include <iostream> .model tiny 01111111 01000101
World” na tela
using namespace std; .code 01001100 01000110
int main() { org 100h 00000010 00000001
cout << "Hello World\n"; main proc 00000001 00000000
return 0; mov ah,9 00000000 00000000
} mov dx,offset msg 00000000 00000000
int 21h 00000000 00000000
retn 00000000 00000000
msg db 'Hello world$' 00000010 ...
main endp
end main
Código-fonte
Um algoritmo escrito em uma linguagem de
programação é chamado de programa-fonte ou Pré-processador
código-fonte Código-fonte
modificado
Os IDEs atuais contam com interface gráfica (botões, menus, editor de texto integrado, etc.)
segundo os padrões do sistema operacional
Para o linguagem C/C++, sugere-se o Code Blocks, o CLion ou o Visual Studio Community
Conteúdo
6 Operadores
Conteúdo
6 Operadores
A linguagem C/C++
A linguagem C
Linguagem de programação imperativa, estruturada, desenvolvida por Dennis Ritchie na Bell Labs in 1972
a partir da linguagem BCPL e B de 1967
Inicialmente projetada para o desenvolvimento de sistemas operacionais e compiladores
A linguagem/padrão C++
Proposta por Bjarne Stroustrup em 1979 como uma extensão da linguagem C para orientação a objetos
Atualmente é padronizada e atualizada regularmente para tornar a linguagem cada vez mais moderna
Programa em C/C++ Ü consiste de classes e funções que contêm variáveis e comandos definindo o
que deve ser computado
Biblioteca padrão de C/C++ Ü conjuntos de funções especializadas [DD12, Seção 6.6], [DD10, Seção
5.8]
A função main deve estar presente em todo programa em C/C++ e também é reservada
Conteúdo
6 Operadores
Em C++ a entrada e saída de dados utiliza cin e cout da biblioteca iostream [Eck00, Eck03, Ad07]
Veja a biblioteca iomanip para formatação (setw, setprecision, etc.) [DD12, Cap. 15]
Conteúdo
6 Operadores
Em C há várias funções para entrada de dados pelo teclado, entre elas é a função scanf
[DD10, Sch96, KR88]
scanf usa códigos para controlar a formatação dos dados a serem lidos
Os valores digitados são armazenados nas variáveis cujos endereços de memória são fornecidos
O endereço de memória da variável idade é obtido usando o operador &, ou seja, o endereço é
idade
Para usar scanf e printf em programas C++ basta utilizar #include <cstdio>
Tarcisio F. Maciel (UFC) Introdução à Programação 5 de junho de 2017 90 / 348
Conceitos básicos em C/C++ Entrada e saída de dados básicas em C
Códigos de formatação para scanf [Sch96, pág. 212], [KR88, sec. 7.4]
A função printf
Em C há várias funções para saída de dados na tela do computador, entre elas a função printf
printf usa códigos para formatar os dados a serem impressos
O conteúdo das variáveis é impresso na ordem em que estas aparecem e respeitando os códigos de
formatação Ü "%[flags][width][.precision][length]specifier"
Para usar scanf e printf em programas C++ basta utilizar #include <cstdio>
Códigos de formatação para printf [Sch96, pág. 204], [KR88, sec. 7.2]
Saída de dados em C
#include <cstdio>
#include <cstdlib>
using namespace std;
int main(int argc, char *argv[]) {
unsigned int matric = 1033001;
char turma = 'A';
float nota = 9.5;
printf("Matrícula: %u, Turma: %c, Nota: %f\n", matric, turma, nota);
return 0;
}
Conteúdo
6 Operadores
Identificadores em C/C++
Identificadores são nomes que o programador usa para representar elementos no código
São usados para definir, representar e se referir a variáveis, constantes, tipos e funções
Devem começar com um caractere de a-z, de A-Z, ou com _
Podem conter os caracteres de a-z, A-Z, 0-9 e _
Não podem ser palavras reservadas da linguagem
A linguagem C/C++ distingue entre caracteres maiúsculos e minúsculos
Exemplos de identificadores
A, num1, num2, __ID__
dia_da_semana, DIA_DA_SEMANA
1o_Lugar
dia da semana
lei#8192, aluno@ufc
main
Identificadores em C/C++
Identificadores são nomes que o programador usa para representar elementos no código
São usados para definir, representar e se referir a variáveis, constantes, tipos e funções
Devem começar com um caractere de a-z, de A-Z, ou com _
Podem conter os caracteres de a-z, A-Z, 0-9 e _
Não podem ser palavras reservadas da linguagem
A linguagem C/C++ distingue entre caracteres maiúsculos e minúsculos
Exemplos de identificadores
A, num1, num2, __ID__
dia_da_semana, DIA_DA_SEMANA
1o_Lugar Ü começa com número
dia da semana Ü contém espaço em branco
lei#8192, aluno@ufc Ü contém # e @
main Ü palavra reservada
Tipos de dados da linguagem C/C++ [DD12, Apêndice C], [Ad07, Pág. 22]
Tipos de dados da linguagem C/C++ [DD12, Apêndice C], [Ad07, Pág. 22]
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 127
Conteúdo
6 Operadores
idade = 30;
emFerias = true; // Valor diferente de zero é verdadeiro
sexo = 'M'; // Atenção para o apóstrofo em lugar de aspas
cep = 62011000;
return 0;
} // Encerra a main e retorna zero para o SO
Caso a consistência entre valor atribuído e tipo de variável não seja mantida, o valor atribuído
pode ser truncado, convertido e armazenado inadequadamente na variável
Tarcisio F. Maciel (UFC) Introdução à Programação 5 de junho de 2017 100 / 348
Operadores
Conteúdo
6 Operadores
Operadores aritméticos
Operadores lógicos e relacionais
Operadores adicionais
Precedência de operadores em C
Principais funções matemáticas e de conversão
Operadores
Conteúdo
6 Operadores
Operadores aritméticos
Operadores lógicos e relacionais
Operadores adicionais
Precedência de operadores em C
Principais funções matemáticas e de conversão
Operadores aritméticos
Exercício : Escreva um programa que calcule a média aritmética M de três notas N1 , N2 e N3 , de um aluno de Engenharia onde as
N1 + N2 + N3
notas são lidas pelo teclado e M = . Abrir Projeto
3
Exercício : Escreva um programa que calcule a média aritmética M de três notas N1 , N2 e N3 , de um aluno de Engenharia onde as
N1 + N2 + N3
notas são lidas pelo teclado e M = . Abrir Projeto
3
Solução :
#include <iostream>
using namespace std;
int main() {
float Nota1, Nota2, Nota3, Media;
return 0;
}
Exercício : Escreva um programa que calcule a média aritmética ponderada M de três notas N1 , N2 e N3 com pesos P1 , P2 e P3
N1 P1 +N2 P2 +N3 P3
respectivamente, de um aluno de Engenharia onde as notas e seus pesos são lidos pelo teclado e M = P1 +P2 +P3
. Abrir
Projeto
Exercício : Escreva um programa que calcule a média aritmética ponderada M de três notas N1 , N2 e N3 com pesos P1 , P2 e P3
N1 P1 +N2 P2 +N3 P3
respectivamente, de um aluno de Engenharia onde as notas e seus pesos são lidos pelo teclado e M = P1 +P2 +P3
. Abrir
Projeto
Solução :
#include <iostream>
using namespace std;
int main() {
float Nota1, Nota2, Nota3, Peso1, Peso2, Peso3, Media;
cout << "Digite a 1a. nota (de 0 a 10): ";
cin >> Nota1;
cout << "Entre com o peso da 1a. nota (> 0): ";
cin >> Peso1;
cout << "Digite a 2a. nota (de 0 a 10): ";
cin >> Nota2;
cout << "Entre com o peso da 2a. nota (> 0): ";
cin >> Peso2;
cout << "Digite a 3a. nota (de 0 a 10): ";
cin >> Nota3;
cout << "Entre com o peso da 3a. nota (> 0): ";
cin >> Peso3;
Media = (Nota1*Peso1 + Nota2*Peso2 + Nota3*Peso3) / (Peso1 + Peso2 + Peso3);
cout << "A média é : " << Media << endl;
return 0;
}
return 0;
}
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
unsigned int CPF;
unsigned short int D1, D2, D3, D4, D5, D6, D7, D8, D9, V1, V2;
cout << "Digite os 09 primeiros digitos do CPF: ";
cin >> CPF; // Lê o CPF
D1 = (CPF / 1) % 10; // Isola os dígitos do CPF
D2 = (CPF / 10) % 10;
D3 = (CPF / 100) % 10;
D4 = (CPF / 1000) % 10;
D5 = (CPF / 10000) % 10;
D6 = (CPF / 100000) % 10;
D7 = (CPF / 1000000) % 10;
D8 = (CPF / 10000000) % 10;
D9 = (CPF / 100000000) % 10;
V1 = D9*1 + D8*2 + D7*3 + D6*4 + D5*5 + D4*6 + D3*7 + D2*8 + D1*9;
V1 = V1 % 11; // Calcula o primeiro dígito verificador
V2 = D9*0 + D8*1 + D7*2 + D6*3 + D5*4 + D4*5 + D3*6 + D2*7 + D1*8 + V1*9;
V2 = V2 % 11; // Calcula o primeiro dígito verificador
cout << "CPF com dígitos verificadores: " << CPF << "-" << V1 << V2 << '\n';
return 0;
}
Tarcisio F. Maciel (UFC) Introdução à Programação 5 de junho de 2017 109 / 348
Operadores Operadores aritméticos
Conteúdo
6 Operadores
Operadores aritméticos
Operadores lógicos e relacionais
Operadores adicionais
Precedência de operadores em C
Principais funções matemáticas e de conversão
Operadores lógicos
Operação Tipo Exemplo
E && Binário bool A, B; A = true; B = (A && false);
Ou || Binário bool A, B; A = 1; B = (A || false);
Negação ! Unário bool A; A = true; if (!A) { A = false; }
Ou-exclusivo != Binário bool A, B; A = true; B = (A != false);
Operadores relacionais
Operação Tipo Exemplo
Igual == Binário int A, B; bool C; A = 10; B = 5; C = (A == B);
Diferente != Binário int A, B; bool C; A = 10; B = 5; C = (A != B);
Maior que > Binário int A, B; bool C; A = 10; B = 5; C = (A > B);
Menor que < Binário int A, B; bool C; A = 10; B = 5; C = (A < B);
Maior ou igual a >= Binário int A, B; bool C; A = 10; B = 5; C = (A >= B);
Menor ou igual a <= Binário int A, B; bool C; A = 10; B = 5; C = (A <= B);
if (num1 == num2) { cout << num1 << " é igual a " << num2 << endl; }
if (num1 != num2) { cout << num1 << " não é igual a " << num2 << endl; }
if (num1 < num2) { cout << num1 << " é menor que " << num2 << endl; }
if (num1 > num2) { cout << num1 << " é maior que " << num2 << endl; }
if (num1 <= num2) { cout << num1 << " é menor ou igual a " << num2 << endl; }
if (num1 >= num2) { cout << num1 << " é maior ou igual a " << num2 << endl; }
Conteúdo
6 Operadores
Operadores aritméticos
Operadores lógicos e relacionais
Operadores adicionais
Precedência de operadores em C
Principais funções matemáticas e de conversão
cout << "30 - 10 = " << x + y << endl; // Soma com o minuendo Saída do programa
return 0; 30 - 10 = 20
30 - 10 = 20
}
x = 20; x = 20;
0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0
0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0
x = x >> 1; x = x << 1;
Conteúdo
6 Operadores
Operadores aritméticos
Operadores lógicos e relacionais
Operadores adicionais
Precedência de operadores em C
Principais funções matemáticas e de conversão
Precedência Operadores
Primeiro Parênteses, funções
Segundo !, ~, ++, --, +, - (unários)
Terceiro *, /, %
Quarto +, - (binários)
Quinto >>, <<
Sexto <, <=, >=, >
Sétimo ==, !=
Oitavo & (bit-a-bit)
Nono ^ (bit-a-bit)
Décimo | (bit-a-bit)
Décimo primeiro &&
Décimo segundo ||
Décimo terceiro =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=
Conteúdo
6 Operadores
Operadores aritméticos
Operadores lógicos e relacionais
Operadores adicionais
Precedência de operadores em C
Principais funções matemáticas e de conversão
A linguagem C/C++ inclui uma biblioteca de funções matemáticas (#include <cmath>) que inclui,
entre outras, as funções [DD10, Seção 5.8], [DD12, Seção 6.6]:
Ângulo em radianos para funções trigonométricas
Cálculo da hipotenusa [Ad07, Q. 2.16] Ü sqrt Abrir Projeto Cálculo dos catetos Ü cos, sin, M_PI Abrir Projeto
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
float c1, c2, h; float ang, c1, c2, h;
#include <cstdlib> inclui funções que permitem converter entre texto e números
atoi : texto para int strtol : texto para long int
atol : texto para long int strtoul : texto para unsigned long int
atof : texto para double strtof : texto para float
strtod : texto para double
#include <iostream> #include <iostream>
#include <cstdlib> #include <cstdlib>
using namespace std; using namespace std;
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
int i = atoi("1200"); long int i1, i2;
long int l = atol("20000"); i1 = strtol("11111111", NULL, 2); // Base 2
double d = atof("1.23"); i2 = strtol("1100", NULL, 10); // Base 10
cout << i << " " << l << " " << d; unsigned int u1, u2;
return 0; u1 = strtoul("0xFFFF", NULL, 16);
} u2 = strtoul("200000", NULL, 10);
float f = strtof("1.23", NULL);
double d = strtod("2.46", NULL);
cout << i1 << " " << i2 << " " << u1 << " "
<< u2 << " " << f << " " << d << endl;
return 0;
}
Conteúdo
6 Operadores
Conteúdo
6 Operadores
Estruturas condicionais
Fluxograma
Sintaxe em C/C++
if ( condicao ) {
comando1; V
comando2; comando1;
// ... ...
comandoN;
comandoN;
}
Sintaxe em C/C++
if ( condicao ) {
V F
condição comandoV1; // Condição é verdadeira
// ...
c1; ... cN; c1’; ... cN’; }
else {
comandoF1; // Condição é falsa
// ...
}
Exercício : Escreva um programa que avalie o resultado do jogo “Pedra, Papel e Tesoura”. O programa deve ler a escolha de dois
jogadores como inteiros não-negativos de 16 bits de acordo com os valores Pedra (1), Papel (2) e Tesoura (3). As regras são: Papel vence
Pedra, Tesoura vence Papel e Pedra vence Tesoura. Escolhas iguais para os jogadores resultam em empate. O programa deve imprimir
uma mensagem indicando “Jogador 1 venceu.”, “Jogador 2 venceu.”, ou “Empate.” de acordo com o caso. Abrir Projeto
Exercício : Escreva um programa que avalie o resultado do jogo “Pedra, Papel e Tesoura”. O programa deve ler a escolha de dois
jogadores como inteiros não-negativos de 16 bits de acordo com os valores Pedra (1), Papel (2) e Tesoura (3). As regras são: Papel vence
Pedra, Tesoura vence Papel e Pedra vence Tesoura. Escolhas iguais para os jogadores resultam em empate. O programa deve imprimir
uma mensagem indicando “Jogador 1 venceu.”, “Jogador 2 venceu.”, ou “Empate.” de acordo com o caso. Abrir Projeto
Solução :
#include <iostream>
using namespace std;
int main() {
const short int Pedra = 1, Papel = 2, Tesoura = 3;
unsigned short Escolha1, Escolha2;
cout << "Escolha do jogador 1 [(1)-Pedra, (2)-Papel, (3)-Tesoura]: ";
cin >> Escolha1;
cout << "Escolha do jogador 2 [(1)-Pedra, (2)-Papel, (3)-Tesoura]: ";
cin >> Escolha2;
if (Escolha1 >= Pedra && Escolha1 <= Tesoura &&
Escolha2 >= Pedra && Escolha2 <= Tesoura) { // escolhas entre 1 e 3
if (Escolha1 != Escolha2) {
if ( (Escolha1 == Papel && Escolha2 == Pedra) ||
(Escolha1 == Tesoura && Escolha2 == Papel) ||
(Escolha1 == Pedra && Escolha2 == Tesoura) ) {
cout << "Jogador 1 venceu." << endl;
} else {
cout << "Jogador 2 venceu." << endl;
}
} else {
cout << "Empate." << endl;
}
}
return 0;
}
Exercício : Escreva um programa que leia como inteiros o dia, o mês e o ano de duas datas e determine se as duas estão em ordem
cronológica (ou seja, se a primeira data é anterior à segunda data). Imprima uma mensagem adequada em cada caso. Assuma que as duas
datas fornecidas serão válidas. Abrir Projeto
Exercício : Escreva um programa que leia como inteiros o dia, o mês e o ano de duas datas e determine se as duas estão em ordem
cronológica (ou seja, se a primeira data é anterior à segunda data). Imprima uma mensagem adequada em cada caso. Assuma que as duas
datas fornecidas serão válidas. Abrir Projeto
Solução :
#include <iostream>
using namespace std;
int main() {
short int d1, d2, m1, m2, a1, a2;
cout << "Digite o dia, mês e ano da 1a. data na forma dd mm aaaa: ";
cin >> d1 >> m1 >> a1;
cout << "Digite o dia, mês e ano da 2a. data na forma dd mm aaaa: ";
cin >> d2 >> m2 >> a2;
if (a1 > a2) {
cout << "As datas não estão em ordem cronológica." << endl;
} else {
if ((a1 == a2) && (m1 > m2)) {
cout << "As datas não estão em ordem cronológica." << endl;
} else {
if ((a1 == a2) && (m1 == m2) && (d1 > d2)) {
cout << "As datas não estão em ordem cronológica." << endl;
} else {
if ((a1 == a2) && (m1 == m2) && (d1 == d2)) {
cout << "As datas são iguais." << endl;
} else {
cout << "As datas estão em ordem cronológica." << endl;
}
}
}
}
return 0;
}
O operador ternário
if convencional
int x = 4; Operador ternário
int y;
int x = 4;
if(x % 2 == 0) {
int y;
y = 1;
} else {
y = (x % 2 == 0) ? 1 : 0;
y = 0;
}
1 #include <iostream>
2 using namespace std;
3 int main(int argc, char *argv[]) { 21 case '*':
4 int X, Y; 22 cout << X << " * " << Y
5 char oper; 23 << " = " << X * Y << endl;
6 cout << "Entre com o 1o. número (X): "; 24 break;
7 cin >> X; 25 case '/':
8 cout << "Entre com o 2o. número (Y): "; 26 if (Y != 0)
9 cin >> Y; 27 cout << X << " / " << Y
10 cout << "Escolha a operação: +, -, *, /\n"; 28 << " = " << (1.0 * X) / Y << endl;
11 cin >> oper; 29 else
12 switch (oper) { 30 cout << "Divisão por zero !!!" << endl;
13 case '+': 31 break;
14 cout << X << " + " << Y 32 default:
15 << " = " << X + Y << endl; 33 cout << "Operação inválida !!!" << endl;
16 break; 34 }
17 case '-': 35 return 0;
18 cout << X << " - " << Y 36 } // Encerra a main e retorna 0
19 << " = " << X - Y << endl;
20 break;
// ...
case 12:
cout << "Dezembro";
break;
default:
cout << "Mês inválido";
}
return 0; // Encerra a main e retorna 0
}
Exercício : Escreva um programa que leia um conceito na forma de um caractere A, B, C, D ou F e que imprima o significado do conceito
por extenso como “Excelente”, “Bom”, “Regular”, “Ruim”, ou “Insuficiente”. Utilize um bloco switch ... case e capture no mesmo os
casos com letras maiúsculas e minúsculas bem como conceitos inválidos. Abrir Projeto
Exercício : Escreva um programa que leia um conceito na forma de um caractere A, B, C, D ou F e que imprima o significado do conceito
por extenso como “Excelente”, “Bom”, “Regular”, “Ruim”, ou “Insuficiente”. Utilize um bloco switch ... case e capture no mesmo os
casos com letras maiúsculas e minúsculas bem como conceitos inválidos. Abrir Projeto
Solução :
17 case 'c':
1 #include <iostream>
18 case 'C':
2 using namespace std;
19 cout << "Regular." << endl;
3 int main() {
20 break;
4 char conceito;
21 case 'd':
5 cout <<
22 case 'D':
6 "Entre o conceito [A, B, C, D ou F] : ";
23 cout << "Ruim." << endl;
7 cin >> conceito;
24 break;
8 switch (conceito) {
25 case 'f':
9 case 'a':
26 case 'F':
10 case 'A':
27 cout << "Insuficiente." << endl;
11 cout << "Excelente." << endl;
28 break;
12 break;
29 default:
13 case 'b':
30 cout << "Conceito inválido." << endl;
14 case 'B':
31 }
15 cout << "Bom." << endl;
32 return 0;
16 break;
33 }
Conteúdo
6 Operadores
Estruturas de repetição
Cada uma das estruturas de repetição pode ser transformada nas outras através de uma
reformulação adequada
V
i = 1; // Inicializa i com 1
i
fim
return 0; // Finaliza o programa
}
V
i = 1; // Inicializa i com 1
i
fim
return 0; // Finaliza o programa
}
V
i = 2; // Inicializa i com 2
i
fim
return 0; // Finaliza o programa
}
Exercício : Uma progressão aritmética é uma série de números da forma an+1 = an + r , onde o termo inicial a0 e a razão r da série são
conhecidos. Escreva um programa que leia o termo inicial a0 , a razão r e uma quantidade de termos N da série. O programa deve então
imprimir na tela os N termos da série. Abrir Projeto
Exercício : Uma progressão aritmética é uma série de números da forma an+1 = an + r , onde o termo inicial a0 e a razão r da série são
conhecidos. Escreva um programa que leia o termo inicial a0 , a razão r e uma quantidade de termos N da série. O programa deve então
imprimir na tela os N termos da série. Abrir Projeto
Solução :
#include <iostream>
using namespace std;
int main() {
float a0, r;
short N;
return 0;
}
Exercício : Uma progressão aritmética é uma série de números da forma an+1 = an + r , onde o termo inicial a0 e a razão r da série são
conhecidos. Escreva um programa que leia o termo inicial a0 , a razão r e uma quantidade de termos N da série. O programa deve então
imprimir na tela a soma dos N termos da série. Não utilize a fórmula da soma dos termos. Abrir Projeto
Exercício : Uma progressão aritmética é uma série de números da forma an+1 = an + r , onde o termo inicial a0 e a razão r da série são
conhecidos. Escreva um programa que leia o termo inicial a0 , a razão r e uma quantidade de termos N da série. O programa deve então
imprimir na tela a soma dos N termos da série. Não utilize a fórmula da soma dos termos. Abrir Projeto
Solução :
Exercício : Uma progressão geométrica é uma série de números da forma an+1 = an · q , onde o termo inicial a0 e a razão q da série são
conhecidos. Escreva um programa que leia o termo inicial a0 , a razão q e uma quantidade de termos N da série. O programa deve então
imprimir na tela os N termos da série. Abrir Projeto
Exercício : Uma progressão geométrica é uma série de números da forma an+1 = an · q , onde o termo inicial a0 e a razão q da série são
conhecidos. Escreva um programa que leia o termo inicial a0 , a razão q e uma quantidade de termos N da série. O programa deve então
imprimir na tela os N termos da série. Abrir Projeto
Solução :
#include <iostream>
using namespace std;
int main() {
float a0, q;
short N;
return 0;
}
Exercício : Uma progressão geométrica é uma série de números da forma an+1 = an · q , onde o termo inicial a0 e a razão q da série são
conhecidos. Escreva um programa que leia o termo inicial a0 , a razão q e uma quantidade de termos N da série. O programa deve então
imprimir na tela a soma dos N termos da série. Não utilize a fórmula da soma dos termos. Abrir Projeto
Exercício : Uma progressão geométrica é uma série de números da forma an+1 = an · q , onde o termo inicial a0 e a razão q da série são
conhecidos. Escreva um programa que leia o termo inicial a0 , a razão q e uma quantidade de termos N da série. O programa deve então
imprimir na tela a soma dos N termos da série. Não utilize a fórmula da soma dos termos. Abrir Projeto
Solução :
#include <iostream>
using namespace std;
int main() {
float a0, q, S = 0;
short N;
cout << "Digite o termo inicial a0: ";
cin >> a0;
cout << "Digite a razão q: ";
cin >> q;
cout << "Digite o número de termos N: ";
cin >> N;
while (N >= 1) {
cout << a0 << endl;
S = S + a0;
a0 = a0 * q;
N = N - 1;
}
cout << "Soma dos termos: " << S << endl;
return 0;
}
Exemplo para estrutura de repetição com pré-teste Abrir Projeto 1 Abrir Projeto 2
Fatorial de N : N ! = N · (N − 1) · (N − 2) · . . . · 2 · 1 1 1
Soma dos termos da série S = 1 + 2
+ ... + N
com N ∈ N
// Biblioteca de E/S #include <iostream>
#include <iostream> using namespace std;
// Ativa o pacote std // Função principal
using namespace std; int main(int argc, char *argv[]) {
// Função principal unsigned int N;
int main(int argc, char *argv[]) { float S = 0.0;
unsigned int N, F; cout << "Entre com N: ";
cout << "Entre c/ N: "; cin >> N;
cin >> N; while ( N > 0 ) {
F = 1; S = S + 1.0 / N;
while( N >= 2 ) { N = N - 1;
F = F * N; }
N = N - 1; if (S > 0) {
} cout << "S = " << S << endl;
cout << "O fatorial é: " << F; } else {
cout << endl; cout << "N = 0 !!!" << endl;
return 0; }
} return 0;
}
Sintaxe em C/C++
for(contador = vr_inicial; contador < vr_final; contador++) {
comando1;
// ...
comandoN;
}
// ou
for(contador = vr_inicial; contador < vr_final; contador += vr_passo) {
comando1;
// ...
comandoN;
}
Quando o problema requer repetição por um número conhecido de vezes, a estrutura com variável
de controle é mais simples e clara de usar
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
unsigned short int i; unsigned short int i;
return 0; return 0;
} }
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
Fluxograma
unsigned short int n, N;
cout << "Entre com N: ";
cin >> N; F
cout << "Números pares." << endl; <v> de <v0> até <vF> passo <p>
#include <iostream>
using namespace std;
V1 = 0;
V2 = 0;
d = 1;
for (i = 1; i <= 9; i++) {
D = (CPF / d) % 10;
d = d * 10;
V1 = V1 + D*(10-i);
V2 = V2 + D*(9-i);
}
V1 = V1 % 11;
V2 = V2 + V1*9;
V2 = V2 % 11;
cout << "CPF com dígitos verificadores: " << CPF << "-" << V1 << V2 << endl;
return 0;
}
#include <iostream>
using namespace std;
// Função principal
Fluxograma
int main(int argc, char *argv[]) {
unsigned int a0, a1, n, N;
cout << "Entre com N: "; F
cin >> N; <v> de <v0> até <vF> passo <p>
V
a0 = 0;
comando1;
a1 = 1; comando2;
for(n = 0; n < N; n++) { ...
cout << a0 << " "; comandoN;
a1 = a1 + a0;
a0 = a1 - a0;
}
return 0;
}
Exemplo para estrutura de repetição com variável de controle Abrir Projeto 1 Abrir Projeto 2
Quantidade de números entre 30 e 90 entre 10 números Quantidade de pessoas com 18 anos ou mais entre 10 pessoas
digitados #include <iostream>
#include <iostream> using namespace std;
using namespace std;
int main(int argc, char *argv[]) {
int main(int argc, char *argv[]) { const short N=10;
const short N=10; unsigned int i, q, idade;
unsigned int i, Q; q = 0;
float X; for (i = 1; i <= N; i++) {
Q = 0; cout << "Idade da " << i << "a. pessoa: ";
for(i = 0; i < N; i++) { cin >> idade;
cout << "Digite um numero: "; if (idade >= 18) {
cin >> X; q = q + 1;
if(X >= 30.0 && X <= 90.0) { }
Q = Q + 1; }
} cout << "Pessoas c/ 18 ou + anos: " << q;
}
cout << "Q = " Q << endl; return 0;
}
return 0;
}
N xn N (−1)n
ex ≈
P P
, com N ≥ 100 π≈4 , com N ≥ 100
n=0 n! n=0 2n + 1
#include <iostream> #include <iostream>
#include <cmath> using namespace std;
using namespace std; int main(int argc, char *argv[]) {
int main(int argc, char *argv[]) { unsigned int n, N;
unsigned int n, N; float SINAL = 1.0, PI = 0.0;
float X, E = 0.0, F = 1.0; cout << "Entre com N >= 100:";
cout << "Entre com x:"; cin >> N;
cin >> X; if (N < 100) {
cout >> "Entre com N >= 100:"; N = 100;
cin >> N; }
if (N < 100) { N = 100; } for (n = 0; n < N; n++) {
for (n = 0; n < N; n++) { PI = PI + SINAL/(2*n+1);
if (n > 0) { F *= n; } SINAL = -SINAL;
E = E + pow(X, n)/F; }
} cout << "PI = " << 4*PI << endl;
cout << "exp(" << x << ")=" << E; return 0;
return 0; }
}
Semelhante a estrutura de repetição com pré-teste, mas com a diferença de que a condição é
estada após execução dos comandos
Os comandos serão executados ao menos uma vez mesmo que inicialmente a condição já seja falsa
Fluxograma
Sintaxe em C/C++
do
comando1;
{ comando2;
comando1; ...
comandoN;
// ...
comandoN;
V
} while ( condicao ); condição
F
Introdução a funções
Conteúdo
8 Introdução a funções
Conceitos básicos
Exemplos de funções
Passagem de parâmetros por valor e por referência
Exemplos de funções
Recursividade
Fundamentos de bibliotecas de funções
Conteúdo
8 Introdução a funções
Conceitos básicos
Exemplos de funções
Passagem de parâmetros por valor e por referência
Exemplos de funções
Recursividade
Fundamentos de bibliotecas de funções
Dividir e conquistar
Problema Função
principal principal (main)
Subproblema 1 Função 1
Subproblema 2 Função 2
Subproblema N Função N
Dividir e conquistar
Chefe
Chefe 1
Funcionário Funcionario 2 Funcionario 3
Funcionario 4 Funcionario 5
Chamadas de funções
Uma função é uma unidade de programa (bloco de instruções) que executa uma tarefa específica, uma parte de um programa
especializada em uma funcionalidade
Funções realizam ações como ler dados, fazer cálculos e devolver resultados
Funções são invocadas por chamada
A chamada é feita pelo nome da função e fornece a informação (valores fornecidos como argumentos) necessária para que a função
cumpra seu objetivo
A função principal Ü controlador Ü chama uma ou mais vezes uma ou mais funções
Ao chamar uma função, a função chamada assume o controle e o função chamadora é interrompida
Ao concluir sua tarefa, a função chamada devolve o controle à função chamadora que continua de onde havia parado
Função 1
Função
Função 2 Função 2.1
principal
Sequência: 1
Função 3
Chamadas de funções
Uma função é uma unidade de programa (bloco de instruções) que executa uma tarefa específica, uma parte de um programa
especializada em uma funcionalidade
Funções realizam ações como ler dados, fazer cálculos e devolver resultados
Funções são invocadas por chamada
A chamada é feita pelo nome da função e fornece a informação (valores fornecidos como argumentos) necessária para que a função
cumpra seu objetivo
A função principal Ü controlador Ü chama uma ou mais vezes uma ou mais funções
Ao chamar uma função, a função chamada assume o controle e o função chamadora é interrompida
Ao concluir sua tarefa, a função chamada devolve o controle à função chamadora que continua de onde havia parado
Função 1
Função
Função 2 Função 2.1
principal
Sequência: 2
Função 3
Chamadas de funções
Uma função é uma unidade de programa (bloco de instruções) que executa uma tarefa específica, uma parte de um programa
especializada em uma funcionalidade
Funções realizam ações como ler dados, fazer cálculos e devolver resultados
Funções são invocadas por chamada
A chamada é feita pelo nome da função e fornece a informação (valores fornecidos como argumentos) necessária para que a função
cumpra seu objetivo
A função principal Ü controlador Ü chama uma ou mais vezes uma ou mais funções
Ao chamar uma função, a função chamada assume o controle e o função chamadora é interrompida
Ao concluir sua tarefa, a função chamada devolve o controle à função chamadora que continua de onde havia parado
Função 1
Função
Função 2 Função 2.1
principal
Sequência: 3
Função 3
Chamadas de funções
Uma função é uma unidade de programa (bloco de instruções) que executa uma tarefa específica, uma parte de um programa
especializada em uma funcionalidade
Funções realizam ações como ler dados, fazer cálculos e devolver resultados
Funções são invocadas por chamada
A chamada é feita pelo nome da função e fornece a informação (valores fornecidos como argumentos) necessária para que a função
cumpra seu objetivo
A função principal Ü controlador Ü chama uma ou mais vezes uma ou mais funções
Ao chamar uma função, a função chamada assume o controle e o função chamadora é interrompida
Ao concluir sua tarefa, a função chamada devolve o controle à função chamadora que continua de onde havia parado
Função 1
Função
Função 2 Função 2.1
principal
Sequência: 4
Função 3
Chamadas de funções
Uma função é uma unidade de programa (bloco de instruções) que executa uma tarefa específica, uma parte de um programa
especializada em uma funcionalidade
Funções realizam ações como ler dados, fazer cálculos e devolver resultados
Funções são invocadas por chamada
A chamada é feita pelo nome da função e fornece a informação (valores fornecidos como argumentos) necessária para que a função
cumpra seu objetivo
A função principal Ü controlador Ü chama uma ou mais vezes uma ou mais funções
Ao chamar uma função, a função chamada assume o controle e o função chamadora é interrompida
Ao concluir sua tarefa, a função chamada devolve o controle à função chamadora que continua de onde havia parado
Função 1
Função
Função 2 Função 2.1
principal
Sequência: 5
Função 3
Chamadas de funções
Uma função é uma unidade de programa (bloco de instruções) que executa uma tarefa específica, uma parte de um programa
especializada em uma funcionalidade
Funções realizam ações como ler dados, fazer cálculos e devolver resultados
Funções são invocadas por chamada
A chamada é feita pelo nome da função e fornece a informação (valores fornecidos como argumentos) necessária para que a função
cumpra seu objetivo
A função principal Ü controlador Ü chama uma ou mais vezes uma ou mais funções
Ao chamar uma função, a função chamada assume o controle e o função chamadora é interrompida
Ao concluir sua tarefa, a função chamada devolve o controle à função chamadora que continua de onde havia parado
Função 1
Função
Função 2 Função 2.1
principal
Sequência: 6
Função 3
Chamadas de funções
Uma função é uma unidade de programa (bloco de instruções) que executa uma tarefa específica, uma parte de um programa
especializada em uma funcionalidade
Funções realizam ações como ler dados, fazer cálculos e devolver resultados
Funções são invocadas por chamada
A chamada é feita pelo nome da função e fornece a informação (valores fornecidos como argumentos) necessária para que a função
cumpra seu objetivo
A função principal Ü controlador Ü chama uma ou mais vezes uma ou mais funções
Ao chamar uma função, a função chamada assume o controle e o função chamadora é interrompida
Ao concluir sua tarefa, a função chamada devolve o controle à função chamadora que continua de onde havia parado
Função 1
Função
Função 2 Função 2.1
principal
Sequência: 7
Função 3
Chamadas de funções
Uma função é uma unidade de programa (bloco de instruções) que executa uma tarefa específica, uma parte de um programa
especializada em uma funcionalidade
Funções realizam ações como ler dados, fazer cálculos e devolver resultados
Funções são invocadas por chamada
A chamada é feita pelo nome da função e fornece a informação (valores fornecidos como argumentos) necessária para que a função
cumpra seu objetivo
A função principal Ü controlador Ü chama uma ou mais vezes uma ou mais funções
Ao chamar uma função, a função chamada assume o controle e o função chamadora é interrompida
Ao concluir sua tarefa, a função chamada devolve o controle à função chamadora que continua de onde havia parado
Função 1
Função
Função 2 Função 2.1
principal
Sequência: 8
Função 3
Chamadas de funções
Uma função é uma unidade de programa (bloco de instruções) que executa uma tarefa específica, uma parte de um programa
especializada em uma funcionalidade
Funções realizam ações como ler dados, fazer cálculos e devolver resultados
Funções são invocadas por chamada
A chamada é feita pelo nome da função e fornece a informação (valores fornecidos como argumentos) necessária para que a função
cumpra seu objetivo
A função principal Ü controlador Ü chama uma ou mais vezes uma ou mais funções
Ao chamar uma função, a função chamada assume o controle e o função chamadora é interrompida
Ao concluir sua tarefa, a função chamada devolve o controle à função chamadora que continua de onde havia parado
Função 1
Função
Função 2 Função 2.1
principal
Sequência: 9
Função 3
Chamadas de funções
Uma função é uma unidade de programa (bloco de instruções) que executa uma tarefa específica, uma parte de um programa
especializada em uma funcionalidade
Funções realizam ações como ler dados, fazer cálculos e devolver resultados
Funções são invocadas por chamada
A chamada é feita pelo nome da função e fornece a informação (valores fornecidos como argumentos) necessária para que a função
cumpra seu objetivo
A função principal Ü controlador Ü chama uma ou mais vezes uma ou mais funções
Ao chamar uma função, a função chamada assume o controle e o função chamadora é interrompida
Ao concluir sua tarefa, a função chamada devolve o controle à função chamadora que continua de onde havia parado
Função 1
Função
Função 2 Função 2.1
principal
Sequência: 10
Função 3 Fim do Programa
Cabeçalho Ü determina o protocolo de uso da função, i.e., para chamada da mesma, onde o
número, ordem, e tipo dos parâmetros deve ser respeitado
Especifica o nome da função Ü “obrigatório”
Especifica os parâmetros da função, bem como determina o número, ordem, tipo de dados, e
funcionalidade de entrada/saída dos mesmos
Especifica o tipo do valor de retorno
Declaração de funções
#include <iostream>
using namespace std;
void msgDivPorZero() {
cout << "Divisão por zero." << endl;
}
int main() {
float x, y;
cout << "Entre com x: ";
cin >> x;
cout << "Entre com y: ";
cin >> y;
if (y != 0) {
cout << x << "/" << y << " = " << x/y << endl;
} else {
msgDivPorZero();
}
return 0;
}
#include <iostream>
using namespace std;
void msgDivPorZero(float y) {
if (y == 0)
cout << "Dados inválidos." << endl;
}
int main() {
float x, y;
cout << "Entre com x: ";
cin >> x;
cout << "Entre com y: ";
cin >> y;
msgDivPorZero(y);
if(y != 0) {
cout << x << "/" << y << " = " << x/y << endl;
}
return 0;
}
#include <iostream>
using namespace std;
int main() {
float x, y;
cout << "Entre com x: ";
cin >> x;
cout << "Entre com y: ";
cin >> y;
cout << "maior(" << x << "," << y << ")=" << maior(x, y) << endl;
return 0;
}
1 #include <iostream>
24 int main() {
2 #include <string>
25 float media, freq;
3
26 do {
4 using namespace std;
27 cout << "Entre c/ a média das APs (0 a 10): ";
5
28 cin >> media;
6 string situacaoAluno(float m, float f)
29 if (media < 0 || media > 10) {
7 {
30 cout << "Dado inválido." << endl;
8 if( f < 75) {
31 }
9 return "Reprovado por falta";
32 } while (media < 0 || media > 10);
10 } else {
33 do {
11 if (m >= 7) {
34 cout << "Entre c/ frequência (0 a 100): ";
12 return "Aprovado por média";
35 cin >> freq;
13 } else {
36 if (freq < 0 || freq > 100) {
14 if(m >= 4) {
37 cout << "Dado inválido." << endl;
15 return "Avaliação final";
38 }
16 } else {
39 } while (freq < 0 || freq > 100);
17 return "Reprovado por nota";
40
18 }
41 cout << "Situação do aluno: "
19 }
42 << situacaoAluno(media, freq);
20 }
43 return 0;
21 }
44 }
22
Concepção de funções
Conteúdo
8 Introdução a funções
Conceitos básicos
Exemplos de funções
Passagem de parâmetros por valor e por referência
Exemplos de funções
Recursividade
Fundamentos de bibliotecas de funções
Exercício : Crie uma função modulo que calcule e retorne o módulo (comprimento) k~
v k2 de um vetor ~v = xî + y ĵ + z k̂ no espaço, onde
p
k~v k2 = x2 + y 2 + z 2 . A função deve receber as coordenadas x, y e z como parâmetros. Na função main, leia as coordenadas de um
v e use a função modulo para calcular o módulo do vetor, e em seguida imprima seu valor na main.
vetor ~ Abrir Projeto
Exercício : Crie uma função modulo que calcule e retorne o módulo (comprimento) k~
v k2 de um vetor ~v = xî + y ĵ + z k̂ no espaço, onde
p
k~v k2 = x2 + y 2 + z 2 . A função deve receber as coordenadas x, y e z como parâmetros. Na função main, leia as coordenadas de um
v e use a função modulo para calcular o módulo do vetor, e em seguida imprima seu valor na main.
vetor ~ Abrir Projeto
Solução :
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double x, y, z, m;
cout << "Entre com as componentes x y z: ";
cin >> x >> y >> z;
m = modulo(x, y, z);
cout << "O módulo é: " << m << endl;
return 0;
}
Exercício : Crie uma função dot que calcule e retorne o produto interno (produto escalar) de dois vetores ~
v = vx î + vy ĵ e
w~ = wx î + wy ĵ no plano, onde ~v · w
~ = vx wx + vy wy . A função deve receber as coordenadas vx , vy , wx e wy como parâmetros. Na
função main, leia as coordenadas dos vetores ~vew~ e use a função dot para calcular o produto interno entre eles. Em seguida imprima seu
valor na main. Abrir Projeto
Exercício : Crie uma função dot que calcule e retorne o produto interno (produto escalar) de dois vetores ~
v = vx î + vy ĵ e
w~ = wx î + wy ĵ no plano, onde ~v · w
~ = vx wx + vy wy . A função deve receber as coordenadas vx , vy , wx e wy como parâmetros. Na
função main, leia as coordenadas dos vetores ~vew~ e use a função dot para calcular o produto interno entre eles. Em seguida imprima seu
valor na main. Abrir Projeto
Solução :
#include <iostream>
using namespace std;
int main() {
double vx, vy, wx, wy, d;
cout << "Entre com x y do vetor v: ";
cin >> vx >> vy;
cout << "Entre com x y do vetor w: ";
cin >> wx >> wy;
cout << "dot(v, w) = " << dot(vx, vy, wx, wy) << endl;
return 0;
}
Exercício : Crie uma função angulo que calcule e retorne o ângulo θ = ∠~w~
v entre dois vetores ~
v = vx î + vy ĵ e w
~ = wx î + wy ĵ no
plano, onde θ pode ser isolado a partir da relação |~
v · w|
~ = k~v k2 kwk
~ 2 cos(θ). A função deve receber as coordenadas vx , vy , wx e wy
como parâmetros. Na função main, leia as coordenadas dos vetores ~ vew~ e use a função dot para calcular o ângulo entre eles. Em seguida
imprima seu valor na main. Abrir Projeto
Exercício : Crie uma função angulo que calcule e retorne o ângulo θ = ∠~w~
v entre dois vetores ~
v = vx î + vy ĵ e w
~ = wx î + wy ĵ no
plano, onde θ pode ser isolado a partir da relação |~
v · w|
~ = k~v k2 kwk
~ 2 cos(θ). A função deve receber as coordenadas vx , vy , wx e wy
como parâmetros. Na função main, leia as coordenadas dos vetores ~ vew~ e use a função dot para calcular o ângulo entre eles. Em seguida
imprima seu valor na main. Abrir Projeto
Solução :
1 #include <iostream>
2 #include <cmath>
14 int main() {
3
15 double vx, vy, wx, wy, ang;
4 using namespace std;
16 cout << "Entre com x y do vetor v: ";
5 double angulo(double vx, double vy, double wx, double wy) {
17 cin >> vx >> vy;
6 double moduloV, moduloW, dotVW, theta;
18 cout << "Entre com x y do vetor w: ";
7 dotVW = vx*wx + vy*wy;
19 cin >> wx >> wy;
8 moduloV = sqrt(vx*vx + vy*vy);
20 ang = angulo(vx, vy, wx, wy)/M_PI*180;
9 moduloW = sqrt(wx*wx + wy*wy);
21 cout << "Ângulo(v, w) = " << ang << endl;
10 theta = acos(dotVW/(moduloV * moduloW));
22 return 0;
11 return theta;
23 }
12 }
13
Exercício : Crie uma função que receba como parâmetro um inteiro não-negativo, calcule e retorne o seu fatorial. Usando essa função,
crie uma segunda função que calcule o número de combinações de n elementos p-a-p, i.e., n n!
. Use essa função na main
p
= p!(n−p)!
para calcular e imprimir o número de combinações de n elementos p-a-p, onde n > 0 e 0 < p ≤ n são lidos via teclado. Abrir Projeto
Exercício : Crie uma função que receba como parâmetro um inteiro não-negativo, calcule e retorne o seu fatorial. Usando essa função,
crie uma segunda função que calcule o número de combinações de n elementos p-a-p, i.e., n n!
. Use essa função na main
p
= p!(n−p)!
para calcular e imprimir o número de combinações de n elementos p-a-p, onde n > 0 e 0 < p ≤ n são lidos via teclado. Abrir Projeto
Solução :
Conteúdo
8 Introdução a funções
Conceitos básicos
Exemplos de funções
Passagem de parâmetros por valor e por referência
Exemplos de funções
Recursividade
Fundamentos de bibliotecas de funções
#include <iostream>
using namespace std;
Passagem de parâmetros por valor e por referência Exemplo: ponteiros * Abrir Projeto
#include <iostream>
using namespace std;
Conteúdo
8 Introdução a funções
Conceitos básicos
Exemplos de funções
Passagem de parâmetros por valor e por referência
Exemplos de funções
Recursividade
Fundamentos de bibliotecas de funções
Tabelas de fatoriais
Crie um programa que imprime uma tabela com n e seu fatorial n! para os Sem o uso de subprogramas o cálculo do fatorial
números entre 0 e 20 caso fosse necessário atualizar um módulo (e.g.,
usar uma forma diferente para o fatorial), a
#include <iostream> mudança não estaria concentrada em um único
using namespace std; ponto
unsigned long long fatorial(unsigned short n) {
unsigned long long f = 1;
while (n > 1) {
f = f * n;
n--;
}
return f;
}
Conteúdo
8 Introdução a funções
Conceitos básicos
Exemplos de funções
Passagem de parâmetros por valor e por referência
Exemplos de funções
Recursividade
Fundamentos de bibliotecas de funções
Exercício : Escreva uma função recursiva que retorne o n-ésimo termo da sequência de Fibonacci. Use essa função na main para imprimir
o n-ésimo da sequência. Sabe-se para essa sequência que a0 = 0, a1 = 1 e an = an−1 + an−2 , ∀n > 2, n ∈ N. Abrir Projeto
Exercício : Escreva uma função recursiva que retorne o n-ésimo termo da sequência de Fibonacci. Use essa função na main para imprimir
o n-ésimo da sequência. Sabe-se para essa sequência que a0 = 0, a1 = 1 e an = an−1 + an−2 , ∀n > 2, n ∈ N. Abrir Projeto
Solução :
#include <iostream>
using namespace std;
int main() {
unsigned short int n;
cout << "Entre com o termo: ";
cin >> n;
cout << "O " << n << "o. termo é = "
<< fibonacci(n) << endl;
return 0;
}
Conteúdo
8 Introdução a funções
Conceitos básicos
Exemplos de funções
Passagem de parâmetros por valor e por referência
Exemplos de funções
Recursividade
Fundamentos de bibliotecas de funções
Biblioteca de funções Ü forma prática de gerenciar funções Arquivo de declarações Ü contém os protótipos das funções
Listagem 1: myfunctionslib.hpp (cabeçalhos)
Arquivo de implementação Ü inclui o arquivo de declarações e
#ifndef _MYFUNCTIONSLIBH_ implementa as funções
#define _MYFUNCTIONSLIBH_
#endif
#include <iostream>
#include "myfunctionslib.hpp"
Conteúdo
Conteúdo
Vetores (arrays)
Vetores (arrays)
Conteúdo
x 0x0000FF10
Sintaxe para declaração de vetores: similar à usada para escalares 16 bits
0x0000FF11
TipoDeDados NomeDoVetor[TamanhoDoVetor]; u[0] 0x0000FF12 16 bits
0x0000FF13
Ex.: Declaração de um escalar e de um vetor u[1] 0x0000FF14 16 bits
short x; // Um escalar inteiro de 16 bits 0x0000FF15
short u[10]; // Um vetor de 10 inteiros u[2] 0x0000FF16 16 bits
0x0000FF17
Comparada à declaração de uma variável escalar, a declaração de um u[3] 0x0000FF18 16 bits
vetor é acrescida de um par de colchetes com o tamanho do vetor 0x0000FF19
entre eles u[4] 0x0000FF1A 16 bits
Na memória, o vetor u assemelha-se a uma coluna (ou linha) de uma 0x0000FF1B
tabela u[5] 0x0000FF1C 16 bits
0x0000FF1D
O tamanho de um vetor tem que ser uma constante, assegurando que
o tamanho será conhecido no momento da compilação ... ...
Conteúdo
Conteúdo
Exercício : Faça um programa que leia um vetor com 10 posições para números inteiros e mostre somente os números positivos [Ad12, Q.
6.20]. Abrir Projeto 1 Abrir Projeto 2
Exercício : Faça um programa que leia um vetor com 10 posições para números inteiros e mostre somente os números positivos [Ad12, Q.
6.20]. Abrir Projeto 1 Abrir Projeto 2
Solução :
#include <iostream>
#include <iterator>
#include <iostream>
#include <algorithm>
using namespace std;
using namespace std;
int main() {
int main() {
const short N = 10; // Tamanho do vetor
const short N = 10; // Tamanho do vetor
short i, v[N];
short i, v[N];
for (i = 0; i < N; i++) {
for (i = 0; i < N; i++) {
cout << "Digite v[" << i << "]: ";
cout << "Digite v[" << i << "]: ";
cin >> v[i];
cin >> v[i];
}
}
cout << "Números positivos: ";
for (auto x : v) { // Range for
cout << "Números positivos: ";
if (x > 0) {
copy_if(v,
cout << x << " ";
v+N,
}
ostream_iterator<short>(cout, " "),
}
[](short x) { return (x > 0); }
cout << endl;
);
cout << endl;
return 0;
}
return 0;
}
Tarcisio F. Maciel (UFC) Introdução à Programação 5 de junho de 2017 210 / 348
Vetores (arrays unidimensionais) Exemplos e aplicações
Exercício : Faça um programa que preencha um vetor com 7 números inteiros, calcule e mostre: i) os números múltiplos de 2; ii) os
números múltiplos de 3; iii) os números múltiplos de 2 e 3 [Ad12, Q. 6.2]. Abrir Projeto
Exercício : Faça um programa que preencha um vetor com 7 números inteiros, calcule e mostre: i) os números múltiplos de 2; ii) os
números múltiplos de 3; iii) os números múltiplos de 2 e 3 [Ad12, Q. 6.2]. Abrir Projeto
Solução :
1 #include <iostream>
19 cout << "Múltiplos de 3: ";
2 using namespace std;
20 for (auto x : v) {
3
21 if (x % 3 == 0) {
4 int main() {
22 cout << x << " ";
5 // Tamanho do vetor
23 }
6 const short N = 7;
24 }
7 short i, v[N];
25 cout << endl;
8 for (i = 0; i < N; i++) {
26 cout << "Múltiplos de 2 e 3: ";
9 cout << "Digite v[" << i << "]: ";
27 for (auto x : v) {
10 cin >> v[i];
28 if ( x % 2 == 0 && x % 3 == 0) {
11 }
29 cout << x << " ";
12 cout << "Múltiplos de 2: ";
30 }
13 for (auto x : v) {
31 }
14 if (x % 2 == 0) {
32 cout << endl;
15 cout << x << " ";
33
16 }
34 return 0;
17 }
35 }
18 cout << endl;
Exercício : Faça um programa que preencha um vetor com 7 números inteiros, calcule e mostre: i) os números múltiplos de 2; ii) os
números múltiplos de 3; iii) os números múltiplos de 2 e 3 [Ad12, Q. 6.2]. Abrir Projeto
Exercício : Faça um programa que preencha um vetor com 7 números inteiros, calcule e mostre: i) os números múltiplos de 2; ii) os
números múltiplos de 3; iii) os números múltiplos de 2 e 3 [Ad12, Q. 6.2]. Abrir Projeto
Solução :
1 #include <iostream>
2 #include <iterator> 20 cout << "Múltiplos de 3: ";
3 #include <algorithm> 21 copy_if(v,
4 using namespace std; 22 v+N,
5 23 ostream_iterator<short>(cout, " "),
6 int main() { 24 [](short x) { return (x % 3 == 0); }
7 const short N = 7; // Tamanho do vetor 25 );
8 short i, v[N]; 26 cout << endl;
9 for (i = 0; i < N; i++) { 27 cout << "Múltiplos de 2 e 3: ";
10 cout << "Digite v[" << i << "]: "; 28 copy_if(v,
11 cin >> v[i]; 29 v+N,
12 } 30 ostream_iterator<short>(cout, " "),
13 cout << "Múltiplos de 2: "; 31 [](short x) { return (x % 2 == 0 && x % 3 == 0); }
14 copy_if(v, 32 );
15 v+N, 33 cout << endl;
16 ostream_iterator<short>(cout, " "), 34
17 [](short x) { return (x % 2 == 0); } 35 return 0;
18 ); 36 }
19 cout << endl;
Exercício : Faça um programa que preencha um vetor com 10 números reais, calcule e mostre a quantidade de números negativos e a
soma dos números positivos [Ad12, Q. 6.7]. Abrir Projeto 1 Abrir Projeto 2
Exercício : Faça um programa que preencha um vetor com 10 números reais, calcule e mostre a quantidade de números negativos e a
soma dos números positivos [Ad12, Q. 6.7]. Abrir Projeto 1 Abrir Projeto 2
Solução :
#include <iostream>
#include <algorithm>
#include <iostream>
#include <numeric>
using namespace std;
using namespace std;
int main() {
int main() {
const short N = 10; // Tamanho dos vetores
const short N = 10; // Tamanho dos vetores
short i, qtNeg = 0;
short i, qtNeg = 0;
float v[N], somaPos = 0;
float v[N], somaPos = 0;
for (i = 0; i < N; i++) {
for (i = 0; i < N; i++) {
cout << "Digite v[" << i << "]: ";
cout << "Digite v[" << i << "]: ";
cin >> v[i];
cin >> v[i];
if (v[i] < 0) {
}
qtNeg++;
qtNeg = count_if(v, v+N, [](float x) { return (x < 0); });
} else {
somaPos = accumulate(v, v+N, somaPos,
somaPos += v[i];
[](float &x, float &y) {
}
if (y > 0) return (x + y);
}
else return x; }
cout << "Qtde. de negativos: " << qtNeg << endl;
);
cout << "Soma dos positivos: " << somaPos << endl;
cout << "Qtde. de negativos: " << qtNeg << endl;
return 0;
cout << "Soma dos positivos: " << somaPos << endl;
}
return 0;
}
Solução : Tarcisio F. Maciel (UFC) Introdução à Programação 5 de junho de 2017 213 / 348
Vetores (arrays unidimensionais) Exemplos e aplicações
Exercício : Faça um programa que preencha um vetor com quinze números, determine e mostre: o maior número e a posição dele no
vetor; ii) o menor número e a posição dele no vetor [Ad12, Q. 6.18]. Abrir Projeto
Exercício : Faça um programa que preencha um vetor com quinze números, determine e mostre: o maior número e a posição dele no
vetor; ii) o menor número e a posição dele no vetor [Ad12, Q. 6.18]. Abrir Projeto
Solução :
#include <iostream>
using namespace std;
int main() {
const short N = 15; // Tamanho do vetor
short i, posMax = 0, posMin = 0;
float v[N];
for (i = 0; i < N; i++) {
cout << "Digite v[" << i << "]: ";
cin >> v[i];
if (v[i] > v[posMax]) { posMax = i; }
if (v[i] < v[posMin]) { posMin = i; }
}
cout << "Máximo: " << v[posMax] << endl;
cout << "Posição: " << posMax << endl;
cout << "Mínimo: " << v[posMin] << endl;
cout << "Posição: " << posMin << endl;
return 0;
}
Remover Elementos Duplicados Abrir Projeto Complemento entre Conjuntos Abrir Projeto
#include <iostream> // Complemento entre conjuntos
using namespace std; #include <iostream>
int main(int argc, char *argv[]) { using namespace std;
const int N = 10; int main(int argc, char *argv[]) {
int i, j, k, L = N, V[N]; const int N1 = 3, N2 = 5;
for(i = 0; i < N; i++) { int i, j, A[N1], B[N2];
cout << "Entre V[" << i << "]:"; for(i = 0; i < N1; i++) {
cin >> V[i]; cout << "Entre A[" << i << "]:";
} cin >> A[i];
for(i = 0; i < L; i++) { }
for(j = i+1; j < L; j++) { for(i = 0; i < N2; i++) {
if(V[i] == V[j]) { cout << "Entre B[" << i << "]:";
for(k = j; k < L-1; k++) { cin >> B[i];
V[k] = V[k+1]; }
} cout << "C(A, B):" << endl;
L--; j--; for(i = 0; i < N2; i++) {
} for(j = 0; j < N1; j++) {
} if(B[i] == A[j]) { break; }
} }
for(i = 0; i < L; i++) { cout << V[i] << " "; } if(j == N1) { cout << B[i] << " "; }
return 0; }
} return 0;
}
Exercício : Escreva um programa que misture aleatoriamente os números de 1 a 75 usados em um bingo. Os números do bingo devem ser
guardados em um vetor e impressos um por um sempre a uma tecla for pressionada. Imprima também as letras B (de 1 a 15), I(de 16 a 30),
N (de 31 a 45), G (de 46 a 60), ou O (de 61 a 75).
Exercício : Escreva um programa que misture aleatoriamente os números de 1 a 75 usados em um bingo. Os números do bingo devem ser
guardados em um vetor e impressos um por um sempre a uma tecla for pressionada. Imprima também as letras B (de 1 a 15), I(de 16 a 30),
N (de 31 a 45), G (de 46 a 60), ou O (de 61 a 75).
Solução :
16 int main() {
17 const short numBolas = 75;
18 string letras = "BINGO";
1 #include <iostream> 19 short i, bolas[numBolas];
2 #include <cstdlib> 20
3 #include <ctime> 21 srand(time(0));
4 // #include <algorithm> 22
5 using namespace std; 23 for(i = 0; i < numBolas; i++) {
6 24 bolas[i] = i+1;
7 void embaralhar(short *v, short n) { 25 }
8 short i, j, k; 26 // random_shuffle(bolas, bolas + numBolas);
9 for(k = 0; k < 10*n; k++) { 27 embaralhar(bolas, numBolas);
10 i = rand() % n; 28 for(i = 0; i < numBolas; i++) {
11 j = rand() % n; 29 cout << "ENTER para sortear uma bola";
12 swap(v[i], v[j]); 30 cin.ignore();
13 } 31 cout << letras[(bolas[i]-1)/15] << "-"
14 } 32 << bolas[i] << endl;
33 }
34 return 0;
35 }
Conteúdo
Conteúdo
Conceitos básicos
Assim como vetores, matrizes são estruturas de dados homogêneas, ou seja, são derivadas a partir
de um único tipo básico (char, int, float, double)
Matrizes são também chamadas arrays bidimensionais
As principais características de uma matriz estática são
Um tipo de dados (um dos tipos básicos acima)
Dois tamanhos constantes (um tamanho para cada dimensão), ou seja, um número de linhas e um
número de colunas
Dois conjuntos de índices que permitem acessar as componentes/posições/elementos da matriz
Assim como na matemática, um vetor é um caso particular de matriz (com uma única linha ou
coluna)
Assim como vetores, matrizes são úteis para representação de dados cuja natureza é
essencialmente matricial
Deste modo, o desenvolvimento de algoritmos é simplificado
Considere o caso de uma imagem digital cujos elementos são organizados naturalmente em forma
de matriz, sendo que cada ponto (pixel) contém uma informação de cor
Outros exemplos referem-se a problemas matemáticos de álgebra matricial
Em programação em C/C++, há duas ações básicas envolvendo matrizes
Declaração das matrizes
Acesso a um elemento para escrita/leitura
A forma de cada ação é muito similar àquela usada com vetores
Conteúdo
Para a lógica do programa a matriz M deve ser entendida como uma matriz convencional com linhas e
colunas
Colunas 1 2 3 4
Linha 1
Linha 2
Linha 3
Linha 4
Linha 5
Conteúdo
Os elementos de um matriz são acessados para escrita utilizando um índice para a linha e outro para a coluna
Da mesma forma que com vetores, os índices em cada dimensão têm índice-base 0
A escrita em um elemento de uma matriz se dá escrevendo o nome da variável matriz seguida do índice da linha entre
colchetes e do índice da coluna entre colchetes
Conteúdo
Matriz identidade
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
const short N = 5;
short i, j, I[N][N]; // Índices e matriz N x N
for(i = 0; i < N; i++) {
for(j = 0; j < N; j++) {
// 1's somente se i igual a j
I[i][j] = (i == j) ? 1 : 0;
}
}
for(i = 0; i < N; i++) {
for(j = 0; j < N; j++) {
cout << I[i][j] << ' ';
}
cout << '\n';
}
return 0;
}
Considere uma aplicação em engenharia que necessite de um subprograma para encontrar a solução de um sistema
triangular inferior de n equações e n incógnitas x1 , x2 , . . . xn da forma
a1,1 · x1
= b1
a1,1 0 . . . 0 x1 b1
a2,1 · x1 + a2,2 · x2 = b2
a2,1 a2,2 . . . 0 x2 b2
⇒ . . . = .
.. .. .. . .
. . .. . . .. .. ..
an,1 · x1 + an,2 · x2 + . . . + an,n · xn = bn an,1 an,2 . . . an,n xn bn
| {z } | {z } | {z }
An×n xn×1 bn×1
b1
x1 =
a1,1
i−1
1 X
xi = bi − ai,j · xj , i = 2, 3, . . . , n
ai,i
j=1
bool solveLowerTriang(float *A, float *b, float *x, const unsigned short n)
unsigned short i, j;
if (n < 1) {
return false;
}
else {
for(i = 0; i < n; i++) {
x[i] = b[i];
for(j = 0; j < i; j++) {
x[i] = x[i] - A[i*n + j]*x[j];
}
if( A[i*n + i] != 0.0 ) {
x[i] = x[i]/A[i*n + i];
}
else {
return false;
}
}
}
return true;
}
Conteúdo
Conteúdo
Conteúdo
Considere que o texto “Elisabeth” foi lido para um vetor char nome[10];
Assim, o vetor nome na memória seria E l i s a b e t h \0
Funções que manipulam strings pressupõem a existência do terminador, ou seja, a presença do mesmo no vetor
determina se a string nele é válida ou não
Funções que manipulam strings acrescentam (ou ignoram) automaticamente o '\0'
O programador deve reservar espaço suficiente no vetor para o texto e para o terminador
Para o vetor nome acima, a string admissível mais longa é de 9 caracteres
Nada impede que strings mais curtas sejam armazenadas
Existem várias funções para manipulação de strings disponíveis na biblioteca cstring (em C++ ou string.h
em C)
Conteúdo
Strings em C++
Conteúdo
#include <iostream>
#include <cstring>
using namespace std;
int main(int argc, char *argv[]) {
char nome[20], sobrenome[20], completo[40];
cout << "Digite seu nome:";
cin >> nome;
cout << "Digite seu sobrenome:" ;
cin >> sobrenome;
cout << "Nome tem " << strlen(nome) << " letras." << endl;
cout << "Sobrenome tem " << strlen(sobrenome) << " letras." << endl;
strcpy(completo, nome);
strcat(completo, " ");
strcat(completo, sobrenome);
cout << "Nome completo é " << completo << endl;
return 0;
}
#include <iostream>
using namespace std; #include <iostream>
#include <string>
int main(int argc, char *argv[]) { using namespace std;
char frase[128];
short int i, vogais; int main(int argc, char *argv[]) {
cout << "Digite uma frase:" << '\n'; string frase;
cin.getline(frase, 128); size_t pos, vogais;
i = 0; cout << "Digite uma frase:" << '\n';
vogais = 0; getline(cin, frase);
while( frase[i] != '\0') { pos = 0;
if( frase[i] == 'a' || frase[i] == 'e' || vogais = 0;
frase[i] == 'i' || frase[i] == 'o' || do {
frase[i] == 'u' || frase[i] == 'A' || pos = frase.find_first_of("aeiouAEIOU", pos);
frase[i] == 'E' || frase[i] == 'I' || if ( pos != string::npos ) {
frase[i] == 'O' || frase[i] == 'U') { vogais++;
vogais = vogais + 1; pos++;
} }
i = i+1; } while( pos != string::npos );
} cout << "Há " << vogais << " vogais na frase.\n";
cout << "Há " << vogais << " vogais na frase.\n"; return 0;
return 0; }
}
Exemplo de strings: imprimir as palavras de uma frase em linhas separadas [Ad12, pág. 329]
#include <iostream>
#include <iostream>
#include <cstring> // strcpy
#include <algorithm>
#include <algorithm> // replace
#include <string>
using namespace std;
using namespace std;
int main(int argc, char *argv[]) {
int main() {
const int N = 128;
string frase1, frase2; // Frase
char frase1[N], frase2[N];
int pos; // Posição dos espaços
short int i = 0;
// Lê a frase
cout << "Digite uma frase:\n";
cout << "Entre com uma frase:\n";
cin.getline(frase1, N);
getline(cin, frase1);
strcpy(frase2, frase1); // frase1 recebe frase2
// Copia frase1 para frase2
// Método 1
frase2 = frase1;
while( frase1[i] != '\0' ) {
// Separa palavras em linhas distintas
if( frase1[i] == ' ' ) {
do {
frase1[i] = '\n';
pos = frase1.find(" ");
}
if (pos != string::npos) { frase1.replace(pos, 1, "\n"); }
i = i+1;
} while(pos != string::npos);
}
cout << "Método 1\n" << frase1 << '\n';
cout << "Método 1\n" << frase1 << '\n';
// Separa palavras em linhas distintas
// Método 2
replace(frase2.begin(), frase2.end(), ' ', '\n');
replace(frase2, frase2+N, ' ', '\n');
cout << "Método 2\n" << frase2 << '\n';
cout << "Método 2\n" << frase2 << '\n';
return 0;
return 0;
}
}
Tarcisio F. Maciel (UFC) Introdução à Programação 5 de junho de 2017 253 / 348
Parte VII
Conteúdo
Conteúdo
Registros Ü struct
O alcance das estruturas de dados homogêneas termina quando dados de diferentes tipos
precisam ser agregados em uma mesma entidade
É simples encontrar exemplos onde dados de diferentes naturezas precisam ser agregados
Dados de um veículo: marca (string), ano (int), etc.
Dados de uma pessoa: nome (string), altura (float), etc.
Quando dados de diferentes naturezas precisam ser agregados, estruturas de dados heterogêneas
tornam-se necessárias
Registros são estruturas heterogêneas compostas por campos e cada campo pode ser de um tipo
diferente
Uma estrutura ou registro é considerado um novo tipo de dados composto a partir dos tipos de
dados primitivos
Conteúdo
Registros Ü struct
Conteúdo
Conteúdo
A palavra-chave typedef é usada para definir novos nomes para No exemplo com registro, a estrutura com campos
um dado tipo marca e ano descritos é denominada “Carro”
typedef não cria um novo tipo de dados, apenas um apelido Uma vez definidos, os novos tipos podem ser
para um tipo existente de dados utilizados para declarar variáveis
Conteúdo
Vetores de registros
#include <iostream>
Vetores de registros Ü solução para #include <string>
#include <iomanip>
coleção de dados using namespace std;
typedef struct {
Considere um programa que gerencia string nome;
unsigned int matricula;
os nomes, matrículas, médias e float media, freq;
} Aluno;
frequências de uma turma de N int main(int argc, char *argv[]) {
const unsigned short N = 60;
alunos Aluno turma[N]; // Vetor de N alunos
for(unsigned short i = 0; i < N; i++) { // Lê os dados dos alunos
cout << "Aluno " << setw(2) << setfill('0') << i+1 << endl;
Uma estrutura poderia ser usada para cout << "Nome: ";
descrever cada aluno e um vetor de N getline(cin, turma[i].nome); // O nome pode ter espaços
cout << "Matricula: ";
posições descreveria uma turma cin >> turma[i].matricula;
cout << "Média: ";
cin >> turma[i].media;
cout << "Frequência: ";
cin >> turma[i].freq;
cin.ignore(); // Ignora nova linha do último cin
}
// ... Restante do programa omitido
return 0;
}
Conteúdo
#include <iostream>
using namespace std;
// Ordenação
pInicio = &(TurmaA[0]);
typedef struct {
pFim = &(TurmaA[N-1]);
unsigned int mat;
while(pFim != pInicio) {
float IRA;
pA1 = pInicio;
} Aluno;
pB = pInicio;
while(pA1 < pFim) {
void troca(Aluno *pA, Aluno *pB) {
pA2 = pA1+1;
Aluno Aux;
if(pA1->IRA < pA2->IRA) {
Aux = *pA;
troca(pA1, pA2);
*pA = *pB;
pB = pA2;
*pB = Aux;
}
}
pA1 = pA1 + 1;
}
int main(int argc, char *argv[]) {
pFim = pB;
const unsigned short N = 60;
}
Aluno TurmaA[N];
// Impressão
Aluno *pA1, *pA2, *pB, *pInicio, *pFim;
for(n = 0; n < N; n++) {
unsigned short n;
cout << "Matricula " << n+1 << ":"
// Leitura de dados
<< TurmaA[n].mat << endl;
for(n = 0; n < N; n++) {
cout << "IRA " << n+1 << ":"
cout << "Matricula " << n+1 << ":";
<< TurmaA[n].IRA << endl;
cin >> TurmaA[n].mat;
}
cout << "IRA " << n+1 << ":";
return 0;
cin >> TurmaA[n].IRA;
}
}
// ...
Conteúdo
Conteúdo
x Tipo: int
10 Valor
0xEF0F Endereço de Memória
Ponteiros
Ponteiros são um tipo especial de variável que não armazenam dados diretamente como as
variáveis convencionais, mas sim o endereço de memória de uma outra variável
Por esse motivo, diz-se que um ponteiro “aponta” para uma variável
Ponteiros são uma parte essencial da programação em C/C++
Entre as maiores aplicações de ponteiros em C/C++ tem-se
Alocação dinâmica de blocos de memória
Passagem de parâmetros por referência para funções
Ações básicas relativas a ponteiros incluem
Declarar um ponteiro
Atribuir um valor a um ponteiro (apontar o ponteiro para uma variável)
Atribuir um valor à variável apontada pelo ponteiro
Declaração de ponteiros
EF0Fh
p1 (F001h) A (CF0Ah)
p2 (F005h)
p3 (F009h) B (EF0Eh)
13
p1 (F001h) A (CF0Ah)
CF0Ah
p2 (F005h)
p3 (F009h) B (EF0Eh)
13
p1 (F001h) A (CF0Ah)
CF0Ah
p2 (F005h)
CF0Ah
p3 (F009h) B (EF0Eh)
13
p1 (F001h) A (CF0Ah)
CF0Ah
p2 (F005h)
CF0Ah
p3 (F009h) B (EF0Eh)
EF0Eh 13
Ponteiros podem ser usados como “apelidos” para as variáveis para as quais apontam
Pode-se alterar indiretamente o valor da variável apontada utilizando o ponteiro
Esse segundo tipo de atribuição usado com ponteiros utiliza o operador conteúdo *
O operador conteúdo não dever ser confundido com:
O operador multiplicação * Ü requer dois fatores, e.g., a = b * c
O * usado apenas na declaração de ponteiros Ü int *p;
Atribuição de conteúdo
int A; // Variável inteira
int *p; // Ponteiro para inteiro
p = &A; // Armazena o endereço de A em p
*p = 10; // Conteúdo de p recebe 10, ou seja, A recebe 10
cout << "A = " << A; // Imprime a mensagem A = 10
CF0Ah CF0Ah 10
Conteúdo
#include <iostream>
using namespace std;
void troca(int *pA, int *pB) {
int aux; // Variável auxiliar
aux = *pA; // Salva conteúdo de pA em aux
*pA = *pB; // Cópia o conteúdo de pB p/ pA void troca(int *pA, int *pB)
*pB = aux; // Cópia aux p/ o conteúdo de pB
} int *pA int *pB
int main(int argc, char *argv[]) {
int A, B, C;
cout << "Digite A: ";
cin >> A;
cout << "Digite B: ";
cin >> B; int main()
cout << "Digite C: ";
int A int B
cin >> C;
if (A > B) { troca(&A, &B); }
if (B > C) { troca(&B, &C); }
cout << A << " " << B << " " << C;
return 0;
}
Generalização de funções
Generalização de funções
Máximo: v ∈ RN Mínimo: v ∈ RN
// Ponteiro p/ o vetor e seu tamanho N // Ponteiro p/ o vetor e seu tamanho N
float maximo(float *v, float minimo(float *v,
unsigned short N) unsigned short N)
{ {
float M = 0.0; float M = 0.0;
unsigned short n; unsigned short n;
if (N > 0) { if (N > 0) {
M = v[0]; M = v[0];
for(n = 1; n < N; n++) { for(n = 1; n < N; n++) {
if ( v[n] > M ) { M = v[n]; } if ( v[n] < M ) { M = v[n]; }
} }
} else { } else {
cout << "Tamanho inválido\n"; cout << "Tamanho inválido\n";
} }
return M; return M;
} }
Conteúdo
Para chamar um programa pela linha de comando Ü nome do programa, possivelmente seguido de
argumentos
C:\Teste.cpp C:\Fatorial.c
#include <iostream> #include <iostream>
using namespace std; using namespace std;
int main(int argc, char *argv[]) { int main(int argc, char *argv[])
int i; {
cout << "# de argumentos:" << argc << endl; int n, N, F = 1;
for(i = 0; i < argc; i++) { N = atoi(argv[1]);
cout << "Argumento " << i << argv[i] << endl; for(n = 2; n <= N; n++) {
} F = F * n;
return 0; }
} cout << N << "! = " << F;
return 0;
Chamada de C:\Teste.exe }
C:\>Teste Valor1 Valor2 Valor3
# de argumentos: 4 Chamada de C:\Fatorial.exe
Argumento 0: C:\Teste.exe C:\>Fatorial 6
Argumento 1: Valor1 6! = 720
Argumento 2: Valor1
Argumento 3: Valor3
Conteúdo
Nome → idade
idade (EF0Ah)
Vínculo estático
Memória → EF0Fh
int *p;
int *p = NULL;
p = new int;
delete p;
p = NULL;
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
// Ponteiro para inteiro
int *p = NULL;
// Aloca sizeof(int) bytes de memória
// e faz p apontar para essa memória
p = new int;
Conteúdo
Aritmética de ponteiros
Manipulação de arquivos
Conteúdo
14 Arquivos
Armazenamento não-persistente × persistente
Modos e ações básicas para manipulação de arquivos
Abertura e fechamento de arquivos
Leitura/escrita em modo texto: operadores de inserção e extração
Outras funções para arquivos
Leitura/escrita em modo binário: write e read
Conteúdo
14 Arquivos
Armazenamento não-persistente × persistente
Modos e ações básicas para manipulação de arquivos
Abertura e fechamento de arquivos
Leitura/escrita em modo texto: operadores de inserção e extração
Outras funções para arquivos
Leitura/escrita em modo binário: write e read
Armazenamento não-persistente
Dados não-persistentes são esquecidos tão logo não sejam mais necessários
Computador Ü quando é desligado
Programa na RAM Ü quando é finalizado
Usado para dados voláteis, intermediários, de interesse momentâneo
Normalmente realizado na RAM do computador
Armazenamento persistente
Dados persistentes são armazenados de modo a serem recuperados num momento futuro
Armazenamento feito pelo SO em um sistema de arquivos com unidades, pastas e arquivos para organização
hierárquica dos dados
Usado para dados de maior interesse que podem ser recuperados do local onde foram armazenados e utilizados
novamente
Memórias de armazenamento persistente Ü discos rígidos, DVDs, pendrives, etc.
Conteúdo
14 Arquivos
Armazenamento não-persistente × persistente
Modos e ações básicas para manipulação de arquivos
Abertura e fechamento de arquivos
Leitura/escrita em modo texto: operadores de inserção e extração
Outras funções para arquivos
Leitura/escrita em modo binário: write e read
Conteúdo
14 Arquivos
Armazenamento não-persistente × persistente
Modos e ações básicas para manipulação de arquivos
Abertura e fechamento de arquivos
Leitura/escrita em modo texto: operadores de inserção e extração
Outras funções para arquivos
Leitura/escrita em modo binário: write e read
Arquivos são representados por variáveis do tipo ofstream (escrita) ou ifstream (leitura) Ü requer
#include <fstream>
Também é possível utilizar o tipo fstream
Arquivos são abertos e fechados usando os métodos open e close
É uma boa prática usar o método is_open() para determinar se o arquivo foi aberto com sucesso
Abertura de arquivos
Cód. Funcionalidade
ios::in Abre o arquivo para leitura (padrão para ifstream)
ios::out Abre o arquivo para escrita (padrão para ofstream)
ios::binary Abrir em modo binário
ios::ate Seta a posição inicial para o final do arquivo (quando não fornecido a posição inicial é
o começo do arquivo)
ios::app Abrir para anexação no final do arquivo (append)
ios::trunc Se o arquivo for aberto para escrita e ele já existe, o conteúdo anterior é substituído
pelo novo (default)
Abertura de arquivos
Cód. Funcionalidade
ios::in Abre o arquivo para leitura (padrão para ifstream)
ios::out Abre o arquivo para escrita (padrão para ofstream)
ios::binary Abrir em modo binário
ios::ate Seta a posição inicial para o final do arquivo (quando não fornecido a posição inicial é
o começo do arquivo)
ios::app Abrir para anexação no final do arquivo (append)
ios::trunc Se o arquivo for aberto para escrita e ele já existe, o conteúdo anterior é substituído
pelo novo (default)
Abertura de arquivos
Combinando as flags para abertura de arquivo
As flags para abertura de arquivo podem ser combinadas utilizando o operador “|” (Ou Bit-a-Bit).
Ex: myfile.open("arquivo.txt", ios::out | ios::app)
Nem todas as combinações fazem sentido
Abertura de arquivos
Combinando as flags para abertura de arquivo
As flags para abertura de arquivo podem ser combinadas utilizando o operador “|” (Ou Bit-a-Bit).
Ex: myfile.open("arquivo.txt", ios::out | ios::app)
Nem todas as combinações fazem sentido
Conteúdo
14 Arquivos
Armazenamento não-persistente × persistente
Modos e ações básicas para manipulação de arquivos
Abertura e fechamento de arquivos
Leitura/escrita em modo texto: operadores de inserção e extração
Outras funções para arquivos
Leitura/escrita em modo binário: write e read
Para escrever em um arquivo aberto no modo texto usamos o operador de inserção << exatamente
da mesma forma que imprimimos algo na tela
return 0;
}
Em modo texto, a leitura de arquivos pode ser feita o operador de extração >> exatamente da
mesma forma que recebemos um valor do teclado
Código para ler o arquivo de texto
Conteúdo de alunos.txt
#include <iostream>
#include <fstream> 433428
#include <string> Sr. Davi Lucas Castro
using namespace std; 683428
int main(int argc, char *argv[]) { Ana Julia Cunha
ifstream myfile; 126507
myfile.open("alunos.txt"); Bárbara Rocha
string nome; 437844
unsigned int matricula; Ana Carolina Santos
if (myfile.is_open()) { 954891
while(!myfile.eof()) { // Repete até o fim do arquivo Luana Barbosa
myfile >> matricula;
myfile.ignore(10000, '\n'); // Ignora até o \n
getline(myfile, nome);
cout << "Matrícula: " << matricula
Saída do programa
<< " - Aluno: " << nome << endl; Matrícula: 433428 - Aluno: Sr. Davi Lucas Castro
} Matrícula: 683428 - Aluno: Ana Julia Cunha
} Matrícula: 126507 - Aluno: Bárbara Rocha
myfile.close(); Matrícula: 437844 - Aluno: Ana Carolina Santos
return 0; Matrícula: 954891 - Aluno: Luana Barbosa
}
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char *argv[]) {
ifstream myfile_in;
ofstream myfile_out;
myfile_in.open("arquivo.txt"); // Arquivo para leitura
myfile_out.open("arquivo2.txt"); // Arquivo para saída
string linha;
if (myfile_in.is_open() && myfile_out.is_open()) {
while (!myfile_in.eof()) {
getline(myfile_in, linha); // Lemos uma linha por vez com o getline
myfile_out << linha << "\n"; // Acrescentamos o \n que o getline ignorou
}
}
myfile_in.close();
myfile_out.close();
return 0;
}
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char *argv[]) {
ifstream myfile_in;
ofstream myfile_out;
myfile_in.open("arquivo.txt", ios::binary); // Arquivo para leitura
myfile_out.open("arquivo2.txt", ios::binary); // Arquivo para saída
char c;
if (myfile_in.is_open() && myfile_out.is_open()) {
while (!myfile_in.eof()) {
myfile_in.get(c); // Lemos um caractere de cada vez
if (c == 'r') { myfile_out.put('l'); } // Substitui 'r' por 'l'
else if(c == 'R') { myfile_out.put('L'); } // Substitui 'R' por 'L'
else { myfile_out.put(c); } // Não muda demais caracteres
}
}
myfile_in.close();
myfile_out.close();
return 0;
}
Conteúdo
14 Arquivos
Armazenamento não-persistente × persistente
Modos e ações básicas para manipulação de arquivos
Abertura e fechamento de arquivos
Leitura/escrita em modo texto: operadores de inserção e extração
Outras funções para arquivos
Leitura/escrita em modo binário: write e read
Método Ação
myfile.is_open() Retorna verdadeiro se o arquivo estiver aberto
myfile.eof() Retorna verdadeiro se atingiu o fim do arquivo
myfile.seekg(n) Muda a posição no arquivo para o n-ésimo byte
myfile.seekg(n, ios::cur) Muda a posição para n bytes para frente
myfile.seekg(-n, ios::end) Muda a posição para n bytes de traz para frente
myfile.seekp(n) Muda a posição no arquivo para o n-ésimo byte
myfile.seekp(n, ios::cur) Muda a posição para n bytes para frente
myfile.seekp(-n, ios::end) Muda a posição para n bytes de traz para frente
myfile.tellg(...) Pega a posição atual no arquivo
myfile.tellp(...) Pega a posição atual no arquivo
Conteúdo
14 Arquivos
Armazenamento não-persistente × persistente
Modos e ações básicas para manipulação de arquivos
Abertura e fechamento de arquivos
Leitura/escrita em modo texto: operadores de inserção e extração
Outras funções para arquivos
Leitura/escrita em modo binário: write e read
O padrão ID3v1 surgiu em 1996 para permitir gravar algumas informações sobre uma música no
próprio arquivo de música
A tag ID3v1 ocupa os últimos 128 bytes do arquivo de música
Código
#include <iostream>
#include <fstream>
using namespace std;
string le_o_campo(ifstream& arquivo, int tamanho) {
char *buffer = new char[tamanho];
arquivo.read(buffer, tamanho);
string out(buffer); // Cria uma string com o conteúdo do buffer
delete [] buffer; // Deleta o buffer e evitar vazamento de memória
return out; Saída
}
int main(int argc, char *argv[]) { TAG: TAG
const int TAG=3, TITLE=30,ARTIST=30,ALBUM=30,YEAR=4; Título: Bizarre Love Triangle
ifstream myfile;
myfile.open("06 - Bizarre Love Triangle.mp3", ios::binary); Artista: New Order
char buffer[31]; //Buffer para ler o cabeçalho do arquivo Álbum: (The Best of) New Order
if (myfile.is_open()) { Ano: 1995
myfile.seekg(-128, ios::end);
cout << "TAG: " << le_o_campo(myfile, TAG) << endl;
cout << "Título: " << le_o_campo(myfile, TITLE) << endl;
cout << "Artista: " << le_o_campo(myfile, ARTIST) << endl;
cout << "Álbum: " << le_o_campo(myfile, ALBUM) << endl;
cout << "Ano: " << le_o_campo(myfile, YEAR) << endl;
}
myfile.close();
return 0;
}
Histórico do computador
Conteúdo
16 Bibliografia
Conteúdo
16 Bibliografia
Ábaco
Ábaco
Ábaco
Ábaco
Ábaco
Ossos de Napier
Ossos de Napier
Ossos de Napier
Ossos de Napier
Ossos de Napier
Conteúdo
16 Bibliografia
Primeiras calculadoras
Pascaline
O primeiro computador
1822-1835 – Charles Babbage (inglês) projeta a máquina diferencial, a qual aperfeiçoou posteriormente para a máquina analítica, a
ancestral dos computadores modernos
A máquina diferencial era composta por discos giratórios operados por manivela
A máquina analítica poderia ser programada utilizando cartões perfurados (utilizados em 1801 por Joseph-Marie Jacquard para tecer
padrões em seu tear), uma ideia desenvolvida por Ada Augusta Byron entre 1842-1843
Máquina diferencial
Máquina analítica
Tabuladora de Hollerith
1889 – Hermann Hollerith inspirou-se nos cartões perfurados de Jacquard para construir sua máquina tabuladora, a qual foi utilizada
para processar os dados do censo dos EUA de 1880 em 6 meses (em vez dos 10 anos previstos)
1896 – Hollerith funda a Tabulating Machine Company, a futura International Business Machines (IBM) de 1924
Z1, Z2 e Z3
1936-1941 – Konrad Zuse (alemão), que não conhecia o trabalho de Babbage, construiu o computador eletromecânico Z1 programado
utilizando cartões perfurados
O Z1 foi inicialmente utilizado para cálculos de aerostática
O Z2 foi construído utilizando relés telefônicos e foi utilizado em projetos aerodinâmicos
O Z3 foi construído empregando álgebra booleana (desenvolvida em 1854 por George Boole), o primeiro computador eletromecânico
digital, funcional e programável
Z1 Z3
Mark I
1937-1944 – Howard Aiken constrói em Harvard o computador Mark I, também chamado IBM Automatic Sequence Controlled Calculator
(ASCC), o qual foi inspirado na máquina analítica de Babbage
Media aproximadamente 16 × 2,5 m2 e pesava cerca de 5 toneladas
Conteúdo
16 Bibliografia
1943 – O computador Colossus baseado em válvulas (criadas por John A. Fleming em 1904) é
construído por Alan Turing, Tommy Flowers e Maximilian Hermann Alexander Newman em
Bletchey Park, Inglaterra, sendo considerado o primeiro computador eletrônico
Utilizado durante a 2a Guerra Mundial no auxílio à quebra de mensagens criptografadas pela
Enigma alemã
1948 – Primeiro computador com programa armazenado eletronicamente, um conceito introduzido por John von Neumann
Levou a mais de 30 patentes com ideias aplicadas a futuros computadores
Usava programas armazenados em uma memória de tambor magnético (inventado por Gustav Tauschek em 1932)
1952 – IBM 701 (Defense Calculator): primeiro computador de grande porte da IBM e que foi usado pela marinha americana
1953 – IBM 650, (Magnetic Drum Calculator): primeiro computador produzido em massa, possuía um tambor de memória
1953 – IBM 704: primeiro computador com hardware para aritmética de ponto flutuante e para o qual a linguagem FORTRAN (FORmula
TRANslator) foi desenvolvida por John Backus em 1957
1958 – IBM 709: o último computador a válvula da IBM
Magnetic Drum
IBM 701 IBM 650
Conteúdo
16 Bibliografia
1958 – Primeiros protótipos dos Circuitos Integrados (CIs) são produzidos na Texas Instruments,
por Jack Kilby, e na Fairchild Semiconductor, por Robert Noyce
1960 – A Digital Equipment Corp. (DEC), fundada em 1958, introduz o PDP-1, o primeiro
computador comercial com monitor e teclado (periféricos)
1961 – IBM 7030, cerca de 30 vezes mais rápido que o 704, é lançado e torna-se o precussor da
supercomputação
1964 – Control Data Corp. introduz o CDC6600, de 9 Megaflops e projetado por Seymour Cray, e
requer o título de construção do primeiro supercomputador de sucesso
Conteúdo
16 Bibliografia
Computadores pessoais
Altair 8800
1975 – Surge o primeiro computador pessoal, o Altair 8800, equipado com o Intel 8080 Apple I
e programado utilizando a linguagem BASIC (Beginners All-purpose Symbolic
Instruction Code), criada por John Kemeny e Thomas Kurtz em 1964
1976 – Steve Jobs e Steve Wozniak projetam e constroem o Apple I, que era
basicamente uma placa de circuito
Apple II
1977 – Steve Jobs e Steve Wozniak fundam a Apple Computer e o Apple II é anunciado
na primavera do mesmo ano
1981 – O IBM PC de arquitetura aberta é lançado sinalizando o início da “computação
de mesa”
Conteúdo
16 Bibliografia
Bibliografia (1)
[Ad12] ——, Fundamentos da programação de computadores: algoritmos, Pascal, C/C++ e Java, 3rd ed. Prentice Hall,
2012.
[AdMGadCL94] Ângelo de Moura Guimarães and N. A. de Castilho Lages, Algoritmos e estruturas de dados, 31st ed. Livros
Técnicos e Científicos, 1994.
[Bre08] B. B. Brey, The Intel microprocessors, 8th ed. Prentice Hall, Jun. 2008.
[DD10] P. Deitel and H. Deitel, C how to program, 6th ed. Prentice Hall, 2010.
[DD12] ——, C++ how to program, 8th ed. Prentice Hall, 2012.
[dSGSC08] M. A. F. de Souza, M. M. Gomes, M. V. Soares, and R. Concilio, Algoritmos e lógica de programação, 1st ed.
Cengage Learning, 2008.
[Eck00] B. Eckel, Thinking in C++: introduction to standard C++, 2nd ed. Prentice Hall, 2000, vol. 1.
[Eck03] ——, Thinking in C++: practical programming, 2nd ed. Prentice Hall, 2003, vol. 2.
[KR88] B. W. Kernighan and D. M. Ritchie, The C programming language, 2nd ed. Prentice Hall, Apr. 1988.
Bibliografia (2)
[Str13] B. Stroustrup, The C++ programming language, 4th ed. Addison-Wesley Professional, May 2013.
[TW06] A. S. Tanenbaum and A. S. Woodhull, Operating systems: design and implementation, 3rd ed. Prentice Hall, Jan.
2006.