Archive for setembro, 2009

A declaração“padrão”da função Main

Normalmente utilizamos começamos um programa em C da seguinte maneira:

#include <stdio.h>

main() {
    printf("Ola, Mundo!!!");
}

 

Isso funciona, porém é interessante notar que os compiladores C mais novos podem retornar “warnings” ou até mesmo erros referente a utilização da função main dessa maneira.

Isso acontece porque na norma C99 [em inglês], aonde está redigido os novos padrões da linguagem C, foi explicitado como a função main deve ser declarada, veja:

#include <stdio.h>

int main (int argc, char * argv[]) {
	printf("Ola, Mundo!!!");
	return 0;
}

Percebam algumas mudanças, primeiro a função main passou a retornar um inteiro, ganhou 2 argumentos, int argc e char * argv, que possibilitam o programa a receber parâmetros externos.

Veja o exemplo abaixo

#include <stdio.h>

int main (int argc, char * argv[]) {
	int i;
	printf("\n\n\n\n");
	printf("Nome do programa.....: %s\n",argv[0]);
	printf("Numero de argumentos.: %d\n",argc);
	if(argc > 1) {
        printf("\n\n**** .A.R.G.U.M.E.N.T.O.S. ****\n\n");
    }
	for(i = 1; i <= argc; i++) {
        if(argv[i] != NULL) {
            printf("Argumento %d..........: %s\n",i,argv[i]);
        }
    }
    printf("\nFim...\n");
	return 0;
}

Esse exemplo acima irá mostrar todos os parâmetros que você passar para o programa, abaixo um exemplo da saída, imaginando que meu executável chame teste.exe, e que eu tenha executado ele passando alguns parâmetros:

argc_argv3

É isso!!!!

A história da internet

Vejam um vídeo mostrando do começo da internet até os dias de hoje.

Vídeo indicado por @andretoledo (Obrigado)

Um bate papo sobre a “velharia” da informática

300-podcast-ctap-smallOla pessoas, gostaria de apresentar a vocês um bate-papo sobre as antigüidades da informática, gravados no formato de podcast(conhecem podcast???) aonde Eu e o Guto conversamos sobre a informática de antigamente, até chegando aos dias de hoje!

Para os que não viveram a época dos XT, Cartão perfurado e outras coisas, vale a pena, para os que conheceram tudo isso… fica como nostalgia.
Espero que gostem.

O Link para quem se interessar, Podser Podcast

Recursão

Um assunto simples, porém complexo:

Mais afinal, o que é recursão?
Em programação, a maneira mais simples de explicar o que é recursão é dizer que ela é um método de programação no qual um função chama a si mesma.

A chamada de um método para ele mesmo, é igual a chamada de qualquer outro método, exemplo de método recursivo que calcula o fatorial n!:

Fatorial

O fatorial de um número é dado pela multiplicação de seus antecessores, ou seja, se n é igual 3, então seu fatorial será 3 * 2 * 1. O fatorial de 0! (zero) é igual a 1.

int fat(int num){
    int fato;

    if (num == 1)
       return (1);
    else
        fato = num * fat (num-1);
    return fato;
}

Em qualquer algorítimo recursivo, devemos nos atentar a necessidade de um ponto de parada, ou  seja, uma condição aonde a recursão irá parar de se chamar.

No exemplo acima, essa condição é quando o fatorial for igual a 0 (Zero), na fórmula (desenho acima): Retorne 1 Se N for igual a 0

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

int fat(int num){
    int fato;

    if (num == 1)
       return (1);
    else
        fato = num * fat (num-1);
    return fato;
}

int main(void){
     int numero;
     printf("\nEntre com um numero positivo.");
     scanf("%u", &numero);
     printf("O fatorial de %u vale %u.\n", numero, fat(numero));
}

Chamando o método fatorial(3), queremos calcular 3 * 2 * 1.
-> 3 * fatorial(2) retorna (6)
-> -> 2 * fatorial(1) retorna (2)
-> -> -> 1 * fatorial(0) retorna (1)

Explicando o fluxo do programa:

1) O método fatorial recebe o valor de x igual a 3, verifica se x é igual a 0 (zero), como não é igual a 0 (zero), então calcula 3 multiplicado por fatorial(2), neste ponto estamos fazendo uma chamada recursiva.

2) O método fatorial recebe o valor de x igual a 2, verifica se x é igual a 0 (zero), como não é igual a 0 (zero), então calcula 2 multiplicado por fatorial(1).

3) O método fatorial recebe o valor de x igual a 1, verifica se x é igual a 0 (zero), como não é igual a 0 (zero), então calcula 1 multiplicado por fatorial(0).

4) O método fatorial recebe o valor de x igual a 0 (zero), verifica se x é igual a 0 (zero), então para a execução do método e retorna o valor 1.

5) Volta para o método fatorial(1) na linha 26 e faz a multiplicação de x que vale 1 pelo resultado do fatorial(0) que é 1, ou seja 1 * 1 e retorna o valor 1.

6) Volta para o método fatorial(2) na linha 26 e faz a multiplicação de x que vale 2 pelo resultado do fatorial(1) que é 1, ou seja 2 * 1 e retorna o valor 2.

7) Volta para o método fatorial(3) na linha 26 e faz a multiplicação de x que vale 3 pelo resultado do fatorial(2) que é 2, ou seja 3 * 2 e retorna o valor 6.

8) Volta para o método que chamou o fatorial(3), neste caso o método main na linha 7, guarda o resultado do fatorial(3) que é 6, dentro da variável resp, e imprime o resultado da variável resp na linha 8.

Idéias e mais informações: Blog do Rafael Sakurai, Vale a visita, observem o exemplo de colocar valores em ordem crescente.

Mais links:

Read more…

Exemplos: Funções e Vetores

Sistema de Controle de Livros

Um aluno do Curso de TADS resolveu ajudar seus familiares e desenvolver um sistema para fazer o controle de livros de sua biblioteca particular, antes de começar ele fez um levantamento do que seria necessário ter no sistema, o encontrado foi:

Cadastrar livros
- Numero do Registro
- Título
- Autor
- Numero da estante
- Numero da prateleira

Tendo essa estrutura, o aluno colocou como características para que o sistema tornasse utilizável, são elas:

- Um menu de opções aonde seria escolhido as operações disponíveis:

  • Cadastrar uma Obra
  • Consultar uma Obra
  • Consultar todas as obras

Abaixo um programa simples para mostrar a resolução do problema proposto, utilizando menus, arrays e funções:

#include <stdio.h>
#define MAX 10

// Variaveis Globais
struct estante {
	int estante;
	int prateleira;
};

struct livro {
	int reg;
	char titulo[80];
	char autor[100];
	struct estante posicao;
};

struct livro livros[MAX];
int    livre;  // Variavel auxiliar, responsavel por saber quantos livros ja foram cadastrados

int menu(void) {
	// variaveis locais
	int retorno;

    // Menu
	printf("\n\n\n");
	printf("****************************************************\n");
	printf("**              Controle de Livros                  \n");
	printf("****************************************************\n");
	printf("** Escolha a opcao desejada:                        \n");
	printf("**                                                  \n");
	printf("** 1 ) Cadastrar uma obra                           \n");
	printf("** 2 ) Consultar uma obra                           \n");
	printf("** 3 ) Listar todas as obras                        \n");
	printf("** 0 ) SAIR                                         \n");
	printf("**                                                  \n");
	printf("** Entre com a opcao desejada : ");
	scanf("%d",&retorno);

	return retorno;
}

void cadastrar(void) {
	printf("\n\n\n");
	printf("****************************************************\n");
	printf("**              CADASTRO DE OBRAS (%d/%d)           \n",livre,MAX);
	printf("****************************************************\n");
	printf("**\n");
	if (livre != MAX) {
		printf("** Numero do Registro...: "); scanf("%d",&livros[livre].reg);
		fgetc(stdin); // Limpando o buffer de teclado
		printf("** Titulo da Obra.......: "); fgets(livros[livre].titulo, 80, stdin);
		printf("** Autor da Obra........: "); fgets(livros[livre].autor, 100, stdin);
		printf("** Numero da Estante....: "); scanf("%d",&livros[livre].posicao.estante);
		printf("** Numero da Prateleira.: "); scanf("%d",&livros[livre].posicao.prateleira);
		printf("**\n");
		printf("**\n");
		printf("**  Registro %d cadastrado com sucesso!               ",livros[livre].reg);
		livre++;
	} else {
		printf("**             ESPACO INSUFICIENTE                  \n");
	}
}

void listar_todos(int registro) {
	int i;
	int imprime;
	int controle = 0;
	printf("\n\n\n");
	printf("****************************************************\n");
	printf("**                 Listando OBRAS                   \n");
	printf("****************************************************\n");
	printf("**\n");
	if(livre > 0) {
		for(i = 0; i < livre; i++) {
			if(registro != 0) {
				imprime = (livros[i].reg == registro);
			}
			if(imprime) {
				printf("** Numero do Registro...: %d\n",livros[i].reg);
				printf("** Titulo da Obra.......: %s",livros[i].titulo);
				printf("** Autor da Obra........: %s",livros[i].autor);
				printf("** Numero da Estante....: %d\n",livros[i].posicao.estante);
				printf("** Numero da Prateleira.: %d\n",livros[i].posicao.prateleira);
				printf("**\n");
				controle++;
			}
		}	

		if((registro != 0) && (controle == 0))
			printf("** REGISTRO NAO ENCONTRADO \n");
	} else {
		printf("**             ESTANTES VAZIAS                  \n");
	}
	printf("\n\n");
}

void lista_especifica(void) {
	int reg;
	printf("\n\n\n");
	printf("****************************************************\n");
	printf("**                 Listando OBRAS                   \n");
	printf("****************************************************\n");
	printf("**\n");
	printf("** Entre com o numero do registro....: "); scanf("%d",&reg);
	listar_todos(reg);
}

int main (void) {
	// variaveis locais
	int opcao = 1;

	// Inicializacao das variaveis
	livre = 0;

	while(opcao != 0) {
		opcao = menu();
		switch(opcao) {
			case 1 : {
				// chamada da funcao cadastrar obra
				cadastrar();
				break;
			}
			case 2 : {
				// chamada da funcao consultar obra
				lista_especifica();
				break;
			}
			case 3 : {
				// chamada da funcao listar todos
				listar_todos(0);
				break;
			}
			case 0 : {
				printf("\n\n");
				printf("** Obrigado por utilizar o sistema...               \n\n\n");
				opcao = 0;
				break;
			} // Fim case
		} // Fim Switch
	} // Fim While

	return 0;
} // Fim main

Primeiro post

Só pra fazer a apresentação, pretendo disponibilizar nesse espaço, informações úteis sobre as disciplinas que estou lecionando.

Para começar – Programação Estruturada II, linguagem C.

#include <stdio.h>

void main(int argc, char *argv[]) {
    printf("Bem vindos!!!");
}