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:   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 
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:   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:   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.


<< Anterior Linguagem C Próxima >>