De Objective Caml para C e C++/Construção de tipos (editar)
Revisão das 16h59min de 2 de agosto de 2007
, 2 de agosto de 2007→Arranjos
[edição não verificada] | [edição não verificada] |
m (→Arranjos) |
|||
Objective Caml possui uma função que, aplicada a um arranjo, retorna o número de posições do arranjo. Isso não existe nem C nem em C++ (C++ tem uma outra implementação de arranjo, chamada <tt>vector</tt> que tem essa funcionalidade; será apresentada mais adiante).
====
Nas linguagens C e C++, como em Objective Caml, os parâmetros são passados por valor. Isso significa que quando uma função é chamada, as variáveis que correspondem aos parâmetros formais da função comportam se como se fossem variáveis locais ao corpo da função que são inicializadas com o valor dos argumentos que foram utilizados para chamar essa função.
No caso dos arranjos, o parâmetro formal é o mesmo arranjo que o argumento efetivo da chamada da função. O seguinte exemplo ilustra essa particularidade:
#include <cstdio>
void swap1 (int i, int j)
{
int tmp = i;
i = j;
j = tmp;
}
void swap2 (int tab[2])
{
int tmp = tab[0];
tab[0] = tab[1];
tab[1] = tmp;
}
int main ()
{
int a = 1, b = 2;
printf("antes: a = %i, b = %i\n", a, b);
swap1(a, b);
printf("depois: a = %i, b = %i\n", a, b);
int arranjo[2] = {1, 2};
printf("antes: arranjo[0] = %i, arranjo[1] = %i\n", arranjo[0], arranjo[1]);
swap2(arranjo);
printf("depois: arranjo[0] = %i, arranjo[1] = %i\n", arranjo[0], arranjo[1]);
}
A execução desse programa resultará na seguinte impressão na saída padrão
antes: a = 1, b = 2
depois: a = 1, b = 2
antes: arranjo[0] = 1, arranjo[1] = 2
depois: arranjo[0] = 2, arranjo[1] = 1
Resumidamente, a explicação disso é que, em C e C++, um arranjo corresponde ao endereço da primeira posição do arranjo. Quando a função <tt>swap2</tt> é chamada com o argumento <tt>arranjo</tt>, o endereço da primeira posição de <tt>arranjo</tt> é copiada para <tt>tab</tt>, que passa a ter então a sua primeira posição nesse endereço. Logo <tt>tab[0]</tt> e <tt>tab[1]</tt> são respectivamente idênticos a <tt>arranjo[0]</tt> e <tt>arranjo[1]</tt>.
====Um primeiro exemplo====
O seguinte programa provê uma implementação em C++ de um algoritmo que calcula e imprime os números primos até um certo valor <math>n</math>. Esse algoritmo é conhecido como o crivo de ''Eratosthenes''.
// programa que lê um número n da entrada padrão e imprime na saída padrão todos os números primos até n
// implementa o crivo de Eratosthenes
#include <cstdio>
void compute_primes (bool sieve[], int n)
{
sieve[0] = sieve[1] = false;
for (int i = 2; i * i < n; ++i) {
if (sieve[j]) {
for (int j = i + i; j < n; j += i) {
sieve[j] = false;
}
}
}
}
int main ()
{
int i, n;
scanf("%d", &n);
if (n < 2) return;
bool sieve [n+1] = {true};
compute_primes(sieve, n+1);
for (int i = 2; i < n+1; ++i) {
if (sieve[i]) printf("%d ", i);
}
}
Detalhes sobre o crivo podem ser obtidos em: Weisstein, Eric W. "Sieve of Eratosthenes." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/SieveofEratosthenes.html
====Arranjos multi-dimensionais====▼
Como em Objective Caml, um arranjo de dimensão <math>n</math> de valores de um tipo <tt>t</tt> podem ser implementados em C e em C++ usando um arranjo de arranjos de dimensão <math>n-1</math> de valores do tipo <tt>t</tt>.▼
Uma matriz bi-dimensional de inteiros, de dimensão <math>n</math> por <math>m</math>, pode então ser declarada como:▼
int matriz [n][m];▼
====Um secundo exemplo====
float media (float tab[], int n) // calculo da media de um arranjo tab de floats de tamanho n.
}
}
▲====Arranjos multi-dimensionais====
▲Como em Objective Caml, um arranjo de dimensão <math>n</math> de valores de um tipo <tt>t</tt> podem ser implementados em C e em C++ usando um arranjo de arranjos de dimensão <math>n-1</math> de valores do tipo <tt>t</tt>.
▲Uma matriz bi-dimensional de inteiros, de dimensão <math>n</math> por <math>m</math>, pode então ser declarada como:
▲ int matriz [n][m];
===Tipos registros===
|