AULA 2 - Programação II - Graduação
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:
- 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.
- 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]; ) é diferente de : 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.
EXERCÍCIOS:
- Implemente o algoritmo que insere 25 números aleatórios (com valores entre 0 e 100), em uma lista encadeada, em ordem crescente.
- Implemente uma árvore binária que ordene a seguinte seqüência de números: {27,42,13,33,17,48,6}
- Escreva o algoritmo para inserir e retirar um dado do topo de uma pilha.




