entendimento e uso de variáveis em c# - …§ao-a-c.pdf · entendimento e uso de variáveis em c#...
TRANSCRIPT
Entendimento e uso de variáveis em C# Variáveis representam locais de memória nos quais seus programas podem armazenar valores e acessá-los e/ou modificá-los durante a execução. Confuso? Vamos analisar melhor este cenário.
Toda vez que você executa um aplicativo, o sistema operacional carrega as instruções deste programa para a memória principal de seu computador. Durante o processamento das diversas funções e cálculos, este aplicativo precisa armazenar valores temporariamente. Sem entrar em discussões técnicas sobre o funcionamento de hardware e memórias, podemos dizer que a memória principal de seu computador é dividida em posições de memória, cada posição possuindo um endereço único. Veja a ilustração a seguir:
Ora, não seria nada prático acessar estas posições de memória usando seus endereços (representados por valores inteiros hexadecimais). Dependendo da quantidade de memória principal disponível, estes endereços podem chegar à casa dos bilhões. Em vez disso as linguagens de programação usam apelidos para estas posições de memória. Tais apelidos são conhecidos como variáveis. Uma variável possui cinco atributos muito importantes. São eles: 1) Nome – É o nome que identificará a variável. Este nome deve ser único dentro de seu escopo (espaço de atuação), ou seja, nada impede que classes e métodos tenham nomes semelhantes àqueles encontrados em outras classes e métodos. 2) Valor – É o valor contido na variável. Veremos mais adiante como atribuir ou alterar os valores
contidos em variáveis. 3) Tipo – É o tipo de dados que será armazenado nas variáveis. Tipos de dados podem ser inteiro, string (texto), números de ponto flutuante, etc. Tipos de dados serão vistos mais adiante. 4) Visibilidade ou escopo – É o alcance de visibilidade, ou seja, os locais a partir dos quais esta variável poderá ser acessada pelas diversas partes do código. A discussão sobre escopo de variáveis será adiada até a nossa analise de classes, métodos e estruturas de repetição. 5) Endereço – Cada variável possui um endereço único. Este atributo terá sua importância destacada quando abordarmos código não seguro (unsafe code) usando ponteiros. Agora que já sabemos o suficiente sobre variáveis, vamos escrever um aplicativo exemplificando seu uso. Considere a listagem a seguir: using System;
class Variaveis
{
static void Main()
{
int valor;
valor = 10;
Console.WriteLine("O valor é: {0}", valor);
valor = 20;
Console.WriteLine("O valor foi alterado para: {0}", valor);
}
}
Compile este exemplo e observe o resultado de sua execução. Você terá as seguintes mensagens: O valor é: 10
O valor foi alterado para: 20
Vamos entender o que aconteceu aqui. Dentro do método Main temos a declaração de uma variável do tipo inteiro chamada valor. Em seguida atribuímos o valor 10 à esta variável. Tipos de dados serão vistos mais adiante. O operador de atribuição será apresentado na parte 3. A linha
seguinte faz uso do método WriteLine da classeConsole para exibir o valor desta variável no console: Console.WriteLine("O valor é: {0}", valor);
Aqui temos uma construção que merece muita atenção. Observe o símbolo {0} dentro das aspas ao redor do texto a ser exibido. Este símbolo é um lugar de marcação para os valores das variáveis localizadas após a vírgula. Atente para o fato de que você poderá ter um número ilimitado de nomes de variáveis após a vírgula e seus valores poderão ser exibidos usando {0}, {1}, {2} e assim por diante.
A quarta linha do código: valor = 20;
atribui um novo valor à variável valor. Para finalizar, uma nova chamada ao métodoWriteLine exibe o novo valor no console.
A diferença entre declaração e definição de variáveis Para um perfeito entendimento e uso de variáveis, é necessário perceber uma sutil diferença entre declaração e definição de variáveis. Vejamos o significado de cada uma nas linhas seguintes.
A declaração de uma variável informa o compilador sobre seu nome e seu tipo. Veja uma linha de código que declara uma variável chamada idade: int idade;
A definição ou inicialização de variáveis ocorre quando as células de memória necessárias ao armazenamento destas variáveis são alocadas. Veja, por exemplo, um trecho de código que declara uma variável e em seguida a inicializa:
int idade;
idade = 20;
Dependendo do contexto em que uma variável é declarada, o compilador a inicializa automaticamente com um valor padrão para o tipo de dados. Porém, variáveis locais nunca são inicializadas automaticamente. Uma variável local é uma variável declarada dentro de métodos e alguns outros blocos de código. Para demonstrar como o compilador C# se comporta quando uma
variável local é declarada, mas ainda não definida (inicializada), vamos escrever o seguinte aplicativo: using System;
class Variaveis
{
static void Main()
{
int idade;
Console.WriteLine("Idade: {0}", idade);
}
}
Este código está disponível no arquivo Variaveis2.cs. Experimente compila-lo e verá a seguinte mensagem de erro: Variaveis2.cs(9,37): error CS0165: Use of unassigned local variable 'idade'
Esta mensagem de erro ocorreu porque a variavel idade foi declarada dentro do métodoMain do aplicativo e, portanto, é uma variável local. Variáveis locais devem sempre ser inicializadas antes de serem usadas.
Observação
C# permite que a declaração e definição de uma variável sejam feitas em apenas uma linha. Assim, é perfeitamente legal escrever o trecho de código seguinte: int idade;
idade = 20;
em uma forma mais reduzida: int idade = 20;
Como usar constantes em C# Vimos no tópico anterior que variáveis podem ter seus valores alterados durante a execução do programa. Existe um tipo de variável que não permite que seu valor seja alterado após sua definição. Em C# esta variável é declarada com a palavra-chaveconst. Veja um exemplo de declaração e inicialização de uma constante cujo valor é um numero inteiro: const int idade = 30;
Vamos escrever um aplicativo que demonstra o que acontece quando tentamos alterar o valor de uma constante declarada e já inicializada: using System;
class Constantes
{
static void Main()
{
const int idade = 30;
idade = 45; // causa erro de compilação
Console.WriteLine("Idade: {0}", idade);
}
}
Salve esta listagem como Constantes.cs. Ao tentarmos compilar este código obtemos a seguinte mensagem de erro: Constantes.cs(9,5): error CS0131: The left-hand side of an assignment must be a
variable, property or indexer
Esta mensagem nos diz que o lado esquerdo de uma operação de atribuição deve ser uma variável, propriedade ou indexer. Propriedades e indexers serão vistos nas próximas partes do curso. Vamos escrever um aplicativo que demonstra o que acontece quando tentamos alterar o valor de uma constante declarada e já inicializada: using System;
class Constantes
{
static void Main()
{
const int idade = 30;
idade = 45; // causa erro de compilação
Console.WriteLine("Idade: {0}", idade);
}
}
Salve esta listagem como Constantes.cs. Ao tentarmos compilar este código obtemos a seguinte
mensagem de erro: Constantes.cs(9,5): error CS0131: The left-hand side of an assignment must be a
variable, property or indexer
Esta mensagem nos diz que o lado esquerdo de uma operação de atribuição deve ser uma variável, propriedade ou indexer. Propriedades e indexers serão vistos nas próximas partes do curso.
Vamos escrever um aplicativo que demonstra o que acontece quando tentamos alterar o valor de uma constante declarada e já inicializada: using System;
class Constantes
{
static void Main()
{
const int idade = 30;
idade = 45; // causa erro de compilação
Console.WriteLine("Idade: {0}", idade);
}
}
Salve esta listagem como Constantes.cs. Ao tentarmos compilar este código obtemos a seguinte mensagem de erro: Constantes.cs(9,5): error CS0131: The left-hand side of an assignment must be a
variable, property or indexer
Esta mensagem nos diz que o lado esquerdo de uma operação de atribuição deve ser uma variável, propriedade ou indexer. Propriedades e indexers serão vistos nas próximas partes do curso. Regras e dicas para a escolha de nomes de variáveis e constantes
Agora que você já sabe como usar variáveis e constantes em seus programas C#, é hora de aprender um pouco sobre as regras impostas pela linguagem em relação aos nomes que você poderia escolher para seus identificadores: a) O nome de um identificador pode conter apenas letras, dígitos e o caractere de sublinhado (_); b) O primeiro caractere deve obrigatoriamente ser uma letra. Ainda que o caractere de sublinhado seja permitido, seu uso não é recomendado devido ao fato de tornar o código mais difícil de ser entendido; c) O C# diferencia minúsculas de maiúsculas. Desta forma, CLIENTE, Cliente e cliente são identificadores distintos; d) Palavras-chave não podem ser usadas como identificadores. O tópico a seguir lista todas estas palavras em ordem alfabética.
Para reforçar estas regras veja uma lista de identificadores considerados válidos: int valor;
string _nomeCliente;
float ValorTotal;
double a3;
short numero_conta;
Os identificadores a seguir são considerados inválidos: string #nomeDoCliente;
float 1_Valor;
int $aumento;
Existe um consenso entre programadores e autores que os nomes de constantes devam ser escritos usando apenas letras maiúsculas. Essa pratica é comum nas linguagens C, C++ e Java. Com freqüência você verá este estilo de nomeação sendo aplicado também em C#. Fique à vontade para escolher seu estilo. As observações nestas próximas linhas não são exigências, mas, uma forma de estimular o leitor a se adequar ao estilo de programação de vários programadores experientes ao redor do mundo. A primeira observação é o uso de letras minúsculas para os nomes de variáveis. Esta pratica é comum nas linguagens C, C++ e Java. Se o nome da variável for composto de mais de uma
palavra, você pode adotar o que é conhecido como notaçãoCamel. Em tal notação o nome da variável seria nomeCliente (com a primeira palavra iniciando com letras minúsculas e as demais palavras iniciando com letras maiúsculas). Quando se trata de nomes de classes, métodos, interfaces e outros elementos da linguagem C#, é comum a adoção da notação Pascal. Neste estilo a inicial de cada palavra é escrita com letra maiúscula. Assim, uma classe que representa um relatório de vendas poderia ser nomeada RelatorioVendas. Este curso adota a notação Camel para variáveis e constantes e a notação Pascal para classes, interfaces e demais elementos. Palavras-chave e palavras reservadas da linguagem C#
Palavras-chave são palavras que têm um significado especial para o compilador. Palavras reservadas são palavras que não estão em uso agora, mas há a chance de que estas possam ser incluídas na linguagem posteriormente. Em todo caso, você não poderá usar nenhuma das palavras listadas abaixo para nomear variáveis e constantes em seus códigos. Esta lista de palavras-chave consta da documentação da linguagem C# presente no framework .NET versão 1.1.
abstract event new struct
as explicit null switch
base extern object this
bool false operator throw
break finally out true
byte fixed override try
case float params typeof
catch for private uint
char foreach protected ulong
checked goto public unchecked
class if readonly unsafe
const implicit ref ushort
continue in return using
decimal int sbyte virtual
default interface sealed volatile
delegate internal short void
do is sizeof while
double lock stackalloc
else long static
enum namespace string
Tipos de dados numéricos Agora que você já sabe como declarar variáveis e constantes, é hora de saber quais os tipos de dados que você pode usar eu seus aplicativos. Nos exemplos anteriores vimos que uma variável é declarada seguinte o modelo: Tipo_de_dados nome_da_variável
Em alguns de nossos exemplos aprendemos a declarar variáveis do tipo inteiro usando a palavra
chave int. int é parte de uma lista de tipos conhecidos como built-in types, ou seja, tipos de
dados pré-definidos na linguagem. Os tipos de dados em C# podem ser divididos em quatro categorias: integrais,números de ponto-flutuante, decimal e boolean. Na categoria dos tipos de dados integrais (tipos que não apresentam partes fracionárias) temos os constantes na tabela seguinte:
Tipo Faixa de Valores Tamanho
sbyte -128 até 127 8 bits
byte (sem sinal) 0 até 255 8 bits
char (unicode) U+0000 até U+ffff 16 bits
short -32.768 até 32.767 16 bits
ushort (sem sinal) 0 até 65.535 16 bits
int -2.147.483.648 até 2.147.483.647 32 bits
uint (sem sinal) 0 até 4.294.967.295 32 bits
long -9.223.372.036.854.775.808 até 9.223.372.036.854.775.807
64 bits
ulong (sem sinal) 0 até 18.446.744.073.709.551.615 64 bits
Com certeza o leitor deve estar se perguntando qual é a real necessidade de se conhecer a faixa de valores possíveis e a quantidade de bits ocupados por um determinado tipo de dados. E qual é a diferença entre um tipo sinalizado (sbyte) de um tipo não sinalizado (byte)? A razão pela qual este curso apresenta tais informações ficará clara à medida que você progredir com seus estudos, não somente da linguagem C#, como também de outras linguagens e técnicas de programação. O apêndice A "Sistemas de Numeração" mostra a você os passos necessários para converter valores entre os sistemas decimais, binário, octal e hexadecimal. Fique à vontade
para consultar este apêndice caso a explicação que faremos a seguir se torne um pouco confusa neste estágio do estudo. Inicialmente tomemos o valor 100 no sistema de numeração decimal. Convertendo este valor para o sistema de numeração binário temos 1100100. Suponha que decidíssemos armazenar este valor em uma variável do tipo sbyte (com sinal). Ora, como sabemos que este tipo de dados ocupa 8 bits, ou seja, 1 byte de memória, teríamos o cenário reproduzido na figura seguinte:
Lembre-se do cálculo: 64 + 32 + 4 = 100. Como podemos ver na figura, o bit mais significativo (na cor cinza) deste byte é usado para sinalizar se o valor é positivo ou negativo. Se o bit mais significativo for 0, valor é positivo. Se for 1, o valor é negativo. Então, como este bit tem essa função exclusiva para os tipos de dados sinalizados, resulta que teremos apenas 7 bits para armazenar os valores desejados. Assim, se tivermos todos estes 7 bits com valores 1 e apenas o bit mais significativo com o valor 0: 0111 1111
chegaremos à conclusão de que o valor máximo a ser armazenado é realmente 127 (64 + 32 + 16 + 8 + 4 + 2 + 1 = 127). Tomemos agora o tipo de dados byte (sem sinal). Como este tipo de dados só armazenará valores positivos, não há a necessidade de se usar o bit mais significativo como sinalizador. Em vez disso, ele é considerado parte dos bits de dados e voltamos novamente
a ter 8 bits à nossa disposição. Assim:
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 Com este cálculo provamos que o tipo byte pode realmente armazenar valores que variarão de 0 a 255. O mesmo cálculo pode ser usado para os outros tipos de dados. Experimente efetuar este processo com os tipos de dados short (aceita valores positivos e negativos) e ushort (aceita somente valores positivos). Voltemos nossa atenção agora para os tipos de dados capazes de armazenar números deponto-flutuante, ou seja, números que contêm partes fracionárias. C# fornece os tiposfloat e double. Veja suas características na tabela seguinte:
Tipo Faixa de Valores Precisão Tamanho
float 1.5x10-45 até 3.4x1038 7 dígitos 32 bits
double 5.0×10-324 até 1.7×10308 15-16 dígitos 64 bits
Para que você realmente entenda as faixas de valores e precisão dos tipos de dadosfloat e double, acrescentamos as seguintes observações: a) 1038 equivale a multiplicar o valor 10 por ele mesmo 37 vezes. O resultado será o numero 1 seguido de 38 zeros. 10-45 equivale a dividir o valor 10 por ele mesmo 44 vezes. O resultado será uma vírgula seguida pelo numero 1 precedido de 44 zeros. b) A precisão de um tipo de dados é a quantidade de dígitos que poderão ser representados como casas decimais, ou seja, a quantidade de dígitos significativos após a vírgula. Se o calculo
realizado exceder a quantidade de dígitos permitidos após a vírgula, haverá arredondamento para o inteiro mais próximo. Use o tipo de dados double quando você estiver realizando cálculos que exigem um pouco mais de precisão no tocante às casas decimais. O tipo de dados float é usado quando um possível arredondamento não trará resultados indesejados ao resultado final. Existe, no entanto, uma opção quando o cálculo exige uma precisão levada ao extremo, por exemplo, em aplicações financeiras. Para estes cálculos o C# nos fornece o tipo de dados decimal. Veja suas características na tabela seguinte:
Tipo Faixa de Valores Precisão Tamanho
decimal 1.0x10-28 até 7.9x1028 28 dígitos 128 bits
Os tipos de dados char, string e referência Na tabela dos tipos integrais (tipos que não suportam partes fracionárias) tivemos a inclusão do tipo de dados char. A inclusão deste tipo na tabela citada se dá por questões acadêmicas. Na verdade, se você tentar atribuir um valor numérico a um char, como no exemplo seguinte: char letra = 45;
você obterá, em tempo de compilação, a seguinte mensagem de erro: Char.cs(7,18): error CS0031: Constant value '45' cannot be converted to a 'char'
Esta mensagem nos diz que o valor 45 não pode ser convertido para um char. Uma alternativa é efetuar uma conversão explicita de dados usando um artifício conhecido como casting (e que será estudado mais adiante). Veja uma nova versão do exemplo anterior:
char letra = (char) 71;
Ao executar esta linha de código o valor 71 é convertido para o caractere Unicode correspondente e ele é atribuído à variável letra. Para que você veja o resultado, considere a listagem seguinte: using System; class Caractere {
static void Main()
{
char letra = (char) 71;
Console.WriteLine("A letra é: {0}", letra);
}
} Este código está disponível no arquivo Char.cs. Compile-o e, ao executa-lo você terá o seguinte resultado: A letra é: G
Caracteres em C# ocupam 16 bits (2 bytes). Isso quer dizer que seus programas poderão exibir caracteres cujos códigos variarão de 0 até 65.535, ou seja, os caracteres e símbolos da maioria das linguagens já conhecidas. O apêndice B "Conjunto de Caracteres ASCII" servirá como referência quando você precisar consultar o código decimal que representa um determinado caractere. O tipo de dados char é usado quando precisamos trabalhar com texto de forma separada, ou seja, um caractere por vez. Quando dois ou mais caracteres precisam ser representados, entra em cena um tipo de dados comum a quase todos os aplicativos já desenvolvidos. Este tipo de dados se chama string.
O tipo de dados string é um tipo de referência, ou seja, todas as vezes que uma variável deste tipo é declarada em seus programas, o que temos na verdade é uma referência a um objeto que encapsula um conjunto de caracteres. Mas, como objetos serão vistos mais adiante, vamos apenas escrever um exemplo que demonstra seu uso. Considere a listagem seguinte: using System;
class Leitura
{
static void Main()
{
string nome;
Console.WriteLine("Digite seu nome:");
nome = Console.ReadLine();
Console.WriteLine("Seu nome é: {0}", nome);
}
}
Compile este código e experimente executa-lo. Você verá uma mensagem solicitando que digite seu nome. Ao digitar seu nome e pressionar Enter uma nova mensagem confirma o valor informado. Vamos ver como isso aconteceu.
O primeiro passo foi declarar uma variável do tipo string: string nome;
Em seguida temos uma chamada ao método WriteLine da classe Console para exibir a mensagem que sugere a digitação do nome:
Console.WriteLine("Digite seu nome:");
O próximo passo é obter o valor que foi digitado. Isso é feito com o método ReadLine da classe Console, que atribui à variável nome, todo o conteúdo digitado pelo usuário antes de pressionar a tecla Enter: nome = Console.ReadLine();
Para finalizar exibimos o resultado: Console.WriteLine("Seu nome é: {0}", nome);
C# não aplica restrições à quantidade de caracteres que podem estar contidos em uma string. A documentação oficial nos informa que esta quantidade pode variar de 0 à 2 bilhões de caracteres
Unicode. Se sabemos que cada caractere ocupa 16 bits (2 bytes), então podemos afirmar que
nossas strings poderão ser tão longas quanto a memória principal disponível suportar. Antes de prosseguirmos tenha em mente que string é um tipo de dados referência a objetos. Outros tipos de referência são object, class, interface e delegate. Estes tipos serão apresentados mais adiante.
Entendendo o tipo de dados bool O tipo de dados bool é usado quando queremos atribuir apenas os valores true ou falsea uma variável. Uma contração da palavra boolean (presente em muitas linguagens), este tipo ocupa apenas um bit de memória e seu uso pode ser exemplificado na listagem seguinte: using System;
class Boolean
{
static void Main()
{
bool aprovado = true;
Console.WriteLine("Foi aprovado: {0}", aprovado);
}
}
Este código está disponível no arquivo Boolean.cs. Ao executá-lo temos o seguinte resultado: Foi aprovado: True
Experimente alterar o valor da variável aprovado para false e veja o resultado.
Literais Este tópico aborda literais e a importância de se entender e usar corretamente este recurso, presente em praticamente todas as linguagens de programação. Cabe, no entanto, uma observação. Você não precisa, obrigatoriamente, ler o conteúdo deste tópico antes de prosseguir com o estudo das demais partes. Mas, caso o faça, é importante escrever e compilar alguns exemplos a fim de entender o funcionamento de cada literal apresentado e observar o comportamento do compilador C# em algumas situações que passariam despercebidas aos olhos dos iniciantes em programação.
Um literal é um valor que definimos quando escrevemos nosso código, ou seja, é o oposto de um valor que poderia ser calculado e atribuído a uma variável em tempo de execução. Desta forma, estivemos usando literais na maioria dos exemplos apresentados até este momento. Observe o seguinte trecho de código:
bool aprovado = true;
Aqui true é um literal do tipo bool (boolean) sendo atribuído à variável aprovado. Outro exemplo
de literal poderia ser um literal string, mostrado a seguir: string site;
site = "Arquivo de Códigos";
Lembre-se de que um literal string pode conter seqüências de escape (ilustradas mais adiante neste tópico). Desta forma, podemos causar uma quebra de linha em uma string de forma bem fácil. Veja um exemplo:
string frase = "Número 1\nNúmero 2";
A saída deste exemplo será: Número 1
Número 2
Como podemos ver, uma quebra é causada pela inserção da seqüência "\n" no ponto onde desejamos que a quebra de linha ocorra.
Quando falamos de literais do tipo boolean e string, tudo é muito simples e sob controle. A atenção deve ser redobrada quando estamos lidando com literais integrais e deponto-flutuante. Comecemos com os literais integrais. Primeiramente veja o que acontece quando tentamos atribuir um valor maior que aquele permitido a um determinado tipo de dados: byte valor = 400;
Ora, como sabemos que o máximo valor que pode ser armazenado em uma variável do tipo byte é 255, é de se esperar que esta definição fosse rejeitada pelo compilador, uma vez que o literal 400 é no mínimo do tipo short. E é isso que acontece. Veja a mensagem de erro de compilação que
nos é exibida: Numero.cs(7,18): error CS0031: Constant value '400' cannot be converted to a 'byte'
Existem algumas regras bem fáceis de serem entendidas quando estamos lidando com literais integrais. Vamos a elas: 1) Literais integrais podem ser definidos em dois tipos de sistemas de numeração: decimal e hexadecimal. Para definir um literal integral em hexadecimal, seu valor deverá ser precedido pela seqüência "0x". Veja um exemplo:
int valor = 0x43;
Ao exibirmos o valor da variável usando a forma que já conhecemos, veremos que o valor exibido é 67, ou seja, o valor hexadecimal é convertido para decimal antes de ser exibido. Nos próximos capítulos você aprenderá como exibir valores de variáveis em hexadecimal usando as opções de formatação de string. 2) Se o valor do literal for maior que aquele suportado pelo tipo de dados da variável a qual este valor será atribuído, um erro de compilação ocorrerá. O maior valor definido para um literal
integral não poderá ser superior ao maior valor suportado pelo tipoulong. 3) Se o literal não possui sufixo, ele será do primeiro tipo que suportar seu valor, seguindo a ordem: int, uint, long, ulong. 4) Se o literal possui o sufixo U ou u, ele será do primeiro tipo que suportar seu valor, seguindo a ordem: uint, ulong. Lembre-se de que os sufixos U ou u são usados para definir um literal integral sem sinal. Veja um exemplo: uint valor = 143U;
5) Se o literal possui o sufixo L ou l (letra "L" minúscula), ele será do primeiro tipo que suportar seu valor, seguindo a ordem: long, ulong. Para facilitar a leitura do sufixo, encorajamos o uso apenas do sufixo L (a letra "L" minúscula se parece muito com o numero 1). Veja um exemplo deste tipo de literal: long valor = 623465L;
6) Se um literal possui os sufixos UL, Ul, uL, ul, LU, Lu, lU ou lu, ele será do tipo ulong.
Por ora você não encontrará nenhuma aplicação prática dos conceitos apresentados nesta parte do texto. Porém, procure, sempre que puder rever estas anotações. Elas serão muito úteis durante o seu desenvolvimento. Veja agora uma das situações clássicas de erro de compilação envolvendo literais. Observe o trecho de código a seguir: float valor = 6.2;
A primeira vista esta definição está correta. Temos um literal de ponto flutuante sendo atribuído a uma variável do tipo float. Porém, ao tentarmos a compilação obtemos a seguinte mensagem de
erro: Valores.cs(7,19): error CS0664: Literal of type double cannot be implicitly
converted to type 'float'; use an 'F' suffix to create a literal of this type
Esta mensagem de erro nos avisa que um literal do tipo double não pode ser implicitamente convertido para o tipo float. E sugere que usemos o sufixo F após o valor do integral. Façamos isso então:
float valor = 6.2F;
Ao tentar compilar o código novamente vemos que a mensagem de erro se foi. Desta experiência concluímos que: 1) Se o literal de ponto-flutuante não possuir sufixo, ou possuir os sufixos D ou d, ele será do tipo double. 2) Se o literal possuir os sufixos F ou f, ele será do tipo float. 3) Se o literal possuir os sufixos M ou m, ele será do tipo decimal.
De posse desta informação, nem precisamos de muito esforço para saber que o trecho de código: decimal valor = 40.5;
resultará em um erro de compilação, mesmo sabendo que uma variável do tipo decimalpode perfeitamente acomodar o valor de um literal do tipo double. Literais do tipo char podem ser definidos usando-se aspas simples em torno do caractere desejado. Veja um exemplo: char letra = 'A';
Outra forma de fornecer um valor a um literal char é usar valores inteiros na faixa que vai de 0 até 65.535 (lembre-se de que o tipo char ocupa 16 bits na memória e não possui sinal). Veja um exemplo: char letra = (char ) 104;
Esta técnica foi exemplifica no tópico "Os tipos de dados char, string e referência". Existe, no entanto, uma outra forma de atribuir valores a um literal char. Esta forma não é tão freqüente e consiste em atribuir ao literal o caractere desejado usando-se um valor hexadecimal que representa o valor Unicode do caractere. Este valor deverá ser precedido por "\n". Veja um exemplo: char letra = '\u0067';
Aqui o literal letra conterá a letra "g". O apêndice A "Sistemas de Numeração" mostrará a você como converter entre os sistemas de numeração decimais e hexadecimais.
Para finalizar vamos analisar as seqüências de escape disponíveis na linguagem C#. Veja a tabela a seguir:
Sequencia Nome do Caractere Valor Unicode
\' Aspas Simples 0x0027
\" Aspas Duplas 0x0022
\\ Barra Invertida 0x005C
\b Retrocesso 0x0008
\f Avanço de Página 0x000C
\n Nova Linha 0x000A
\r Voltar 0x000D
\t Tabulação Horizontal 0x0009
\v Tabulação Vertical 0x000B
Esta tabela de seqüências de escape tem sua importância compreendida quando precisamos exibir frases que contém aspas simples ou duplas. Por exemplo, se quiséssemos exibir a seguinte frase: Então ela falou: "Estou muito cansada"
A maneira usual seria escrever um trecho de código assim: string frase = "Então ela falou: "Estou muito cansada"";
Porém, ao tentarmos executar tal código temos uma mensagem de erro semelhante à mostrada a
seguir:
testes.cs(7,39): error CS1002: ; expected
testes.cs(7,51): error CS1002: ; expected
testes.cs(7,58): error CS1002: ; expected
Esta mensagem de erro não ajuda em nada. Mas, já sabemos o que fazer. Basta "escapar" as aspas internas. Veja como o código deve ser escrito:
string frase = "Então ela falou: \"Estou muito cansada\"";
Como usar corretamente o método Main com ou sem argumentos Todo programa C# tem um ponto de entrada, que é um método Main definido na classe principal, ou seja, a classe responsável por controlar o fluxo de execução do programa. Em todos os exemplos que escrevemos até este momento, vimos o método Main com a seguinte assinatura:
static void Main()
{
// mais linhas de código aqui
}
A palavra static é um modificador que pode ser usado com classes, métodos, variáveis, etc, e será abordado mais adiante. Apenas para que você não siga desinformado, saiba que um método definido com este modificador pode ser acessado sem que uma instância da classe na qual o método foi definido precise ser criada. A palavra void é usada para indicar que o método não retorna nenhum valor após a sua execução. Como você aprenderá mais adiante, métodos podem retornar todos os tipos de dados que estudamos, incluindo referencias a tipos de dados definidos pelo usuário. É comum em C# uma assinatura do método Main que retorna um inteiro. Veja um exemplo: using System;
class VoidPorInt
{
static int Main()
{
Console.WriteLine("Trocando void por int");
return 0;
}
}
Este código está disponível no arquivo VoidPorInt.cs. Veja que agora o método Mainretorna um valor inteiro. Observe também o uso da instrução return como ultima linha a ser executada. Em C e C++, ao retornarmos o valor 0 para o sistema operacional estamos informando-o que a execução e encerramento do programa ocorreu sem maiores problemas. Experimente agora
substituir int por void novamente. Ao tentar compilar o código você verá a seguinte mensagem de erro: VoidPorInt.cs(9,5): error CS0127: Since 'VoidPorInt.Main()' returns void, a return
keyword must not be followed by an object expression
Esta mensagem nos diz que, uma vez que o metodo Main está retornando void (nada), a palavra-chave return não deve ser seguida por uma expressão. Troque:
return 0;
por return;
e compile o código novamente. Você verá que agora a mensagem de erro não é exibida. Esta
experiência nos mostra que, quando um método define void como seu tipo de retorno, o compilador fará o possível para que esta regra seja obedecida. É possível usar o método Main para fornecer valores ao programa via linha de comando. Para tanto você deve usar a seguinte assinatura:
static void Main(string[] args)
{
// mais código aqui
}
Aqui nos temos um parâmetro para o método Main. Este parâmetro é um array do tipo string.
Arrays são estruturas de dados que consistem em itens de dados relacionados do mesmo tipo e indexados com valores inteiros maiores ou igual a 0. Os valores fornecidos na linha de comando são separados por espaços e acessados usando-se args[0], args[1], args[2] e assim por diante. Veja um exemplo onde o usuário informa seu primeiro nome e idade na linha de comando do programa: using System;
class LinhaComando
{
static void Main(string[] args)
{
Console.WriteLine("Seu primeiro nome é {0} e você
tem {1} anos", args[0], args[1]);
}
}
Este código está disponível no arquivo LinhaComando.cs. Após sua compilação experimente executa-lo usando os seguintes argumentos: LinhaComando Augusto 21
Você obterá o seguinte resultado: Seu nome é Augusto e você tem 21 anos
Experimente informar seu nome completo e a idade na linha de comando. Poderia ser algo assim: LinhaComando Augusto Santos de Souza 21
Após a execução você concordará comigo que o resultado não foi o que esperávamos. Mas pode ser contornado. Basta informar o nome completo entre aspas duplas. Assim:
LinhaComando "Augusto Santos de Souza" 21
Arrays e as técnicas usadas para evitar erros em tempo de execução, como aquele causado quando você tentar executar estes exemplos recentes sem fornecer valores na linha de comando, serão estudados mais adiante.
Introdução às interfaces gráficas do C# Até este ponto de nosso estudo, todos os resultados da execução de nossos exemplos foram exibidos no console, em modo texto. Acreditamos que este seja o momento adequado para fazermos uma introdução às capacidades gráficas do C#. O próximo programa mostrará a você como fazer uso da classe MessageBox (que está sob o namespace System.Windows.Forms) para exibir mensagens mais amigáveis em seus programas. Considere a listagem a seguir: using System.Windows.Forms;
class Mensagem
{
static void Main(string[] args)
{
string frase = "Este é um exemplo do uso da
classe MessageBox";
MessageBox.Show(frase, "Meu Aplicativo");
}
}
Este código está disponível no arquivo Mensagem.cs. Compile-o e experimente executá-lo. Você a seguinte caixa de mensagem:
O método Show da classe MessageBox possui uma grande variedade de parâmetros. Para este exemplo escolhemos os parâmetros que permitem definir os textos para a mensagem e para o título da caixa de mensagem: MessageBox.Show(string text, string caption)
Como exercício recomendamos que você investigue os demais parâmetros deste método na documentação da plataforma .NET.
Dicas & Truques C# static void Main(string[] args)
{
// cria e inicializa um array de strings
string[] cidades = {"Goiânia", "São Paulo",
"Rio de Janeiro", "Curitiba"};
Console.WriteLine("Ordem original:");
for (int i = 0; i < cidades.Length; i++)
Console.WriteLine(cidades[i]);
StringComparer ordenar = StringComparer.CurrentCultureIgnoreCase;
Array.Sort(cidades, ordenar);
Console.WriteLine();
Console.WriteLine("Ordem alfabética:");
for (int i = 0; i < cidades.Length; i++)
Console.WriteLine(cidades[i]);
// pausa o programa
Console.ReadKey();
}
Palavras-chaves: de, o, =, ordenar, ; , args, alfabética, original, e, int, strings , , WriteLine, Sort, programa , Paulo", pausa, , cria, <, inicializa, Console, Main, ; , ", 0;, cidades, StringComparer, Array, ReadKey, "Ordem, CurrentCultureIgnoreCase; , void, "Rio, "Goiânia", Length;, i++, array, i, "São, "Curitiba", string, Janeiro",
um, for, static
Como criar, atribuir valores e percorrer um array de duas dimensões em
C#
static void Main(string[] args)
{
// cria um array de duas dimensões: 4 linhas
// e duas colunas
int[,] matriz = new int[4, 2];
// atribui o valor 15 para a célula na
// primeira linha e primeira coluna
matriz[0, 0] = 15;
// atribui o valor 30 para a célula na
// quarta linha e segunda coluna
matriz[3, 1] = 30;
// imprime a matriz
for (int i = 0; i <= matriz.GetUpperBound(0); i++)
{
for (int y = 0; y <= matriz.GetUpperBound(1); y++)
{
Console.Write(matriz[i, y] + " ");
}
Console.WriteLine();
}
// pausa o programa
Console.ReadKey();
}
Palavras-chaves: imprime, na , programa , 30; , +, Write, ; , pausa, primeira, quarta, args, 15; , 2, int, o, um, array, linhas , duas, e, i++, 1, 0, coluna , matriz, , 15, i, ; , valor, para, 4, ;, GetUpperBound, linha, <=, , WriteLine, Main, string, colunas , a, new, , de, 0;, ", segunda, 30, matriz , atribui, y++, static, dimensões, void, =, for, cria, ReadKey, y, 3, Console, célula
Como escrever um método C# que retorna um array (matriz)
Em algumas situações precisamos escrever um método C# que retorna uma matriz. Esta dica mostra como isso pode ser feito:
static void Main(string[] args){
// vamos obter um array do método abaixo
int[] valores = obterValores();
// vamos imprimir o conteúdo do array obtido
for(int i = 0; i < valores.Length; i++){
System.Console.WriteLine(valores[i]);
}
// pausa o programa
System.Console.Write("\nPressione qualquer tecla para sair...");
Console.ReadKey();
}
static int[] obterValores(){
// vamos criar um array de cinco inteiros
int[] matriz = {1, 2, 3, 4, 5};
// vamos retornar este array para o chamador deste método
return matriz;
}
Palavras-chaves: args, , 5, algumas, ", este, 1, 4, Como, criar, int, programa , static, cinco, pode, Main, Em, de, precisamos, , tecla, matriz, ; , para, matriz; , return, do, que, isso, 2, abaixo , obtido , array, Length;, método , obter, <, imprimir, como, escrever, deste, retorna, pausa, sair, chamador, mostra, 3, uma, =, Esta, retornar, 0;, ; , ReadKey, o, static, for, obterValores, qualquer, void, feito, i, System, inteiros , string, vamos, > , um, Write, ser, situações, i++, C#, valores, método, Pressione, WriteLine, >
Como inverter a ordem dos elementos de um array static void Main(string[] args)
{
// cria e inicializa um array de strings
string[] cidades = {"Goiânia", "São Paulo",
"Rio de Janeiro", "Curitiba"};
Console.WriteLine("Ordem original:");
for (int i = 0; i < cidades.Length; i++)
Console.WriteLine(cidades[i]);
// inverte a ordem dos elementos
Array.Reverse(cidades);
// exibe os elementos na ordem inversa
Console.WriteLine();
Console.WriteLine("Ordem inversa:");
for (int i = 0; i < cidades.Length; i++)
Console.WriteLine(cidades[i]);
// pausa o programa
Console.ReadKey();
}
Palavras-chaves: <, =, static, Main, Janeiro", inversa , programa , elementos , for, , Paulo", dos, Console, inversa, a, Length;, array, na, string, ; , os, "Curitiba", exibe, strings , um, o, args, inicializa, "Goiânia", elementos, i, "São, ", original, Reverse, "Ordem, "Rio, inverte, i++, cidades, ordem, ReadKey, cria, e, , void, pausa,
Array, 0;, de, ; , WriteLine, int
Aprenda a declarar e usar variáveis em C#
Aprenda a declarar e usar variáveis em C# Variáveis são apelidos que damos aos blocos de memória que podem ser usados para armazenar dados durante a execução de um programa. Podemos guardar informações dos mais variados tipos em variáveis, a saber: valores inteiros, valores de número flutuante (com casas decimais), palavras, frases, textos e até mesmo referências a objetos de classes (fornecidas pela linguagem C# ou nossas próprias). Uma variável é declarada, em sua forma mais simples, informando o tipo de dados (int, float, double, string, etc) e então o nome da variável. Veja: // uma variável usado para armazenar um valor inteiro
int valor;
Uma vez declarada a variável, podemos definir o valor que será armazenado inicialmente. Isso é chamado de "atribuir um valor inicial à variável". Veja: static void Main(string[] args){
// declara e inicializa uma variável do tipo double
double salario = 2345.32;
// exibe o valor da variável
Console.WriteLine("Salário: {0}", salario);
Console.WriteLine("\n\nPressione uma tecla para sair...");
Console.ReadKey();
}
É possível declarar mais de uma variável do mesmo tipo. Basta separá-las por vírgulas. Veja: // declara três variáveis do tipo char
char a, b, c;
Variáveis são realmente úteis quando as estamos usando em cálculos ou outras operações importantes para o correto funcionamento do programa. Veja: static void Main(string[] args){
// declara três variáveis do tipo int
int a, b, soma;
// inicializa as duas primeiras variáveis
a = 20;
b = 10;
// inicializa a terceira variável usando os valores
// das duas anteriores
soma = a + b;
// exibe o resultado
Console.WriteLine("Resultado: {0}", soma);
Console.WriteLine("\n\nPressione uma tecla para sair...");
Console.ReadKey();
}
Para finalizar, lembre-se de uma variável C# possui atributos importantes e que devem ser lembrados com frequencia durante o planejamento de suas aplicações. Alguns destes atributos são: tipo, nome, valor, posição na memória, escopo (global ou local) e visibilidade (pública ou privada).
Palavras-chaves: int , planejamento, cálculos, damos, das, quando, sair, b; , ; , na, , finalizar, dados, visibilidade, b, número, inicialmente, saber, palavras, local, atributos, informando, as, operações, guardar, e, declarar, c; , da, aos, estamos, durante, realmente, variável , dos, importantes, salario, variados, Variáveis, lembrados, valor; , com, usar, Basta, Isso, flutuante, "Resultado, definir, etc, variável, Aprenda, apelidos, primeiras, separá-las, , possui, variáveis , inteiros, vírgulas, vez, um, posição, ", será, fornecidas, ReadKey, valores, double, programa, nome, tecla, sua, Para, usados, Veja, resultado , valores , soma; , aplicações, WriteLine, blocos, char char, 20; , float, outras, informações, "atribuir, casas, 0, valor, Console, double , lembre-se, É, inicializa, mesmo, declarada, por, anteriores , três, tipo, args, de, duas, referências, Main, frequencia, exibe, simples, linguagem, o, decimais, podem, declara, então, Uma, devem, tipos, global, a, uma, inicial, é, à, execução, nossas, ou, escopo, , que, soma, static, int, mais, Pressione, forma, até, os, próprias,
Podemos, suas, do, pública, 10; , 2345, objetos, chamado, +, void, memória, inteiro int, privada, podemos, variáveis, classes, ser, úteis, pela, destes, correto, variável", armazenar, funcionamento, em, terceira, frases, C#, para, textos, ; , usado, "Salário, Alguns, string, são, =, possível, armazenado, 32; , usando
Comandos básico GNU_Linux
Comandos de Controlo e Acesso
exit Terminar a sessão, ou seja, a shell (mais ajuda digitando man sh ou man csh)
logout Deslogar, ou seja, terminar a sessão actual, mas apenas na C shell e na bash shell
passwd Mudar a password do nosso utilizador
rlogin Logar de forma segura noutro sistema Unix/Linux
ssh Sessão segura, vem de secure shell, e permite-nos logar num servidor através do protocolo ssh
slogin Versão segura do rlogin
yppasswd Mudar a password do nosso utilizador nas páginas amarelas (yellow pages)
Comandos de Comunicações
mail Enviar e receber emails
mesg Permitir ou negar mensagens de terminal e
pedidos de conversação (talk requests)
pine Outra forma de enviar e receber emails, uma
ferramenta rápida e prática
talk Falar com outros utilizadores que estejam logados
no momento
write Escrever para outros utilizadores que estejam
logados no momento
Comandos de Ajuda e Documentação
apropos Localiza comandos por pesquisa de palavra-chave
find Localizar ficheiros, como por exemplo: find . -
name *.txt -print, para pesquisa de ficheiros de
texto por entre os ficheiros da directoria actual
info Lança o explorador de informações
man Manual muito completo, pesquisa informação
acerca de todos os comandos que necessitemos
de saber, como por exemplo man find
whatis Descreve o que um determinado comando é
whereis Localizar a página de ajuda (man page), código
fonte, ou ficheiros binários, de um determinado
programa
Comandos de Edição de Texto
emacs Editor de texto screen-oriented
pico Editor de texto screen-oriented, também chamado
de nano
sed Editor de texto stream-oriented
vi Editor de texto full-screen
vim Editor de texto full-screen melhorado (vi
improved)
Comandos de Gestão de Ficheiros e Directorias
cd Mudar de directoria actual, como por exemplo cd
directoria, cd .., cd /
chmod Mudar a protecção de um ficheiro ou directoria,
como por exemplo chmod 777, parecido com
oattrib do MS-DOS
chown Mudar o dono ou grupo de um ficheiro ou
directoria, vem de change owner
chgrp Mudar o grupo de um ficheiro ou directoria
cmp Compara dois ficheiros
comm Selecciona ou rejeita linhas comuns a dois
ficheiros seleccionados
cp Copia ficheiros, como o copy do MS-DOS
crypt Encripta ou Desencripta ficheiros (apenas CCWF)
diff Compara o conteúdo de dois ficheiros ASCII
file Determina o tipo de ficheiro
grep Procura um ficheiro por um padrão, sendo um
filtro muito útil e usado, por exemplo um cat a.txt
| grep ola irá mostrar-nos apenas as linhas do
ficheiro a.txt que contenham a palavra “ola”
gzip Comprime ou expande ficheiros
ln Cria um link a um ficheiro
ls Lista o conteúdo de uma directoria, semelhante ao
comando dir no MS-DOS
lsof Lista os ficheiros abertos, vem de list open files
mkdir Cria uma directoria, vem de make directory”
mv Move ou renomeia ficheiros ou directorias
pwd Mostra-nos o caminho por inteiro da directoria em
que nos encontramos em dado momento, ou seja
apathname
quota Mostra-nos o uso do disco e os limites
rm Apaga ficheiros, vem de remove, e é semelhante
ao comando del no MS-DOS, é preciso ter cuidado
com o comando rm * pois apaga tudo sem
confirmação por defeito
rmdir Apaga directorias, vem de remove directory
stat Mostra o estado de um ficheiro, útil para saber por
exemplo a hora e data do último acesso ao
mesmo
sync Faz um flush aos buffers do sistema de ficheiros,
sincroniza os dados no disco com a memória, ou
seja escreve todos os dados presentes
nos buffersda memória para o disco
sort Ordena, une ou compara texto, podendo ser
usado para extrair informações dos ficheiros de
texto ou mesmo para ordenar dados de outros
comandos como por exemplo listar ficheiros
ordenados pelo nome
tar Cria ou extrai arquivos, muito usado como
programa de backup ou compressão de ficheiros
tee Copia o input para um standard output e outros
ficheiros
tr Traduz caracteres
umask Muda as protecções de ficheiros por defeito
uncompress Restaura um ficheiro comprimido
uniq Reporta ou apaga linhas repetidas num ficheiro
wc Conta linhas, palavras e mesmo caracteres num
ficheiro
Exibição ou Impressão de Ficheiros
cat Mostra o conteúdo de um ficheiro, como o
comando type do MD-DOS, e é muito usado
também para concatenar ficheiros, como por
exemplo fazendo cat a.txt b.txt > c.txt” para
juntar o ficheiro a.txt e b.txt num único de nome
c.txt
fold Encurta, ou seja, faz um fold das linhas longas
para caberem no dispositivo de output
head Mostra as primeiras linhas de um ficheiro, como
por exemplo com head -10 a.txt, ou usado como
filtro para mostrar apenas os
primeiros x resultados de outro comando
lpq Examina a spooling queue da impressora
lpr Imprime um ficheiro
lprm Remove jobs da spooling queue da impressora
more Mostra o conteúdo de um ficheiro, mas apenas um
ecrã de cada vez, ou mesmo output de outros
comandos, como por exemplo ls | more
less Funciona como o more, mas com menos features,
menos características e potenciais usos
page Funciona de forma parecida com o comando more,
mas exibe os ecrãs de forma invertida ao
comandomore
pr Pagina um ficheiro para posterior impressão
tail Funciona de forma inversa ao comando head,
mostra-nos as últimas linhas de um ficheiro ou
mesmo do output de outro comando, quando
usado como filtro
zcat Mostra-nos um ficheiro comprimido
xv Serve para exibir, imprimir ou mesmo manipular
imagens
gv Exibe ficheiros ps e pdf
xpdf Exibe ficheiros pdf, usa o gv
Comandos de Transferência de Ficheiros
ftp Vem de file transfer protocol, e permite-nos,
usando o protocolo de transferência de
ficheirosftp, transferir ficheiros entre
vários hosts de uma rede, como aceder a um
servidor de ftp para enviar ou puxar ficheiros
rsync Sincroniza de forma rápida e flexível dados entre
dois computadores
scp Versão segura do rcp
Comandos de Notícias ou Rede
netstat Mostra o estado da rede
rsh Corre umam shell em outros sistemas UNIX
ssh Versão segura do rsh
nmap Poderoso port-scan, para visualizarmos portas
abertas num dado host
ifconfig Visualizar os ips da nossa máquina, entre outras
funções relacionadas com ips
ping Pingar um determinado host, ou seja, enviar
pacotes icmp para um determinado host e medir
tempos de resposta, entre outras coisas
Comandos de Controlo de Processos
kill Mata um processo, como por exemplo kill -kill
100ou kill -9 100 ou kill -9 %1
bg Coloca um processo suspenso em background
fg Ao contrário do comando bg, o fg traz de volta um
processo ao foreground
jobs Permite-nos visualizar jobs em execução, quando
corremos uma aplicação em background,
poderemos ver esse job com este comando, e
termina-lo com um comando kill -9 %1, se for
o jobnúmero 1, por exemplo
top Lista os processos que mais cpu usam, útil para
verificar que processos estão a provocar um uso
excessivo de memória, e quanta percentagem
decpu cada um usa em dado momento
^y Suspende o processo no próximo pedido de input
^z Suspende o processo actual
Comandos de Informação de Estado
clock Define a hora do processador
date Exibe a data e hora
df Exibe um resumo do espaço livre em disco
du Exibe um resumo do uso do espaço em disco
env Exibe as variáveis de ambiente
finger Pesquisa informações de utilizadores
history Lista os últimos comandos usados, muito útil para
lembrar também de que comandos foram usados
para fazer determinada acção no passado ou o
que foi feito em dada altura
last Indica o último login de utilizadores
lpq Examina a spool queue
manpath Mostra a path de procura para as páginas do
comando man
printenv Imprime as variáveis de ambiente
ps Lista a lista de processos em execução, útil para
saber o pid de um processo para o mandar abaixo
com o comando kill, entre outras coisas
pwd Mostra-nos o caminho por inteiro da directoria em
que nos encontramos em dado momento, ou seja
apathname
set Define variáveis da sessão, ou seja, da shell, na C
shell, na bash ou na ksh
spend Lista os custos ACITS UNIX até à data
time Mede o tempo de execução de programas
uptime Diz-nos há quanto tempo o sistema está
funcional, quando foi ligado e o seu uptime
w Mostra-nos quem está no sistema ou que
comando cada job está a executar
who Mostra-nos quem está logado no sistema
whois Serviço de directório de domínios da Internet,
permite-nos saber informações sobre
determinados domínios na Internet, quando um
domínio foi registado, quando expira, etc
whoami Diz-nos quem é o dono da shell
Comandos de Processamento de Texto
abiword Processador de Texto Open Source
addbib Cria ou modifica bases de dados bibliográficas
col Reverte o filtro a line feeds
diction Identifica sentenças com palavras
diffmk Marca diferenças entre ficheiros
dvips Converte ficheiros TeX DVI em ficheiros PostScript
explain Explica frases encontradas pelo programa diction
grap Preprocessador pic para desenhar gráficos, usado
em tarefas elementares de análises de dados
hyphen Encontra palavras com hífenes
ispell Verifica a ortografia de forma interactiva
latex Formata texto em LaTeX, que é baseado no TeX
pdfelatex Para documentos LaTeX em formato pdf
latex2html Converter LaTeX para html
lookbib Encontra referências bibliográficas
macref Cria uma referência cruzada listando ficheiros de
macros nroff/troff
ndx Cria uma página de indexação para um
documento
neqn Formata matemáticas com nroff
nroff Formata texto para exibição simples
pic Produz simples imagens para troff input
psdit Filtra um output troff para a Apple LaserWriter
ptx Cria uma indexação permutada mas não em CCWF
refer Insere referências de bases de dados
bibliográficas
roffbib Faz o run off de uma base de dados bibliográfica
sortbib Ordena uma base de dados bibliográfica
spell Encontra erros de ortografia
style Analisa as características superficiais de um
documento
tbl Formata tabelas para nroff/troff
tex Formata texto
tpic Converte ficheiros pic source em comandos TeX
wget Permite-nos fazer o download completo de
páginas web, com todos os ficheiros, de forma
fácil e não interactiva, sem exigir por isso
presença do utilizador, respeitando também o
ficheirorobots.txt
Web
html2ps Conversor de html para ps
latex2html Conversor de LaTeX para html
lynx Navegador web baseado em modo de texto, ou
seja, é um web browser que nos permite abrir
todo o tipo de páginas visualizando apenas os
textos elinks, não vendo assim as imagens, e
sendo por isso bastante rápido, mas requere
prática para ser manuseado
netscape Navegador web da Netscape
sitecopy Aplicação que nos permite manter facil e
remotamente web sites
weblint Verificador de sintaxes e de estilos html