Histrico C
Criada em 1972 por Dennis M. Ritchie Recebeu esse nome por conter caractersticas de uma linguagem chamada B Criada para facilitar a escrita do UNIX, ento escrito em Assembly Gera cdigo executvel pequeno, rpido e de baixo consumo de memria
Histrico C++
Foi criada na dcada de 1980 por Bjarne Stroutrup uma evoluo da linguagem C, embora contenha elementos das linguagens BCPL, Simula-67 e Algol68 Inicialmente era apenas um C com Classes, at ganhar ganhar extenses que lhe conferiram o status de nova linguagem Padronizada em 1991 (ANSI)
Caractersticas
Fortemente tipada Foco em simplicidade
Ausncia de tipos complexos, como matrizes e strings Flexibilidade para permitir ao programador a criao de tipos to complexos quanto se queira
Caractersticas
Foco em eficincia no baixo nvel
Permite programao de sistemas operacionais, interao com hardware, controladores de dispositivos e sistemas com restries de tempo real Permite codificao de sistemas de mais alto nvel, como sistemas de interface com o usurio
GTK+ (C) Qt (C++)
Alegavam desde uma suposta lentido at gerao de grande quantidade de cdigo binrio
Caractersticas
C++ importante em programao de dispositivos mveis
SymbianOS, Qt
Windows Mobile
Ginga-J
Cross-compiling
Tcnica que permite que uma compilador rodado em determinada arquitetura gere cdigo de uma outra
Ex: compilador g++ no Linux x86 gerando cdigo para Linux ARM
C
Exemplo mnimo
#include <stdio.h>
C
Exemplo mnimo
Cabealho
#include <stdio.h>
Funo de sada
C
Exemplo mnimo
#include <stdio.h> int main(int argc, char **argv) { int c; scanf(%d, &c) printf("Voc digitou %d\n", c); return 0; }
C
Exemplo mnimo
Cabealho
#include <stdio.h> int main(int argc, char **argv) { int c; scanf(%d, &c) printf("Voc digitou %d\n", c); return 0; de }
Funo entrada
C++
Exemplo mnimo
#include <iostream> using namespace std; int main(int argc, char **argv) { cout << "Relu urdi\n"; return 0; }
C++
Exemplo mnimo
Cabealho Ambiente De Nomes
Streams
int main(int argc, char **argv) { cout << "Relu urdi\n"; return 0; }
C++
Exemplo mnimo
#include <iostream> using namespace std; int main(int argc, char **argv) { int c; cin >> c; cout << "Voc digitou " << c << "\n"; return 0; }
C++
Exemplo mnimo
#include <iostream> using namespace std;
Streams
int main(int argc, char **argv) { int c; cin >> c; cout << "Voc digitou " << c << "\n"; return 0; }
C++
Tipos Primitivos
int, float, double, long, bool, char Variveis podem ser declaradas a qualquer momento
Prtica recomendada
C++
Operadores
+, -, /, *, % (mdulo) ++
int a = 3, b = 3; int x = a++; // x <- 3 int y = ++b; // y <- 4
C++
Operadores
Casts
C++
Casts
Sempre que precisar de uma diviso com ponto flutuante, use um cast
int a = 3, b = 2; cout << (float) a/b << endl; // 1.5 cout << a/b << endl; // Imprime 1
Estruturas de Controle
Repetio
Estruturas de Controle
break
Quebra a execuo atual
continue
Salta para a prxima iterao
Estruturas de Controle
Condicionais
if / else
int a = 3, b = 2; int c; if (a > b) { c = a; } else { c = b; } cout << c << endl; // Imprime 3 int a = 3, b = 2; int c = a > b ? a : b; cout << c << endl;
Estruturas de Controle
switch / case
switch (c) { case 1: cout << "1" << endl; break; case 2: case 3: cout << "2 ou 3" << endl; break; default: cout << "Indefinido" << endl; }
Estruturas de Controle
Estruturas (struct)
#include <iostream> using namespace std; struct esfera { float raio; float peso; }; int main() { struct esfera l; l.peso = 10; return 0; }
Problema 01
Escreva um programa que
L do usurio vrias notas de alunos Imprime uma mensagem de reprovado caso a nota seja inferior a 5 Imprime uma mensagem de na final caso a nota seja inferior a 7 e superior a 5, inclusive Imprime uma mensagem de aprovado para notas superiores a 7, inclusive Pra quando for digitado um nmero negativo
Diretivas do preprocessador
Lidas antes do incio da compilao de um programa
#include #define
prefervel usar const ou inline em c++
#pragma
Dependente de implementao
Funes
Soluo
float nota; cout << "Nota: "; cin >> nota; while (nota > 0) { if (nota < 5) cout << "reprovado" << endl; else if (nota >= 5 && nota < 7) cout << "final" << endl; else cout << "aprovado" << endl; cout << "Nota: "; cin >> nota; }
Funes
Imprescindveis para modularizar o desenvolvimento de um grande sistema
Programao procedural
Exemplo
int quadrado(int x) { return x * x; }
Funes
Recursividade
Assinatura
Sobrecarga de funes
Duas funes podem ter o mesmo nome, desde que difiram em sua assinatura.
Funes
Sobrecarga de funes (c++)
int quadrado(int x) { return x * x; } float quadrado(float x) { return x * x; } int main(int argc, char **argv) { int x = 2; cout << quadrado(x) << endl; float y = 2; cout << quadrado(y) << endl; return 0; }
Funes
Funes inline (c++)
Indicada para pequenas funes muito invocadas, de modo a reduzir o overhead de chamada Evitam o uso de #define para prototipagem de funes, o que no aconselhvel
inline int quadrado(int x) { return x * x; }
Funes
Passagem de parmetros
Funes
Muitas funes esto predefinidas nas bibliotecas padro de C++ Prottipos
Nenhuma funo pode ser chamada antes que o compilador possa conhecer sua declarao ou seu prottipo
Permite que sejam colocados colees de prottipos de funes Permite compilao incremental
Funes
Exemplo de cabealho
#ifndef CABECALHO_H #define CABECALHO_H int prototipo(); void prototipo2(); float pototipo3(); #endif
Funes
Exemplo de Makefile
all: $(EXE) SRCDIR=src BINDIR=bin $(EXE): $(OBJS) g++ -o $@
$(SRCDIR)/*.o
Problema 02
Crie em arquivo separado do arquivo principal, uma funo recursiva que avalie o fatorial de um nmero informado pelo usurio
Problema 03
Crie em arquivo separado do aquivo principal, funo calcula, que recebe trs parmetros, os 2 primeiros numricos, e o terceiro um caracter, que pode ser '+', '-', '/' e '*' executando e devolvendo o clculo adequado.
Problema 03
Resoluo
float calcula (float x, float y, char op) { switch (op) { case '+': return x + y; case '-': return x - y; case '*': return x * y; case '/': return x / y; } }
Arrays
Grupo de posies de memria consecutivas, todas de mesmo nome e tipo
int v[12]; int vc[3] = {4, 5, 6}; char ch[] = "Um teste"; cout << vc[0] << endl;
Arrays multidimensionais
int p[3][2] = { {0, 1}, {0, 2}, {0, 3} }; cout << p[2][1] << endl;
Arrays
Arrays como argumentos de funes
void imprime (int p[], int tamanho) { for (int i = 0; i < tamanho; i++) cout << "Posio " << i << "=" << p[i] << endl; } int vc[3] = {4, 5, 6}; imprime (vc, sizeof(vc) / sizeof(int)); void imprimeMatriz(int matriz[3][2]) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) cout << matriz[i][j] << ' '; cout << endl; } }
Ponteiros
Variveis que contm endereos de memria
O tamanho de um ponteiro dependente da arquitetura da mquina Alguns tipos de operaes podem ser executadas sobre ponteiros (++, --, +=, -=)
Ponteiros
Deve-se tomar muito cuidado com o uso de ponteiros
Um ponteiro no necessariamente aponta para um endereo vlido NULL ou 0 podem atribudos a qualquer apontador, a qualquer momento, e significa que o ponteiro no est em uso IMPORTANTE: a declarao de um ponteiro no faz apontar para 0 IMPORTANTE: A atribuio de um ponteiro a NULL/0 no remove memria alocada
Ponteiros
Um ponteiro pode ser usado para se referir a um array
void imprimePtr (int *p, int tamanho) { for (int i = 0; i < tamanho; i++) cout << "Posio " << i << "=" << p[i] << endl; }
O uso de ponteiros possibilita uma maior flexibilidade no uso de arrays multidimensionais para funes
Ponteiros
Verso do determinante com ponteiros int }
determinantePtr(int **matriz) { return (matriz[0][0] * matriz[1][1]) (matriz[0][1] * matriz[1][0]);
Outra forma
int determinantePtr(int *matriz[]) { return (matriz[0][0] * matriz[1][1]) (matriz[0][1] * matriz[1][0]); }
Ponteiros
Ponteiros como parmetros ajudaram linguagem C a contornar o problema de ausncia de passagem de valores por referncia Ponteiros void* so genricos e podem apontar para qualquer tipo de varivel ou estrutura
Alocao dinmica C
Utiliza-se o par de funes malloc/free Malloc retorna sempre um ponteiro tipo void*
#include <stdio.h> #include <stdlib.h> int main() { int *i; i = (int*)malloc(sizeof(int)); i = 4; printf("%d\n", *i); free(i); }
Alocao dinmica
Importante...
Problema 04
Crie e teste uma funo somaDiagonal que retorne a soma da diagonal principal de uma matriz quadrada (de valores inteiros) de tamanho arbitrrio
Soluo
Soluo
int somaDiagonal(int **matriz, int tamanho) { int x = 0; for (int i = 0; i < tamanho; i++) x += matriz[i][i]; return x; }