PROGRAMAÇÃO DE COMPUTADORES I (Parte 2) Prof. Eduardo Machado Real Conteúdos: Variáveis Compostas Homogêneas: Vetores e Matrizes. Variáveis Compostas Heterogêneas: Registros.
Programação de Computadores I Prof. Eduardo 2 1 - VARIÁVEIS COMPOSTAS HOMOGÊNEAS 1.1 VETOR Variável composta homogênea unidimensional caracteriza-se por dados agrupados linearmente numa única direção, como uma linha reta, veja: Os vetores são capazes de armazenar vários valores. Cada um desses valores é identificado pelo mesmo nome (o nome dados ao vetor). Eles são diferenciados apenas por um índice. Os índices na linguagem C/C++ para identificar as posições de um vetor começam sempre em 0 (zero) e vão até o tamanho do vetor menos uma unidade. Exemplo: As posições de um vetor de tamanho 10, são: 0, 1, 2, 3,..., 9. 1.1.1 Declaração de vetor Os vetores em C/C++ são identificados pela existência de colchetes logo após o nome da variável no momento da declaração. Dentro dos colchetes deve-se colocar o número de posições do vetor. Exemplos: int vet[10]; vet 10 5 3 8 1 19 44 21 2 7 0 1 2 3 4 5 6 7 8 9 Nesse exemplo, o vetor chamado vet possui dez posições, começando pela posição 0 e indo até a posição 9 (tamanho do vetor 1). Em cada posição poderão ser armazenando números inteiros, conforme especificado pelo tipo int na declaração. char x[5]; x A * 2 @ k 0 1 2 3 4 Nesse exemplo, o vetor chamado x possui cinco posições, começando pela posição 0 e indo até a posição 4 (tamanho do vetor 1). Em cada posição poderão ser armazenados caracteres, conforme especificado pelo tipo char na declaração. É importante ressaltar que, na linguagem C/C++, não 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 posição equivale a um caractere ou a uma letra do nome.
Programação de Computadores I Prof. Eduardo 3 1.1.2 Atribuindo valores ao vetor As atribuições em vetor exige que seja informada em qual de suas posições o valor ficará armazenado. Deve-se lembrar sempre que a primeira posição de um vetor em C/C++ tem índice 0. vet[0] 1; x[3] b ; //Atribui o valor 1 à primeira posição do vetor. //Atribui a letra b à quarta posição do vetor. 1.1.3 Preencher um vetor Preencher um vetor significa atribuir valores a todas as suas posições. 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 repetição for foi utilizada para garantir que a variável i assuma todos os valores possíveis para o índice do vetor (de 0 a 9). Assim, para cada execução da repetição, será utilizada uma posição diferente do vetor. 1.1.4 Mostrando os elementos do vetor Mostrar os valores contidos em um vetor também exige a utilização do índice. for(i=0;i<10;i++) cout>>vetor[i]; Nesse exemplo, a estrutura de repetição for foi utilizada para garantir que a variável i assuma todos os valores possíveis para o índice do vetor (de 0 a 9). Assim, para cada execução da repetição, será utilizada uma posição diferente e, dessa forma, todos os valores do vetor serão mostrados.
Programação de Computadores I Prof. Eduardo 4 Exercício resolvido: Criar um algoritmo que leia um vetor de números inteiros e 5 posições. Mostre cada elemento do vetor multiplicado por 3. Algoritmo: Em C/C++: algoritmo numeros declaração de variáveis inteiro num[5], x,mult; inicio para x 1 até 5 faça inicio escreva( Digite um número: ); leia(num[x]); fim para para x 1 até 5 faça inicio mult num[x]*3; escreva(mult); fim para fim_algoritmo #include<iostream.h> #include<conio.h> void main() clrscr(); int num[5],x,mult; for(x=0;x<=4;x++) cout<< \ndigite um número: ; cin>>num[x]; for(x=0;x<=4;x++) mult=num[x]*3; cout<< \n <<mult; getch(); Exercícios: 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 variáveis de mesmo tipo e identificadas pelo mesmo nome. Essas variáveis são diferenciadas por meio da especificação de suas posições dentro dessa estrutura. A linguagem C/C++ permite a declaração de matrizes unidimensionais (mais conhecidas como vetores). Bidimensionais e multidimensionais. As matrizes mais utilizadas possuem duas dimensões. Para cada dimensão deve ser utilizado um índice. 1.2.1 Declaração de Matriz tipo nome[dimensão1][dimensão2][...][dimensãon ]; onde: tipo é o tipo dos dados que serão armazenados na matriz; nome é o nome dado à variável do tipo matriz; dimensão1 representa o tamanho da 1ª dimensão da matriz; dimensão2 representa o tamanho da 2ª dimensão da matriz; dimensãon representa o tamanho da 1ª dimensão da matriz; dimensãon representa o tamanho da n-ésima dimensão da matriz;
Programação de Computadores I Prof. Eduardo 5 Exemplos: float x[2][6]; Da mesma maneira como, ocorre como com os vetores, os índices começam sempre em 0 (zero). Sendo assim, com a declaração anterior, criou-se uma variável chamada x contendo duas linhas (0 e 1) com seis colunas cada (0 a 5), capazes de armazenar números reais, como pode ser observado a seguir: x 0 1 0 1 2 3 4 5 char mat[4][3]; A declaração anterior criou uma variável chamada mat contendo quantro linhas (0 a 3) com três colunas cada (0 a 2), capazes de armazenar símbolos, como pode ser observado a seguir: mat 0 1 2 3 0 1 2 float y[2][4][3]; A declaração anterior criou uma variável chamada y contendo duas linhas (0 a 1) com quatro colunas cada (0 a 3) e profundidade três (0 a 2), capazes de armazenar números reais, como pode ser observado a seguir: 1.2.2 Atribuindo valores a uma matriz Atribuir valores a uma matriz significa armazenar uma informação em um de seus elementos, identificado de forma única por meio de seus índices. x[1][4] = 5; //Atribui o valor 5 à posição identificada pelos índices 1 (2ª linha) e 4 (5ª coluna). 0 1 2 3 4 5 x 0 1 5
Programação de Computadores I Prof. Eduardo 6 mat[3][2] = D ; //Atribui a letra D à posição identificada pelos índices 3 (4ª linha) e 2 (3ª coluna). 0 1 2 0 mat 1 2 3 D y[0][3][1] = 12; //Atribui o valor 12 à posição 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 usuário, por meio do teclado, ou pode ser gerado pelo programa. No exemplo que segue, todos os elementos de uma matriz bidimensional são percorridos, atribuindo-lhes valores digitados pelo usuário 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 três 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 três colunas da matriz). Então, pode-se pensar que, para cada dimensão definida para a matriz, deverá ser utilizada uma estrutura de repetição for para os diferentes índices. É importante lembrar que, as variáveis de controle utilizadas para as estruturas de repetição, devem ser diferentes (observe no exemplo anterior que foram utilizados o i e o j para os nomes das variáveis de controle).
Programação de Computadores I Prof. Eduardo 7 1.2.4 Mostrando os elementos de uma matriz Pode-se também percorrer todos os elementos de uma matriz acessando o seu conteúdo. 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]; Exercício resolvido: Criar um algoritmo que leia as três 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(); Exercícios: Implementar os algoritmos desenvolvidos na disciplina de Algoritmos e Estruturas de Dados I.
Programação de Computadores I Prof. Eduardo 8 2 VARIÁVEIS COMPOSTAS HETEROGÊNEAS (Registros) Os registros em C/C++ são definidos Poe meio da utilização 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 várias informações, cujos tipos podem ser diferentes. Estas informações são 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. Variáveis declaradas desse tipo poderão armazenar três valores: num, nome e saldo. Uma observação 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 função main só poderá ser utilizada por variáveis que também estejam dentro desse bloco. Para permitir que qualquer parte do seu programa entenda e utilize uma struct, sua definição deverá ser feita fora da função main, de preferência logo abaixo das includes. 2.1 Declaração de variáveis do tipo registro É importante ressaltar que, para um programa utilizar uma struct, é necessária a declaração de variáveis desse tipo, da seguinte forma: nome_do_registro nome_da_variável; Considerando que estruturas representam novos tipos de dados, todas as operações realizadas com os tipos predefinidos da linguagem também poderão ser realizadas com as estruturas. Dessa maneira, além de variáveis simples, vetores e matrizes podem ser declaradas como struct. Exemplos: registro var; A variável var é do tipo registro, ou seja, poderá armazenar três valores: num, nome e saldo.
Programação de Computadores I Prof. Eduardo 9 registro exemplo[10][4]; A variável exemplo é uma matriz bidimensional com dez linhas e seis colunas, onde cada posição armazenará três valores: num, nome e saldo. Observação: em alguns momentos, é possível fazer a declaração da variável com a definição 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 variável x com cinco linhas e oito colunas, onde cada posição é do tipo registro e, portanto, contém num, nome e saldo. 2.2 Acesso a membros de estruturas Depois de a variável ser declarada, o programa precisa manipular o conteúdo de cada campo individualmente. Para tanto, é preciso informar o nome da variável e o do campo desejado, separados por um ponto. Exemplo 1: Para armazenar os valores 1 e geladeira na variável x, deve-se fazer as atribuições a seguir: struct produto int codigo; char descricao[30]; ; produto x; //a variável x é declarada como sendo um produto. x.codigo = 1; strcpy(x.descricao, geladeira );
Programação de Computadores I Prof. Eduardo 10 Exemplo 2: (Conjunto de registros utilizando um Vetor) Para armazenar os valores 5 e fogão na quinta posição de um vetor, deve-se fazer as atribuições a seguir: struct produto int codigo; char descricao[30]; ; produto eletro[12]; eletro[3].codigo 5; strcpy(eletro[3].descricao, fogão ); //a variável eletro é declarada como sendo um vetor de 12 posições e cada posição é produto. Vale lembrar que, se o vetor começa na posição 0 (zero), a quarta posição é identificada pelo índice três. Vale lembrar que, se o vetor começa na posição 0 (zero), a quarta posição é identificada pelo índice três. Exemplo 3: (Conjunto de registros utilizando um Matriz) Para armazenar os valores 11 e televisão na terceira coluna da sexta linha de uma matriz, deve-se fazer as atribuições a seguir: struct produto int codigo; char descricao[30]; ; produto eletro[8][4]; //a variável eletro é declarada como sendo uma matriz de 8 linhas e 4 colunas, onde cada posições e cada posição é produto. eletro[5][2].codigo 11; strcpy(eletro[5][2].descricao, televisão ); Considerando que tanto as linhas como as colunas de uma matriz começam na posição 0 (zero), a sexta linha é representada pelo índice cinco, e a terceira coluna é representada pelo índice dois. 2.3 Manipulação de cadeias em C/C++ Quando estudamos registros, utilizamos com frequência cadeias de caracteres como um campo de nome, um campo de descrição, etc. Para este tipo de campo, é exigida uma declaração em que se use vetor. Exemplo: char nome[30]; char descricao[20]; Para este tipo de variável, o comando de entrada utilizado é o gets como já conhecemos, mas em relação à atribuição, teremos que utilizar funções da linguagem C/C++.
Programação de Computadores I Prof. Eduardo 11 Então veja algumas funções para a manipulação de cadeias em C/C++: Armazenar valores vindos do teclado: Função: 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 Função: strcpy(str1,str2); A função strcpy copia a cadeia str2 para a str1. Biblioteca: #include<string.h> Exemplo: - Atribuição que conhecemos: descr_p=p.descr; Não utilizar para cadeia de caracteres! - Atribuição correta: strcpy(descr_p,p.descr); onde, a variável descr_p vai receber o conteúdo do campo descr do registro p. Exercício 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(); Observação: A declaração do registro struct aluno aluno; foi utilizado o mesmo nome do registro para a variável, mas também poderia ser utilizado as seguintes declarações, por exemplo: struct aluno a; aluno aluno; aluno a;