Escolar Documentos
Profissional Documentos
Cultura Documentos
© ELFS 141
• Exemplo: O string "Linguagem C" é representado na
memória como:
L i n g u a g e m C \0
String
• Esse string, portanto, consome 12 bytes de memória.
• Como as posições de memória ocupadas pelo string são
consecutivas, cada uma dessas posições pode ser
identificada por um índice.
• Assim, para armazenar um string podemos declarar uma
variável indexada, também conhecida como vetor:
char S[12];
L i n g u a g e m C \0
S[0] S[1] S[2] S[3] S[4] S[5] S[6] S[7] S[8] S[9] S[10] S[11]
© ELFS 142
• Importante: Na linguagem C, os valores dos índices
começam sempre em zero.
• Portanto, a variável S pode ocupar até 12 posições do tipo
char (ou seja, até 12 bytes).
• Podemos considerar que a variável S corresponde a um
conjunto de 12 variáveis do tipo char, cada uma das
quais identificada por meio de um índice (de 0 a 11).
• A memória alocada para uma variável é dada por:
(no de posições de memória) * (tamanho do tipo, em bytes)
char d[MAX];
© ELFS 145
• Considere o seguinte problema:
Deseja-se ler as notas obtidas pelos alunos de uma classe e
determinar: a maior nota obtida, a média das notas e o número
de alunos com nota abaixo da média.
© ELFS 148
Exercícios:
1. Escrever um programa que lê um vetor de N valores
inteiros e mostra qual é o maior valor presente no vetor e
qual é a sua posição no vetor.
3 8 0 1 9 2 5 7 4 6
v[0] v[1] v[2] v[3] v[4] v[5] v[6] v[7] v[8] v[9]
(62)10= (111110)2
© ELFS 149
#include <stdio.h>
#include <stdlib.h>
#define MAX 30
int main()
{
int i,N,M,P,v[MAX];
printf("Valor de N: ");
scanf("%d",&N);
for (i = 0; i < N; i++)
{
printf("Valor de v[%d]: ",i);
scanf("%d",&v[i]);
}
M = v[0];
P = 0;
for (i = 0; i < N; i++)
{
if (v[i] > M)
{
M = V[i];
P = i;
}
}
printf("Maior = %d, Posicao = %d\n",M,P);
return 0;
}
© ELFS 150
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
int main()
{
int N,i,j,quoc,resto,db[MAX];
printf("Entre com N: ");
scanf("%d",&N);
quoc = N;
for (i = 0; quoc >= 2; i++)
{
resto = quoc % 2;
db[i] = resto;
quoc = quoc/2;
}
db[i] = quoc;
printf("Representacao de %d em binario: ",N);
for (j = i; j >= 0; j--)
printf(db[j]);
printf("\n");
return 0;
}
© ELFS 151
Geração de números aleatórios
• A linguagem C dispõe da função rand() para a geração de
um inteiro aleatório no intervalo [0, RAND_MAX]
(RAND_MAX é uma constante definida em stdlib.h).
• Especificamente: RAND_MAX = 32767.
• Para gerar números aleatórios em um intervalo [a, b]
podemos escrever uma função:
int aleatorio(int a, int b)
{
return (a + rand()%(b-a+1));
}
© ELFS 154
• A função srand() é responsável pela inicialização da
semente a ser usada pela função rand().
• A função srand() exige como parâmetro um valor inteiro do
tipo unsigned.
• Podemos então escrever:
srand((unsigned)time(NULL));
compra 8 5 10 14 7 ...
0 1 2 3 4 ... 1999
venda 2 5 0 7 0 ...
0 1 2 3 4 ... 14
© ELFS 158
vmais = -1;
vmenos = n+1;
for (i = 0; i < n; i++)
{
p = compra[i];
total = total + preco[p];
if (venda[p] > vmais)
{
vmais = venda[p];
pmais = p;
Uma possível execução:
}
if (venda[p] < vmenos)
{ Numero de clientes: 1161
vmenos = venda[p]; Valor total das vendas: 55721.00
pmenos = p; Mais vendido: 2 - Preco = 25.00
} Menos vendido: 8 - Preco = 63.00
} Valor medio das vendas: 47.99
media = total/n;
printf("Numero de clientes: %d\n",n);
printf("Valor total das vendas: %.2f\n",total);
printf("Mais vendido: %d - Preco = %.2f\n",pmais,preco[pmais]);
printf("Menos vendido: %d - Preco = %.2f\n",pmenos,preco[pmenos]);
printf("Valor medio das vendas: %.2f\n",media);
return 0;
}
© ELFS 159
• Observar que o índice de uma variável indexada deve ser
um valor inteiro (limitado ao número de posições de
memória declaradas para a variável).
Este valor inteiro pode ser: Exemplo
uma constante venda[12] = ...
o valor de uma variável venda[k] = ...
o valor de uma expressão venda[k+1] = ...
o valor retornado por uma função venda[aleatorio(0,14)] = ...
o valor de uma outra variável indexada venda[compra[i]] = ...
v 38 97 19 62 23 47 41 8
0 1 2 3 4 5 6 7
w
0 1 2 3 4 5 6 7
int main()
{
int i,j,n,p,v[MAX],w[MAX];
srand((unsigned)time(NULL));
printf("Quantos elementos? ");
scanf("%d",&n);
if (n > MAX)
{
printf("Max = %d\n",MAX);
return 0;
}
for (i = 0; i < n; i++)
{
v[i] = aleatorio(1,99);
}
© ELFS 163
printf("Vetor gerado: [");
for (i = 0; i < n; i++)
printf(" %d",v[i]);
printf("]\n");
mostra(n,w,"Vetor ordenado");
return 0;
}
© ELFS 166
• Vamos observar a função mostra:
void mostra(int t, int a[], char m[])
{
int i;
printf("%s: [",m);
for (i = 0; i < t; i++)
printf(" %d",a[i]);
printf("]\n");
}
Por exemplo:
v 38 97 19 38 23 19
0 1 2 3 4 5
w 19 23 38 97
0 1 2 3 4 5
© ELFS 168
• Uma outra operação importante na computação é verificar
se um vetor contém um determinado valor.
• Imagine uma função procura que retorna 1 se um vetor
contém um determinado valor e retorna 0, caso contrário.
Como programar a função procura? Quais devem ser os
parâmetros da função?
int procura(int t, int a[], int v)
{
int i;
for (i = 0; i < t; i++)
{
if (a[i] == v)
return 1;
}
return 0;
}
© ELFS 170
Matrizes
• Uma variável indexada pode ter uma ou mais dimensões.
Se tem somente uma dimensão é chamada de vetor. Se
tem mais de uma dimensão, é chamada de matriz.
• Exemplo:
int a[10];
char b[3][5];
float c[2][2][3];
© ELFS 173
• Exercício. A produção anual de uma fábrica 185
é registrada, mês a mês, em uma matriz P
(12 x N). Por exemplo:
A fábrica produziu 185 unidades do produto 2
no mês 0, produziu 240 unidades do produto 0
no mês 5 e produziu 93 unidades no mês 8. 240
int main()
{
int P[12][MAX],L[MAX];
int i,j,n,custo,venda,lucro,tp,total;
srand((unsigned)time(NULL));
© ELFS 175
for (i = 0; i < 12; i++)
{
for (j = 0; j < n; j++)
{
P[i][j] = aleatorio(50,250);
}
}
return tp;
}
© ELFS 177
• Com essas funções, o trecho final do programa será:
total = 0;
for (j = 0; j < n; j++)
{
tp = totalProduzido(j,P);
printf("Produto %d: Total produzido = %d\n",j,tp);
lucro = lucroPorProduto(j,L,tp);
printf("Produto %d: Lucro = %d\n",j,lucro);
total = total + lucro;
}
printf("Lucro Total = %d\n",total);
return 0;
}
© ELFS 178
Exercício. Um quadrado mágico é uma matriz n x n cujos
elementos são números inteiros e a soma dos elementos de
qualquer linha ou de qualquer coluna resulta sempre no
mesmo valor. Por exemplo, para n = 3:
2 7 6
9 5 1
4 3 8
soma = 0;
for (j = 0; j < n; j++)
soma = soma + M[i][j];
return soma;
}
soma = 0;
for (i = 0; i < n; i++)
soma = soma + M[i][j];
return soma;
}
© ELFS 180
int quadradoMagico(int n, int M[][MAX])
{
int i,j,LM,CM,soma;
soma = somaLinha(n,M,0);
for (i = 1; i < n; i++)
{
if (soma != somaLinha(n,M,i))
{
return 0;
}
}
return 1;
}
© ELFS 181
int main()
{
int M[MAX][MAX];
int i,j,n,x;
printf("Tamanho: ");
scanf("%d",&n);
x = quadradoMagico(n,M);
if (x == 1)
{
printf("A matriz e' um quadrado magico\n");
}
else
{
printf("A matriz nao e' um quadrado magico\n");
}
return 0;
}
© ELFS 182
• Exercício. Simular o lançamento de dois dados. Qual é a
combinação mais provável e qual é a soma mais provável
dos dois dados após 50000 lançamentos? Imagine que
uma matriz 6 x 6 é usada para armazenar o número de
ocorrências de cada combinação de valores dos dois
dados. Considere que um vetor armazena a frequência de
cada valor possível da soma dos dois dados.
d Significa que d1 = 3 e d2 = 4
ocorreu 41 vezes.
41
s 428
0 1 2 3 4 5 6 7 8 9 10 11 12
© ELFS 183