Mudanças entre as edições de "PR1022804 2023 2 AULA09"
Linha 200: | Linha 200: | ||
:1. Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''. | :1. Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando ''while''. | ||
− | :{{collapse top|Resposta}} | + | :{{collapse top|bg=#E6E6FA|Resposta}} |
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> | ||
#include <stdio.h> | #include <stdio.h> | ||
Linha 220: | Linha 220: | ||
:2. Modificar o exercício para computar a média dos 10 números que estão no vetor.<br> | :2. Modificar o exercício para computar a média dos 10 números que estão no vetor.<br> | ||
:3. Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média. | :3. Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média. | ||
− | {{collapse top|Resposta}} | + | {{collapse top|bg=#E6E6FA|Resposta}} |
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> | ||
#include <stdio.h> | #include <stdio.h> | ||
Linha 257: | Linha 257: | ||
:6. Sobre o exercício anterior, acrescente uma função para imprimir o número de 0s,1s,...6s do vetor.<br> | :6. Sobre o exercício anterior, acrescente uma função para imprimir o número de 0s,1s,...6s do vetor.<br> | ||
:7. Implementar uma função que recebe dois vetores de inteiros como parâmetro e o tamanho dos mesmos (suponha vetores de mesmo tamanho). A função deve retornar o número de elementos iguais comparados posição por posição. O esqueleto da função deve ser como: | :7. Implementar uma função que recebe dois vetores de inteiros como parâmetro e o tamanho dos mesmos (suponha vetores de mesmo tamanho). A função deve retornar o número de elementos iguais comparados posição por posição. O esqueleto da função deve ser como: | ||
− | :{{collapse top|Resposta}} | + | :{{collapse top|bg=#E6E6FA|Resposta}} |
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> | ||
int compara_vetores(int ve1[],int vet2[], int tamanho) | int compara_vetores(int ve1[],int vet2[], int tamanho) |
Edição das 15h03min de 14 de setembro de 2023
Vetores e Matrizes em linguagem C
- OBJETIVOS
- O aluno deverá:
- Compreender o conceito de vetores;
- Definir e inicializar vetores do tipo int, float e double no C;
- Passar vetores como parâmetro sem usar o conceito de ponteiros;
- Saber como utilizar vetores de char (string);
- Definir e operar matrizes no C; e
- Passar matrizes como parâmetros.
- METODOLOGIA
- A aula será expositiva e dialogada, utilizando apresentação de texto base na Internet, onde serão mostrados exemplos testados programas no microcomputador do laboratório de informática.
- INTRODUÇÃO
- O vetor é uma estrutura de dados indexada, que pode armazenar uma determinada quantidade de valores do mesmo tipo. Os dados armazenados em um vetor são chamados de itens do vetor. Para localizar a posição de um item em um vetor usamos um número inteiro denominado índice do vetor. Na linguagem C os vetores também são chamados de Arrays.
Arrays Unidimensionais (Vetores)
Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único. Uma boa analogia é comparar o vetor com uma tabela de tamanho fixo onde em cada linha pode ser armazenado um elemento.
- PROBLEMA
- Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.
- DADO DE ENTRADA
- Os 10 números armazenados em VET1
- DADO DE SAÍDA
- VET2, o vetor resultado da multiplicação de VET1 por 5.
- EXEMPLO 1
- Implementar um algoritmo (pseudo-código) para ler 10 números inteiros para um vetor e imprimir o número de números acima da média.
- NOTE
- Definir um contador, iniciado em zero. Calcular a média e fazer um loop sobre o vetor testando cada item para verificar se é maior que a média.
EXEMPLO 1 - Programa em C |
---|
#include <stdio.h>
void main()
{
int i=0,am=0;
int vet1[10];
float media=0;
for(i=0;i<10;i++) {
printf("Entre com a nota %d => ",i+1);
scanf("%d",&vet1[i]);
media = media+vet1[i];
}
media = media/i;
for( i=0;i<10;i++) {
if (vet1[i]>media)
am++;
}
printf("Media=%0.1f. O número de notas acima da média é %d.\n",media,am);
}
|
- EXEMPLO 2
- Implementar um algoritmo (pseudo-código) para ler 10 números inteiros para um vetor e imprimir o maior e o menor número digitado.
- NOTE
- É possível implementar marcando a posição do vetor que possui o maior e o menor valor ou o próprio valor máximo e mínimo.
EXEMPLO 2 - Programa em C |
---|
#include <stdio.h>
void main()
{
int i=0,am=0;
int vet1[10];
int max=0,min=0;
for(i=0;i<10;i++) {
printf("Entre com a nota %d => ",i+1);
scanf("%d",&vet1[i]);
}
for( i=0;i<10;i++) {
if (vet1[i]>vet1[max])
max=i;
if (vet1[i]<vet1[min])
min=i;
}
printf("Menor número: %d. Maior número: %d.\n",vet1[min],vet1[max]);
}
|
Definindo e usando vetores no C
Um vetor pode ser facilmente definido no C da forma:
TipoVetor NomeDoVetor[dimensao];
O algoritmo do fluxograma implementado anteriormente ficaria da seguinte forma em C:
#include <stdio.h>
void main()
{
int vet1[5],vet2[5];
int i;
for(i=0;i<5;i++) {
printf("Entre com vet[%d] => ",i);
scanf("%d",&vet1[i]);
vet2[i]=vet1[i]*5;
}
/* para conferir- vamos imprimir o conteúdo de vet2 */
for(i=0;i<5;i++)
printf("vet2[%d] => %d\n",i,vet2[i]);
}
Vamos a um exemplo que mostra as possibilidades de acesso a um vetor:
#include <stdio.h>
void main()
{
float x[10]; /* vetor com 10 floats */
int i;
x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */
x[9] = x[0] + 2.5;
printf("Entrar com o número na posição 5\n");
scanf("%f",&x[5]);
i=2;
x[i*2]=i*1.5; /* usando uma expressão como índice */
while (i<8) { /* usando loop para acessar o vetor */
x[i]=0.0;
i++;
}
for(i=0;i<10;i++)
printf("\nValor de x[%d]=%0.1f",i,x[i]);
}
NOTA: Vetores na Linguagem C começam SEMPRE na posição 0.
Iniciando vetores em C
Pode-se iniciar um vetor da forma:
#include <stdio.h>
void main()
{
int x[10] = {2,4,7,-5,3,2,3,4,9,10};
printf("%d\n", x[2]);
}
Passando vetores como parâmetros
Vetores não são copiados na passagem por parâmetro. Eles são passados sempre como referência. Veja o exemplo a seguir:
#include <stdio.h>
void ler_vet(int aux[5])
{
int i;
for (i=0;i<5;i++) {
printf("aux[%d] <== ",i);
scanf("%d",&aux[i]);
}
}
void main()
{
int vet[5], i;
ler_vet(vet);
for (i=0;i<5;i++)
printf("vet[%d]=%d\n",i,vet[i]);
}
Perceba como é realizada a declaração de parâmetros que são vetores. Observe no exemplo, que o vetor aux é na realidade o próprio vetor vet. Inicialmente dados são lidos para aux e depois vet é impresso.
Não é obrigatório definir o tamanho do vetor na declaração de parâmetros. Atenção! Na realidade o C não verifica o acesso indevido a um elemento fora do tamanho do vetor.
- EXERCÍCIOS
- 1. Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando while.
Resposta |
---|
#include <stdio.h>
void main()
{
float x[10];
int i;
i=0;
while (i<10) {
printf("Entre com x[%d] -> ", i);
scanf("%f",&x[i]);
i++;
}
}
|
- 2. Modificar o exercício para computar a média dos 10 números que estão no vetor.
- 3. Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.
Resposta |
---|
#include <stdio.h>
void main()
{
float x[10];
float soma = 0, media;
int i, cont;
/* leitura do vetor */
i=0;
while (i<10) {
printf("Entre com x[%d] -> ", i);
scanf("%f",&x[i]);
soma = soma + x[i];
i++;
}
/* calculo da media */
media = soma /10;
/* computação de números acima da média */
cont = 0;
i=0;
while (i<10) {
if (x[i] > media)
cont++;
i++;
}
printf ("Número de números acima da média = %d\n", cont);
}
|
- 4. Refazer os exercícios anteriores usando o comando for;
- 5. Considere um vetor global de floats chamado vetRnd de tamanho 100. Construa uma função que inicia este vetor com 100 números randômicos entre 1 e 6.
- 6. Sobre o exercício anterior, acrescente uma função para imprimir o número de 0s,1s,...6s do vetor.
- 7. Implementar uma função que recebe dois vetores de inteiros como parâmetro e o tamanho dos mesmos (suponha vetores de mesmo tamanho). A função deve retornar o número de elementos iguais comparados posição por posição. O esqueleto da função deve ser como:
Resposta | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
int compara_vetores(int ve1[],int vet2[], int tamanho)
{
int num_elementos;
return num_elementos;
}
Exemplo: Para os vetores x[]={1,1,3,4,5} e y[]={1,2,3,3,5} temos três elementos iguais (nas posições 0, 2 e 4). Vetores do Tipo CharEm aulas anteriores viu-se que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÃO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone. Em síntese, uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo char, que na prática é um número inteiro de byte.
#include <stdio.h>
void main ()
{
char x='A',y=65,w=0x41,z; /* três formas de representar a mesma coisa */
printf("Digite um caracter: ");
scanf("%c",&z);
printf("Caracter lido = %c\n",z);
printf("Caracter lido = %d\n",z);
printf("Caracter lido = %x\n",z);
if (z==x)
printf("Iguais 1\n");
if (z==y)
printf("Iguais 2\n");
if (z==w)
printf("Iguais 3\n");
}
Armazenamento de cadeias de caracteres em vetoresUma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated". Em algumas bibliografias e referências pode-se encontrar também: '\0'. Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação: Assumi-se que cada caracter é armazenado em um byte. Uma string terminada em 0 facilita o seu processamento pois se pode facilmente detectar o seu final. Note no exemplo acima, que a string está armazenada em um vetor CADEIA cujo tamanho excede ao da string. Os bytes que se seguem ao zero podem ser considerados lixo. Processando cadeias de caracteresSabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.
Função gets()Esta função é utilizada em substituição ao scanf().
O usuário entra com uma string, que será armazenada no vetor char s[]. A função gets() não é segura, por quê? Simplesmente porque com gets() pode ocorrer um estouro da quantidade de posições que foi especificada na string. Veja o exemplo abaixo: #include <stdio.h>
void main()
{
char buffer[10];
printf("Entre com o seu nome: ");
gets(buffer);
printf("O nome é: %s\n", buffer);
}
Se o usuário digitar como entrada:
Ou seja, digitar um total de 16 caracteres: 17 posições (incluindo o '\0' ) serão utilizadas para armazenar a string. Como a string buffer[10] só tem 10 caracteres, os 7 caracteres adicionais serão colocados na área de memória subsequente, escrevendo em uma região de memória que não está reservada para string. Este efeito é conhecido como "estouro de buffer" e pode causar problemas imprevisíveis. Uma forma de se evitar este problema é usar a função fgets(). Vetor de Char ou StringÉ possível definir vetores do tipo char. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número '\0' (NULL),
1. Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.
2. Implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.
3. Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.
4. Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.
5. Ler um vetor de 10 números inteiros e colocar em ordem crescente.
6. Ler um vetor de char e imprimir ao contrário os caracteres lidos. Exemplo: Marrocos >> socorraM
7. Ler um vetor de char e trocar de minúsculas para maiúsculas. Exemplo: douglas de souza >> DOUGLAS DE SOUZA
Onde PV é o valor presente, n o número de períodos de aplicação, i a taxa de juros e FV o valor futuro. Elabore um programa para computar o valor futuro para uma quantia aplicada de 10000 reais, dada uma taxa e o número de anos em que o valor é aplicado.
11. Fazer uma função adendo ao exercício anterior para ordenar o vetor gerado. 12. Adicionar uma interface para o exercício anterior para que um usuário possa entrar com 6 números de um jogo e o sistema conferir se o jogador ganhou ou não. 13. Implementar um sistema de controle de senha que permite abrir a porta para um usuário específico (userID) com uma senha específica. Arranjos Multidimensionais (Arrays)Os Arrays Multidimensionais, também chamados de matrizes, são estruturas de dados que possuem duas ou mais dimensões. Em resumo, temos que um Array que contém uma única dimensão (vetor) funciona internamente como um Array multidimensional. A diferença está na quantidade de índices que cada elemento da nossa estrutura terá como identificador (veremos mais tarde). Como definir e operar com matrizes no CDe forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável. Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas: #include <stdio.h>
void main()
{
int mA[2][3]={ 11,12,13,
21,22,23},
mB[2][3]={1,2,3,
1,2,3},
mC[2][3];
int i,j;
for(i=0;i<2;i++){
for(j=0;j<3;j++) {
mC[i][j] = mA[i][j] + mB[i][j];
}
}
}
Passando matrizes como parâmetroComo matrizes também são vetores, a mesma característica da passagem de parâmetros é considerada. Observe os exemplos a seguir:
#include <stdio.h>
void somar_mat(int aA[][3],int aB[][3], int cC[][3])
{
int i,j;
for(i=0;i<2;i++){
for(j=0;j<3;j++) {
cC[i][j] = aA[i][j] + aB[i][j];
}
}
}
void main()
{
int mA[2][3]={ 11,12,13,
21,22,23},
mB[2][3]={1,2,3,
1,2,3},
mC[2][3];
somar_mat(mA,mB,mC);
}
OBSERVE que matrizes são sempre passadas como referência.
#include <stdio.h>
void somar_mat(int m1[][3],int m2[][3], int m3[][3]);
void imprimir_mat(int mat[][3]);
void main()
{
int mA[2][3]={ 11,12,13,
21,22,23},
mB[2][3]={1,2,3,
1,2,3},
mC[2][3]={4,5,6,
7,8,9 },
mR[2][3];
int i,j;
somar_mat(mA,mB,mR); // somar matrix A com B
imprimir_mat(mR);
somar_mat(mB,mC,mR);
imprimir_mat(mR);
somar_mat(mA,mC,mR);
imprimir_mat(mR);
}
void somar_mat(int m1[][3],int m2[][3], int m3[][3])
{
int i,j;
for(i=0;i<2;i++){
for(j=0;j<3;j++) {
m3[i][j] = m1[i][j] + m2[i][j];
}
}
}
void imprimir_mat(int mat[][3]){
int i,j;
for(i=0;i<2;i++){
for(j=0;j<3;j++) {
printf("%d\t",mat[i][j]);
}
printf("\n");
}
printf("\n");
}
Exercícios 11. Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.
2. Implementar uma programa para calcular o determinante de uma matriz 3x3 (de reais) a ser fornecida pelo teclado.
Matrizes de caracteres e vetores de stringsUm vetor de strings pode ser construído usando matrizes de char. Cada string será armazenada em uma linha do vetor.
#include <stdio.h>
void main()
{
char TabelaUsuarios[4][10] = {
"joao",
"maria",
"jose",
"lara",
};
int i;
for (i=0;i<4;i++)
printf("%s\n",&TabelaUsuarios[i][0]);
}
Note a forma como é realizada a inicialização da matriz. Exercícios 21. Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.
2. Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.
|