sexta-feira, 15 de janeiro de 2016

Como descobrir o tamanho de um vetor - Linguagem C

Sabemos que para descobrirmos o tamanho de um vetor de char ou String, basta usar o strlen da biblioteca <string.h>. Veja o exemplo:

#include <stdio.h>
#include <string.h>

int main(){
 char palavra[10];
 strcpy(palavra, "ColaboraTI");
 int tamanho;
 tamanho = strlen(palavra);
 printf("Tamanho do vetor de string: %d", tamanho);
 getchar();
}


Tamanho do vetor de string: 10

Através do comando strcpy que também é da biblioteca <string.h> é possível copiar a String para o nosso vetor palavra. E o comando strlen fica responsável por descobrir o tamanho utilizado da string palavra.

Para descobrir o tamanho de um vetor do tipo inteiro declarado em uma mesma função, por exemplo, você precisa usar o comando sizeof da biblioteca <stdio.h> através do algoritmo:

#include <stdio.h>

int main()
{
    int array[] = { 0, 1, 2, 3, 4, 5, 6 };
    printf("Length of array: %d\n", (int)( sizeof(array) / sizeof(array[0]) ));
}


Entendendo este código... Temos um array com 7 posições { 0, 1, 2, 3, 4, 5, 6 }. Cada posição equivale a 4 bits, pois estamos trabalhando com inteiros. Inteiros suportam números de até 4 bits. Como há 7 posições em um vetor de inteiros, o nosso vetor possui 28 bits. Este algoritmo descobre através do tamanho do vetor (28 bits) dividido pelo tamanho de cada posição do vetor (4 bits) que dará 7.

Tamanho do vetor: 7

O problema de usar este método para descobrir o tamanho do vetor é que ele só funciona com vetores declarados na mesma função. Ele não funciona com vetores declarados em uma função local que são passados por parâmetro em outra função. Não funciona!

Com base nisto descobri alguns métodos que funcionam localmente e que não funcionam se passados por parâmetro em outra função e métodos que funcionam das duas formas. Na verdade são 4 métodos para descobrir o tamanho de um vetor que apresento aqui.

Vamos lá! Veja o código:

#include <stdio.h>
#include <stdlib.h>
void metodo1(int arr[]){
    printf("\nMetodo 1");
    int result = *(&arr+1)-arr;
    printf("\nMETODO 1 - Resultado *(&arr+1)-arr: %d",result);
}
void metodo2(int arr[]){
    printf("\n\nMetodo 2");
    int res = sizeof(*(&arr));
    printf("\nResultado sizeof(*(&arr)): %d",res);
    int resu = sizeof(*(&arr+1));
    printf("\nResultado sizeof(*(arr+1)): %d", resu);
    int tamanho = res/resu;
    printf("\nMETODO 2 - Resultado de res/resu: %d",tamanho);
    printf("Numero: %d",(arr));
}

void metodo3(int arr[]){
    printf("\n\nMetodo 3");
    int *inicio;
    int *fim;
    int count=0;
    for (inicio = *(&arr), fim = *(&arr+1); inicio<fim; inicio++){
        count++;
        printf("\ninicio: %d",inicio);
    }
    printf("\nMETODO 3 - Count eh igual a: %d",count);
}

void metodo4(int arr[]){
    printf("\n\nMetodo 4");
    int *n = *(&arr+1);
    printf("\n\nResultado &arr+1: %d",*n);
    int *n1 = *(&arr);
    printf("\nResultado &arr: %d",*n1);
    int g = n-n1;
    printf("\n\nMetodo 4- Resultado de n-n1: %d",g);
}

int main(){
    int arr[12] = {1};
    int opcao;
    do{

    printf("MENU: ");
    printf("\n\n1 - Metodo 1");
    printf("\n2 - Metodo 2");
    printf("\n3 - Metodo 3");
    printf("\n4 - Metodo 4");
    printf("\nOpcao: ");
    scanf("%d",&opcao);
  
    switch(opcao){
        case 1: metodo1(arr);
      
        break;
        case 2: metodo2(arr);
        break;
        case 3: metodo3(arr);
        break;
        case 4: metodo4(arr);
    }
    getchar();
    getchar();
    system("cls");
  
    }while(opcao!=5);
  
}


Bem! O método 1 foi proposto nesta página How to find size of an array in C without sizeof.

Arjun Sreedharan faz todo um estudo sobre como funciona a alocação de um
 vetor na memória. Você pode se aprofundar se quiser conferindo o artigo
 dele. O método 1 funciona perfeitamente.

Metodo 1
METODO 1 - Resultado de *(&arr+1)-arr: 12

O método 2 é aquele mesmo que já expliquei sobre o uso do sizeof. A
diferença é porque foi usado o conhecimento de ponteiros.
sizeof(*(&arr)) é equivalente a sizeof(array) e sizeof(*(&arr+1)
 é equivalente a sizeof(array[0]). O método 2 estamos trabalhando
diretamente com os endereços diferente do uso do sizeof que expliquei
anteriormente. Este método não funciona como desejado.

Metodo 2
Resultado sizeof(*(&arr+1):4
METODO 2 - Resultado de res/resu: 4

O método 3 usa do conhecimento de que se &arr é igual ao endereço da
 primeira posição do vetor(arr[0]) e &arr+1 é o endereço da primeira
 posição do próximo vetor que fica vizinho a ele na memória(digamos
arr1[0] que foi alocada pelo SO vizinho ao vetor arr). O método 3 usa um
 for para passar de posição em posição do vetor arr. Há uma variável
contadora que conta quantas posições foram encontradas no vetor. Ele dá
todos os endereços entre &arr e &arr+1. A última linha do
resultado é esta:

METODO 3 - Count eh igual a 12

O método 3 funciona perfeitamente. O método 4 é semelhante ao método 1 tanto que se baseia nele.



Valeu, galera! Testem o código!

Estou usando o Dev-C++ 5.5.3 com o compilador MinGW GCC. Até mais!

quinta-feira, 20 de agosto de 2015

Usando BigDecimal - Trabalhando com números gigantes

Para números gigantes, uma boa ideia é usar a classe: BigDecimal.

Para criar uma variável deste tipo:

BigDecimal variavel = new BigDecimal(0);

É possível somar, subtrair, dividir, multiplicar, dentre outras possibilidades. Divirta-se.

Porque usar o BigDecimal?

Porque o tipo double que gostamos de utilizar ao trabalhar com grandes números é bem limitado. Ao invés de utilizar o double podemos utilizar a classe BigDecimal que permite trabalhar com grandes números com boa precisão.

Um exemplo da utilização do double que não satisfaz nossas expectativas:

public class Limite {
public static void main(String[] args){
double soma = 30000000+30000000;
System.out.println(soma);
}
}

Ao somar 30.000.000 com 30.000.000, o console do seu IDE irá devolver um resultado em hexadecimal:

6.0E7 

Para resolver este problema sugiro o uso da classe BigDecimal quando estes tipos de problemas aparecerem ou mesmo para evitar tais problemas. Vamos ao exemplo usando a classe BigDecimal:

import java.math.BigDecimal;

public class Limite {
public static void main(String[] args){
BigDecimal soma = new BigDecimal(0);
soma = new BigDecimal(300000000).add(new BigDecimal(300000000));
System.out.println(soma);
}
}

Foi usado o mesmo exemplo anterior só que usando a classe BigDecimal. O resultado mostrado no console é:

600000000

Se você quer trabalhar com novas operações usando a classe BigDecimal o autocomplete de sua IDE pode ser muito útil. Veja:


 Curta! Siga! Comente!

Até breve!

terça-feira, 28 de maio de 2013

Criando uma página hello world em HTML

Bem para começar HTML significa Linguagem de Marcação de Hipertexto. Estes sites modernos, cheio de animações são feitos com HTML, CSS e Javascript. Podem ser feitos com outras linguagens, frameworks também. Mas vamos ao nosso pequeno código HTML.
Comece colocando as tags: <html></html>

<html>
</html>

Depois coloque as tags <head></head> que será o nosso cabeçalho

<html>
      <head></head>
</html>

Dentro do cabeçalho escreva as tags <title></title> para dar um título a nossa página

<html>
      <head>
            <title>Hello World</title>
      </head>
</html>

Com este pequeno código o nosso cabeçalho já está montado. Mas vamos trabalhar também com a tag body que é responsável pelo corpo da página, os dados que precisamos ler, ver, estão na tag body. Escreva as tags <body</body>

<html>
      <head>
            <title>Hello World></title>
      </head>
      <body>
         
      </body>
</html>

Pronto escrevemos as tags body, mas ainda não tem conteúdo. Podemos usar tags para colocar imagens, vídeos, texto. Mas desta vez usaremos a tag <p></p> que é justamente a tag para os parágrafos.

<html>
      <head>
            <title>Hello World></title>
      </head>
      <body>
            <p>Hello World!</p>
            <p>Esta deve ser sua primeira página!</p>
      </body>
</html>

Você pode colocar quantas páragrafos você quiser! Creio que você está usando um bloco de notas. Salve o arquivo como hello.html
Por enquanto é só!
Thank you very much!

quarta-feira, 27 de fevereiro de 2013

Ubuntu Agora!

O Ubuntu é filho do Unix, antigo sistema operacional criado por Ken Thompson e Dennis Ritchie. Por ser alvo de estudos em várias universidades do mundo, o Unix que conhecemos hoje não é proprietário. Exemplo de uma universidade que contribuiu para o crescimento e desenvolvimento é a universidade de  Berkeley.

Porque Ubuntu Agora?

Porque eu to usando, ora mais!

Comecei a usar o Ubuntu 12.04(entrar definitivamente no software livre) no dia 28 de fevereiro deste ano. Minha experiência é das melhores. Estou gostando muito.
Gosto:
  • Facilidade de instalação de novos programas pela Central de programas
  • Facilidade para encontrar aplicativos ou seus arquivos(basta teclar a tecla super e digitar o nome do arquivo)
  • Você pode ver seus arquivos do windows e do sistema de arquivos do Ubuntu
  • Tela limpa de aplicativos abertos, menus(você só ver se você passar o mouse)
  • Organização do sistema operacional garante uma maior produtividade
  • Rapidez da inicialização e do desligamento do sistema operacional
  • Atualizações de inúmeros aplicativos, do sistema em único lugar
  • Aplicativos alternativos(e bons) aos proprietários do windows
  • Boa documentação do Ubuntu, fóruns, e tal
  • E por aí vai
Dá medo?

Terminais, sistema operacional desconhecido, aplicativos desconhecido. Que nada! O terminal facilita a sua vida. O sistema embora diferente você se acostuma e rapidamente já estará produzindo com o OpenOffice e outros aplicativos que gostar. Você pode usar os aplicativos do windows com o wine. Segure o super e você verá os comandos pra facilitar sua vida no Ubuntu. O Ubuntu permite que você altere o papel de parede e o configure de forma segura o seu sistema. Cuidado com a idéia de querer deixá-lo mais elegante, cheio de efeitos com programas com este intuito. Você estará deixando o sistema lento. Pra mim do jeito que é instalado está bom demais. Só fazer as atualizações, instalar uns aplicativos importantes, mudar se quiser o papel de parede e usar normalmente.

Livre de vírus

A imensa maioria dos vírus são feitos para Windows e Mac, sendo assim vírus para Linux são raros. Este negócio de está frequentemente diagnosticando o sistema com o antivírus é pra sistemas operacionais proprietários.

Único desfavor

É que o comércio produz aplicativos e jogos mais para o Windows do que para o Linux. Mas já disse há aplicativos alternativos a estes.

Pois é!

Estou completando um mês usando o Ubuntu e as expectativas são as melhores. Use você também. Instale o Ubuntu paralelo ao seu Windows. Daqui a pouco você estará usando mais ao Ubuntu. Valeu galera!
 

 
Related Posts Plugin for WordPress, Blogger...