Apostila Qbasic
Índice
1. Iniciando o Qbasic
O Qbasic é uma linguagem universal
simbólica de instruções codificadas de fácil aprendizado para iniciantes de
programação, isso por que o Qbasic exige uma mentalidade lógica do programador,
pois o programador trabalha com muita lógica.
Os comandos da linguagem Qbasic são
aproximados do inglês, mas, mesmo assim, de fácil aprendizado e mais fácil ainda
de se trabalhar.
1.1 Variáveis
As variáveis possuem uma grande importância fundamental dentro de qualquer linguagem de programação. Elas armazenam os dados que vão para a memória do computador, e sempre referimos a elas, esses dados retornam da memória. E quando estão na memória, podemos fazer cálculos e executar determinadas funções.Para uma variável receber um conteúdo qualquer, é necessário anexar esse conteúdo ao nome que daremos para a variável. Exemplo:
Aluno = "José da Silva Xavier"
Note que usamos o sinal de igual para que o nome do aluno seja inserido na variável Aluno, que está na memória do computador e, sempre que nos referimos a Aluno, seria como se contesse "José da Silva Xavier".
Para darmos nomes as variáveis, temos que seguir algumas regras simples:
- Sempre iniciar com letras (A-Z,a-z). Não use números ou símbolos para iniciar o nome de uma variável.
- Pode-se usar até 40 caracteres para compor o nome da variável, então vamos colocar nomes bem claros, para que lendo o seu nome sabemos para que ela serve. Por Exemplo: NomeDeAlunoAplicado. Parece grande, mas só de ler já sabemos que é uma variável que irá armazenar o nome de uma aluno aplicado.
- Na composição do nome não se pode usar:
- Espaço em branco;
- Sinal de hífen;
- Símbolos como @^*()'" ;
- Acentos;
- Palavras acentuadas.
- Pode-se usar letras do alfabeto, números e o sublinhado.
- A última letra pode-se usar símbolos de tipo de variável :$ ! % # &
- Cuidado para não usar nomes reservados para a linguagem, como: If, End, System, etc.
1.2 Tipos de Variáveis
NOME | TIPO | SIMB. | BYTES | MIN. | MAX. | |
STRING | Cadeia de caracteres (texto) | $ | Tam. do texto | 0 | 32.767 | |
INTEGER | Número Inteiro | % | 2 | -32.768 | 32.767 | |
LONG | Número Inteiro Longo | & | 4 | -2.147.483.648 | 2.147.483.647 | |
SINGLE | Número de simples precisão (Real) | ! | 4 | 3,402823E+38 | 2,802597E-45 | |
-2,802597E-45 | -3,402823E+38 | |||||
DOUBLE | Número de precisão dupla (Real) | # | 8 | 1,79769313486231E+308 | 4,940656458412465E-324 | |
-4,940656458412465E-324 | -1,79769313486231E+308 |
1.3 Declarando Variáveis
O comando DIM é responsável pela declaração de variáveis. Ele reserva um espaço na memória para a variável. Por exemplo:DIM Numero AS INTEGER
ou
DIM Numero%
Obs.: Apesar que o QBasic não seja obrigatório a declaração de variáveis, É MUITO IMPORTANTE DECLARA-LAS.
Pode-se também usar matrizes, onde podemos armazenar vários dados em uma única variável. O que diferencia uma da outra é que esta possui vários níveis dentro de si, e em cada nível podemos armazenar dados. Veja um exemplo de uma declaração e iniciação:
DIM NomePersonagemGame(3) AS STRINGNão é preciso dizer que todos os elementos precisam ser do mesmo tipo do declarado.
NomePersonagemGame(0) = "Aeris"
NomePersonagemGame(1) = "Aya Brea"
NomePersonagemGame(2) = "Sonic"
Para acessar um determinado conteúdo, temos que especificar o número que fica junto da matriz, que é denominada de índice, e são eles que localizam os dados da matriz. Exemplo: PRINT NomePersonagemGame(1).
Existem Matrizes Unidimensionais (ou Vetor) e Matrizes Multidimensionais, que é uma matriz dentro da outra (por Ex.: Texto$(2,10))
1.4 Primeiros comandos
Exemplo:
PRINT "Meu primeiro programa em Qbasic"
Meu primeiro programa em Qbasic
Pressione qualquer tecla para continuar
|
Aqui outro exemplo usando para mostrar o conteúdo de uma variável:
DIM Mensagem AS STRING
DIM Numero AS INTEGER
Mensagem="O valor do Número é: "
Numero=4+4
PRINT Mensagem
PRINT Numero
Meu primeiro programa em Qbasic
O valor do Número é:
8
Pressione qualquer tecla para continuar
|
LOCATE 5,32: PRINT "Bom Dia"
Meu primeiro programa em Qbasic
O valor do Número é:
8
Bom Dia
Pressione qualquer tecla para continuar
|
- CLS
- INPUT
Sintaxe:
INPUT [;] ["aviso"{; | ,}] lista-variável
Aviso - Um texto opcional que é exibido antes do usuário digitar os dados. Um ponto-e-vírgula após o aviso anexa um ponto de interrogação ao texto.
lista-variável - Uma ou mais variáveis, separadas por vírgulas, onde são armazenados dados inseridos a partir do teclado.
* obs.: os comandos entre [] são opcionais.
Exemplo:
CLS
DIM A AS INTEGER
DIM Nome AS STRING * 10
INPUT "Digite um Número:", A
INPUT "Qual é o Seu Nome "; Nome
PRINT A
PRINT Nome
Digite um Número:10
Qual é o Seu Nome:
|
- SCREEN
Sintaxe:
SCREEN modo%
modo% - Define o modo de tela.
Adaptadores MDPA, CGA, Hercules, Olivetti,
EGA, VGA ou MCGA
|
SCREEN 0: Somente modo texto
|
Adaptadores CGA, EGA, VGA ou
MCGA
|
SCREEN 1: gráficos de 320 x 200
|
Adaptadores Hercules, Olivetti ou
AT&T
|
SCREEN 3: Adaptador Hercules requerido, somente
monitor monocromático
|
Adaptadores EGA ou
VGA
|
SCREEN 7: gráficos de 320 x 200
|
Adaptadores EGA ou VGA, Somente
Monitor Monocromático
|
SCREEN 10: gráficos de 640 x 350, somente monitor
monocromático
|
Adaptadores VGA ou
MCGA
|
SCREEN 11 (VGA ou MCGA)
|
'Este exemplo requer um adaptador gráfico colorido.
SCREEN 1 '320 x 200 gráficos
LINE (110, 70)-(190, 120), , B
LINE (0, 0)-(320, 200), 3, , &HFF00
- COLOR
Sintaxe:
COLOR [prim-plano%] [,[seg-plano%]
prim-plano% - Um número que define a cor de primeiro plano da tela.
seg-plano% - Um número que define a cor de segundo plano da tela.
Monitor Colorido | Monitor Monocromático | |||
Atributo de cor | Valor padrão cor (a) | Cor de exibição | Valor padrão cor | Exibição |
Modos SCREEN 0, 7, 8, 9(b), 12, e 13 | ||||
0 | 0 | Preto | 0(c) | Desativada |
1 | 1 | Azul | Sublinhado(d) | |
2 | 2 | Verde | 1(c) | Ativada(d) |
3 | 3 | Ciano | 1(c) | Ativada(d) |
4 | 4 | Vermelho | 1(c) | Ativada(d) |
5 | 5 | Magenta | 1(c) | Ativada(d) |
6 | 6 | Marrom | 1(c) | Ativada(d) |
7 | 7 | Branco | 1(c) | Ativada(d) |
8 | 8 | Cinza | 0(c) | Desativada |
9 | 9 | Azul Claro | Alta intensidade Sublinhado | |
10 | 10 | Verde Claro | 2(c) | Alta intensidade |
11 | 11 | Ciano Claro | 2(c) | Alta intensidade |
12 | 12 | Vermelho Claro | 2(c) | Alta intensidade |
13 | 13 | Magenta Claro | 2(c) | Alta intensidade |
14 | 14 | Amarelo | 2(c) | Alta intensidade |
15 | 15 | Branco de Alta intensidade | 0(c) | Desativada |
Modos SCREEN 1 e 9(e) | ||||
0 | 0 | Preto | 0 | Desativado |
1 | 11 | Ciano Claro | 2 | Alta intensidade |
2 | 13 | Magenta Clara | 2 | Alta intensidade |
3 | 15 | Branco de Alta Intensidade | 0 | Branco acinzentado |
Modos SCREEN 2 e 11 | ||||
0 | 0 | Preto | 0 | Desativada |
1 | 15 | Branco de Alta Intensidade | 0 | Branco acinzentado |
(a) números de cores EGA. VGA e MCGA utilizam
valores de cor de exibição que produzem cores visualmente
equivalentes. (b) Para VGA ou EGA com memória de vídeo > 64K. (c) Somente para o modo 0. (d) Desligado quando utilizado para segundo plano. (e) EGA com memória de vídeo <= 64K. |
SCREEN 0
COLOR 2, 15: CLS
LOCATE 1, 15: PRINT "Estou Colorido de Verde"
LOCATE 2, 15: COLOR 0: PRINT "Agora de Preto"
LOCATE 3, 15: COLOR 0, 2: PRINT "Agora de Preto com fundo verde"
Estou Colorido de Verde Agora de Preto Agora de Preto com fundo verde. Pressione qualquer tecla para continuar |
Dica: No modo de Tela 0 pode fazer a cor de primeiro plano piscarem, é só somar o valor da cor com mais 16. Ex.:
Se quiser que a cor Azul pisque, o valor dela é 1 + 16=17, fica assim: COLOR 17, 7: PRINT "Piscante"
- GOTO
Numerada: | Nomeada: |
10 PRINT
"Olá" 20 PRINT "Bom dia" |
Desvio:PRINT "Desviado!" |
Sintaxe:
GOTO linha
linha O nome ou número da linha a ser executada posteriormente.
linha O nome ou número da linha a ser executada posteriormente.
Exemplo:
10 CLS
20 PRINT "Isto é um abismo. Eu vou pular!!!! Que perigo!!!!"
30 GOTO 50
40 PRINT "Buraco": PRINT "2+2=5 . Epa!! Erro matemático"
50 BEEP: PRINT "Estou Salvo!"
10 CLS
20 PRINT "Isto é um abismo. Eu vou pular!!!! Que perigo!!!!"
30 GOTO 50
40 PRINT "Buraco": PRINT "2+2=5 . Epa!! Erro matemático"
50 BEEP: PRINT "Estou Salvo!"
Isto é um abismo. Eu
vou pular!!!! Que perigo!!!! Estou Salvo! Pressione qualquer tecla para continuar |
Como você viu neste exemplo, o programa
foi desviado de sua rota normal, não executando a linha 40. O
BEEP é uma instrução que provoca um barulho no auto-falante do
PC. O SYSTEM força o término do programa, retornando ao sistema
operacional (no BASIC sai também da linguagem; uma vez, já cometi um suicídio do
programa, pois não salvei antes de executá-lo. No QBasic não acontece e retorna
a janela de edição.)
Outro exemplo:
CLS
PRINT "Isto é um abismo. Eu vou pular!!!! Que perigo!!!!"
GOTO FimAbismo
PRINT "Buraco": PRINT "2+2=5 . Epa!! Erro matemático"
SYSTEM
FimAbismo:
BEEP: PRINT "Estou Salvo!"
CLS
PRINT "Isto é um abismo. Eu vou pular!!!! Que perigo!!!!"
GOTO FimAbismo
PRINT "Buraco": PRINT "2+2=5 . Epa!! Erro matemático"
SYSTEM
FimAbismo:
BEEP: PRINT "Estou Salvo!"
O efeito é o mesmo do anterior.
Obs.: Não recomendo usar o GOTO em uma
programação estruturada, somente em alguns casos de emergência como Tratamento
de Erros, que veremos no final da apostila.
-
REM
O REM comenta uma linha.
Ela não é executada, serve somente para instruir ou comentar. Também pode-se
usar a aspas simples ( ' ).
sintaxe:
REM comentário
' comentário
comentário Qualquer texto.
REM comentário
' comentário
comentário Qualquer texto.
Exemplo:
REM Representa um comentário.
' Também representa um comentário.
PRINT "Teste1" 'Representa um comentário após a instrução PRINT.
PRINT "Teste2" : REM Também representa um comentário após a instrução PRINT.
REM Representa um comentário.
' Também representa um comentário.
PRINT "Teste1" 'Representa um comentário após a instrução PRINT.
PRINT "Teste2" : REM Também representa um comentário após a instrução PRINT.
2. Operadores
A finalidade básica dos operadores é comparar, calcular, igualar, concatenar, etc., enfim, fazer operações envolvendo variáveis.2.1 Operadores Matemáticos
Alguns destes operadores são bastante
conhecidos, principalmente para quem usa ou usou uma calculadora.
OPERADOR
|
DESCRIÇÃO
|
EXEMPLO
|
+
|
Soma | Var=2+2 |
-
|
Subtração | Var=2-2 |
*
|
Multiplicação | Var=2*2 |
/
|
Divisão | Var=2/2 |
\
|
Divisão com resultado inteiro | Var=2\2 |
^
|
Exponenciação | Var=2^2 |
Mod
|
Resto da divisão | Var=2 Mod 2 |
- Exponenciação
- Multiplicação e Divisão
- Adição e Subtração
2.2 Operadores Relacionais
Estes operadores fazem comparações entre variáveis ou expressões. O retorno desta comparação sempre será valor diferente de zero, como -1 ou 1 (Verdadeiro) e zero (Falso). Na tabela abaixo, todas as comparações estão verdadeiras:
OPERADOR
|
DESCRIÇÃO
|
EXEMPLO
|
>
|
Maior | 5 >3 |
<
|
Menor | 3 < 5 |
>=
|
Maior ou Igual | 5 >= 3 |
<=
|
Menor ou Igual | 3 <= 5 |
=
|
Igual | 5 = 5 |
<>
|
Diferente | 3 <> 5 |
2.3 Operadores Lógicos
Os Operadores Lógicos sempre retornam Verdadeiro quando a lógica é exata ou Falso quando a lógica não é exata.Os operadores são:
AND - Usa-se para comparar duas expressões e só sairá um resultado verdadeiro somente se ambas forem verdadeiras.
Ex.: 5 > 2 AND 10=10
O resultado é Verdadeiro. Pois 5 é maior que 2 e 10 é igual a 10.
20 >15 AND 5=4
O resultado é Falso. 20 é maior que 15, mas 5 não é igual a 4.
OR - Usa-se para comparar expressões também, e só sairá verdadeiro se pelo menos uma for verdadeira, isto é, uma das duas ou ambas.
Ex.: 5 > 2 OR 10 < 100
O resultado é Verdadeiro. Pois 5 é maior que 2 e 10 é menor que 100.
20 > 15 OR 5 < 4
O resultado é Verdadeiro. Pois 20 é maior que 15 mas 5 não é menor que 4.
20 < 15 OR 5 < 4
O resultado é Falso. 20 não é menor que 15 e nem é 5 é menor que 4.
NOT - É um operador que inverte o resultado lógico, isto é, o que é Verdadeiro se torna Falso e vice-versa.
Ex.: NOT(10 > 5)
O resultado é Falso, apesar que 10 seja maior que 5, mas o NOT inverteu o resultado.
XOR - Este aqui não admite confusão na comparação, diferente do OR não admite que duas expressões sejam verdadeiras, isto é, uma tem que ser falsa e a outra verdadeira. Nunca as duas.
Ex.: 5 > 2 XOR 10 < 100
O resultado é Falso. Apesar das duas expressões serem verdadeiras, o operador retorna Falso.
20 > 15 XOR 5 < 4
O resultado é Verdadeiro. Pois a primeira é verdadeira e a segunda é falsa.
20 < 15 XOR 5 < 4
O resultado é Falso. As duas tem resultado falso.
EQV - Este aqui faz uma equivalência lógica entre duas expressões.
Ex.: 10 > 8 EQV 8 > 6
Retorna Verdadeiro, pois ambas as comparações são iguais.
8 > 10 EQV 8 > 6
Retorna Falso, pois as comparações retornam valores diferentes.
IMP - Aqui uma coisa implica em outra, isto é, o resultado só será Falso se a primeira expressão for verdadeira e a segunda for falsa, nos outros será sempre verdadeiro. Neste operador a ordem dos operandos faz diferença nos resultados.
Ex.: 10 > 8 IMP 6 > 8
Retorna Falso, pois a primeira expressão é verdadeira e a segunda é falsa.
10 > 8 IMP 8 > 6
Retorna Verdadeiro.
EXPRESSÃO1 | EXPRESSÃO2 | AND | OR | NOT | XOR | EQV | IMP |
V | V | V | V | F | F | V | V |
V | F | F | V | F | V | F | F |
F | V | F | V | V | V | F | V |
F | F | F | F | V | F | V | V |
2.4 Operador de String
O mais simples de todos os operadores o "+" serve para juntar duas expressões de texto. Exemplo:"Quick" + "Basic"
Resulta em "QuickBasic". Este operador também é responsável pela concatenação, isto é, a junção de duas variáveis ou expressões de texto. Cuidado se concatenar uma string com um número (a não ser número em uma expressão string. p/ ex.: "24") ou uma variável numérica, vai gerar um erro. O melhor, se quiser concatenar-las é melhor usar uma função de conversão (que veremos daqui a pouco), para evitar o erro.
Ex.: "Numero: " + 15 'Gera erro "Numero: " + STR(15) 'Não tem erro e retorna "Numero: 15"
3. Comandos Condicionais e de Laço (Loops)
3.1 Comandos Condicionais
Como o próprio nome já indica, estes comandos executam ações desde que as condições sejam satisfatórias (ou verdadeiras).- IF <Condição> THEN ...(Se
<Condição> Então...)
Esta estrutura faz que o computador avalie a condição imposta. Se for verdadeira, executa a ação.
Por Exemplo:
CLS
DIM Numero AS INTEGER
INPUT "Digite um Número maior que 10: ", Numero
IF Numero > 10 THEN PRINT "Maior que 10"
O programa pede que digite um número e depois ele verifica se o número que está na variável é maior que 10 (por ex. 11), se for então vai mostrar a mensagem "Maior que 10", caso contrário não faz nada. - IF <Condição> THEN ... END IF (Se
<Condição> Então... Fim Se)
É o mesmo acima, mas este pode ter várias linhas entre IF e END IF.
Por Exemplo:
CLS
DIM Numero AS INTEGER
INPUT "Digite um Número maior que 10: ", Numero
IF Numero > 10 THEN PRINT "Maior que 10"
PRINT "Mais uma linha..."
END IF - IF <Condição> THEN ... ELSE ... END IF
(Se <Condição> Então... Senão...Fim Se)
Foi acrescentado o ELSE, para quando quiser uma resposta para a condição Falsa.
Por Exemplo:
CLS
DIM Numero AS INTEGER
INPUT "Digite um Número maior que 10: ", Numero
IF Numero > 10 THEN PRINT "Maior que 10"
PRINT "Mais uma linha..."
ELSE PRINT "Menor que 10"
PRINT "Mais uma linha Extra..."
END IF - IF <Condição> THEN ... ELSEIF ... END
IF (Se <Condição> Então... Senão se...Fim
Se)
Foi acrescentado o ELSEIF, para quando a condição for Falsa, mas dependendo ainda de outra condição.
Por Exemplo:
CLS
DIM Numero AS INTEGER
INPUT "Digite um Número maior que 10: ", Numero
IF Numero > 10 THEN PRINT "Maior que 10"
PRINT "Mais uma linha..."
ELSEIF Numero = 15
PRINT "O Número é 15. "
PRINT "Parabéns!!!."
BEEP
ELSE PRINT "Menor que 10"
PRINT "Mais uma linha Extra..."
END IF - SELECT CASE
Significa "Seleção de casos", ou seja, colocamos vários casos para que o programa escolha um.
Exemplo:
CLS
DIM Numero AS INTEGER
INPUT "Digite um Número : ", Numero
SELECT CASE Numero CASE 1 'Verifica se é 1
PRINT "É o Primeiro"
CASE 2 'Se não for, Verifica se é 2
PRINT "Espere um Segundo"
CASE 3 TO 10 'Se não for, Verifica se está entre 3 e 10
PRINT "Entre 3 e 10"
CASE IS > 100 'Se não for, Verifica se é maior que 100
PRINT "Maior que 100"
CASE ELSE 'Caso contrário...
BEEP PRINT "Então não me aborreça..."
END SELECT
3.2 Comandos de Laço (Loops)
Estes comandos criam círculos viciosos, ou seja, criam uma estrutura condicional que se repete até que a condição seja satisfeita.- FOR <Condição>... NEXT
Repete um bloco de instruções um número especificado de vezes.
FOR contador = início TO fim [STEP incremento]
[bloco-instruções]
NEXT [contador [,contador]...]
* contador - Uma variável numérica usada como contador de loop.
* início e fim - Os valores inicial e final do contador.
* incremento A quantidade de vezes que o contador é alterado pelo loop.
Exemplo:
FOR i% = 1 TO 15 'Conte de 1 a 15
PRINT i%
NEXT i%
FOR i% = 7 TO -6 STEP -3 'Conte de 7 a -6 de -3 em -3
PRINT i%
NEXT i% - DO WHILE <Condição> ... LOOPRepete
um bloco de instruções enquanto uma condição é verdadeira ou até uma condição
se tornar verdadeira.
DO [WHILE Condição]
[bloco-instruções]
LOOP
Condição - Uma expressão numérica que o QBasic avalia como sendo verdadeira ou falsa .
Exemplo:
i% = 0
PRINT "Valor de i% no início do loop é "; i%
DO WHILE i% < 10
i% = i% + 1
LOOP
PRINT "Valor de i% no final do loop é "; i%
- DO .... LOOP WHILE <Condição>
É a mesma coisa acima, mas o bloco é executado primeiro e depois a condição,sendo assim o bloco é executado pelo menos uma vez, diferente do anterior em que o laço pode não ser executado caso a condição seja verdadeira logo de cara.
Exemplo:
i% = 0
PRINT "Valor de i% no início do loop é "; i%
DO
i% = i% + 1
LOOP WHILE i% < 10
PRINT "Valor de i% no final do loop é "; i% - WHILE <Condição> ... WEND
É o mesmo do DO WHILE - EXIT << Comando>>Sai de um
loop DO ou FOR (mesmo que não tenha
alcançado a condição), um procedimento FUNCTION ou
SUB (veremos depois).Exemplo:
i% = 0
DO i% = i% + 1
IF i% = 500 THEN EXIT DO 'Quando o i% chegar a 500 Saia imediatamente...
LOOP 'Loop infinito
PRINT "SAIR DO"; i%
4. Funções de Auxílio
Funções nada mais são rotinas prontas para executar determinadas ações. Existe no Qbasic funções de diversos tipos que ajudam em muito o programador. Vamos ver algumas funções, e veremos o poder que elas exercem dentro da linguagem.4.1 Funções Matemáticas
Numero=<Função>(Expressão Numérica)
ABS - Retorna sempre um valor positivo
(absoluto).PRINT ABS(-50) 'Valor Impresso 50
ATN - Retorna o arco-tangente de um número
COS - Calcula o co-seno de um ângulo
FIX - Retorna a parte inteira de um número, ignorando as casas decimais, se houver. Não faz arredondamento.
HEX$ - Retorna a representação hexadecimal de um número decimal.
RND - Retorna um número randômico, ou seja, escolhe um número aleatoriamente.
SQR - Calcula a raiz quadrada de um número.
4.2 Funções de Conversão
STR$ - Converte um valor numérico para tipo String (texto). Válido somente para argumentos numéricos. VarTexto$ = STR$(-50)PRINT VarTexto$ 'Valor Impresso -50
CHR$ - Retorna o caractere correspondente ao código da Tabela ASCII
VarTexto$ = CHR$(65)
PRINT VarTexto$ 'Valor Impresso A
VAL - Converte uma string de caracteres numéricos em uma variável numérica.
VarNum = VAL("0150")
PRINT VarNum 'Valor Impresso 150
ASC - Retorna o código ANSI do primeiro caractere de uma String.
VarNum = ASC("A")
PRINT VarNum 'Valor Impresso 65
CINT - Converte uma expressão numérica em um número inteiro. Faz arredondamento. VarNum = CINT(50.50)
PRINT VarNum 'Valor Impresso 50
CLNG - Converte uma expressão numérica em um número inteiro longo. Faz arredondamento também. VarNum = CLNG(150.60)
PRINT VarNum 'Valor Impresso 151
CSNG - Converte uma expressão numérica de ponto flutuante de precisão simples. VarNum = CSNG(<Expressão Numérica>)
CDBL - Converte uma expressão numérica de ponto flutuante de precisão dupla. VarNum = CDBL(<Expressão Numérica>)
4.3 Funções de Texto (String)
INSTR - Retorna a posição da primeira ocorrência de uma seqüência em outra seqüência Sintaxe: INSTR([início%,]texto1$,texto2$)início% Define a posição do caractere onde a pesquisa inicia.
Se início% for omitido, INSTR inicia na posição 1.
texto1$ - A seqüência de caracteres a pesquisar.
texto2$ - A seqüência de caracteres a procurar.
Exemplo:
a$ = "Microsoft QBasic"
PRINT "Posição do texto ="; INSTR(1, a$, "QBasic")
LCASE$ - Converte o texto para minúsculas.
Sintaxe: LCASE$(texto$)
texto$ - Qualquer texto.
Exemplo:
a$ = "QBasic"
PRINT a$;"LCASE: ";LCASE(a$)
LEFT$ - Retorna um número especificado de caracteres mais à esquerda do texto.
Sintaxe: LEFT$(texto$,n%)
texto$ - Qualquer expressão de seqüência de caracteres.
n% - O número de caracteres a retornar, começando com os caracteres mais à esquerda.
Exemplo:
a$ = "Microsoft QBasic"
PRINT LEFT$(a$, 5) 'A Saída é: Micro
LTRIM$ - Remove os espaços em branco à esquerda.
Sintaxe: LTRIM$(texto$)
texto$ - Qualquer texto.
Exemplo:
a$ = " Basic "
PRINT "*" + a$ + "*" 'A Saída é: * Basic *
PRINT "*" + LTRIM$(a$) + "*" 'A Saída é: *Basic *
MID$ - retorna parte de um texto (um subtexto).
Sintaxe: MID$(texto$,início%[,comprimento%])
texto$ - A seqüência a partir da qual a função retorna um subtexto ou o texto usado por MID$. Pode ser qualquer texto.
início% A posição do primeiro caractere na subseqüência que está sendo retornada ou substituída.
comprimento% O número de caracteres na subseqüência. Se o comprimento for omitido, MID$ retorna ou substitui todos os caracteres à direita da posição de início.
Exemplo:
a$ = "Onde é Paris?"
PRINT MID$(a$, 8, 5) 'Saída é: Paris
RIGHT$ - Retorna um número especificado de caracteres mais à direita do texto.
Sintaxe: RIGHT$(texto$,n%)
texto$ - Qualquer expressão de seqüência de caracteres.
n% - O número de caracteres a retornar, começando com os caracteres mais à direita.
Exemplo:
a$ = "Microsoft QBasic"
PRINT RIGHT$(a$, 5) ''A Saída é: Basic
RTRIM$ - Remove os espaços em branco à direita.
Sintaxe: RTRIM$(texto$)
texto$ - Qualquer texto.
Exemplo:
a$ = " Basic "
PRINT "*" + a$ + "*" 'A Saída é: * Basic *
PRINT "*" + RTRIM$(a$) + "*" 'A Saída é: * Basic*
SPACE$ - Retorna uma seqüência de espaços. Sintaxe: SPACE$(n%) n% - O número de espaços desejados na seqüência. Exemplo: FOR i% = 1 TO 5 x$ = SPACE$ (i%) PRINT x$; i% NEXT i%
STRING$ - Retorna um texto de tamanho determinado a partir da repetição de um caractere.
Sintaxe: STRING$(comprimento%,{código-ascii% | expressão-sequência$})
comprimento% - O comprimento do texto.
código-ascii% - O código ASCII do caractere a ser repetido.
expressao-sequência$ - Qualquer expressão de seqüência de caracteres. STRING$ preenche o texto com o primeiro caractere da expressão-sequência$.
Exemplo:
PRINT STRING$(3, "-");
PRINT "Alo";
PRINT STRING$(3, "-")
UCASE$ - Converte o texto para maiúsculas.
Sintaxe: UCASE$(texto$)
texto$ - Qualquer texto.
Exemplo:
a$ = "QBasic"
PRINT a$;"UCASE: ";UCASE(a$)
4.4 Criando Funções personalizadas
No Qbasic pode-se criar suas próprias funções ou Sub-rotinas, isto pode facilitar muito a programação, por exemplo, se tiver que fazer a mensagem "O Mundo da Internet" na linha 2 coluna 10 de cor azul e fundo verde. Provelmente teria um código assim:CLSTeríamos 3 linhas para isso. Mas agora podemos reduzi-la para uma linha só criando uma Rotina que vamos chamá-la de Palavra. Para fazer isso, primeiro vá até o menu Edit e em seguida Nova Sub..., em seguida de o nome para ela, Agora que vem o legal, coloque depois do nome da rotina, com os parênteses, (Texto$, Linha%, Coluna%, Cor1%, Cor2%) e entre SUB e END SUB:
COLOR 1, 2
LOCATE 2, 10
PRINT "O Mundo da Internet"
COLOR Cor1%, Cor2%Com isso, vá em Visualizar>Subs... , selecione o nome do programa e, substituindo as linhas (menos o CLS) por Palavra "Mundo da Internet", 2,10,1, 2 . Veja os resultados. pode ser que um programa pequeno isso não seja necessário, mas num programa maior, isto pode ser útil, pois economiza digitação. Dica: use as Sub-Rotinas para "traduzir" alguns comandos do Qbasic. Por Exemplo: Criando a Sub. LimpaTela, pode-se inserir um CLS nele (Não precisa de parâmetros).
LOCATE Linha%, Coluna%
PRINT Texto$
Agora vamos criar uma Função usando uma fórmula da Física para calcular a Velocidade de um objeto, conhecendo o espaço percorrido e o tempo. Se não me engano a fórmula é: V=S/T. O processo é o mesmo da Sub, trocando Sub... por Function..., colocando o Nome de Velocidade!, tendo como parâmetros (Espaco! , Tempo!). E dentro da Função coloque: Velocidade!=Espaco!/Tempo!
Agora retorne ao programa principal e digite: PRINT Velocidade(100, 80), com isso a nossa função retorna um valor Real com casas decimais.
5. Arquivos
Vamos supor a seguinte situação, você tem uma lista de 50 pessoas para cadastrar e de repente... acaba a energia em sua casa. E agora, escreve tudo de novo?. Calma para tudo tem solução. E o que vamos aprender agora a gravar e ler arquivos.Existem três tipos de arquivos: Seqüenciais, Aleatórios e Binários. O Seqüencial normalmente é usado para ler e gravar arquivos de texto (Ex.: os de extensão TXT), O Aleatório e usado para ler e gravar banco de dados, algo como um fichário. E o Binário é usado para ler e gravar dados em uma posição específica (de byte). Nesta apostila não especificarei sobre os Binários
Também pode Acessar um arquivo como: Somente Leitura, Somente Gravação ou os dois
Uma dica importante: TODOS OS ARQUIVOS ABERTOS DEVER SER FECHADOS, pois senão poder acarretar problemas como perdas de dados ou até o próprio arquivo.
Para acessar o arquivo, seja lendo ou gravando, usa-se o seguinte sintaxe:
OPEN arquivo$ [FOR modo] [ACCESS acesso] [chave] AS [#]número-arquivo% [LEN=tamreg%]
Onde:
* arquivo$ - O nome de um arquivo ou dispositivo. O nome de arquivo pode incluir uma unidade e um caminho. Obs.: Caso o caminho não é especificado, o interpretador supõe que o arquivo esteja no mesmo lugar que o QBasic que está sendo executado(Ex.: "ARQUIVO.TXT", Supõe que esteja no mesmo diretório ou pasta do QBasic, Diferente de "C:\DOC\ARQUIVO.TXT")
* modo - Um dos seguintes modos de arquivo: APPEND, BINARY, INPUT, OUTPUT, ou RANDOM.
APPEND especifica que o arquivo será aberto
como saída seqüencial e posiciona o ponteiro no final do arquivo. Uma
instrução PRINT # ou WRITE # irá então estender (acrescentar) o
arquivo. BINARY especifica um modo de arquivo binário. Em um modo binário, você pode ler ou gravar informações para qualquer posição do byte no arquivo usando as instruções GET ou PUT. INPUT especifica que o arquivo é aberto para entrada seqüencial. OUTPUT especifica que o arquivo é aberto para saída seqüencial. RANDOM especifica que o arquivo é aberto em modo de arquivo aleatório. RANDOM é o modo de arquivo padrão. |
* acesso - Em ambientes de rede, especifica se o arquivo é aberto para READ, WRITE, ou acesso READ WRITE.
READ Abre um arquivo somente para a
leitura. WRITE Abre um arquivo somente para a gravação. READ WRITE Abre um arquivo tanto para a leitura quanto para a gravação. O modo READ WRITE é válido somente para acesso aleatório e modo binário, e arquivos abertos para APPEND (acesso seqüencial). |
* bloco - Especifica a blocagem do arquivo em um ambiente de rede: SHARED, LOCK READ, LOCK WRITE, LOCK READ WRITE.
* número-arquivo% - Um número no intervalo de 1 à 255 que identifica o arquivo quando este é aberto.
* tamreg% - Para arquivos randômicos, o comprimento de registro (o padrão é 128 bytes). Para arquivos seqüenciais, o número de caracteres buffered (o padrão é 512 bytes).
Se você abrir um arquivo que não exista, ele será criado com tamanho 0, caso o arquivo se encontre aberto por um outro processo e o tipo de acesso não for permitido, a instrução OPEN falhará e gera um erro.
5.1 Gravando um arquivo
Podemos começar assim:
CLS
OPEN "TESTE.TXT" FOR OUTPUT AS #1
PRINT #1,"Teste para gravar arquivo" ' O #1 é o numero do arquivo
CLOSE #1
Agora use o Edit ou o Bloco de Notas do Windows e abra o arquivo
e leia (Lembre-se que ele está na mesma pasta onde o QBasic está ex.:
C:\QBASIC ).OPEN "TESTE.TXT" FOR OUTPUT AS #1
PRINT #1,"Teste para gravar arquivo" ' O #1 é o numero do arquivo
CLOSE #1
Veja outros exemplos que podem ser usados.
Exemplo 1:
CLS
OPEN "ARQ1.TXT" FOR OUTPUT AS #1
INPUT "Digite uma frase. <ENTER> Grava: ", Frase$
PRINT #1, Frase$
CLOSE ' O Número de arquivo é opcional, Caso for aberto mais de um é necessário
Observe que agora podemos escrever uma frase e
será armazenado.OPEN "ARQ1.TXT" FOR OUTPUT AS #1
INPUT "Digite uma frase. <ENTER> Grava: ", Frase$
PRINT #1, Frase$
CLOSE ' O Número de arquivo é opcional, Caso for aberto mais de um é necessário
Exemplo 2:
CLS
PRINT "Mini Nomeador"
OPEN "Arq2.txt" FOR OUTPUT AS #1
DO
INPUT "Nome:", Nome$
PRINT #1, Nome$
INPUT "Adicionar [S/N]"; Confirma$
LOOP UNTIL Confirma$ = "n"
CLOSE
PRINT "Mini Nomeador"
OPEN "Arq2.txt" FOR OUTPUT AS #1
DO
INPUT "Nome:", Nome$
PRINT #1, Nome$
INPUT "Adicionar [S/N]"; Confirma$
LOOP UNTIL Confirma$ = "n"
CLOSE
5.2 Lendo um arquivo
Agora que você aprendeu a gravar, agora vamos ler:
CLS
OPEN "TESTE.TXT" FOR INPUT AS #1
LINE INPUT #1, Frase$ ' Lê uma linha do arquivo e joga para a variável Frase$
PRINT Frase$ ' Imprime o arquivo na Tela
CLOSE #1
OPEN "TESTE.TXT" FOR INPUT AS #1
LINE INPUT #1, Frase$ ' Lê uma linha do arquivo e joga para a variável Frase$
PRINT Frase$ ' Imprime o arquivo na Tela
CLOSE #1
Teste para gravar arquivo
Pressione qualquer tecla para continuar
|
CLS
PRINT "Mini Nomeador"
OPEN "Arq2.txt" FOR INPUT AS #1
DO
INPUT #1, Nome$
PRINT Nome$
LOOP WHILE NOT EOF(1) 'Repete a instrução acima até acabar o arquivo
CLOSE
PRINT "Mini Nomeador"
OPEN "Arq2.txt" FOR INPUT AS #1
DO
INPUT #1, Nome$
PRINT Nome$
LOOP WHILE NOT EOF(1) 'Repete a instrução acima até acabar o arquivo
CLOSE
5.3 Arquivos Aleatórios
Os aleatórios também são chamados de randômicos, eles executam operações de leitura e escrita mais rápido que arquivos de textos, mas a forma de trabalhar é idêntica.Antes de começarmos a criar esses arquivos, vamos aprender a criar nossos próprios tipos de variáveis (Oque?!, você pergunta. Sim podemos criar nossos tipos personalizados de variáveis). Está maravilha se chama TYPE, nela podemos declarar campos que podem ser gerenciados,e duas novas instruções o GET e o PUT.
Síntaxe do Type:
TYPE tipo
nome-elemento AS nome-tipo
[nome-elemento AS nome-tipo]
.
.
.
END TYPE
* tipo O nome do tipo de dado sendo definido. O nome pode consistir de até 40 caracteres e deve começar com uma letra. Os caracteres válidos são A-Z, 0-9 e um ponto (.).
* nome-elemento Um elemento do tipo de dado definido pelo usuário.
* nome-tipo O tipo de elemento (INTEGER, LONG, SINGLE, DOUBLE, STRING ou um tipo de dado definido pelo usuário).
Depois usamos o DIM para declará-la. Veja como fica no exemplo abaixo:
TYPE Carta
Naipe AS STRING * 9
Valor AS INTEGER
END TYPE
DIM Baralho(1 TO 52) AS Carta
Deck(1).Naipe = "Paus"
Deck(1).Valor = 2
PRINT Baralho(1).Naipe, Baralho(1).Valor
O GET lê de um arquivo para memória de acesso aleatório ou uma
variável. Algo parecido com o INPUT.Naipe AS STRING * 9
Valor AS INTEGER
END TYPE
DIM Baralho(1 TO 52) AS Carta
Deck(1).Naipe = "Paus"
Deck(1).Valor = 2
PRINT Baralho(1).Naipe, Baralho(1).Valor
O PUT grava uma variável ou memória de acesso aleatório para um arquivo. Algo parecido com o OUTPUT.
GET [#]número-arquivo%[,[número-registro&][,variável]]
PUT [#]número-arquivo%[,[número-registro&][,variável]]
* número-arquivo% O número de um arquivo aberto.
* número-registro& Para arquivos de acesso randômico, o número do registro a ser lido ou gravado.
* variável Para GET, uma variável usada para receber informações lidas do arquivo. Para PUT, uma variável que contém informações a serem gravadas no arquivo. A variável é geralmente do tipo de variáveis definida pelo usuário.
Vamos ver como se aplica este exemplo:
CLS
TYPE RegTeste
Aluno AS STRING * 20
Nota AS SINGLE
END TYPE
DIM Classe AS RegTeste
OPEN "CLASSE.DAT" FOR RANDOM AS #1 LEN = LEN(Classe) ' O Len limita o tamanho do arquivo
Classe.Aluno = "Maria"
Classe.Nota = 99
PUT #1, 1, Classe
CLOSE #1
OPEN "CLASSE.DAT" FOR RANDOM AS #1 LEN = LEN(Classe)
GET #1, 1, Classe
PRINT "ALUNO:", Classe.Aluno
PRINT "NOTA:", Classe.Nota
CLOSE #1
TYPE RegTeste
Aluno AS STRING * 20
Nota AS SINGLE
END TYPE
DIM Classe AS RegTeste
OPEN "CLASSE.DAT" FOR RANDOM AS #1 LEN = LEN(Classe) ' O Len limita o tamanho do arquivo
Classe.Aluno = "Maria"
Classe.Nota = 99
PUT #1, 1, Classe
CLOSE #1
OPEN "CLASSE.DAT" FOR RANDOM AS #1 LEN = LEN(Classe)
GET #1, 1, Classe
PRINT "ALUNO:", Classe.Aluno
PRINT "NOTA:", Classe.Nota
CLOSE #1
ALUNO: Maria NOTA: 99 Pressione qualquer tecla para continuar |
6. Tratamento de erros
Já aconteceu quando você foi abrir um arquivo de texto e derrepente o programa saiu e voltou a janela de edição, falando que ele não existe, ou que o disco está cheio. Se a resposta foi Sim. Fique sabendo que isso é comum na programação e, como diz o velho ditado: "HERRAR É UMANO". Mas, não se preocupe... os erros existem para serem corrigidos e leva a perfeição do programa. Pois agora vamos aprender a lidar com os erros de programação.Os Erros são subdivididos em: Compilação, Dispositivo (ou de Entrada e Saída), Execução e Lógicos.
Os Erros de Compilação acontece quando escrevemos um comando errado, esquecemos um parêntesis em uma função.
Os Erros de Dispositivo é quando, por exemplo, tentamos acessar um disquete no drive e ele não está lá, ou quando mandamos imprimir e a impressora não está ligada.
Os de Execução acontece quando o programa executa uma instrução ilegal, mas o programa já foi compilado. (Ex.: quando o programa faz uma divisão por zero)
E os Erros Lógicos são aqueles que apesar do compilador não encontrar erros, mas o programa não tem o resultado esperado (como por exemplo gravar um arquivo ou um registro com dados vazios).
Vamos ver um exemplo prático deles:
Tente executar o código abaixo:
CLS PRIN "Oi Mundo!!!"O compilador vai parar o programa e vai aparecer uma caixa de diálogo dizendo "Erro de Síntaxe" e o cursor na linha onde se encontra o erro.
Este tipo de erro é fácil de resolver: Corrija o comando com a síntaxe correta (no caso: PRINT)
O segundo caso vamos imprimir uma frase na impressora. para simular o erro, desligue a impressora um pouco, e execute o programa no modo MS-DOS® (pois o Windows® manda os dados para a fila de impressão simulando, assim, que a impressora em DOS está ligada) :
CLS PRINT "Imprimindo um texto." LPRINT "O Qbasic é demais!!!!" 'Este comando envia um texto para impressora PRINT "Terminada a impressão"Vai aparecer uma caixa de diálogo dizendo: "Falha no dispositivo". Clique no botão Ajuda, e verá uma explicação do erro e um número do erro (no caso 25). Anote esse número que vamos usá-lo agora:
ON ERROR GOTO 50 5 CLS DIM Resposta AS STRING*1 PRINT "Imprimindo um Texto" 10 LPRINT "O QBasic é Demais!!!" PRINT "Terminada a impressão" END 50 SELECT CASE Err CASE 25 PRINT "Impressora Desligada ou não instalada. Continuar ? (s/n)" INPUT "", Resposta IF Resposta = UCASE$("s") THEN GOTO 10 ELSE SYSTEM CASE ELSE PRINT "Erro inesperado Saindo." END SELECTO On Error desvia, quando ocorre um erro, para a linha determinada para tratar do erro (geralmente coloco no final do programa). A variável reservada ERR (Você não pode atribuir valor para ela, só o sistema) retorna o número que causou o erro (no caso 25) e usei uma rotina de escolha (SELECT CASE) para "filtrar" o ERR e exibir uma mensagem de aviso de que a impressora está desligada e se deseja imprimir novamente.
Vamos ver o terceiro caso, o de execução. Este tipo de erro acontece pode passar despercebido pelo compilador, mas se não observa-lo, pode travar o programa. Veja o exemplo abaixo:
CLS Valor=5 Divizao=0 PRINT "O resultado da conta é: " PRINT (Valor/Divizao)Observe que o programa para a execução (se estivesse criado um executável provavelmente travaria). Para resolver esta "Pedra no caminho", vamos impor uma condição: Se a Divizao for igual a zero, colocar valor 1. Veja como fica:
CLS Valor=5 Divizao=0 PRINT "O resultado da conta é: " IF Divizao = 0 THEN Divizao = 1 PRINT (Valor/Divizao)
Nenhum comentário:
Postar um comentário