Neto C++
Neto C++
Neto C++
Comando #ai:
- #ai1 - Não mostra seus HITS. (Nem para você, nem para os outros)
- #ai0 - Volta a mostrar seus HITS.
Comando #skbar:
- #skbar - Lê o arquivo "skillbar.txt" com as ids das skill que você escolher. (Use a
ferramenta pesquisa e veja a skill que quiser na Skill List abaixo.)
Comando #alone:
- #alone - #foreveralone não é 1 comando é 1 string, o comando é #alone que te
envia pra um lugar solitário.
Comando #ceoff:
- Tira o Critical Error quando é digitada uma coordenada errada. (Digite antes de
digitar a coordenada!)
Comando #coords:
- #coords - Aparece no console uma lista de coordenadas úteis.
Comando #add:
- #add - Serve pra adicionar pontos os pontos de status.
Comando #ss:
- #ss - 0~1~2~3 é bem util diferente do que alguns pensam. Utilize #ss 3 por
exemplo (Classe: HT), aperte S e terá todas as skill de HT liberadas. Escolha as
que mais lhe convem e coloque na barra para utilizar. (Para utilizar skill's de outras
classes deve estar com #speedatkon ativado)
Classes:
0(TKA)
1(FM)
2(BM)
3(HT)
Comando #smo:
- #smo - É como se fosse o #fastkill, mas funciona para magia.
Como fazer um cavalo fake nvl 120 :#fakeitem 2370 300 120 120 315 350
#move
#moved
#rangeon
#atkinvon
#atk <id> // envia um pacote de ataque fisico, apenas para teste
#mgatk <id> <skill> // envia um pacote de ataque magico, apenas para teste
#speedatkon //
#speedmoveon
#wallon // ataca através das paredes
#invon // da ban 3hrs
#allon // ativa range hack, speed, wall hack, atkinv
#cassino <gold> <flag> //apenas para testes
#skill <skill id>
#fixskill // fixa a skill do comando #skill para não precisar ficar digitando o id toda
hora, para desativar digite #skilloff
#soulon // pega a skill soul, precisa ter alguma 8° skill
#opencargo //abre o guarda de carga
#party <id> <nome> //entra no grupo de alguem
#fakeitem <id> <add>... //cria um item fake client side
#secon //mantém o char imovel
#buffhack //voce pode buffar qualquer skill nos outros
#indexon // mostra o indice de cada Erro! A referência de hyperlink não é
válida.
http://www.webcheats.com.br/forum/wyd-cheats/858053-wyd_upper.html
http://www.webcheats.com.br/forum/wyd-cheats/869455-wyd-hacker-whook-br-757-a.html
http://www.webcheats.com.br/forum/wyd-cheats/899912-trainner-nandas-whook-7-57-br-
markim11.html
Introdução
A linguagem C++ foi desenvolvida inicialmente por Bjarne Stroustrup na AT&T, de 1979 a
1983, à partir da linguagem C, tendo como idéia principal a de agregar o conceito de classes, de
orientação à objetos, àquela linguagem. Razão porque iniciamente chamva-se de “C com
classes”. Bjarne procurou tanto quanto possível manter retrocompatibilidade com C, de modo
que programas em C pudessem ser compilados por um compilador C++ com um mínimo de
alterações. Entretanto, encarar C++ como um superconjunto de C é um erro, e C++ deve ser vista
como uma “outra linguagem”, por diversas razões. Em primeiro lugar, nem todo o programa
escrito em C é compilado em C++ sem erros, e pode nem mesmo gerar o mesmo resultado, já
que a sintaxe e a semântica de algumas construções diferem. Ao ligar-se partes de um programa
em C++ com partes em C, estas devem ser bem especificadas, pois as convenções de
funcionamento do código compilado também diferem. Além disso, C++ oferece um conjunto de
mecanismos básicos que não estavam presentes em C, e estes devem ser usados para produzir
software mais modular e confiável explorando-se as verificações disponíveis no compilador.
Finalmente, os mecanismos de C++ devem inspirar a programação segundo o paradigma de
orientação a objetos e, portanto, não se deve programar em C++ como se faz em C.
A partir da primeira versão de 1983, a linguagem foi sendo revisada e evoluindo, tornou-se
disponível fora da AT&T em 1985, e após um longo processo foi padronizada pela ISO no final
de 1997, pelo padrão ISO/IEC 14882. Você pode obter mais informações sobre o
desenvolvimento da linguagem na página do próprio autor em [STR 2004].
STL é uma parte do padrão C++, e consiste em uma biblioteca de funções e estruturas de dados
que todo compilador C++ deve oferecer, provê as implementações mais comuns em um
programa, e pode-se utilizá-la com diferentes tipos de dados. Um bom ponto de partida para
leitura específica sobre STL é na página da Silicon Graphics, Inc. em [STL 2004].
De forma geral, é possível obter muito material de referência da linguagem através de páginas na
Internet. Tente por exemplo pesquisar com a expressão “C++ reference” no Google. Também é
muito produtivo criar o hábito de pesquisar por problemas bem específicos. Tente, por exemplo,
pesquisar “iostream.h iostream difference”, ou “STL hash_map code example”. Pode-se obter
cursos [BRA 1998], livros e exemplos de código [ECK 2000]
Os compiladores do projeto GNU também podem ser obtidos livremente através da Internet. O
ambiente BloodShed Dev-C++ roda sobre Windows e utiliza os compiladores gcc e g++. É
possível baixá-lo de: http://www.bloodshed.net/devcpp.html. Há também inúmeros fóruns e
listas de discussão sobre aspectos técnicos da linguagem. Então, use e abuse da Internet para
aprendê-la e resolver seus problemas.
chapter2/2.1-01-hello.cpp
A diretiva #include serve para fazer com que o compilador inclua como parte desse código outro
arquivo de código fonte. Em geral, esse recurso é usado para incluir definições de dados e código
que serão utilizados por nosso programa, mas já foram compilados e estão disponíveis em uma
biblioteca. É função da etapa de ligação montar o executável final incluindo o código compilado
para o nosso programa com o código compilado dessas bibliotecas.
Todo programa em C++, assim como em C, pode ser visto como um conjunto de funções. As
funções serão apresentadas no capítulo 2, mas é necessário saber primeiro que todos os
comandos da linguagem devem estar dentro de funções, e que, portanto, um programa deve ter
no mínimo uma função. Essa função principal tem o nome de main, sendo esse nome o que
identifica por onde a execução inicia.
O namespace é um recurso utilizado para evitar que, quando se constróem grandes programas,
nomes de variáveis, classes e funções conflitem. Esse conceito será apresentado mais adiante,
mas aqui precisamos dele, pois a saída padrão, cout, está definida dentro do espaço chamado std,
de standard. Dados podem ser impressos enviando-os para a saída adrão, cout. Da mesma forma,
dados podem ser lidos através da entrada padrão, cin. Também nesse caso o tipo de dado lido
depende da variável para a qual se está fazendo a leitura.
chapter2/2.1-02-hello.cpp
Todas as declarações e comandos da linguagem devem ser terminados por ‘;’. Esse sinal não
serve apenas como separador nas declarações, mas serve para identificar composição de
seqüência entre os comandos, isto é, primeiro é executado um e depois o outro. Utilize vários
comandos de impressão para gerar uma saída mais longa.
chapter2/2.2-01-declaration.cpp
A tabela 1 apresenta os tipos de dados básicos da linguagem, exemplos de valores literais, e
intervalos de valores aceitos. Cada tipo de dado possui representação de valores literais
adequados, tanto para inicialização quanto para atribuições. Em geral usa-se bool, char, int, long
e double mais freqüentemente, onde long é uma abreviação para long int.
bool
Valores booleanos
true false
true false
char
Caracteres simples
‘a’ ‘A’ ‘+’ ‘\t’ ‘\n’
0 a 255, isto é, 8 bits
int
Números inteiros
100 0x3F
16 bits ou mais, 32 normal
float
Números reais
1.2f .23f 1.f 1.5e-15f
double
Reais dupla precisão
1.2 .23 1. 1.5e-15
Assim como C, C++ é uma linguagem que permite programação em baixo nível. Assim, a
linguagem não possui propriamente caracteres, mas o tipo char é apenas um núemro de no
mínimo 8 bits, e os literais (‘a’,’X’) podem ser atribuídos a qualquer variável numérica.
chapter2/2.2-02-declaration.cpp
Um tipo de dado pode ser convertido em outro tipo com um cast. O cast deve preceder um valor
e consiste no tipo para o qual se deseja converter, entre parênteses, como, por exemplo: (int) ‘a’.
Esse cast simples introduzido aqui é o mesmo da linguagem C, mas deve-se evitar utilizá-lo, pois
em seu lugar C++ possui outros quatro tipos diferentes de cast que são mais seguros, a serem
apresentados adiante.
chapter2/2.2-03-charcast.cpp
chapter2/2.3-01-operadores.cpp
chapter2/2.4-01-vetor.cpp
2.5.1 A construção if
A construção if tem a seguinte sintaxe, sendo opcional a parte do else em diante:
Exercícios:
de 9 a 10
A
de 7,5 a 9
B
de 6 a 7,5
C
de 0 a 6
D
Exercícios:
Exercícios:
Exercícios:
2.5.7 O operador ?
O par de operadores ? : funciona como a construção condicional if, mas sob a forma de
expressão. Isto é, esse operador retorna um valor, o valor da expressão que foi avaliada. Um
exemplo de uma expressão com esse operador, já usada em um assinalamento, é a seguinte:
2.5.8 C++ tem label e goto, mas não contem para ninguém
Assim como C, C++ também possui o comando goto, que desvia a execução do programa para
um label que identifica uma outra linha de código. Deve-se evitar ao máximo o uso desse
recurso, pois ele quebra a estrutura do programa em termos de iterações, condições e blocos.
Entretanto, ele pode ser bem utilizado para geração automática de código, como, por exemplo, na
implementação de autômatos.
2.6.1 Namespaces
Namespaces servem para separar espaços de nomes em módulos e bibliotecas inteiras, evitando
que nomes de variáveis, estruturas, funções e classes conflitem. Os namespaces são abertos, isto
é, podem ser declarados várias vezes, cada qual acrescentando novos elementos dentro do
mesmo namespace.
chapter2/2.6-01-namespace.cpp
chapter2/2.6-03-io.cpp
chapter2/2.6-04-files.cpp
O mecanismo de tratamento de exceções da linguagem serve justamente para isso. Ele especifica
o registro de uma situação de exceção, e o desvio para um local que declara tratá-lo diretamente,
cruzando as fronteiras de funções e controle de fluxo (mas fazendo as operações necessárias de
desativação dessas funções, como um retorno prematuro). No disparo da exceção, é possível
passar quaisquer informações ao tratamento. Aqui é utilizado um número inteiro apenas, mas
será tipicamente um objeto de uma classe “exceção” em uma aplicação real.
chapter2/2.6-05-try.cpp
chapter3/3.1-00-matrix.cpp
chapter3/3.1-01-matrix1.cpp
3.2 Funções
Uma função agrupa um conjunto de comandos da linguagem, podendo esse conjunto ser
chamado de várias partes de um programa. Funções servem para economizar código-fonte e
organizar melhor um programa. Uma função possui um nome, um tipo de valor de retorno, e um
conjunto, possivelmente vazio, de parâmetros de entrada, cada um com seu tipo específico. Esses
elementos caracterizam uma assinatura da função, que, para ser completa, deve ser seguida de
sua implementação, ou corpo. Um protótipo de uma função é uma definição com o corpo
omitido, e se utiliza esse recurso para declarar previamente uma função e fazer seu nome
conhecido antes de dar sua implementação.
Ao contrário de C, em C++ pode-se ter várias funções com exatamente o mesmo nome, desde
que os tipos ou número de parâmetros de entrada variem. Chama-se isso de sobrecarga de
funções. Embora se possa utilizar esse recurso arbitrariamente, ele faz sentido para dar versões
diferentes de uma mesma função que estão disponíveis para diferentes parâmetros de entrada. As
funções em C++ podem ter parâmetros com valores default. No caso de argumentos para esses
parâmetros serem omitidos na chamada os valores default são utilizados. Somente pode ser
omitido o valor de um parâmetro se todos os outros à sua esquerda também tiverem sido
omitidos.
O qualificador inline, utilizado antes da declaração de uma função, faz com que o código dessa
seja substituído no lugar da chamada, se possível, para que o programa rode mais rapidamente.
Em C isso deve ser implementado com a substituição textual das macros (#define).
3.3 Estruturas
O programador deve modelar o problema que deseja resolver ou processar utilizando-se de
algoritmos e estruturas de dados. Do ponto de vista de recursos de linguagem, alguns recursos
são oferecidos para facilitar a descrição dessas estruturas. De fato, um deles possui exatamente
esse nome, de estrutura, mas é nada mais do que um agregado de valores.
3.3.1 struct
Em C++, uma estrutura é um tipo de dado conhecido pela linguagem. Assim, ela entende a todas
as antigas formas de declaração de C, e adicionalmente o nome da estrutura pode ser diretamente
utilizado sem o prefixo struct.
chapter3/3.3-01-struct.cpp
3.3.2 union
Uma união é apenas uma estrutura onde todos os campos utilizam a mesma posição. Ela pode ser
utilizada para dar diferentes interpretações a uma área de memória, ou armazenar de forma
compacta dados mutuamente excludentes.
3.3.3 enum
Uma enumeração é um novo tipo de dado que possui valores discretos específicos. Pode-se
declarar uma enumeração para o tipo dia, e uma variável do tipo dessa enumeração poderá ter os
valores: segunda, terca, e assim por diante. Uma enumeração é nada mais do que um número
inteiro para o qual são dados nomes específicos a alguns valores. De fato, pode-se definir
exatamente quais são esses valores. As enumerações servem para organização interna do código,
mas quando seu valor é impresso, é interpretado apenas como número.
3.4 typedef
A declaração typedef define um novo tipo de dado tendo como base um tipo conhecido. Por
exemplo, pode-se fazer:
E a partir de então passar a usar somente int16 e int32 nas declarações de um programa. Se esse
programa for portado para outra máquina e compilador onde int tem só 16 bits, pode-se redefinir
int32 como long apenas em uma posição.
3.5 Ponteiros
Todas as variáveis estão armazenadas em memória. Cada uma tem seu endereço e seu conteúdo.
Quando usamos o nome de uma variável num programa, o compilador compila no código o
endereço, para que, quando executado, o processador acesse o conteúdo. Isso significa que o
compilador só vê o endereço e o programador só vê o conteúdo. Para ver o endereço, usa-se o
operador & na frente da variável, que significa “endereço de”, e é chamado operador de
referenciação. Ao contrário, para manipular um valor armazenado em um endereço, usa-se o
operador * na frente do endereço, que significa “valor apontado por”, e é chamado operador de
de-referenciação. Um ponteiro é apenas uma variável cujo conteúdo é um endereço de memória,
provavelmente o endereço de outra variável. Esse endereço pode ser obtido por referenciação, e
posteriormente o dado daquela variável apontada pode ser manipulado por de-referenciação. Para
declarar um ponteiro, acrescenta-se * entre o tipo e o nome da variável (nesse caso variável
apontador). Convém já notar que uma variável do tipo ponteiro, ou apontador, como todas as
outras, também tem seu conteúdo (que vai ser o endereço de outra) e seu próprio endereço em
memória. É por isso que aparecem os ponteiros para ponteiros.
chapter3/3.5-01-pointer.cpp
chapter3/3.5-02-pointer.cpp
Uma boa sugestão para aprendizagem é declarar outras variáveis e vetores e imprimir seus
valores e conteúdos. Utilize os programas abaixo para fazer essas experiências, incluindo fazer
atribuições às variáveis que são ponteiros e às variáveis apontadas por elas. Sempre considere
que as variáveis locais aparecem em ordem inversa na memória, pois são criadas na pilha do
sistema, e que existem regras de alinhamento, e, portanto, variáveis declaradas consecutivamente
podem aparecer separadas por espaços para satisfazer tais regras.
3.6 Constantes
A palavra const é um qualificador, assim como signed ou short, e serve em primeiro lugar para
dar nome a valores constantes posteriormente usados no programa. Já que a variável não pode
ser posteriormente atribuída, toda declaração de const deve ter inicialização.
Mas o significado de const é um pouco mais sutil. Ele define que determinado valor não vai ser
alterado, e não precisa necessariamente ser aplicado a um valor de fato constante. Pode-se passar
uma variável para uma função que recebe uma constante, significando que essa função não vai
alterar esse valor. Ao passar argumentos por valor, isso nem faz muita diferença, mas no caso de
ponteiros sim. Se uma função recebe const char*, pode-se passar qualquer ponteiro para
caracteres, mesmo não constante. Nesse caso, const serve para especificar (e enforçar) que a
função não vai e nem pode alterar o caracter apontado pelo ponteiro que ela recebeu.
Em uma declaração, o qualificador const pode ser usado em diversas posições, com diferentes
significados. Pode-se ler da esquerda para direita (em inglês) para compreender as interpretações.
A construção *const é uma construção especial que significa ponteiro constante.
char const * p;
// ponteiro para um caracter constante
chapter3/3.6-01-const.cpp
3.8 Referências
Uma referência é um nome alternativo para uma variável. Ela pode ser usada em passagem de
parêmetros e retorno de resultados, para fazer com que se opere na variável original,
implementando passagem por referência sem usar ponteiros. Nesse sentido ela faz algo bem
semelhante a um ponteiro. Entretanto, uma referência não é um ponteiro, não ocupa espaço em
memória, e não se podem efetuar operações sobre ela (somente sobre a variável que ela
referencia).
chapter3/3.8-01-reference1.cpp
chapter3/3.8-02-reference2.cpp
chapter3/3.8-03-reference3.cpp
chapter3/3.9-01-arrow.cpp
chapter3/3.10-01-new.cpp
chapter4/4.1-00-acesso.cpp
chapter4/4.1-01-firstclass.cpp
chapter4/4.1-02-secondclass.cpp
chapter4/4.3-01-construtor.cpp
chapter4/4.3-02-conversao.cpp
chapter4/4.3-03-destrutor.cpp
chapter4/4.3-04-destrutor2.cpp
A existência das funções destrutoras traz um problema à tona. Objetos podem ser copiados e
assinalados livremente. Mas quando um objeto contém um ponteiro para algo que ele criou
(outro objeto, vetor, etc...) esse ponteiro será copiado pelo seu valor binário, e não o conteúdo de
um sub-objeto para o outro. No exemplo acima, se dois cursos são criados e você assinala um ao
outro, não somente os dois ficam com o ponteirointerno apontando para a mesma lista de alunos,
como uma das listas de alunos fica solta sem ninguém a referenciando na memória. Quando os
objetos sairem do escopo (neste caso, ou forem deletados com delete), as funções destrutoras irão
ser chamadas e irão deletar duas vezes a mesma lista de alunos, causando mal funcionamento do
programa. Para resolver isso, implementa-se uma função especial para fazer o assinalamento.
Isso é possível através da sobrecarga de operadores. Define-se uma nova função para o operador
de assinalamento ‘=’, que deverá atuar entre um objeto dessa classe à sua esquerda e um outro
objeto da mesma classe à sua direita. A função impplementada faz a cópia correta dos valores de
objetos apontados pelo nosso objeto principal sendo assinalado, e é a primeira aplicação prática e
muito útil de sobrecarga de operadores.
chapter4/4.3-05-assignment.cpp
chapter4/4.4-01-elegantoverload.cpp
chapter4/4.4-02-safevector.cpp
chapter4/4.4-03-safevector2.cpp
Já para métodos a diferença não está na existência de múltiplas instâncias, mas apenas na
dependência dos objetos. Métodos estáticos são como funções globais quaisquer, e não
necessitam de um objeto da classe para serem chamados.
chapter4/4.5-01-static.cpp
As variáveis e métodos também podem ser cconstantes ou não. Variáveis constantes são aquelas
que não serão alteradas. Elas precisam ser inicializadas na sua declaração,já que não podem
sofrer atribuições. Já os métodos constantes, que se caracterizam pela palavra const logo após a
lista de parâmetros entre parênteses, são aqueles que apenas fazem inspeção do objeto, mas não
alteram seu valor. Esses são os únicos métodos que podem acessar objetos declarados como
const no código, pois garantem que não alterarão seu valor. O correto uso do qualificador const
confere maior clareza ao código.
chapter4/4.5-04-constfunction.cpp
chapter4/4.6-00-derived0.cpp
chapter4/4.6-01-derived1.cpp
chapter4/4.6-06-derived6.cpp
4.6.3 Construtores
O construtor de uma classe derivada pode (e deve) chamar construtores de classes base das quais
deriva, passando os parâmetros corretos, para que todas os objetos sejam construidos
adequadamente.
chapter4/4.6-xx-sample.cpp
chapter4/4.6-03-derived3.cpp
chapter4/4.6-04-derived4.cpp
chapter4/4.6-05-derived5.cpp
· sempre teste a validade dos parâmetros recebidos em uma função: se forem números, seus
limites, e se for ponteiro, para que não seja nulo;
· sempre desconfie quando você escrever três vezes o mesmo código: deve haver um meio
genérico de fazer o mesmo com repetições, vetores, indireção ou templates;
· evite o uso de ponteiros: use referências e as estruturas de STL, guardando objetos em vetores,
listas e principalmente maps, onde eles podem ser localizados, recuperados e alterados através do
uso de identificadores e iteradores;
· comente no inicio do arquivo o que ele faz, seu autor, data de criação, e ao menos data da
última atualização e qual foi: se possível, mantenha a lista das atualizações, datas e quem as
executou;
· use comentários antes das implementações das funções dizendo o que elas fazem, a estratégia, o
algorimo;
· faça tabulações na declaração de variáveis (em classes e métodos) de forma que fiquem
alinhados verticalmente: tipos de retorno, nomes, parâmetros, comentários;
chapter5/5.2-00-program0.c
chapter5/5.2-00-module.h
chapter5/5.2-00-module.c
chapter5/5.2-00-main1.c
chapter5/5.2-01-program1.cpp
chapter5/5.2-01-module1.h
chapter5/5.2-01-module1.cpp
chapter5/5.2-01-main1.cpp
chapter5/5.3-01-listoptions.cpp
chapter5/5.3-02-listoptions2.cpp
6 Templates e STL
Um template é uma evolução das macros de C, mas que inclui todos os recursos sofisticados e
verificações de alto nível da linguagem C++. É uma maneira de especificar estruturas e
algoritmos configuráveis. STL é uma biblioteca padronizada contendo um conjunto de templates
que implementa as estruturas de dados e os algoritmos mais utilizados na construção de um
programa. Templates devem ser usados para prover maior produtividade, evitando que se tenha
que re-inventar a roda a cada novo programa, ou que se dependa de bibliotecas produzidas por
terceiros e os problemas associados de portabilidade. Por essa razão, aqui será tratado apenas o
conceito e o praticado o uso de templates da STL, evitando-se toda complexidade associada à
definição de novos templates de classes e métodos. Mesmo com a exclusão desse conteúdo,
apresenta-se brevemente no final o conceito de programação genérica, cujo potencial é bastante
atraente.
chapter6/6.1-01-hello.cpp
chapter6/map.cpp
chapter6/hash_map.cpp
chapter6/generic.cpp
----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
All the operators in this section are unary (one argument) operators.
+- RL unary versions
! RL logical NOT
& RL address of
* RL dereference
----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
== != LR equality relational
----------------------------------------------------------------------
----------------------------------------------------------------------
^ LR bitwise XOR
----------------------------------------------------------------------
| LR bitwise OR
----------------------------------------------------------------------
----------------------------------------------------------------------
|| LR logical OR
----------------------------------------------------------------------
?: RL conditional
----------------------------------------------------------------------
= RL assignment
----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
As palavras reservadas da linguagem C++ são as da tabela abaixo. Elas não podem ser utilizadas
como nomes de identificadores, e isso pode conflitar com programas escritos em C e que sejam
portados para C++.
asm
do
if
public
this
auto
double
inline
register
throw
break
else
int
return
try
case
enum
long
short
typedef
catch
explicit
mutable
signed
union
char
extern
namespace
sizeof
unsigned
class
float
new
static
using
const
for
operator
struct
virtual
continue
friend
private
switch
void
default
goto
protected
template
volatile
delete
while