AULA 2 - Programação II - Graduação

De IFSC
Revisão de 17h28min de 26 de julho de 2017 por imported>Fargoud (→‎Vetores:)
Ir para navegação Ir para pesquisar

Revisão sobre tipos de Dados em C

  • Tipos Simples de Dados : Caracteres, Inteiros, Reais, Ponteiros e “Vazio”, etc.
  • Tipos Complexos de Dados: Vetores, Matrizes, Estruturas, Uniões, Conjuntos e Classes.
As classes vieram para substituir as estruturas, em C/C++!

Tipo caractere (CHAR):

Ocupa 1 byte (Tabela ASCII – 256 caracteres).

Pode também assumir valores entre 0 e 255 (unsigned char) ou entre –128 a 127.

Declaração:

char c; ou char c, letra, var2; 

Definição:

usando aspas simples. Exs:

c = ‘A’;    ou     c = 65;  //ou ainda char c = ‘A’;

As linguagens C/C++ tratam caracteres pelo seu símbolo ou pelo seu código, indiscriminadamente!

CARACTERES ESPECIAIS (C/C++):

\n		Nova linha (Enter)
\t			Tabulação 
\b		Retrocesso (Backspace)
\f		Salta página de formulário 
\a		Beep do alto-falante do micro
\r		Retorno de carro (Home)
\\		Imprime a barra invertida
\0		Caractere nulo
\’		Imprime as aspas simples
\”		Imprime as aspas duplas
\xddd 	        Lê ‘ddd’ como número na base hexa

Tipo inteiro (INT):

Ocupa 2 a 4 bytes (long int);

Pode assumir os valores:

int			-32.768 a 32.767
unsigned int		0 a 65.535
long int		-2.147.483.648 a 2.147.483.647
unsigned long		0 a 4.294.967.295

Declaração:

int i; ou int i, j, aviao, n_alunos; 

Definição:

elementar. Ex:

i = 23467; ou i=j=0;


Tipos reais (FLOAT e DOUBLE):

Ocupam 4 (float) e 8 bytes (double);

Podem assumir os valores:

float			3.4E-38 a 3.4E+38
double			1.7E-308 a 1.7E+308


Declaração:

float f; ou float x1, banana, varT = 2.5; ou double real_grande; 

Definição:

elementar. Ex:

 f = -34.23467; 

Tipo Vazio (VOID):

Não ocupa espaço na memória;

Não assume nenhum valor;

Basicamente é usado em C/C++ porque todo procedimento/função devolve, por default, um valor inteiro à expressão chamadora;

Quando isto for indesejado: void !

Ex:

void linha(int n)
{   for (int i=0;i<n;i++) cout << ‘*’; }

EXERCÍCIOS:

  1. Utilizando o componente Timer, fazer com que o Text de um Label seja atualizado a cada segundo, com o valor de uma variável inteira i.
  2. Implementar uma calculadora visual simples de 4 operações, utilizando números de ponto flutuante para os operandos e para o resultado (usar botões, quadro de texto e funções StrToFloat() e FloatToStr() para conversão dos dados).

Ponteiro:

Guarda o endereço de memória de outra variável.

Declaração:

Se p é um ponteiro que aponta para uma variável do tipo float:

float * p; 

Outro exemplo:

int i=1, *pi;

Definição:

utiliza-se o operador ‘&’ para acessar o endereço de uma variável. Ex:

pi = &i; 

Para acessar o conteúdo da variável apontada: utiliza-se novamente o operador ‘*’:

cout << “\nValor na variável i: “ << *pi;
*pi = 4;  // atualiza valor de i

Vetores:

Seqüências ordenadas de variáveis do mesmo tipo.

Declaração:

Se notas é um vetor de 5 elementos inteiros:

int notas [5]; 

O primeiro índice é sempre 0!

Se forem utilizados mais que 5 elementos, a linguagem C/C++ não acusa erro: sobreposição na memória!!!!!!!!!!!

Definição:

Pode ser individual... Ex:

notas[4] = 81; 

...Ou coletiva:

int notas[5] = {31, 28, 45, 20, 81};

Strings (em C):

Vetores de caracteres. Declaração: char nome [30]; Definição: Pode ser individual... Ex: nome[0] = ‘F’; ...Ou coletiva: char nome [ ] = “Fernanda”; ... Ou ainda: char nome[] = {‘F’,’e’,’r’,’n’,’a’,’n’,’d’,’a’,’\0’};

Strings (em C++):

Para evitar problemas de compatibilidade entre as variáveis do programa e os componentes VCL, declarar textos/strings como: AnsiString nome;

Ex: void __fastcall TForm1::Button1Click(TObject *Sender) {

  AnsiString nome;
  nome = "Fernanda Argoud";
  Button1->Caption = Edit1->Text;
  Edit1->Text = nome;

} Obs: uma alternativa é o uso de ponteiros para caracteres: char * naipe = “Copas”;

Matrizes:

Coleção multidimensional ordenada de variáveis do mesmo tipo. Declaração: Se temperaturas é uma matriz 4x2 de elementos inteiros: int temperaturas [4][2]; Não confundir “dimensão” com “tamanho” da matriz. Ex: matriz 3D (float M[2][10][7]; )  matriz 3x3 (float N[3][3];) Os índices de cada dimensão sempre começam com o valor 0; Também não há verificação de tamanho na memória (armazenamento linear contínuo)!!!


Definição (não é automática): Pode ser individual... Ex: M[1][9][6] = 678.2321; ...Ou coletiva: float N[3][3] = { { 2.4, 9.1, 5.0 }, { 6.6, 5.2, 7.1 }, { 3.0, 1.2, 8.4 } };

Observação MUITO IMPORTANTE! – O nome da matriz em C/C++ (sem os colchetes) é uma variável separada, que armazena o endereço da matriz na memória (Ponteiro Constante).


Exemplo: int *p, M[2][2]; ... p = M; // p agora aponta para M[0][0]!! ... Calcula_media(p); // passa a matriz por referência para função ... p++; // p agora aponta p/ M[0][1] - pula 1 inteiro na memória) ... p+=2; // p agora aponta para M[1][1]!! ... y = p – M; // devolve o tamanho da matriz M, em bytes


Estruturas

Tipos complexos, modelados pelo programador; Declaração - Se cadastro é uma estrutura que vai conter um campo de inteiros para registrar idade, dois campos de texto para nome e endereço, um campo real para salário e um campo caractere para sexo (‘m’/’f’): struct cadastro { int idade; AnsiString nome, endereco; float salario; char sexo; }


Definição - para criar um dado do tipo cadastro: cadastro funcionario, clientes[30]; Para atribuir valores – nome da variável estrutura, seguida de ‘.’ e atribuição. Exs: funcionario.sexo = ‘m’; clientes[11].nome = “José da Silva”; Os campos das estruturas também são armazenados de forma contígua na memória, tal como os elementos das matrizes. Pode-se acessar individualmente os campos das estruturas, e elementos de uma matriz de estruturas, usando ponteiros.


Ex: struct data { int dia; char mes[10]; int ano; } aniversario, *Ptrdata = &aniversario; ... aniversario = {27,”Julho”,1971}; ... Ptr_data->mes = “Agosto”; // acessa o membro da // estrutura apontada Obs: este comando é equivalente a: (*Ptr_data).mês = “Agosto”


Obs2: Estruturas podem ser aninhadas (campos são também estruturas). Ex: struct ficha { AnsiString Nome, Endereco; int idade; data nascimento; } cadastro; ... cadastro.nascimento.ano = 1971; ... Cadastro = {“Fernanda”,”rua das Flores, 17”, 32, {27,”Julho”,1971}};


Obs3: Se um dos membros da estrutura é um ponteiro é possível criar-se o que se chama “Estruturas de Dados”: Listas encadeadas; Filas; Pilhas; Tabelas; Árvores, etc.


Estrutdadostree1.png
Estrutdadostree2.png
Estrutdadostree3.png
Estrutdadostree4.png
Estrutdadostree5.png


EXERCÍCIOS:

  1. Implemente o algoritmo que insere 25 números aleatórios (com valores entre 0 e 100), em uma lista encadeada, em ordem crescente.
  2. Implemente uma árvore binária que ordene a seguinte seqüência de números: {27,42,13,33,17,48,6}
  3. Escreva o algoritmo para inserir e retirar um dado do topo de uma pilha.