Arquivos de Tags: Linguagem C

[Programação] Utilizando argumentos em C ou que diabos é esse argc e argv ?

Uma dúvida clássica dos iniciantes em c, para que diabos serve aquele argc e argv que ficam na função main quando criamos o código?

Pois bem jovem gafanhoto, como já devem ter estuda nas aulas de algoritmos, funções são blocos de códigos dispostas pelo código-fonte, ela servem para facilitar a manutenção, codificação do programa, etc; elas possuem duas características elas podem ou não ter:

  • Argumentos
  • Retorno

A função deve fazer alguma e pode retornar o resultado dessa operação que ela fez, e os argumentos são parâmetros (ou informações se preferir) que passamos para a função.

A função main é uma função especial, pois ela é a primeira a ser executada e também quem receberá os argumentos argc e argv. Quando um programa e chamado podemos definir certas opções, por exemplo:

O comando ls em execução

Digitei o comando ls, e ele executou e retornou para tela uma listagem dos arquivos e diretórios. Agora o que acontece quando coloco o parâmetro -l:

Comando ls sendo executado com o parâmetro -l

Viram a diferença ?

Como puderam ver, um ls e o ls -l executaram a tarefa de uma forma diferente, se o ls fosse um programa em C, a função main dele teria um argc e um argv, no seu argc teríamos o valor 1 e no argv uma string contendo -l.

Entenderam? Não? Hehe é simples o argc contará a quantidade parâmetros inseridos na hora que a aplicação foi executada, e o argv conterá os parâmetros inseridos, simples assim.

Vejamos um código exemplo que recebe argumentos e imprimi os mesmo na tela:

/*

Usando argumento

Codigo que apresenta o uso de argumentos em C

*/

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("O nome do programa sempre sera em argv[0]\n");
    printf("Nome do programa: %s\n\n", argv[0]);

    printf("Em argc temos a quantidade de argumentos passados\n");
    printf("Qtd de argumentos: %d\n\n", argc);

    int i;
    for(i = 0; i < argc; i++) {

        printf("O argumento %d foi %s\n", i, argv[i]);
    }

    return 0;
}

Agora vamos compilar e executar com os comandos: gcc argumentos.c -o argumentos e execute com ././argumentos arg1 arg2 blabla qualquercoisa vejamos o resultado:

Compilação e execução.

Pera ae que negócio e esse de ./argumento em argumento 0? Simples, sempre o primeiro argumento o argv[0] será o nome do programa. Igual nos seus shellscript com o $0. Agora que você está fera e manjando tudo de argc e argv fica abaixo um código-fonte de um calculadora básica que utiliza argumentos para ser executada, estude ela e explique nos comentários se entender para que serve e por que utilizei a função atof.

/*
Autor: Herberson S.M. aka VonNaturAustreVe
Email: vonnatur@0fx66.com
Data: 10/08/2011
-----------------------------------------------------------------------
English
calculator that demonstrates the use of arguments in C

Use:

calc_arg num1 operation num2

num1 and num2 = number wish

operation =
    + -> sum
    - -> subtraction
    x - multiplication
    / -> division
-----------------------------------------------------------------------
Portuguese

Calculadora com argumentos
Uso:
calc num1 operacao num2

num1 and num2 = numeros

Operacao:
    + -> sum
    - -> subtraction
    x - multiplication
    / -> division
-----------------------------------------------------------------------

*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

float soma(float var1, float var2);
float subt(float var1, float var2);
float mult(float var1, float var2);
float divisao(float var1, float var2);

void erro();

int main(int argc, char **argv)
{
    if(argc == 4) {    //Testa para saber se tem todos os parametros necessarios para a execusao

        switch(argv[2][0]) {    //Usei argv[2][0] para pegar o sinal da operacao

            case '+':
                printf("Resultado: %f\n", soma(atof(argv[1]), atof(argv[3])));
            break;

            case '-':
                printf("Resultado: %f\n", subt(atof(argv[1]), atof(argv[3])));
            break;

            case 'x':
                printf("Resultado: %f\n", mult(atof(argv[1]), atof(argv[3])));
            break;

            case '/':

                if(atof(argv[3]) == 0) {    //Caso exista uma divisao por zero.
                    printf("Impossivel divisao por zero\n");
                }

                else{    //Se nao houver divisao por zero
                    printf("Resultado: %f\n", divisao(atof(argv[1]), atof(argv[3])));
                }
            break;

            default:
                erro();
            break;
        }
        puts("");
    }
    else {
        erro();
    }

    return 0;
}

//funcoes
void erro() {
    printf("Parametros incorretos\n");
    printf("Use: calc_arg numero operacao numero\n");
    printf("A operacao deve ser +, -, x, /\n");
}

float soma(float var1, float var2) {

    return var1+var2;
}

float subt(float var1, float var2) {

    return var1-var2;
}

float mult(float var1, float var2) {

    return var1*var2;
}

float divisao(float var1, float var2) {

    return var1/var2;
}

Boa sorte, e bons estudos.

[]‘s

[Programação] Números aleatórios em C + gerador de senhas em C

[Programação] Números aleatórios em C + gerador de senhas em C

Os computadores são as máquinas mais burras que existem, só entendem duas coisas, código binário (1 e 0 ) e instruções do que fazer com esse código binário (algoritmos). Então já devem ter se perguntado, como valores aleatórios são criados se o computadores não são espertos para inventar valores?

Aleatoriedade

Os computadores não conseguem seguir uma ordem simples como nos humanos seguimos “crie um valor aleatório”, isso e fácil para o nosso cérebro, mas para os computadores não é bem assim, vou deixá-los chocados com isso, mas computadores não geram valores aleatórios, eles trabalham com pseudoaleatório (ou pseudo-aleatório, maldita nova norma), sim eles utilizam uma falsa aleatoriedade.

Como assim uma false aleatoriedade?

A Wikipédia define pseudo-aleatoriedade como: “Um processo pseudoaleatório é um processo que parece ser aleatório mas não é. Sequências pseudoaleatórias tipicamente exibem aleatoriedade estatística enquanto estão sendo geradas por um processo inteiramente determinístico. Tal processo é mais fácil de se produzir do que um genuinamente aleatório, e tem o benefício de poder ser utilizado vezes seguidas para produzir exatamente os mesmos números, o que é útil para teste e correção de software.”[1]

Existem duas formas (se conhecer mais avise nos comentários), para gerar números aleatórios:

  • A partir de eventos na natureza, velocidade do vento, decaimento dos níveis de radioatividade.
  • Criando um algoritmo que quando e executado gera uma sequencia de números que parece aleatório para quem não conhece o algoritmo ou a formula usada pelo algoritmo para gerar valores aleatórios. Uma boa formula costuma ter algumas características comuns:
    • Não repetição: Não costuma repetir os valores.
    • Boa distribuição numérica: Se a fórmula está gerando números aleatórios entre 0 e 9, o número de zeros, uns, dois, etc. que ela gera devem ser aproximadamente iguais depois de um longo período de tempo.
    • Ausência de previsões: você não tem como prever qual será o próximo número, a não ser que conheça a fórmula.

Aqui está um exemplo de uma fórmula simples de número aleatório do livro “A Linguagem de Programação em C”, de Kernighan e Ritchie:

int rand()
{
    random_seed = random_seed * 1103515245 +12345;
    return (unsigned int)(random_seed / 65536) % 32768;
}

Quando programamos na linguagem C e precisamos lidar com valores aleatórios usamos as funções rand() e srand(), como a função rand(). A função rand() gera um inteiro entre 0 e RAND_MAX, com igual probabilidade de ocorrer ou seja gera uma sequência de valores que se repete igual a si própria sempre que o programa é executado. Porque, a semente da sequência é sempre a mesma, por isso o seu valor nunca muda.

Para que ela produza uma sequência diferente é necessário, mudar a seed (no protótipo acima seria a random_seed) usando a função srand(), cujo argumento inteiro (sem sinal) é a nova semente e que não retorna nenhum valor. Se se pretender uma sequência diferente, sempre que o programa é executado, e o utilizador não seja obrigado a introduzir a semente, podemos usar uma função que retorna o valor do relógio do computador em segundos (e cujo protótipo está em time.h): srand(time(NULL)).

Abaixo segue um código fonte de um gerador de senhas que desmonstra o uso das funções rand() e srand().

Código

Construir um gerador de senha e uma tarefa bastante simples, utilizando as funções rand() e srand() e a tabela ASCII :)

/*
Gerador desenhas
Desenvolvido por: Herberson da Silva Miranda
Contato: vonnatur[at]0fx66.com
*/

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

void fGerarSenha(int t);

int main(int argc, char *argv[])
{
int tamanhoDaSenha = 0;

    srand(time(NULL));      //Utilizada pela rand()

    if(argc <= 1)
    {
    printf("Sintaxe: gerador N\nSendo N igual a qtd d caracteres da senha\n");
    exit(1);
    }

    /*A string referente a qtd de digitos ser transformada em um numero inteiro.:wq
     A funcao atoi esta sendo usada para essa tarefa: recebe a string e
    transforma no inteiro equivalente */
    tamanhoDaSenha = atoi(argv[1]);

    fGerarSenha(tamanhoDaSenha);

    return 0;
}

/*Esta funcao efetua a geracao de uma senha, utilizando os recursos das funcoes srand() e rand()*/
void fGerarSenha(int t)
{
    int var,i;

    for(i=0; i<t; i++)
    {
        var = 32 + (rand() % 94); //Utiliza os caracteres da posicao 32 a 126 da tabela ASCII
        printf("%c", var);
    }
    puts("");
}

Links interessantes

QRBG – Quantum Random Bit Generator, é um gerador de valores aleatórios que utiliza principios da física quântica.

Técnicas e Algoritmos – Números aleatórios com a linguagem PHP.

Como os Computadores geram Números aleatórios – Neste artigo são apresentados uma séries de formas matemáticas para trabalhar com a geração de números aleatórios.

[]‘s

[Artigo] Programando em C com SQLite3

Programando em C com SQLite3

Autor: Herberson da Silva Miranda

1 – Introdução

O SQLite3 fornece recursos para que os desenvolvedores possam armazenar os dados de suas aplicações em tabelas e manipular esses dados através de comandos SQL ou seja criando bancos de dados para seus softwares. A grande vantagem em utilizar SQLite para armazenar essas informações que seu uso dispensa a necessidade de um SGDB de grande porte, como MySQL ou PostgreSQL, em suas aplicações, podendo armazenar tudo em um simples arquivo.

Ler mais »

[Programação] Funções hiperbólicas em C

Em textos anteriores vimos as arcfunções em C, funções trigonométricas como seno, cosseno, tangente em C, hoje conheceremos os recursos que a linguagem C nos oferece para trabalhamos com funções hiperbólicas.

Em C temos as funções:

sinh ();
cosh ();
tanh ();

Ambas recebem valores do tipo double e retornam double também.

Códigos exemplo:

#include <stdio.h>
#include <math.h> //Biblioteca matematica

int main ()
{
        double a,b,c,a1,b1,c1;

        printf("Codigo simples que calcula:\n");
        printf("- seno hiperbpolico de a\n");
        printf("- cosseno hiperbolico de b\n");
        printf("- tangente hiperbolico de c\n");

        printf("Digite um valor para a:");
        scanf("%lf",&a);

        printf("Digite um valor para b:");
        scanf("%lf",&b);

        printf("Digite um valor para c:");
        scanf("%lf",&c);

        //Calculos
        a1 = sinh(a);
        b1 = cosh(b);
        c1 = tanh(c);

        printf("Resultados:\n");
        printf("Seno hiperbolico de a: %lf\n",a1);
        printf("Cosseno hiperbolico de b: %lf\n",b1);
        printf("Tangente hiperbolica de c: %lf\n",c1);

        return 0;
}

Foi utilizado o compilador: gcc versão 4.4.5, em caso de erros durante a compilação usar o parâmetro -lm.

[]‘s

[Programação] Concatenando String em C

Para concatena strings usamos a função strcat(String de destino, String de origem), que está localizada no header string.h vejamos um exemplo do seu uso prático:

#include <stdio.h>
#include <string.h> //Header necessario para usar a funcao strcat()

int main()
{
	char string1[99] = "Joao";
	char string2[] = " e Maria";

	//Concatena a string1 e string2;
	strcat(string1,string2);

	printf("String concatenada: %s",string1);

	return 0;
}

Como podemos ver o resultado desta operação e simples:

String concatenada: Joao e Maria

Devemos sempre tomar cuidado com o uso da função strcat(), pois a string de destino deve ser pre-dimensionada, e deve ter espaço suficiente para receber a string de origem, veremos futuramente como evitar esse erro.

Boa sorte e bons estudos.

[]‘s

Pagina 1 of 71234567
SEO Powered by Platinum SEO from Techblissonline