int a[4];
int
)int a[4], b[5];
#define SIZE 10
...
int a[SIZE], b[SIZE+1];
a[i]
i
é o índice (inteiro)a[i]
pode ser usado tal como uma variável simples:
[i] = 1;
a("%d", a[i]);
printf++ a[i];
for
são convenientes
para processar elementos de variáveis indexadasN
:for(i = 0; i < N; i++) // Colocar zeros
[i] = 0;
a
for(i = 0; i < N; i++) // Ler valores
("%d", &a[i]);
scanf
= 0;
soma for(i = 0; i < N; i++) // Somar elementos
+= a[i]; soma
a[N]
duma variável com
tamanho N
int main(void) {
int a[10], i;
for(i = 0; i <= 10; i++)
[i] = 0;
a...
}
a[0]
, a[1]
, …,
a[10]
a[0]
, a[1]
,
…, a[9]
[i+j*10] = 0; a
= 0;
i while (i < N)
[i++] = 0; a
int a[5] = {1, 2, 3, 4, 5};
int a[10] = {1, 2, 3, 4, 5};
/* valores iniciais são
{1, 2, 3, 4, 5, 0, 0, 0, 0, 0} */
int a[10] = {0};
/* valores iniciais são
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
int a[] = {1, 2, 3, 4, 5};
// equivalente a declarar a[5]
Qual o problema?
= 0;
i while (i < N)
[i] = b[i++]; a
a[i] = b[i++];
é indefinida:
i++
pode ocorrer antes da
atribuição a a[i]
Evitamos o problema separando o incremento da indexação.
= 0;
i while (i < N) {
[i] = b[i];
a++;
i}
Em alternativa podemos usar um ciclo for
:
for (i = 0; i < N; i++)
[i] = b[i]; a
Decimal | Binário |
---|---|
2 | 10 |
6 | 110 |
16 | 10000 |
20 | 10100 |
64 | 1000000 |
n |
o inteiro positivo dado |
bit[] |
variável indexada para guardar algarismos binários (bits) |
size |
número de bits usados (0, 1, 2, … etc) |
#include <stdio.h>
#define NUM_BITS 32 // número máximo de bits
int main(void) {
unsigned n, size, bit[NUM_BITS] = {0};
("%u", &n); // inteiro sem sinal
scanf/* obter os algarismos binários */
= 0;
size while (n > 0) {
[size++] = n%2;
bit= n/2;
n }
/* imprimir por ordem contrária */
while(size > 0) {
("%u", bit[--size]);
printf}
('\n'); // terminar a linha
putchar}
NUM_BITS
é 32, logo podemos guardar até 32
bitsint fun(int a[]) {
// tamanho de a[] não especificado
...
}
int somar_vec(int a[], unsigned size) {
int i, soma = 0;
for (i = 0; i < size; i++)
+= a[i];
soma return soma;
}
somar_vec
Para usar esta função devemos passar dois argumentos:
int v[100];
...
= somar_vec(v, 100);
s // somar todos os valores:
NB: na chamada passamos apenas o nome da variável (sem parêntesis rectos)
somar_vec
Também podemos usar somar_vec
para somar apenas um
segmento inicial:
int v[100];
// ...
= somar_vec(v, 50);
s // somar os primeiros 50 valores
Desta forma podemos:
void colocar_zeros(int a[], unsigned size) {
int i;
for(i = 0; i < size; i++) {
[i] = 0;
a}
}
colocar_zeros
modifica a variável indexada
passada como argumento:int v[100];
// ...
(v, 100);
colocar_zeros// v[0], v[1], ... v[99] são agora 0
Vamos rever o exemplo de conversão para binário e decompô-lo em duas funções:
compute_bits
obter os algarismos binários usando divisões sucessivas
print_bits
imprimir os algarismos binários por ordem inversa
Vamos começar pela segunda função.
print_bits
void print_bits(unsigned b[], unsigned size) {
while(size > 0) {
("%u", b[--size]);
printf}
('\n');
putchar}
compute_bits
int compute_bits(unsigned n, unsigned b[]) {
unsigned size = 0;
while(n > 0) {
[size++] = n%2;
b= n/2;
n }
return size;
}
n
é o inteiro a decompor#define NUM_BITS 32
...
int main(void) {
unsigned n, size, bit[NUM_BITS];
("%d", &n);
scanf// ler um inteiro; deve ser positivo
= compute_bits(n, bit);
size // preencher "array" com algarismos de n
// valor retornado é o número de bits
(bit, size);
print_bits// imprimir algarismos
}
Dados:
vec
com size
valores
(e.g. inteiros);val
Queremos:
val
ocorre em vec
int ocorre(int vec[], int size, int val) {
for(int i = 0; i < size; i++) {
if(vec[i] == val)
return 1; // encontrou
}
return 0; // não encontrou
}
int pesquisa(int vec[], int size, int val) {
for(int i = 0; i < size; i++) {
if(vec[i] == val)
return i; // encontrou
}
return -1; // não encontrou
}
Dado: uma variável indexada vec
de inteiros
Queremos:
vec
Exemplos:
{2, 3, 4} -> {2, 3, 4}
{2, 3, 2, 2, 4, 2} -> {2, 3, 4}
{4, 3, 2, 2, 4} -> {4, 3, 2}
{3, 3, 3} -> {3}
Vamos definir uma função
int elimrep(int vec[], int size);
cujo resultado será o número \(k\)
de valores distintos na variável indexada vec
.
Além disso, modificamos vec
:
int a[7] = {2, 3, 3, 2, 4, 3, 5};
= elimrep(a, 7);
k // a[] : {2, 3, 4, 5, 4, 3, 5}
// k : 4
vec
variável indexada para eliminar repetidos
size
tamanho de vec
(número de valores)
i
índice do próximo valor (possívelmente repetido)
k
número de valores diferentes já encontrados
int elimrep(int vec[], int size) {
int i, k = 0;
// i: índice do próximo valor
// k: número de valores distintos
for(i = 0; i < size; i++) {
int val = vec[i];
if(!ocorre(vec, k, val)) {
// encontramos um novo valor
// distinto dos anteriores
[k++] = val;
vec}
}
return k;
}
\[ \scriptsize \overbrace{\begin{array}{|c|c|c|} \hline \texttt{v[0]} & \cdots & \texttt{v[k-1]} \\ \hline \end{array}}^{\text{sem repetidos}} \overbrace{\begin{array}{|c|c|c|c|c|} \hline \texttt{v[k]} & \cdots &\texttt{v[i]}&\cdots & \texttt{v[size-1]} \\ \hline \end{array}}^{\text{?}} \]