Você está na página 1de 11

PROGRAMAO DE COMPUTADORES I

(Parte 2)

Prof. Eduardo Machado Real

Contedos: Variveis Compostas Homogneas: Vetores e Matrizes. Variveis Compostas Heterogneas: Registros.

Programao de Computadores I Prof. Eduardo

1 - VARIVEIS COMPOSTAS HOMOGNEAS


1.1 VETOR
Varivel composta homognea unidimensional caracteriza-se por dados agrupados linearmente numa nica direo, como uma linha reta, veja:

Os vetores so capazes de armazenar vrios valores. Cada um desses valores identificado pelo mesmo nome (o nome dados ao vetor). Eles so diferenciados apenas por um ndice.

Os ndices na linguagem C/C++ para identificar as posies de um vetor comeam sempre em 0 (zero) e vo at o tamanho do vetor menos uma unidade.
Exemplo: As posies de um vetor de tamanho 10, so: 0, 1, 2, 3, . . ., 9. 1.1.1 Declarao de vetor Os vetores em C/C++ so identificados pela existncia de colchetes logo aps o nome da varivel no momento da declarao. Dentro dos colchetes deve-se colocar o nmero de posies do vetor. Exemplos: int vet[10]; vet 10 5
0 1

3
2

8
3

1
4

19 44 21 2
5 6 7 8

7
9

Nesse exemplo, o vetor chamado vet possui dez posies, comeando pela posio 0 e indo at a posio 9 (tamanho do vetor 1). Em cada posio podero ser armazenando nmeros inteiros, conforme especificado pelo tipo int na declarao. char x[5]; x A
0

*
1

2
2

@
3

k
4

Nesse exemplo, o vetor chamado x possui cinco posies, comeando pela posio 0 e indo at a posio 4 (tamanho do vetor 1). Em cada posio podero ser armazenados caracteres, conforme especificado pelo tipo char na declarao.

importante ressaltar que, na linguagem C/C++, no existe o tipo de dado string, como ocorre na linguagem Pascal ou Delphi, por exemplo. Dessa maneira, para poder armazenar em uma cadeia de caracteres, por exemplo, o nome completo de uma pessoa, deve-se declarar um vetor de char, em que cada posio equivale a um caractere ou a uma letra do nome.

Programao de Computadores I Prof. Eduardo

1.1.2 Atribuindo valores ao vetor As atribuies em vetor exige que seja informada em qual de suas posies o valor ficar armazenado. Deve-se lembrar sempre que a primeira posio de um vetor em C/C++ tem ndice 0. vet[0]1; x[3]b; //Atribui o valor 1 primeira posio do vetor. //Atribui a letra b quarta posio do vetor.

1.1.3 Preencher um vetor Preencher um vetor significa atribuir valores a todas as suas posies. Assim, deve-se implementar um mecanismo que controle o valor do ndice. for(i=0;i<10;i++) { cin>>vetor[i]; } Nesse exemplo, a estrutura de repetio for foi utilizada para garantir que a varivel i assuma todos os valores possveis para o ndice do vetor (de 0 a 9). Assim, para cada execuo da repetio, ser utilizada uma posio diferente do vetor. 1.1.4 Mostrando os elementos do vetor Mostrar os valores contidos em um vetor tambm exige a utilizao do ndice. for(i=0;i<10;i++) { cout>>vetor[i]; } Nesse exemplo, a estrutura de repetio for foi utilizada para garantir que a varivel i assuma todos os valores possveis para o ndice do vetor (de 0 a 9). Assim, para cada execuo da repetio, ser utilizada uma posio diferente e, dessa forma, todos os valores do vetor sero mostrados.

Programao de Computadores I Prof. Eduardo

Exerccio resolvido:
Criar um algoritmo que leia um vetor de nmeros inteiros e 5 posies. Mostre cada elemento do vetor multiplicado por 3. Algoritmo:
algoritmo numeros declarao de variveis inteiro num[5], x,mult; inicio para x1 at 5 faa inicio escreva(Digite um ); leia(num[x]); fim para para x1 at 5 faa inicio multnum[x]*3; escreva(mult); fim para fim_algoritmo

Em C/C++:
#include<iostream.h> #include<conio.h> void main() { clrscr(); int num[5],x,mult; for(x=0;x<=4;x++) nmero: { cout<<\nDigite um ; cin>>num[x]; } for(x=0;x<=4;x++) { mult=num[x]*3; cout<<\n<<mult; } getch(); }

nmero:

Exerccios:
Implementar os algoritmos desenvolvidos na disciplina de Algoritmos e Estruturas de Dados I.

1.2 MATRIZ
Uma matriz pode ser definida como um conjunto de variveis de mesmo tipo e identificadas pelo mesmo nome. Essas variveis so diferenciadas por meio da especificao de suas posies dentro dessa estrutura. A linguagem C/C++ permite a declarao de matrizes unidimensionais (mais conhecidas como vetores). Bidimensionais e multidimensionais. As matrizes mais utilizadas possuem duas dimenses. Para cada dimenso deve ser utilizado um ndice. 1.2.1 Declarao de Matriz tipo nome[dimenso1][dimenso2][ . . .][dimensoN ]; onde: tipo o tipo dos dados que sero armazenados na matriz; nome o nome dado varivel do tipo matriz; dimenso1 representa o tamanho da 1 dimenso da matriz; dimenso2 representa o tamanho da 2 dimenso da matriz; dimensoN representa o tamanho da 1 dimenso da matriz; dimensoN representa o tamanho da n-sima dimenso da matriz;

Programao de Computadores I Prof. Eduardo

Exemplos: float x[2][6]; Da mesma maneira como, ocorre como com os vetores, os ndices comeam sempre em 0 (zero). Sendo assim, com a declarao anterior, criou-se uma varivel chamada x contendo duas linhas (0 e 1) com seis colunas cada (0 a 5), capazes de armazenar nmeros reais, como pode ser observado a seguir:
0 1 2 3 4 5

0 1

char mat[4][3]; A declarao anterior criou uma varivel chamada mat contendo quantro linhas (0 a 3) com trs colunas cada (0 a 2), capazes de armazenar smbolos, como pode ser observado a seguir:
0 1 2

mat

0 1 2 3

float y[2][4][3];

A declarao anterior criou uma varivel chamada y contendo duas linhas (0 a 1) com quatro colunas cada (0 a 3) e profundidade trs (0 a 2), capazes de armazenar nmeros reais, como pode ser observado a seguir:

1.2.2 Atribuindo valores a uma matriz Atribuir valores a uma matriz significa armazenar uma informao em um de seus elementos, identificado de forma nica por meio de seus ndices.

x[1][4] = 5;

//Atribui o valor 5 posio identificada pelos ndices 1 (2 linha) e 4 (5 coluna).


0 1 2 3 4 5

0 1

Programao de Computadores I Prof. Eduardo

mat[3][2] = D; coluna).

//Atribui a letra D posio identificada pelos ndices 3 (4 linha) e 2 (3


0 1 2 0 1 2 3

mat

y[0][3][1] = 12; //Atribui o valor 12 posio identificada pelos ndices 0 (1 linha), 3 (4 coluna) e 1 (2 profundidade).

1.2.3 Preenchendo uma matriz Preencher uma matriz significa percorrer todos os seus elementos, atribuindo-lhes um valor. Este valor pode ser recebido do usurio, por meio do teclado, ou pode ser gerado pelo programa. No exemplo que segue, todos os elementos de uma matriz bidimensional so percorridos, atribuindo-lhes valores digitados pelo usurio e capturados pelo comando cin.
for(i=0;i<7;i++) { for(j=0;j<3;j++) { cout<<\nDigite o elemento m[<<i<<][<<j<<]: ; cin>>mat[i][j]; } }

Como a matriz possui sete linhas e trs colunas, o for externo deve variar de 0 a 6 (percorrendo, assim, as sete linhas da matriz) e o for interno deve variar de 0 a 2 (percorrendo, assim, as trs colunas da matriz). Ento, pode-se pensar que, para cada dimenso definida para a matriz, dever ser utilizada uma estrutura de repetio for para os diferentes ndices. importante lembrar que, as variveis de controle utilizadas para as estruturas de repetio, devem ser diferentes (observe no exemplo anterior que foram utilizados o i e o j para os nomes das variveis de controle).

Programao de Computadores I Prof. Eduardo

1.2.4 Mostrando os elementos de uma matriz Pode-se tambm percorrer todos os elementos de uma matriz acessando o seu contedo. Para mostrar os valores armazenados dentro de uma matriz, supondo que ela tenha sido declarada como float x[10][6], pode-se executar os comandos a seguir:
for(i=0;i<10;i++) { for(j=0;j<6;j++) { cout<<\nElemento x[<<i<<][<<j<<]: <<x[i][j]; } }

Exerccio resolvido:
Criar um algoritmo que leia as trs notas de 2 alunos de uma turma. Depois mostre estas notas divididas por 2, uma vez que, constatou-se que estes alunos colaram nas provas.
#include<iostream.h> #include<conio.h> void main() { clrscr(); float notas[2][3],div; int a,b; for(a=0;a<=1;a++) { for(b=0;b<=2;b++) { cout<<\nDigite a nota <<b<< do aluno <<a<<: ; cin>>notas[a][b]; } } for(a=0;a<=1;a++) { for(b=0;b<=2;b++) { div=notas[a][b]/2; cout<<\nNota dividida <<div; } } getch(); }

Exerccios:
Implementar os algoritmos desenvolvidos na disciplina de Algoritmos e Estruturas de Dados I.

Programao de Computadores I Prof. Eduardo

2 VARIVEIS COMPOSTAS HETEROGNEAS (Registros)


Os registros em C/C++ so definidos Poe meio da utilizao da palavra reservada struct, conforme apresentado a seguir: struct nome_do_registro { tipo campo1; tipo campo2; . . . tipo campoN; };

A partir da estrutura definida, o programa poder considerar que existe um novo tipo de dados a ser utilizado chamado nome_do_registro. Este novo tipo de dado capaz de armazenar vrias informaes, cujos tipos podem ser diferentes. Estas informaes so chamadas de campos da estrutura. Exemplo: struct registro { int num; char nome[30]; float saldo; }; No exemplo, um registro chamado registro foi definido. Isto significa que o programa poder utilizar um novo tipo de dado. Variveis declaradas desse tipo podero armazenar trs valores: num, nome e saldo. Uma observao importante que a struct s poder ser utilizada dentro do bloco onde for definida. Por exemplo, uma struct descrita dentro das chaves que delimitam a funo main s poder ser utilizada por variveis que tambm estejam dentro desse bloco. Para permitir que qualquer parte do seu programa entenda e utilize uma struct, sua definio dever ser feita fora da funo main, de preferncia logo abaixo das includes. 2.1 Declarao de variveis do tipo registro importante ressaltar que, para um programa utilizar uma struct, necessria a declarao de variveis desse tipo, da seguinte forma: nome_do_registro nome_da_varivel; Considerando que estruturas representam novos tipos de dados, todas as operaes realizadas com os tipos predefinidos da linguagem tambm podero ser realizadas com as estruturas. Dessa maneira, alm de variveis simples, vetores e matrizes podem ser declaradas como struct. Exemplos: registro var; A varivel var do tipo registro, ou seja, poder armazenar trs valores: num, nome e saldo.

Programao de Computadores I Prof. Eduardo

registro exemplo[10][4]; A varivel exemplo uma matriz bidimensional com dez linhas e seis colunas, onde cada posio armazenar trs valores: num, nome e saldo. Observao: em alguns momentos, possvel fazer a declarao da varivel com a definio da estrutura, no mesmo bloco de comandos. Observe o exemplo a seguir: struct registro { int num; char nome[35]; float saldo; }x[5][8]; Nesse caso, est sendo declarada uma varivel x com cinco linhas e oito colunas, onde cada posio do tipo registro e, portanto, contm num, nome e saldo. 2.2 Acesso a membros de estruturas Depois de a varivel ser declarada, o programa precisa manipular o contedo de cada campo individualmente. Para tanto, preciso informar o nome da varivel e o do campo desejado, separados por um ponto.

Exemplo 1: Para armazenar os valores 1 e geladeira na varivel x, deve-se fazer as atribuies a seguir: struct produto { int codigo; char descricao[30]; }; produto x; //a varivel x declarada como sendo um produto. x.codigo = 1; strcpy(x.descricao,geladeira);

Programao de Computadores I Prof. Eduardo

10

Exemplo 2: (Conjunto de registros utilizando um Vetor) Para armazenar os valores 5 e fogo na quinta posio de um vetor, deve -se fazer as atribuies a seguir: struct produto { int codigo; char descricao[30]; }; produto eletro[12]; //a varivel eletro declarada como sendo um vetor de 12 posies e cada posio produto. eletro[3].codigo5; strcpy(eletro[3].descricao,fogo) ; Vale lembrar que, se o vetor comea na posio 0 (zero), a quarta posio identificada pelo ndice trs. Vale lembrar que, se o vetor comea na posio 0 (zero), a quarta posio identificada pelo ndice trs.

Exemplo 3: (Conjunto de registros utilizando um Matriz) Para armazenar os valores 11 e televiso na terceira coluna da sexta linha de uma matriz, deve-se fazer as atribuies a seguir: struct produto { int codigo; char descricao[30]; }; produto eletro[8][4]; //a varivel eletro declarada como sendo uma matriz de 8 linhas e 4 colunas, onde cada posies e cada posio produto. eletro[5][2].codigo11; strcpy(eletro[5][2].descricao,televiso) ; Considerando que tanto as linhas como as colunas de uma matriz comeam na posio 0 (zero), a sexta linha representada pelo ndice cinco, e a terceira coluna representada pelo ndice dois.

2.3 Manipulao de cadeias em C/C++ Quando estudamos registros, utilizamos com frequncia cadeias de caracteres como um campo de nome, um campo de descrio, etc. Para este tipo de campo, exigida uma declarao em que se use vetor. Exemplo: char nome[30]; char descricao[20]; Para este tipo de varivel, o comando de entrada utilizado o gets como j conhecemos, mas em relao atribuio, teremos que utilizar funes da linguagem C/C++.

Programao de Computadores I Prof. Eduardo

11

Ento veja algumas funes para a manipulao de cadeias em C/C++: Armazenar valores vindos do teclado: Funo: gets( ); Biblioteca: #include<stdio.h> Exemplo: cout<<\nDigite o nome: ; gets(cliente.nome); onde, cliente o nome do registro e nome um campo deste registro. Copiando cadeias de caracteres Funo: strcpy(str1,str2); A funo strcpy copia a cadeia str2 para a str1. Biblioteca: #include<string.h> Exemplo: - Atribuio que conhecemos: descr_p=p.descr; No utilizar para cadeia de caracteres! - Atribuio correta: strcpy(descr_p,p.descr); onde, a varivel descr_p vai receber o contedo do campo descr do registro p.

Exerccio resolvido: Criar um algoritmo que leia os dados de um aluno (RGM e 3 notas). Mostre os dados lidos.
#include <iostream.h> #include <conio.h> #include <stdio.h> struct aluno { int rgm; float p1,p2,p3; }; void main() { struct aluno aluno; cout << "Digite o RGM: "; cin>>aluno.rgm; cout << "Digite a nota 1: "; cin>>aluno.p1; cout << "Digite a nota 2: "; cin>>aluno.p2; cout << "Digite a nota 3: "; cin>>aluno.p3; cout<<"\n\n"; cout << "\n*****DADOS DO ALUNO*****"; cout << "\nRGM: "<<aluno.rgm; cout << "\nNOTA 1: "<<aluno.p1; cout << "\nNOTA 2: "<<aluno.p2; cout << "\nNOTA 3: "<<aluno.p3; cout << "\n************************"; getch(); }

Observao: A declarao do registro struct aluno aluno; foi utilizado o mesmo nome do registro para a varivel, mas tambm poderia ser utilizado as seguintes declaraes, por exemplo:
struct aluno a; aluno aluno; aluno a;