Curso de C
Introdução
Você está em: MarMSX >> Cursos >> C
O C é uma linguagem estruturada, isto é, possui uma organização do código que nos permite uma melhor maneira compreender e trabalhar. Ele foi criado por Dennis M. Ritchie, na década de 70.
Como em maioria das linguagens de alto nível, o programa é traduzido a partir de um código fonte para linguagem de máquina e então executado (o Basic é interpretado).
O que vem a ser uma linguagem estruturada?
Em uma linguagem estruturada, as rotinas são isoladas do corpo principal do programa em blocos visivelmente identificados. Dessa forma, o programa fica mais legível, mais fácil de organizar e gerenciar. Já no caso do Basic, que não é uma linguagem estruturada, o código fica disposto em linhas sequenciais, sem qualquer tipo de separação, tornando-o mais complexo de compreender e gerenciar.
|
|
Basic |
C |
Estruturas como as funções não são apenas um isolamento visual em relação ao restante do programa. São na realidade um mundo a parte, onde somente podemos nos comunicar com elas através da passagem de parâmetros (os valores contidos nos parênteses da função) e da resposta fornecida por elas. A vantagem disso é que apenas necessitamos saber o que a função faz, passar os valores corretos para ela e obter a resposta.
No Basic, ao utilizarmos uma função, é necessário saber quais as variáveis que ela utiliza e altera dentro dela, pois isso se reflete no restante do programa. Veja o exemplo a seguir.
10 INPUT"Angulo";A
20 INPUT"Raio";R
30 GOSUB 100
40 PRINT"Angulo:";A
50 END
100 ' Calcula
110 A = 3.1415 * R^2 ' A alteracao e' refletida em A usado para angulo
120 PRINT "Area:";A
130 RETURN
Saída:
Angulo: 45.0
Raio: 12.5
Area: 490.859375
Angulo: 490.859375
No caso do C, as variáveis criadas dentro da função NÃO interferem em variáveis homônimas criadas no restante do programa. Isso mostra o quão isolado fica esse trecho de código.
Afinal, o que vem a ser traduzido ou interpretado?
Em uma linguagem interpretada como o Basic, cada instrução do programa (geralmente uma linha) é interpretada em tempo real, sendo convertida para linguagem de máquina e executada. Esse mecanismo consome um tempo precioso de processamento, pois cada instrução deverá ser interpretada mesmo quando ela já foi lida, como no caso de loops.
Um programa é traduzido, quando um novo programa equivalente ao fonte é criado em linguagem de máquina. Por exemplo, o compilador pega seu programa fonte escrito em C (.c) e cria um novo programa equivalente ao seu em linguagem de máquina (arquivo .com ou na memória).
Apesar de consumir um tempo considerável compilando, este processo é realizado apenas uma vez. Tendo em mãos o arquivo convertido para linguagem de máquina, ele sempre executará em linguagem de máquina, obtendo um desempenho consideravelmente superior em relação aos programas interpretados.
A versão do C do MSX é compatível com as versões mais simples de compiladores C do PC, em relação às instruções padrão. Então, se você fizer um programa em C no MSX e levar o fonte para o PC ou vice-versa, vai funcionar.
Iniciando
O primeiro passo é instalar um compilador C para o MSX. Entretanto, nada impede de se utilizar um compilador C no PC para o aprendizado.
Na seção Programming da Funet (http://www.msxarchive.nl), encontramos o diretório "C", com os seguintes arquivos:
MSX-C_Library.zip
MSX-C_v1.2.zip
c--.pma
c--srcs.pma
hitech-1.pma
hitech-2.pma
hitech-3.pma
hitech-4.pma
hpatches.pma
Há três compiladores C para MSX: o MSX-C da ASCII, o C-- e o Hi-Tech C. Vamos utilizar nesse curso o pacote "hitech", com o Hi-Tech C.
|
Descompacte o pacote "hitech-1.pma", utilizando o descompactador pmext.exe para PC (encontrado na própria Funet) ou o unar para Linux. Copie o conteúdo para um disquete de MSX.
Pelo MSX-DOS, digite C e o nome do programa, SEM EXTENSÃO. Cuidado: se você colocar a extensão, o compilador irá apagar o seu programa !!
Na imagem ao lado, foi compilado um programa chamado "10.c", que corresponde à parte da teoria que fala sobre o switch no capítulo 10.
A sintaxe para a compilação de um arquivo fonte em C é:
A> c <nome_arquivo_sem_extensao>
|
|
Ao lado, podemos observar todo o trabalho de compilação do programa "10.c".
Se algum erro surgir, este é indicado e a compilação é interrompida. Podem haver ainda alertas (warnings), que não interrompem a compilação.
|
|
Se a compilação for bem sucedida, o arquivo 10.com surge. Este é o arquivo contendo o programa em linguagem de máquina, pronto para rodar sob o DOS.
Rode o programa, digitando 10 no prompt do DOS e responda à pergunta feita pelo programa. |
Nota-se que é bem simples compilar um programa escrito em C. Entretanto, o arquivo "hitech-3.pma" contém o manual completo do compilador em inglês para tirar suas dúvidas.
Infelizmente não existe um editor de texto junto com o Hi-Tech C. Se você possuir o MSX 2, aconselha-se o uso do editor MPW (Mac Program Writer), também encontrado na Funet. Entretanto, nada impede de você criar os programas em um editor do PC e copiá-lo para o MSX. Não se esqueça de optar pelo fim de linha "Windows", se estiver no Linux.
|
Editor Mac Program Writer. |
Meu primeiro programa em C
Vejamos alguns exemplos, comparando-se com o Basic do MSX. Mãos à obra!
Exemplo 1:
Basic |
C |
10 print"O MSX vive!" |
#include <stdio.h>
main()
{
printf("O MSX vive!");
} |
Descrição do exemplo 1:
#include <stdio.h> // Biblioteca necessária para o printf
main() // Corpo principal do programa
{
printf("O MSX vive!"); // Imprime a mensagem
}
Exemplo 2:
Basic |
C |
10 for
f=1 to 10
20 print f,"O MSX vive!"
30 next f |
#include <stdio.h>
int f;
main()
{
for (f=1; f<=10; f++)
printf("O MSX vive!");
}
|
Descrição do exemplo 2:
#include <stdio.h> // Biblioteca necessária para o printf
int f; // Declara a variável inteira "f"
main() // Corpo principal do programa
{
for (f=1; f<=10; f++) // Repete o código a seguir 10 vezes
printf("O MSX vive!"); // Imprime a mensagem
}
Comentários:
A linguagem C, diferentemente do Pascal, contém algumas de suas funções básicas dentro de bibliotecas (arquivos ".h"). Portanto, é necessário carregar a biblioteca para essas funções, como por exemplo a entrada e saída de dados (função "printf"), que precisa da biblioteca "stdio.h" ou "standard I/O".
Por ser uma programação estruturada, o C possui diversos trechos de código delimitados e isolados, como, por exemplo, o corpo principal do programa. O inicio de uma estrutura é marcada com a chave aberta "{" e o fim com a chave fechada "}".
No Basic, podemos utilizar uma variável sem declarar o tipo dela. Entretanto, no C é necessário declarar a existência de uma variável, bem como o tipo de dado que ela armazena.
Variáveis
Diferente do Basic, o Pascal e o C precisam que nós declaremos o tipo da variável que iremos trabalhar.
Mas por quê fazer isto? Porque todas as variáveis armazenadas na memória são dados e estes dados podem representar diversas coisas, como: um número inteiro, um numero real, um caractere, uma cadeia de caractere etc. Além de saber qual o tipo de dado, é necessário também conhecer o tamanho por ele ocupado: 1, 2, 3, 4, ..., N bytes. Exemplificando, se dissermos que a variável "idade" é do tipo "short int", indicamos que o dado é um valor inteiro e de tamanho 1 byte.
As variáveis podem ser:
Descrição |
Tipo |
Tamanho |
Caractere não sinalizado |
unsigned char |
1 byte (0 a 255) |
Caractere |
char |
1 byte (-128 a 127) |
Enum |
enum |
2 bytes (-32768 a 32767) |
Inteiro não sinalizado |
unsigned int |
2 bytes (0 a 65535) |
Curto |
short int |
1 bytes (0 a 255) |
Inteiro |
int |
2 bytes (-32768 a 32767) |
Longo não sinalizado |
unsigned long |
4 bytes (0 a 4294967295) |
Longo |
long |
4 bytes (-2147483648 a 2147483647) |
Real |
float |
4 bytes (3,4e-38 a 3,4e38) |
Duplo |
double |
8 bytes (1,7e-308 a 1,7e308) |
Longo duplo |
long double |
10 bytes (3,4e-4932 a 3,4e4932) |
No C, declaramos um variável da seguinte maneira:
<tipo_de_dado> <identificador> = <valor_inicial>;
Onde:
- tipo_de_dado - indica o tipo de dado armazenado pela variável.
- identificador - é o nome da variável.
- valor_inicial - atribui um valor inicial à variável (opcional).
Ex:
int idade = 20;
No C não existe a variável do tipo string. Declaramos uma string como uma cadeia de caracteres (char). Ex:
char nome[20] = "MarMSX";
Importante: O C é sensível a letras maiúsculas e minúsculas, diferentemente do Pascal. Portanto, atenção à esta questão.
Exemplo 3:
Basic |
C |
10 input"Qual
o seu nome";n$
20 print"Ola,";n$ |
#include <stdio.h>
char nome[20];
main()
{
printf("Qual o seu nome? ");
scanf("%s", nome);
printf("Ola %s", nome);
} |
Este programa imprime uma mensagem pedindo para o usuário introduzir seu nome, que é lido pela função scanf. Em seguida, imprime uma mensagem com o nome fornecido.
Funções
As funções são sub-rotinas da linguagem C, que podem ser chamadas em qualquer lugar do programa. Com isso, evita-se a duplicidade de código.
Sintaxe:
<tipo_de_retorno> <nome_da_funcao> (<lista_de_parametros>)
{
...
return <valor>
}
Onde:
- tipo_de_retorno - indica o tipo de dado que a função irá retornar.
- nome_da_funcao - identificador que será utilizado para chamar a função.
- lista_de_parametros - lista de parâmetros passados para a função.
- return - indica o valor retornado pela função.
- valor - é o valor retornado pela função. Deve ser compatível com o tipo_de_retorno.
Exemplo:
#include <stdio.h>
int soma(int a, int b)
{
return a+b;
}
int main(void)
{
printf("A soma de %d com %d é %d.", 2, 3, soma(2,3));
return 1;
}
Saída:
A soma de 2 com 3 é 5.
O bloco "main" é o corpo principal de um programa em C. É o primeiro trecho a ser executado.
A instrução "printf" chama a função "soma", imprimindo o resultado.
Não existe o procedimento (procedure) do Pascal no C. Na realidade, o procedimento é um função que não retorna valor. Assim, utiliza-se o tipo de dado "void" para simular um procedimento no C. Ex:
void imprime_numero(int num)
{
printf("Numero: %d", num);
}
Saidas / Entradas formatadas
As instruções printf (escrita) e scanf (leitura) podem ser formatadas, sem a necessidade de realizar concatenações (junções). Assim, a instrução printf pode formatar toda saída de uma vez só, sem ser necessário quebrar a instrução, como é feito em Basic. Ex:
Basic: PRINT "A soma de "; a ;" com "; b ;" é "; c
C : printf("A soma de %d com %d é %d.", a, b, c);
A instrução printf possui a seguinte sintaxe:
printf(<texto_formatado>, <lista_de_variaveis>);
Onde:
- texto_formatado - é o texto, onde o símbolo "%", seguido de um código, irá indicar a presença do valor de uma variável no texto.
- lista_de_variaveis - lista de variáveis que aparecerão na ordem da formatação.
A instrução scanf lê dados do teclado.
A sintaxe do símbolo de formatação "%" é:
% [flags] [largura] [.precisão] [F|N|h|l|L] [tipo de caractere]
Onde:
Flag |
Descrição |
- |
Justifica à esquerda. |
+ |
Indica sinal - ou + no
resultado. |
branco |
Indica só o sinal de -. |
# |
Converte o resultado para
um formato alternativo. |
Largura |
Descrição |
n |
Pelo menos n caracteres
são escritos, preenchendo com branco. |
0n |
Pelo menos n caracteres
são escritos, preenchendo com zero. |
* |
Automático. |
Precisão |
Descrição |
nada |
Default. |
.0 |
Default para inteiros, sem
casa decimal para reais. |
.n |
Imprime n caracteres,
depois da vírgula. |
* |
Automático. |
Tipo |
Descrição |
d |
Inteiro |
i |
Inteiro |
o |
Octal |
u |
Inteiro não sinalizado |
x |
Hexadecimal, com letras
minúsculas |
X |
Hexadecimal, com letras
maiúsculas |
f |
Real |
e |
Real |
g |
Real |
E |
Real |
G |
Real |
c |
Caracter |
s |
String |
% |
Imprime o caracter % |
Exemplo:
#include <stdio.h>
int a=5;
main()
{
printf("%04d",a);
}
Saida:
0005
Onde "04" preenche com quatro zeros o resultado e "d" indica que a saída é do tipo inteiro.
Bibliotecas C do MSX
Uma biblioteca é uma coleção de programas, que servem para auxiliar no desenvolvimento de softwares.
Os pacotes hitech-1.pma, hitech-2.pma e hitech-4.pma possuem algumas bibliotecas para o uso no C. Um bom exemplo disso é a biblioteca gráfica GLIB, disponível no pacote hitech-4.pma.
A sintaxe para o uso de bibliotecas é:
#include <nome_do_arquivo_header_da_biblioteca>
Ex:
#include <stdio.h>
main()
{
printf("Olá\n");
}
Esse programa utiliza a biblioteca "stdio.h" para escrever na tela.