Logo Hardware.com.br

Programação, Scripts, Web e Banco de Dados

Sala destinada para compartilhar conhecimentos, questões, dúvidas e dicas sobre linguagens de programação para Web, como Java, C, PHP, C++, ASP, Delphi, Perl, JavaScript, Kylix, entre outras, hospedagem Web, gerenciamento, aplicação e modelos de Banco de Dados (Oracle, SQL Server, DB2, PostgreSQL, MySQL etc), scripts e rotinas.

0
9
locked

Importante: Leiam antes de postar - Highlight de sintaxe

Como muitos de vocês já devem ter percebido, nossa nova plataforma no fórum permite fazer highlight da sintaxe dos códigos, para uma ampla gama de linguagens de programação.
Portanto, solicitamos que usem essas ferramentas. Isso torna os códigos mais legíveis, fazendo com que outras pessoas tenham mais chances de entender corretamente seus códigos ou scripts. Além disso, uma leitura facilitada aumenta as chances de se obter ajuda.

Também não esqueçam de "indentar" corretamente seus códigos.

Abaixo, algumas dicas e exemplos para que seus trechos de códigos recebam o highlight adequado:

Linguagem C
[noparse][code=C]/*Código em C qualquer */[/code][/noparse]
Resultado:
[code=C]
#include
#include

int main() {

printf("Olá mundo!");
return 0;

}[/code]

Linguagem Java
[noparse][code=Java]//Código qualquer em Java[/code][/noparse]
Resultado:
[code=Java]
//Estabelece conexão. Se for servidor, começa a escutar na porta 8080
// Se for cliente, conecta em algum servidor que já está escutando na porta 8080
//Pode lançar exceção para o construtor, que relançará para as classes exteriores
//(onde será tratada)
private void createConnection (boolean tipo) {
try {
if (tipo) {
//True: Servidor
//Observação: Thread congela até que um cliente se conecte, por isso roda em uma thread separada
servidor = new ServerSocket(8080);
conexao = servidor.accept();
} else {
//False: Cliente
conexao = new Socket (enderecoDoServidor, 8080);
}

//Cria fluxos de conexão
saida = new ObjectOutputStream(conexao.getOutputStream() );
saida.flush();
entrada = new ObjectInputStream (conexao.getInputStream());
} catch (IOException ioe) {
jp.mostraMensagem("Ocorreu um erro ao configurar as conexões.");
System.exit(1);
}
}
[/code]

PHP
[noparse][code=PHP]Código aqui[/code][/noparse]
Resultado:
[code=PHP]<?php echo 'Isto é um teste';?>
<?php echo 'Isto é um teste' ?>[/code]


Lista de Linguagens Suportadas
Muitas outras sintaxes são suportadas:

  • ABAP

  • Actionscript

  • ADA

  • Apache Log

  • AppleScript

  • APT sources.list

  • ASM (m68k)

  • ASM (pic16)

  • ASM (x86)

  • ASM (z80)

  • ASP

  • AutoIT

  • Backus-Naur form

  • Bash

  • Basic4GL

  • BlitzBasic

  • Brainfuck

  • C

  • C for Macs

  • C#

  • C++

  • C++ (with QT)

  • CAD DCL

  • CadLisp

  • CFDG

  • CIL / MSIL

  • COBOL

  • ColdFusion

  • CSS

  • D

  • Delphi

  • Diff File Format

  • DIV

  • DOS

  • DOT language

  • Eiffel

  • Fortran

  • FourJ's Genero

  • FreeBasic

  • GetText

  • glSlang

  • GML

  • gnuplot

  • Groovy

  • Haskell

  • HQ9+

  • HTML

  • INI (Config Files)

  • Inno

  • INTERCAL

  • IO

  • Java

  • Java 5

  • Javascript

  • KiXtart

  • KLone C & C++

  • LaTeX

  • Lisp

  • LOLcode

  • LotusScript

  • LScript

  • Lua

  • Make

  • mIRC

  • MXML

  • MySQL

  • NSIS

  • Objective C

  • OCaml

  • OpenOffice BASIC

  • Oracle 8 & 11 SQL

  • Pascal

  • Perl

  • PHP

  • Pixel Bender

  • PL/SQL

  • POV-Ray

  • PowerShell

  • Progress (OpenEdge ABL)

  • Prolog

  • ProvideX

  • Python

  • Q(uick)BASIC

  • robots.txt

  • Ruby

  • Ruby on Rails

  • SAS

  • Scala

  • Scheme

  • Scilab

  • SDLBasic

  • Smalltalk

  • Smarty

  • SQL

  • T-SQL

  • TCL

  • thinBasic

  • TypoScript

  • Uno IDL

  • VB.NET

  • Verilog

  • VHDL

  • VIM Script

  • Visual BASIC

  • Visual Fox Pro

  • Visual Prolog

  • Whitespace

  • Winbatch

  • Windows Registry Files

  • X++

  • XML

  • Xorg.conf


(fonte)

Para maiores informações:
https://www.hardware.com.br/comunidade/help/bb-codes

Preciso de Ajuda! O que eu faço?
Leia o nosso novo Guia de Utilização. Caso não tenha sua dúvida sanada, poste na sala Fale Conosco.
9

5 vícios que devem largar em C

Imagem
5 vícios que devem largar na linguagem C


Introdução



Esse artigo tem como objetivo educar certos programadores evitarem técnicas ridículas e perigosas na linguagem C. Eu considero essas técnicas de vícios, pois até em universidades que conheço, existem trolhas (ops! professores) que ensinam "o mau caminho" aos futuros programadores profissionais.

Se este artigo for de tamanho interesse para si, peço a sua total atenção, pois acredito que vai ajudar a evitar e a superar certos problemas que alguns programadores encontram na linguagem C.

Vício 1 - Usar system("pause")

Bom, isso até o meu próprio professor de programação ensina mostrando_lingua.png. Como bem sabemos, o protótipo da função system() está declarada em stdlib.h, esta mesma função nos permite invocar comandos do sistema operativo em uso dentro de um código C/C++.

No Linux o comando clear por exemplo limpa a tela do terminal:
[code=rich]
system("clear");
[/code]
Já no Windows, usa-se o comando cls:
[code=rich]
system("cls");
[/code]

Mas, vamos nos focar no cerne deste tópico, o famigerado system("pause"). O pause é um comando interno do interpretador de comandos do Windows (aka cmd.exe), e tem o propósito de pausar ou interromper a janela de comandos (a tela preta) e emitir a mensagem "Prima qualquer tecla para continuar".

Muitos iniciantes na linguagem C usam essa aberração com o propósito de ver a saída ou o resultado de seus programas, antes da consola fechar e o programar terminar.
[code=rich]
#include

/* Este programa faz a soma entre 2 números e guarda o resultado em a*/
int a=2;
int b=2;

int main()
{
a = a+b;
printf("%i",a);
}

[/code]

Para a infelicidade de alguns, o código acima não dá a possibilidade do programador ver o resultado da soma na tela, "a tela pisca" e nem dá chance de eu ver os resultados. Foi daí que algum programador maluco, inventou a solução avassaladora que está no código abaixo:
[code=rich]
#include

/* Este programa faz a soma entre 2 números e guarda o resultado em a*/
int a=2;
int b=2;

int main()
{
a = a+b;
printf("%i",a);
system("pause"); //Mataram
}

[/code]

Até agora não expliquei o motivo desta técnica ser tão horrível, mas cá vai, primeiro é pelo simples fato de ser deselegante, pode não parecer, mas com o tempo irás perceber que sim.
O segundo motivo é a portabilidade, a linguagem C é muito elogiada em livros por sua portabilidade, ou seja, o código que você compilar e rodar em um processador ou sistema operativo provavelmente poderá ser compilado e rodado em outro.

Mas existem excessões, existem bibliotecas e funções que são desenhadas para um só sistema operativo ou processador e o uso das mesmas pode limitar o código de certo programa à um só sistema operativo.
O system("pause"), torna seu código não-portável pelo simples fato de ter o comando pause que é específico para sistemas operativos Windows, ou seja, essa invocação não irá funcionar no Linux, MacOS, FreeBSD, NetBSD, etc.

Porém, existe uma alternativa, usar a função getchar() que é portável pois faz parte do padrão ANSI C, observe o código abaixo:
[code=rich]
#include

/* Este programa faz a soma entre 2 números e guarda o resultado em a*/
int a=2;
int b=2;

int main()
{
a = a+b;
printf("%i",a);
getchar(); //Agora sim, está bem melhor
}

[/code]
Conclusão, use getchar() e evite o system("pause").


Vício 2 - conio.h e gotoxy, o veredito final

A biblioteca conio.h foi criada pela Borland para o compilador Turbo C na época do antigão IBM-PC da era de 16 bits. Ele foi desenhado especificamente para possibilitar um programador trabalhar de maneira confortável com a entrada/saída de dados (input/output) usando a interface DOS.
Aqui no fórum já houve uma discussão calorosa acerca do conio: https://www.hardware.com.br/comunidade/definitiva-conclusao/796311/

A questão é, apesar de ser útil em certos casos, o conio.h é uma biblioteca bem antiga, obsoleta e não é multiplataforma, as bibliotecas construídas para Windows funcionam por cima da Win32 API. Apesar disso, eu não reprovo totalmente o seu uso, pois qualquer programador pode necessitar dela em casos onde a biblioteca padrão da linguagem C não supre certas pontos como: desenhar uma letra em posições específicas da consola (com gotoxy), desenhar carateres coloridos (com cprintf), detetar eventos do teclado (com kbhit), e por aí vai.

No entanto, existem bibliotecas que claramente são superiores ao conio, como o ncurses do projeto GNU: http://www.gnu.org/software/ncurses/. Que também possui um port para Windows: http://gnuwin32.sourceforge.net/packages/ncurses.htm.
Mais informações acerca: http://en.wikipedia.org/wiki/Ncurses.


Vício 3 - Usar goto e criar código espaguete

Se seu professor alguma vez te ensinar a usar essa instrução no código C, poste aqui e faça o favor de denunciar a polícia federal gnomo.png.
O uso de goto deve ser evitado a qualquer custo dentro de seu código C/C++, pois o goto cria código espaguete (spaghetti code), ou seja, código que desobedece os princípios de programação estruturada. Vamos parar de enrolar e vou mostrar como o uso de goto pode tornar seu código ilegível, feio e impossível de se ler.
[code=rich]
#include
#include

/* Este programa usa a instrução goto para mostrar o quanto é
* repugnante o uso da mesma num código C */
int numero;
char repetir;

int main()
{
inicio:
printf("Digite um número: ");
scanf("%i",&numero);
if(numero == 0)
goto numerozero;
else if(numero < 0)
goto numeromenor;
else
goto numeromaior;
numerozero:
printf("Numero eh zero!\n");
printf("Deseja repetir? [s/n]\n");
scanf(" %c",&repetir);
if((tolower(repetir)) == 's')
goto inicio;
else
goto fim;
numeromenor:
printf("Numero eh negativo!\n");
printf("Deseja repetir? [s/n]\n");
scanf(" %c",&repetir);
if((tolower(repetir)) == 's')
goto inicio;
else
goto fim;
numeromaior:
printf("Numero eh positivo!\n");
printf("Deseja repetir? [s/n]\n");
scanf(" %c",&repetir);
if((tolower(repetir)) == 's')
goto inicio;
else
goto fim;
fim:
return(0);
}


[/code]

Me diga, código bonito né, tente compilar e executar, ele vai esperar que você digite um número e vai mostrar se o número é positivo, negativo ou neutro (zero).
Além de ser feio um programador usar o goto em C, é também anti-ético e ruim usar em projetos críticos com milhares de linhas de código, e mais, seu profissionalismo como programador pode facilmente ser posto em questão dentro de uma equipa de software.

Não use goto, a não ser que você programe em assembly (mnemônico jmp) onde é necessário (pois assembly não é uma linguagem estruturada).


Vicio 4 - Mal uso do scanf

Oh! scanf scanf meu amor, uma das maiores dores de cabeça do programadormostrando_lingua.png.
Um pouco de poesia para relaxar, pois essa parte do tutorial é muito importante, portanto preste muita atenção, muita concentração agora.

A função scanf, cujo protótipo está declarado em stdio.h, serve para efetuarmos a entrada (do teclado) formatada de dados nos nossos programas, daí o nome scan formated. É uma função muito poderosa, porém muito irritante e problemática para alguns iniciantes.

Eu classificaria os problemas básicos do uso de scanf em 3 tipos:
  • Deixar sujeira no buffer do teclado
  • Ler strings com espaço
  • Mau uso do fflush
Antes de explicar o que é o buffer do teclado também chamado de buffer de entrada, vamos dar olhada num código bem simples:
[code=rich]
#include

char carater;

int main()
{
printf("Escreve algum caráter\n");
scanf("%c",&carater);

printf("Mais um caráter\n");
scanf("%c",&carater);
}
[/code]
Antes de compilar e rodar o código acima, vamos tentar raciocinar de forma lógica como o programa acima deverá supostamente funcionar.
Declaramos uma variável carater do tipo char, que claramente usaremos para armazenar um (e só um) caráter.

O primeiro scanf vai tentar ler o primeiro caráter que você digitar e vai guardar na variável. O segundo scanf vai fazer exatamente o mesmo.
Isso é só uma dedução lógica, agora copie o código e tente compilar, você irá de certa maneira ficar surpreso com o comportamento do programa.

O primeiro scanf vai funcionar normalmente, já o segundo não vai funcionar e o programa vai terminar, será que fiquei louco ou o scanf é que está louco?

Agora chegou o momento de explicar porque é que isso ocorre, e o que é o buffer de teclado (também chamado buffer de entrada ou stdin).
Quando você invoca funções de entrada como scanf, getchar, etc, tais funções pausam a consola e esperam que você digite qualquer caráter terminado por ENTER.

Quando você digita esses dados, eles não são ainda enviados para a variável que irá guardar os mesmos. Os dados são enviados para um espaço de memória chamado buffer de teclado, isso explica o porquê de ser possível deletar os carateres com a tecla BACKSPACE.

Os dados só são realmente guardados na variável pretendida, quando você pressiona a tecla ENTER, pois essa tecla indica ao scanf que terminamos o ato de entrada de dados.
É importante saber que ENTER na memória é um caráter como qualquer outro, ele é o caráter LF(Line Feed) cujo código ASCII é igual à 10 (decimal).
http://pt.wikipedia.org/wiki/Tabela_ASCII

O que acontece basicamente no primeiro scanf é:
  • Você digita um caráter e pressiona ENTER;
  • Como só precisamos armazenar um caráter na variável, o caráter é armazenado na variável e o ENTER permanence no buffer de entrada;
Já o segundo scanf:
  • Como o buffer de entrada não está vazio (tem o ENTER lá), ele lê aquele ENTER, e como ENTER serve para terminar a entrada de dados pelo teclado, o scanf prossegue.
Vamos supor que no primeiro scanf você digite 'A'(ASCII 97) e pressione ENTER, o scanf vai armazenar os dois carateres(97,10) no buffer de teclado:
Imagem

Como o ENTER serve para sinalizar o fim da entrada de dados pelo teclado, o caráter 'A'(ASCII 97) vai ser tirado do buffer e armazenado na variável.

Quando você invocar o segundo scanf, ele vai ler o próximo carater do buffer de entrada, que é o ENTER, mais uma vez repito que o ENTER sinaliza o fim de entrada de dados, portanto o segundo scanf vai prosseguir sem dar chance de digitar-se algo na consola.

Mas, há uma solução simples para esse problema, basta usar o scanset * no scanf. Tal operador diz para o scanf ignorar qualquer coisa por exemplo:
[code=rich]
scanf("%c%*c",&carater);
[/code]

No código acima o scanf irá ler um primeiro caráter e depois vai suprimir o seguinte (que normalmente é o ENTER), quer dizer que tal caráter não será armazenado no buffer de entrada.

O operador de supressão * pode ser normalmente usado em outros especificadores de formato, por exemplo:
[code=rich]
%*i - ignora um inteiro.
%*f - ignora um float.
[/code]

É recomendável também usar o scanset ou operador de supressão * em leituras de string via scanf, exemplo:
[code=rich]
char str[32];
scanf("%s%*c",str);
[/code]
O código acima irá ler uma string e armazenar em str, o ENTER será ignorado pelo scanf, ou seja, não será armazenado no buffer de entrada.

Correção para o código problemático:
[code=rich]
#include

char carater;

int main()
{
printf("Escreve algum caráter\n");
scanf("%c%*c",&carater);

printf("Mais um caráter\n");
scanf("%c%*c",&carater);
}
[/code]

O segundo problema associado ao uso do scanf é a leitura de strings com espaço em branco, repare o código abaixo:
[code=rich]
#include

int main()
{
char str[100];

printf("Digite uma string com espaços\n");
scanf("%s%*c",str);

printf("Você digitou: %s",str);
getchar();
}

[/code]
Compile e rode o programa, digite uma string com espaços em branco, por exemplo "Ola Mundo".
Repare que o scanf só irá ler a primeira palavra da string("Ola") e irá ignorar o resto.

Resolver este problema é relativamente fácil, basta usar o scanset [^carater] que diz ao scanf ler todos os elementos de uma string (até espaços) delimitados por um caráter especificado no scanset.
O código abaixo por exemplo, faz o scanf ler toda a string e ignorar os carateres após o caráter 'a'.
[code=rich]
#include

int main()
{
char str[100];

printf("Digite uma string que tenha o caráter 'a'\n");
scanf("%[^'a']s%*c",str);

printf("Você digitou: %s",str);
getchar();
}

[/code]

Tente digitar por exemplo "Eu idolatro C", o scanf só vai ler "Eu idol", pois o scanf só leu parte da string delimitado pelo caráter 'a'.
Agora voltando ao cerne do problema inicial, nós podemos ler strings inteiras com espaços, se especificarmos ao scanf o caráter \n (que representa o ENTER ou quebra de linha) como delimitador da string que pretendemos ler.
[code=rich]
#include

int main()
{
char str[100];

printf("Digite uma string\n");
scanf("%[^\n]s%*c",str);

printf("Você digitou: %s",str);
getchar();
}

[/code]
Resolvido, recomendo ir ao final da página para dar uma olhada nos links referentes ao scanf.

O terceiro problema associado ao uso do scanf, é usar o fflush para limpar o buffer de entrada, é uma alternativa ao especificador de supressão *, pois elimina o ENTER ou qualquer outro caráter do buffer de entrada.
[code=rich]
#include

char carater;

int main()
{
printf("Escreve algum caráter\n");
scanf("%c",&carater);

fflush(stdin);

printf("Mais um caráter\n");
scanf("%c",&carater);
}
[/code]

Mas apesar do fflush resolver o problema, não é recomendável o seu uso em buffers de entrada (stdin é o buffer do teclado), pois segundo a documentação o seu efeito em buffers de entrada é indefinido, ora pode funcionar ora pode não funcionar, ora pode acontecer algo grave.


Vicio 5 - Mal uso de ponteiros

Em um mundo fantasioso de super-heróis, um homem chamado Ben Parker disse que grandes poderes implicam grandes responsabilidades. Todo o poder tem um preço.

Ponteiros são provavelmente a maior arma que a linguagem C oferece ao programador, arma que dá flexibilidade e poder a quem aprende a manusea-lá bem. E quem abusa dele paga um preço (por vezes muito caro).
O ponteiro em C é um tipo de dado extremamente simples, invés de guardar um valor normal, ele guarda um especial, o endereço de memória de uma outra variável.

Eu particularmente não tive dificuldades em aprender a usar corretamente ponteiros, mas é verídico o fato de ponteiros serem um entrave ao entendimento e uso por parte de programadores novos na linguagem C.

Sem mais enrolações, vamos à um código simples, vamos simplesmente declarar um ponteiro que armazenará o endereço de uma variável inteira.
Lembrando que o uso do operador & retorna o endereço do operando que estiver à direita.
[code=rich]
#include

int main()
{
int numero = 5;
int *ptr_numero = &numero;
}

[/code]Bem simples o código, podemos conhecer o endereço da variável apontada usando o especificador de formato %p na função printf.
[code=rich]
#include


int main()
{
int numero = 5;
int *ptr_numero = &numero;

printf("Endereco da variavel apontada: %p",ptr_numero);
getchar();
}

[/code]O endereço da variável apontada será mostrada em hexadecimal.

Vamos mais à fundo, invés de exibir o endereço da variável apontada, vamos exibir o valor da variável apontada, o operador * retorna não o endereço, mas sim o valor da variável apontada.
[code=rich]
#include

int main()
{
int numero = 5;
int *ptr_numero = &numero;

printf("Valor da variavel apontada: %i",*ptr_numero);
getchar();
}

[/code]




Parece que ponteiros não são tão complicados. E que tal tentar o código abaixo?
[code=rich]
#include

int main()
{
int numero = 5;
int *ptr_numero = numero;

printf("Valor da variavel apontada: %i",*ptr_numero);
getchar();
}

[/code]Execute, se você não receber um Segmentation Fault no Linux ou um"O programa parou de responder" no Windows, você tem muita sorte.
O que fizemos basicamente no código acima foi tentar acessar uma região inválida ou protegida da memória e exibir o conteúdo desta região.
Observe que não usamos o operador & para obter o endereço da variável, desta forma, nós simplesmente gravamos o valor da variável(5) e não o endereço da variável.

Outro exemplo de mau uso de ponteiros:
[code=rich]
#include

int main()
{
int *ptr_numero;
*ptr_numero = 13;
}

[/code]Primeiramente nós declaramos um ponteiro para inteiro, como nós não atribuímos nenhum endereço ao mesmo, então o ponteiro estará a apontar para uma região aleatória e desconhecida da memória.
A próxima linha é um desastre de código, nós tentamos guardar o valor inteiro 13 para uma região desconhecida na memória, nos piores casos o programa pode travar, e se não travar, o valor 13 será guardado em uma região desconhecida na memória.

Esse tipo de ponteiro é conhecido por ponteiro selvagem, pois o endereço por onde ele aponta é desconhecido, e se algum valor for gravado por intermédio deste tipo de ponteiro, qualquer coisa pode acontecer, algo de imprevisível.
Quando você não sabe o que atribuir à um ponteiro, simplesmente passe à ele o valor NULL, é uma técnica segura no uso de ponteiros.
[code=rich]
#include

int main()
{
int *ptr_numero = NULL;
}

[/code]Para terminar a parte de ponteiros, só queria ressaltar que temos uma enorme sorte de não usarmos sistemas DOS que trabalhavam no modo de processamento real, onde não haviam proteções contra violações de memória, ou seja, qualquer programa poderia mexer com a memória de programas vizinhos. E nos piores dos casos o sistema poderia corromper-se.

Conclusão

É isso aí pessoal, espero que tenham gostado deste artigo, criei com o objetivo de fazer com que certos programadores evitem vícios ridículos e por vezes perigosos, qualquer comentário será benvindo, quer seja de agradecimento, incentivo ou correção.


Referências

Código espaguete
http://pt.wikipedia.org/wiki/C%C3%B3digo_espaguete

Biblioteca nCurses
http://en.wikipedia.org/wiki/Ncurses

Conclusão definitiva sobre conio
https://www.hardware.com.br/comunidade/definitiva-conclusao/796311

Tutorial system("pause") e fflush(stdin)
http://forum.imasters.com.br/topic/336835-tutorial-systempause-e-fflushstdin/

Documentação do scanf no cplusplus.com
http://cplusplus.com/reference/cstdio/scanf/

Ler espaços de uma string com scanf
http://gpraveenkumar.wordpress.com/2009/06/10/how-to-use-scanf-to-read-string-with-space/

Ponteiros
http://pt.wikipedia.org/wiki/Ponteiro_(programa%C3%A7%C3%A3o)
9
locked

Ainda não sei engatinhar mas quero correr.

Há pouco eu li aqui uma resposta de um usuário a outro a respeito de uma questão que envolvia programação. O usuário, respondeu assim: "Mesmo que eu postasse a solução que você quer você teria ainda muitos outros problemas depois deste e sem saber nada é muito difícil.".

Infelizmente ele está certo. Absolutamente certo. Tenho notado que diversas pessoas vêm aqui desejosas de fazer algo que têm em mente, como sites dinâmicos, mas não têm nenhum conhecimento de programaçao ou, se têm, é básico demais pra conseguir fazer o que desejam.

Normalmente nesses casos os demais usuários evitam responder ou respondema penas para não deixar a pergunta "no vácuo", mesmo sabendo que a resposta não vai servir de nada a quem pergunta.

É importante que os usuários novatos ou os que estão se empolgando com programação tenham em mente que para se fazer algo, por mais básico que seja, é necessário um conhecimento prévio que permita a pessoa tentar andar com as próprias pernas, nem que seja um passo de cada vez.

Todos os que vêm aqui, independentemente do conhecimento que detêm, são imbuidos de boa vontade em ajudar. Percebo que todos procuram responder as questões apresentadas, ao menos para mostrar que todas as questões são valorizadas, mas infelizmente algumas questões simplesmente não podem ser respondidas pois a resposta não se resume a uma frase e sim a um conjunto de instruções que comumente envolve a escrita de centenas de linhas de código.

Acredito que as pessoas estejam acostumadas à simplicidade do HTML e, por isso, erroneamente "intuem" que fazer uma página dinâmica seja algo simples, até porque elas vêem o resultado na tela ( em HTML) e não vêem a rotina que está comendo solta por trás.

Outra coisa bastante comum é o desejo de resultados rápidos. O imediatismo é inerente ao homem moderno e é um problema da sociedade e não de indivíduos. Todos querem "queimar etapas" para obter logo os resultados esperados e normalmente essa atitude desagua num mar de frustrações pois sem o embasamento inicial tudo fica mais difícil e a "programação" desenvolvida pelo usuário acaba resumindo-se em copy e paste de tutoriais cujo objetivo é apenas exemplificar.

Um outro problema que vejo é a preguiça crônica na busca de respostas ou a falta de prática na elaboração de perguntas. A internet dispõe de farto material de consulta em todas as linguagens mas as pessoas não conseguem tirar proveito desse material por falta de domínio do inglês, ou por ignorância da forma como devem fazer suas pesquisas ou simplesmente porque procuram por algo que não são ainda capazes de entender.

Acredito que todos os que estão iniciando em programação, seja em que linguagem for, devem ter conhecimento a respeito das rotinas básicas de qualquer linguagem. É simplesmente impossível alguém tentar ensinar o acesso a um banco de dados se o "aprendiz" não faz idéia do que seja um laço de repetição ou um condicional.

É muito difícil pra qualquer um conseguir escrever uma rotina em uma linguagem de programação cujas funções são feitas em língua inglesa se essa pessoa nao souber patavinas de inglês.

Ainda que a pessoa consiga contornar a barreira do idioma, ela ainda terá problemas se não tiver o hábito da leitura pois não terá paciência de pegar o início de um capítulo de um manual e leva-lo até o fim, analizando com calma cada etapa do que é apresentado.

Senhores, isto que escrevi não é um chega-pra-lá e nem um sermão. É apenas a minha visão a respeito da forma como se deve procurar aprender: aprender do começo, um passo de cada vez, até que haja a segurança de andar mais rápido.
[]!
5

Informações sobre domínios, hospedagem e DNS - Atualizado em 15/05/12

Tendo em vista a grande quantidade de tópicos a respeito de como comprar domínios, hospedar sites e configurar DNSs, resolvi criar um tópico que abordasse um pouco desses assuntos de forma intermediária, sem resumir demais na forma de FAQ mas também sem parecer uma monografia.

Os tópicos abordados são esses:
  • Domínios
  • Hospedagem de sites
  • Resolução de DNS
  • Como hospedar um site
  • Como registrar um domínio
  • Configurando o DNS de um domínio
  • Hospedagem caseira e DNS dinâmico
  • Múltiplos domínios em uma só hospedagem
  • Resumo para colocar um website no ar
Domínios

De forma simplificada, um domínio pode ser considerado um nome ou apelido à um endereço IP. A sua função é exatamente de simplificar e facilitar a localização de pontos em uma rede (a internet, por exemplo), visto que é muito mais simples memorizar palavras do que uma sequência de números. Já imaginou ter que memorizar os IP’s dos seus sites favoritos? Com certeza é mais fácil memorizar www.forumgdh.net do que o seu respectivo IP, ainda mais quando se tem dezenas sites em mente. A transcrição de um domínio para o seu endereço IP, que é o que “interessa” para o protocolo de rede, é feita através do DNS (Domain Name System). Há mais detalhes sobre isso adiante.
Atualmente os domínios podem conter caracteres de a a z, números de 0 a 9, hífen e são divididos em vários níveis, que são separados por um ponto (.), como no exemplo abaixo:

www.sub.dominio.com

A parte mais da direita (“com”, no exemplo) é o chamado top-level-domain (TLD), ou domínio de topo. Exemplos de top level domains são: com, net, org, us, br, info. Eles são fundamentais para o funcionamento do protocolo do DNS e também servem como indicador do órgão que gerencia aquele determinado TLD. A empresa responsável por determinar os TLD’s e os órgãos responsáveis pelos mesmos é a ICANN/IANA, localizada nos Estados Unidos. É a ICANN que especifica quem é o responsável por lidar com os domínios .com ou .br por exemplo. Os órgãos ou empresas autorizadas a vender domínios são chamadas de “registrar”.

Em seguida (da direita para a esquerda) vem o domínio de segundo nível, que no nosso exemplo é “domínio”. Ele compõe a parte mais importante do domínio, o nome, propriamente dito, por isso normalmente ele leva o nome da empresa ou serviço.

Depois temos o terceiro nível (“sub”, no exemplo), que é normalmente conhecido como subdomínio. A existência do mesmo é facultativa e funciona como uma parte subordinada do domínio, sendo que a criação do mesmo depende da vontade do dono do domínio. Subdomínios são bastante utilizados para designar sub-seções dentro de um site.

A parte mais da esquerda de um domínio (“www”) funciona como um designador de procolo/servidor. O “www” indica que possivelmente é um servidor World Wide Web, enquanto “ftp”, por exemplo, indicaria um servidor de transferência de arquivos.

Um exemplo real de tudo isso que foi dito:

www.msdn.microsoft.com
  • com ► Top level domain. Gerenciado pela VeriSign;
  • microsoft ► Second level domain, sob registro da VeriSign;
  • msdn ► Subdomínio, indicando a seção do site destinada a desenvolvedores;
  • www ► Indica que o nome possivelmente aponta para um servidor Web.
Hospedagem de sites

Serviço de hospedagem, conhecido comumente como host, é um servidor de arquivos que lhe garante um espaço em disco para armazenamento de dados remotamente. É o serviço básico para hospedar algum site, pois nele que ficam armazenados os arquivos.

O envio de arquivos para o servidor normalmente é feito através do protocolo FTP, no qual você especifica o host, o usuário e uma senha, cadastrada pelo serviço de hospedagem. Ao contratar o serviço você normalmente recebe apenas um endereço IP pelo qual você tem acesso ao site (ex. http://ip_do_servidor/~usuario) e ao FTP. Por esse motivo normalmente se contrata, além da hospedagem, um domínio, para dar um nome mais “amigável” ao seu site.

Um serviço de hospedagem consiste basicamente (e normalmente) desses serviços:
  • Servidor web (Apache, IIS, etc);
  • Servidor FTP;
  • Servidor DNS;
  • Servidor de e-mail;
  • Painel de controle (CPanel, WHM, Plesk, etc).
O servidor web é o responsável por receber as requisições do protocolo HTTP e retornar o resultado (normalmente a página processada) para o cliente. O servidor FTP fornece a interface para o usuário enviar arquivos da sua máquina local para o servidor remoto, para que os mesmos possam ser acessados através da internet. Ele também pode ser usado para fazer o recebimento dos arquivos. O servidor DNS é o responsável por resolver um hostname para o IP do servidor com determinado usuário, tornando possível você acessar o site através de um www.meusite.com ao invés de http://ip_do_servidor/~usuario. O servidor de e-mail fornece a implementação dos protocolos de recebimento e envio de e-mails (IMAP, SMTP, POP). Por último temos o painel de controle, que fornece tanto ao cliente quanto ao dono do serviço de hospedagem uma forma prática de gerenciar os planos, domínios, subdomínios, e-mails, estatísticas, entre outros. Em planos de hospedagem Linux, o mais famoso é o CPanel. Já para os planos Windows, o Plesk é o mais conhecido.

Resolução de DNS

DNS é algo extremamente amplo e complicado, mas o que eu gostaria de mostrar aqui é basicamente como é feita a transcrição de um nome (um domínio) para o seu endereço IP. Vou tentar explicar isso através de um exemplo e de uma forma que aparenta ser bem “boba”, mas bem fácil de entender, simulando um diálogo.

Vamos supor que você acesse o endereço do MSDN que citei logo no começo através do seu navegador: www.msdn.microsoft.com

O que basicamente ocorre para que esse nome seja traduzido em um endereço IP com o qual uma conexão possa ser estabelecida para trocar as informações é:

- Sistema operacional, sabe o IP do “msdn.microsoft.com”? (consulta ao arquivo de hosts)
- Não, vou pedir ao seu serviço de internet
- ISP, você sabe o endereço IP do “msdn.microsoft.com”?
- Não, vou pedir ao responsável pelo “.com”
- VeriSign (órgão responsável pelo TLD .com), sabe o IP do “msdn.microsoft.com”?
- Não, vou pedir ao “.microsoft”, que está sob meu “comando”
- Microsoft.com, sabe o IP do “msdn.microsoft.com”?
- Sim, sou o dono dele. O IP desse nome é 207.46.16.248.

Ao chegar nesse ponto, o endereço IP vai voltando ao usuário pelos mesmos pontos que foi requisitado (Microsoft, VeriSign, Virtua e finalmente o computador do usuário). Espero que tenha sido possível ter uma idéia de como isso é feito.

Como hospedar um site

Para hospedar um site é necessário contratar um plano de hospedagem e um domínio (este último não é essencial, mas como dito lá no começo, é extremamente recomendável para não ter que acessar o site através de um endereço IP).

Existem milhares de empresas que fornecem planos de hospedagem, tanto no Brasil quanto fora do país. Não citarei nomes para manter o tópico neutro, mas o link abaixo pode ajudar:

http://www.google.com.br/search?hl=pt-BR&q=hospedagem+de+sites&btnG=Pesquisar&meta=

Deve-se contratar um plano de hospedagem que forneça tudo aquilo que você necessita, sendo que isso depende diretamente das ferramentas que você utilizou para criar a sua página. Todos os serviços dão suporte a páginas HTML, mas caso esteja utilizando PHP, ASP ou algum banco de dados, é importante verificar se o plano em questão fornece esses recursos.

Planos que oferecem suporte a PHP normalmente rodam um servidor Linux com Apache e painel de controle CPanel. Já para o caso do ASP, o servidor fica em máquinas rodando o Windows com o Internet Information Services (não é regra) e o painel de controle mais utilizado é o Plesk. Vale lembrar que o fato do servidor utilizar Windows ou Linux não tem relação com o seu site ser visualizado apenas por pessoas que usam os sistemas operacionais mencionados. Usuário de Windows consegue acessar páginas hospedadas em servidores Linux e usuários Linux conseguem acessar páginas hospedadas em servidores Windows.

Em muitos casos, ao contratar um serviço de hospedagem, a própria empresa força o usuário a registrar um domínio com ela também, como uma venda casada. Se esse for o caso, leia o próximo tópico para saber o que isso normalmente implica.

Como registrar um domínio

Há basicamente duas formas de se registrar um domínio: diretamente com um “registrar” ou usando uma empresa intermediária.

Os “registrars”, como mencionado no começo do texto, são empresas autorizadas pela ICANN e IANA a registrar oficialmente os domínios na internet, como por exemplo, o site www.registro.br, que é o órgão brasileiro responsável por registros de domínios com a terminação “.br”. Eisas principais vantagens de se registrar diretamente com uma empresa desse gênero:
  • Você tem a certeza de que é o dono do domínio;
  • Total controle sobre as configurações do mesmo.
Ter o total controle do domínio significa que as configurações necessárias para fazê-lo funcionar corretamente são feitas por você, principalmente no que diz respeito ao DNS.

Abaixo segue alguns dos serviços mais famosos autorizados pelo ICANN para a venda de domínios:

www.registro.br (para domínios nacionais)
www.godaddy.com
www.dynadot.com
www.enom.com
www.register.com

A outra forma comum de se registrar um domínio é através de uma empresa intermediária, que normalmente é a mesma que fornece o serviço de hospedagem. Ao optar por esse método, em muitos casos o domínio fica registrado sob o nome da empresa, ou seja, não pertence a você. Isso acarreta outro problema: para fazer alterações de DNS você deve sempre entrar em contato com a empresa de hospedagem pra que ela faça essa alteração para você. Além de aumentar a “burocracia”, muitas vezes você é proibido de apontar para um DNS que não seja da própria empresa (fica forçado a utilizar um serviço de hospedagem dela).

Você pode optar por diversos TLD’s (os “sufixos”) na hora de comprar um domínio, sendo que alguns são públicos e outros reservados para usos específicos. Entre os domínios públicos mais comuns pode-se citar: com, net, org, info, biz.

Alguns TLD’s são destinados para serviços específicos, sendo necessário providenciar dados complementares para o registro do mesmo, como por exemplo: mil (militar), gov (governo), edu (ensino).

No que diz respeito a pagamento e preços, eles são pagos anualmente e costumam ser bem baratos, dificilmente passando de 10 dólares por ano. Ao registrar o domínio, você fica com os direitos dele enquanto continuar pagando pelo mesmo. Se por acaso um domínio não for renovado, em um prazo de 3 a 6 meses ele volta a ficar disponível para qualquer um que possua interesse (contanto que nenhuma empresa segure o mesmo).

Ao realizar a compra, basicamente a única coisa que precisa ser feita para fazê-lo funcionar é configurar os DNS’s. Comento sobre isso mais adiante. Algo que vale ressaltar já é que a configuração não é validada imediatamente. Pode demorar até 72 horas para que os novos DNS’s se espalhem para o resto do mundo. Durante esse período o acesso ao site fica extremamente instável.

Configurando o DNS de um domínio

Após a compra de um domínio, é essencial configurar os nameservers (ou DNS) dos mesmos. A configuração do DNS pode ser feita de forma direta ou utilizando serviços de redirecionamento.

A primeira consiste em indicar diretamente os nameservers fornecidos pela empresa de hospedagem (que rodam um servidor de DNS capaz de resolver os nomes). Para descobrir quais são esses DNS’s, você deve entrar em contato com o serviço de hospedagem e solicitar o DNS primário e o secudário, que possuem esse formato (exemplo):

Primário: ns1.empresa-de-hospedagem.com
Secundário: ns2.empresa-de-hospedagem.com

Com essas informações, basta ir ao painel de controle do domínio e buscar pelos campos onde você pode entrar com o DNS primário e o secundário. Ao confirmar as configurações, as alterações não ocorrem de imediato, pois os nameservers demoram até que cheguem, literalmente, a todos os cantos do mundo. Há casos em que demora até 72 horas para que ele seja inteiramente propagado, mas não costuma levar mais que uma hora ou duas horas. Nesse período, o acesso ao site através do domínio fica instável e pode não funcionar corretamente, então ao fazer qualquer alteração de DNS, é necessário ter paciência.

Caso o servidor para o qual você deseja apontar o domínio não possua um servidor de DNS, você pode optar pela forma que eu optei por chamar de “indireta”, na qual se utiliza o servidor de DNS do “registrar”. Não são todos os “registrar” que fornecem esse serviço.

Ao utilizar essa forma, você pode apontar o domínio diretamente para um endereço IP, como de um servidor dedicado ou caseiro, por exemplo, ou até mesmo para outros domínios e subdomínios.

Hospedagem caseira e DNS dinâmico

Outra alternativa que pode ser utilizada para hospedar o site é através de um servidor caseiro. Você mesmo pode baixar o Apache, PHP e MySQL por exemplo e deixar rodando no micro como um servidor. É possível baixa-los individualmente ou optar por uma solução “All-in-one” que já vêm com todos os aplicativos necessários e configurados para funcionar em conjunto.

XAMPP: www.apachefriends.org/en/xampp.html
EasyPHP: www.easyphp.org

Apesar de parecer uma solução interessante, ela acaba sendo um transtorno se você não tiver um plano de internet empresarial pelo seguintes motivos:

Primeiro:

Na maioria dos planos de banda larga residencial (ou até mesmo discada), o IP do usuário é dinâmico, ou seja, cada vez que o modem é iniciado, o IP muda. Isso complica na hora de configurar um domínio, visto que seria necessário alterar as configurações do mesmo cada vez que o IP for alterado.

Existem alguns sites que fornecem serviços de DNS dinâmico que instalam um aplicativo no sistema que atualiza as configurações do domínio automaticamente cada vez que o endereço IP é alterado. Infelizmente, para que isso seja possível, você deve utilizar um domínio fornecido pelo próprio site. Domínios normais não funcionam em conjunto com esses sistemas. Ao utilizar esse tipo de serviço, o endereço do site fica dessa forma (como um subdomínio):

www.meusite.no-ip.com

Alguns sites que fornecem esse tipo de serviço:
No-IP: www.no-ip.com
DynDNS: www.dyndns.com

Caso esteja interessado em usar esses serviços, o Guilherme Holtz fez um ótimo tutorial passo a passo de como configurar o DNS dinâmico no No-IP. Confira no link abaixo:
https://www.hardware.com.br/comunidade/showthread.php?t=901587

Segundo:

Em planos residenciais (aquela que temos em casa), algumas portas de saída são bloqueadas, dentre elas a 80 (8080) e a 21, utilizadas por servidores Web e FTP, respectivamente, para impedir que você use seu micro como servdor. Isso impossibilita que os usuários acessem o site apenas digitando o IP ou o domínio no navegador, pois por padrão o navegador vai tentar estabelecer uma conexão web através da porta 80 e o servidor não vai conseguir enviar a página através de dessa porta. O mesmo vale para um servidor FTP.

A solução para isso é forçar o servidor a utilizar outra porta que não esteja bloqueada, mas isso implica em ter que explicitar a porta ao digitar o domínio no navegador, como por exemplo:

http://www.seusite.com:12345

Os usuários e o navegador não têm como saber qual a porta em que o servidor está rodando (excluindo a 80), tornando o processo bem inviável. Uma outra alternativa é utilizar uma função presente na maioria dos serviços de DNS dinâmico chamada de “redirecionamento de porta”. Ao utilizar essa ferramenta, o próprio serviço de DNS vai redirecionar a conexão da porta 80 (solicitada pelo navegador) para a porta configurada no servidor. Apesar de funcional, tem alguns incômodos:
  • Quando o usuário digitar o domínio no navegador, a barra de endereços vai ser substituída pelo endereço IP após o carregamento do site.
  • A sua página é colocada dentro de um frame, fazendo com que o título da página seja perdido.
  • Novamente você terá que utilizar um subdomínio do serviço de DNS ao invés do seu próprio.
OBS.: Essas informações são referentes ao serviços do No-IP. Pode ser que em outros a situação seja diferente.

Terceiro:

O seu computador terá que ficar sempre ligado caso queira manter o site sempre no ar. Também aumentará bastante o tráfego de upload, e isso pode alertar a companhia de internet que há um servidor rodando (e na maioria delas, isso é violação de contrato).

Múltiplos domínios em uma só hospedagem

Existem situações em que o usuário possui mais de um domínio e deseja utilizar a mesma hospedagem para gerenciá-lo. A maioria dos sistemas de hospedagem pagas permite que você faça isso, até um certo limite, para que você não acabe criando uma revenda. Em hospedagem gratuita isso é extremamente raro.

Existem basicamente quatro formas de manipular domínios: redirecionar, estacionar, inserir um domínio adicional ou criar um subdomínio. Veja com mais detalhes abaixo:

Domínios estacionados

Utilizam-se domínio estacionados quando você possui mais de um domínio e deseja que ele aponte para um mesmo site. É muito comum de ser utilizado quando você possui um domínio em diversos TLDs diferentes (seusite.com.br, seusite.com, seusite.net, seusite.org etc) e deseja que todos apontem para um mesmo local.

Nesse caso, o endereço digitado pelo usuário na barra de endereços permanece inalterado. Não há nenhum redirecionamento para o endereço raiz. Supondo que o domínio raiz da sua hospedagem seja seusite.com e você estaciona o domínio seusite.net, se o cliente acessar o seusite.net, é esse endereço que permanecerá no navegador, ele não será redirecionado para o seusite.com.

Para você estacionar um domínio, é preciso que o mesmo esteja apontando para o mesmo DNS da sua hospedagem. Normalmente para configurar um domínio estacionado, deve-se procurar pelo item “Parked Domains” no painel de controle.

Domínios adicionais

Os domínios adicionais são utilizados quando você deseja ter dois sites completamente independentes sem precisar contratar uma nova hospedagem. Ele permite que você crie um subdiretório no seu site raiz, mas que atua de forma 100% independente, inclusive com contas separadas de cPanel (supondo que seja o caso), FTP, estatísticas e tudo mais.

Assim como no caso dos domínios estacionados, não há nenhum tipo de redirecionamento. Apesar do domínio adicional apontar para um subdiretório do seu domínio principal, na barra de endereços vai permanecer a URL do domínio adicional. Por exemplo: supondo que seu site raiz seja seusite.com e você insira um domínio adicional chamado meuoutrosite.com, será criado um diretório na pasta public_html do seusite.com chamado meuoutrosite.com (public_html/meuoutrosite.com). Porém, essa subpasta irá servir como pasta raiz do meuoutrosite.com e esse domínio permanecerá na barra de endereços do navegador (o cliente não percebe que trata-se de um domínio adicional).

Vale lembrar que o usuário/senha do domínio principal tem acesso liberado aos arquivos apontados pelo domínio adicional, porém o usuário/senha do domínio adicional não tem acesso aos arquivos do domínio principal.

Para que o domínio adicional funcione, é preciso que o mesmo aponte também para o DNS do site raiz. Para configurar um domínio adicional, procure por “Addon domains” no painel de controle.

Por criar um site completamente independente, normalmente o número de domínios adicionais é limitado pelo serviço de hospedagem que utiliza, de forma que impeça você de criar um “plano de revenda” utilizando uma conta de cliente.

Redirecionamentos

Os redirecionamentos são usados quando você deseja redirecionar determinado domínio ou URL para outro local, podendo inclusive ser um site fora do DNS do seu serviço. É bem útil quando você deseja criar um “atalho” para uma URL mais longa, como por exemplo redirecionar o usuário para meusite.com/minhapasta/outrapasta/arquivos.html quando ele digitar meusite.com/arquivos).

Você pode usar como origem do redirecionamento qualquer domínio (raiz, estacionados e adicionais) e subdomínio que esteja configurado na sua conta do cPanel. Diferentemente dos domínios estacionados e adicionais, o redirecionamento é feito pelo Apache, portanto a URL na barra de endereços será alterada para o local de destino. Não irá permanecer a URL original digitada.

Para configurar os redirecionamentos, procure pelo campo “Redirects” no painel de controle.

Subdomínios

Essa talvez seja a melhor forma de organizar um site bastante segmentado. Um subdomínio é simplesmente um domínio que faz parte da hierarquia de um domínio superior. Ele aponta para o mesmo DNS do domínio raiz, uma vez que depende do mesmo, e não há nenhum custo adicional envolvido na sua criação, pois subdomínios é uma característica nativa do sistema de DNS.

Ao criar um subdomínio, é criada uma pasta na pasta pública de sua hospedagem (public_html) de mesmo nome. Supondo que você tenha o domínio seusite.com e crie um subdomínio download.seusite.com, será criada uma pasta download dentro da public_html do seusite.com, que será apontada pelo subdomínio. Essa subpasta não aparece na barra de endereços do navegador, pois ela atua como raiz do subdomínio.

Subdomínios estão 100% vinculados a conta principal, de forma que não é possível criar um usuário e senha separados para o mesmo. Você acessa o subdomínio usando as configurações da conta principal.

Apesar disso, normalmente é possível acessar estatísticas separadas para o subdomínio.
Para configurar um subdomínio, procure pelo item “Subdomains” no painel de controle.

As informações e os termos utilizados aqui supõem uma hospedagem utilizando Apache como servidor e cPanel como painel de controle do cliente. Em outros sistemas de hospedagem (IIS, Plex etc), apesar da teoria continuar valendo, os termos podem ser diferentes.

Resumo para colocar um site no ar
[LIST=1]
Contratar um plano de hospedagem
Adquirir um domínio
Solicitar o DNS primário e secundário com o serviço hospedagem
Configurar o DNS nas opções do domínio
Aguardar algumas horas para que o DNS propague
Utilizar um cliente FTP para enviar os arquivos para o site[/LIST]Autor: Fernando Birck (Fergo)
Licença: Atribuição-Uso Não-Comercial 2.5 Brasil

Imagem



Referências:
http://tools.ietf.org/html/rfc1034
http://www.icann.org/en/udrp/udrp.htm
http://www.lagunainternet.com/techsupport/history_of_dns.htm

Bom, é isso pessoal, espero que gostem smile.png

Abraços,
Fergo
5

Tutorial - Programando um SO básico

Olá pessoal!
Tenho visto muitas pessoas aqui no fórum de programação perguntando sobre como fazer um sistema operacional, onde achar links, exemplos e coisa do tipo.
Baseado nisso, resolvi desprender meu dia hoje para escrever um pequeno tutorial em português, explicando passo a passo como criar um SO em Assembly, gravar em disquete e dar o boot.
Tentei deixar somente as informações mais úteis, tive que cortar algumas coisas pra evitar que o tutorial ficasse muito grande e chato. Ele não ensina nada sobre a linguagem assembly, então é bom já ter um conhecimento mínimo sobre ela ( pode ser o básico mesmo, você vai ver que não é tão complicado assim ). Contém algumas ilustrações também.

No tutorial já tem os links para baixar todos os aplicativos necessários.
Espero que gostem. Podem baixar o PDF aqui ( 124KB ):

http://www.fergonez.net/download.php?file=tut_sistoper.pdf

Um abraço,
Fergo
4

PHP Para iniciantes

Iniciando em php

Introdução

Neste artigo estaremos descrevendo php para web.
Estaremos mostrando neste artigo o básico para iniciar em php, desde os recursos mínimos de software até a sintaxe e exemplos de códigos.
O php nasceu em meados 1994 e existe uma discussão pois há quem diga que ele não é uma linguagem de programação e há quem diga que é, eu sou um doa que dizem que é.
É uma linguagem que por possuir possibilidades de inserção em páginas Html é muito utilizada em conteúdos web, mas possui projetos como php+Gtk que permite a utilização da linguagem em aplicativos Desktop.
Neste artigo estaremos descrevendo a utilização web.
E uma linguagem que roda no servidor o que a torna muito compatível, pois é independente de complementos na maquina do cliente.

O que seria modo servidor?
Vamos tentar exemplificar, suponhamos que um site possua um recurso que realize a soma 2+2, , quando o cliente acessa o site feito em php o servidor realiza todas as operações necessárias e mostra para o cliente o resultado já pronto, ou seja 4.
Se o mesmo site tiver este código escrito em JavaScript ao acessar o site o cliente ao invés de receber o valor final, recebe todo o código necessário para realizar o calculo e o resultado seria calculado na maquina do cliente para depois Ser exibido, precisando o cliente possuir recursos na maquina para interpretar o código.
No exemplo acima as linguagens possuem características bem diferentes e foi usado somente para ilustrar a diferença entre linguagem cliente e servidor.
A linguagem a ser utilizada em cada projeto vai depender da necessidade de cada site, muitos recursos de aparência e efeitos tem como preferencia o JavaScript e recursos que exigem conexão com banco de dados entre outros usam php.

Ok, como eu programo em php?

Como falei anteriormente o php roda no servidor, então precisamos do php instalado no mesmo, a maioria dos serviços de hospedagem já vem por padrão, mas muitos web designers criam seus projetos local e depois fazem upload para o servidor, neste caso precisamos montar um mini servidor web em nosso equipamento.

Indice:

[post=6553038]Começando[/post]
[post=6553070]Variaveis[/post]
[post=6553108]Tomando decisões com if e else[/post]
[post=6562104]Incluindo arquivos externos (includes)[/post]
4

Avaliação de WebSites

Olá a todos!

Estou criando este tópico para avaliar websites desenvolvidos por nós, membros do FGDH, com o intuito de achar erros de programação e de layout.

Quem for opinar, fale se gostou do layout, possíveis erros de programação, etc, enfim, é para ajudar!


Regras:


- Não poste sites de conteúdo pornográfico e que incentive a pirataria;
- Apenas dê sua opinião para ajudar;
- Procure falar de qual site está opinando, pois como é apenas um tópico, vários sites serão postados de uma vez, sendo assim explique de qual está comentando;
- Informe quais ferramentas utilizou para o desenvolvimento do site, como: HTML, PHP, CSS, JavaScript, Ajax, entre outros.


Vamos lá!

Abraços!
3

Pedido para avaliação de um livro

Título: Programação de BSD Sockets em C
16 páginas (até agora).

Olá pessoal, desperdicei todo o fim de semana à escrever esse livro (nem sei se tenho o direito de considerar como livro).

Como não tenho PC, peguei no da minha irmã, instalei o Ubuntu e começei a escrever no LibreOffice Writer.

Opiniões, críticas, são sempre benvindas.
Por favor digam:
  • O que falta;
  • O que está mal;
  • O que está bom;
  • O que carece, etc;
O sumário:
  • Guia gráfico para o tutorial
  • Apresentação e objetivos
  • Protocolos e conceitos de redes TCP/IP
  • Sockets TCP e UDP
  • Endereços de rede e portas
  • Ordens de armazenamento de informações
  • Conetar ou aceitar conexões
  • Criar um socket TCP ou UDP
  • As estruturas sockaddr e sockaddr_in
Por enquanto é isso...

Abraços.
3

[video aulas] Guia para iniciar na linguagem programação em C

Vídeos interativos grátis de Linguagem C.
Vídeos grátis online de Linguagem C, para pessoas interessadas no assunto, curiosos, estudantes de informática, etc.

O link para os vídeos: Vídeos Interativos - http://portalcplusplus.com.br/videos-interativos

A ver:

* Vídeo Aula 1 – A história e importância da Linguagem C;
* Vídeo Aula 2 – Mercado de trabalho para o programador;
* Vídeo Aula 3 – Hackers e a Linguagem C - parte 1;
* Vídeo Aula 3 – Hackers e a Linguagem C - parte 2.


Vídeos Interativos:

* Vídeo Aula 01 - Uso do Editor Kate;
* Vídeo Aula 02 - Olá Mundo (usando o Editor Kate no Linux);
* Vídeo Aula 03 - Olá Mundo (usando o IDE DevC++ no Windows);
* Vídeo Aula 04 - Leitura e Escrita;
* Vídeo Aula 05 - Cálculo da Média
* Vídeo Aula 06 - Utilização de Parênteses em Operações Aritméticas;
* Vídeo Aula 07 - Cálculo de Média entre Dois Números Inteiros;
* Vídeo Aula 08 - Operadores Aritméticos e Relacionais;
* Vídeo Aula 09 - Estrutura de Condição If Else;
* Vídeo Aula 10 - Operador Lógico E;
* Vídeo Aula 11 - Estrutura de Condição If Else Aninhada;
* Vídeo Aula 12 - Estrutura de Condição If Else Aninhada (2o tutorial);
* Vídeo Aula 13 - Estrutura de Condição Switch;
* Vídeo Aula 14 - Estrutura de Repetição For (com contagem crescente);
* Vídeo Aula 15 - Estrutura de Repetição For (com contagem decrescente);
* Vídeo Aula 16 - Estrutura de Repetição For (com contagem crescente e alfanumérica);
* Vídeo Aula 17 - Estrutura de Repetição While;
* Vídeo Aula 18 - Estrutura de Repetição While (sem contadores);
* Vídeo Aula 19 - Contadores;
* Vídeo Aula 20 - Vetores;
* Vídeo Aula 21 - Ponteiros;
* Vídeo Aula 22 - Funções.

Fonte: http://www.vivaolinux.com.br/dica/Videos-interativos-gratis-de-Linguagem-C
3

Dica para postar códigos com coloração de sintaxe

Olá,

Normalmente quando se posta um código, coloca-se o mesmo dentro das tags CODE, que serve para qualquer código, ou dentro das tags HTML/PHP (que serve para C/C++). Infelizmente o fórum só dá suporte para coloração de sintaxe dessas duas linguagens, então para as outras resta apenas a opção CODE, que não possui coloração.

Encontrei um site interessante na internet que realiza a coloração de sintaxe de mais de 160 linguagens e, o mais interessante, possui uma saída no formato BBCode padrão, utilizando a tag COLOR, permitida no fórum. Basta copiar o código para a caixa de texto presente no site, configurar a linguagem, o esquema de cores e a saída no formato BBCode. Ele vai gerar um código formato que pode ser colado no fórum, dentro da tag CODE inclusive, mas que irá ter coloração de sintaxe.

Para conferir, basta acessar o link:
http://www.andre-simon.de/doku/highlight/en/highlight_demo.html

Ele coloca uma tag size no começo que convém retirar.

Exemplo de como fica um código em Visual Basic, que não possui tag específica aqui no fórum:
[CODE=rich]
Public Function GetDevices() As String()
'Essa funcao pega todos os dispositivos MIDI
Dim strDevices() As String
Dim intDev As Long

Dim MidiCaps As MIDIOUTCAPS
Dim i As Long

MidiCaps.szPname = ""

intDev = midiOutGetNumDevs
If intDev > 0 Then
For i = 0 To intDev - 1
ReDim Preserve strDevices(i)

midiOutGetDevCaps i, MidiCaps, Len(MidiCaps)

strDevices(i) = Trim(MidiCaps.szPname)
Next
End If

intMIDIDevices = intDev
GetDevices = strDevices
End Function
[/CODE]

Fergo
3

Curso de PHP Orientado a Objetos +100 episódios

É com muita satisfação que torno público a quem interessar o Curso de PHP que estou produzindo e publicando em meu canal no YouTube gratuitamente [canal eXcript].

O Curso de PHP está ficando bem legal e bastante completo, e mesmo quem não possui qualquer conhecimento na linguagem consegue fazê-lo, haja vista que a lógica de programação é abordada junto com a linguagem PHP.

A partir de agora, quem não souber programar em PHP é porque não quis estudar Imagem

PRIMEIRO EPISÓDIO
https://www.youtube.com/watch?list=PLesCEcYj003TrV2MvUOnmVtMdgIp0C4Pd&v=R_yRrYUHai0



PRIMEIRA AULA DA ORIENTAÇÃO A OBJETOS
https://www.youtube.com/watch?list=PLesCEcYj003TrV2MvUOnmVtMdgIp0C4Pd&v=oT7qY8nLJ6k


Por fim, vou começar a publicar o material de apoio do curso em nosso site: http://www.excript.com/
3

Tutorial - Criando site com hospedagem/domínio grátis (WordPress)

Eae galera!

Vou fazer esse tutorial mostrando como você pode criar um site com hospedagem e domínio grátis utilizando o WordPress.
O site oferece WebMail, MySQL, Backup, FTP, PHP etc.


1. Downloads necessários

Você irá precisar baixar:

WordPress - Download direto
FileZilla - Download direto

2. Criando conta

Acesse o site: http://www.000webhost.com/ e clique em Order Now

Anexo do post


Em "or, I will choose your free subdomain (recommended)" coloque o nome do seu site. Por exemplo: klashteste ( irá ficar klashteste.webuda.com )
Logo em seguida coloque seu nome, email, senha e o código captcha e clique em Create My Account


Anexo do post

Você será redirecionado para uma nova página. Caso não for, vá em Members Area e faça o login.

Clique em Create New

Anexo do post

Agora você irá colocar o nome do seu site na segunda opção, coloca seu email e senha e clique em Create

Anexo do post


3. Transferindo WordPress

Entre no cPanel da 000WebHost e clique em View FTP Details

Anexo do post

Você irá precisar das seguintes informações:

Anexo do post

* A senha é a mesma que você utilizou para criar o domínio

Abra o Filezilla e coloque essas informações nos campos em branco e clique em Conexão rápida

Anexo do post

Entre na pasta public_html e copie os arquivos de dentro da pasta WordPress (que foi baixado) e arraste dentro dessa pasta.

Anexo do post

4. Criando Banco de dados

Entre novamente no cPanel e clique em MySQL

Anexo do post

Crie um Banco de dados e clique em Create database (anote essas informações, pois precisará no próximo passo!)

Anexo do post


Será mostrado que seu banco de dados foi criado. ( guarde o host, por exemplo:
mysql14.000webhost.com )

Anexo do post


5. Configurando WordPress

Acesse o link do seu site. Irá mostrar uma mensagem , clique em "Vamos lá!"

Anexo do post

Agora você irá colocar as informações do Banco de dados e clicar em Enviar

Anexo do post

Pronto! Agora só clicar em Instalar

Anexo do post

Coloque título do seu site, nome de usuário, sua senha e email.
A opção "Permitir mecanismos de pesquisa indexarem este site." é de sua preferência. Se quer que o site apareça nas pesquisas do Google, Bing, Yahoo etc, deixe ativo, caso contrário, desative-o.

Anexo do post

Clique em Instalar WordPress

Irá receber essa mensagem. Agora é só fazer o login.

Anexo do post


Fim!
2

Projeto myNetwork

Acho que finalmente chegou a altura de divulgar a mais recentíssima ocupação que vem alimentando o meu suor, todos os dias (poético rindo_ate_agora.png), e vem consumindo o meu tempo de participação no fórum, consequentemente a paciência da staff.

Apresento-vos o projeto myNetwork. Mas afinal, o que é?
É meu projeto de mediatura(palavra inventada nao_quero_nem_ver.png), para a defesa de fim do médio.

MyNetwork, é um software de networking (passo a redundância), direcionado à monitorização e controlo remoto de computadores em redes locais. Está sendo codado em C++ e Qt, então é possível que seja multi-plataforma.

Ele oferece serviços em rede, como:
- Informações de hosts ligados; *
- Bloqueio de usuários; *
- Bloqueio de websites; *
- Bloqueio de aplicativos; *
- Desktop remoto (read-only smile.png);
- Terminal remoto;
- Explorador de ficheiros (remoto); #
- Gestor de processos; *

* Ainda não implementados.
# Incompleto

Vou dar mais detalhes e imagens depois. Infelizmente não tem como por enquanto fornecer pacotes instaláveis, por culpa da dor de cabeça que o Qt 5 vem me fornecendo.

Código-fonte (cliente):
https://sourceforge.net/projects/mynetworkremote/ (Sourceforge)
https://github.com/Henry-Keys/mynetwork-client (Github)

Código-fonte (servidor):
https://sourceforge.net/projects/mynetworkserver/

Abraços.
2

[Dica] Tabela de cores que informa o código...

Olá, pessoal!
Faz algum tempo que utilizo um script em javascript para me fornecer o código de varias cores... após colocar na net (em uma pasta oculta) para quando eu precisasse, pensei que seria útil disponibilizar esta tabela para ajudar quem trabalha com web; com a intenção de facilitar na hora de ver o código de uma cor...
Com isto, estou disponibilizando esta tabela de cores para lhes ajudar em seus desenvolvimentos.

Caso queiram esta tabela, é só me inviar uma mensagem contendo seu email por MP ou acessar meu site e lhes enviarei.

Link: Minha assinatura > menu Extras > Tabela de cores

ou link direto: http://www.helcai.com/home/cores.php

Espero que gostem.
Ate+
2

Primeiros passos com PDO

Muito tenho ouvido falar de conexões com banco de dados mysql através do PDO, uma vez até tive indicações de usa este tipo de conexão ao invés dos comandos mysql_... no php.
Até ver o amigo explosive_spirit comentar aqui no fórum sobre estes comando estarem marcados como "deprecated" o que significa que não vão mais funcionar e pelo que entendi no php 5.5.X já não teremos mais a presença delas o que fará com que nossas conexões vão parar de funcionar.

Tudo bem que em servidores de produção não se atualizam as versões assim que são lançadas e alguns oferecem handlers para escolha de versões, mas se puder construir um site já com o que tem de novo é melhor né? rindo_ate_agora.png

Então vamos ao PDO.

Onde tinhamos o comando com mysql:

[code=rich]$sql = mysql_connect($hostname, $username, $senha);[/code]

Com PDO fica desta forma:
[code=rich]
$con = new PDO("mysql:host=localhost;dbname=nome_do_banco",
"usuario",
"senha",
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")

[/code]
Coloquei a mais uma linha que informa o tipo de caracter UTF-8 na conexão.

Com este comando acima temos a conexão com o banco de dados.

Agora vamos recuperar os dados contidos no Banco.


Com mysql fica assim :
[code=rich]
$sql= "SELECT * FROM tabela";
$result = mysql_query($sql);
[/code]

Com PDO:
[code=rich]
$sql = $con->prepare("SELECT * FROM tabela);
$sql->execute();
[/code]

E com o laço fica desta forma:

Com mysql:
[code=rich]
while($sql = mysql_fetch_assoc($result)) {
$var = $sql['coluna'];
echo $var;
}

[/code]

Com PDO:
[code=rich]
while($obj = $sql->fetch(PDO::FETCH_OBJ)) {
$var = $obj->coluna;
echo $var;
}

[/code]

Esta foi meu primeiro contato direto com o PDO e senti sensivelmente que escrevi menos com ele.

Achei uma classe interessante que nos permite fazer também um arquivo de conexão sem precisar logar no banco a cada arquivo, a mesma seria esta:
[code=rich]
<?php
class Conexao extends PDO {

private static $instancia;

public function Conexao($dsn, $username = "", $password = "") {
// O construtro abaixo é o do PDO
parent::__construct($dsn, $username, $password);
}

public static function getInstance() {
// Se o a instancia não existe eu faço uma
if(!isset( self::$instancia )){
try {
self::$instancia = new PDO("mysql:host=localhost;dbname=taqui_taquiphp",
"usuario",
"senha",
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
} catch ( Exception $e ) {
echo 'Erro ao conectar';
exit ();
}
}
// Se já existe instancia na memória eu retorno ela
return self::$instancia;
}
}
?>
[/code]

Salve o arquivo com a extensão .php na raiz do seu servidor e para utilizar dê um require_once onde precisar, a conexão fica desta forma:

[code=rich]
require_once ('classe_de_conexao.php');
$con_pdo = Conexao::getInstance();
$sql = $con_pdo->prepare("SELECT * FROM tabela);
$sql->execute();
[/code]

Desta forma toda vez que precisar pagar dados no banco basta chamar a class "Conexao::getInstance()".

Alguma dúvida ou contribuição é só postar ai.

Assim que tiver um tempo vou postar um sistema de paginação de resultados feito também com PDO.
2

Tutorial - validar cpf em java

Olá amigos, resolvi desenvolver uma classe para validação de CPF em Java, tanto para usar em meus programas quanto para criar esse tutorial para os iniciantes em Java.
Uma breve explicação sobre o algoritmo de validação de CPF: O CPF é composto por 11 dígitos, os dois últimos são os dígitos verificadores, então, para obter o primeiro dígito verificador é efetuado um calculo com os 9 primeiros dígitos e, para obter o segundo dígito verificador é efetuado um calculo com os 9 primeiros dígitos mais o primeiro dígito obtido do calculo anterior. Por exemplo, digamos que queremos validar o CPF 222.222.222-22, 1° digito: Vamos pegar os 9 primeiros dígitos e multiplicar cada um em ordem crescente da direita para a esquerda a partir do número 2.


2 2 2 2 2 2 2 2 2
10 9 8 7 6 5 4 3 2
20 18 16 14 12 10 8 6 4


Em seguida somamos todos os resultados da multiplicação:
20 + 18 + 16 + 14 + 12 + 10 + 8 + 6 + 4 = 108

Agora vamos dividir o resultado da soma por 11 e usaremos apenas o resto da divisão:
108 / 11 = resto = 9, se o resto da divisão for menor que 2, o dígito será 0 (zero) , mas se o resto da divisão for igual ou maior que 2, então o dígito verificador será igual a 11 menos ( - ) o resto da divisão, como o resto da nosso exemplo foi o valor 9 o primeiro dígito será :
11 – 9 = 2. Pronto já temos nosso primeiro dígito verificador, vamos partir para o segundo dígito, que como informei acima, será usado o primeiro dígito obtido para o calculo:



2 2 2 2 2 2 2 2 2 2
11 10 9 8 7 6 5 4 3 2
22 20 18 16 14 12 10 8 6 4

Como adicionamos o primeiro dígito ao calculo o último número para multiplicação agora será 11.
Em seguida somamos todos os resultados da multiplicação:

22 + 20 + 18 + 16 + 14 + 12 + 10 + 8 + 6 + 4 = 130

Agora vamos dividir o resultado da soma por 11 e usaremos resto:
130 / 11 resto = 9, como o resto da divisão foi maior que 2 então o segundo dígito será:
11 – 9 = 2.
Pronto, agora é só comparar os dígitos verificadores do CPF com os dígitos gerados.
Iniciaremos agora o desenvolvimento da nossa classe, vamos tentar criar um código limpo e organizado tornando assim fácil o entendimento, para isso vamos deixar nossa classe pequena e bem divida entre métodos.
O nome da nossa classe será ValidarCpf, vamos criar também uma variável String CPF que armazenará o CPF informado.


public final class ValidarCpf {
private String cpf;
}
Vamos criar agora um método para remover os caracteres inválidos para o nosso calculo, são eles: “ - “, “ . ”.

private void removerCaracteres(){
this.cpf = this.cpf.replace("-","&quot;
this.cpf = this.cpf.replace(".","&quot;
}
O método replace() substitui o primeiro argumento pelo segundo, até aí tudo bem, agora vamos criar um método para verificar se o CPF realmente tem 11 dígitos.

private boolean verificarSeTamanhoInvalido(String cpf){
if ( cpf.length() != 11 )
return true;
return false;
}
Esse método verifica se o tamanho do CPF informado é maior ou menor que 11 caso verdadeiro retorna true, caso ela contenha 11 dígitos retorna false.
Vamos agora criar um método para verificar se a seqüência de caracteres são todas iguais, muitos códigos encontrados na net classificam seqüências iguais como falso , mas, verificando no site da receita da fazenda a única seqüência considerada como falsa é a de 0 ( zero ). Caso queiram conferir: http://www.receita.fazenda.gov.br/aplicacoes/atcta/cpf/consultapublica.asp
Vamos criar um método que verifique qualquer seqüência.

private boolean verificarSeDigIguais(String cpf){
//char primDig = cpf.charAt(0);
char primDig = '0';
char [] charCpf = cpf.toCharArray();
for( char c: charCpf )
if ( c != primDig )
return false;
return true;
}
Esse método recebe uma String representando um CPF, cria um array de char baseado na String e, usando um foreach percorre todo o array verificando se é igual ao primeiro caractere, se a seqüência for igual retorna true, caso contrario retorna false, se você quiser considerar quaisquer seqüências iguais como falsa basta só substituir a linha de código

char primDig = '0';
Por a linha comentada.

//char primDig = cpf.charAt(0);
Vamos agora criar um método para efetuar o calculo, criaremos apenas um método que sirva para gerar os dois dígitos.

private String calculoComCpf(String cpf){
int digGerado = 0;
int mult = cpf.length()+1;
char [] charCpf = cpf.toCharArray();
for ( int i = 0; i < cpf.length(); i++ )
digGerado += (charCpf[i]-48)* mult--;
if ( digGerado % 11 < 2)
digGerado = 0;
else
digGerado = 11 - digGerado % 11;
return String.valueOf(digGerado);
}
Esse método como vocês podem ver recebe e retorna uma String, criamos uma variável int digGerado que servirá para armazenar o resultado do calculo, criamos também uma variável int mult que servirá para multiplicar cada dígito do CPF, novamente criamos um array de char e percorremos todo o array somando e multiplicando cada dígito, logo em seguida verifica se o resto do resultado dividido por 11 é menor que 2, caso seja menor digGerado será igual a zero
Senão digGerado será igual 11 – o resto da divisão, em seguida converte digGerado em String e retorna o mesmo.
Criaremos agora o único método publico, pois o usuário precisará saber da existência dele e somente isso, não precisará conhecer nenhum outro método criado até agora, será ele quem validará o CPF


public boolean validarCpf(String cpf){

if ( cpf == null ){
return false;
}
else{
String cpfGerado = "";
this.cpf = cpf;

removerCaracteres();
if ( verificarSeTamanhoInvalido(this.cpf) )
return false;

if ( verificarSeDigIguais(this.cpf) )
return false;

cpfGerado = this.cpf.substring(0, 9);
cpfGerado = cpfGerado.concat(calculoComCpf(cpfGerado));
cpfGerado = cpfGerado.concat(calculoComCpf(cpfGerado));

if ( !cpfGerado.equals(this.cpf))
return false;
}
return true;
}
Não preciso nem explicar né? Caso seja valido retornará true, caso contrario retornará false.
E aqui a classe completa.


/**
*
* @author Wellington de lima alves
*/

public final class ValidarCpf {
private String cpf;
public ValidarCpf() {
}
public boolean validarCpf(String cpf){
if ( cpf == null ){
return false;
}
else{
String cpfGerado = "";
this.cpf = cpf;
removerCaracteres();
if ( verificarSeTamanhoInvalido(this.cpf) )
return false;
if ( verificarSeDigIguais(this.cpf) )
return false;
cpfGerado = this.cpf.substring(0, 9);
cpfGerado = cpfGerado.concat(calculoComCpf(cpfGerado));
cpfGerado = cpfGerado.concat(calculoComCpf(cpfGerado));

if ( !cpfGerado.equals(this.cpf))
return false;
}
return true;
}

private void removerCaracteres(){
this.cpf = this.cpf.replace("-","&quot;
this.cpf = this.cpf.replace(".","&quot;
}
private boolean verificarSeTamanhoInvalido(String cpf){
if ( cpf.length() != 11 )
return true;
return false;
}
private boolean verificarSeDigIguais(String cpf){
//char primDig = cpf.charAt(0);
char primDig = '0';
char [] charCpf = cpf.toCharArray();
for( char c: charCpf )
if ( c != primDig )
return false;
return true;
}
private String calculoComCpf(String cpf){
int digGerado = 0;
int mult = cpf.length()+1;
char [] charCpf = cpf.toCharArray();
for ( int i = 0; i < cpf.length(); i++ )
digGerado += (charCpf[i]-48)* mult--;
if ( digGerado % 11 < 2)
digGerado = 0;
else
digGerado = 11 - digGerado % 11;
return String.valueOf(digGerado);
}
}
É isso aí pessoal, até a próxima.
2

Programação em portugues

Passeando pela net encontrei uma linguagem totalmente em portugues, não conhecia por isso resolvi postar um pouco sobre ela, bem ela é excelente para se aprender logica e programar em ambientes windows, tornando-se mais facil a compreensao.


Segue um pouco da linguagem postada no proprio site.

História do Logic Basic Imagem

Por Eleusmário Mariano Rabelo

Para vocês entenderem melhor o que inspirou a criação do Logic Basic, vamos voltar alguns anos antes da primeira versão do mesmo, que começou a ser desenvolvida no ano de 2000. Nessa época eu desenvolvia programas comerciais em linguagem C para computadores com sistemas operacionais MS-DOS e UNIX, pois esta linguagem além de ser muito mais rápida do que as linguagens utilizadas na época (Cobol, Clipper, Basic...) era bastante portátil, ou seja, os programas feitos no MS-DOS podiam ser migrados para o UNIX sem praticamente nenhuma modificação no código principal. Para isso, cada sistema operacional possuía uma biblioteca de funções (como se fosse uma linguagem de programação) feita em linguagem C, desse modo eu utilizava esse conjunto de funções padrões para fazer os programas. Essa biblioteca foi batizada de XLIB, e possuia funções de gerenciamento de banco de dados baseadas em técnicas avançadas, como leitura em árvore binária, rotinas de ordenação (indexação), procura binária, etc. Tudo tinha que ser feito na unha!
Com o surgimento do Windows, fui obrigado a migrar para este ambiente, e optei em programar em Visual Basic, pois a linguagem C se tornou uma opção inviável para este novo sistema operacional, mas foi fácil migrar os programas de C para Visual Basic, pois a biblioteca XLIB possuía várias funções inspiradas na linguagem Basic, que executavam praticamente as mesmas funções.
Após um bom tempo de programação em Visual Basic, notei que esta linguagem era um pouco complicada para programadores iniciantes, e me veio a idéia de criar uma linguagem de programação aproveitando a experiência que tinha tido com a construção da biblioteca de funções XLIB, e criar uma linguagem mais simples e fácil, parecida com o esquema de programação das antigas linguagens Basic, C, Cobol e Clipper, mas que seu resultado fosse visto em uma janela do Windows, e não do MS-DOS. Foi então que criei a primeira versão do Logic Basic, que na época foi batizado de Visual Baby, pois a intenção inicial era ser uma linguagem direcionada para crianças e iniciantes em programação.
Imagem
O programa consistia em uma pequena janela no topo do monitor de vídeo com dois botões, Janela e Código, e uma janela de digitação do código - para executar o programa, pressionava-se o botão "Janela", para voltar à janela de código, pressionava-se o botão "Código":
Imagem
Pouco depois de seu lançamento, o jornal "O Popular" da cidade de Goiânia, publicou um artigo em seu caderno de informática sobre o lançamento do Visual Baby, o que chamou a atenção de muitas pessoas em várias faixas etárias.
À medida que o tempo foi passando, começou a haver muito interesse de pessoas adultas pela linguagem, enquanto a mesma sofreu várias melhorias e inclusão de novos comandos, inclusive melhorias no banco de dados nativo, que foi inspirado no gerenciador de banco de dados da antiga biblioteca XLIB. Por esse motivo, resolvi mudar o nome do Visual Baby para um nome mais profissional, então ela foi rebatizada de Logic Basic, que iniciou com este nome na versão 3.0.
Imagem
Na versão 5.0 o Logic Basic mudou a aparência do ambiente de código para um visual mais "high tech", com o objetivo de atrair programadores de jogos:
Imagem

Imagem
Na versão 6.0, o ambiente de código do LB foi mudado novamente para um visual mais "profissional", a caixa de texto ganhou alguns recursos a mais como colorização automática do código, embora o editor de texto deixasse muito a desejar em recursos e também possuía alguns bugs:
Imagem

Imagem
Na versão 7.0 (a mais recente), o ambiente de código foi melhorado, e o editor de texto ganhou novos recursos, além dos bugs da versão anterior terem sido totalmente corrigidos:
Imagem


Eleusmário Mariano Rabelo é programador em C, Visual Basic 6 e 2010, Delphi, ASP, PHP, Perl, e autor do Logic Basic.

http://www.logicbasic.net/
2

[Ajuda] Diz se determinada posição do vetor é ou não primo em C

Boa noite, eu fiz o código mas não entendo porque na execução ele para de responder. Se alguém puder me ajudar eu agradeço.
Enunciado:
Criar um vetor A com 5 elementos inteiros. Escreva um programa que imprima cada elemento do vetor A e uma mensagem indicando se o respectivo elemento é um número primo ou não.

Código comentado:

[code=C]#include
#include

int main(){

int a[5],i,j,aux,cont[5]={0,0,0,0,0}; //Array para o cont contar ele com ele mesmo sem bugar

for(i=0;i<5;i++){
printf("Digite o %d. elemento: ",i+1);
scanf("%d",&a[i]); //Armazenando os valores no vetor
}
for(i=0;i<5;i++){ //Primeiro for do qual representa a posição do vetor
aux=0; //Vai zerar o auxiliar que armazena o valor da posição
aux=a[i]; //Armazena o valor da posição
for(j=0;j<=aux;j++){ //Enquanto o j for menor que o valor da posição vai incrementando os valores para serem divididos
if (aux%j==0){ //Se a divisão tiver como resto zero
cont[i]++; //Incrementa na posição i de cont (do qual representa o valor)
}
}
}
printf("\n\n");
for(i=0;i<5;i++){
if(cont[i]==2){ //Testa se a posição foi divisível por mais de dois números
printf("%d eh primo",a[i]); //Se for, é porque só dividiu por 1 e por ele mesmo, então é primo
}else{
printf("%d nao eh primo",a[i]); //Senão, vai apresentar que não é.
}

}
printf("\n\n\n");
system("pause");
return 0;
}[/code]

Fui tentando de outras formas até conseguir e deu certo.
Aqui a resolução:

[code=C]#include
#include

int main(){

int a[5],i,j,aux,cont;

for(i=0;i<5;i++){
printf("Digite o %d. elemento: ",i+1);
scanf("%d",&a[i]);
}
for(i=0;i<5;i++){
cont=0;
aux=0;
aux=a[i];
for(j=1;j<=aux;j++){
if (aux%j==0){
cont++;
}
}
printf("\n");
if(cont==2){
printf("%d eh primo",a[i]);
}else{
printf("%d nao eh primo",a[i]);
}
}
printf("\n\n\n");
system("pause");
return 0;[/code]
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal