Anda di halaman 1dari 52

Introduo s Linguagens C e C++

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

Orientada a Objetos Permite programao procedural

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++)

Uso em Embarcados e Mveis


C++ enfrentou resistncia por parte de alguns desenvolvedores para uso nesses sistemas

Alegavam desde uma suposta lentido at gerao de grande quantidade de cdigo binrio

O principal argumento favorvel


Tudo que C pode fazer, C++ pode fazer igual ou melhor

Caractersticas
C++ importante em programao de dispositivos mveis

SymbianOS, Qt

Usada em ambientes MS .NET

Windows Mobile

Importante em desenvolvimento de middlewares embarcados

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>

int main(int argc, char **argv) { printf("Relu urdi\n"); return 0; }

C
Exemplo mnimo
Cabealho
#include <stdio.h>

Funo de sada

int main(int argc, char **argv) { printf("Relu urdi\n"); return 0; }

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

#include <iostream> using namespace std;

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;

Cabealho Ambiente De Nomes

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

Para ser atribudo a uma varivel, um valor deve ser compatvel


int x; x = "2.0"; // Erro

Modificador const (c++)


Torna o valor imutvel

C++
Operadores

+, -, /, *, % (mdulo) ++
int a = 3, b = 3; int x = a++; // x <- 3 int y = ++b; // y <- 4

+=, *=, /= <<, >> (uso em streams) - C++


cin >> c; // L a entrada cout << "Voc digitou " << c;

C++
Operadores

<, >, <=, >= ==, !=, !

Casts

Usados para converso entre tipos primitivos


int a = 3, b = 3; double c = 1.2; a = (int) c; // a <- 1 cout << a << endl; a = int(c); // a <- 1 cout << a << endl;

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

for (comando inicial; condio; passo)


for (int x = 1; x <= 10; x++) {

cout << x << endl;

while (condio) / do while (condio)


int x = 1; while (x <= 10) cout << x++ << endl; int x = 1; do cout << x++ << endl; while(x <= 10);

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++

#warning e #error #ifdef, #ifndef, #else, #endif


Compilao condicional

#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

O formato de uma funo


valor_de_retorno nome (lista_de_parametros) { declaraes e comandos }

Exemplo
int quadrado(int x) { return x * x; }

Funes
Recursividade

Capacidade de uma funo chamar a si prpria

Assinatura

Combinao de valor de retorno e quantidade/tipo de parmetros

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

Por valor Por referncia (C++)


#include <iostream> using namespace std; void f(int &x) { x++; } int main() { int i = 0; f(i); cout << i << endl; return 0; }

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

Arquivos de cabealho (.h)

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

%.o: %.cpp g++ -c $< -o $@ clean: rm -rf bin $(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

int *pI = 0; int i = 20; pI = &i;

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; }

Adio de ponteiros uma operao dependente de mquina

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

No permite operaes de adio/subtrao

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 C++


Utilizam-se as palavras reservadas new e delete
#include <iostream> using namespace std; int main() { int *i; i = new int; *i = 5; cout << *i; delete i; return 0; }

Alocao dinmica C++


Utilizam-se as palavras reservadas new e delete
#include <iostream> using namespace std; int main() { int *i; i = new int[20]; for (int x = 0; x < 20; x++) { i[x] = x; } for (int x = 0; x < 20; x++) { cout << i[x] << endl;; } delete []i; return 0; }

Alocao dinmica
Importante...

MEMRIA ALOCADA DINAMICAMENTE PERMANECE ALOCADA AT SER EXPLICITAMENTE REMOVIDA!!!

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; }

Anda mungkin juga menyukai